mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
This reverts commit 6ea27bb700.
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 ..()
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
else
|
||||
if(!GLOB.ratvar_awakens && L.stat == CONSCIOUS)
|
||||
vitality_drained = L.adjustToxLoss(1, forced = TRUE)
|
||||
vitality_drained = L.adjustToxLoss(1)
|
||||
else
|
||||
vitality_drained = L.adjustToxLoss(1.5, forced = TRUE)
|
||||
vitality_drained = L.adjustToxLoss(1.5)
|
||||
if(vitality_drained)
|
||||
GLOB.clockwork_vitality += vitality_drained
|
||||
else
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -16,16 +16,10 @@
|
||||
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>"
|
||||
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>"
|
||||
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)
|
||||
return TRUE
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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")
|
||||
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)
|
||||
current.throw_alert("bloodsense", /obj/screen/alert/bloodsense)
|
||||
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)
|
||||
|
||||
@@ -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)
|
||||
@@ -341,7 +331,7 @@
|
||||
/datum/action/innate/cult/ghostmark/Activate()
|
||||
var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
if(C.cult_team.blood_target)
|
||||
if(cooldown > world.time)
|
||||
if(cooldown>world.time)
|
||||
reset_blood_target(C.cult_team)
|
||||
to_chat(owner, "<span class='cultbold'>You have cleared the cult's blood target!</span>")
|
||||
deltimer(C.cult_team.blood_target_reset_timer)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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>"
|
||||
@@ -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>"
|
||||
@@ -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
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -51,8 +51,7 @@
|
||||
for(var/datum/antagonist/cult/C in GLOB.antagonists)
|
||||
if(!C.owner)
|
||||
continue
|
||||
if(C.cult_team)
|
||||
all_cults |= C.cult_team
|
||||
all_cults |= C.cult_team
|
||||
for(var/datum/team/cult/T in all_cults)
|
||||
deltimer(T.blood_target_reset_timer)
|
||||
T.blood_target = src
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user