Revert "CLOCK AND BLOOD TORTURE 2: THE RESUMMONING (#8991)" (#10687)

This reverts commit 6ea27bb700.
This commit is contained in:
Jamie D
2020-12-20 20:39:52 +00:00
committed by GitHub
parent d369b9a18d
commit d60aebe2bb
43 changed files with 66 additions and 850 deletions

View File

@@ -20,7 +20,6 @@
#define BLOOD_BARRAGE_COST 300 #define BLOOD_BARRAGE_COST 300
#define BLOOD_BEAM_COST 500 #define BLOOD_BEAM_COST 500
#define METAL_TO_CONSTRUCT_SHELL_CONVERSION 50 #define METAL_TO_CONSTRUCT_SHELL_CONVERSION 50
#define RGLASS_TO_SOULSTONE_CONVERSION 30
//screen locations //screen locations
#define DEFAULT_BLOODSPELLS "6:-29,4:-2" #define DEFAULT_BLOODSPELLS "6:-29,4:-2"
#define DEFAULT_BLOODTIP "14:6,14:27" #define DEFAULT_BLOODTIP "14:6,14:27"

View File

@@ -45,8 +45,6 @@
#define ROLE_GANG "gangster" // Yogs #define ROLE_GANG "gangster" // Yogs
#define ROLE_DARKSPAWN "darkspawn" //Yogs #define ROLE_DARKSPAWN "darkspawn" //Yogs
#define ROLE_HOLOPARASITE "Holoparasite" // Yogs #define ROLE_HOLOPARASITE "Holoparasite" // Yogs
#define ROLE_CLOCK_AGENT "Clockwork Agent" //Yogs
#define ROLE_BLOOD_AGENT "Cultist Agent" //Yogs
#define ROLE_ZOMBIE "Zombie" //Yogs #define ROLE_ZOMBIE "Zombie" //Yogs
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR. //Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
@@ -82,8 +80,6 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_HIVE = /datum/game_mode/hivemind, ROLE_HIVE = /datum/game_mode/hivemind,
ROLE_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs, ROLE_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs,
ROLE_DARKSPAWN = /datum/game_mode/darkspawn, ROLE_DARKSPAWN = /datum/game_mode/darkspawn,
ROLE_CLOCK_AGENT = /datum/game_mode/traitor/traitorcult,
ROLE_BLOOD_AGENT = /datum/game_mode/traitor/traitorcult,
ROLE_SENTIENCE, ROLE_SENTIENCE,
ROLE_FUGITIVE, ROLE_FUGITIVE,
ROLE_ZOMBIE ROLE_ZOMBIE

View File

@@ -357,7 +357,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
return return
var/datum/antagonist/cult/antag = mob_viewer.mind.has_antag_datum(/datum/antagonist/cult,TRUE) var/datum/antagonist/cult/antag = mob_viewer.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
if(!antag?.cult_team) if(!antag)
return return
var/datum/objective/sacrifice/sac_objective = locate() in antag.cult_team.objectives var/datum/objective/sacrifice/sac_objective = locate() in antag.cult_team.objectives

View File

@@ -98,10 +98,6 @@
integer = FALSE integer = FALSE
min_val = 1 min_val = 1
/datum/config_entry/number/agent_scaling_coeff //how many players per clock&blood agent
config_entry_value = 15
min_val = 1
/datum/config_entry/number/traitor_objectives_amount /datum/config_entry/number/traitor_objectives_amount
config_entry_value = 2 config_entry_value = 2
min_val = 0 min_val = 0

View File

@@ -196,7 +196,6 @@ SUBSYSTEM_DEF(ticker)
mode.process(wait * 0.1) mode.process(wait * 0.1)
check_queue() check_queue()
check_maprotate() check_maprotate()
GLOB.scripture_states = scripture_unlock_alert(GLOB.scripture_states)
if(!roundend_check_paused && mode.check_finished(force_ending) || force_ending) if(!roundend_check_paused && mode.check_finished(force_ending) || force_ending)
current_state = GAME_STATE_FINISHED current_state = GAME_STATE_FINISHED

View File

@@ -263,7 +263,6 @@
var/severity = 0 //goes up to a maximum of MAX_MANIA_SEVERITY var/severity = 0 //goes up to a maximum of MAX_MANIA_SEVERITY
var/warned_turnoff = FALSE //if we've warned that the motor is off var/warned_turnoff = FALSE //if we've warned that the motor is off
var/warned_outofsight = FALSE //if we've warned that the target is out of sight of the motor var/warned_outofsight = FALSE //if we've warned that the target is out of sight of the motor
var/agent = FALSE //can the motor convert
var/static/list/mania_messages = list("Go nuts.", "Take a crack at crazy.", "Make a bid for insanity.", "Get kooky.", "Move towards mania.", "Become bewildered.", "Wax wild.", \ var/static/list/mania_messages = list("Go nuts.", "Take a crack at crazy.", "Make a bid for insanity.", "Get kooky.", "Move towards mania.", "Become bewildered.", "Wax wild.", \
"Go round the bend.", "Land in lunacy.", "Try dementia.", "Strive to get a screw loose.", "Advance forward.", "Approach the transmitter.", "Touch the antennae.", \ "Go round the bend.", "Land in lunacy.", "Try dementia.", "Strive to get a screw loose.", "Advance forward.", "Approach the transmitter.", "Touch the antennae.", \
"Move towards the mania motor.", "Come closer.", "Get over here already!", "Keep your eyes on the motor.") "Move towards the mania motor.", "Come closer.", "Get over here already!", "Keep your eyes on the motor.")
@@ -276,7 +275,6 @@
. = ..() . = ..()
if(.) if(.)
motor = new_motor motor = new_motor
agent = motor.agent
/datum/status_effect/maniamotor/Destroy() /datum/status_effect/maniamotor/Destroy()
motor = null motor = null
@@ -327,7 +325,7 @@
severity = 0 severity = 0
else if(!owner.anti_magic_check(chargecost = 0) && owner.stat != DEAD && severity) else if(!owner.anti_magic_check(chargecost = 0) && owner.stat != DEAD && severity)
var/static/hum = get_sfx('sound/effects/screech.ogg') //same sound for every proc call var/static/hum = get_sfx('sound/effects/screech.ogg') //same sound for every proc call
if(!agent && (owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT)) if(owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT)
if(is_eligible_servant(owner)) if(is_eligible_servant(owner))
to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar("You are mine and his, now.")]\"</span>") to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar("You are mine and his, now.")]\"</span>")
if(add_servant_of_ratvar(owner)) if(add_servant_of_ratvar(owner))

View File

@@ -44,17 +44,8 @@ Credit where due:
// PROCS // // PROCS //
/////////// ///////////
/proc/is_servant_of_ratvar(mob/M, require_cult = FALSE, holy_water_check = FALSE) /proc/is_servant_of_ratvar(mob/M)
if(!istype(M) || isobserver(M)) return M?.mind?.has_antag_datum(/datum/antagonist/clockcult)
return FALSE
var/datum/antagonist/clockcult/D = M?.mind?.has_antag_datum(/datum/antagonist/clockcult)
if(!D)
return FALSE
if(!require_cult || !D.agent)
return FALSE
if(!holy_water_check || !D.ignore_holy_water)
return FALSE
return TRUE
/proc/is_eligible_servant(mob/M) /proc/is_eligible_servant(mob/M)
if(!istype(M)) if(!istype(M))
@@ -78,14 +69,12 @@ Credit where due:
return TRUE return TRUE
return FALSE return FALSE
/proc/add_servant_of_ratvar(mob/L, silent = FALSE, create_team = TRUE, agent = FALSE) /proc/add_servant_of_ratvar(mob/L, silent = FALSE, create_team = TRUE)
if(!L || !L.mind) if(!L || !L.mind)
return return
var/update_type = /datum/antagonist/clockcult var/update_type = /datum/antagonist/clockcult
if(silent) if(silent)
update_type = /datum/antagonist/clockcult/silent update_type = /datum/antagonist/clockcult/silent
if(agent)
update_type = /datum/antagonist/clockcult/agent
var/datum/antagonist/clockcult/C = new update_type(L.mind) var/datum/antagonist/clockcult/C = new update_type(L.mind)
C.make_team = create_team C.make_team = create_team
C.show_in_roundend = create_team //tutorial scarabs begone C.show_in_roundend = create_team //tutorial scarabs begone
@@ -120,6 +109,9 @@ Credit where due:
L.playsound_local(get_turf(L), 'sound/ambience/antag/clockcultalr.ogg', 40, TRUE, frequency = 100000, pressure_affected = FALSE) L.playsound_local(get_turf(L), 'sound/ambience/antag/clockcultalr.ogg', 40, TRUE, frequency = 100000, pressure_affected = FALSE)
flash_color(L, flash_color = list("#BE8700", "#BE8700", "#BE8700", rgb(0,0,0)), flash_time = 5) flash_color(L, flash_color = list("#BE8700", "#BE8700", "#BE8700", rgb(0,0,0)), flash_time = 5)
/proc/remove_servant_of_ratvar(mob/L, silent = FALSE) /proc/remove_servant_of_ratvar(mob/L, silent = FALSE)
if(!L || !L.mind) if(!L || !L.mind)
return return
@@ -389,5 +381,6 @@ Credit where due:
if(len_before_addition == round_credits.len) if(len_before_addition == round_credits.len)
round_credits += list("<center><h2>The servants were cast astray in the void!</h2>", "<center><h2>None shall remember their names!</h2>") round_credits += list("<center><h2>The servants were cast astray in the void!</h2>", "<center><h2>None shall remember their names!</h2>")
round_credits += "<br>" round_credits += "<br>"
round_credits += ..() round_credits += ..()
return round_credits return round_credits

View File

@@ -7,17 +7,8 @@
var/anchor_time2kill = 5 MINUTES var/anchor_time2kill = 5 MINUTES
var/bloodstone_cooldown = FALSE var/bloodstone_cooldown = FALSE
/proc/iscultist(mob/living/M, require_cult = FALSE, holy_water_check = FALSE) /proc/iscultist(mob/living/M)
if(!istype(M)) return M?.mind?.has_antag_datum(/datum/antagonist/cult)
return FALSE
var/datum/antagonist/cult/D = M?.mind?.has_antag_datum(/datum/antagonist/cult)
if(!D)
return FALSE
if(!require_cult || !D.agent)
return FALSE
if(!holy_water_check || !D.ignore_holy_water)
return FALSE
return TRUE
/datum/team/cult/proc/is_sacrifice_target(datum/mind/mind) /datum/team/cult/proc/is_sacrifice_target(datum/mind/mind)
for(var/datum/objective/sacrifice/sac_objective in objectives) for(var/datum/objective/sacrifice/sac_objective in objectives)

View File

@@ -59,8 +59,8 @@ GLOBAL_LIST_EMPTY(objectives)
update_explanation_text() update_explanation_text()
/datum/objective/proc/considered_escaped(datum/mind/M, needs_living = TRUE) /datum/objective/proc/considered_escaped(datum/mind/M)
if((needs_living && !considered_alive(M))) if(!considered_alive(M))
return FALSE return FALSE
if(M.force_escaped) if(M.force_escaped)
return TRUE return TRUE
@@ -428,21 +428,6 @@ GLOBAL_LIST_EMPTY(objectives)
return FALSE return FALSE
return TRUE return TRUE
/datum/objective/escape/onesurvivor
name = "escape team can die"
team_explanation_text = "Have all members of your team escape outside custody on a shuttle or pod with at least one surviving member."
/datum/objective/escape/onesurvivor/check_completion()
var/has_survivor = FALSE //is there a surviving member of the team?
var/list/datum/mind/owners = get_owners()
for(var/O in owners)
var/datum/mind/M = O
if(!considered_escaped(M, needs_living = FALSE)) //NO MAN LEFT BEHIND
return FALSE
if(considered_alive(M))
has_survivor = TRUE
return has_survivor
/datum/objective/escape/escape_with_identity /datum/objective/escape/escape_with_identity
name = "escape with identity" name = "escape with identity"
var/target_real_name // Has to be stored because the target's real_name can change over the course of the round var/target_real_name // Has to be stored because the target's real_name can change over the course of the round
@@ -1259,8 +1244,6 @@ GLOBAL_LIST_EMPTY(possible_items_special)
/datum/objective/assassinate, /datum/objective/assassinate,
/datum/objective/maroon, /datum/objective/maroon,
/datum/objective/debrain, /datum/objective/debrain,
/datum/objective/soul_extraction,
/datum/objective/assist,
/datum/objective/protect, /datum/objective/protect,
/datum/objective/assist, /datum/objective/assist,
/datum/objective/destroy, /datum/objective/destroy,

