From 32f4db8ab2593636baaa4ef47bea84cbefbf0d22 Mon Sep 17 00:00:00 2001 From: JimKil3 <47290811+JimKil3@users.noreply.github.com> Date: Fri, 31 Oct 2025 18:07:55 -0500 Subject: [PATCH] [PTBF] Subclass-based Vampire Objectives (#30623) * the entire thing * typo --- code/game/gamemodes/objective.dm | 27 +++++++++++++++++++ .../modules/antagonists/vampire/vamp_datum.dm | 4 ++- .../vampire/vampire_powers/vampire_powers.dm | 3 +++ .../antagonists/vampire/vampire_subclasses.dm | 16 ++++++++++- 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 39253590e53..672363e6890 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -990,6 +990,33 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) else return FALSE +/datum/objective/specialization + name = "Vampire subclass objective" + explanation_text = "Accumulate at least 150 units of blood and pick a specialization to receive further instructions." + needs_target = FALSE + var/datum/vampire_subclass/subclass + +/datum/objective/specialization/New() + if(!owner.has_antag_datum(/datum/antagonist/vampire)) + explanation_text = "Free Objective" + return + + update_explanation_text() + return ..() + +/datum/objective/specialization/proc/gain_specialization() + for(var/datum/antagonist/vampire/vampire_datum in owner.antag_datums) + subclass = vampire_datum.subclass + + update_explanation_text() + +/datum/objective/specialization/update_explanation_text() + if(!subclass) + return + + var/departments = list("security", "service", "research", "medical", "engineering", "supply") + explanation_text = replacetext(pick(subclass.unique_objectives), "%DEPARTMENT", pick(departments)) + // Flayers #define SWARM_GOAL_LOWER_BOUND 130 diff --git a/code/modules/antagonists/vampire/vamp_datum.dm b/code/modules/antagonists/vampire/vamp_datum.dm index 5adbe339dcf..74719fd4479 100644 --- a/code/modules/antagonists/vampire/vamp_datum.dm +++ b/code/modules/antagonists/vampire/vamp_datum.dm @@ -362,8 +362,10 @@ RESTRICT_TYPE(/datum/antagonist/vampire) add_antag_objective(/datum/objective/blood) add_antag_objective(/datum/objective/assassinate) - if(prob(5)) // 5% chance of getting protect. 95% chance of getting steal. + if(prob(5)) // 5% chance of getting protect. 95% chance of getting a steal / specialization-specific objective. add_antag_objective(/datum/objective/protect) + else if(prob(50)) + add_antag_objective(/datum/objective/specialization) else add_antag_objective(/datum/objective/steal) add_antag_objective(/datum/objective/lair) diff --git a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm index b584ccf6649..8260c447164 100644 --- a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm @@ -186,6 +186,9 @@ if(log_choice) SSblackbox.record_feedback("nested tally", "vampire_subclasses", 1, list("[new_subclass.name]")) + for(var/datum/objective/specialization/objective in owner.get_all_objectives()) + objective.gain_specialization() + /datum/spell/vampire/glare name = "Glare" desc = "Your eyes flash, stunning and silencing anyone in front of you. It has lesser effects for those around you." diff --git a/code/modules/antagonists/vampire/vampire_subclasses.dm b/code/modules/antagonists/vampire/vampire_subclasses.dm index bddff6daeea..9e59b8a3429 100644 --- a/code/modules/antagonists/vampire/vampire_subclasses.dm +++ b/code/modules/antagonists/vampire/vampire_subclasses.dm @@ -11,6 +11,8 @@ var/thrall_cap = 1 /// If true, lets the vampire have access to their full power abilities without meeting the blood requirement, or needing a certain number of drained humans. var/full_power_override = FALSE + /// The subclass' potential unique objectives. + var/list/unique_objectives /datum/vampire_subclass/proc/add_subclass_ability(datum/antagonist/vampire/vamp) for(var/thing in standard_powers) @@ -33,6 +35,9 @@ /datum/vampire_passive/vision/full, /datum/spell/vampire/self/eternal_darkness, /datum/vampire_passive/vision/xray) + unique_objectives = list("Silence the station's telecommunications equipment. Their screams will fall on deaf ears.", + "Shroud %DEPARTMENT in darkness.", + "Show the station why they fear the dark.") /datum/vampire_subclass/hemomancer name = "hemomancer" @@ -45,6 +50,9 @@ fully_powered_abilities = list(/datum/vampire_passive/full, /datum/vampire_passive/vision/full, /datum/spell/vampire/self/blood_spill) + unique_objectives = list("Deprive the medical bay of blood. It's not theirs to use.", + "Paint %DEPARTMENT red with the blood of those who would oppose you.", + "Show the station that you stand at the peak of strength.") /datum/vampire_subclass/gargantua name = "gargantua" @@ -59,6 +67,9 @@ /datum/vampire_passive/vision/full, /datum/spell/vampire/arena) improved_rejuv_healing = TRUE + unique_objectives = list("Destroy Research's servers. Technology is no substitute for strength.", + "Vandalize %DEPARTMENT. They've grown complacent.", + "Show the station that you stand at the peak of strength.") // I think multiple vampires competing would be cool /datum/vampire_subclass/dantalion name = "dantalion" @@ -75,7 +86,9 @@ /datum/spell/vampire/hysteria, /datum/vampire_passive/vision/full, /datum/vampire_passive/increment_thrall_cap/three) - + unique_objectives = list("Enthrall a member of security. Their potential is wasted in Nanotrasen's ranks.", + "Enthrall only members of %DEPARTMENT. Their experience will assist your lord.", + "Control the station from the shadows.") /datum/vampire_subclass/ancient name = "ancient" @@ -115,3 +128,4 @@ /datum/vampire_passive/vision/xray) improved_rejuv_healing = TRUE thrall_cap = 150 // can thrall high pop + unique_objectives = list("Your ranks grow thin. Ensure your thralls remain in good health.") //idk