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_BEAM_COST 500
#define METAL_TO_CONSTRUCT_SHELL_CONVERSION 50
#define RGLASS_TO_SOULSTONE_CONVERSION 30
//screen locations
#define DEFAULT_BLOODSPELLS "6:-29,4:-2"
#define DEFAULT_BLOODTIP "14:6,14:27"

View File

@@ -45,8 +45,6 @@
#define ROLE_GANG "gangster" // Yogs
#define ROLE_DARKSPAWN "darkspawn" //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
//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_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs,
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_FUGITIVE,
ROLE_ZOMBIE

View File

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

View File

@@ -98,10 +98,6 @@
integer = FALSE
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
config_entry_value = 2
min_val = 0

View File

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

View File

@@ -263,7 +263,6 @@
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_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.", \
"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.")
@@ -276,7 +275,6 @@
. = ..()
if(.)
motor = new_motor
agent = motor.agent
/datum/status_effect/maniamotor/Destroy()
motor = null
@@ -327,7 +325,7 @@
severity = 0
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
if(!agent && (owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT))
if(owner.getToxLoss() > MANIA_DAMAGE_TO_CONVERT)
if(is_eligible_servant(owner))
to_chat(owner, "<span class='sevtug[span_part]'>\"[text2ratvar("You are mine and his, now.")]\"</span>")
if(add_servant_of_ratvar(owner))

View File

@@ -44,17 +44,8 @@ Credit where due:
// PROCS //
///////////
/proc/is_servant_of_ratvar(mob/M, require_cult = FALSE, holy_water_check = FALSE)
if(!istype(M) || isobserver(M))
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_servant_of_ratvar(mob/M)
return M?.mind?.has_antag_datum(/datum/antagonist/clockcult)
/proc/is_eligible_servant(mob/M)
if(!istype(M))
@@ -78,14 +69,12 @@ Credit where due:
return TRUE
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)
return
var/update_type = /datum/antagonist/clockcult
if(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)
C.make_team = create_team
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)
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)
if(!L || !L.mind)
return
@@ -389,5 +381,6 @@ Credit where due:
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 += "<br>"
round_credits += ..()
return round_credits

View File

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

View File

@@ -59,8 +59,8 @@ GLOBAL_LIST_EMPTY(objectives)
update_explanation_text()
/datum/objective/proc/considered_escaped(datum/mind/M, needs_living = TRUE)
if((needs_living && !considered_alive(M)))
/datum/objective/proc/considered_escaped(datum/mind/M)
if(!considered_alive(M))
return FALSE
if(M.force_escaped)
return TRUE
@@ -428,21 +428,6 @@ GLOBAL_LIST_EMPTY(objectives)
return FALSE
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
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
@@ -1259,8 +1244,6 @@ GLOBAL_LIST_EMPTY(possible_items_special)
/datum/objective/assassinate,
/datum/objective/maroon,
/datum/objective/debrain,
/datum/objective/soul_extraction,
/datum/objective/assist,
/datum/objective/protect,
/datum/objective/assist,
/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"
else if(istype(W, /obj/item/implanter))
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(imp || I.imp.imp_in)
return

View File

@@ -139,11 +139,6 @@
/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))
var/obj/item/stack/sheet/metal/M = W
if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)

View File

@@ -274,8 +274,7 @@
ROLE_OVERTHROW, ROLE_REV, ROLE_REVENANT,
ROLE_REV_HEAD, ROLE_SERVANT_OF_RATVAR, ROLE_SYNDICATE,
ROLE_TRAITOR, ROLE_WIZARD, ROLE_GANG, ROLE_VAMPIRE,
ROLE_SHADOWLING, ROLE_DARKSPAWN, ROLE_ZOMBIE,
ROLE_CLOCK_AGENT, ROLE_BLOOD_AGENT, ROLE_HERETIC)) //ROLE_REV_HEAD is excluded from this because rev jobbans are handled by ROLE_REV
ROLE_SHADOWLING, ROLE_DARKSPAWN, ROLE_ZOMBIE, ROLE_HERETIC)) //ROLE_REV_HEAD is excluded from this because rev jobbans are handled by ROLE_REV
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'>"
break_counter = 0

View File

@@ -270,15 +270,9 @@
sigil_name = "Vitality Matrix"
var/revive_cost = 150
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/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)
. = ..()
if(is_servant_of_ratvar(user) || isobserver(user))
@@ -303,7 +297,7 @@
animation_number++
if(!is_servant_of_ratvar(L))
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
vitality_drained = L.maxHealth
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))
qdel(W)
L.dust()
else if(L.health > min_drain_health)
if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS)
vitality_drained = L.adjustToxLoss(1, forced = TRUE)
else
vitality_drained = L.adjustToxLoss(1.5, forced = TRUE)
if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS)
vitality_drained = L.adjustToxLoss(1)
else
vitality_drained = L.adjustToxLoss(1.5)
if(vitality_drained)
GLOB.clockwork_vitality += vitality_drained
else