View File

@@ -1,74 +0,0 @@
/datum/game_mode
var/list/datum/mind/clockagents = list() //list of clock agents for objective scaling
var/datum/team/clock_agents/clock_agent_team//clock team for tracking objectives
var/list/datum/mind/bloodagents = list() //ditto for blood
var/datum/team/blood_agents/blood_agent_team //same
var/agent_scaling = 1
/datum/game_mode/traitor/traitorcult
name = "traitor+cultagents"
config_tag = "traitorcult"
restricted_jobs = list("Chaplain", "Captain", "AI", "Cyborg")
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security")
required_players = 20
announce_span = "danger"
announce_text = "There are Syndicate and Cult Agents aboard the station!\n\
<span class='danger'>Traitors</span>: Accomplish your objectives.\n\
<span class='danger'>Cult Agents</span>: Accomplish your objectives.\n\
<span class='notice'>Crew</span>: Do not let the traitors or cult agents succeed!"
var/list/datum/mind/coggers_to_cog = list()
var/list/datum/mind/bloods_to_blood = list()
/datum/game_mode/traitor/traitorcult/pre_setup()
if(CONFIG_GET(flag/protect_roles_from_antagonist))
restricted_jobs += protected_jobs
if(CONFIG_GET(flag/protect_assistant_from_antagonist))
restricted_jobs += "Assistant"
var/list/datum/mind/possible_clocks = get_players_for_role(ROLE_CLOCK_AGENT)
var/list/datum/mind/possible_bloods = get_players_for_role(ROLE_BLOOD_AGENT)
var/asc = CONFIG_GET(number/agent_scaling_coeff)
if(asc)
agent_scaling = max(round(num_players() / asc), 1)
clock_agent_team = new
GLOB.servants_active = TRUE //needed for scripture alerts, doesn't do much else aside from reebe stuff so :shrug:
if(possible_clocks.len)
for(var/j = 1 to agent_scaling)
if(!possible_clocks.len)
break
var/datum/mind/clock = antag_pick(possible_clocks)
possible_clocks -= clock
possible_bloods -= clock
antag_candidates -= clock
clock_agent_team.add_member(clock)
clock.special_role = ROLE_CLOCK_AGENT
clock.restricted_roles = restricted_jobs
coggers_to_cog += clock
if(possible_bloods.len)
blood_agent_team = new
for(var/k = 1 to agent_scaling)
if(!possible_bloods.len)
break
var/datum/mind/blood = antag_pick(possible_bloods)
possible_bloods -= blood
antag_candidates -= blood
blood_agent_team.add_member(blood)
blood.special_role = ROLE_BLOOD_AGENT
blood.restricted_roles = restricted_jobs
bloods_to_blood += blood
return ..()
/datum/game_mode/traitor/traitorcult/post_setup()
if(clock_agent_team)
clock_agent_team.forge_clock_objectives()
if(blood_agent_team)
blood_agent_team.forge_blood_objectives()
for(var/datum/mind/M in bloods_to_blood)
M.add_antag_datum(/datum/antagonist/cult/agent)
for(var/datum/mind/M in coggers_to_cog)
var/mob/living/L = M.current
add_servant_of_ratvar(L, TRUE, FALSE, TRUE)
return ..()

View File

@@ -39,9 +39,6 @@
name = "implant case" name = "implant case"
else if(istype(W, /obj/item/implanter)) else if(istype(W, /obj/item/implanter))
var/obj/item/implanter/I = W var/obj/item/implanter/I = W
if(istype(I, /obj/item/implanter/cult))
to_chat(user, "<span class='warning'>You can't see anything to extract from [I]!</span>")
return
if(I.imp) if(I.imp)
if(imp || I.imp.imp_in) if(imp || I.imp.imp_in)
return return

View File

@@ -139,11 +139,6 @@
/obj/item/robot_suit/attackby(obj/item/W, mob/user, params) /obj/item/robot_suit/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/mmi/posibrain/soul_vessel))
var/obj/item/mmi/posibrain/soul_vessel/buscheck = W
if(buscheck.agent)
to_chat(user, "<span class='warning'>[W] hums fitfully, but doesn't mesh with the frame.</span>")
return
if(istype(W, /obj/item/stack/sheet/metal)) if(istype(W, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/metal/M = W var/obj/item/stack/sheet/metal/M = W
if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)

View File

@@ -274,8 +274,7 @@
ROLE_OVERTHROW, ROLE_REV, ROLE_REVENANT, ROLE_OVERTHROW, ROLE_REV, ROLE_REVENANT,
ROLE_REV_HEAD, ROLE_SERVANT_OF_RATVAR, ROLE_SYNDICATE, ROLE_REV_HEAD, ROLE_SERVANT_OF_RATVAR, ROLE_SYNDICATE,
ROLE_TRAITOR, ROLE_WIZARD, ROLE_GANG, ROLE_VAMPIRE, ROLE_TRAITOR, ROLE_WIZARD, ROLE_GANG, ROLE_VAMPIRE,
ROLE_SHADOWLING, ROLE_DARKSPAWN, ROLE_ZOMBIE, ROLE_SHADOWLING, ROLE_DARKSPAWN, ROLE_ZOMBIE, ROLE_HERETIC)) //ROLE_REV_HEAD is excluded from this because rev jobbans are handled by ROLE_REV
ROLE_CLOCK_AGENT, ROLE_BLOOD_AGENT, ROLE_HERETIC)) //ROLE_REV_HEAD is excluded from this because rev jobbans are handled by ROLE_REV
for(var/department in long_job_lists) for(var/department in long_job_lists)
output += "<div class='column'><label class='rolegroup long [ckey(department)]'><input type='checkbox' name='[department]' class='hidden' [usr.client.prefs.tgui_fancy ? " onClick='toggle_checkboxes(this, \"_com\")'" : ""]>[department]</label><div class='content'>" output += "<div class='column'><label class='rolegroup long [ckey(department)]'><input type='checkbox' name='[department]' class='hidden' [usr.client.prefs.tgui_fancy ? " onClick='toggle_checkboxes(this, \"_com\")'" : ""]>[department]</label><div class='content'>"
break_counter = 0 break_counter = 0

View File

@@ -270,15 +270,9 @@
sigil_name = "Vitality Matrix" sigil_name = "Vitality Matrix"
var/revive_cost = 150 var/revive_cost = 150
var/sigil_active = FALSE var/sigil_active = FALSE
var/min_drain_health = -INFINITY //how much health the sigil can drain, allows a cap for traitorcultist sigils
var/can_dust = TRUE //can the sigil dust a corpse
var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets var/animation_number = 3 //each cycle increments this by 1, at 4 it produces an animation and resets
var/static/list/damage_heal_order = list(CLONE, TOX, BURN, BRUTE, OXY) //we heal damage in this order var/static/list/damage_heal_order = list(CLONE, TOX, BURN, BRUTE, OXY) //we heal damage in this order
/obj/effect/clockwork/sigil/vitality/agent
min_drain_health = 20
can_dust = FALSE
/obj/effect/clockwork/sigil/vitality/examine(mob/user) /obj/effect/clockwork/sigil/vitality/examine(mob/user)
. = ..() . = ..()
if(is_servant_of_ratvar(user) || isobserver(user)) if(is_servant_of_ratvar(user) || isobserver(user))
@@ -303,7 +297,7 @@
animation_number++ animation_number++
if(!is_servant_of_ratvar(L)) if(!is_servant_of_ratvar(L))
var/vitality_drained = 0 var/vitality_drained = 0
if(L.stat == DEAD && !consumed_vitality && can_dust) if(L.stat == DEAD && !consumed_vitality)
consumed_vitality = TRUE //Prevent the target from being consumed multiple times consumed_vitality = TRUE //Prevent the target from being consumed multiple times
vitality_drained = L.maxHealth vitality_drained = L.maxHealth
var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src)) var/obj/effect/temp_visual/ratvar/sigil/vitality/V = new /obj/effect/temp_visual/ratvar/sigil/vitality(get_turf(src))
@@ -315,11 +309,11 @@
if(!L.dropItemToGround(W)) if(!L.dropItemToGround(W))
qdel(W) qdel(W)
L.dust() L.dust()
else if(L.health > min_drain_health) else
if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS) if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS)
vitality_drained = L.adjustToxLoss(1, forced = TRUE) vitality_drained = L.adjustToxLoss(1)
else else
vitality_drained = L.adjustToxLoss(1.5, forced = TRUE) vitality_drained = L.adjustToxLoss(1.5)
if(vitality_drained) if(vitality_drained)
GLOB.clockwork_vitality += vitality_drained GLOB.clockwork_vitality += vitality_drained
else else

View File

@@ -127,20 +127,6 @@
consume_visual(fabricator, power_amount) consume_visual(fabricator, power_amount)
return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH) return list("operation_time" = 0, "new_obj_type" = null, "power_cost" = power_amount, "spawn_dir" = SOUTH)
//MMI conversion for agents
/obj/item/mmi/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
if(!fabricator.agent)
return FALSE //no way to use this currently
var/newtype = /obj/item/mmi/posibrain/soul_vessel/agent
return list("operation_time" = 0, "new_obj_type" = newtype, "power_cost" = 0, "spawn_dir" = SOUTH)
//guvax implanters for agents
/obj/item/implanter/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
if(!fabricator.agent)
return FALSE //again useless for normal clock cult
var/newtype = /obj/item/implanter/cult
return list("operation_time" = 0, "new_obj_type" = newtype, "power_cost" = 0, "spawn_dir" = SOUTH)
//Airlock conversion //Airlock conversion
/obj/machinery/door/airlock/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent) /obj/machinery/door/airlock/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
var/doortype = /obj/machinery/door/airlock/clockwork var/doortype = /obj/machinery/door/airlock/clockwork

View File

@@ -16,16 +16,10 @@
var/unlock_message var/unlock_message
if(current_power >= SCRIPT_UNLOCK_THRESHOLD && !GLOB.script_scripture_unlocked) if(current_power >= SCRIPT_UNLOCK_THRESHOLD && !GLOB.script_scripture_unlocked)
GLOB.script_scripture_unlocked = TRUE GLOB.script_scripture_unlocked = TRUE
if(SSticker.mode.clock_agent_team) unlock_message = "<span class='large_brass bold'>The Ark swells as a key power threshold is reached. Script scriptures are now available.</span>"
unlock_message = "<span class='sevtug'>The Hierophant Network is showing a jump in power from your sector; You should have access to Script level scriptures.</span>"
else
unlock_message = "<span class='large_brass bold'>The Ark swells as a key power threshold is reached. Script scriptures are now available.</span>"
if(current_power >= APPLICATION_UNLOCK_THRESHOLD && !GLOB.application_scripture_unlocked) if(current_power >= APPLICATION_UNLOCK_THRESHOLD && !GLOB.application_scripture_unlocked)
GLOB.application_scripture_unlocked = TRUE GLOB.application_scripture_unlocked = TRUE
if(SSticker.mode.clock_agent_team) unlock_message = "<span class='large_brass bold'>The Ark surges as a key power threshold is reached. Application scriptures are now available.</span>"
unlock_message = "<span class='sevtug'>Power appears to have stayed on the rise, You'll have access to Application scriptures now if you're still alive.</span>"
else
unlock_message = "<span class='large_brass bold'>The Ark surges as a key power threshold is reached. Application scriptures are now available.</span>"
if(unlock_message && GLOB.servants_active) if(unlock_message && GLOB.servants_active)
hierophant_message(unlock_message) hierophant_message(unlock_message)
return TRUE return TRUE

