From 4aa68281d60c8dd47022bf8d4923bb5892b7d0af Mon Sep 17 00:00:00 2001 From: NovaBot <154629622+NovaBot13@users.noreply.github.com> Date: Thu, 4 Jul 2024 08:51:15 -0400 Subject: [PATCH] [MIRROR] Better UI for heretic research [MDB IGNORE] --- .../antagonists/heretic/heretic_antag.dm | 138 +++++++++---- .../antagonists/heretic/heretic_knowledge.dm | 24 +++ .../heretic/items/eldritch_flask.dm | 2 +- .../antagonists/heretic/knowledge/ash_lore.dm | 17 +- .../heretic/knowledge/blade_lore.dm | 18 +- .../heretic/knowledge/cosmic_lore.dm | 14 +- .../heretic/knowledge/flesh_lore.dm | 16 +- .../heretic/knowledge/general_side.dm | 3 + .../heretic/knowledge/lock_lore.dm | 18 +- .../heretic/knowledge/moon_lore.dm | 17 +- .../heretic/knowledge/rust_lore.dm | 15 ++ .../sacrifice_knowledge.dm | 3 + .../heretic/knowledge/side_ash_moon.dm | 7 + .../heretic/knowledge/side_blade_rust.dm | 16 +- .../heretic/knowledge/side_cosmos_ash.dm | 7 + .../heretic/knowledge/side_flesh_void.dm | 5 + .../heretic/knowledge/side_lock_flesh.dm | 2 + .../heretic/knowledge/side_lock_moon.dm | 7 + .../heretic/knowledge/side_rust_cosmos.dm | 11 + .../heretic/knowledge/side_void_blade.dm | 7 + .../heretic/knowledge/starting_lore.dm | 44 ++++ .../heretic/knowledge/void_lore.dm | 17 +- icons/obj/antags/eldritch.dmi | Bin 4403 -> 9258 bytes icons/ui_icons/antags/heretic/knowledge.dmi | Bin 0 -> 42692 bytes tgui/packages/tgui/components/DmIcon.tsx | 4 +- .../tgui/interfaces/AntagInfoHeretic.tsx | 190 +++++++++++------- 26 files changed, 479 insertions(+), 123 deletions(-) create mode 100644 icons/ui_icons/antags/heretic/knowledge.dmi diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 01d7c33f718..74dc3ce2183 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -57,17 +57,17 @@ /// Controls what types of turf we can spread rust to, increases as we unlock more powerful rust abilites var/rust_strength = 0 /// Static list of what each path converts to in the UI (colors are TGUI colors) - var/static/list/path_to_ui_color = list( - PATH_START = "grey", - PATH_SIDE = "green", - PATH_RUST = "brown", - PATH_FLESH = "red", - PATH_ASH = "white", - PATH_VOID = "blue", - PATH_BLADE = "label", // my favorite color is label - PATH_COSMIC = "purple", - PATH_LOCK = "yellow", - PATH_MOON = "blue", + var/static/list/path_to_ui_bgr = list( + PATH_START = "node_side", + PATH_SIDE = "node_side", + PATH_RUST = "node_rust", + PATH_FLESH = "node_flesh", + PATH_ASH = "node_ash", + PATH_VOID = "node_void", + PATH_BLADE = "node_blade", + PATH_COSMIC = "node_cosmos", + PATH_LOCK = "node_lock", + PATH_MOON = "node_moon", ) var/static/list/path_to_rune_color = list( @@ -86,6 +86,82 @@ LAZYNULL(sac_targets) return ..() +/datum/antagonist/heretic/proc/get_icon_of_knowledge(datum/heretic_knowledge/knowledge) + //basic icon parameters + var/icon_path = 'icons/mob/actions/actions_ecult.dmi' + var/icon_state = "eye" + var/icon_frame = knowledge.research_tree_icon_frame + var/icon_dir = knowledge.research_tree_icon_dir + //can't imagine why you would want this one, so it can't be overridden by the knowledge + var/icon_moving = 0 + + //item transmutation knowledge does not generate its own icon due to implementation difficulties, the icons have to be specified in the override vars + + //if the knowledge has a special icon, use that + if(!isnull(knowledge.research_tree_icon_path)) + icon_path = knowledge.research_tree_icon_path + icon_state = knowledge.research_tree_icon_state + + //if the knowledge is a spell, use the spell's button + else if(ispath(knowledge,/datum/heretic_knowledge/spell)) + var/datum/heretic_knowledge/spell/spell_knowledge = knowledge + var/datum/action/cooldown/spell/result_spell = spell_knowledge.spell_to_add + icon_path = result_spell.button_icon + icon_state = result_spell.button_icon_state + + //if the knowledge is a summon, use the mob sprite + else if(ispath(knowledge,/datum/heretic_knowledge/summon)) + var/datum/heretic_knowledge/summon/summon_knowledge = knowledge + var/mob/living/result_mob = summon_knowledge.mob_to_summon + icon_path = result_mob.icon + icon_state = result_mob.icon_state + + //if the knowledge is an eldritch mark, use the mark sprite + else if(ispath(knowledge,/datum/heretic_knowledge/mark)) + var/datum/heretic_knowledge/mark/mark_knowledge = knowledge + var/datum/status_effect/eldritch/mark_effect = mark_knowledge.mark_type + icon_path = mark_effect.effect_icon + icon_state = mark_effect.effect_icon_state + + //if the knowledge is an ascension, use the achievement sprite + else if(ispath(knowledge,/datum/heretic_knowledge/ultimate)) + var/datum/heretic_knowledge/ultimate/ascension_knowledge = knowledge + var/datum/award/achievement/misc/achievement = ascension_knowledge.ascension_achievement + if(!isnull(achievement)) + icon_path = achievement.icon + icon_state = achievement.icon_state + + var/list/result_parameters = list() + result_parameters["icon"] = icon_path + result_parameters["state"] = icon_state + result_parameters["frame"] = icon_frame + result_parameters["dir"] = icon_dir + result_parameters["moving"] = icon_moving + return result_parameters + +/datum/antagonist/heretic/proc/get_knowledge_data(datum/heretic_knowledge/knowledge, done) + + var/list/knowledge_data = list() + + knowledge_data["path"] = knowledge + knowledge_data["icon_params"] = get_icon_of_knowledge(knowledge) + knowledge_data["name"] = initial(knowledge.name) + knowledge_data["gainFlavor"] = initial(knowledge.gain_text) + knowledge_data["cost"] = initial(knowledge.cost) + knowledge_data["disabled"] = (!done) && (initial(knowledge.cost) > knowledge_points) + knowledge_data["bgr"] = (path_to_ui_bgr[initial(knowledge.route)] || "side") + knowledge_data["finished"] = done + knowledge_data["ascension"] = ispath(knowledge,/datum/heretic_knowledge/ultimate) + + //description of a knowledge might change, make sure we are not shown the initial() value in that case + if(done) + var/datum/heretic_knowledge/knowledge_instance = researched_knowledge[knowledge] + knowledge_data["desc"] = knowledge_instance.desc + else + knowledge_data["desc"] = initial(knowledge.desc) + + return knowledge_data + /datum/antagonist/heretic/ui_data(mob/user) var/list/data = list() @@ -93,26 +169,32 @@ data["total_sacrifices"] = total_sacrifices data["ascended"] = ascended + var/list/tiers = list() + // This should be cached in some way, but the fact that final knowledge // has to update its disabled state based on whether all objectives are complete, // makes this very difficult. I'll figure it out one day maybe + for(var/datum/heretic_knowledge/knowledge as anything in researched_knowledge) + var/list/knowledge_data = get_knowledge_data(knowledge,TRUE) + + while(initial(knowledge.depth) > tiers.len) + tiers += list(list("nodes"=list())) + + tiers[initial(knowledge.depth)]["nodes"] += list(knowledge_data) + for(var/datum/heretic_knowledge/knowledge as anything in get_researchable_knowledge()) - var/list/knowledge_data = list() - knowledge_data["path"] = knowledge - knowledge_data["name"] = initial(knowledge.name) - knowledge_data["desc"] = initial(knowledge.desc) - knowledge_data["gainFlavor"] = initial(knowledge.gain_text) - knowledge_data["cost"] = initial(knowledge.cost) - knowledge_data["disabled"] = initial(knowledge.cost) > knowledge_points + var/list/knowledge_data = get_knowledge_data(knowledge,FALSE) // Final knowledge can't be learned until all objectives are complete. if(ispath(knowledge, /datum/heretic_knowledge/ultimate)) - knowledge_data["disabled"] = !can_ascend() + knowledge_data["disabled"] ||= !can_ascend() - knowledge_data["hereticPath"] = initial(knowledge.route) - knowledge_data["color"] = path_to_ui_color[initial(knowledge.route)] || "grey" + while(initial(knowledge.depth) > tiers.len) + tiers += list(list("nodes"=list())) - data["learnableKnowledge"] += list(knowledge_data) + tiers[initial(knowledge.depth)]["nodes"] += list(knowledge_data) + + data["knowledge_tiers"] = tiers return data @@ -122,18 +204,6 @@ data["objectives"] = get_objectives() data["can_change_objective"] = can_assign_self_objectives - for(var/path in researched_knowledge) - var/list/knowledge_data = list() - var/datum/heretic_knowledge/found_knowledge = researched_knowledge[path] - knowledge_data["name"] = found_knowledge.name - knowledge_data["desc"] = found_knowledge.desc - knowledge_data["gainFlavor"] = found_knowledge.gain_text - knowledge_data["cost"] = found_knowledge.cost - knowledge_data["hereticPath"] = found_knowledge.route - knowledge_data["color"] = path_to_ui_color[found_knowledge.route] || "grey" - - data["learnedKnowledge"] += list(knowledge_data) - return data /datum/antagonist/heretic/ui_act(action, params) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 5369e5fee8d..ec7fa4629ad 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -38,6 +38,19 @@ var/priority = 0 /// What path is this on. If set to "null", assumed to be unreachable (or abstract). var/route +<<<<<<< HEAD +======= + /// In case we want to override the default UI icon getter and plug in our own icon instead. + /// if research_tree_icon_path is not null, research_tree_icon_state must also be specified or things may break + var/research_tree_icon_path + var/research_tree_icon_state + var/research_tree_icon_frame = 1 + var/research_tree_icon_dir = SOUTH + /// Level of knowledge tree where this knowledge should be in the UI + var/depth = 1 + ///Determines what kind of monster ghosts will ignore from here on out. Defaults to POLL_IGNORE_HERETIC_MONSTER, but we define other types of monsters for more granularity. + var/poll_ignore_define = POLL_IGNORE_HERETIC_MONSTER +>>>>>>> cb28aef24a5... [MIRROR] Better UI for heretic research [MDB IGNORE] (#3413) /datum/heretic_knowledge/New() if(!mutually_exclusive) @@ -261,6 +274,7 @@ limit = 2 cost = 1 priority = MAX_KNOWLEDGE_PRIORITY - 5 + depth = 2 /datum/heretic_knowledge/limited_amount/starting/New() . = ..() @@ -285,6 +299,7 @@ abstract_parent_type = /datum/heretic_knowledge/mark mutually_exclusive = TRUE cost = 2 + depth = 5 /// The status effect typepath we apply on people on mansus grasp. var/datum/status_effect/eldritch/mark_type @@ -350,6 +365,7 @@ abstract_parent_type = /datum/heretic_knowledge/blade_upgrade mutually_exclusive = TRUE cost = 2 + depth = 9 /datum/heretic_knowledge/blade_upgrade/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) @@ -577,6 +593,9 @@ mutually_exclusive = TRUE cost = 1 priority = MAX_KNOWLEDGE_PRIORITY - 10 // A pretty important midgame ritual. + depth = 6 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "book_open" /// Whether we've done the ritual. Only doable once. var/was_completed = FALSE @@ -670,6 +689,9 @@ cost = 2 priority = MAX_KNOWLEDGE_PRIORITY + 1 // Yes, the final ritual should be ABOVE the max priority. required_atoms = list(/mob/living/carbon/human = 3) + depth = 11 + //use this to store the achievement typepath + var/datum/award/achievement/misc/ascension_achievement /datum/heretic_knowledge/ultimate/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -730,6 +752,8 @@ source = user, header = "A Heretic is Ascending!", ) + if(!isnull(ascension_achievement)) + user.client?.give_award(ascension_achievement, user) heretic_datum.increase_rust_strength() return TRUE diff --git a/code/modules/antagonists/heretic/items/eldritch_flask.dm b/code/modules/antagonists/heretic/items/eldritch_flask.dm index 95b77f95618..409bcd473ed 100644 --- a/code/modules/antagonists/heretic/items/eldritch_flask.dm +++ b/code/modules/antagonists/heretic/items/eldritch_flask.dm @@ -4,5 +4,5 @@ name = "flask of eldritch essence" desc = "Toxic to the closed minded, yet refreshing to those with knowledge of the beyond." icon = 'icons/obj/antags/eldritch.dmi' - icon_state = "eldrich_flask" + icon_state = "eldritch_flask" list_reagents = list(/datum/reagent/eldritch = 50) diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index dc768968e0b..ad56eebe622 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -39,6 +39,8 @@ ) result_atoms = list(/obj/item/melee/sickly_blade/ash) route = PATH_ASH + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "ash_blade" /datum/heretic_knowledge/ashen_grasp name = "Grasp of Ash" @@ -48,6 +50,9 @@ next_knowledge = list(/datum/heretic_knowledge/spell/ash_passage) cost = 1 route = PATH_ASH + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_ash" /datum/heretic_knowledge/ashen_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -80,6 +85,7 @@ spell_to_add = /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash cost = 1 route = PATH_ASH + depth = 4 /datum/heretic_knowledge/mark/ash_mark name = "Mark of Ash" @@ -119,6 +125,8 @@ spell_to_add = /datum/action/cooldown/spell/charged/beam/fire_blast cost = 1 route = PATH_ASH + depth = 7 + research_tree_icon_frame = 7 /datum/heretic_knowledge/mad_mask @@ -142,6 +150,9 @@ result_atoms = list(/obj/item/clothing/mask/madness_mask) cost = 1 route = PATH_ASH + research_tree_icon_path = 'icons/obj/clothing/masks.dmi' + research_tree_icon_state = "mad_mask" + depth = 8 /datum/heretic_knowledge/blade_upgrade/ash name = "Fiery Blade" @@ -150,6 +161,8 @@ His city, the people he swore to watch... and watch he did, as they all burnt to cinders." next_knowledge = list(/datum/heretic_knowledge/spell/flame_birth) route = PATH_ASH + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_ash" /datum/heretic_knowledge/blade_upgrade/ash/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) if(source == target) @@ -173,6 +186,8 @@ spell_to_add = /datum/action/cooldown/spell/aoe/fiery_rebirth cost = 1 route = PATH_ASH + depth = 10 + research_tree_icon_frame = 5 /datum/heretic_knowledge/ultimate/ash_final name = "Ashlord's Rite" @@ -187,6 +202,7 @@ for the Nightwatcher brought forth the rite to mankind! His gaze continues, as now I am one with the flames, \ WITNESS MY ASCENSION, THE ASHY LANTERN BLAZES ONCE MORE!" route = PATH_ASH + ascension_achievement = /datum/award/achievement/misc/ash_ascension /// A static list of all traits we apply on ascension. var/static/list/traits_to_apply = list( TRAIT_BOMBIMMUNE, @@ -233,6 +249,5 @@ var/datum/action/cooldown/spell/aoe/fiery_rebirth/fiery_rebirth = locate() in user.actions fiery_rebirth?.cooldown_time *= 0.16 - user.client?.give_award(/datum/award/achievement/misc/ash_ascension, user) if(length(traits_to_apply)) user.add_traits(traits_to_apply, MAGIC_TRAIT) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 12e683d0edc..64d55e0491e 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -43,6 +43,8 @@ result_atoms = list(/obj/item/melee/sickly_blade/dark) limit = 5 // It's the blade path, it's a given route = PATH_BLADE + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "dark_blade" /datum/heretic_knowledge/blade_grasp name = "Grasp of the Blade" @@ -52,6 +54,9 @@ next_knowledge = list(/datum/heretic_knowledge/blade_dance) cost = 1 route = PATH_BLADE + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_blade" /datum/heretic_knowledge/blade_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -111,6 +116,9 @@ ) cost = 1 route = PATH_BLADE + depth = 4 + research_tree_icon_path = 'icons/mob/actions/actions_ecult.dmi' + research_tree_icon_state = "shatter" /// Whether the counter-attack is ready or not. /// Used instead of cooldowns, so we can give feedback when it's ready again var/riposte_ready = TRUE @@ -231,6 +239,7 @@ spell_to_add = /datum/action/cooldown/spell/realignment cost = 1 route = PATH_BLADE + depth = 7 /// The amount of blood flow reduced per level of severity of gained bleeding wounds for Stance of the Torn Champion. #define BLOOD_FLOW_PER_SEVEIRTY -1 @@ -251,6 +260,10 @@ ) cost = 1 route = PATH_BLADE + depth = 8 + research_tree_icon_path = 'icons/effects/blood.dmi' + research_tree_icon_state = "suitblood" + research_tree_icon_dir = SOUTH /// Whether we're currently in duelist stance, gaining certain buffs (low health) var/in_duelist_stance = FALSE @@ -310,6 +323,8 @@ a flurry of blades, neither hitting their mark, for the Champion was indomitable." next_knowledge = list(/datum/heretic_knowledge/spell/furious_steel) route = PATH_BLADE + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_blade" /// How much force do we apply to the offhand? var/offand_force_decrement = 0 /// How much force was the last weapon we offhanded with? If it's different, we need to re-calculate the decrement @@ -380,6 +395,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/projectile/furious_steel cost = 1 route = PATH_BLADE + depth = 10 /datum/heretic_knowledge/ultimate/blade_final name = "Maelstrom of Silver" @@ -393,6 +409,7 @@ gain_text = "The Torn Champion is freed! I will become the blade reunited, and with my greater ambition, \ I AM UNMATCHED! A STORM OF STEEL AND SILVER IS UPON US! WITNESS MY ASCENSION!" route = PATH_BLADE + ascension_achievement = /datum/award/achievement/misc/blade_ascension /datum/heretic_knowledge/ultimate/blade_final/is_valid_sacrifice(mob/living/carbon/human/sacrifice) . = ..() @@ -409,7 +426,6 @@ sound = 'sound/ambience/antag/heretic/ascend_blade.ogg', color_override = "pink", ) - user.client?.give_award(/datum/award/achievement/misc/blade_ascension, user) ADD_TRAIT(user, TRAIT_NEVER_WOUNDED, name) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) user.apply_status_effect(/datum/status_effect/protective_blades/recharging, null, 8, 30, 0.25 SECONDS, 1 MINUTES) diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index 6e22ebc3790..a3e75761320 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -38,6 +38,8 @@ ) result_atoms = list(/obj/item/melee/sickly_blade/cosmic) route = PATH_COSMIC + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "cosmic_blade" /datum/heretic_knowledge/cosmic_grasp name = "Grasp of Cosmos" @@ -48,6 +50,9 @@ next_knowledge = list(/datum/heretic_knowledge/spell/cosmic_runes) cost = 1 route = PATH_COSMIC + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_cosmos" /datum/heretic_knowledge/cosmic_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -78,6 +83,7 @@ spell_to_add = /datum/action/cooldown/spell/cosmic_rune cost = 1 route = PATH_COSMIC + depth = 4 /datum/heretic_knowledge/mark/cosmic_mark name = "Mark of Cosmos" @@ -107,6 +113,7 @@ spell_to_add = /datum/action/cooldown/spell/touch/star_touch cost = 1 route = PATH_COSMIC + depth = 7 /datum/heretic_knowledge/spell/star_blast name = "Star Blast" @@ -123,6 +130,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/projectile/star_blast cost = 1 route = PATH_COSMIC + depth = 8 /datum/heretic_knowledge/blade_upgrade/cosmic name = "Cosmic Blade" @@ -135,6 +143,8 @@ The blades now glistened with fragmented power. I fell to the ground and wept at the beast's feet." next_knowledge = list(/datum/heretic_knowledge/spell/cosmic_expansion) route = PATH_COSMIC + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_cosmos" /// Storage for the second target. var/datum/weakref/second_target /// Storage for the third target. @@ -233,6 +243,7 @@ spell_to_add = /datum/action/cooldown/spell/conjure/cosmic_expansion cost = 1 route = PATH_COSMIC + depth = 10 /datum/heretic_knowledge/ultimate/cosmic_final name = "Creators's Gift" @@ -250,6 +261,7 @@ I closed my eyes with my head laid against their form. I was safe. \ WITNESS MY ASCENSION!" route = PATH_COSMIC + ascension_achievement = /datum/award/achievement/misc/cosmic_ascension /// A static list of command we can use with our mob. var/static/list/star_gazer_commands = list( /datum/pet_command/idle, @@ -296,5 +308,3 @@ var/datum/action/cooldown/spell/conjure/cosmic_expansion/cosmic_expansion_spell = locate() in user.actions cosmic_expansion_spell?.ascended = TRUE - - user.client?.give_award(/datum/award/achievement/misc/cosmic_ascension, user) diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 1d42cacee19..5635d6c38a1 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -44,6 +44,8 @@ result_atoms = list(/obj/item/melee/sickly_blade/flesh) limit = 3 // Bumped up so they can arm up their ghouls too. route = PATH_FLESH + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "flesh_blade" /datum/heretic_knowledge/limited_amount/starting/base_flesh/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -64,6 +66,9 @@ limit = 1 cost = 1 route = PATH_FLESH + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_flesh" /datum/heretic_knowledge/limited_amount/flesh_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -137,6 +142,10 @@ limit = 2 cost = 1 route = PATH_FLESH + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "ghoul_voiceless" + + depth = 4 /datum/heretic_knowledge/limited_amount/flesh_ghoul/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() @@ -227,6 +236,7 @@ spell_to_add = /datum/action/cooldown/spell/touch/flesh_surgery cost = 1 route = PATH_FLESH + depth = 7 /datum/heretic_knowledge/summon/raw_prophet name = "Raw Ritual" @@ -250,6 +260,7 @@ cost = 1 route = PATH_FLESH poll_ignore_define = POLL_IGNORE_RAW_PROPHET + depth = 8 /datum/heretic_knowledge/blade_upgrade/flesh name = "Bleeding Steel" @@ -258,6 +269,8 @@ I finally began to understand. And then, blood rained from the heavens." next_knowledge = list(/datum/heretic_knowledge/summon/stalker) route = PATH_FLESH + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_flesh" ///What type of wound do we apply on hit var/wound_type = /datum/wound/slash/flesh/severe @@ -292,6 +305,7 @@ cost = 1 route = PATH_FLESH poll_ignore_define = POLL_IGNORE_STALKER + depth = 10 /datum/heretic_knowledge/ultimate/flesh_final name = "Priest's Final Hymn" @@ -308,6 +322,7 @@ Reality will bend to THE LORD OF THE NIGHT or be unraveled! WITNESS MY ASCENSION!" required_atoms = list(/mob/living/carbon/human = 4) route = PATH_FLESH + ascension_achievement = /datum/award/achievement/misc/flesh_ascension /datum/heretic_knowledge/ultimate/flesh_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() @@ -321,7 +336,6 @@ var/datum/action/cooldown/spell/shapeshift/shed_human_form/worm_spell = new(user.mind) worm_spell.Grant(user) - user.client?.give_award(/datum/award/achievement/misc/flesh_ascension, user) var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) var/datum/heretic_knowledge/limited_amount/flesh_grasp/grasp_ghoul = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/flesh_grasp) diff --git a/code/modules/antagonists/heretic/knowledge/general_side.dm b/code/modules/antagonists/heretic/knowledge/general_side.dm index 2dc2719227b..27f0e11b446 100644 --- a/code/modules/antagonists/heretic/knowledge/general_side.dm +++ b/code/modules/antagonists/heretic/knowledge/general_side.dm @@ -12,6 +12,9 @@ ) cost = 1 route = PATH_SIDE + depth = 8 + research_tree_icon_path = 'icons/mob/actions/actions_animal.dmi' + research_tree_icon_state = "gaze" /datum/heretic_knowledge/reroll_targets/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index 2807167d819..17e73cb162c 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -39,6 +39,8 @@ result_atoms = list(/obj/item/melee/sickly_blade/lock) limit = 2 route = PATH_LOCK + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "key_blade" /datum/heretic_knowledge/lock_grasp name = "Grasp of Lock" @@ -49,6 +51,9 @@ next_knowledge = list(/datum/heretic_knowledge/key_ring) cost = 1 route = PATH_LOCK + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_lock" /datum/heretic_knowledge/lock_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, PROC_REF(on_secondary_mansus_grasp)) @@ -111,6 +116,9 @@ ) cost = 1 route = PATH_LOCK + research_tree_icon_path = 'icons/obj/card.dmi' + research_tree_icon_state = "card_gold" + depth = 4 /datum/heretic_knowledge/mark/lock_mark name = "Mark of Lock" @@ -140,6 +148,9 @@ next_knowledge = list(/datum/heretic_knowledge/spell/burglar_finesse) cost = 1 route = PATH_LOCK + research_tree_icon_path = 'icons/obj/service/library.dmi' + research_tree_icon_state = "heretichandbook" + depth = 7 /datum/heretic_knowledge/spell/burglar_finesse name = "Burglar's Finesse" @@ -156,6 +167,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/burglar_finesse cost = 1 route = PATH_LOCK + depth = 8 /datum/heretic_knowledge/blade_upgrade/flesh/lock //basically a chance-based weeping avulsion version of the former name = "Opening Blade" @@ -164,6 +176,8 @@ next_knowledge = list(/datum/heretic_knowledge/spell/caretaker_refuge) route = PATH_LOCK wound_type = /datum/wound/slash/flesh/critical + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_lock" var/chance = 35 /datum/heretic_knowledge/blade_upgrade/flesh/lock/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) @@ -183,6 +197,7 @@ route = PATH_LOCK spell_to_add = /datum/action/cooldown/spell/caretaker cost = 1 + depth = 10 /datum/heretic_knowledge/ultimate/lock_final name = "Unlock the Labyrinth" @@ -199,6 +214,7 @@ The Labyrinth will be Locked no more, and freedom will be ours! WITNESS US!" required_atoms = list(/mob/living/carbon/human = 3) route = PATH_LOCK + ascension_achievement = /datum/award/achievement/misc/lock_ascension /datum/heretic_knowledge/ultimate/lock_final/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() @@ -227,13 +243,11 @@ sound = 'sound/ambience/antag/heretic/ascend_knock.ogg', color_override = "pink", ) - user.client?.give_award(/datum/award/achievement/misc/lock_ascension, user) // buffs var/datum/action/cooldown/spell/shapeshift/eldritch/ascension/transform_spell = new(user.mind) transform_spell.Grant(user) - user.client?.give_award(/datum/award/achievement/misc/lock_ascension, user) var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) var/datum/heretic_knowledge/blade_upgrade/flesh/lock/blade_upgrade = heretic_datum.get_knowledge(/datum/heretic_knowledge/blade_upgrade/flesh/lock) blade_upgrade.chance += 30 diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index e2af5390ba8..ab814425d34 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -39,6 +39,8 @@ ) result_atoms = list(/obj/item/melee/sickly_blade/moon) route = PATH_MOON + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "moon_blade" /datum/heretic_knowledge/base_moon/on_gain(mob/user, datum/antagonist/heretic/our_heretic) add_traits(user ,TRAIT_EMPATH, REF(src)) @@ -51,6 +53,9 @@ next_knowledge = list(/datum/heretic_knowledge/spell/moon_smile) cost = 1 route = PATH_MOON + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_moon" /datum/heretic_knowledge/moon_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -82,6 +87,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/moon_smile cost = 1 route = PATH_MOON + depth = 4 /datum/heretic_knowledge/mark/moon_mark name = "Mark of Moon" @@ -107,6 +113,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/projectile/moon_parade cost = 1 route = PATH_MOON + depth = 7 /datum/heretic_knowledge/moon_amulet @@ -130,6 +137,10 @@ result_atoms = list(/obj/item/clothing/neck/heretic_focus/moon_amulet) cost = 1 route = PATH_MOON + depth = 8 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "moon_amulette" + research_tree_icon_frame = 9 /datum/heretic_knowledge/blade_upgrade/moon name = "Moonlight Blade" @@ -137,6 +148,8 @@ gain_text = "His wit was sharp as a blade, cutting through the lie to bring us joy." next_knowledge = list(/datum/heretic_knowledge/spell/moon_ringleader) route = PATH_MOON + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_moon" /datum/heretic_knowledge/blade_upgrade/moon/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) if(source == target) @@ -164,6 +177,8 @@ spell_to_add = /datum/action/cooldown/spell/aoe/moon_ringleader cost = 1 route = PATH_MOON + depth = 10 + research_tree_icon_frame = 5 /datum/heretic_knowledge/ultimate/moon_final name = "The Last Act" @@ -176,6 +191,7 @@ for where the Ringleader had started the parade, I shall continue it unto the suns demise \ WITNESS MY ASCENSION, THE MOON SMILES ONCE MORE AND FOREVER MORE IT SHALL!" route = PATH_MOON + ascension_achievement = /datum/award/achievement/misc/moon_ascension /datum/heretic_knowledge/ultimate/moon_final/is_valid_sacrifice(mob/living/sacrifice) @@ -197,7 +213,6 @@ color_override = "pink", ) - user.client?.give_award(/datum/award/achievement/misc/moon_ascension, user) ADD_TRAIT(user, TRAIT_MADNESS_IMMUNE, REF(src)) heretic_datum.add_team_hud(user, /datum/antagonist/lunatic) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index fe553c8b8c7..edb64799b5c 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -42,6 +42,8 @@ ) result_atoms = list(/obj/item/melee/sickly_blade/rust) route = PATH_RUST + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "rust_blade" /datum/heretic_knowledge/rust_fist name = "Grasp of Rust" @@ -52,6 +54,9 @@ next_knowledge = list(/datum/heretic_knowledge/rust_regen) cost = 1 route = PATH_RUST + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_rust" /datum/heretic_knowledge/rust_fist/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -93,6 +98,9 @@ ) cost = 1 route = PATH_RUST + research_tree_icon_path = 'icons/effects/eldritch.dmi' + research_tree_icon_state = "cloud_swirl" + depth = 4 /datum/heretic_knowledge/rust_regen/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) @@ -174,6 +182,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/rust_construction cost = 1 route = PATH_RUST + depth = 7 /datum/heretic_knowledge/spell/area_conversion name = "Aggressive Spread" @@ -191,6 +200,8 @@ spell_to_add = /datum/action/cooldown/spell/aoe/rust_conversion cost = 1 route = PATH_RUST + depth = 8 + research_tree_icon_frame = 5 /datum/heretic_knowledge/spell/area_conversion/on_gain(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -203,6 +214,8 @@ The heavy rust weights it down. You stare deeply into it. The Rusted Hills call for you, now." next_knowledge = list(/datum/heretic_knowledge/spell/entropic_plume) route = PATH_RUST + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_rust" /datum/heretic_knowledge/blade_upgrade/rust/on_gain(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -227,6 +240,7 @@ spell_to_add = /datum/action/cooldown/spell/cone/staggered/entropic_plume cost = 1 route = PATH_RUST + depth = 10 /datum/heretic_knowledge/spell/entropic_plume/on_gain(mob/user) . = ..() @@ -243,6 +257,7 @@ gain_text = "Champion of rust. Corruptor of steel. Fear the dark, for the RUSTBRINGER has come! \ The Blacksmith forges ahead! Rusted Hills, CALL MY NAME! WITNESS MY ASCENSION!" route = PATH_RUST + ascension_achievement = /datum/award/achievement/misc/rust_ascension /// If TRUE, then immunities are currently active. var/immunities_active = FALSE /// A typepath to an area that we must finish the ritual in. diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index d45b1039b26..c12e1fb4356 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -16,6 +16,9 @@ cost = 0 priority = MAX_KNOWLEDGE_PRIORITY // Should be at the top route = PATH_START + research_tree_icon_path = 'icons/effects/eldritch.dmi' + research_tree_icon_state = "eye_close" + research_tree_icon_frame = 1 /// How many targets do we generate? var/num_targets_to_generate = 5 /// Whether we've generated a heretic sacrifice z-level yet, from any heretic. diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm index f933bbfda1d..758ee0548d5 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm @@ -16,6 +16,9 @@ result_atoms = list(/obj/item/clothing/neck/eldritch_amulet) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "eye_medalion" + depth = 4 /datum/heretic_knowledge/curse/paralysis name = "Curse of Paralysis" @@ -37,6 +40,9 @@ curse_color = "#f19a9a" cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "curse_paralysis" + depth = 8 /datum/heretic_knowledge/curse/paralysis/curse(mob/living/carbon/human/chosen_mob, boosted = FALSE) if(chosen_mob.usable_legs <= 0) // What're you gonna do, curse someone who already can't walk? @@ -75,6 +81,7 @@ cost = 1 route = PATH_SIDE poll_ignore_define = POLL_IGNORE_ASH_SPIRIT + depth = 10 /datum/heretic_knowledge/summon/ashy/cleanup_atoms(list/selected_atoms) var/obj/item/bodypart/head/ritual_head = locate() in selected_atoms diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index e8c14d16abe..386f58833fe 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -16,6 +16,10 @@ result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' + research_tree_icon_state = "eldritch_armor" + research_tree_icon_frame = 12 + depth = 4 /datum/heretic_knowledge/crucible name = "Mawed Crucible" @@ -34,6 +38,9 @@ result_atoms = list(/obj/structure/destructible/eldritch_crucible) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "crucible" + depth = 8 /datum/heretic_knowledge/rifle name = "Lionhunter's Rifle" @@ -59,9 +66,12 @@ result_atoms = list(/obj/item/gun/ballistic/rifle/lionhunter) cost = 1 route = PATH_SIDE + depth = 8 + research_tree_icon_path = 'icons/obj/weapons/guns/ballistic.dmi' + research_tree_icon_state = "goldrevolver" /datum/heretic_knowledge/rifle_ammo - name = "Lionhunter Rifle Ammunition (free)" + name = "Lionhunter Rifle Ammunition" desc = "Allows you to transmute 3 ballistic ammo casings (used or unused) of any caliber, \ including shotgun shot, with any animal hide to create an extra clip of ammunition for the Lionhunter Rifle." gain_text = "The weapon came with three rough iron balls, intended to be used as ammunition. \ @@ -74,6 +84,9 @@ result_atoms = list(/obj/item/ammo_box/strilka310/lionhunter) cost = 0 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/weapons/guns/ammo.dmi' + research_tree_icon_state = "310_strip" + depth = 8 /// A list of calibers that the ritual will deny. Only ballistic calibers are allowed. var/static/list/caliber_blacklist = list( CALIBER_LASER, @@ -107,3 +120,4 @@ spell_to_add = /datum/action/cooldown/mob_cooldown/charge/rust cost = 1 route = PATH_SIDE + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm index 14a003ce11c..1a08236aee6 100644 --- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm +++ b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm @@ -19,6 +19,8 @@ cost = 1 route = PATH_SIDE poll_ignore_define = POLL_IGNORE_FIRE_SHARK + depth = 4 + research_tree_icon_dir = EAST /datum/heretic_knowledge/spell/space_phase name = "Space Phase" @@ -32,6 +34,8 @@ spell_to_add = /datum/action/cooldown/spell/jaunt/space_crawl cost = 1 route = PATH_SIDE + depth = 8 + research_tree_icon_frame = 6 /datum/heretic_knowledge/eldritch_coin name = "Eldritch Coin" @@ -51,3 +55,6 @@ result_atoms = list(/obj/item/coin/eldritch) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/economy.dmi' + research_tree_icon_state = "coin_heretic" + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm index 4a315575d61..a958ab3f272 100644 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm @@ -19,6 +19,9 @@ result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/void) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' + research_tree_icon_state = "void_cloak" + depth = 4 /datum/heretic_knowledge/spell/blood_siphon name = "Blood Siphon" @@ -32,6 +35,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/blood_siphon cost = 1 route = PATH_SIDE + depth = 8 /datum/heretic_knowledge/spell/cleave name = "Blood Cleave" @@ -46,3 +50,4 @@ spell_to_add = /datum/action/cooldown/spell/pointed/cleave cost = 1 route = PATH_SIDE + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm index 74013f2b0bd..706b83abac7 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm @@ -12,6 +12,7 @@ spell_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation cost = 1 route = PATH_SIDE + depth = 8 /datum/heretic_knowledge/spell/apetra_vulnera name = "Apetra Vulnera" @@ -26,3 +27,4 @@ spell_to_add = /datum/action/cooldown/spell/pointed/apetra_vulnera cost = 1 route = PATH_SIDE + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm index 5ab50a8b84f..3d3d0b11686 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm @@ -13,6 +13,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/mind_gate cost = 1 route = PATH_SIDE + depth = 4 /datum/heretic_knowledge/unfathomable_curio name = "Unfathomable Curio" @@ -33,6 +34,9 @@ result_atoms = list(/obj/item/storage/belt/unfathomable_curio) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/clothing/belts.dmi' + research_tree_icon_state = "unfathomable_curio" + depth = 8 /datum/heretic_knowledge/painting name = "Unsealed Arts" @@ -54,6 +58,9 @@ result_atoms = list(/obj/item/canvas) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/signs.dmi' + research_tree_icon_state = "eldritch_painting_weeping" + depth = 8 /datum/heretic_knowledge/painting/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) if(locate(/obj/item/organ/internal/eyes) in atoms) diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm index 56999243b5d..11918c66a29 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm @@ -17,6 +17,9 @@ result_atoms = list(/obj/item/reagent_containers/cup/beaker/eldritch) cost = 1 route = PATH_SIDE + depth = 4 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "eldritch_flask" /datum/heretic_knowledge/entropy_pulse name = "Pulse of Entropy" @@ -28,6 +31,10 @@ ) cost = 0 route = PATH_SIDE + research_tree_icon_path = 'icons/mob/actions/actions_ecult.dmi' + research_tree_icon_state = "corrode" + research_tree_icon_frame = 10 + depth = 4 var/rusting_range = 8 /datum/heretic_knowledge/entropy_pulse/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) @@ -60,6 +67,9 @@ curse_color = "#c1ffc9" cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "curse_corrosion" + depth = 8 /datum/heretic_knowledge/curse/corrosion/curse(mob/living/carbon/human/chosen_mob, boosted = FALSE) to_chat(chosen_mob, span_danger("You feel very ill...")) @@ -92,6 +102,7 @@ cost = 1 route = PATH_SIDE poll_ignore_define = POLL_IGNORE_RUST_SPIRIT + depth = 8 /datum/heretic_knowledge/summon/rusty/cleanup_atoms(list/selected_atoms) var/obj/item/bodypart/head/ritual_head = locate() in selected_atoms diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index e044eee8619..56945262e3c 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -23,6 +23,9 @@ limit = 1 cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "ghoul_shattered" + depth = 4 /datum/heretic_knowledge/limited_amount/risen_corpse/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() @@ -139,6 +142,9 @@ result_atoms = list(/obj/item/melee/rune_carver) cost = 1 route = PATH_SIDE + depth = 8 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "rune_carver" /datum/heretic_knowledge/summon/maid_in_mirror name = "Maid in the Mirror" @@ -162,3 +168,4 @@ route = PATH_SIDE mob_to_summon = /mob/living/basic/heretic_summon/maid_in_the_mirror poll_ignore_define = POLL_IGNORE_MAID_IN_MIRROR + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index f1b5f7f55ea..799027a4c4e 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -48,6 +48,9 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) cost = 0 priority = MAX_KNOWLEDGE_PRIORITY - 1 // Knowing how to remake your heart is important route = PATH_START + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "living_heart" + research_tree_icon_frame = 1 /// The typepath of the organ type required for our heart. var/required_organ_type = /obj/item/organ/internal/heart @@ -204,6 +207,8 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) cost = 0 priority = MAX_KNOWLEDGE_PRIORITY - 2 // Not as important as making a heart or sacrificing, but important enough. route = PATH_START + research_tree_icon_path = 'icons/obj/clothing/neck.dmi' + research_tree_icon_state = "eldritch_necklace" /datum/heretic_knowledge/spell/cloak_of_shadows name = "Cloak of Shadow" @@ -238,6 +243,8 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) route = PATH_START priority = MAX_KNOWLEDGE_PRIORITY - 3 // Least priority out of the starting knowledges, as it's an optional boon. var/static/list/non_mob_bindings = typecacheof(list(/obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide)) + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "book" /datum/heretic_knowledge/codex_cicatrix/parse_required_item(atom/item_path, number_of_things) if(item_path == /obj/item/pen) @@ -293,3 +300,40 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) body.do_jitter_animation() body.visible_message(span_danger("An awful ripping sound is heard as [ripped_thing]'s [exterior_text] is ripped straight out, wrapping around [le_book || "the book"], turning into an eldritch shade of blue!")) return ..() +<<<<<<< HEAD +======= + +/datum/heretic_knowledge/feast_of_owls + name = "Feast of Owls" + desc = "Allows you to undergo a ritual that gives you 5 knowledge points but locks you out of ascension. This can only be done once and cannot be reverted." + gain_text = "Under the soft glow of unreason there is a beast that stalks the night. I shall bring it forth and let it enter my presence. It will feast upon my amibitions and leave knowledge in its wake." + route = PATH_START + required_atoms = list() + research_tree_icon_path = 'icons/mob/actions/actions_animal.dmi' + research_tree_icon_state = "god_transmit" + +/datum/heretic_knowledge/feast_of_owls/can_be_invoked(datum/antagonist/heretic/invoker) + return !invoker.feast_of_owls + +/datum/heretic_knowledge/feast_of_owls/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + //amount of research points granted + var/reward = 5 + var/alert = tgui_alert(user,"Do you really want to forsake your ascension? This action cannot be reverted.", "Feast of Owls", list("Yes I'm sure", "No"), 30 SECONDS) + if( alert != "Yes I'm sure") + return FALSE + user.set_temp_blindness(reward SECONDS) + user.AdjustParalyzed(reward SECONDS) + user.playsound_local(get_turf(user), 'sound/ambience/antag/heretic/heretic_gain_intense.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) + var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) + for(var/i in 1 to reward) + user.emote("scream") + playsound(loc, 'sound/items/eatfood.ogg', 100, TRUE) + heretic_datum.knowledge_points++ + to_chat(user, span_danger("You feel something invisible tearing away at your very essence!")) + user.do_jitter_animation() + sleep(1 SECONDS) + heretic_datum.feast_of_owls = TRUE + to_chat(user, span_danger(span_big("Your ambition is ravaged, but something powerful remains in its wake..."))) + var/drain_message = pick(strings(HERETIC_INFLUENCE_FILE, "drain_message")) + to_chat(user, span_hypnophrase(span_big("[drain_message]"))) +>>>>>>> cb28aef24a5... [MIRROR] Better UI for heretic research [MDB IGNORE] (#3413) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index ec7c9d6942a..0f8a641884b 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -37,6 +37,8 @@ required_atoms = list(/obj/item/knife = 1) result_atoms = list(/obj/item/melee/sickly_blade/void) route = PATH_VOID + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "void_blade" /datum/heretic_knowledge/limited_amount/starting/base_void/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) if(!isopenturf(loc)) @@ -58,6 +60,9 @@ next_knowledge = list(/datum/heretic_knowledge/cold_snap) cost = 1 route = PATH_VOID + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_void" /datum/heretic_knowledge/void_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -88,6 +93,9 @@ ) cost = 1 route = PATH_VOID + research_tree_icon_path = 'icons/effects/effects.dmi' + research_tree_icon_state = "the_freezer" + depth = 4 /datum/heretic_knowledge/cold_snap/on_gain(mob/user, datum/antagonist/heretic/our_heretic) user.add_traits(list(TRAIT_NOBREATH, TRAIT_RESISTCOLD), type) @@ -119,6 +127,7 @@ spell_to_add = /datum/action/cooldown/spell/cone/staggered/cone_of_cold/void cost = 1 route = PATH_VOID + depth = 7 /datum/heretic_knowledge/spell/void_phase name = "Void Phase" @@ -135,6 +144,8 @@ spell_to_add = /datum/action/cooldown/spell/pointed/void_phase cost = 1 route = PATH_VOID + depth = 8 + research_tree_icon_frame = 7 /datum/heretic_knowledge/blade_upgrade/void name = "Seeking Blade" @@ -142,6 +153,8 @@ gain_text = "Fleeting memories, fleeting feet. I mark my way with frozen blood upon the snow. Covered and forgotten." next_knowledge = list(/datum/heretic_knowledge/spell/void_pull) route = PATH_VOID + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_void" /datum/heretic_knowledge/blade_upgrade/void/do_ranged_effects(mob/living/user, mob/living/target, obj/item/melee/sickly_blade/blade) if(!target.has_status_effect(/datum/status_effect/eldritch)) @@ -168,6 +181,8 @@ spell_to_add = /datum/action/cooldown/spell/aoe/void_pull cost = 1 route = PATH_VOID + depth = 10 + research_tree_icon_frame = 6 /datum/heretic_knowledge/ultimate/void_final name = "Waltz at the End of Time" @@ -180,6 +195,7 @@ The Aristocrat stands before me, beckoning. We will play a waltz to the whispers of dying reality, \ as the world is destroyed before our eyes. The void will return all to nothing, WITNESS MY ASCENSION!" route = PATH_VOID + ascension_achievement = /datum/award/achievement/misc/void_ascension ///soundloop for the void theme var/datum/looping_sound/void_loop/sound_loop ///Reference to the ongoing voidstrom that surrounds the heretic @@ -205,7 +221,6 @@ sound = 'sound/ambience/antag/heretic/ascend_void.ogg', color_override = "pink", ) - user.client?.give_award(/datum/award/achievement/misc/void_ascension, user) ADD_TRAIT(user, TRAIT_RESISTLOWPRESSURE, MAGIC_TRAIT) // Let's get this show on the road! diff --git a/icons/obj/antags/eldritch.dmi b/icons/obj/antags/eldritch.dmi index 7f6af6bfe2e653fc74e997c17fee303cd6847c2a..664311e5c7c478ca645ca31f1cb4fab1ddbea768 100644 GIT binary patch literal 9258 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 ke>$~Rjp(G4;21nvH$=8 literal 4403 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%0Dn%&{+xAsLRYMlh{ybx6LPUj9ilgm# zVm9>Kc9oB@3QNky9@DIA)3iaI=l~H7+EV5_UVizK2mci3-3g8)Yg-rATotseGZ~ln z87?mf;_3Ri;pFhKY^>36T2fGZ;vjBbfW!YN%{*3hoBQks%E7Zh-Z!cZA#P|C4w`O}{IWBKmd+k>TPoKG{Mf(&tKYL%~7x!T@ zzUsRj%Fc&BJyvnzCpnQAwk^RWph_VX)3UPw;9vIl)6ZzqRxYb%q@@|ca$R9Mjx_aj zbwg9S^J5h&AFs~rcqH?FwkRj_|L}LS@fly=@xiaO&Y7Gw!1jJpPqn|m^6@kPDVVok zF3B;$+$1;&NnC(Cnk2^r0Kr^~sb&sLn8Kf`Fr%k#ZJM2{?mOq8o2ZwVkh z>ALj*)Q(I0p5Mi}lc4WVA`D=D^TL{X)3OpEFh}w+0I@h1ZOjlxwr6r705s049CcjL z>{HcP@4<=ag~z_l1xuc~k|1TZu_7xsw!-sSsAX$cHCUG?4PeB+KkB^pY6Zp+50X@dv!AZy>HIO z!^Jbl2LF4@++6cOPxq&I#qdET-SD=YngGl;BzGps+n{kJw|$b?-d&emTLdOGr*dGm ztL7Fp%`8&i@xXwVYy8H=jIrL+8u8V2>%J(2SS_TSmvo$21c*9K+s}#8oX7$Y0N`+< z2}jB%;Ypj*ju7?3w%tmA{lKP8{)-;`5_vBRlNpO^3cUvt0mx|)8JMC#yvHKn_aT24BAU$#cV=b9rBL z+*jAF`{2|zxwLkAGG5a zE25ev=&4g=DVO3}5WFpM8Jo-_D%$+2r_ksm1E&PUQaKT{YRx<&y2uUt72Ce+ntv z0mL9>Ej*2mpE0&yW$dUeM4Kx_L}Bdc^&2*P_21Lk_v2FR(V3!w-?s6?u}43>_*E24@QrK@y_c_*hdv8%p64B%_@FVa_=c2J7o+XYW4kfa$@t> zFKnwE0+qR(ylVo~#k&4{HsMRtgE!&iUhGt!8&hD{_M&aQA2*2i2%MMzUM}Lb(HS^Z z?LfQrguGkSke7VoKz0LP8%b_HZ-HE%0A(&G=Y>F(@vc9a4R7#IB|>j&P_`x&@VWuC z-x$EPf`H*s4F4>Q?(P^S0bo`Vl^@MwR(&n%ZwlZeuk=A1YenyywY2qWiFHx}q=06- z__9&km7g5l{Fj%fyJgCp&-ArCG_UKEi_e&UAUTLlAVma-JVtw>$XX_%H>8_sUkjdS1%SCCMtf^is9ZA#svd9PGNS+hPq$HAOJWD3M?U0qE&BPd;kwzt`3(e zb1n=30`aad@LDfa+1*5&RL9Hq?yE#9Euk(|PzL}{sYs+8gzoIetlR5RCm0|YaC<#! z@9f8{v_$YJ6{7&KOhH{*LhXroVUpsYa%UrLk`kZ>+!Tp){n6#>beS?!FaTI_26qqv zMh1t+qL^?i5CDLF4r{`J7K(V8Py0fUDF>mC*C7r7zn#a#!#N}Y;Nx|OPdW(gENL%8 z5rijgX#L#N&ASl{z6$LQLkpX~~NmLaG>Prst0PxWyA~^y7pH+fCI_T~DGXXr>2mDzaJSX74XA}_t zc*#M&Ku}vIy>MxiBU2FICV}@va0&qG(^zzQx?QG>2ZQOf0>Eh%qi~?u1m%E(2>`eX zs4)ffXJRNY0o>gV<&hNBA_Kk>_q@|X7Vwo?pvZtnQc&-j355yZnHUPDfPSs?T;L8k zm=FMS3A|s!FaW@|THo``%9Qyvz~n4t1_0zLkprLvE%?_mv`7hbL{YIIhwuakeQE+l zDS>Y^08b79R~9`zv<_f(!F%r;4PJ7}XHqCmaL~Lo!ZTv1kP=wS(BiidfCD8PLk<9B z$N2>k%9Qza!vymr4^9Yn$b#>)eYj4EBP=~rVtgf!`hbM8F#>si!V7sm)(*T81;%{d z>(!X|9uvSr3E<@rWI#gsUk2&{KuSm@j_~Jtab3uQ&keu^fT_02l(}3?@Aw2Q1n=*~ zda6QYaU9t{2DVL%BVQ4R_E+PGMH%R|D9~O6{(Jy9Fqr-!{r~_4D@jB_RC;y|aA4GX zucHWTi~>;x`g#Jfia4~1apeCL*k&b=r7Be3--q@7qPNXjrp)Dr+=Eg;0kH&3K@ zjsun-V>2z-f0@9ws6{0k#e}FuoLoq@klr^Zp-h<%3z9F`{i0oI0suCMW|wPzqq0B(N$6+*| zkh>-YMg;8dMx2P-UEKV)=*P=Mz%66$ogHb!JEK@4CGb=gc10BALk!s!lb-T( zV-CY0Bp@&ffe{eKUe9~-hO4s(RuFO#1^H*IuuDpyvl5HvWl(*~sJN2|kZ16+mEZi> zWU+>@(L_j)&6WLk})hIA)brf&cyeg3gtI*2{NvIeH z!?;FB?ytvb0QiW4cr8bvMuC~D!EiE%<3zyq79J2YSe%_G3~u#rzU6XtxJ;RIIqxCV z+a3OIk_$PN6u-L)JL3whY6a%}0u(U=Avlm{;y7KQBBgm%QIc^5lS9?$B^Oe(Ah^(g zuTF;o5iq=mvm!W2lJ(M#~T)>$=@ri2!mT_vG=V zbb51n0+jhr!@Hc}hSQt>A|3B4uIMR#QOxu=T_^FNbrJ`4@^t>E7<$_@SUQI#T(}0o zjS^&BfjCL%Z3JdtBQc}UgQzcpg`$aroh%OSZ}oqxU~K*mI~A8H^Q+{d)`*3P&EML# zqARiDARc0kxLJ>Ri7Qe9ohp3U0aW)@Vl1sA2S8MsP+P`PJx}pOZn6d~{?g~&0c_Z@ z%KwyoeDl-4zHXH%b7{P3V`n??C-gQtHph0YZy9Uo^GQa$)Uv`Eo zb2)iWbKEI1naz)G_Tf>)x_+zk6qePcF&_oHMb1&%ru6(wK+ & BoxProps; @@ -49,7 +49,7 @@ export function DmIcon(props: Props) { const [iconRef, setIconRef] = useState(''); - const query = `${iconRef}?state=${icon_state}&dir=${direction}&movement=${movement}&frame=${frame}`; + const query = `${iconRef}?state=${icon_state}&dir=${direction}&movement=${!!movement}&frame=${frame}`; useEffect(() => { async function fetchRefMap() { diff --git a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx index 4992b57a658..cc315183000 100644 --- a/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx +++ b/tgui/packages/tgui/interfaces/AntagInfoHeretic.tsx @@ -2,8 +2,7 @@ import { BooleanLike } from 'common/react'; import { useState } from 'react'; import { useBackend } from '../backend'; -import { BlockQuote, Box, Button, Section, Stack, Tabs } from '../components'; -import { CssColor } from '../constants'; +import { Box, Button, DmIcon, Flex, Section, Stack, Tabs } from '../components'; import { Window } from '../layouts'; import { Rules } from './AntagInfoRules'; // NOVA EDIT ADDITION import { @@ -36,20 +35,33 @@ const hereticYellow = { color: 'yellow', }; +type IconParams = { + icon: string; + state: string; + frame: number; + dir: number; + moving: BooleanLike; +}; + type Knowledge = { path: string; + icon_params: IconParams; name: string; desc: string; gainFlavor: string; cost: number; - disabled: boolean; - hereticPath: string; - color: CssColor; + bgr: string; + disabled: BooleanLike; + finished: BooleanLike; + ascension: BooleanLike; }; type KnowledgeInfo = { - learnableKnowledge: Knowledge[]; - learnedKnowledge: Knowledge[]; + knowledge_tiers: KnowledgeTier[]; +}; + +type KnowledgeTier = { + nodes: Knowledge[]; }; type Info = { @@ -227,63 +239,96 @@ const InformationSection = (props) => { ); }; -const ResearchedKnowledge = (props) => { - const { data } = useBackend(); - const { learnedKnowledge } = data; +const KnowledgeTree = (props) => { + const { data, act } = useBackend(); + const { knowledge_tiers } = data; return ( - -
- - {(!learnedKnowledge.length && 'None!') || - learnedKnowledge.map((learned) => ( - - + {!!node.ascension && ( + + DUSK + + )} + + ))} + +
))} -
-
-
- ); -}; - -const KnowledgeShop = (props) => { - const { data, act } = useBackend(); - const { learnableKnowledge } = data; - - return ( - -
- {(!learnableKnowledge.length && 'None!') || - learnableKnowledge.map((toLearn) => ( - -
-
+ + ); }; @@ -292,23 +337,16 @@ const ResearchInfo = (props) => { const { charges } = data; return ( - + + + You have {charges || 0}  + + knowledge point{charges !== 1 ? 's' : ''} + {' '} + to spend. + - - - You have {charges || 0}  - - knowledge point{charges !== 1 ? 's' : ''} - {' '} - to spend. - - - - - - - - + );