View File

@@ -127,20 +127,6 @@
consume_visual(fabricator, power_amount)
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
/obj/machinery/door/airlock/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
var/doortype = /obj/machinery/door/airlock/clockwork

View File

@@ -16,15 +16,9 @@
var/unlock_message
if(current_power >= SCRIPT_UNLOCK_THRESHOLD && !GLOB.script_scripture_unlocked)
GLOB.script_scripture_unlocked = TRUE
if(SSticker.mode.clock_agent_team)
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)
GLOB.application_scripture_unlocked = TRUE
if(SSticker.mode.clock_agent_team)
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)
hierophant_message(unlock_message)

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>"
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.
/obj/item/clockwork/construct_chassis/cogscarab

View File

@@ -12,7 +12,6 @@
var/speed_multiplier = 1 //The speed ratio the fabricator operates at
var/uses_power = TRUE
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
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>")
return FALSE
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
force_replace_ai_name = TRUE
overrides_aicore_laws = TRUE
var/agent = FALSE //agent vs not agent
/obj/item/mmi/posibrain/soul_vessel/Initialize()
. = ..()
@@ -46,7 +45,7 @@
/obj/item/mmi/posibrain/soul_vessel/transfer_personality(mob/candidate)
. = ..()
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)
if(!is_servant_of_ratvar(user))

View File

@@ -22,7 +22,6 @@
speech_span = SPAN_ROBOT
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/agent = FALSE
/mob/living/simple_animal/hostile/clockwork/Initialize()
. = ..()
@@ -30,7 +29,7 @@
/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)
if(GLOB.ratvar_approaches)
to_chat(src, empower_string)

View File

@@ -102,7 +102,5 @@
shield_health_regen = world.time + MARAUDER_SHIELD_REGEN_TIME
return TRUE
/mob/living/simple_animal/hostile/clockwork/marauder/agent
agent = TRUE
#undef MARAUDER_SLOWDOWN_PERCENTAGE
#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/chant_slowdown = 0 //slowdown added 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)
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
if(!invoker || !slab || invoker.get_active_held_item() != slab)
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())
to_chat(invoker, "<span class='warning'>You are unable to speak the words of the scripture!</span>")
return FALSE
@@ -251,16 +247,12 @@ GLOBAL_LIST_INIT(scripture_states,scripture_states_init_value()) //list of clock
return FALSE
return TRUE
/datum/clockwork_scripture/create_object/proc/get_spawn_path(mob/user)
return object_path
/datum/clockwork_scripture/create_object/scripture_effects()
var/to_spawn = get_spawn_path(invoker)//in case flavortextchanges
if(creator_message && observer_message)
invoker.visible_message(observer_message, creator_message)
else if(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
if(isitem(O) && put_object_in_hands)
invoker.put_in_hands(O)

View File

@@ -45,10 +45,6 @@
quickbind = TRUE
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.
/datum/clockwork_scripture/create_object/clockwork_obelisk
@@ -95,11 +91,6 @@
var/static/time_since_last_marauder = 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()
var/human_servants = 0
for(var/V in SSticker.mode.servants_of_ratvar)

View File

@@ -62,7 +62,6 @@
sort_priority = 3
quickbind = TRUE
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.
@@ -89,7 +88,6 @@
important = TRUE
quickbind = TRUE
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.
/datum/clockwork_scripture/ranged_ability/hateful_manacles
@@ -188,7 +186,6 @@
quickbind = TRUE
quickbind_desc = "Returns you to Reebe."
var/client_color
requires_cult = TRUE //you don't have one so :shrug:
/datum/clockwork_scripture/abscond/check_special_requirements()
if(is_reebe(invoker.z))
@@ -243,11 +240,6 @@
quickbind = TRUE
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.
/datum/clockwork_scripture/create_object/wraith_spectacles

View File

@@ -23,11 +23,6 @@
quickbind = TRUE
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.
/datum/clockwork_scripture/create_object/ocular_warden
@@ -55,6 +50,7 @@
return FALSE
return ..()
//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
descname = "Trap, Damage to Healing"
@@ -81,10 +77,6 @@
return FALSE
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.
/datum/clockwork_scripture/create_object/judicial_visor

View File

@@ -14,12 +14,7 @@
debris = list(/obj/item/clockwork/alloy_shards/large = 2, \
/obj/item/clockwork/alloy_shards/small = 2, \
/obj/item/clockwork/component/geis_capacitor/antennae = 1)
var/mania_cost = 150 //motor's power cost
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."
var/mania_cost = 150
/obj/structure/destructible/clockwork/powered/mania_motor/examine(mob/user)
. = ..()

View File

@@ -5,11 +5,9 @@
antagpanel_category = "Clockcult"
job_rank = ROLE_SERVANT_OF_RATVAR
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/make_team = TRUE //This should be only false for tutorial scarabs or traitorcultists
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
var/make_team = TRUE //This should be only false for tutorial scarabs
/datum/antagonist/clockcult/silent
silent = TRUE
@@ -51,9 +49,6 @@
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/clockcultalr.ogg', 70, FALSE, pressure_affected = FALSE)
/datum/antagonist/clockcult/on_gain()
if(agent)
..()//SKIPP
return
var/mob/living/current = owner.current
SSticker.mode.servants_of_ratvar += 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.")
/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)].")
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()
. = ..()
@@ -197,6 +192,17 @@
var/list/objective
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()
if(GLOB.clockwork_gateway_activated)
return TRUE