View File

@@ -76,8 +76,6 @@
creation_message = "<span class='neovgre_small bold'>Crimson fire begins to rage in the armor as it rises into the air with its armaments!</span>" creation_message = "<span class='neovgre_small bold'>Crimson fire begins to rage in the armor as it rises into the air with its armaments!</span>"
construct_type = /mob/living/simple_animal/hostile/clockwork/marauder construct_type = /mob/living/simple_animal/hostile/clockwork/marauder
/obj/item/clockwork/construct_chassis/clockwork_marauder/agent
construct_type = /mob/living/simple_animal/hostile/clockwork/marauder/agent
//Cogscarab shell, used to create cogcarabs - fragile but zippy little drones that build and maintain the base. //Cogscarab shell, used to create cogcarabs - fragile but zippy little drones that build and maintain the base.
/obj/item/clockwork/construct_chassis/cogscarab /obj/item/clockwork/construct_chassis/cogscarab

View File

@@ -12,7 +12,6 @@
var/speed_multiplier = 1 //The speed ratio the fabricator operates at var/speed_multiplier = 1 //The speed ratio the fabricator operates at
var/uses_power = TRUE var/uses_power = TRUE
var/repairing = null //what we're currently repairing, if anything var/repairing = null //what we're currently repairing, if anything
var/agent = FALSE //version that can make soul vessels
/obj/item/clockwork/replica_fabricator/scarab /obj/item/clockwork/replica_fabricator/scarab
name = "scarab fabricator" name = "scarab fabricator"
@@ -222,12 +221,3 @@
<b>[DisplayEnergy(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]</b> to fully repair [target == user ? "yourself" : "[target.p_them()]"]!</span>") <b>[DisplayEnergy(repair_values["amount_to_heal"]*MIN_CLOCKCULT_POWER, MIN_CLOCKCULT_POWER)]</b> to fully repair [target == user ? "yourself" : "[target.p_them()]"]!</span>")
return FALSE return FALSE
return TRUE return TRUE
/obj/item/clockwork/replica_fabricator/agent
clockwork_desc = "A replica fabricator engineered for agent teams to convert stationside assets into items crucial for their objectives."
agent = TRUE
/obj/item/clockwork/replica_fabricator/agent/examine(mob/living/user)
. = ..()
if(user.mind?.has_antag_datum(/datum/antagonist/clockcult/agent))
. += "<span class='brass'>This fabricator can also be used to produce <span class='nezbere'>soul vessels from MMI frames</span> and <span class='sevtug'>Guvax capacitors from implanters.</span></span>"

View File

@@ -24,7 +24,6 @@
resistance_flags = FIRE_PROOF | ACID_PROOF resistance_flags = FIRE_PROOF | ACID_PROOF
force_replace_ai_name = TRUE force_replace_ai_name = TRUE
overrides_aicore_laws = TRUE overrides_aicore_laws = TRUE
var/agent = FALSE //agent vs not agent
/obj/item/mmi/posibrain/soul_vessel/Initialize() /obj/item/mmi/posibrain/soul_vessel/Initialize()
. = ..() . = ..()
@@ -46,7 +45,7 @@
/obj/item/mmi/posibrain/soul_vessel/transfer_personality(mob/candidate) /obj/item/mmi/posibrain/soul_vessel/transfer_personality(mob/candidate)
. = ..() . = ..()
if(.) if(.)
add_servant_of_ratvar(brainmob, TRUE, !agent, agent) add_servant_of_ratvar(brainmob, TRUE)
/obj/item/mmi/posibrain/soul_vessel/attack_self(mob/living/user) /obj/item/mmi/posibrain/soul_vessel/attack_self(mob/living/user)
if(!is_servant_of_ratvar(user)) if(!is_servant_of_ratvar(user))

View File

@@ -22,7 +22,6 @@
speech_span = SPAN_ROBOT speech_span = SPAN_ROBOT
var/playstyle_string = "<span class='heavy_brass'>You are a bug, yell at whoever spawned you!</span>" var/playstyle_string = "<span class='heavy_brass'>You are a bug, yell at whoever spawned you!</span>"
var/empower_string = "<span class='heavy_brass'>You have nothing to empower, yell at the coders!</span>" //Shown to the mob when the herald beacon activates var/empower_string = "<span class='heavy_brass'>You have nothing to empower, yell at the coders!</span>" //Shown to the mob when the herald beacon activates
var/agent = FALSE
/mob/living/simple_animal/hostile/clockwork/Initialize() /mob/living/simple_animal/hostile/clockwork/Initialize()
. = ..() . = ..()
@@ -30,7 +29,7 @@
/mob/living/simple_animal/hostile/clockwork/Login() /mob/living/simple_animal/hostile/clockwork/Login()
..() ..()
add_servant_of_ratvar(src, TRUE, !agent) //since marauders get deleted if they die they aren't put in an agent team add_servant_of_ratvar(src, TRUE)
to_chat(src, playstyle_string) to_chat(src, playstyle_string)
if(GLOB.ratvar_approaches) if(GLOB.ratvar_approaches)
to_chat(src, empower_string) to_chat(src, empower_string)

View File

@@ -102,7 +102,5 @@
shield_health_regen = world.time + MARAUDER_SHIELD_REGEN_TIME shield_health_regen = world.time + MARAUDER_SHIELD_REGEN_TIME
return TRUE return TRUE
/mob/living/simple_animal/hostile/clockwork/marauder/agent
agent = TRUE
#undef MARAUDER_SLOWDOWN_PERCENTAGE #undef MARAUDER_SLOWDOWN_PERCENTAGE
#undef MARAUDER_SHIELD_REGEN_TIME #undef MARAUDER_SHIELD_REGEN_TIME

View File

@@ -37,7 +37,6 @@ GLOBAL_LIST_INIT(scripture_states,scripture_states_init_value()) //list of clock
var/sort_priority = 1 //what position the scripture should have in a list of scripture. Should be based off of component costs/reqs, but you can't initial() lists. var/sort_priority = 1 //what position the scripture should have in a list of scripture. Should be based off of component costs/reqs, but you can't initial() lists.
var/chant_slowdown = 0 //slowdown added while chanting var/chant_slowdown = 0 //slowdown added while chanting
var/no_mobility = TRUE //if false user can move while chanting var/no_mobility = TRUE //if false user can move while chanting
var/requires_cult = FALSE //if it can be cast by traitorcultists
//messages for offstation scripture recital, courtesy ratvar's generals(and neovgre) //messages for offstation scripture recital, courtesy ratvar's generals(and neovgre)
var/static/list/neovgre_penalty = list("Go to the station.", "Useless.", "Don't waste time.", "Pathetic.", "Wasteful.") var/static/list/neovgre_penalty = list("Go to the station.", "Useless.", "Don't waste time.", "Pathetic.", "Wasteful.")
@@ -85,9 +84,6 @@ GLOBAL_LIST_INIT(scripture_states,scripture_states_init_value()) //list of clock
/datum/clockwork_scripture/proc/can_recite() //If the words can be spoken /datum/clockwork_scripture/proc/can_recite() //If the words can be spoken
if(!invoker || !slab || invoker.get_active_held_item() != slab) if(!invoker || !slab || invoker.get_active_held_item() != slab)
return FALSE return FALSE
if(!is_servant_of_ratvar(invoker, requires_cult))
to_chat(invoker, "<span class='sevtug'>This kind of energy requires Ratvar's full attention, I'm not a miracle worker. On my own, at least.</span>")
return FALSE
if(!invoker.can_speak_vocal()) if(!invoker.can_speak_vocal())
to_chat(invoker, "<span class='warning'>You are unable to speak the words of the scripture!</span>") to_chat(invoker, "<span class='warning'>You are unable to speak the words of the scripture!</span>")
return FALSE return FALSE
@@ -251,16 +247,12 @@ GLOBAL_LIST_INIT(scripture_states,scripture_states_init_value()) //list of clock
return FALSE return FALSE
return TRUE return TRUE
/datum/clockwork_scripture/create_object/proc/get_spawn_path(mob/user)
return object_path
/datum/clockwork_scripture/create_object/scripture_effects() /datum/clockwork_scripture/create_object/scripture_effects()
var/to_spawn = get_spawn_path(invoker)//in case flavortextchanges
if(creator_message && observer_message) if(creator_message && observer_message)
invoker.visible_message(observer_message, creator_message) invoker.visible_message(observer_message, creator_message)
else if(creator_message) else if(creator_message)
to_chat(invoker, creator_message) to_chat(invoker, creator_message)
var/obj/O = new to_spawn(get_turf(invoker)) var/obj/O = new object_path (get_turf(invoker))
O.ratvar_act() //update the new object so it gets buffed if ratvar is alive O.ratvar_act() //update the new object so it gets buffed if ratvar is alive
if(isitem(O) && put_object_in_hands) if(isitem(O) && put_object_in_hands)
invoker.put_in_hands(O) invoker.put_in_hands(O)

View File

@@ -45,10 +45,6 @@
quickbind = TRUE quickbind = TRUE
quickbind_desc = "Creates a Mania Motor, which causes minor damage and negative mental effects in non-Servants." quickbind_desc = "Creates a Mania Motor, which causes minor damage and negative mental effects in non-Servants."
/datum/clockwork_scripture/create_object/mania_motor/get_spawn_path(mob/user)
if(!is_servant_of_ratvar(user, TRUE))
return /obj/structure/destructible/clockwork/powered/mania_motor/agent
return ..()
//Clockwork Obelisk: Creates a powerful obelisk that can be used to broadcast messages or open a gateway to any servant or clockwork obelisk at a power cost. //Clockwork Obelisk: Creates a powerful obelisk that can be used to broadcast messages or open a gateway to any servant or clockwork obelisk at a power cost.
/datum/clockwork_scripture/create_object/clockwork_obelisk /datum/clockwork_scripture/create_object/clockwork_obelisk
@@ -95,11 +91,6 @@
var/static/time_since_last_marauder = 0 var/static/time_since_last_marauder = 0
var/static/scaled_recital_time = 0 var/static/scaled_recital_time = 0
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/get_spawn_path(mob/user)
if(!is_servant_of_ratvar(user, TRUE))
return /obj/item/clockwork/construct_chassis/clockwork_marauder/agent
return ..()
/datum/clockwork_scripture/create_object/construct/clockwork_marauder/update_construct_limit() /datum/clockwork_scripture/create_object/construct/clockwork_marauder/update_construct_limit()
var/human_servants = 0 var/human_servants = 0
for(var/V in SSticker.mode.servants_of_ratvar) for(var/V in SSticker.mode.servants_of_ratvar)

View File

