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"