View File

@@ -55,8 +55,6 @@
for(var/I in subtypesof(/datum/action/innate/cult/blood_spell))
var/datum/action/innate/cult/blood_spell/J = I
var/cult_name = initial(J.name)
if(!iscultist(owner, TRUE) && initial(J.requires_full_power))
continue
possible_spells[cult_name] = J
possible_spells += "(REMOVE SPELL)"
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/invocation
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)
if(health_cost)
@@ -146,7 +143,6 @@
button_icon_state = "hand"
magic_path = "/obj/item/melee/blood_magic/stun"
health_cost = 10
requires_full_power = TRUE
/datum/action/innate/cult/blood_spell/teleport
name = "Teleport"
@@ -180,7 +176,7 @@
/datum/action/innate/cult/blood_spell/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"
magic_path = "/obj/item/melee/blood_magic/construction"
health_cost = 12
@@ -334,7 +330,6 @@
button_icon_state = "manip"
charges = 5
magic_path = "/obj/item/melee/blood_magic/manipulator"
requires_full_power = TRUE
// The "magic hand" items
@@ -601,7 +596,6 @@
. += {"<u>A sinister spell used to convert:</u>\n
Plasteel into runed metal\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
Cyborg shells into construct shells\n
Airlocks into brittle runed airlocks after a delay (harm intent)"}
@@ -611,9 +605,7 @@
var/turf/T = get_turf(target)
if(istype(target, /obj/item/stack/sheet/metal))
var/obj/item/stack/sheet/candidate = target
if(!iscultist(user, TRUE))
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))
if(candidate.use(METAL_TO_CONSTRUCT_SHELL_CONVERSION))
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>")
new /obj/structure/constructshell(T)
@@ -621,21 +613,6 @@
else
to_chat(user, "<span class='warning'>You need [METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal to produce a construct shell!</span>")
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))
var/obj/item/stack/sheet/plasteel/candidate = target
var/quantity = candidate.amount
@@ -835,9 +812,7 @@
to_chat(user, "<span class='cultitalic'>You need a free hand for this rite!</span>")
qdel(rite)
if("Blood Beam (500)")
if(!iscultist(user, TRUE))
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)
if(uses < BLOOD_BEAM_COST)
to_chat(user, "<span class='cultitalic'>You need [BLOOD_BEAM_COST] charges to perform this rite.</span>")
else
var/obj/rite = new /obj/item/blood_beam()

View File