@@ -62,7 +62,6 @@
sort_priority = 3 sort_priority = 3
quickbind = TRUE quickbind = TRUE
quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it." quickbind_desc = "Creates a Sigil of Submission, which will convert non-Servants that remain on it."
requires_cult = TRUE //no conversion
//Kindle: Charges the slab with blazing energy. It can be released to stun and silence a target. //Kindle: Charges the slab with blazing energy. It can be released to stun and silence a target.
@@ -89,7 +88,6 @@
important = TRUE important = TRUE
quickbind = TRUE quickbind = TRUE
quickbind_desc = "Stuns and mutes a target from a short range." quickbind_desc = "Stuns and mutes a target from a short range."
requires_cult = TRUE //hahahahaha no
//Hateful Manacles: Applies restraints from melee over several seconds. The restraints function like handcuffs and break on removal. //Hateful Manacles: Applies restraints from melee over several seconds. The restraints function like handcuffs and break on removal.
/datum/clockwork_scripture/ranged_ability/hateful_manacles /datum/clockwork_scripture/ranged_ability/hateful_manacles
@@ -188,7 +186,6 @@
quickbind = TRUE quickbind = TRUE
quickbind_desc = "Returns you to Reebe." quickbind_desc = "Returns you to Reebe."
var/client_color var/client_color
requires_cult = TRUE //you don't have one so :shrug:
/datum/clockwork_scripture/abscond/check_special_requirements() /datum/clockwork_scripture/abscond/check_special_requirements()
if(is_reebe(invoker.z)) if(is_reebe(invoker.z))
@@ -243,11 +240,6 @@
quickbind = TRUE quickbind = TRUE
quickbind_desc = "Creates a new Clockwork Slab." quickbind_desc = "Creates a new Clockwork Slab."
/datum/clockwork_scripture/create_object/replicant/get_spawn_path(mob/user)
if(!is_servant_of_ratvar(user, TRUE))
return /obj/item/clockwork/slab/agent
return ..()
//Wraith Spectacles: Creates a pair of wraith spectacles, which grant xray vision but damage vision slowly. //Wraith Spectacles: Creates a pair of wraith spectacles, which grant xray vision but damage vision slowly.
/datum/clockwork_scripture/create_object/wraith_spectacles /datum/clockwork_scripture/create_object/wraith_spectacles

View File

@@ -23,11 +23,6 @@
quickbind = TRUE quickbind = TRUE
quickbind_desc = "Creates a Replica Fabricator, which can convert various objects to Ratvarian variants." quickbind_desc = "Creates a Replica Fabricator, which can convert various objects to Ratvarian variants."
/datum/clockwork_scripture/create_object/replica_fabricator/get_spawn_path(mob/user)
if(!is_servant_of_ratvar(user, TRUE))
creator_message = "You form a replica fabricator. <span class='nezbere'>You can use this to make soul vessels out of positronic brains for soul extraction objectives</span>"
return /obj/item/clockwork/replica_fabricator/agent
return ..()
//Ocular Warden: Creates an ocular warden, which defends a small area near it. //Ocular Warden: Creates an ocular warden, which defends a small area near it.
/datum/clockwork_scripture/create_object/ocular_warden /datum/clockwork_scripture/create_object/ocular_warden
@@ -55,6 +50,7 @@
return FALSE return FALSE
return ..() return ..()
//Vitality Matrix: Creates a sigil which will drain health from nonservants and can use that health to heal or even revive servants. //Vitality Matrix: Creates a sigil which will drain health from nonservants and can use that health to heal or even revive servants.
/datum/clockwork_scripture/create_object/vitality_matrix /datum/clockwork_scripture/create_object/vitality_matrix
descname = "Trap, Damage to Healing" descname = "Trap, Damage to Healing"
@@ -81,10 +77,6 @@
return FALSE return FALSE
return ..() return ..()
/datum/clockwork_scripture/create_object/vitality_matrix/get_spawn_path(mob/user)
if(!is_servant_of_ratvar(user, TRUE))
return /obj/effect/clockwork/sigil/vitality/agent
return ..()
//Judicial Visor: Creates a judicial visor, which can smite an area. //Judicial Visor: Creates a judicial visor, which can smite an area.
/datum/clockwork_scripture/create_object/judicial_visor /datum/clockwork_scripture/create_object/judicial_visor

View File

@@ -14,12 +14,7 @@
debris = list(/obj/item/clockwork/alloy_shards/large = 2, \ debris = list(/obj/item/clockwork/alloy_shards/large = 2, \
/obj/item/clockwork/alloy_shards/small = 2, \ /obj/item/clockwork/alloy_shards/small = 2, \
/obj/item/clockwork/component/geis_capacitor/antennae = 1) /obj/item/clockwork/component/geis_capacitor/antennae = 1)
var/mania_cost = 150 //motor's power cost var/mania_cost = 150
var/agent = FALSE //is the motor restricted from converting
/obj/structure/destructible/clockwork/powered/mania_motor/agent
agent = TRUE
clockwork_desc = "A transmitter that allows Sevtug to whisper into the minds of nearby non-servants, causing a variety of negative mental effects."
/obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user) /obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user)
. = ..() . = ..()

View File

@@ -5,11 +5,9 @@
antagpanel_category = "Clockcult" antagpanel_category = "Clockcult"
job_rank = ROLE_SERVANT_OF_RATVAR job_rank = ROLE_SERVANT_OF_RATVAR
antag_moodlet = /datum/mood_event/cult antag_moodlet = /datum/mood_event/cult
var/datum/action/innate/hierophant/hierophant_network = new var/datum/action/innate/hierophant/hierophant_network = new()
var/datum/team/clockcult/clock_team var/datum/team/clockcult/clock_team
var/make_team = TRUE //This should be only false for tutorial scarabs or traitorcultists var/make_team = TRUE //This should be only false for tutorial scarabs
var/agent = FALSE //Can't use stuff deemed "too dangerous for non-cult rounds"
var/ignore_holy_water = FALSE //Can the cultists be deconverted with holy water? set to no for traitorcultists because they aren't conversion antags
/datum/antagonist/clockcult/silent /datum/antagonist/clockcult/silent
silent = TRUE silent = TRUE
@@ -51,9 +49,6 @@
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/clockcultalr.ogg', 70, FALSE, pressure_affected = FALSE) owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/clockcultalr.ogg', 70, FALSE, pressure_affected = FALSE)
/datum/antagonist/clockcult/on_gain() /datum/antagonist/clockcult/on_gain()
if(agent)
..()//SKIPP
return
var/mob/living/current = owner.current var/mob/living/current = owner.current
SSticker.mode.servants_of_ratvar += owner SSticker.mode.servants_of_ratvar += owner
SSticker.mode.update_servant_icons_added(owner) SSticker.mode.update_servant_icons_added(owner)
@@ -178,9 +173,9 @@
log_admin("[key_name(admin)] has made [key_name(new_owner)] into a servant of Ratvar.") log_admin("[key_name(admin)] has made [key_name(new_owner)] into a servant of Ratvar.")
/datum/antagonist/clockcult/admin_remove(mob/user) /datum/antagonist/clockcult/admin_remove(mob/user)
remove_servant_of_ratvar(owner.current, TRUE)
message_admins("[key_name_admin(user)] has removed clockwork servant status from [key_name_admin(owner)].") message_admins("[key_name_admin(user)] has removed clockwork servant status from [key_name_admin(owner)].")
log_admin("[key_name(user)] has removed clockwork servant status from [key_name(owner)].") log_admin("[key_name(user)] has removed clockwork servant status from [key_name(owner)].")
remove_servant_of_ratvar(owner.current, TRUE)
/datum/antagonist/clockcult/get_admin_commands() /datum/antagonist/clockcult/get_admin_commands()
. = ..() . = ..()
@@ -197,6 +192,17 @@
var/list/objective var/list/objective
var/datum/mind/eminence var/datum/mind/eminence
/datum/team/clockcult/New(starting_members)
. = ..()
START_PROCESSING(SSobj,src)
/datum/team/clockcult/process()
GLOB.scripture_states = scripture_unlock_alert(GLOB.scripture_states)
/datum/team/clockcult/Destroy(force, ...)
STOP_PROCESSING(SSobj,src)
. = ..()
/datum/team/clockcult/proc/check_clockwork_victory() /datum/team/clockcult/proc/check_clockwork_victory()
if(GLOB.clockwork_gateway_activated) if(GLOB.clockwork_gateway_activated)
return TRUE return TRUE

View File

