From c915a922cdc8ef655246938da649cb2c74978e10 Mon Sep 17 00:00:00 2001 From: Djiq <42111655+Djiq@users.noreply.github.com> Date: Mon, 11 Nov 2024 23:42:19 +0100 Subject: [PATCH] Datumizes heretic paths (#87432) ## About The Pull Request Replaces the previous system of manually linking each and every heretic knowledge with eachother with an elegant solution to the problem, additionally places further restrictions on heretic tree, ensuring that noone can singlehandledly make it really hard to understand. There were 2 holes in the heretic knowledge tree, which I removed with temporary dummy linkings (till someone adds something there, or I may yet add something there in this PR, so if someone wants to add something there better do it quickly). The dummy linkings are necessary as the new system is rigid in this regard in that it does not allow for these connections to *not* exist, the heretic tree is a directional graph and while it handles one or mroe connections, it cannot handle having no connections by design. --- code/__DEFINES/antagonists.dm | 8 + .../antagonists/heretic/heretic_antag.dm | 32 +-- .../antagonists/heretic/heretic_knowledge.dm | 48 +---- .../heretic/knowledge/_heretic_paths.dm | 199 ++++++++++++++++++ .../antagonists/heretic/knowledge/ash_lore.dm | 90 +++----- .../heretic/knowledge/blade_lore.dm | 92 ++------ .../heretic/knowledge/cosmic_lore.dm | 85 ++------ .../heretic/knowledge/flesh_lore.dm | 91 +++----- .../heretic/knowledge/general_side.dm | 2 - .../heretic/knowledge/lock_lore.dm | 83 ++------ .../heretic/knowledge/moon_lore.dm | 97 +++------ .../heretic/knowledge/rust_lore.dm | 94 +++------ .../sacrifice_knowledge.dm | 2 +- .../heretic/knowledge/side_ash_moon.dm | 35 ++- .../heretic/knowledge/side_blade_rust.dm | 51 +++-- .../heretic/knowledge/side_cosmos_ash.dm | 38 ++-- .../heretic/knowledge/side_flesh_void.dm | 41 ++-- .../heretic/knowledge/side_lock_flesh.dm | 32 +-- .../heretic/knowledge/side_lock_moon.dm | 43 ++-- .../heretic/knowledge/side_rust_cosmos.dm | 44 ++-- .../heretic/knowledge/side_void_blade.dm | 39 ++-- .../heretic/knowledge/starting_lore.dm | 20 +- .../heretic/knowledge/void_lore.dm | 93 +++----- code/modules/unit_tests/heretic_knowledge.dm | 64 +----- tgstation.dme | 1 + 25 files changed, 608 insertions(+), 816 deletions(-) create mode 100644 code/modules/antagonists/heretic/knowledge/_heretic_paths.dm diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 159f1da9b45..c2b466d7f7f 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -89,6 +89,14 @@ #define PATH_LOCK "Lock Path" #define PATH_MOON "Moon Path" +//Heretic knowledge tree defines +#define HKT_NEXT "next" +#define HKT_BAN "ban" +#define HKT_DEPTH "depth" +#define HKT_ROUTE "route" +#define HKT_UI_BGR "ui_bgr" + + /// Defines are used in /proc/has_living_heart() to report if the heretic has no heart period, no living heart, or has a living heart. #define HERETIC_NO_HEART_ORGAN -1 #define HERETIC_NO_LIVING_HEART 0 diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 2f2122400b8..9063760c5bc 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -60,19 +60,6 @@ var/rust_strength = 0 /// Wether we are allowed to ascend var/feast_of_owls = FALSE - /// Static list of what each path converts to in the UI (colors are TGUI colors) - 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", - ) /// List that keeps track of which items have been gifted to the heretic after a cultist was sacrificed. Used to alter drop chances to reduce dupes. var/list/unlocked_heretic_items = list( @@ -150,7 +137,7 @@ 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["bgr"] = GLOB.heretic_research_tree[knowledge][HKT_UI_BGR] knowledge_data["finished"] = done knowledge_data["ascension"] = ispath(knowledge,/datum/heretic_knowledge/ultimate) @@ -178,10 +165,10 @@ 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) + while(GLOB.heretic_research_tree[knowledge][HKT_DEPTH] > tiers.len) tiers += list(list("nodes"=list())) - tiers[initial(knowledge.depth)]["nodes"] += list(knowledge_data) + tiers[GLOB.heretic_research_tree[knowledge][HKT_DEPTH]]["nodes"] += list(knowledge_data) for(var/datum/heretic_knowledge/knowledge as anything in get_researchable_knowledge()) var/list/knowledge_data = get_knowledge_data(knowledge,FALSE) @@ -190,10 +177,10 @@ if(ispath(knowledge, /datum/heretic_knowledge/ultimate)) knowledge_data["disabled"] ||= !can_ascend() - while(initial(knowledge.depth) > tiers.len) + while(GLOB.heretic_research_tree[knowledge][HKT_DEPTH] > tiers.len) tiers += list(list("nodes"=list())) - tiers[initial(knowledge.depth)]["nodes"] += list(knowledge_data) + tiers[GLOB.heretic_research_tree[knowledge][HKT_DEPTH]]["nodes"] += list(knowledge_data) data["knowledge_tiers"] = tiers @@ -272,6 +259,9 @@ return ..() /datum/antagonist/heretic/on_gain() + if(!GLOB.heretic_research_tree) + GLOB.heretic_research_tree = generate_heretic_research_tree() + if(give_objectives) forge_primary_objectives() @@ -822,8 +812,8 @@ var/list/banned_knowledge = list() for(var/knowledge_index in researched_knowledge) var/datum/heretic_knowledge/knowledge = researched_knowledge[knowledge_index] - researchable_knowledge |= knowledge.next_knowledge - banned_knowledge |= knowledge.banned_knowledge + researchable_knowledge |= GLOB.heretic_research_tree[knowledge_index][HKT_NEXT] + banned_knowledge |= GLOB.heretic_research_tree[knowledge_index][HKT_BAN] banned_knowledge |= knowledge.type researchable_knowledge -= banned_knowledge return researchable_knowledge @@ -939,7 +929,7 @@ // (All the main paths are (should be) the same length, so it doesn't matter.) var/rust_paths_found = 0 for(var/datum/heretic_knowledge/knowledge as anything in subtypesof(/datum/heretic_knowledge)) - if(initial(knowledge.route) == PATH_RUST) + if(GLOB.heretic_research_tree[knowledge][HKT_ROUTE] == PATH_RUST) rust_paths_found++ main_path_length = rust_paths_found diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 79c7197df40..d4fdf79dfbb 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -17,12 +17,6 @@ var/gain_text /// The abstract parent type of the knowledge, used in determine mutual exclusivity in some cases var/datum/heretic_knowledge/abstract_parent_type = /datum/heretic_knowledge - /// If TRUE, populates the banned_knowledge list of every other subtype of this knowledge's abstract_parent_type - var/mutually_exclusive = FALSE - /// The knowledge this unlocks next after learning. - var/list/next_knowledge = list() - /// What knowledge is incompatible with this. Knowledge in this list cannot be researched with this current knowledge. - var/list/banned_knowledge = list() /// Assoc list of [typepaths we need] to [amount needed]. /// If set, this knowledge allows the heretic to do a ritual on a transmutation rune with the components set. /// If one of the items in the list is a list, it's treated as 'any of these items will work' @@ -36,30 +30,18 @@ /// The priority of the knowledge. Higher priority knowledge appear higher in the ritual list. /// Number itself is completely arbitrary. Does not need to be set for non-ritual knowledge. var/priority = 0 - /// What path is this on. If set to "null", assumed to be unreachable (or abstract). - var/route + ///If this is considered starting knowledge, TRUE if yes + var/is_starting_knowledge = FALSE /// 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 -/datum/heretic_knowledge/New() - if(!mutually_exclusive) - return - - for(var/knowledge_type in subtypesof(abstract_parent_type)) - if(knowledge_type == type) - continue - banned_knowledge += knowledge_type - -/** - * Called when the knowledge is first researched. +/** Called when the knowledge is first researched. * This is only ever called once per heretic. * * Arguments @@ -269,24 +251,14 @@ */ /datum/heretic_knowledge/limited_amount/starting abstract_parent_type = /datum/heretic_knowledge/limited_amount/starting - mutually_exclusive = TRUE limit = 2 cost = 1 priority = MAX_KNOWLEDGE_PRIORITY - 5 - depth = 2 - -/datum/heretic_knowledge/limited_amount/starting/New() - . = ..() - // Starting path also determines the final knowledge we're limited too - for(var/datum/heretic_knowledge/final_knowledge_type as anything in subtypesof(/datum/heretic_knowledge/ultimate)) - if(initial(final_knowledge_type.route) == route) - continue - banned_knowledge += final_knowledge_type /datum/heretic_knowledge/limited_amount/starting/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() - our_heretic.heretic_path = route - SSblackbox.record_feedback("tally", "heretic_path_taken", 1, route) + our_heretic.heretic_path = GLOB.heretic_research_tree[type][HKT_ROUTE] + SSblackbox.record_feedback("tally", "heretic_path_taken", 1, our_heretic.heretic_path) /** * A knowledge subtype for heretic knowledge @@ -296,9 +268,7 @@ */ /datum/heretic_knowledge/mark 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 @@ -364,9 +334,7 @@ */ /datum/heretic_knowledge/blade_upgrade 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)) @@ -603,10 +571,8 @@ desc = "A randomly generated transmutation ritual that rewards knowledge points and can only be completed once." gain_text = "Everything can be a key to unlocking the secrets behind the Gates. I must be wary and wise." abstract_parent_type = /datum/heretic_knowledge/knowledge_ritual - 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. @@ -696,11 +662,9 @@ */ /datum/heretic_knowledge/ultimate abstract_parent_type = /datum/heretic_knowledge/ultimate - mutually_exclusive = TRUE // I guess, but it doesn't really matter by this point 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 @@ -756,7 +720,7 @@ human_user.physiology.brute_mod *= 0.5 human_user.physiology.burn_mod *= 0.5 - SSblackbox.record_feedback("tally", "heretic_ascended", 1, route) + SSblackbox.record_feedback("tally", "heretic_ascended", 1, GLOB.heretic_research_tree[type][HKT_ROUTE]) log_heretic_knowledge("[key_name(user)] completed their final ritual at [worldtime2text()].") notify_ghosts( "[user] has completed an ascension ritual!", diff --git a/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm b/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm new file mode 100644 index 00000000000..5e3583e14b3 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/_heretic_paths.dm @@ -0,0 +1,199 @@ +//Global typecache of all heretic knowledges -> instantiate the tree columns -> make them link themselves -> replace the old heretic stuff + +//heretic research tree is a directional graph so we can use some basic graph stuff to make internally handling it easier +GLOBAL_LIST(heretic_research_tree) + +//HKT = Heretic Knowledge Tree (Heretic Research Tree :3) these objects really only exist for a short period of time at startup and then get deleted +/datum/heretic_knowledge_tree_column + ///Route that symbolizes what path this is + var/route + ///Used to determine if this is a side path or a main path + var/abstract_parent_type = /datum/heretic_knowledge_tree_column + ///IDs od neighbours (to left and right) + var/neighbour_type_left + var/neighbour_type_right + ///Tier1 knowledge (or knowledges) + var/tier1 + ///Tier2 knowledge (or knowledges) + var/tier2 + ///Tier3 knowledge (or knowledges) + var/tier3 + ///UI background + var/ui_bgr = "node_side" + +/datum/heretic_knowledge_tree_column/main + abstract_parent_type = /datum/heretic_knowledge_tree_column/main + + ///Starting knowledge - first thing you pick + var/start + ///Grasp upgrade + var/grasp + ///Mark upgrade + var/mark + ///Unique ritual of knoweldge + var/ritual_of_knowledge + ///Path specific unique ability + var/unique_ability + ///Blade upgrade + var/blade + ///Ascension + var/ascension + +/proc/generate_heretic_research_tree() + var/list/heretic_research_tree = list() + + //Initialize the data structure + for(var/type in subtypesof(/datum/heretic_knowledge)) + heretic_research_tree[type] = list() + heretic_research_tree[type][HKT_NEXT] = list() + heretic_research_tree[type][HKT_BAN] = list() + heretic_research_tree[type][HKT_DEPTH] = 1 + heretic_research_tree[type][HKT_UI_BGR] = "node_side" + + var/datum/heretic_knowledge/knowledge = type + if(initial(knowledge.is_starting_knowledge)) + heretic_research_tree[type][HKT_ROUTE] = PATH_START + continue + + heretic_research_tree[type][HKT_ROUTE] = null + + var/list/paths = list() + for(var/type in subtypesof(/datum/heretic_knowledge_tree_column)) + var/datum/heretic_knowledge_tree_column/column_path = type + if(initial(column_path.abstract_parent_type) == column_path) + continue + + var/datum/heretic_knowledge_tree_column/column = new type() + paths[column.type] = column + + var/list/start_blacklist = list() + var/list/grasp_blacklist = list() + var/list/mark_blacklist = list() + var/list/blade_blacklist = list() + var/list/asc_blacklist = list() + + for(var/id in paths) + if(!istype(paths[id],/datum/heretic_knowledge_tree_column/main)) + continue + var/datum/heretic_knowledge_tree_column/main/column = paths[id] + + start_blacklist += column.start + grasp_blacklist += column.grasp + mark_blacklist += column.mark + blade_blacklist += column.blade + asc_blacklist += column.ascension + + heretic_research_tree[/datum/heretic_knowledge/spell/basic][HKT_NEXT] += start_blacklist + + for(var/id in paths) + var/datum/heretic_knowledge_tree_column/this_column = paths[id] + var/datum/heretic_knowledge_tree_column/neighbour_0 = paths[this_column.neighbour_type_left] + var/datum/heretic_knowledge_tree_column/neighbour_1 = paths[this_column.neighbour_type_right] + //horizontal (two way) + var/list/tier1 = this_column.tier1 + var/list/tier2 = this_column.tier2 + var/list/tier3 = this_column.tier3 + + //Tier1, 2 and 3 can technically be lists so we handle them here + if(!islist(this_column.tier1)) + tier1 = list(this_column.tier1) + + if(!islist(this_column.tier2)) + tier2 = list(this_column.tier2) + + if(!islist(this_column.tier3)) + tier3 = list(this_column.tier3) + + for(var/t1_knowledge in tier1) + heretic_research_tree[t1_knowledge][HKT_NEXT] += neighbour_0.tier1 + heretic_research_tree[t1_knowledge][HKT_NEXT] += neighbour_1.tier1 + heretic_research_tree[t1_knowledge][HKT_ROUTE] = this_column.route + heretic_research_tree[t1_knowledge][HKT_UI_BGR] = this_column.ui_bgr + heretic_research_tree[t1_knowledge][HKT_DEPTH] = 4 + + for(var/t2_knowledge in tier2) + heretic_research_tree[t2_knowledge][HKT_NEXT] += neighbour_0.tier2 + heretic_research_tree[t2_knowledge][HKT_NEXT] += neighbour_1.tier2 + heretic_research_tree[t2_knowledge][HKT_ROUTE] = this_column.route + heretic_research_tree[t2_knowledge][HKT_UI_BGR] = this_column.ui_bgr + heretic_research_tree[t2_knowledge][HKT_DEPTH] = 8 + + for(var/t3_knowledge in tier3) + heretic_research_tree[t3_knowledge][HKT_NEXT] += neighbour_0.tier3 + heretic_research_tree[t3_knowledge][HKT_NEXT] += neighbour_1.tier3 + heretic_research_tree[t3_knowledge][HKT_ROUTE] = this_column.route + heretic_research_tree[t3_knowledge][HKT_UI_BGR] = this_column.ui_bgr + heretic_research_tree[t3_knowledge][HKT_DEPTH] = 10 + + //Everything below this line is considered to be a "main path" and not a side path + //Since we are handling the heretic research tree column by column this is required + if(this_column.abstract_parent_type != /datum/heretic_knowledge_tree_column/main) + continue + + var/datum/heretic_knowledge_tree_column/main/main_column = this_column + //vertical (one way) + heretic_research_tree[/datum/heretic_knowledge/spell/basic] += main_column.start + heretic_research_tree[main_column.start][HKT_NEXT] += main_column.grasp + heretic_research_tree[main_column.grasp][HKT_NEXT] += main_column.tier1 + //t1 handling + for(var/t1_knowledge in tier1) + heretic_research_tree[t1_knowledge][HKT_NEXT] += main_column.mark + + heretic_research_tree[main_column.mark][HKT_NEXT] += main_column.ritual_of_knowledge + heretic_research_tree[main_column.ritual_of_knowledge][HKT_NEXT] += main_column.unique_ability + heretic_research_tree[main_column.unique_ability][HKT_NEXT] += main_column.tier2 + //t2 handling + for(var/t2_knowledge in tier2) + heretic_research_tree[t2_knowledge][HKT_NEXT] += main_column.blade + + heretic_research_tree[main_column.blade][HKT_NEXT] += main_column.tier3 + //t3 handling + for(var/t3_knowledge in tier3) + heretic_research_tree[t3_knowledge][HKT_NEXT] += main_column.ascension + + //blacklist + heretic_research_tree[main_column.start][HKT_BAN] += (start_blacklist - main_column.start) + (asc_blacklist - main_column.ascension) + heretic_research_tree[main_column.grasp][HKT_BAN] += (grasp_blacklist - main_column.grasp) + heretic_research_tree[main_column.mark][HKT_BAN] += (mark_blacklist - main_column.mark) + heretic_research_tree[main_column.blade][HKT_BAN] += (blade_blacklist - main_column.blade) + + //route stuff + heretic_research_tree[main_column.start][HKT_ROUTE] = main_column.route + heretic_research_tree[main_column.grasp][HKT_ROUTE] = main_column.route + heretic_research_tree[main_column.mark][HKT_ROUTE] = main_column.route + heretic_research_tree[main_column.ritual_of_knowledge][HKT_ROUTE] = main_column.route + heretic_research_tree[main_column.unique_ability][HKT_ROUTE] = main_column.route + heretic_research_tree[main_column.blade][HKT_ROUTE] = main_column.route + heretic_research_tree[main_column.ascension][HKT_ROUTE] = main_column.route + + heretic_research_tree[main_column.start][HKT_UI_BGR] = main_column.ui_bgr + heretic_research_tree[main_column.grasp][HKT_UI_BGR] = main_column.ui_bgr + heretic_research_tree[main_column.mark][HKT_UI_BGR] = main_column.ui_bgr + heretic_research_tree[main_column.ritual_of_knowledge][HKT_UI_BGR] = main_column.ui_bgr + heretic_research_tree[main_column.unique_ability][HKT_UI_BGR] = main_column.ui_bgr + heretic_research_tree[main_column.blade][HKT_UI_BGR] = main_column.ui_bgr + heretic_research_tree[main_column.ascension][HKT_UI_BGR] = main_column.ui_bgr + //depth stuff + heretic_research_tree[main_column.start][HKT_DEPTH] = 2 + heretic_research_tree[main_column.grasp][HKT_DEPTH] = 3 + heretic_research_tree[main_column.mark][HKT_DEPTH] = 5 + heretic_research_tree[main_column.ritual_of_knowledge][HKT_DEPTH] = 6 + heretic_research_tree[main_column.unique_ability][HKT_DEPTH] = 7 + heretic_research_tree[main_column.blade][HKT_DEPTH] = 9 + heretic_research_tree[main_column.ascension][HKT_DEPTH] = 11 + + //Per path bullshit goes here \/\/\/ + for(var/t2_knowledge in tier2) + heretic_research_tree[t2_knowledge][HKT_NEXT] += /datum/heretic_knowledge/reroll_targets + + // If you want to do any custom bullshit put it here \/\/\/ + heretic_research_tree[/datum/heretic_knowledge/reroll_targets][HKT_ROUTE] = PATH_SIDE + heretic_research_tree[/datum/heretic_knowledge/reroll_targets][HKT_DEPTH] = 8 + + heretic_research_tree[/datum/heretic_knowledge/rifle][HKT_NEXT] += /datum/heretic_knowledge/rifle_ammo + heretic_research_tree[/datum/heretic_knowledge/rifle_ammo][HKT_ROUTE] = PATH_SIDE + heretic_research_tree[/datum/heretic_knowledge/rifle_ammo][HKT_DEPTH] = heretic_research_tree[/datum/heretic_knowledge/rifle][HKT_DEPTH] + + //and we're done + QDEL_LIST_ASSOC_VAL(paths) + return heretic_research_tree diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index d950de44a34..61056d4210f 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -1,44 +1,32 @@ -/** - * # The path of Ash. - * - * Goes as follows: - * - * Nightwatcher's Secret - * Grasp of Ash - * Ashen Passage - * > Sidepaths: - * Scorching Shark - * Ashen Eyes - * - * Mark of Ash - * Ritual of Knowledge - * Fire Blast - * Mask of Madness - * > Sidepaths: - * Space Phase - * Curse of Paralysis - * - * Fiery Blade - * Nightwatcher's Rebirth - * > Sidepaths: - * Ashen Ritual - * Eldritch Coin - * - * Ashlord's Rite - */ + +/datum/heretic_knowledge_tree_column/main/ash + neighbour_type_left = /datum/heretic_knowledge_tree_column/cosmic_to_ash + neighbour_type_right = /datum/heretic_knowledge_tree_column/ash_to_moon + + route = PATH_ASH + ui_bgr = "node_ash" + start = /datum/heretic_knowledge/limited_amount/starting/base_ash + grasp = /datum/heretic_knowledge/ashen_grasp + tier1 = /datum/heretic_knowledge/spell/ash_passage + mark = /datum/heretic_knowledge/mark/ash_mark + ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/ash + unique_ability = /datum/heretic_knowledge/spell/fire_blast + tier2 = /datum/heretic_knowledge/mad_mask + blade = /datum/heretic_knowledge/blade_upgrade/ash + tier3 = /datum/heretic_knowledge/spell/flame_birth + ascension = /datum/heretic_knowledge/ultimate/ash_final + /datum/heretic_knowledge/limited_amount/starting/base_ash name = "Nightwatcher's Secret" desc = "Opens up the Path of Ash to you. \ Allows you to transmute a match and a knife into an Ashen Blade. \ You can only create two at a time." gain_text = "The City Guard know their watch. If you ask them at night, they may tell you about the ashy lantern." - next_knowledge = list(/datum/heretic_knowledge/ashen_grasp) required_atoms = list( /obj/item/knife = 1, /obj/item/match = 1, ) 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" @@ -47,10 +35,7 @@ desc = "Your Mansus Grasp will burn the eyes of the victim, damaging them and blurring their vision." gain_text = "The Nightwatcher was the first of them, his treason started it all. \ Their lantern, expired to ash - their watch, absent." - 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" @@ -77,15 +62,10 @@ name = "Ashen Passage" desc = "Grants you Ashen Passage, a spell that lets you phase out of reality and traverse a short distance, passing though any walls." gain_text = "He knew how to walk between the planes." - next_knowledge = list( - /datum/heretic_knowledge/mark/ash_mark, - /datum/heretic_knowledge/summon/fire_shark, - /datum/heretic_knowledge/medallion, - ) + 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" @@ -96,8 +76,6 @@ gain_text = "He was a very particular man, always watching in the dead of night. \ But in spite of his duty, he regularly tranced through the Manse with his blazing lantern held high. \ He shone brightly in the darkness, until the blaze begin to die." - next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/ash) - route = PATH_ASH mark_type = /datum/status_effect/eldritch/ash /datum/heretic_knowledge/mark/ash_mark/trigger_mark(mob/living/source, mob/living/target) @@ -112,8 +90,8 @@ grasp.build_all_button_icons() /datum/heretic_knowledge/knowledge_ritual/ash - next_knowledge = list(/datum/heretic_knowledge/spell/fire_blast) - route = PATH_ASH + + /datum/heretic_knowledge/spell/fire_blast name = "Volcano Blast" @@ -121,11 +99,8 @@ at a nearby enemy, setting them on fire and burning them. If they do not extinguish themselves, \ the beam will continue to another target." gain_text = "No fire was hot enough to rekindle them. No fire was bright enough to save them. No fire is eternal." - next_knowledge = list(/datum/heretic_knowledge/mad_mask) spell_to_add = /datum/action/cooldown/spell/charged/beam/fire_blast cost = 1 - route = PATH_ASH - depth = 7 research_tree_icon_frame = 7 @@ -135,12 +110,6 @@ The mask instills fear into heathens who witness it, causing stamina damage, hallucinations, and insanity. \ It can also be forced onto a heathen, to make them unable to take it off..." gain_text = "The Nightwatcher was lost. That's what the Watch believed. Yet he walked the world, unnoticed by the masses." - next_knowledge = list( - /datum/heretic_knowledge/blade_upgrade/ash, - /datum/heretic_knowledge/reroll_targets, - /datum/heretic_knowledge/spell/space_phase, - /datum/heretic_knowledge/curse/paralysis, - ) required_atoms = list( /obj/item/organ/liver = 1, /obj/item/melee/baton/security = 1, // Technically means a cattleprod is valid @@ -149,18 +118,16 @@ ) 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" desc = "Your blade now lights enemies ablaze on attack." gain_text = "He returned, blade in hand, he swung and swung as the ash fell from the skies. \ 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" @@ -178,15 +145,8 @@ If any victims afflicted are in critical condition, they will also instantly die." gain_text = "The fire was inescapable, and yet, life remained in his charred body. \ The Nightwatcher was a particular man, always watching." - next_knowledge = list( - /datum/heretic_knowledge/ultimate/ash_final, - /datum/heretic_knowledge/summon/ashy, - /datum/heretic_knowledge/eldritch_coin, - ) 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 @@ -201,7 +161,7 @@ gain_text = "The Watch is dead, the Nightwatcher burned with it. Yet his fire burns evermore, \ 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( diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 6cde82e8516..5cffc7bc304 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -1,48 +1,34 @@ -/** - * # The path of Blades. Stab stab. - * - * Goes as follows: - * - * The Cutting Edge - * Grasp of the Blade - * Dance of the Brand - * > Sidepaths: - * Shattered Risen - * Armorer's Ritual - * - * Mark of the Blade - * Ritual of Knowledge - * Realignment - * > Sidepaths: - * Lionhunter Rifle - * - * Stance of the Scarred Duelist - * > Sidepaths: - * Carving Knife - * Mawed Crucible - * - * Swift Blades - * Furious Steel - * > Sidepaths: - * Maid in the Mirror - * Rust Charge - * - * Maelstrom of Silver - */ + +/datum/heretic_knowledge_tree_column/main/blade + neighbour_type_left = /datum/heretic_knowledge_tree_column/void_to_blade + neighbour_type_right = /datum/heretic_knowledge_tree_column/blade_to_rust + + route = PATH_BLADE + ui_bgr = "node_blade" + + start = /datum/heretic_knowledge/limited_amount/starting/base_blade + grasp = /datum/heretic_knowledge/blade_grasp + tier1 = /datum/heretic_knowledge/blade_dance + mark = /datum/heretic_knowledge/mark/blade_mark + ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/blade + unique_ability = /datum/heretic_knowledge/spell/realignment + tier2 = /datum/heretic_knowledge/duel_stance + blade = /datum/heretic_knowledge/blade_upgrade/blade + tier3 = /datum/heretic_knowledge/spell/furious_steel + ascension = /datum/heretic_knowledge/ultimate/blade_final + /datum/heretic_knowledge/limited_amount/starting/base_blade name = "The Cutting Edge" desc = "Opens up the Path of Blades to you. \ Allows you to transmute a knife with one bar of silver or titanium to create a Sundered Blade. \ You can create up to four at a time." gain_text = "Our great ancestors forged swords and practiced sparring on the eve of great battles." - next_knowledge = list(/datum/heretic_knowledge/blade_grasp) required_atoms = list( /obj/item/knife = 1, list(/obj/item/stack/sheet/mineral/silver, /obj/item/stack/sheet/mineral/titanium) = 1, ) result_atoms = list(/obj/item/melee/sickly_blade/dark) limit = 4 // 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" @@ -51,10 +37,7 @@ desc = "Your Mansus Grasp will cause a short stun when used on someone lying down or facing away from you." gain_text = "The story of the footsoldier has been told since antiquity. It is one of blood and valor, \ and is championed by sword, steel and silver." - 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" @@ -85,14 +68,7 @@ towards your attacker. This effect can only trigger once every 20 seconds." gain_text = "The footsoldier was known to be a fearsome duelist. \ Their general quickly appointed them as their personal Champion." - next_knowledge = list( - /datum/heretic_knowledge/limited_amount/risen_corpse, - /datum/heretic_knowledge/mark/blade_mark, - /datum/heretic_knowledge/armor, - ) 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. @@ -183,8 +159,6 @@ The knife will block any attack directed towards you, but is consumed on use." gain_text = "His general wished to end the war, but the Champion knew there could be no life without death. \ He would slay the coward himself, and anyone who tried to run." - next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/blade) - route = PATH_BLADE mark_type = /datum/status_effect/eldritch/blade /datum/heretic_knowledge/mark/blade_mark/create_mark(mob/living/source, mob/living/target) @@ -202,8 +176,8 @@ source.apply_status_effect(/datum/status_effect/protective_blades, 60 SECONDS, 1, 20, 0 SECONDS) /datum/heretic_knowledge/knowledge_ritual/blade - next_knowledge = list(/datum/heretic_knowledge/spell/realignment) - route = PATH_BLADE + + /datum/heretic_knowledge/spell/realignment name = "Realignment" @@ -211,11 +185,9 @@ During this process, you will rapidly regenerate stamina and quickly recover from stuns, however, you will be unable to attack. \ This spell can be cast in rapid succession, but doing so will increase the cooldown." gain_text = "In the flurry of death, he found peace within himself. Despite insurmountable odds, he forged on." - next_knowledge = list(/datum/heretic_knowledge/duel_stance) 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 @@ -227,16 +199,7 @@ you gain increased resistance to gaining wounds and resistance to batons." gain_text = "In time, it was he who stood alone among the bodies of his former comrades, awash in blood, none of it his own. \ He was without rival, equal, or purpose." - next_knowledge = list( - /datum/heretic_knowledge/blade_upgrade/blade, - /datum/heretic_knowledge/reroll_targets, - /datum/heretic_knowledge/rune_carver, - /datum/heretic_knowledge/crucible, - /datum/heretic_knowledge/rifle, - ) 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 @@ -298,8 +261,6 @@ You are able to infuse your mansus grasp directly into your blades, and your blades are more effective against structures." gain_text = "I found him cleaved in twain, halves locked in a duel without end; \ 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? @@ -403,15 +364,8 @@ at a target, dealing damage and causing bleeding." gain_text = "Without thinking, I took the knife of a fallen soldier and threw with all my might. My aim was true! \ The Torn Champion smiled at their first taste of agony, and with a nod, their blades became my own." - next_knowledge = list( - /datum/heretic_knowledge/summon/maid_in_mirror, - /datum/heretic_knowledge/ultimate/blade_final, - /datum/heretic_knowledge/spell/rust_charge, - ) 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" @@ -424,7 +378,7 @@ Your Sundered Blades deal bonus damage and heal you on attack for a portion of the damage dealt." 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) diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index af92a55f499..6a895a7ffdf 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -1,43 +1,33 @@ -/** - * # The path of Cosmos. - * - * Goes as follows: - * - * Eternal Gate - * Grasp of Cosmos - * Cosmic Runes - * > Sidepaths: - * Priest's Ritual - * Scorching Shark - * - * Mark of Cosmos - * Ritual of Knowledge - * Star Touch - * Star Blast - * > Sidepaths: - * Curse of Corrosion - * Space Phase - * - * Cosmic Blade - * Cosmic Expansion - * > Sidepaths: - * Eldritch Coin - * - * Creators's Gift - */ + +/datum/heretic_knowledge_tree_column/main/cosmic + neighbour_type_left = /datum/heretic_knowledge_tree_column/rust_to_cosmic + neighbour_type_right = /datum/heretic_knowledge_tree_column/cosmic_to_ash + + route = PATH_COSMIC + ui_bgr = "node_cosmos" + + start = /datum/heretic_knowledge/limited_amount/starting/base_cosmic + grasp = /datum/heretic_knowledge/cosmic_grasp + tier1 = /datum/heretic_knowledge/spell/cosmic_runes + mark = /datum/heretic_knowledge/mark/cosmic_mark + ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/cosmic + unique_ability = /datum/heretic_knowledge/spell/star_touch + tier2 = /datum/heretic_knowledge/spell/star_blast + blade = /datum/heretic_knowledge/blade_upgrade/cosmic + tier3 = /datum/heretic_knowledge/spell/cosmic_expansion + ascension = /datum/heretic_knowledge/ultimate/cosmic_final + /datum/heretic_knowledge/limited_amount/starting/base_cosmic name = "Eternal Gate" desc = "Opens up the Path of Cosmos to you. \ Allows you to transmute a sheet of plasma and a knife into an Cosmic Blade. \ You can only create two at a time." gain_text = "A nebula appeared in the sky, its infernal birth shone upon me. This was the start of a great transcendence." - next_knowledge = list(/datum/heretic_knowledge/cosmic_grasp) required_atoms = list( /obj/item/knife = 1, /obj/item/stack/sheet/mineral/plasma = 1, ) 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" @@ -47,10 +37,7 @@ People with a star mark can not pass cosmic fields." gain_text = "Some stars dimmed, others' magnitude increased. \ With newfound strength I could channel the nebula's power into myself." - 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" @@ -75,15 +62,9 @@ However, people with a star mark will get transported along with another person using the rune." gain_text = "The distant stars crept into my dreams, roaring and screaming without reason. \ I spoke, and heard my own words echoed back." - next_knowledge = list( - /datum/heretic_knowledge/summon/fire_shark, - /datum/heretic_knowledge/mark/cosmic_mark, - /datum/heretic_knowledge/essence, - ) 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" @@ -93,13 +74,9 @@ They will then be paralyzed for 2 seconds." gain_text = "The Beast now whispered to me occasionally, only small tidbits of their circumstances. \ I can help them, I have to help them." - next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/cosmic) - route = PATH_COSMIC mark_type = /datum/status_effect/eldritch/cosmic /datum/heretic_knowledge/knowledge_ritual/cosmic - next_knowledge = list(/datum/heretic_knowledge/spell/star_touch) - route = PATH_COSMIC /datum/heretic_knowledge/spell/star_touch name = "Star Touch" @@ -109,28 +86,16 @@ The beam lasts a minute, until the beam is obstructed or until a new target has been found." gain_text = "After waking in a cold sweat I felt a palm on my scalp, a sigil burned onto me. \ My veins now emitted a strange purple glow, the Beast knows I will surpass its expectations." - next_knowledge = list(/datum/heretic_knowledge/spell/star_blast) 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" desc = "Fires a projectile that moves very slowly, raising a short-lived wall of cosmic fields where it goes. \ Anyone hit by the projectile will receive burn damage, a knockdown, and give people in a three tile range a star mark." gain_text = "The Beast was behind me now at all times, with each sacrifice words of affirmation coursed through me." - next_knowledge = list( - /datum/heretic_knowledge/blade_upgrade/cosmic, - /datum/heretic_knowledge/reroll_targets, - /datum/heretic_knowledge/curse/corrosion, - /datum/heretic_knowledge/summon/rusty, - /datum/heretic_knowledge/spell/space_phase, - ) 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" @@ -141,8 +106,6 @@ a cosmic trail and increase your combo timer up to ten seconds." gain_text = "The Beast took my blades in their hand, I kneeled and felt a sharp pain. \ 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. @@ -236,14 +199,8 @@ desc = "Grants you Cosmic Expansion, a spell that creates a 3x3 area of cosmic fields around you. \ Nearby beings will also receive a star mark." gain_text = "The ground now shook beneath me. The Beast inhabited me, and their voice was intoxicating." - next_knowledge = list( - /datum/heretic_knowledge/ultimate/cosmic_final, - /datum/heretic_knowledge/eldritch_coin, - ) 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" @@ -260,7 +217,7 @@ I clung on to them, they would protect me, and I would protect it. \ 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( diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 47db2970423..976ce2ae7ba 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -3,47 +3,36 @@ /// The max amount of health a voiceless dead has. #define MUTE_MAX_HEALTH 50 -/** - * # The path of Flesh. - * - * Goes as follows: - * - * Principle of Hunger - * Grasp of Flesh - * Imperfect Ritual - * > Sidepaths: - * Void Cloak - * - * Mark of Flesh - * Ritual of Knowledge - * Flesh Surgery - * Raw Ritual - * > Sidepaths: - * Blood Siphon - * Opening Blast - * - * Bleeding Steel - * Lonely Ritual - * > Sidepaths: - * Cleave - * Aptera Vulnera - * - * Priest's Final Hymn - */ +/datum/heretic_knowledge_tree_column/main/flesh + neighbour_type_left = /datum/heretic_knowledge_tree_column/lock_to_flesh + neighbour_type_right = /datum/heretic_knowledge_tree_column/flesh_to_void + + route = PATH_FLESH + ui_bgr = "node_flesh" + + start = /datum/heretic_knowledge/limited_amount/starting/base_flesh + grasp = /datum/heretic_knowledge/limited_amount/flesh_grasp + tier1 = /datum/heretic_knowledge/limited_amount/flesh_ghoul + mark = /datum/heretic_knowledge/mark/flesh_mark + ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/flesh + unique_ability = /datum/heretic_knowledge/spell/flesh_surgery + tier2 = /datum/heretic_knowledge/summon/raw_prophet + blade = /datum/heretic_knowledge/blade_upgrade/flesh + tier3 = /datum/heretic_knowledge/summon/stalker + ascension = /datum/heretic_knowledge/ultimate/flesh_final + /datum/heretic_knowledge/limited_amount/starting/base_flesh name = "Principle of Hunger" desc = "Opens up the Path of Flesh to you. \ Allows you to transmute a knife and a pool of blood into a Bloody Blade. \ You can only create three at a time." gain_text = "Hundreds of us starved, but not me... I found strength in my greed." - next_knowledge = list(/datum/heretic_knowledge/limited_amount/flesh_grasp) required_atoms = list( /obj/item/knife = 1, /obj/effect/decal/cleanable/blood = 1, ) 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" @@ -62,11 +51,11 @@ Ghouls have only 25 health and look like husks to the heathens' eyes, but can use Bloody Blades effectively. \ You can only create one at a time by this method." gain_text = "My new found desires drove me to greater and greater heights." - next_knowledge = list(/datum/heretic_knowledge/limited_amount/flesh_ghoul) + 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" @@ -131,21 +120,16 @@ Voiceless Dead are mute ghouls and only have 50 health, but can use Bloody Blades effectively. \ You can only create two at a time." gain_text = "I found notes of a dark ritual, unfinished... yet still, I pushed forward." - next_knowledge = list( - /datum/heretic_knowledge/mark/flesh_mark, - /datum/heretic_knowledge/void_cloak, - ) required_atoms = list( /mob/living/carbon/human = 1, /obj/item/food/grown/poppy = 1, ) 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) . = ..() @@ -217,13 +201,11 @@ desc = "Your Mansus Grasp now applies the Mark of Flesh. The mark is triggered from an attack with your Bloody Blade. \ When triggered, the victim begins to bleed significantly." gain_text = "That's when I saw them, the marked ones. They were out of reach. They screamed, and screamed." - next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/flesh) - route = PATH_FLESH + + mark_type = /datum/status_effect/eldritch/flesh /datum/heretic_knowledge/knowledge_ritual/flesh - next_knowledge = list(/datum/heretic_knowledge/spell/flesh_surgery) - route = PATH_FLESH /datum/heretic_knowledge/spell/flesh_surgery name = "Knitting of Flesh" @@ -232,11 +214,8 @@ This spell also allows you to heal your minions and summons, or restore failing organs to acceptable status." gain_text = "But they were not out of my reach for long. With every step, the screams grew, until at last \ I learned that they could be silenced." - next_knowledge = list(/datum/heretic_knowledge/summon/raw_prophet) 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" @@ -245,12 +224,6 @@ the ability to link minds to communicate with ease, but are very fragile and weak in combat." gain_text = "I could not continue alone. I was able to summon The Uncanny Man to help me see more. \ The screams... once constant, now silenced by their wretched appearance. Nothing was out of reach." - next_knowledge = list( - /datum/heretic_knowledge/blade_upgrade/flesh, - /datum/heretic_knowledge/reroll_targets, - /datum/heretic_knowledge/spell/blood_siphon, - /datum/heretic_knowledge/spell/opening_blast, - ) required_atoms = list( /obj/item/organ/eyes = 1, /obj/effect/decal/cleanable/blood = 1, @@ -258,17 +231,14 @@ ) mob_to_summon = /mob/living/basic/heretic_summon/raw_prophet cost = 1 - route = PATH_FLESH poll_ignore_define = POLL_IGNORE_RAW_PROPHET - depth = 8 + /datum/heretic_knowledge/blade_upgrade/flesh name = "Bleeding Steel" desc = "Your Bloody Blade now causes enemies to bleed heavily on attack." gain_text = "The Uncanny Man was not alone. They led me to the Marshal. \ 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 @@ -289,11 +259,7 @@ Stalkers can jaunt, release EMPs, shapeshift into animals or automatons, and are strong in combat." gain_text = "I was able to combine my greed and desires to summon an eldritch beast I had never seen before. \ An ever shapeshifting mass of flesh, it knew well my goals. The Marshal approved." - next_knowledge = list( - /datum/heretic_knowledge/ultimate/flesh_final, - /datum/heretic_knowledge/spell/apetra_vulnera, - /datum/heretic_knowledge/spell/cleave, - ) + required_atoms = list( /obj/item/organ/tail = 1, /obj/item/organ/stomach = 1, @@ -303,9 +269,9 @@ ) mob_to_summon = /mob/living/basic/heretic_summon/stalker cost = 1 - route = PATH_FLESH + poll_ignore_define = POLL_IGNORE_STALKER - depth = 10 + /datum/heretic_knowledge/ultimate/flesh_final name = "Priest's Final Hymn" @@ -321,7 +287,6 @@ Men of this world, hear me, for the time has come! The Marshal guides my army! \ 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) diff --git a/code/modules/antagonists/heretic/knowledge/general_side.dm b/code/modules/antagonists/heretic/knowledge/general_side.dm index 10ff108c5f8..e2f445cb8a6 100644 --- a/code/modules/antagonists/heretic/knowledge/general_side.dm +++ b/code/modules/antagonists/heretic/knowledge/general_side.dm @@ -11,8 +11,6 @@ /obj/item/clothing/under = 1, ) cost = 1 - route = PATH_SIDE - depth = 8 research_tree_icon_path = 'icons/mob/actions/actions_animal.dmi' research_tree_icon_state = "gaze" diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index 00946bea682..28e02112fd7 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -1,29 +1,22 @@ -/** - * # The path of Lock. - * - * Goes as follows: - * - * A Steward's Secret - * Grasp of Lock - * Key Keeper’s Burden - * > Sidepaths: - * Mindgate - * Concierge's Rite - * Mark Of Lock - * Ritual of Knowledge - * Burglar's Finesse - * > Sidepaths: - * Opening Blast - * Unfathomable Curio - * Unsealed arts - * - * Opening Blade - * Caretaker’s Last Refuge - * > Sidepaths: - * Apetra Vulnera - * - * Unlock the Labyrinth - */ + +/datum/heretic_knowledge_tree_column/main/lock + neighbour_type_left = /datum/heretic_knowledge_tree_column/moon_to_lock + neighbour_type_right = /datum/heretic_knowledge_tree_column/lock_to_flesh + + route = PATH_LOCK + ui_bgr = "node_lock" + + start = /datum/heretic_knowledge/limited_amount/starting/base_knock + grasp = /datum/heretic_knowledge/lock_grasp + tier1 = /datum/heretic_knowledge/key_ring + mark = /datum/heretic_knowledge/mark/lock_mark + ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/lock + unique_ability = /datum/heretic_knowledge/limited_amount/concierge_rite + tier2 = /datum/heretic_knowledge/spell/burglar_finesse + blade = /datum/heretic_knowledge/blade_upgrade/flesh/lock + tier3 = /datum/heretic_knowledge/spell/caretaker_refuge + ascension = /datum/heretic_knowledge/ultimate/lock_final + /datum/heretic_knowledge/limited_amount/starting/base_knock name = "A Steward's Secret" desc = "Opens up the Path of Lock to you. \ @@ -31,14 +24,12 @@ You can only create two at a time and they function as fast crowbars. \ In addition, they can fit into utility belts." gain_text = "The Locked Labyrinth leads to freedom. But only the trapped Stewards know the correct path." - next_knowledge = list(/datum/heretic_knowledge/lock_grasp) required_atoms = list( /obj/item/knife = 1, /obj/item/crowbar = 1, ) 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" @@ -48,10 +39,7 @@ DNA locks on mechs will be removed, and any pilot will be ejected. Works on consoles. \ Makes a distinctive knocking sound on use." gain_text = "Nothing may remain closed from my touch." - 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" @@ -112,15 +100,10 @@ /obj/item/card/id = 1, ) result_atoms = list(/obj/item/card/id/advanced/heretic) - next_knowledge = list( - /datum/heretic_knowledge/mark/lock_mark, - /datum/heretic_knowledge/spell/mind_gate, - ) 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" @@ -128,13 +111,9 @@ Attack a marked person to bar them from all passages for the duration of the mark. \ This will make it so that they have no access whatsoever, even public access doors will reject them." gain_text = "The Gatekeeper was a corrupt Steward. She hindered her fellows for her own twisted amusement." - next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/lock) - route = PATH_LOCK mark_type = /datum/status_effect/eldritch/lock /datum/heretic_knowledge/knowledge_ritual/lock - next_knowledge = list(/datum/heretic_knowledge/limited_amount/concierge_rite) - route = PATH_LOCK /datum/heretic_knowledge/limited_amount/concierge_rite // item that creates 3 max at a time heretic only barriers, probably should limit to 1 only, holy people can also pass name = "Concierge's Rite" @@ -147,36 +126,23 @@ /obj/item/multitool = 1, ) result_atoms = list(/obj/item/heretic_labyrinth_handbook) - 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" desc = "Grants you Burglar's Finesse, a single-target spell \ that puts a random item from the victims backpack into your hand." gain_text = "Consorting with Burglar spirits is frowned upon, but a Steward will always want to learn about new doors." - next_knowledge = list( - /datum/heretic_knowledge/spell/opening_blast, - /datum/heretic_knowledge/reroll_targets, - /datum/heretic_knowledge/blade_upgrade/flesh/lock, - /datum/heretic_knowledge/unfathomable_curio, - /datum/heretic_knowledge/painting, - ) + 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" desc = "Your blade has a chance to cause a weeping avulsion on attack." gain_text = "The Pilgrim-Surgeon was not an Steward. Nonetheless, its blades and sutures proved a match for their keys." - 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" @@ -192,14 +158,8 @@ While in refuge, you cannot use your hands or spells, and you are immune to slowdown. \ You are invincible but unable to harm anything. Cancelled by being hit with an anti-magic item." gain_text = "Jealously, the Guard and the Hound hunted me. But I unlocked my form, and was but a haze, untouchable." - next_knowledge = list( - /datum/heretic_knowledge/ultimate/lock_final, - /datum/heretic_knowledge/spell/apetra_vulnera, - ) - 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" @@ -215,7 +175,6 @@ My foes were the Locks and my blades were the Key! \ 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) diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index f24b8ff1e3a..2ab75e96c5a 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -1,48 +1,37 @@ -/** - * # The path of Moon. - * - * Goes as follows: - * - * Moonlight Troupe - * Grasp of Lunacy - * Smile of the moon - * > Sidepaths: - * Mind Gate - * Ashen Eyes - * - * Mark of Moon - * Ritual of Knowledge - * Lunar Parade - * Moonlight Amulet - * > Sidepaths: - * Curse of Paralasys - * Unfathomable Curio - * Unsealed Arts - * - * Moonlight blade - * Ringleaders Rise - * > Sidepaths: - * Ashen Ritual - * - * Last Act - */ + +/datum/heretic_knowledge_tree_column/main/moon + neighbour_type_left = /datum/heretic_knowledge_tree_column/ash_to_moon + neighbour_type_right = /datum/heretic_knowledge_tree_column/moon_to_lock + + route = PATH_MOON + ui_bgr = "node_moon" + + start = /datum/heretic_knowledge/limited_amount/starting/base_moon + grasp = /datum/heretic_knowledge/moon_grasp + tier1 = /datum/heretic_knowledge/spell/moon_smile + mark = /datum/heretic_knowledge/mark/moon_mark + ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/moon + unique_ability = /datum/heretic_knowledge/spell/moon_parade + tier2 = /datum/heretic_knowledge/moon_amulet + blade = /datum/heretic_knowledge/blade_upgrade/moon + tier3 = /datum/heretic_knowledge/spell/moon_ringleader + ascension = /datum/heretic_knowledge/ultimate/moon_final + /datum/heretic_knowledge/limited_amount/starting/base_moon name = "Moonlight Troupe" desc = "Opens up the Path of Moon to you. \ Allows you to transmute 2 sheets of iron and a knife into an Lunar Blade. \ You can only create two at a time." gain_text = "Under the light of the moon the laughter echoes." - next_knowledge = list(/datum/heretic_knowledge/moon_grasp) required_atoms = list( /obj/item/knife = 1, /obj/item/stack/sheet/iron = 2, ) 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) +/datum/heretic_knowledge/limited_amount/starting/base_moon/on_gain(mob/user, datum/antagonist/heretic/our_heretic) add_traits(user ,TRAIT_EMPATH, REF(src)) /datum/heretic_knowledge/moon_grasp @@ -50,10 +39,7 @@ desc = "Your Mansus Grasp will cause your victims to hallucinate everyone as lunar mass, \ and hides your identity for a short duration." gain_text = "The troupe on the side of the moon showed me truth, and I took it." - 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" @@ -83,15 +69,9 @@ desc = "Grants you Smile of the moon, a ranged spell muting, blinding, deafening and knocking down the target for a\ duration based on their sanity." gain_text = "The moon smiles upon us all and those who see its true side can bring its joy." - next_knowledge = list( - /datum/heretic_knowledge/mark/moon_mark, - /datum/heretic_knowledge/medallion, - /datum/heretic_knowledge/spell/mind_gate, - ) + 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" @@ -100,25 +80,17 @@ gain_text = "The troupe on the moon would dance all day long \ and in that dance the moon would smile upon us \ but when the night came its smile would dull forced to gaze on the earth." - next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/moon) - route = PATH_MOON mark_type = /datum/status_effect/eldritch/moon /datum/heretic_knowledge/knowledge_ritual/moon - next_knowledge = list(/datum/heretic_knowledge/spell/moon_parade) - route = PATH_MOON /datum/heretic_knowledge/spell/moon_parade name = "Lunar Parade" desc = "Grants you Lunar Parade, a spell that - after a short charge - sends a carnival forward \ when hitting someone they are forced to join the parade and suffer hallucinations." gain_text = "The music like a reflection of the soul compelled them, like moths to a flame they followed" - next_knowledge = list(/datum/heretic_knowledge/moon_amulet) spell_to_add = /datum/action/cooldown/spell/pointed/projectile/moon_parade cost = 1 - route = PATH_MOON - depth = 7 - /datum/heretic_knowledge/moon_amulet name = "Moonlight Amulet" @@ -126,13 +98,7 @@ If the item is used on someone with low sanity they go berserk attacking everyone, \ if their sanity isn't low enough it decreases their mood." gain_text = "At the head of the parade he stood, the moon condensed into one mass, a reflection of the soul." - next_knowledge = list( - /datum/heretic_knowledge/blade_upgrade/moon, - /datum/heretic_knowledge/reroll_targets, - /datum/heretic_knowledge/unfathomable_curio, - /datum/heretic_knowledge/curse/paralysis, - /datum/heretic_knowledge/painting, - ) + required_atoms = list( /obj/item/organ/heart = 1, /obj/item/stack/sheet/glass = 2, @@ -140,8 +106,8 @@ ) 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 @@ -150,8 +116,8 @@ name = "Moonlight Blade" desc = "Your blade now deals brain damage, causes random hallucinations and does sanity damage." 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" @@ -177,14 +143,11 @@ If their sanity is low enough this turns them insane, the spell then halves their sanity." gain_text = "I grabbed his hand and we rose, those who saw the truth rose with us. \ The ringleader pointed up and the dim light of truth illuminated us further." - next_knowledge = list( - /datum/heretic_knowledge/ultimate/moon_final, - /datum/heretic_knowledge/summon/ashy, - ) + 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 @@ -197,7 +160,7 @@ gain_text = "We dived down towards the crowd, his soul splitting off in search of greater venture \ 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) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index 9d45e8bb55b..a2f0a91e69a 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -1,47 +1,33 @@ -/** - * # The path of Rust. - * - * Goes as follows: - * - * Blacksmith's Tale - * Grasp of Rust - * Leeching Walk - * > Sidepaths: - * Priest's Ritual - * Armorer's Ritual - * - * Mark of Rust - * Ritual of Knowledge - * Rust Construction - * > Sidepaths: - * Lionhunter Rifle - * - * Aggressive Spread - * > Sidepaths: - * Curse of Corrosion - * Mawed Crucible - * - * Toxic Blade - * Entropic Plume - * > Sidepaths: - * Rusted Ritual - * Rust Charge - * - * Rustbringer's Oath - */ + +/datum/heretic_knowledge_tree_column/main/rust + neighbour_type_left = /datum/heretic_knowledge_tree_column/blade_to_rust + neighbour_type_right = /datum/heretic_knowledge_tree_column/rust_to_cosmic + + route = PATH_RUST + ui_bgr = "node_rust" + + start = /datum/heretic_knowledge/limited_amount/starting/base_rust + grasp = /datum/heretic_knowledge/rust_fist + tier1 = /datum/heretic_knowledge/rust_regen + mark = /datum/heretic_knowledge/mark/rust_mark + ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/rust + unique_ability = /datum/heretic_knowledge/spell/rust_construction + tier2 = /datum/heretic_knowledge/spell/area_conversion + blade = /datum/heretic_knowledge/blade_upgrade/rust + tier3 = /datum/heretic_knowledge/spell/entropic_plume + ascension = /datum/heretic_knowledge/ultimate/rust_final + /datum/heretic_knowledge/limited_amount/starting/base_rust name = "Blacksmith's Tale" desc = "Opens up the Path of Rust to you. \ Allows you to transmute a knife with any trash item into a Rusty Blade. \ You can only create two at a time." gain_text = "\"Let me tell you a story\", said the Blacksmith, as he gazed deep into his rusty blade." - next_knowledge = list(/datum/heretic_knowledge/rust_fist) required_atoms = list( /obj/item/knife = 1, /obj/item/trash = 1, ) 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" @@ -51,10 +37,7 @@ Already rusted surfaces are destroyed. Surfaces and structures can only be rusted by using Right-Click. \ Allows you to rust basic iron walls and floors." gain_text = "On the ceiling of the Mansus, rust grows as moss does on a stone." - 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" @@ -90,17 +73,10 @@ name = "Leeching Walk" desc = "Grants you passive healing and resistance to batons while standing over rust." gain_text = "The speed was unparalleled, the strength unnatural. The Blacksmith was smiling." - next_knowledge = list( - /datum/heretic_knowledge/mark/rust_mark, - /datum/heretic_knowledge/armor, - /datum/heretic_knowledge/essence, - /datum/heretic_knowledge/entropy_pulse, - ) 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) user.AddElement(/datum/element/leeching_walk) @@ -114,8 +90,6 @@ When triggered, your victim will suffer heavy disgust and confusion. \ Allows you to rust reinforced walls and floors as well as plasteel." gain_text = "The Blacksmith looks away. To a place lost long ago. \"Rusted Hills help those in dire need... at a cost.\"" - next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/rust) - route = PATH_RUST mark_type = /datum/status_effect/eldritch/rust /datum/heretic_knowledge/mark/rust_mark/on_gain(mob/user, datum/antagonist/heretic/our_heretic) @@ -123,8 +97,6 @@ our_heretic.increase_rust_strength() /datum/heretic_knowledge/knowledge_ritual/rust - next_knowledge = list(/datum/heretic_knowledge/spell/rust_construction) - route = PATH_RUST /datum/heretic_knowledge/spell/rust_construction name = "Rust Construction" @@ -132,29 +104,16 @@ Anyone overtop the wall will be throw aside (or upwards) and sustain damage." gain_text = "Images of foreign and ominous structures began to dance in my mind. Covered head to toe in thick rust, \ they no longer looked man made. Or perhaps they never were in the first place." - next_knowledge = list(/datum/heretic_knowledge/spell/area_conversion) 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" desc = "Grants you Aggressive Spread, a spell that spreads rust to nearby surfaces. \ Already rusted surfaces are destroyed \ Also improves the rusting abilities of non rust-heretics." gain_text = "All wise men know well not to visit the Rusted Hills... Yet the Blacksmith's tale was inspiring." - next_knowledge = list( - /datum/heretic_knowledge/blade_upgrade/rust, - /datum/heretic_knowledge/reroll_targets, - /datum/heretic_knowledge/curse/corrosion, - /datum/heretic_knowledge/summon/rusty, - /datum/heretic_knowledge/crucible, - /datum/heretic_knowledge/rifle, - ) 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) @@ -166,8 +125,6 @@ desc = "Your Rusty Blade now disgusts enemies on attack \ Allows you to rust Titanium and Plastitanium.." gain_text = "The Blacksmith hands you their blade. \"The Blade will guide you through the flesh, should you let it.\" \ 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" @@ -189,14 +146,11 @@ at friend or foe wildly. Also rusts and destroys and surfaces it hits and improves the rusting abilities of non-rust heretics." gain_text = "The corrosion was unstoppable. The rust was unpleasable. \ The Blacksmith was gone, and you hold their blade. Champions of hope, the Rustbringer is nigh!" - next_knowledge = list( - /datum/heretic_knowledge/ultimate/rust_final, - /datum/heretic_knowledge/spell/rust_charge, - ) + 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) . = ..() @@ -212,7 +166,7 @@ and becoming immune to many effects and dangers \ You will be able to rust almost anything upon ascending." 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 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 3a5e84e75bc..1031b9bf3c7 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -15,7 +15,7 @@ required_atoms = list(/mob/living/carbon/human = 1) cost = 0 priority = MAX_KNOWLEDGE_PRIORITY // Should be at the top - route = PATH_START + is_starting_knowledge = TRUE research_tree_icon_path = 'icons/effects/eldritch.dmi' research_tree_icon_state = "eye_close" research_tree_icon_frame = 1 diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm index 90a51dcccb0..b4470f9c7fb 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm @@ -1,13 +1,20 @@ +/datum/heretic_knowledge_tree_column/ash_to_moon + neighbour_type_left = /datum/heretic_knowledge_tree_column/main/ash + neighbour_type_right = /datum/heretic_knowledge_tree_column/main/moon + + route = PATH_SIDE + + tier1 = /datum/heretic_knowledge/medallion + tier2 = /datum/heretic_knowledge/curse/paralysis + tier3 = /datum/heretic_knowledge/summon/ashy + // Sidepaths for knowledge between Ash and Flesh. /datum/heretic_knowledge/medallion name = "Ashen Eyes" desc = "Allows you to transmute a pair of eyes, a candle, and a glass shard into an Eldritch Medallion. \ The Eldritch Medallion grants you thermal vision while worn, and also functions as a focus." gain_text = "Piercing eyes guided them through the mundane. Neither darkness nor terror could stop them." - next_knowledge = list( - /datum/heretic_knowledge/spell/ash_passage, - /datum/heretic_knowledge/spell/moon_smile, - ) + required_atoms = list( /obj/item/organ/eyes = 1, /obj/item/shard = 1, @@ -15,10 +22,8 @@ ) 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" @@ -26,10 +31,7 @@ While cursed, the victim will be unable to walk. You can additionally supply an item that a victim has touched \ or is covered in the victim's blood to make the curse last longer." gain_text = "The flesh of humanity is weak. Make them bleed. Show them their fragility." - next_knowledge = list( - /datum/heretic_knowledge/mad_mask, - /datum/heretic_knowledge/moon_amulet, - ) + required_atoms = list( /obj/item/bodypart/leg/left = 1, /obj/item/bodypart/leg/right = 1, @@ -39,10 +41,10 @@ duration_modifier = 2 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? @@ -68,10 +70,7 @@ Ash Spirits have a short range jaunt and the ability to cause bleeding in foes at range. \ They also have the ability to create a ring of fire around themselves for a length of time." gain_text = "I combined my principle of hunger with my desire for destruction. The Marshal knew my name, and the Nightwatcher gazed on." - next_knowledge = list( - /datum/heretic_knowledge/spell/flame_birth, - /datum/heretic_knowledge/spell/moon_ringleader, - ) + required_atoms = list( /obj/effect/decal/cleanable/ash = 1, /obj/item/bodypart/head = 1, @@ -79,6 +78,6 @@ ) mob_to_summon = /mob/living/basic/heretic_summon/ash_spirit cost = 1 - route = PATH_SIDE + poll_ignore_define = POLL_IGNORE_ASH_SPIRIT - depth = 10 + diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index 8a1fe6b5a87..05b414fe346 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -1,3 +1,13 @@ +/datum/heretic_knowledge_tree_column/blade_to_rust + neighbour_type_left = /datum/heretic_knowledge_tree_column/main/blade + neighbour_type_right = /datum/heretic_knowledge_tree_column/main/rust + + route = PATH_SIDE + + tier1 = /datum/heretic_knowledge/armor + tier2 = list(/datum/heretic_knowledge/crucible, /datum/heretic_knowledge/rifle) + tier3 = /datum/heretic_knowledge/spell/rust_charge + // Sidepaths for knowledge between Rust and Blade. /datum/heretic_knowledge/armor name = "Armorer's Ritual" @@ -5,21 +15,18 @@ Eldritch Armor provides great protection while also acting as a focus when hooded." gain_text = "The Rusted Hills welcomed the Blacksmith in their generosity. And the Blacksmith \ returned their generosity in kind." - next_knowledge = list( - /datum/heretic_knowledge/rust_regen, - /datum/heretic_knowledge/blade_dance, - ) + required_atoms = list( /obj/structure/table = 1, /obj/item/clothing/mask/gas = 1, ) 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" @@ -27,20 +34,17 @@ The Mawed Crucible can brew powerful potions for combat and utility, but must be fed bodyparts and organs between uses." gain_text = "This is pure agony. I wasn't able to summon the figure of the Aristocrat, \ but with the Priest's attention I stumbled upon a different recipe..." - next_knowledge = list( - /datum/heretic_knowledge/duel_stance, - /datum/heretic_knowledge/spell/area_conversion, - ) + required_atoms = list( /obj/structure/reagent_dispensers/watertank = 1, /obj/structure/table = 1, ) 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" @@ -52,11 +56,7 @@ causing the shot to mark your victim with your grasp and teleport you directly to them." gain_text = "I met an old man in an antique shop who wielded a very unusual weapon. \ I could not purchase it at the time, but they showed me how they made it ages ago." - next_knowledge = list( - /datum/heretic_knowledge/duel_stance, - /datum/heretic_knowledge/spell/area_conversion, - /datum/heretic_knowledge/rifle_ammo, - ) + required_atoms = list( /obj/item/stack/sheet/mineral/wood = 1, /obj/item/stack/sheet/animalhide = 1, @@ -64,8 +64,8 @@ ) 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" @@ -81,10 +81,10 @@ ) 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, @@ -111,11 +111,8 @@ name = "Rust Charge" desc = "A charge that must be started on a rusted tile and will destroy any rusted objects you come into contact with, will deal high damage to others and rust around you during the charge." gain_text = "The hills sparkled now, as I neared them my mind began to wander. I quickly regained my resolve and pushed forward, this last leg would be the most treacherous." - next_knowledge = list( - /datum/heretic_knowledge/spell/furious_steel, - /datum/heretic_knowledge/spell/entropic_plume, - ) + 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 7b7bdddb19a..03b4fc477ad 100644 --- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm +++ b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm @@ -1,3 +1,14 @@ +/datum/heretic_knowledge_tree_column/cosmic_to_ash + neighbour_type_left = /datum/heretic_knowledge_tree_column/main/cosmic + neighbour_type_right = /datum/heretic_knowledge_tree_column/main/ash + + route = PATH_SIDE + + tier1 = /datum/heretic_knowledge/summon/fire_shark + tier2 = /datum/heretic_knowledge/spell/space_phase + tier3 = /datum/heretic_knowledge/eldritch_coin + + // Sidepaths for knowledge between Cosmos and Ash. /datum/heretic_knowledge/summon/fire_shark @@ -6,10 +17,7 @@ Fire Sharks are fast and strong in groups, but die quickly. They are also highly resistant against fire attacks. \ Fire Sharks inject phlogiston into its victims and spawn plasma once they die." gain_text = "The cradle of the nebula was cold, but not dead. Light and heat flits even through the deepest darkness, and is hunted by its own predators." - next_knowledge = list( - /datum/heretic_knowledge/spell/cosmic_runes, - /datum/heretic_knowledge/spell/ash_passage, - ) + required_atoms = list( /obj/effect/decal/cleanable/ash = 1, /obj/item/organ/liver = 1, @@ -17,9 +25,9 @@ ) mob_to_summon = /mob/living/basic/heretic_summon/fire_shark 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 @@ -27,14 +35,11 @@ desc = "Grants you Space Phase, a spell that allows you to move freely through space. \ You can only phase in and out when you are on a space or misc turf." gain_text = "You feel like your body can move through space as if you where dust." - next_knowledge = list( - /datum/heretic_knowledge/spell/star_blast, - /datum/heretic_knowledge/mad_mask, - ) + 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 @@ -44,17 +49,14 @@ when landing on tails. If you insert the coin into an airlock, it will be consumed \ to fry its electronics, opening the airlock permanently unless bolted. " gain_text = "The Mansus is a place of all sorts of sins. But greed held a special role." - next_knowledge = list( - /datum/heretic_knowledge/spell/cosmic_expansion, - /datum/heretic_knowledge/spell/flame_birth, - ) + required_atoms = list( /obj/item/stack/sheet/mineral/diamond = 1, /obj/item/stack/sheet/mineral/plasma = 1, ) 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 d54646fe103..7891b50aabc 100644 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm @@ -1,3 +1,13 @@ +/datum/heretic_knowledge_tree_column/flesh_to_void + neighbour_type_left = /datum/heretic_knowledge_tree_column/main/flesh + neighbour_type_right = /datum/heretic_knowledge_tree_column/main/void + + route = PATH_SIDE + + tier1 = /datum/heretic_knowledge/void_cloak + tier2 = /datum/heretic_knowledge/spell/blood_siphon + tier3 = list(/datum/heretic_knowledge/spell/void_prison, /datum/heretic_knowledge/spell/cleave) + // Sidepaths for knowledge between Flesh and Void. /datum/heretic_knowledge/void_cloak @@ -7,10 +17,7 @@ and while the hood is up, the cloak is completely invisible. It also provide decent armor and \ has pockets which can hold one of your blades, various ritual components (such as organs), and small heretical trinkets." gain_text = "The Owl is the keeper of things that are not quite in practice, but in theory are. Many things are." - next_knowledge = list( - /datum/heretic_knowledge/limited_amount/flesh_ghoul, - /datum/heretic_knowledge/cold_snap, - ) + required_atoms = list( /obj/item/shard = 1, /obj/item/clothing/suit = 1, @@ -18,24 +25,18 @@ ) 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" desc = "Grants you Blood Siphon, a spell that drains a victim of blood and health, transferring it to you. \ Also has a chance to transfer wounds from you to the victim." gain_text = "\"No matter the man, we bleed all the same.\" That's what the Marshal told me." - next_knowledge = list( - /datum/heretic_knowledge/spell/void_phase, - /datum/heretic_knowledge/summon/raw_prophet, - ) + spell_to_add = /datum/action/cooldown/spell/pointed/blood_siphon cost = 1 - route = PATH_SIDE - depth = 8 /datum/heretic_knowledge/spell/void_prison name = "Void Prison" @@ -45,14 +46,9 @@ I try to yell, grab hold of this fool and tell them to run. \ But the only welts made are on my own beating fist. \ My smiling face turns to regard me, reflecting back in glassy eyes the empty path I have been lead down." - next_knowledge = list( - /datum/heretic_knowledge/spell/void_phase, - /datum/heretic_knowledge/summon/raw_prophet, - ) + spell_to_add = /datum/action/cooldown/spell/pointed/void_prison cost = 1 - route = PATH_SIDE - depth = 8 /datum/heretic_knowledge/spell/cleave name = "Blood Cleave" @@ -60,11 +56,8 @@ that causes heavy bleeding and blood loss to anyone afflicted." gain_text = "At first I didn't understand these instruments of war, but the Priest \ told me to use them regardless. Soon, he said, I would know them well." - next_knowledge = list( - /datum/heretic_knowledge/summon/stalker, - /datum/heretic_knowledge/spell/void_pull, - ) + 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 706b83abac7..aa85f31d006 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm @@ -1,3 +1,19 @@ +/datum/heretic_knowledge_tree_column/lock_to_flesh + neighbour_type_left = /datum/heretic_knowledge_tree_column/main/lock + neighbour_type_right = /datum/heretic_knowledge_tree_column/main/flesh + + route = PATH_SIDE + + tier1 = /datum/heretic_knowledge/dummy_lock_to_flesh + tier2 = /datum/heretic_knowledge/spell/opening_blast + tier3 = /datum/heretic_knowledge/spell/apetra_vulnera + +/datum/heretic_knowledge/dummy_lock_to_flesh + name = "Flesh and Lock ways" + desc = "Research this to gain access to the other path" + gain_text = "There are ways from feasting to wounding, the power of birth is close to the power of opening." + cost = 1 + // Sidepaths for knowledge between Knock and Flesh. /datum/heretic_knowledge/spell/opening_blast name = "Wave Of Desperation" @@ -5,14 +21,9 @@ It removes your restraints, repels and knocks down adjacent people, and applies the Mansus Grasp to everything nearby. \ However, you will fall unconscious a short time after casting this spell." gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power." - next_knowledge = list( - /datum/heretic_knowledge/summon/raw_prophet, - /datum/heretic_knowledge/spell/burglar_finesse, - ) + 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" @@ -20,11 +31,8 @@ which causes heavy bleeding on all bodyparts of the victim that have more than 15 brute damage. \ Wounds a random limb if no limb is sufficiently damaged." gain_text = "Flesh opens, and blood spills. My master seeks sacrifice, and I shall appease." - next_knowledge = list( - /datum/heretic_knowledge/summon/stalker, - /datum/heretic_knowledge/spell/caretaker_refuge, - ) + 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 cb719d163d5..f8a3cdf465b 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm @@ -1,19 +1,32 @@ +/datum/heretic_knowledge_tree_column/moon_to_lock + neighbour_type_left = /datum/heretic_knowledge_tree_column/main/moon + neighbour_type_right = /datum/heretic_knowledge_tree_column/main/lock + + route = PATH_SIDE + + tier1 = /datum/heretic_knowledge/spell/mind_gate + tier2 = list(/datum/heretic_knowledge/unfathomable_curio, /datum/heretic_knowledge/painting) + tier3 = /datum/heretic_knowledge/dummy_moon_to_lock + // Sidepaths for knowledge between Knock and Moon. +/datum/heretic_knowledge/dummy_moon_to_lock + name = "Lock and Moon ways" + desc = "Research this to gain access to the other path" + gain_text = "The powers of Madness are like a wound in one's soul, and every wound can be opened and closed." + cost = 1 + + + /datum/heretic_knowledge/spell/mind_gate name = "Mind Gate" desc = "Grants you Mind Gate, a spell which inflicts hallucinations, \ confusion, oxygen loss and brain damage to its target over 10 seconds.\ The caster takes 20 brain damage per use." gain_text = "My mind swings open like a gate, and its insight will let me perceive the truth." - next_knowledge = list( - /datum/heretic_knowledge/key_ring, - /datum/heretic_knowledge/spell/moon_smile, - ) + 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" @@ -22,10 +35,7 @@ veil you, allowing you to take 5 hits without suffering damage, this veil will recharge very slowly \ outside of combat." gain_text = "The mansus holds many a curio, some are not meant for the mortal eye." - next_knowledge = list( - /datum/heretic_knowledge/spell/burglar_finesse, - /datum/heretic_knowledge/moon_amulet, - ) + required_atoms = list( /obj/item/organ/lungs = 1, /obj/item/stack/rods = 3, @@ -33,10 +43,10 @@ ) 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" @@ -49,17 +59,14 @@ Master of the Rusted Mountain: Requires a piece of Trash. Curses non-heretics to rust the floor they walk on." gain_text = "A wind of inspiration blows through me. Beyond the veil and past the gate great works exist, yet to be painted. \ They yearn for mortal eyes, so I shall give them an audience." - next_knowledge = list( - /datum/heretic_knowledge/spell/burglar_finesse, - /datum/heretic_knowledge/moon_amulet, - ) + required_atoms = list(/obj/item/canvas = 1) 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/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 d4e5d465125..953590124f6 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm @@ -1,3 +1,14 @@ +/datum/heretic_knowledge_tree_column/rust_to_cosmic + neighbour_type_left = /datum/heretic_knowledge_tree_column/main/rust + neighbour_type_right = /datum/heretic_knowledge_tree_column/main/cosmic + + route = PATH_SIDE + + tier1 = /datum/heretic_knowledge/essence + tier2 = list(/datum/heretic_knowledge/curse/corrosion, /datum/heretic_knowledge/entropy_pulse) + tier3 = /datum/heretic_knowledge/summon/rusty + + // Sidepaths for knowledge between Rust and Cosmos. /datum/heretic_knowledge/essence @@ -6,18 +17,15 @@ Eldritch water can be consumed for potent healing, or given to heathens for deadly poisoning." gain_text = "This is an old recipe. The Owl whispered it to me. \ Created by the Priest - the Liquid that both was and is not." - next_knowledge = list( - /datum/heretic_knowledge/rust_regen, - /datum/heretic_knowledge/spell/cosmic_runes, - ) + required_atoms = list( /obj/structure/reagent_dispensers/watertank = 1, /obj/item/shard = 1, ) 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" @@ -30,11 +38,11 @@ /obj/item/trash = 1, ) 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) @@ -53,10 +61,7 @@ While cursed, the victim will repeatedly vomit while their organs will take constant damage. You can additionally supply an item \ that a victim has touched or is covered in the victim's blood to make the curse last longer." gain_text = "The body of humanity is temporary. Their weaknesses cannot be stopped, like iron falling to rust. Show them all." - next_knowledge = list( - /datum/heretic_knowledge/spell/area_conversion, - /datum/heretic_knowledge/spell/star_blast, - ) + required_atoms = list( /obj/item/wirecutters = 1, /obj/effect/decal/cleanable/vomit = 1, @@ -66,10 +71,10 @@ duration_modifier = 4 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...")) @@ -89,10 +94,7 @@ desc = "Allows you to transmute a pool of vomit, some cable coil, and 10 sheets of iron into a Rust Walker. \ Rust Walkers excel at spreading rust and are moderately strong in combat." gain_text = "I combined my knowledge of creation with my desire for corruption. The Marshal knew my name, and the Rusted Hills echoed out." - next_knowledge = list( - /datum/heretic_knowledge/spell/area_conversion, - /datum/heretic_knowledge/spell/star_blast, - ) + required_atoms = list( /obj/effect/decal/cleanable/vomit = 1, /obj/item/stack/sheet/iron = 10, @@ -100,7 +102,7 @@ ) mob_to_summon = /mob/living/basic/heretic_summon/rust_walker cost = 1 - route = PATH_SIDE - poll_ignore_define = POLL_IGNORE_RUST_SPIRIT - depth = 8 + + poll_ignore_define = POLL_IGNORE_RUST_SPIRIT + diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index 17eb87affba..664db996926 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -1,5 +1,17 @@ // Sidepaths for knowledge between Void and Blade. +/datum/heretic_knowledge_tree_column/void_to_blade + neighbour_type_left = /datum/heretic_knowledge_tree_column/main/void + neighbour_type_right = /datum/heretic_knowledge_tree_column/main/blade + + route = PATH_SIDE + + tier1 = /datum/heretic_knowledge/limited_amount/risen_corpse + tier2 = /datum/heretic_knowledge/rune_carver + tier3 = /datum/heretic_knowledge/summon/maid_in_mirror + + + /// The max health given to Shattered Risen #define RISEN_MAX_HEALTH 125 @@ -12,20 +24,17 @@ gain_text = "I witnessed a cold, rending force drag this corpse back to near-life. \ When it moves, it crunches like broken glass. Its hands are no longer recognizable as human - \ each clenched fist contains a brutal nest of sharp bone-shards instead." - next_knowledge = list( - /datum/heretic_knowledge/cold_snap, - /datum/heretic_knowledge/blade_dance, - ) + required_atoms = list( /obj/item/clothing/suit = 1, /obj/item/clothing/gloves/latex = 1, ) 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) . = ..() @@ -130,10 +139,7 @@ Also makes for a handy throwing weapon." gain_text = "Etched, carved... eternal. There is power hidden in everything. I can unveil it! \ I can carve the monolith to reveal the chains!" - next_knowledge = list( - /datum/heretic_knowledge/spell/void_phase, - /datum/heretic_knowledge/duel_stance, - ) + required_atoms = list( /obj/item/knife = 1, /obj/item/shard = 1, @@ -141,8 +147,8 @@ ) 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" @@ -154,10 +160,7 @@ However, they are weak to mortal gaze and take damage by being examined." gain_text = "Within each reflection, lies a gateway into an unimaginable world of colors never seen and \ people never met. The ascent is glass, and the walls are knives. Each step is blood, if you do not have a guide." - next_knowledge = list( - /datum/heretic_knowledge/spell/void_pull, - /datum/heretic_knowledge/spell/furious_steel, - ) + required_atoms = list( /obj/item/stack/sheet/mineral/titanium = 5, /obj/item/clothing/suit/armor = 1, @@ -165,7 +168,7 @@ /obj/item/organ/lungs = 1, ) cost = 1 - 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 a4560058db8..d6c9d1bc216 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -1,6 +1,6 @@ // Heretic starting knowledge. -/// Global list of all heretic knowledge that have route = PATH_START. List of PATHS. +/// Global list of all heretic knowledge that have is_starting_knowledge = TRUE. List of PATHS. GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) /** @@ -10,7 +10,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) /proc/initialize_starting_knowledge() . = list() for(var/datum/heretic_knowledge/knowledge as anything in subtypesof(/datum/heretic_knowledge)) - if(initial(knowledge.route) == PATH_START) + if(initial(knowledge.is_starting_knowledge) == TRUE) . += knowledge /* @@ -23,11 +23,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) disabling spell that can be cast regardless of having a focus." spell_to_add = /datum/action/cooldown/spell/touch/mansus_grasp cost = 0 - route = PATH_START - -/datum/heretic_knowledge/spell/basic/New() - . = ..() - next_knowledge = subtypesof(/datum/heretic_knowledge/limited_amount/starting) + is_starting_knowledge = TRUE /** * The Living Heart heretic knowledge. @@ -47,7 +43,7 @@ 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 + is_starting_knowledge = TRUE research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' research_tree_icon_state = "living_heart" research_tree_icon_frame = 1 @@ -207,7 +203,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) result_atoms = list(/obj/item/clothing/neck/heretic_focus) cost = 0 priority = MAX_KNOWLEDGE_PRIORITY - 2 // Not as important as making a heart or sacrificing, but important enough. - route = PATH_START + is_starting_knowledge = TRUE research_tree_icon_path = 'icons/obj/clothing/neck.dmi' research_tree_icon_state = "eldritch_necklace" @@ -217,7 +213,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) for three minutes, assisting you in keeping secrecy. Requires a focus to cast." spell_to_add = /datum/action/cooldown/spell/shadow_cloak cost = 0 - route = PATH_START + is_starting_knowledge = TRUE /** * Codex Cicatrixi is available at the start: @@ -241,7 +237,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) banned_atom_types = list(/obj/item/pen) result_atoms = list(/obj/item/codex_cicatrix) cost = 1 - route = PATH_START + is_starting_knowledge = TRUE 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' @@ -306,7 +302,7 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) 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 + is_starting_knowledge = TRUE required_atoms = list() research_tree_icon_path = 'icons/mob/actions/actions_animal.dmi' research_tree_icon_state = "god_transmit" diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 04612a506f3..fb4bc579247 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -1,32 +1,22 @@ -/** - * # The path of VOID. - * - * Goes as follows: - * - * Glimmer of Winter - * Grasp of Void - * Aristocrat's Way - * > Sidepaths: - * Void Cloak - * Shattered Ritual - * - * Mark of Void - * Ritual of Knowledge - * Void Conduit - * Void Phase - * > Sidepaths: - * Void Stasis - * Carving Knife - * Blood Siphon - * - * Seeking blade - * Void Pull - * > Sidepaths: - * Cleave - * Maid in the Mirror - * - * Waltz at the End of Time - */ + +/datum/heretic_knowledge_tree_column/main/void + neighbour_type_left = /datum/heretic_knowledge_tree_column/flesh_to_void + neighbour_type_right = /datum/heretic_knowledge_tree_column/void_to_blade + + route = PATH_VOID + ui_bgr = "node_void" + + start = /datum/heretic_knowledge/limited_amount/starting/base_void + grasp = /datum/heretic_knowledge/void_grasp + tier1 = /datum/heretic_knowledge/cold_snap + mark = /datum/heretic_knowledge/mark/void_mark + ritual_of_knowledge = /datum/heretic_knowledge/knowledge_ritual/void + unique_ability = /datum/heretic_knowledge/spell/void_conduit + tier2 = /datum/heretic_knowledge/spell/void_phase + blade = /datum/heretic_knowledge/blade_upgrade/void + tier3 = /datum/heretic_knowledge/spell/void_pull + ascension = /datum/heretic_knowledge/ultimate/void_final + /datum/heretic_knowledge/limited_amount/starting/base_void name = "Glimmer of Winter" desc = "Opens up the Path of Void to you. \ @@ -34,10 +24,8 @@ You can only create two at a time." gain_text = "I feel a shimmer in the air, the air around me gets colder. \ I start to realize the emptiness of existence. Something's watching me." - next_knowledge = list(/datum/heretic_knowledge/void_grasp) 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" @@ -58,10 +46,7 @@ desc = "Your Mansus Grasp will temporarily mute and chill the victim." gain_text = "I saw the cold watcher who observes me. The chill mounts within me. \ They are quiet. This isn't the end of the mystery." - 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" @@ -87,16 +72,10 @@ You can still take damage due to a lack of pressure." gain_text = "I found a thread of cold breath. It lead me to a strange shrine, all made of crystals. \ Translucent and white, a depiction of a nobleman stood before me." - next_knowledge = list( - /datum/heretic_knowledge/mark/void_mark, - /datum/heretic_knowledge/void_cloak, - /datum/heretic_knowledge/limited_amount/risen_corpse, - ) cost = 1 - route = PATH_VOID research_tree_icon_path = 'icons/effects/effects.dmi' research_tree_icon_state = "the_freezer" - depth = 4 + /// Traits we apply to become immune to the environment var/static/list/gain_traits = list(TRAIT_NO_SLIP_ICE, TRAIT_NO_SLIP_SLIDE) @@ -127,13 +106,9 @@ When triggered, further silences the victim and swiftly lowers the temperature of their body and the air around them." gain_text = "A gust of wind? A shimmer in the air? The presence is overwhelming, \ my senses began to betray me. My mind is my own enemy." - next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/void) - route = PATH_VOID mark_type = /datum/status_effect/eldritch/void /datum/heretic_knowledge/knowledge_ritual/void - next_knowledge = list(/datum/heretic_knowledge/spell/void_conduit) - route = PATH_VOID /datum/heretic_knowledge/spell/void_conduit name = "Void Conduit" @@ -141,11 +116,8 @@ gain_text = "The hum in the still, cold air turns to a cacophonous rattle. \ Over the noise, there is no distinction to the clattering of window panes and the yawning knowledge that ricochets through my skull. \ The doors won't close. I can't keep the cold out now." - next_knowledge = list(/datum/heretic_knowledge/spell/void_phase) spell_to_add = /datum/action/cooldown/spell/conjure/void_conduit cost = 1 - route = PATH_VOID - depth = 7 /datum/heretic_knowledge/spell/void_phase name = "Void Phase" @@ -153,25 +125,16 @@ Additionally causes damage to heathens around your original and target destination." gain_text = "The entity calls themself the Aristocrat. They effortlessly walk through air like \ nothing - leaving a harsh, cold breeze in their wake. They disappear, and I am left in the blizzard." - next_knowledge = list( - /datum/heretic_knowledge/blade_upgrade/void, - /datum/heretic_knowledge/reroll_targets, - /datum/heretic_knowledge/spell/blood_siphon, - /datum/heretic_knowledge/spell/void_prison, - /datum/heretic_knowledge/rune_carver, - ) 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" desc = "Your blade now freezes enemies. Additionally, you can now attack distant marked targets with your Void Blade, teleporting directly next to them." 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" @@ -198,15 +161,11 @@ desc = "Grants you Void Pull, a spell that pulls all nearby heathens towards you, stunning them briefly." gain_text = "All is fleeting, but what else stays? I'm close to ending what was started. \ The Aristocrat reveals themselves to me again. They tell me I am late. Their pull is immense, I cannot turn back." - next_knowledge = list( - /datum/heretic_knowledge/ultimate/void_final, - /datum/heretic_knowledge/spell/cleave, - /datum/heretic_knowledge/summon/maid_in_mirror, - ) + 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 @@ -219,7 +178,7 @@ gain_text = "The world falls into darkness. I stand in an empty plane, small flakes of ice fall from the sky. \ 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 diff --git a/code/modules/unit_tests/heretic_knowledge.dm b/code/modules/unit_tests/heretic_knowledge.dm index f75fff24cee..4154e50285e 100644 --- a/code/modules/unit_tests/heretic_knowledge.dm +++ b/code/modules/unit_tests/heretic_knowledge.dm @@ -1,3 +1,4 @@ + /* * This test checks all heretic knowledge nodes and validates they are setup correctly. * We check that all knowledge is reachable by players (through the research tree) @@ -6,13 +7,13 @@ /datum/unit_test/heretic_knowledge /datum/unit_test/heretic_knowledge/Run() - + if(!GLOB.heretic_research_tree) + GLOB.heretic_research_tree = generate_heretic_research_tree() // First, we get a list of all knowledge types - // EXCLUDING types which have route unset / set to null. - // (Types without a route set are assumed to be abstract or purposefully unreachable) + // EXCLUDING all abstract types var/list/all_possible_knowledge = typesof(/datum/heretic_knowledge) for(var/datum/heretic_knowledge/knowledge_type as anything in all_possible_knowledge) - if(isnull(initial(knowledge_type.route))) + if(initial(knowledge_type.abstract_parent_type) == knowledge_type) all_possible_knowledge -= knowledge_type // Now, let's build a list of all researchable knowledge @@ -22,12 +23,11 @@ var/list/list_to_check = GLOB.heretic_start_knowledge.Copy() var/i = 0 while(i < length(list_to_check)) - var/datum/heretic_knowledge/path_to_create = list_to_check[++i] - if(!ispath(path_to_create)) - TEST_FAIL("Heretic Knowledge: Got a non-heretic knowledge datum (Got: [path_to_create]) in the list knowledges!") - var/datum/heretic_knowledge/instantiated_knowledge = new path_to_create() + var/datum/heretic_knowledge/knowledge = list_to_check[++i] + if(!ispath(knowledge)) + TEST_FAIL("Heretic Knowledge: Got a non-heretic knowledge datum (Got: [knowledge]) in the list knowledges!") // Next knowledge is a list of typepaths. - for(var/datum/heretic_knowledge/next_knowledge as anything in instantiated_knowledge.next_knowledge) + for(var/datum/heretic_knowledge/next_knowledge as anything in GLOB.heretic_research_tree[knowledge][HKT_NEXT]) if(!ispath(next_knowledge)) TEST_FAIL("Heretic Knowledge: [next_knowledge.type] has a [isnull(next_knowledge) ? "null":"invalid path"] in its next_knowledge list!") continue @@ -35,7 +35,6 @@ continue list_to_check += next_knowledge - qdel(instantiated_knowledge) // We now have a list that SHOULD contain all knowledges with a path set (list_to_check). // Let's compare it to our original list (all_possible_knowledge). If they're not identical, @@ -45,48 +44,3 @@ var/list/unreachables = all_possible_knowledge - list_to_check for(var/datum/heretic_knowledge/lost_knowledge as anything in unreachables) TEST_FAIL("Heretic Knowledge: [lost_knowledge] is unreachable by players! Add it to another knowledge's 'next_knowledge' list. If it is purposeful, set its route to 'null'.") - - -/* - * This test checks that all main heretic paths are of the same length. - * - * If any two main paths are not equal length, the test will fail and quit, reporting - * which two paths did not match. Then, whichever is erroneous can be determined manually. - */ -/datum/unit_test/heretic_main_paths - -/datum/unit_test/heretic_main_paths/Run() - // A list of path strings we don't need to check. - var/list/paths_we_dont_check = list(PATH_SIDE, PATH_START) - // An assoc list of [path string] to [number of nodes we found of that path]. - var/list/paths = list() - // The starting knowledge node, we use this to deduce what main paths we have. - var/datum/heretic_knowledge/spell/basic/starter_node = new() - - // Go through and determine what paths exist from our base node. - for(var/datum/heretic_knowledge/possible_path as anything in starter_node.next_knowledge) - paths[initial(possible_path.route)] = 0 - - qdel(starter_node) // Get rid of that starter node, we don't need it anymore. - - // Now go through all the knowledges and record how many of each main path exist. - for(var/datum/heretic_knowledge/knowledge as anything in subtypesof(/datum/heretic_knowledge)) - var/knowledge_route = initial(knowledge.route) - // null (abstract), side paths, and start paths we can skip - if(isnull(knowledge_route) || (knowledge_route in paths_we_dont_check)) - continue - - if(isnull(paths[knowledge_route])) - TEST_FAIL("Heretic Knowledge: An invalid knowledge route ([knowledge_route]) was found on [knowledge].") - continue - - paths[knowledge_route]++ - - // Now all entries in the paths list should have an equal value. - // If any two entries do not match, then one of them is incorrect, and the test fails. - for(var/main_path in paths) - for(var/other_main_path in (paths - main_path)) - TEST_ASSERT(paths[main_path] == paths[other_main_path], \ - "Heretic Knowledge: [main_path] had [paths[main_path]] knowledges, \ - which was not equal to [other_main_path]'s [paths[other_main_path]] knowledges. \ - All main paths should have the same number of knowledges!") diff --git a/tgstation.dme b/tgstation.dme index d9b4b10a98d..d2d4aca3e0d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3186,6 +3186,7 @@ #include "code\modules\antagonists\heretic\items\labyrinth_handbook.dm" #include "code\modules\antagonists\heretic\items\madness_mask.dm" #include "code\modules\antagonists\heretic\items\unfathomable_curio.dm" +#include "code\modules\antagonists\heretic\knowledge\_heretic_paths.dm" #include "code\modules\antagonists\heretic\knowledge\ash_lore.dm" #include "code\modules\antagonists\heretic\knowledge\blade_lore.dm" #include "code\modules\antagonists\heretic\knowledge\cosmic_lore.dm"