@@ -11,16 +11,14 @@
job_rank = ROLE_CULTIST
var/ignore_implant = FALSE
var/give_equipment = FALSE
var/make_team = TRUE //do we make a 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()
return cult_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
for(var/datum/antagonist/cult/H in GLOB.antagonists)
if(!H.owner)
@@ -31,7 +29,7 @@
cult_team = new /datum/team/cult
cult_team.setup_objectives()
return
if(make_team && !istype(new_team))
if(!istype(new_team))
stack_trace("Wrong team type passed to [type] initialization.")
cult_team = new_team
@@ -55,18 +53,17 @@
owner.announce_objectives()
/datum/antagonist/cult/on_gain()
. = ..()
var/mob/living/current = owner.current
add_objectives()
if(give_equipment)
equip_cultist(TRUE)
if(cult_team)
add_objectives()
SSticker.mode.cult += owner // Only add after they've been given objectives
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
. = ..()
/datum/antagonist/cult/proc/equip_cultist(metal=TRUE)
@@ -108,14 +105,13 @@
current = mob_override
current.faction |= "cult"
current.grant_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST)
if(!cult_team?.cult_master)
if(!cult_team.cult_master)
vote.Grant(current)
communion.Grant(current)
if(ishuman(current))
magic.Grant(current)
if(cult_team)
current.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
if(cult_team?.cult_risen)
if(cult_team.cult_risen)
cult_team.rise(current)
if(cult_team.cult_ascendent)
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)
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")
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
. = ..()
@@ -209,13 +205,13 @@
var/mob/living/current = owner.current
if(mob_override)
current = mob_override
if(!cult_team?.reckoning_complete)
if(!cult_team.reckoning_complete)
reckoning.Grant(current)
bloodmark.Grant(current)
throwing.Grant(current)
current.update_action_buttons_icon()
current.apply_status_effect(/datum/status_effect/cult_master)
if(cult_team?.cult_risen)
if(cult_team.cult_risen)
cult_team.rise(current)
if(cult_team.cult_ascendent)
cult_team.ascend(current)

View File

@@ -74,7 +74,7 @@
/datum/action/innate/cult/mastervote/IsAvailable()
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 ..()
@@ -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")
if(choice == "Yes" && IsAvailable())
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)
/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)
if(!antag)
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)
chant(i)
var/list/destinations = list()
@@ -267,10 +261,6 @@
return FALSE
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(C.cult_team.blood_target)

View File

@@ -102,11 +102,7 @@
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>")
return
var/choice
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/choice = alert(user,"You study the schematics etched into the altar...",,"Eldritch Whetstone","Construct Shell","Flask of Unholy Water")
var/list/pickedtype = list()
switch(choice)
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>")
return
var/choice
if(user.mind.has_antag_datum(/datum/antagonist/cult/agent))
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe", "Flagellant's Robe")
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","Mirror Shield")
else
choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Mirror Shield")
var/list/pickedtype = list()
@@ -260,11 +256,7 @@
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>")
return
var/choice
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/choice = alert(user,"You flip through the black pages of the archives...",,"Zealot's Blindfold","Shuttle Curse","Veil Walker Set")
var/list/pickedtype = list()
switch(choice)
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]
if(!rune_to_scribe)
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))
chosen_keyword = stripped_input(user, "Enter a keyword for the new rune.", "Words of Power")
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/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)
. = ..()
@@ -192,7 +191,6 @@ structure_check() searches for nearby cultist structures required for the invoca
color = RUNE_COLOR_OFFER
req_cultists = 1
rune_in_use = FALSE
requires_full_power = TRUE
/obj/effect/rune/convert/do_invoke_glow()
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_damage = 20 //how much damage you take doing it
var/used = FALSE
requires_full_power = TRUE
/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/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(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)
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>")
@@ -992,7 +986,6 @@ structure_check() searches for nearby cultist structures required for the invoca
color = RUNE_COLOR_DARKRED
req_cultists = 3
scribe_delay = 100
requires_full_power = TRUE //might make this available later
/obj/effect/rune/apocalypse/invoke(var/list/invokers)
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))
to_chat(user, "<span class='warning'>Holy magic resides within the stone, you cannot use it.</span>")
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)
transfer_soul("VICTIM", M, user)
@@ -100,8 +91,6 @@
if(purified && iscultist(user))
to_chat(user, "<span class='warning'>Holy magic resides within the stone, you cannot use it.</span>")
return
if(user.mind.has_antag_datum(/datum/antagonist/cult/agent))
return
release_shades(user)
/obj/item/soulstone/proc/release_shades(mob/user)
@@ -339,23 +328,3 @@
init_shade(T, U)
qdel(T)
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)
if(!C)
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
if(summon_objective.check_completion())

View File

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

View File

@@ -210,7 +210,7 @@
data = list("misc" = 1)
data["misc"]++
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)
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)
@@ -237,7 +237,7 @@
if("emote")
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(iscultist(M, FALSE, TRUE) || is_servant_of_ratvar(M, FALSE, TRUE))
if(iscultist(M) || is_servant_of_ratvar(M))
if(iscultist(M))
SSticker.mode.remove_cultist(M.mind, FALSE, TRUE)
else if(is_servant_of_ratvar(M))

View File

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

View File

@@ -657,7 +657,6 @@
#include "code\game\gamemodes\revolution\revolution.dm"
#include "code\game\gamemodes\traitor\double_agents.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\wizard.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\module_picker.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\wishgranter\wishgranter.dm"
#include "code\modules\antagonists\wizard\wizard.dm"