@@ -55,8 +55,6 @@
for(var/I in subtypesof(/datum/action/innate/cult/blood_spell)) for(var/I in subtypesof(/datum/action/innate/cult/blood_spell))
var/datum/action/innate/cult/blood_spell/J = I var/datum/action/innate/cult/blood_spell/J = I
var/cult_name = initial(J.name) var/cult_name = initial(J.name)
if(!iscultist(owner, TRUE) && initial(J.requires_full_power))
continue
possible_spells[cult_name] = J possible_spells[cult_name] = J
possible_spells += "(REMOVE SPELL)" possible_spells += "(REMOVE SPELL)"
entered_spell_name = input(owner, "Pick a blood spell to prepare...", "Spell Choices") as null|anything in possible_spells entered_spell_name = input(owner, "Pick a blood spell to prepare...", "Spell Choices") as null|anything in possible_spells
@@ -97,7 +95,6 @@
var/base_desc //To allow for updating tooltips var/base_desc //To allow for updating tooltips
var/invocation var/invocation
var/health_cost = 0 var/health_cost = 0
var/requires_full_power = FALSE //TRUE if agents can't use it
/datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM) /datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM)
if(health_cost) if(health_cost)
@@ -146,7 +143,6 @@
button_icon_state = "hand" button_icon_state = "hand"
magic_path = "/obj/item/melee/blood_magic/stun" magic_path = "/obj/item/melee/blood_magic/stun"
health_cost = 10 health_cost = 10
requires_full_power = TRUE
/datum/action/innate/cult/blood_spell/teleport /datum/action/innate/cult/blood_spell/teleport
name = "Teleport" name = "Teleport"
@@ -180,7 +176,7 @@
/datum/action/innate/cult/blood_spell/construction /datum/action/innate/cult/blood_spell/construction
name = "Twisted Construction" name = "Twisted Construction"
desc = "Empowers your hand to corrupt certain metalic objects.<br><u>Converts:</u><br>Plasteel into runed metal<br>50 metal into a construct shell<br>30 sheets of reinforced glass into a soulstone<br>Living cyborgs into constructs after a delay<br>Cyborg shells into construct shells<br>Airlocks into brittle runed airlocks after a delay (harm intent)" desc = "Empowers your hand to corrupt certain metalic objects.<br><u>Converts:</u><br>Plasteel into runed metal<br>50 metal into a construct shell<br>Living cyborgs into constructs after a delay<br>Cyborg shells into construct shells<br>Airlocks into brittle runed airlocks after a delay (harm intent)"
button_icon_state = "transmute" button_icon_state = "transmute"
magic_path = "/obj/item/melee/blood_magic/construction" magic_path = "/obj/item/melee/blood_magic/construction"
health_cost = 12 health_cost = 12
@@ -334,7 +330,6 @@
button_icon_state = "manip" button_icon_state = "manip"
charges = 5 charges = 5
magic_path = "/obj/item/melee/blood_magic/manipulator" magic_path = "/obj/item/melee/blood_magic/manipulator"
requires_full_power = TRUE
// The "magic hand" items // The "magic hand" items
@@ -601,7 +596,6 @@
. += {"<u>A sinister spell used to convert:</u>\n . += {"<u>A sinister spell used to convert:</u>\n
Plasteel into runed metal\n Plasteel into runed metal\n
[METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal into a construct shell\n [METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal into a construct shell\n
[RGLASS_TO_SOULSTONE_CONVERSION] reinforced glass into a soul stone\n
Living cyborgs into constructs after a delay\n Living cyborgs into constructs after a delay\n
Cyborg shells into construct shells\n Cyborg shells into construct shells\n
Airlocks into brittle runed airlocks after a delay (harm intent)"} Airlocks into brittle runed airlocks after a delay (harm intent)"}
@@ -611,9 +605,7 @@
var/turf/T = get_turf(target) var/turf/T = get_turf(target)
if(istype(target, /obj/item/stack/sheet/metal)) if(istype(target, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/candidate = target var/obj/item/stack/sheet/candidate = target
if(!iscultist(user, TRUE)) if(candidate.use(METAL_TO_CONSTRUCT_SHELL_CONVERSION))
to_chat(user, "<span class='warning'>The Veil is too strong here for you to effectively make constructs...</span>")
else if(candidate.use(METAL_TO_CONSTRUCT_SHELL_CONVERSION))
uses-- uses--
to_chat(user, "<span class='warning'>A dark cloud emanates from your hand and swirls around the metal, twisting it into a construct shell!</span>") to_chat(user, "<span class='warning'>A dark cloud emanates from your hand and swirls around the metal, twisting it into a construct shell!</span>")
new /obj/structure/constructshell(T) new /obj/structure/constructshell(T)
@@ -621,21 +613,6 @@
else else
to_chat(user, "<span class='warning'>You need [METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal to produce a construct shell!</span>") to_chat(user, "<span class='warning'>You need [METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal to produce a construct shell!</span>")
return return
else if(user.mind.has_antag_datum(/datum/antagonist/cult/agent) && (istype(target, /obj/item/implanter) || istype(target, /obj/item/implantcase)))
uses--
to_chat(user, "<span class='warning'>A dark cloud emanates from your hand, [target] falling into it and a small soulstone fragment falling out!</span>")
new /obj/item/implanter/cult/blood(T)
qdel(target)
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
else if(user.mind.has_antag_datum(/datum/antagonist/cult/agent) && istype(target, /obj/item/stack/sheet/rglass))
var/obj/item/stack/sheet/candidate = target
if(candidate.use(RGLASS_TO_SOULSTONE_CONVERSION))
uses--
to_chat(user, "<span class='warning'>A dark cloud emanates from your hand and swirls around the metal, twisting it into a soulstone!</span>")
new /obj/item/soulstone(T)
SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
else
to_chat(user, "<span class='warning'>You need [RGLASS_TO_SOULSTONE_CONVERSION] reinforced glass to produce a soulstone!</span>")
else if(istype(target, /obj/item/stack/sheet/plasteel)) else if(istype(target, /obj/item/stack/sheet/plasteel))
var/obj/item/stack/sheet/plasteel/candidate = target var/obj/item/stack/sheet/plasteel/candidate = target
var/quantity = candidate.amount var/quantity = candidate.amount
@@ -835,9 +812,7 @@
to_chat(user, "<span class='cultitalic'>You need a free hand for this rite!</span>") to_chat(user, "<span class='cultitalic'>You need a free hand for this rite!</span>")
qdel(rite) qdel(rite)
if("Blood Beam (500)") if("Blood Beam (500)")
if(!iscultist(user, TRUE)) if(uses < BLOOD_BEAM_COST)
to_chat(user, "<span class='warning'>The Veils is not weak enough here to call upon this power.</span>")
else if(uses < BLOOD_BEAM_COST)
to_chat(user, "<span class='cultitalic'>You need [BLOOD_BEAM_COST] charges to perform this rite.</span>") to_chat(user, "<span class='cultitalic'>You need [BLOOD_BEAM_COST] charges to perform this rite.</span>")
else else
var/obj/rite = new /obj/item/blood_beam() var/obj/rite = new /obj/item/blood_beam()

View File

@@ -11,16 +11,14 @@
job_rank = ROLE_CULTIST job_rank = ROLE_CULTIST
var/ignore_implant = FALSE var/ignore_implant = FALSE
var/give_equipment = FALSE var/give_equipment = FALSE
var/make_team = TRUE //do we make a team?
var/datum/team/cult/cult_team var/datum/team/cult/cult_team
var/ignore_holy_water = FALSE //is deconversion impossible via holywater?
var/agent = FALSE //can the cult use its full power?
/datum/antagonist/cult/get_team() /datum/antagonist/cult/get_team()
return cult_team return cult_team
/datum/antagonist/cult/create_team(datum/team/cult/new_team) /datum/antagonist/cult/create_team(datum/team/cult/new_team)
if(!new_team && make_team) if(!new_team)
//todo remove this and allow admin buttons to create more than one cult //todo remove this and allow admin buttons to create more than one cult
for(var/datum/antagonist/cult/H in GLOB.antagonists) for(var/datum/antagonist/cult/H in GLOB.antagonists)
if(!H.owner) if(!H.owner)
@@ -31,7 +29,7 @@
cult_team = new /datum/team/cult cult_team = new /datum/team/cult
cult_team.setup_objectives() cult_team.setup_objectives()
return return
if(make_team && !istype(new_team)) if(!istype(new_team))
stack_trace("Wrong team type passed to [type] initialization.") stack_trace("Wrong team type passed to [type] initialization.")
cult_team = new_team cult_team = new_team
@@ -55,18 +53,17 @@
owner.announce_objectives() owner.announce_objectives()
/datum/antagonist/cult/on_gain() /datum/antagonist/cult/on_gain()
. = ..()
var/mob/living/current = owner.current var/mob/living/current = owner.current
add_objectives()
if(give_equipment) if(give_equipment)
equip_cultist(TRUE) equip_cultist(TRUE)
if(cult_team) SSticker.mode.cult += owner // Only add after they've been given objectives
add_objectives() SSticker.mode.update_cult_icons_added(owner)
SSticker.mode.cult += owner // Only add after they've been given objectives current.log_message("has been converted to the cult of Nar'Sie!", LOG_ATTACK, color="#960000")
SSticker.mode.update_cult_icons_added(owner)
current.log_message("has been converted to the cult of Nar'Sie!", LOG_ATTACK, color="#960000")
if(cult_team?.blood_target && cult_team.blood_target_image && current.client) if(cult_team.blood_target && cult_team.blood_target_image && current.client)
current.client.images += cult_team.blood_target_image current.client.images += cult_team.blood_target_image
. = ..()
/datum/antagonist/cult/proc/equip_cultist(metal=TRUE) /datum/antagonist/cult/proc/equip_cultist(metal=TRUE)
@@ -108,14 +105,13 @@
current = mob_override current = mob_override
current.faction |= "cult" current.faction |= "cult"
current.grant_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST) current.grant_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST)
if(!cult_team?.cult_master) if(!cult_team.cult_master)
vote.Grant(current) vote.Grant(current)
communion.Grant(current) communion.Grant(current)
if(ishuman(current)) if(ishuman(current))
magic.Grant(current) magic.Grant(current)
if(cult_team) current.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) if(cult_team.cult_risen)
if(cult_team?.cult_risen)
cult_team.rise(current) cult_team.rise(current)
if(cult_team.cult_ascendent) if(cult_team.cult_ascendent)
cult_team.ascend(current) cult_team.ascend(current)
@@ -146,7 +142,7 @@
owner.current.visible_message("<span class='deconversion_message'>[owner.current] looks like [owner.current.p_theyve()] just reverted to [owner.current.p_their()] old faith!</span>", null, null, null, owner.current) owner.current.visible_message("<span class='deconversion_message'>[owner.current] looks like [owner.current.p_theyve()] just reverted to [owner.current.p_their()] old faith!</span>", null, null, null, owner.current)
to_chat(owner.current, "<span class='userdanger'>An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.</span>") to_chat(owner.current, "<span class='userdanger'>An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.</span>")
owner.current.log_message("has renounced the cult of Nar'Sie!", LOG_ATTACK, color="#960000") owner.current.log_message("has renounced the cult of Nar'Sie!", LOG_ATTACK, color="#960000")
if(cult_team && cult_team.blood_target && cult_team.blood_target_image && owner.current.client) if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client)
owner.current.client.images -= cult_team.blood_target_image owner.current.client.images -= cult_team.blood_target_image
. = ..() . = ..()
@@ -209,13 +205,13 @@
var/mob/living/current = owner.current var/mob/living/current = owner.current
if(mob_override) if(mob_override)
current = mob_override current = mob_override
if(!cult_team?.reckoning_complete) if(!cult_team.reckoning_complete)
reckoning.Grant(current) reckoning.Grant(current)
bloodmark.Grant(current) bloodmark.Grant(current)
throwing.Grant(current) throwing.Grant(current)
current.update_action_buttons_icon() current.update_action_buttons_icon()
current.apply_status_effect(/datum/status_effect/cult_master) current.apply_status_effect(/datum/status_effect/cult_master)
if(cult_team?.cult_risen) if(cult_team.cult_risen)
cult_team.rise(current) cult_team.rise(current)
if(cult_team.cult_ascendent) if(cult_team.cult_ascendent)
cult_team.ascend(current) cult_team.ascend(current)

View File

@@ -74,7 +74,7 @@
/datum/action/innate/cult/mastervote/IsAvailable() /datum/action/innate/cult/mastervote/IsAvailable()
var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
if(!C?.cult_team || C.cult_team.cult_vote_called || !ishuman(owner)) if(!C || C.cult_team.cult_vote_called || !ishuman(owner))
return FALSE return FALSE
return ..() return ..()
@@ -82,9 +82,6 @@
var/choice = alert(owner, "The mantle of leadership is heavy. Success in this role requires an expert level of communication and experience. Are you sure?",, "Yes", "No") var/choice = alert(owner, "The mantle of leadership is heavy. Success in this role requires an expert level of communication and experience. Are you sure?",, "Yes", "No")
if(choice == "Yes" && IsAvailable()) if(choice == "Yes" && IsAvailable())
var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
if(!C.cult_team)
to_chat(owner, "<span class='cult bold'>The Veil is too strong for you to make use of this power.</span>")
return
pollCultists(owner,C.cult_team) pollCultists(owner,C.cult_team)
/proc/pollCultists(var/mob/living/Nominee,datum/team/cult/team) //Cult Master Poll /proc/pollCultists(var/mob/living/Nominee,datum/team/cult/team) //Cult Master Poll
@@ -154,9 +151,6 @@
var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
if(!antag) if(!antag)
return return
if(!antag.cult_team)
to_chat(owner, "<span class='cult bold'>Your team is too small for this to be worthwhile.</span>")
return
for(var/i in 1 to 4) for(var/i in 1 to 4)
chant(i) chant(i)
var/list/destinations = list() var/list/destinations = list()
@@ -267,10 +261,6 @@
return FALSE return FALSE
var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE) var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
if(!C.cult_team)
to_chat(ranged_ability_user, "<span class='cultlarge'>Your team is too small for this to be worthwhile.</span>")
remove_ranged_ability()
return
if(target in view(7, get_turf(ranged_ability_user))) if(target in view(7, get_turf(ranged_ability_user)))
if(C.cult_team.blood_target) if(C.cult_team.blood_target)
@@ -341,7 +331,7 @@
/datum/action/innate/cult/ghostmark/Activate() /datum/action/innate/cult/ghostmark/Activate()
var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE) var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
if(C.cult_team.blood_target) if(C.cult_team.blood_target)
if(cooldown > world.time) if(cooldown>world.time)
reset_blood_target(C.cult_team) reset_blood_target(C.cult_team)
to_chat(owner, "<span class='cultbold'>You have cleared the cult's blood target!</span>") to_chat(owner, "<span class='cultbold'>You have cleared the cult's blood target!</span>")
deltimer(C.cult_team.blood_target_reset_timer) deltimer(C.cult_team.blood_target_reset_timer)

View File

@@ -102,11 +102,7 @@
if(cooldowntime > world.time) if(cooldowntime > world.time)
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>") to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return return
var/choice var/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water")
if(user.mind.has_antag_datum(/datum/antagonist/cult/agent))
choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Flask of Unholy Water")
else
choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water")
var/list/pickedtype = list() var/list/pickedtype = list()
switch(choice) switch(choice)
if("Eldritch Whetstone") if("Eldritch Whetstone")
@@ -143,8 +139,8 @@
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>") to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return return
var/choice var/choice
if(user.mind.has_antag_datum(/datum/antagonist/cult/agent)) if(user.mind.has_antag_datum(/datum/antagonist/cult/master))
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe", "Flagellant's Robe") choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
else else
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield") choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
var/list/pickedtype = list() var/list/pickedtype = list()
@@ -260,11 +256,7 @@
if(cooldowntime > world.time) if(cooldowntime > world.time)
to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>") to_chat(user, "<span class='cult italic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
return return
var/choice var/choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Shuttle Curse","Veil Walker Set")
if(user.mind.has_antag_datum(/datum/antagonist/cult/agent))
choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Veil Walker Set")
else
choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Shuttle Curse","Veil Walker Set")
var/list/pickedtype = list() var/list/pickedtype = list()
switch(choice) switch(choice)
if("Zealot's Blindfold") if("Zealot's Blindfold")

View File

@@ -59,9 +59,6 @@ This file contains the cult dagger and rune list code
rune_to_scribe = GLOB.rune_types[entered_rune_name] rune_to_scribe = GLOB.rune_types[entered_rune_name]
if(!rune_to_scribe) if(!rune_to_scribe)
return return
if(!iscultist(user, initial(rune_to_scribe.requires_full_power)))
to_chat(user, "<span class='warning'>You aren't strongly connected enough to Nar'sie to do draw this.</span>")
return
if(initial(rune_to_scribe.req_keyword)) if(initial(rune_to_scribe.req_keyword))
chosen_keyword = stripped_input(user, "Enter a keyword for the new rune.", "Words of Power") chosen_keyword = stripped_input(user, "Enter a keyword for the new rune.", "Words of Power")
if(!chosen_keyword) if(!chosen_keyword)

View File

@@ -37,7 +37,6 @@ Runes can either be invoked by one's self or with many different cultists. Each
var/req_keyword = 0 //If the rune requires a keyword - go figure amirite var/req_keyword = 0 //If the rune requires a keyword - go figure amirite
var/keyword //The actual keyword for the rune var/keyword //The actual keyword for the rune
var/requires_full_power = FALSE //can the rune be used by cult agents? if TRUE it can't
/obj/effect/rune/Initialize(mapload, set_keyword) /obj/effect/rune/Initialize(mapload, set_keyword)
. = ..() . = ..()
@@ -192,7 +191,6 @@ structure_check() searches for nearby cultist structures required for the invoca
color = RUNE_COLOR_OFFER color = RUNE_COLOR_OFFER
req_cultists = 1 req_cultists = 1
rune_in_use = FALSE rune_in_use = FALSE
requires_full_power = TRUE
/obj/effect/rune/convert/do_invoke_glow() /obj/effect/rune/convert/do_invoke_glow()
return return
@@ -487,7 +485,6 @@ structure_check() searches for nearby cultist structures required for the invoca
scribe_delay = 300 //how long the rune takes to create scribe_delay = 300 //how long the rune takes to create
scribe_damage = 20 //how much damage you take doing it scribe_damage = 20 //how much damage you take doing it
var/used = FALSE var/used = FALSE
requires_full_power = TRUE
/obj/effect/rune/narsie/Initialize(mapload, set_keyword) /obj/effect/rune/narsie/Initialize(mapload, set_keyword)
. = ..() . = ..()
@@ -886,9 +883,6 @@ structure_check() searches for nearby cultist structures required for the invoca
var/turf/T = get_turf(src) var/turf/T = get_turf(src)
var/choice = alert(user,"You tear open a connection to the spirit realm...",,"Summon a Cult Ghost","Ascend as a Dark Spirit","Cancel") var/choice = alert(user,"You tear open a connection to the spirit realm...",,"Summon a Cult Ghost","Ascend as a Dark Spirit","Cancel")
if(choice == "Summon a Cult Ghost") if(choice == "Summon a Cult Ghost")
if(user.mind.has_antag_datum(/datum/antagonist/cult/agent)) //agents can use the cult meta ability but not summon murder ghosts
to_chat(user, "<span class='cultitalic'><b>The veil is too strong to summon cult ghosts.</b></span>")
return
var/area/A = get_area(T) var/area/A = get_area(T)
if(A.map_name == "Space" || is_mining_level(T.z)) if(A.map_name == "Space" || is_mining_level(T.z))
to_chat(user, "<span class='cultitalic'><b>The veil is not weak enough here to manifest spirits, you must be on station!</b></span>") to_chat(user, "<span class='cultitalic'><b>The veil is not weak enough here to manifest spirits, you must be on station!</b></span>")
@@ -992,7 +986,6 @@ structure_check() searches for nearby cultist structures required for the invoca
color = RUNE_COLOR_DARKRED color = RUNE_COLOR_DARKRED
req_cultists = 3 req_cultists = 3
scribe_delay = 100 scribe_delay = 100
requires_full_power = TRUE //might make this available later
/obj/effect/rune/apocalypse/invoke(var/list/invokers) /obj/effect/rune/apocalypse/invoke(var/list/invokers)
if(rune_in_use) if(rune_in_use)

View File

@@ -1,165 +0,0 @@
#define CULT_TEAM_CLOCK /datum/antagonist/clockcult/agent
#define CULT_TEAM_BLOOD /datum/antagonist/cult/agent
/datum/objective/implant //implant x dudes with guvax implants
name = "clockcult implant"
explanation_text = "<span class='sevtug'>STab some dudes with these funny things</span>"
var/dudes_to_stab = 0 //list of people who need to be implanted to win
var/list/datum/mind/dudes_stabbed = list() //list of people with the implants
/datum/objective/implant/New()
..()
dudes_to_stab = SSticker.mode.agent_scaling * rand(1,5) //1 to 5 implantees per agent
update_explanation_text()
/datum/objective/implant/update_explanation_text()
explanation_text = "<span class='sevtug'>Implant at least [dudes_to_stab] of these heretics with guvax capacitors, I'll need them later. Use a replica fabricator on an implanter to make one, and try to keep them alive please and thank you.</span>"
/datum/objective/implant/check_completion()
var/successful_stabs = 0
for(var/datum/mind/M in dudes_stabbed)
if(considered_alive(M))
successful_stabs++
else
successful_stabs += 0.5 //still get points if they're dead
return successful_stabs >= dudes_to_stab
/datum/objective/implant/blood
name = "bloodcult implant"
/datum/objective/implant/blood/update_explanation_text()
explanation_text = "<span class='cultbold'>Implant at least [dudes_to_stab] of the nonbelievers with soulshards created from using twisted construction on implanters. Keeping them alive is preferable.</span>"
/datum/antagonist/cult_implanted //used for guvax implanted gamers to stop them from being twits
name = "Capacitor-seeded"
show_in_antagpanel = FALSE
var/flavor_message = "<span class='sevtug'>You need to get away from here. Run.</span>" //message displayed on being implanted
/datum/antagonist/cult_implanted/proc/forge_objectives()
var/datum/objective/keep_implant/I = new
I.target_implant = locate(/obj/item/implant/cult) in owner.current?.implants
I.owner = owner
I.update_explanation_text()
add_objective(I)
add_objective(new/datum/objective/survive)
/datum/antagonist/cult_implanted/on_gain()
forge_objectives()
. = ..()
/datum/antagonist/cult_implanted/greet()
to_chat(owner, "[flavor_message]\n\
<span class='boldwarning'>You prioritize flight over fight, and use direct confrontation as a last resort!</span>") //attempt to stop people from just stabbing the cultists the second they get up
owner.announce_objectives()
/datum/antagonist/cult_implanted/proc/add_objective(datum/objective/O)
objectives += O
/datum/antagonist/cult_implanted/proc/remove_objective(datum/objective/O)
objectives -= O
/datum/objective/keep_implant
name = "no implant removal"
explanation_text = "Don't have this implant removed."
var/obj/item/implant/target_implant //implant targetted by the objective, if it's removed it fails the objective
/datum/objective/keep_implant/update_explanation_text()
explanation_text = "You cannot allow [target_implant] to be removed from your body."
/datum/objective/keep_implant/check_completion()
for(var/obj/item/implant/I in owner.current?.implants)
if(I == target_implant)
return TRUE
return FALSE
/obj/item/implanter/cult //used to hold guvax implant
name = "guvax capacitor"
desc = "A strange brass object that looks vaguely similar to an antlion. The tips look sharp."
var/clockwork_desc = "A guvax capacitor, which can be implanted into heretics to increase Sevtug's sway over their minds." //used for flavortext
var/blood_desc = "A mind-altering implant used by a lesser force." //also used for flavortext
icon = 'icons/obj/clockwork_objects.dmi'
icon_state = "geis_capacitor"
imp_type = /obj/item/implant/cult
/obj/item/implanter/cult/update_icon()
return
/obj/item/implanter/cult/examine(mob/user)
if(clockwork_desc && (is_servant_of_ratvar(user) || isobserver(user)))
desc = clockwork_desc
if(blood_desc && (iscultist(user)) || (istype(src, /obj/item/implanter/cult/blood) && isobserver(user)))
desc = blood_desc
. = ..()
desc = initial(desc)
/obj/item/implanter/cult/attackby(obj/item/W, mob/user, params)
return
/obj/item/implanter/cult/attack(mob/living/M, mob/user)
..()
if(!imp)
qdel(src)
/obj/item/implant/cult
name = "guvax capacitor"
activated = FALSE
var/linkedantag = /datum/antagonist/cult_implanted //antag given to implantee
var/cult_team = CULT_TEAM_CLOCK
var/datum/team/linkedteam //team that gets points
var/break_sound = 'sound/magic/clockwork/anima_fragment_death.ogg' //sound when removed
/obj/item/implant/cult/New()
..()
switch(cult_team)
if(CULT_TEAM_CLOCK)
linkedteam = SSticker.mode.clock_agent_team
if(CULT_TEAM_BLOOD)
linkedteam = SSticker.mode.blood_agent_team
/obj/item/implant/cult/can_be_implanted_in(mob/living/target)
if(is_servant_of_ratvar(target) || iscultist(target) || !target.mind || HAS_TRAIT(target, TRAIT_MINDSHIELD) || target.mind.has_antag_datum(/datum/antagonist/cult_implanted))//cannot implant clockies, bloodcultists, mindless, or mindshielded
return FALSE
. = ..()
/obj/item/implant/cult/implant(mob/living/target, mob/user, silent = FALSE, force = FALSE)
if(!user.mind.has_antag_datum(cult_team))
return
. = ..()
if(.)
var/datum/mind/M = target.mind
M.add_antag_datum(linkedantag)
for(var/datum/objective/implant/O in linkedteam?.objectives)
O.dudes_stabbed += M
target.SetSleeping(200)
/obj/item/implant/cult/removed(mob/living/source, silent = FALSE, special = 0)
if(..())
source.visible_message("<span class='warning'>[src] shatters as it is removed!</span>")
playsound(source, break_sound, 20, 1)
QDEL_NULL(src)
/datum/antagonist/cult_implanted/blood
name = "Soul-seeded"
flavor_message = "<span class ='cultbold'>\"Run, insect. Your time will come.\"</span>"
/obj/item/implanter/cult/blood
name = "soulshard"
desc = "A small red crystal with pointy ends"
clockwork_desc = "A mind-altering implant used by our enemy"
blood_desc = "A small soulstone, incapable of holding a soul, but can modify one to suit the Geometer's needs"
icon = 'icons/obj/objects.dmi'
icon_state = "modkit_crystal"
imp_type = /obj/item/implant/cult/blood
/obj/item/implant/cult/blood
name = "soulshard"
linkedantag = /datum/antagonist/cult_implanted/blood
cult_team = CULT_TEAM_BLOOD
break_sound = 'sound/effects/glassbr2.ogg'
#undef CULT_TEAM_CLOCK
#undef CULT_TEAM_BLOOD

View File

@@ -1,155 +0,0 @@
/datum/objective/soul_extraction //yeet some fucker's brain with a soul vessel
name = "soul extraction"
var/obj/item/mmi/posibrain/soul_vessel/agent/linked_vessel
explanation_text = "<span class='nezbere'>tear out some fucker's brain hahaha</span>"
/datum/objective/soul_extraction/New()
..()
target = find_target_by_role(role = ROLE_CLOCK_AGENT, role_type = TRUE, invert = TRUE)
update_explanation_text()
/datum/objective/soul_extraction/update_explanation_text()
if(!target)
explanation_text = "Free Objective"
else
explanation_text = "<span class='nezbere'>Extract the brain of [target], the [target.assigned_role] into a soul vessel. You'll need use a replica fabricator on a positronic brain to create the soul vessel.</span>"
/datum/objective/soul_extraction/admin_edit(mob/admin)
admin_simple_target_pick(admin)
/datum/objective/soul_extraction/check_completion()
var/list/datum/mind/owners = get_owners()
if(!target)
return TRUE
for(var/datum/mind/M in owners)
if(!isliving(M.current))
continue
var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. also gets the brain if it's inside a borg.
for(var/obj/item/mmi/posibrain/soul_vessel/agent/S in all_items) //Check for items
if(S == linked_vessel)
return TRUE
return FALSE
/obj/item/mmi/posibrain/soul_vessel/agent
clockwork_desc = "A soul vessel, usable to rip a mind from an unconscious or dead body for storage. Use this in-hand to configure it to a target."
autoping = FALSE
agent = TRUE
var/datum/objective/soul_extraction/linked_objective //objective the vessel is currently linked to after getting a mind successfully
/obj/item/mmi/posibrain/soul_vessel/agent/attack_ghost(mob/dead/observer/user) //lol
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_NO_ATTACK_HAND)
return TRUE
if(user.client)
if(IsAdminGhost(user))
attack_ai(user)
else if(user.client.prefs.inquisitive_ghost)
user.examinate(src)
return FALSE
/obj/item/mmi/posibrain/soul_vessel/agent/attack(mob/living/target, mob/living/carbon/human/user)
if(!is_servant_of_ratvar(user))
to_chat(user, "<span class='warning'>You ineffectively slap [target] with [src].</span>")
return FALSE
if(braintype)
to_chat(user, "<span class='nezbere'>This vessel is already filled!</span>")
return
var/datum/objective/soul_extraction/linked_objective
var/datum/team/T = SSticker.mode.clock_agent_team
for(var/datum/objective/soul_extraction/O in T?.objectives)
if(O.target == target)
linked_objective = O
break
if(!linked_objective)
to_chat(user, "<span class='nezbere'>This is not the mind we are looking for.</span>")
return
var/mob/living/carbon/human/H = target
if(H.stat == CONSCIOUS)
to_chat(user, "<span class='warning'>[H] must be dead or unconscious for you to claim [H.p_their()] mind!</span>")
return
if(H.head)
var/obj/item/I = H.head
if(I.flags_inv & HIDEHAIR) //they're wearing a hat that covers their skull
to_chat(user, "<span class='warning'>[H]'s head is covered, remove [H.p_their()] [H.head] first!</span>")
return
if(H.wear_mask)
var/obj/item/I = H.wear_mask
if(I.flags_inv & HIDEHAIR) //they're wearing a mask that covers their skull
to_chat(user, "<span class='warning'>[H]'s head is covered, remove [H.p_their()] [H.wear_mask] first!</span>")
return
var/obj/item/bodypart/head/HE = H.get_bodypart(BODY_ZONE_HEAD)
if(!HE) //literally headless
to_chat(user, "<span class='warning'>[H] has no head, and thus no mind to claim!</span>")
return
var/obj/item/organ/brain/B = H.getorgan(/obj/item/organ/brain)
if(!B) //either somebody already got to them or robotics did
to_chat(user, "<span class='warning'>[H] has no brain, and thus no mind to claim!</span>")
return
playsound(H, 'sound/misc/splort.ogg', 60, 1, -1)
playsound(H, 'sound/magic/clockwork/anima_fragment_attack.ogg', 40, 1, -1) //BONK
H.fakedeath("soul_vessel") //we want to make sure they don't deathgasp and maybe possibly explode
H.death()
H.cure_fakedeath("soul_vessel")
H.apply_status_effect(STATUS_EFFECT_SIGILMARK)
picked_name = "Slave"
braintype = picked_name
brainmob.timeofhostdeath = H.timeofdeath
user.visible_message("<span class='warning'>[user] presses [src] to [H]'s head, ripping through the skull and carefully extracting the brain!</span>", \
"<span class='brass'>You extract [H]'s consciousness from [H.p_their()] body, trapping it in the soul vessel.</span>")
to_chat(user, "<span class='nezbere'>That will do. Do not lose it.</span>")
transfer_personality(H)
brainmob.fully_replace_character_name(null, "[braintype] [H.real_name]")
name = "[initial(name)] ([brainmob.name])"
B.Remove(H)
qdel(B)
H.update_hair()
linked_objective.linked_vessel = src //we did it boys we saved the universe
icon_state = "soul_vessel-occupied" //stuff here in case the captured person goes catatonic
dead_message = "<span class='brass'>Its cogwheel struggles to keep turning, but refuses to stop</span>"
/obj/item/mmi/posibrain/soul_vessel/agent/attacked_by(obj/item/I, mob/user)
. = ..()
if(user.mind.has_antag_datum(/datum/antagonist/cult/agent) && istype(I, /obj/item/soulstone))
var/obj/item/soulstone/S = I
var/datum/team/T = SSticker.mode.blood_agent_team
for(var/datum/objective/soulshard/O in T?.objectives)
if(O.target == brainmob.mind)
O.linked_stone = S
to_chat(user, "<span class='cultlarge'>\"Perfect. This is the one we need. Do not lose it.\"</span>")
log_combat(user, brainmob, "captured [brainmob.name]'s soul", src)
S.transfer_soul("VICTIM", brainmob, user)
qdel(src)
break
/datum/objective/soulshard
name = "soulshard"
var/obj/item/soulstone/linked_stone
explanation_text = "<span class='cultbold'>FETCH ME THEIR SOULSSSSSSSS</span>"
/datum/objective/soulshard/New()
..()
target = find_target_by_role(role = ROLE_BLOOD_AGENT, role_type = TRUE, invert = TRUE)
update_explanation_text()
/datum/objective/soulshard/update_explanation_text()
if(!target)
explanation_text = "Free Objective"
else
explanation_text = "<span class='cultbold'>Attain a soulstone and use it to capture [target]'s soul. They are occupied as a [target.assigned_role]. You can get soulstones by using twisted construction on 30 sheets of reinforced glass.</span>"
/datum/objective/soulshard/check_completion()
var/list/datum/mind/owners = get_owners()
if(!target)
return TRUE
for(var/datum/mind/M in owners)
if(!isliving(M.current))
continue
var/list/all_items = M.current.GetAllContents() //this should get things in cheesewheels, books, etc. also gets the brain if it's inside a borg.
for(var/obj/item/soulstone/S in all_items) //Check for items
if(S == linked_stone)
return TRUE
return FALSE

View File

@@ -1,58 +0,0 @@
/datum/antagonist/cult/agent
name = "Blood Agent"
antagpanel_category = "Blood Agent"
make_team = FALSE
agent = TRUE
ignore_holy_water = TRUE
/datum/antagonist/cult/agent/on_gain()
SSticker.mode.bloodagents += owner
SSticker.mode.update_cult_icons_added(owner)
equip_cultist(FALSE)
owner.special_role = ROLE_BLOOD_AGENT
..()
/datum/antagonist/cult/agent/greet()
if(considered_alive(owner))
to_chat(owner, "<span class='cultlarge'>\"These fools are in possession of some things I want. You are here to retrieve them for me.\
The veil is not weak enough to allow much support in this area, so you will be unable to convert, use constructs or some spells. \
Additionally, you may be in contact with some heretical forces. Do not get yourselves killed.\"</span>")
owner.current.playsound_local(get_turf(owner.current),'sound/ambience/antag/assimilation.ogg' , 100, FALSE, pressure_affected = FALSE)
owner.announce_objectives()
/datum/antagonist/cult/agent/on_removal()
SSticker.mode.blood_agent_team.remove_member(owner)
SSticker.mode.bloodagents -= owner
. = ..()
/datum/antagonist/cult/agent/admin_add(datum/mind/new_owner, mob/admin)
if(!SSticker.mode.blood_agent_team)
SSticker.mode.blood_agent_team = new()
new_owner.add_antag_datum(/datum/antagonist/cult/agent)
SSticker.mode.blood_agent_team.add_member(new_owner)
message_admins("[key_name_admin(admin)] has made [key_name_admin(new_owner)] into a Blood Agent.")
log_admin("[key_name(admin)] has made [key_name(new_owner)] into a Blood Agent.")
/datum/antagonist/cult/agent/admin_remove(mob/user)
message_admins("[key_name_admin(user)] has removed blood agent status from [key_name_admin(owner)].")
log_admin("[key_name(user)] has removed blood agent status from [key_name(owner)].")
owner.remove_antag_datum(/datum/antagonist/cult/agent)
/datum/team/blood_agents
name = "Blood Agents"
/datum/team/blood_agents/proc/forge_blood_objectives()
objectives = list()
add_objective(new/datum/objective/soulshard)
add_objective(new/datum/objective/implant/blood)
add_objective(new/datum/objective/escape/onesurvivor/bloodagent)
return
/datum/team/blood_agents/proc/add_objective(datum/objective/O)
O.team = src
O.update_explanation_text()
objectives += O
/datum/objective/escape/onesurvivor/bloodagent
name = "escape blood agent"
explanation_text = "<span class='cultbold'>Escape alive and out of custody.</span>"
team_explanation_text = "<span class='cultbold'>Escape with your entire team intact and at least one member alive. Do not get captured.</span>"

View File

@@ -1,106 +0,0 @@
/datum/antagonist/clockcult/agent
name = "ClockCult Agent"
antagpanel_category = "Clock Agent"
make_team = FALSE
agent = TRUE
ignore_holy_water = TRUE
/datum/antagonist/clockcult/agent/on_gain()
SSticker.mode.clockagents += owner
SSticker.mode.update_servant_icons_added(owner)
equip_clock_agent()
owner.special_role = ROLE_CLOCK_AGENT
..()
/datum/antagonist/clockcult/agent/greet()
if(considered_alive(owner))
to_chat(owner, "<span class='sevtug'>Here's the deal; Rats wants some stuff from this station and he's got me herding you idiots to get it. \
We're running on fumes especially this far out so you'll be missing some scriptures, mainly the ones that make more cultists. Just finish our little shopping list and make a getaway. \
There's some minds I can sense that seem to be stronger than the others, probably being manipulated by our enemy. I shouldn't have to say this more than once: Be. Careful.</span>")
owner.current.playsound_local(get_turf(owner.current),'sound/effects/screech.ogg' , 100, FALSE, pressure_affected = FALSE)
owner.announce_objectives()
/datum/antagonist/clockcult/agent/on_removal()
SSticker.mode.clock_agent_team.remove_member(owner)
SSticker.mode.clockagents -= owner
. = ..()
/datum/antagonist/clockcult/agent/admin_add(datum/mind/new_owner, mob/admin)
if(!SSticker.mode.clock_agent_team)
SSticker.mode.clock_agent_team = new()
add_servant_of_ratvar(new_owner.current, TRUE, FALSE, TRUE)
SSticker.mode.clock_agent_team.add_member(owner)
message_admins("[key_name_admin(admin)] has made [key_name_admin(new_owner)] into a Clockwork Agent.")
log_admin("[key_name(admin)] has made [key_name(new_owner)] into a Clockwork Agent.")
/datum/antagonist/clockcult/agent/admin_remove(mob/user)
message_admins("[key_name_admin(user)] has removed clockwork agent status from [key_name_admin(owner)].")
log_admin("[key_name(user)] has removed clockwork agent status from [key_name(owner)].")
remove_servant_of_ratvar(owner.current, TRUE)
/datum/antagonist/clockcult/agent/proc/equip_clock_agent()
var/mob/living/M = owner.current
if(!M || !ishuman(M))
return FALSE
var/mob/living/carbon/human/L = M
var/obj/item/clockwork/slab/agent/S = new
var/slot = "At your feet"
var/list/slots = list("In your left pocket" = SLOT_L_STORE, "In your right pocket" = SLOT_R_STORE, "In your backpack" = SLOT_IN_BACKPACK, "On your belt" = SLOT_BELT)
if(ishuman(L))
var/mob/living/carbon/human/H = L
slot = H.equip_in_one_of_slots(S, slots)
if(slot == "In your backpack")
slot = "In your [H.back.name]"
if(slot == "At your feet")
if(!S.forceMove(get_turf(L)))
qdel(S)
if(S && !QDELETED(S))
to_chat(L, "<span class='alloy'>[slot] is a <b>clockwork slab</b>, a multipurpose tool used to construct machines and invoke ancient words of power. If this is your first time \
as a servant, you can find a concise tutorial in the Recollection category of its interface.</span>")
return S
/datum/antagonist/clockcult/agent/admin_give_slab(mob/admin)
if(!equip_clock_agent(owner.current))
to_chat(admin, "<span class='warning'>Failed to outfit [owner.current]!</span>")
else
to_chat(admin, "<span class='notice'>Successfully gave [owner.current] a slab!</span>")
/datum/team/clock_agents
name = "Clockwork Agents"
/datum/team/clock_agents/New(starting_members)
. = ..()
adjust_clockwork_power(1000)
/datum/team/clock_agents/proc/forge_clock_objectives()
objectives = list()
var/list/active_ais = active_ais()
if(active_ais.len && prob(50))
var/datum/objective/steal/AI = new
AI.targetinfo = /datum/objective_item/steal/functionalai
AI.explanation_text = "<span class='nezbere'>Recover an AI for use in the manufactories.</span>"
add_objective(AI)
else
add_objective(new/datum/objective/soul_extraction)
add_objective(new/datum/objective/implant)
add_objective(new/datum/objective/escape/onesurvivor/clockagent)
return
/datum/team/clock_agents/proc/add_objective(datum/objective/O)
O.team = src
O.update_explanation_text()
objectives += O
/datum/objective/escape/onesurvivor/clockagent //flavortext variant
name = "escape clock agent"
explanation_text = "<span class='inathneq'>Escape alive and out of custody.</span>"
team_explanation_text = "<span class='inathneq'>Broken bodies can be fixed, lost ones can't. Leave no servant behind, alive or dead. Do not get captured.</span>"
/obj/item/clockwork/slab/agent
quickbound = list(/datum/clockwork_scripture/create_object/integration_cog, \
/datum/clockwork_scripture/vanguard, /datum/clockwork_scripture/ranged_ability/hateful_manacles)
/obj/item/clockwork/slab/agent/examine(mob/user)
. = ..()
if(is_servant_of_ratvar(user))
. += "<span class='sevtug'>This slab's connection to the Justicar is modified for covert operations, with some scriptures being weakened or unusable. Additionally, replica fabricators made with this slab have extra uses for specific objectives.</span>"

View File

@@ -76,15 +76,6 @@
if(purified && iscultist(user)) if(purified && iscultist(user))
to_chat(user, "<span class='warning'>Holy magic resides within the stone, you cannot use it.</span>") to_chat(user, "<span class='warning'>Holy magic resides within the stone, you cannot use it.</span>")
return return
if(user.mind.has_antag_datum(/datum/antagonist/cult/agent))
var/datum/team/T = SSticker.mode.blood_agent_team
for(var/datum/objective/soulshard/O in T?.objectives)
if(O.target == M.mind)
O.linked_stone = src
to_chat(user, "<span class='cultlarge'>\"Perfect. This is the one we need. Do not lose it.\"</span>")
log_combat(user, M, "captured [M.name]'s soul", src)
transfer_soul("VICTIM", M, user)
return
log_combat(user, M, "captured [M.name]'s soul", src) log_combat(user, M, "captured [M.name]'s soul", src)
transfer_soul("VICTIM", M, user) transfer_soul("VICTIM", M, user)
@@ -100,8 +91,6 @@
if(purified && iscultist(user)) if(purified && iscultist(user))
to_chat(user, "<span class='warning'>Holy magic resides within the stone, you cannot use it.</span>") to_chat(user, "<span class='warning'>Holy magic resides within the stone, you cannot use it.</span>")
return return
if(user.mind.has_antag_datum(/datum/antagonist/cult/agent))
return
release_shades(user) release_shades(user)
/obj/item/soulstone/proc/release_shades(mob/user) /obj/item/soulstone/proc/release_shades(mob/user)
@@ -339,23 +328,3 @@
init_shade(T, U) init_shade(T, U)
qdel(T) qdel(T)
return TRUE return TRUE
////////////////////////////Cult Agent Stuff//////////////////////////////////////
/obj/item/soulstone/attacked_by(obj/item/I, mob/user)
. = ..()
if(is_servant_of_ratvar(user) && istype(I, /obj/item/mmi/posibrain/soul_vessel/agent))
var/obj/item/mmi/posibrain/soul_vessel/agent/V
var/datum/team/T = SSticker.mode.clock_agent_team
for(var/datum/objective/soul_extraction/O in T?.objectives)
for(var/mob/living/simple_animal/shade/A in src)
if(O.target == A.mind)
to_chat(user, "<span class='nezbere'>That will do. Do not lose it.</span>")
V.braintype = "Slave"
V.transfer_personality(A)
V.linked_objective = O
O.linked_vessel = V //we did it boys we saved the universe
V.icon_state = "soul_vessel-occupied" //stuff here in case the captured person goes catatonic
V.dead_message = "<span class='brass'>Its cogwheel struggles to keep turning, but refuses to stop</span>"
qdel(src)
break

View File

@@ -415,9 +415,6 @@ mob/living/simple_animal/hostile/construct/attackby(obj/item/W, mob/living/user,
var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult) var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult)
if(!C) if(!C)
return return
if(!C.cult_team)
to_chat(the_construct, "<span class='cult italic'>You are alone, and have no team.</span>")
return
var/datum/objective/eldergod/summon_objective = locate() in C.cult_team.objectives var/datum/objective/eldergod/summon_objective = locate() in C.cult_team.objectives
if(summon_objective.check_completion()) if(summon_objective.check_completion())

View File

@@ -51,8 +51,7 @@
for(var/datum/antagonist/cult/C in GLOB.antagonists) for(var/datum/antagonist/cult/C in GLOB.antagonists)
if(!C.owner) if(!C.owner)
continue continue
if(C.cult_team) all_cults |= C.cult_team
all_cults |= C.cult_team
for(var/datum/team/cult/T in all_cults) for(var/datum/team/cult/T in all_cults)
deltimer(T.blood_target_reset_timer) deltimer(T.blood_target_reset_timer)
T.blood_target = src T.blood_target = src

View File

@@ -210,7 +210,7 @@
data = list("misc" = 1) data = list("misc" = 1)
data["misc"]++ data["misc"]++
M.jitteriness = min(M.jitteriness+4,10) M.jitteriness = min(M.jitteriness+4,10)
if(iscultist(M, FALSE, TRUE)) if(iscultist(M))
for(var/datum/action/innate/cult/blood_magic/BM in M.actions) for(var/datum/action/innate/cult/blood_magic/BM in M.actions)
to_chat(M, "<span class='cultlarge'>Your blood rites falter as holy water scours your body!</span>") to_chat(M, "<span class='cultlarge'>Your blood rites falter as holy water scours your body!</span>")
for(var/datum/action/innate/cult/blood_spell/BS in BM.spells) for(var/datum/action/innate/cult/blood_spell/BS in BM.spells)
@@ -237,7 +237,7 @@
if("emote") if("emote")
M.visible_message("<span class='warning'>[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")].</span>") M.visible_message("<span class='warning'>[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")].</span>")
if(data["misc"] >= 60) // 30 units, 135 seconds if(data["misc"] >= 60) // 30 units, 135 seconds
if(iscultist(M, FALSE, TRUE) || is_servant_of_ratvar(M, FALSE, TRUE)) if(iscultist(M) || is_servant_of_ratvar(M))
if(iscultist(M)) if(iscultist(M))
SSticker.mode.remove_cultist(M.mind, FALSE, TRUE) SSticker.mode.remove_cultist(M.mind, FALSE, TRUE)
else if(is_servant_of_ratvar(M)) else if(is_servant_of_ratvar(M))

View File

@@ -235,7 +235,6 @@ SHUTTLE_REFUEL_DELAY 12000
TRAITOR_SCALING_COEFF 7 TRAITOR_SCALING_COEFF 7
BROTHER_SCALING_COEFF 10 BROTHER_SCALING_COEFF 10
CHANGELING_SCALING_COEFF 8 CHANGELING_SCALING_COEFF 8
AGENT_SCALING_COEFF 20
## Variables calculate how number of open security officer positions will scale to population. ## Variables calculate how number of open security officer positions will scale to population.
## Used as (Officers = Population / Coeff) ## Used as (Officers = Population / Coeff)

View File

@@ -657,7 +657,6 @@
#include "code\game\gamemodes\revolution\revolution.dm" #include "code\game\gamemodes\revolution\revolution.dm"
#include "code\game\gamemodes\traitor\double_agents.dm" #include "code\game\gamemodes\traitor\double_agents.dm"
#include "code\game\gamemodes\traitor\traitor.dm" #include "code\game\gamemodes\traitor\traitor.dm"
#include "code\game\gamemodes\traitor\traitorcult.dm"
#include "code\game\gamemodes\wizard\raginmages.dm" #include "code\game\gamemodes\wizard\raginmages.dm"
#include "code\game\gamemodes\wizard\wizard.dm" #include "code\game\gamemodes\wizard\wizard.dm"
#include "code\game\golf\golf.dm" #include "code\game\golf\golf.dm"
@@ -1487,10 +1486,6 @@
#include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm" #include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm"
#include "code\modules\antagonists\traitor\equipment\module_picker.dm" #include "code\modules\antagonists\traitor\equipment\module_picker.dm"
#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm" #include "code\modules\antagonists\traitor\IAA\internal_affairs.dm"
#include "code\modules\antagonists\traitorcult\implantobjectives.dm"
#include "code\modules\antagonists\traitorcult\soulextractobjectives.dm"
#include "code\modules\antagonists\traitorcult\traitorblood.dm"
#include "code\modules\antagonists\traitorcult\traitorclock.dm"
#include "code\modules\antagonists\valentines\valentine.dm" #include "code\modules\antagonists\valentines\valentine.dm"
#include "code\modules\antagonists\wishgranter\wishgranter.dm" #include "code\modules\antagonists\wishgranter\wishgranter.dm"
#include "code\modules\antagonists\wizard\wizard.dm" #include "code\modules\antagonists\wizard\wizard.dm"