TG Sync 12/15/17
s s
This commit is contained in:
@@ -28,4 +28,4 @@
|
||||
for(var/X in motioncameras)
|
||||
var/obj/machinery/camera/cam = X
|
||||
cam.lostTargetRef(WEAKREF(O))
|
||||
return
|
||||
return
|
||||
@@ -123,4 +123,4 @@
|
||||
|
||||
/area/holodeck/rec_center/thunderdome1218
|
||||
name = "Holodeck - 1218 AD"
|
||||
restricted = 1
|
||||
restricted = 1
|
||||
|
||||
@@ -414,7 +414,7 @@
|
||||
for(var/m in buckled_mobs)
|
||||
var/mob/living/buckled_mob = m
|
||||
if(!buckled_mob.Move(newloc, direct))
|
||||
loc = buckled_mob.loc
|
||||
forceMove(buckled_mob.loc)
|
||||
last_move = buckled_mob.last_move
|
||||
inertia_dir = last_move
|
||||
buckled_mob.inertia_dir = last_move
|
||||
@@ -712,4 +712,4 @@
|
||||
return FALSE
|
||||
if(anchored || throwing)
|
||||
return FALSE
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
+43
-153
@@ -86,109 +86,55 @@ GLOBAL_LIST_EMPTY(all_radios)
|
||||
for(var/freq in GLOB.all_radios)
|
||||
GLOB.all_radios["[freq]"] -= radio
|
||||
|
||||
/*
|
||||
Frequency range: 1200 to 1600
|
||||
Radiochat range: 1441 to 1489 (most devices refuse to be tune to other frequency, even during mapmaking)
|
||||
|
||||
Radio:
|
||||
1459 - standard radio chat
|
||||
1351 - Science
|
||||
1353 - Command
|
||||
1355 - Medical
|
||||
1357 - Engineering
|
||||
1359 - Security
|
||||
1337 - death squad
|
||||
1443 - Confession Intercom
|
||||
1349 - Miners
|
||||
1347 - Cargo techs
|
||||
1447 - AI Private
|
||||
|
||||
Devices:
|
||||
1451 - tracking implant
|
||||
1457 - RSD default
|
||||
|
||||
On the map:
|
||||
1311 for prison shuttle console (in fact, it is not used)
|
||||
1435 for status displays
|
||||
1437 for atmospherics/fire alerts
|
||||
1439 for engine components
|
||||
1439 for air pumps, air scrubbers, atmo control
|
||||
1441 for atmospherics - supply tanks
|
||||
1443 for atmospherics - distribution loop/mixed air tank
|
||||
1445 for bot nav beacons
|
||||
1447 for mulebot, secbot and ed209 control
|
||||
1449 for airlock controls, electropack, magnets
|
||||
1451 for toxin lab access
|
||||
1453 for engineering access
|
||||
1455 for AI access
|
||||
*/
|
||||
// For information on what objects or departments use what frequencies,
|
||||
// see __DEFINES/radio.dm. Mappers may also select additional frequencies for
|
||||
// use in maps, such as in intercoms.
|
||||
|
||||
GLOBAL_LIST_INIT(radiochannels, list(
|
||||
"Common" = 1459,
|
||||
"Science" = 1351,
|
||||
"Command" = 1353,
|
||||
"Medical" = 1355,
|
||||
"Engineering" = 1357,
|
||||
"Security" = 1359,
|
||||
"CentCom" = 1337,
|
||||
"Syndicate" = 1213,
|
||||
"Supply" = 1347,
|
||||
"Service" = 1349,
|
||||
"AI Private" = 1447,
|
||||
"Red Team" = 1215,
|
||||
"Blue Team" = 1217
|
||||
"Common" = FREQ_COMMON,
|
||||
"Science" = FREQ_SCIENCE,
|
||||
"Command" = FREQ_COMMAND,
|
||||
"Medical" = FREQ_MEDICAL,
|
||||
"Engineering" = FREQ_ENGINEERING,
|
||||
"Security" = FREQ_SECURITY,
|
||||
"CentCom" = FREQ_CENTCOM,
|
||||
"Syndicate" = FREQ_SYNDICATE,
|
||||
"Supply" = FREQ_SUPPLY,
|
||||
"Service" = FREQ_SERVICE,
|
||||
"AI Private" = FREQ_AI_PRIVATE,
|
||||
"Red Team" = FREQ_CTF_RED,
|
||||
"Blue Team" = FREQ_CTF_BLUE
|
||||
))
|
||||
|
||||
GLOBAL_LIST_INIT(reverseradiochannels, list(
|
||||
"1459" = "Common",
|
||||
"1351" = "Science",
|
||||
"1353" = "Command",
|
||||
"1355" = "Medical",
|
||||
"1357" = "Engineering",
|
||||
"1359" = "Security",
|
||||
"1337" = "CentCom",
|
||||
"1213" = "Syndicate",
|
||||
"1347" = "Supply",
|
||||
"1349" = "Service",
|
||||
"1447" = "AI Private",
|
||||
"1215" = "Red Team",
|
||||
"1217" = "Blue Team"
|
||||
"[FREQ_COMMON]" = "Common",
|
||||
"[FREQ_SCIENCE]" = "Science",
|
||||
"[FREQ_COMMAND]" = "Command",
|
||||
"[FREQ_MEDICAL]" = "Medical",
|
||||
"[FREQ_ENGINEERING]" = "Engineering",
|
||||
"[FREQ_SECURITY]" = "Security",
|
||||
"[FREQ_CENTCOM]" = "CentCom",
|
||||
"[FREQ_SYNDICATE]" = "Syndicate",
|
||||
"[FREQ_SUPPLY]" = "Supply",
|
||||
"[FREQ_SERVICE]" = "Service",
|
||||
"[FREQ_AI_PRIVATE]" = "AI Private",
|
||||
"[FREQ_CTF_RED]" = "Red Team",
|
||||
"[FREQ_CTF_BLUE]" = "Blue Team"
|
||||
))
|
||||
|
||||
//depenging helpers
|
||||
GLOBAL_VAR_CONST(SYND_FREQ, 1213) //nuke op frequency, coloured dark brown in chat window
|
||||
GLOBAL_VAR_CONST(SUPP_FREQ, 1347) //supply, coloured light brown in chat window
|
||||
GLOBAL_VAR_CONST(SERV_FREQ, 1349) //service, coloured green in chat window
|
||||
GLOBAL_VAR_CONST(SCI_FREQ, 1351) //science, coloured plum in chat window
|
||||
GLOBAL_VAR_CONST(COMM_FREQ, 1353) //command, colored gold in chat window
|
||||
GLOBAL_VAR_CONST(MED_FREQ, 1355) //medical, coloured blue in chat window
|
||||
GLOBAL_VAR_CONST(ENG_FREQ, 1357) //engineering, coloured orange in chat window
|
||||
GLOBAL_VAR_CONST(SEC_FREQ, 1359) //security, coloured red in chat window
|
||||
GLOBAL_VAR_CONST(CENTCOM_FREQ, 1337) //centcom frequency, coloured grey in chat window
|
||||
GLOBAL_VAR_CONST(AIPRIV_FREQ, 1447) //AI private, colored magenta in chat window
|
||||
GLOBAL_VAR_CONST(REDTEAM_FREQ, 1215) // red team (CTF) frequency, coloured red
|
||||
GLOBAL_VAR_CONST(BLUETEAM_FREQ, 1217) // blue team (CTF) frequency, coloured blue
|
||||
|
||||
#define TRANSMISSION_WIRE 0
|
||||
#define TRANSMISSION_RADIO 1
|
||||
|
||||
/* filters */
|
||||
GLOBAL_VAR_INIT(RADIO_TO_AIRALARM, "1")
|
||||
GLOBAL_VAR_INIT(RADIO_FROM_AIRALARM, "2")
|
||||
GLOBAL_VAR_INIT(RADIO_CHAT, "3") //deprecated
|
||||
GLOBAL_VAR_INIT(RADIO_ATMOSIA, "4")
|
||||
GLOBAL_VAR_INIT(RADIO_NAVBEACONS, "5")
|
||||
GLOBAL_VAR_INIT(RADIO_AIRLOCK, "6")
|
||||
GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
|
||||
|
||||
/datum/radio_frequency
|
||||
|
||||
var/frequency as num
|
||||
var/list/list/obj/devices = list()
|
||||
|
||||
/datum/radio_frequency/New(freq)
|
||||
frequency = freq
|
||||
|
||||
//If range > 0, only post to devices on the same z_level and within range
|
||||
//Use range = -1, to restrain to the same z_level without limiting range
|
||||
/datum/radio_frequency/proc/post_signal(obj/source as obj|null, datum/signal/signal, filter = null as text|null, range = null as num|null)
|
||||
// Ensure the signal's data is fully filled
|
||||
signal.source = source
|
||||
signal.frequency = frequency
|
||||
|
||||
//Apply filter to the signal. If none supply, broadcast to every devices
|
||||
//_default channel is always checked
|
||||
@@ -217,7 +163,7 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
|
||||
continue
|
||||
if(start_point.z != end_point.z || (range > 0 && get_dist(start_point, end_point) > range))
|
||||
continue
|
||||
device.receive_signal(signal, TRANSMISSION_RADIO, frequency)
|
||||
device.receive_signal(signal)
|
||||
|
||||
/datum/radio_frequency/proc/add_listener(obj/device, filter as text|null)
|
||||
if (!filter)
|
||||
@@ -225,8 +171,7 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
|
||||
|
||||
var/list/devices_line = devices[filter]
|
||||
if(!devices_line)
|
||||
devices_line = list()
|
||||
devices[filter] = devices_line
|
||||
devices[filter] = devices_line = list()
|
||||
devices_line += device
|
||||
|
||||
|
||||
@@ -240,70 +185,15 @@ GLOBAL_VAR_INIT(RADIO_MAGNETS, "9")
|
||||
devices -= devices_filter
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/client/proc/print_pointers()
|
||||
set name = "Debug Signals"
|
||||
set category = "Debug"
|
||||
|
||||
if(!holder)
|
||||
return
|
||||
|
||||
var/datum/signal/S
|
||||
to_chat(src, "There are [S.pointers.len] pointers:")
|
||||
for(var/p in S.pointers)
|
||||
to_chat(src, p)
|
||||
S = locate(p)
|
||||
if(istype(S))
|
||||
to_chat(src, S.debug_print())
|
||||
|
||||
/obj/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
/obj/proc/receive_signal(datum/signal/signal)
|
||||
return
|
||||
|
||||
/datum/signal
|
||||
var/obj/source
|
||||
|
||||
var/transmission_method = 0
|
||||
//0 = wire
|
||||
//1 = radio transmission
|
||||
//2 = subspace transmission
|
||||
|
||||
var/data = list()
|
||||
var/encryption
|
||||
|
||||
var/frequency = 0
|
||||
var/static/list/pointers = list()
|
||||
var/transmission_method
|
||||
var/data
|
||||
|
||||
/datum/signal/New()
|
||||
..()
|
||||
pointers += "[REF(src)]"
|
||||
|
||||
/datum/signal/Destroy()
|
||||
pointers -= "[REF(src)]"
|
||||
return ..()
|
||||
|
||||
/datum/signal/proc/copy_from(datum/signal/model)
|
||||
source = model.source
|
||||
transmission_method = model.transmission_method
|
||||
data = model.data
|
||||
encryption = model.encryption
|
||||
frequency = model.frequency
|
||||
|
||||
/datum/signal/proc/debug_print()
|
||||
if (source)
|
||||
. = "signal = {source = '[source]' [COORD(source)]\n"
|
||||
else
|
||||
. = "signal = {source = '[source]' ()\n"
|
||||
for (var/i in data)
|
||||
. += "data\[\"[i]\"\] = \"[data[i]]\"\n"
|
||||
if(islist(data[i]))
|
||||
var/list/L = data[i]
|
||||
for(var/t in L)
|
||||
. += "data\[\"[i]\"\] list has: [t]"
|
||||
|
||||
/datum/signal/proc/sanitize_data()
|
||||
for(var/d in data)
|
||||
var/val = data[d]
|
||||
if(istext(val))
|
||||
data[d] = html_encode(val)
|
||||
/datum/signal/New(data, transmission_method = TRANSMISSION_RADIO)
|
||||
src.data = data || list()
|
||||
src.transmission_method = transmission_method
|
||||
|
||||
@@ -48,4 +48,6 @@
|
||||
newhud.join_hud(current)
|
||||
|
||||
/datum/mind/proc/leave_all_antag_huds()
|
||||
for(var/datum/atom_hud/antag/hud in GLOB.huds)
|
||||
for(var/datum/atom_hud/antag/hud in GLOB.huds)
|
||||
if(hud.hudusers[current])
|
||||
hud.leave_hud(current)
|
||||
@@ -4,7 +4,7 @@
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
var/used = 0
|
||||
|
||||
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, type = "")
|
||||
/obj/item/antag_spawner/proc/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
|
||||
return
|
||||
|
||||
/obj/item/antag_spawner/proc/equip_antag(mob/target)
|
||||
@@ -67,18 +67,16 @@
|
||||
else
|
||||
to_chat(H, "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later.")
|
||||
|
||||
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, school,datum/mind/user)
|
||||
/obj/item/antag_spawner/contract/spawn_antag(client/C, turf/T, kind ,datum/mind/user)
|
||||
new /obj/effect/particle_effect/smoke(T)
|
||||
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
|
||||
C.prefs.copy_to(M)
|
||||
M.key = C.key
|
||||
var/datum/mind/app_mind = M.mind
|
||||
|
||||
|
||||
|
||||
var/datum/antagonist/wizard/apprentice/app = new(app_mind)
|
||||
app.master = user
|
||||
app.school = school
|
||||
app.school = kind
|
||||
|
||||
var/datum/antagonist/wizard/master_wizard = user.has_antag_datum(/datum/antagonist/wizard)
|
||||
if(master_wizard)
|
||||
@@ -107,7 +105,7 @@
|
||||
if(used)
|
||||
to_chat(user, "<span class='warning'>[src] is out of power!</span>")
|
||||
return FALSE
|
||||
if(!(user.mind in SSticker.mode.syndicates))
|
||||
if(!user.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE))
|
||||
to_chat(user, "<span class='danger'>AUTHENTICATION FAILURE. ACCESS DENIED.</span>")
|
||||
return FALSE
|
||||
if(user.z != ZLEVEL_CENTCOM)
|
||||
@@ -133,19 +131,19 @@
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Unable to connect to Syndicate command. Please wait and try again later or use the teleporter on your uplink to get your points refunded.</span>")
|
||||
|
||||
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T)
|
||||
/obj/item/antag_spawner/nuke_ops/spawn_antag(client/C, turf/T, kind, datum/mind/user)
|
||||
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
|
||||
C.prefs.copy_to(M)
|
||||
M.key = C.key
|
||||
var/code = "BOMB-NOT-FOUND"
|
||||
var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
|
||||
if(nuke)
|
||||
code = nuke.r_code
|
||||
M.mind.make_Nuke(null, code, 0, FALSE)
|
||||
var/newname = M.dna.species.random_name(M.gender,0,SSticker.mode.nukeops_lastname)
|
||||
M.mind.name = newname
|
||||
M.real_name = newname
|
||||
M.name = newname
|
||||
|
||||
var/datum/antagonist/nukeop/new_op = new(M.mind)
|
||||
new_op.send_to_spawnpoint = FALSE
|
||||
new_op.nukeop_outfit = /datum/outfit/syndicate/no_crystals
|
||||
|
||||
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
|
||||
if(creator_op)
|
||||
M.mind.add_antag_datum(new_op,creator_op.nuke_team)
|
||||
M.mind.special_role = "Nuclear Operative"
|
||||
|
||||
//////SYNDICATE BORG
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele
|
||||
@@ -162,8 +160,12 @@
|
||||
name = "syndicate medical teleporter"
|
||||
borg_to_spawn = "Medical"
|
||||
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T)
|
||||
/obj/item/antag_spawner/nuke_ops/borg_tele/spawn_antag(client/C, turf/T, kind, datum/mind/user)
|
||||
var/mob/living/silicon/robot/R
|
||||
var/datum/antagonist/nukeop/creator_op = user.has_antag_datum(/datum/antagonist/nukeop,TRUE)
|
||||
if(!creator_op)
|
||||
return
|
||||
|
||||
switch(borg_to_spawn)
|
||||
if("Medical")
|
||||
R = new /mob/living/silicon/robot/modules/syndicate/medical(T)
|
||||
@@ -174,8 +176,8 @@
|
||||
if(prob(50))
|
||||
brainfirstname = pick(GLOB.first_names_female)
|
||||
var/brainopslastname = pick(GLOB.last_names)
|
||||
if(SSticker.mode.nukeops_lastname) //the brain inside the syndiborg has the same last name as the other ops.
|
||||
brainopslastname = SSticker.mode.nukeops_lastname
|
||||
if(creator_op.nuke_team.syndicate_name) //the brain inside the syndiborg has the same last name as the other ops.
|
||||
brainopslastname = creator_op.nuke_team.syndicate_name
|
||||
var/brainopsname = "[brainfirstname] [brainopslastname]"
|
||||
|
||||
R.mmi.name = "Man-Machine Interface: [brainopsname]"
|
||||
@@ -185,7 +187,11 @@
|
||||
R.real_name = R.name
|
||||
|
||||
R.key = C.key
|
||||
R.mind.make_Nuke(null, nuke_code = null,leader=0, telecrystals = TRUE)
|
||||
|
||||
var/datum/antagonist/nukeop/new_borg = new(R.mind)
|
||||
new_borg.send_to_spawnpoint = FALSE
|
||||
R.mind.add_antag_datum(new_borg,creator_op.nuke_team)
|
||||
R.mind.special_role = "Syndicate Cyborg"
|
||||
|
||||
///////////SLAUGHTER DEMON
|
||||
|
||||
@@ -222,8 +228,7 @@
|
||||
to_chat(user, "<span class='notice'>You can't seem to work up the nerve to shatter the bottle. Perhaps you should try again later.</span>")
|
||||
|
||||
|
||||
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, type = "", datum/mind/user)
|
||||
|
||||
/obj/item/antag_spawner/slaughter_demon/spawn_antag(client/C, turf/T, kind = "", datum/mind/user)
|
||||
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(T)
|
||||
var/mob/living/simple_animal/slaughter/S = new demon_type(holder)
|
||||
S.holder = holder
|
||||
@@ -242,6 +247,7 @@
|
||||
new_objective2.owner = S.mind
|
||||
new_objective2.explanation_text = "[objective_verb] everyone[user ? " else while you're at it":""]."
|
||||
S.mind.objectives += new_objective2
|
||||
S.mind.add_antag_datum(/datum/antagonist/auto_custom)
|
||||
to_chat(S, S.playstyle_string)
|
||||
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. \
|
||||
Ctrl+Click a blood pool to manifest.</B>")
|
||||
|
||||
@@ -30,4 +30,4 @@
|
||||
name = initial(name)
|
||||
desc = initial(desc)
|
||||
atmosblock = TRUE
|
||||
air_update_turf(1)
|
||||
air_update_turf(1)
|
||||
|
||||
@@ -4,6 +4,7 @@ GLOBAL_LIST_EMPTY(blob_cores)
|
||||
GLOBAL_LIST_EMPTY(overminds)
|
||||
GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
|
||||
|
||||
/mob/camera/blob
|
||||
name = "Blob Overmind"
|
||||
real_name = "Blob Overmind"
|
||||
@@ -33,10 +34,12 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
var/manualplace_min_time = 600 //in deciseconds //a minute, to get bearings
|
||||
var/autoplace_max_time = 3600 //six minutes, as long as should be needed
|
||||
var/list/blobs_legit = list()
|
||||
var/max_count = 0 //The biggest it got before death
|
||||
var/blobwincount = 400
|
||||
var/victory_in_progress = FALSE
|
||||
|
||||
/mob/camera/blob/Initialize(mapload, starting_points = 60)
|
||||
validate_location()
|
||||
blob_points = starting_points
|
||||
manualplace_min_time += world.time
|
||||
autoplace_max_time += world.time
|
||||
@@ -50,11 +53,18 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
color = blob_reagent_datum.complementary_color
|
||||
if(blob_core)
|
||||
blob_core.update_icon()
|
||||
|
||||
SSshuttle.registerHostileEnvironment(src)
|
||||
|
||||
.= ..()
|
||||
|
||||
/mob/camera/blob/proc/validate_location()
|
||||
var/turf/T = get_turf(src)
|
||||
var/area/A = get_area(T)
|
||||
if(((A && !A.blob_allowed) || !T || !(T.z in GLOB.station_z_levels)) && LAZYLEN(GLOB.blobstart))
|
||||
T = get_turf(pick(GLOB.blobstart))
|
||||
if(!T)
|
||||
CRASH("No blobspawnpoints and blob spawned in nullspace.")
|
||||
forceMove(T)
|
||||
|
||||
/mob/camera/blob/Life()
|
||||
if(!blob_core)
|
||||
if(!placed)
|
||||
@@ -73,6 +83,9 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
max_blob_points = INFINITY
|
||||
blob_points = INFINITY
|
||||
addtimer(CALLBACK(src, .proc/victory), 450)
|
||||
|
||||
if(!victory_in_progress && max_count < blobs_legit.len)
|
||||
max_count = blobs_legit.len
|
||||
..()
|
||||
|
||||
|
||||
@@ -111,6 +124,11 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
A.layer = BELOW_MOB_LAYER
|
||||
A.invisibility = 0
|
||||
A.blend_mode = 0
|
||||
var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob)
|
||||
if(B)
|
||||
var/datum/objective/blob_takeover/main_objective = locate() in B.objectives
|
||||
if(main_objective)
|
||||
main_objective.completed = TRUE
|
||||
to_chat(world, "<B>[real_name] consumed the station in an unstoppable tide!</B>")
|
||||
SSticker.news_report = BLOB_WIN
|
||||
SSticker.force_ending = 1
|
||||
@@ -134,7 +152,6 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
|
||||
/mob/camera/blob/Login()
|
||||
..()
|
||||
sync_mind()
|
||||
to_chat(src, "<span class='notice'>You are the overmind!</span>")
|
||||
blob_help()
|
||||
update_health_hud()
|
||||
@@ -215,12 +232,18 @@ GLOBAL_LIST_EMPTY(blob_nodes)
|
||||
if(placed)
|
||||
var/obj/structure/blob/B = locate() in range("3x3", NewLoc)
|
||||
if(B)
|
||||
loc = NewLoc
|
||||
forceMove(NewLoc)
|
||||
else
|
||||
return 0
|
||||
else
|
||||
var/area/A = get_area(NewLoc)
|
||||
if(isspaceturf(NewLoc) || istype(A, /area/shuttle)) //if unplaced, can't go on shuttles or space tiles
|
||||
return 0
|
||||
loc = NewLoc
|
||||
forceMove(NewLoc)
|
||||
return 1
|
||||
|
||||
/mob/camera/blob/mind_initialize()
|
||||
. = ..()
|
||||
var/datum/antagonist/blob/B = mind.has_antag_datum(/datum/antagonist/blob)
|
||||
if(!B)
|
||||
mind.add_antag_datum(/datum/antagonist/blob)
|
||||
@@ -7,22 +7,23 @@
|
||||
|
||||
// Power verbs
|
||||
|
||||
/mob/camera/blob/proc/place_blob_core(point_rate, placement_override)
|
||||
/mob/camera/blob/proc/place_blob_core(point_rate, placement_override , pop_override = FALSE)
|
||||
if(placed && placement_override != -1)
|
||||
return 1
|
||||
if(!placement_override)
|
||||
for(var/mob/living/M in range(7, src))
|
||||
if("blob" in M.faction)
|
||||
continue
|
||||
if(M.client)
|
||||
to_chat(src, "<span class='warning'>There is someone too close to place your blob core!</span>")
|
||||
return 0
|
||||
for(var/mob/living/M in view(13, src))
|
||||
if("blob" in M.faction)
|
||||
continue
|
||||
if(M.client)
|
||||
to_chat(src, "<span class='warning'>Someone could see your blob core from here!</span>")
|
||||
return 0
|
||||
if(!pop_override)
|
||||
for(var/mob/living/M in range(7, src))
|
||||
if("blob" in M.faction)
|
||||
continue
|
||||
if(M.client)
|
||||
to_chat(src, "<span class='warning'>There is someone too close to place your blob core!</span>")
|
||||
return 0
|
||||
for(var/mob/living/M in view(13, src))
|
||||
if("blob" in M.faction)
|
||||
continue
|
||||
if(M.client)
|
||||
to_chat(src, "<span class='warning'>Someone could see your blob core from here!</span>")
|
||||
return 0
|
||||
var/turf/T = get_turf(src)
|
||||
if(T.density)
|
||||
to_chat(src, "<span class='warning'>This spot is too dense to place a blob core on!</span>")
|
||||
@@ -37,12 +38,12 @@
|
||||
else if(O.density)
|
||||
to_chat(src, "<span class='warning'>This spot is too dense to place a blob core on!</span>")
|
||||
return 0
|
||||
if(world.time <= manualplace_min_time && world.time <= autoplace_max_time)
|
||||
if(!pop_override && world.time <= manualplace_min_time && world.time <= autoplace_max_time)
|
||||
to_chat(src, "<span class='warning'>It is too early to place your blob core!</span>")
|
||||
return 0
|
||||
else if(placement_override == 1)
|
||||
var/turf/T = pick(GLOB.blobstart)
|
||||
loc = T //got overrided? you're somewhere random, motherfucker
|
||||
forceMove(T) //got overrided? you're somewhere random, motherfucker
|
||||
if(placed && blob_core)
|
||||
blob_core.forceMove(loc)
|
||||
else
|
||||
@@ -74,7 +75,7 @@
|
||||
var/node_name = input(src, "Choose a node to jump to.", "Node Jump") in nodes
|
||||
var/obj/structure/blob/node/chosen_node = nodes[node_name]
|
||||
if(chosen_node)
|
||||
loc = chosen_node.loc
|
||||
forceMove(chosen_node.loc)
|
||||
|
||||
/mob/camera/blob/proc/createSpecial(price, blobType, nearEquals, needsNode, turf/T)
|
||||
if(!T)
|
||||
|
||||
@@ -348,4 +348,4 @@
|
||||
icon_state = "blob"
|
||||
name = "blob"
|
||||
desc = "A thick wall of writhing tendrils."
|
||||
brute_resist = 0.25
|
||||
brute_resist = 0.25
|
||||
|
||||
@@ -1,41 +1,3 @@
|
||||
/datum/objective_team/brother_team
|
||||
name = "brotherhood"
|
||||
member_name = "blood brother"
|
||||
var/list/objectives = list()
|
||||
var/meeting_area
|
||||
|
||||
/datum/objective_team/brother_team/is_solo()
|
||||
return FALSE
|
||||
|
||||
/datum/objective_team/brother_team/proc/add_objective(datum/objective/O, needs_target = FALSE)
|
||||
O.team = src
|
||||
if(needs_target)
|
||||
O.find_target()
|
||||
O.update_explanation_text()
|
||||
objectives += O
|
||||
|
||||
/datum/objective_team/brother_team/proc/forge_brother_objectives()
|
||||
objectives = list()
|
||||
var/is_hijacker = prob(10)
|
||||
for(var/i = 1 to max(1, CONFIG_GET(number/brother_objectives_amount) + (members.len > 2) - is_hijacker))
|
||||
forge_single_objective()
|
||||
if(is_hijacker)
|
||||
if(!locate(/datum/objective/hijack) in objectives)
|
||||
add_objective(new/datum/objective/hijack)
|
||||
else if(!locate(/datum/objective/escape) in objectives)
|
||||
add_objective(new/datum/objective/escape)
|
||||
|
||||
/datum/objective_team/brother_team/proc/forge_single_objective()
|
||||
if(prob(50))
|
||||
if(LAZYLEN(active_ais()) && prob(100/GLOB.joined_player_list.len))
|
||||
add_objective(new/datum/objective/destroy, TRUE)
|
||||
else if(prob(30))
|
||||
add_objective(new/datum/objective/maroon, TRUE)
|
||||
else
|
||||
add_objective(new/datum/objective/assassinate, TRUE)
|
||||
else
|
||||
add_objective(new/datum/objective/steal, TRUE)
|
||||
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/brothers = list()
|
||||
var/list/datum/objective_team/brother_team/brother_teams = list()
|
||||
@@ -54,6 +16,7 @@
|
||||
var/list/datum/objective_team/brother_team/pre_brother_teams = list()
|
||||
var/const/team_amount = 2 //hard limit on brother teams if scaling is turned off
|
||||
var/const/min_team_size = 2
|
||||
traitors_required = FALSE //Only teams are possible
|
||||
|
||||
var/meeting_areas = list("The Bar", "Dorms", "Escape Dock", "Arrivals", "Holodeck", "Primary Tool Storage", "Recreation Area", "Chapel", "Library")
|
||||
|
||||
@@ -92,44 +55,13 @@
|
||||
team.forge_brother_objectives()
|
||||
for(var/datum/mind/M in team.members)
|
||||
M.add_antag_datum(ANTAG_DATUM_BROTHER, team)
|
||||
team.update_name()
|
||||
brother_teams += pre_brother_teams
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/traitor/bros/generate_report()
|
||||
return "It's Syndicate recruiting season. Be alert for potential Syndicate infiltrators, but also watch out for disgruntled employees trying to defect. Unlike Nanotrasen, the Syndicate prides itself in teamwork and will only recruit pairs that share a brotherly trust."
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_brother()
|
||||
if(!LAZYLEN(brother_teams))
|
||||
return
|
||||
var/text = "<br><font size=4><b>The blood brothers were:</b></font>"
|
||||
var/teamnumber = 1
|
||||
for(var/datum/objective_team/brother_team/team in brother_teams)
|
||||
if(!team.members.len)
|
||||
continue
|
||||
text += "<br><font size=3><b>Team #[teamnumber++]</b></font>"
|
||||
for(var/datum/mind/M in team.members)
|
||||
text += printplayer(M)
|
||||
var/win = TRUE
|
||||
var/objective_count = 1
|
||||
for(var/datum/objective/objective in team.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><B>Objective #[objective_count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font> [istype(objective, /datum/objective/crew) ? "<font color='grey'>(Optional)</font>" : ""]"
|
||||
SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "SUCCESS"))
|
||||
else
|
||||
text += "<br><B>Objective #[objective_count]</B>: [objective.explanation_text] <font color='red'>Fail.</font> [istype(objective, /datum/objective/crew) ? "<font color='grey'>(Optional)</font>" : ""]"
|
||||
SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "FAIL"))
|
||||
if(!(istype(objective, /datum/objective/crew)))
|
||||
win = FALSE
|
||||
objective_count++
|
||||
if(win)
|
||||
text += "<br><font color='green'><B>The blood brothers were successful!</B></font>"
|
||||
SSblackbox.record_feedback("tally", "brother_success", 1, "SUCCESS")
|
||||
else
|
||||
text += "<br><font color='red'><B>The blood brothers have failed!</B></font>"
|
||||
SSblackbox.record_feedback("tally", "brother_success", 1, "FAIL")
|
||||
text += "<br>"
|
||||
to_chat(world, text)
|
||||
|
||||
/datum/game_mode/proc/update_brother_icons_added(datum/mind/brother_mind)
|
||||
var/datum/atom_hud/antag/brotherhud = GLOB.huds[ANTAG_HUD_BROTHER]
|
||||
brotherhud.join_hud(brother_mind.current)
|
||||
|
||||
@@ -94,47 +94,6 @@ GLOBAL_VAR(changeling_team_objective_type) //If this is not null, we hand our th
|
||||
of the Thing being sent to a station in this sector is highly likely. It may be in the guise of any crew member. Trust nobody - suspect everybody. Do not announce this to the crew, \
|
||||
as paranoia may spread and inhibit workplace efficiency."
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_changeling()
|
||||
var/list/changelings = get_antagonists(/datum/antagonist/changeling,TRUE) //Only real lings get a mention
|
||||
if(changelings.len)
|
||||
var/text = "<br><font size=3><b>The changelings were:</b></font>"
|
||||
for(var/datum/mind/changeling in changelings)
|
||||
var/datum/antagonist/changeling/ling = changeling.has_antag_datum(/datum/antagonist/changeling)
|
||||
var/changelingwin = 1
|
||||
if(!changeling.current)
|
||||
changelingwin = 0
|
||||
|
||||
text += printplayer(changeling)
|
||||
|
||||
//Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed.
|
||||
text += "<br><b>Changeling ID:</b> [ling.changelingID]."
|
||||
text += "<br><b>Genomes Extracted:</b> [ling.absorbedcount]"
|
||||
|
||||
if(changeling.objectives.len)
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in changeling.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <font color='green'><b>Success!</b></font> [istype(objective, /datum/objective/crew) ? "<font color='grey'>(Optional)</font>" : ""]"
|
||||
SSblackbox.record_feedback("nested tally", "changeling_objective", 1, list("[objective.type]", "SUCCESS"))
|
||||
else
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='danger'>Fail.</span> [istype(objective, /datum/objective/crew) ? "<font color='grey'>(Optional)</font>" : ""]"
|
||||
SSblackbox.record_feedback("nested tally", "changeling_objective", 1, list("[objective.type]", "FAIL"))
|
||||
if(!(istype(objective, /datum/objective/crew)))
|
||||
changelingwin = 0
|
||||
count++
|
||||
|
||||
if(changelingwin)
|
||||
text += "<br><font color='green'><b>The changeling was successful!</b></font>"
|
||||
SSblackbox.record_feedback("tally", "changeling_success", 1, "SUCCESS")
|
||||
else
|
||||
text += "<br><span class='boldannounce'>The changeling has failed.</span>"
|
||||
SSblackbox.record_feedback("tally", "changeling_success", 1, "FAIL")
|
||||
text += "<br>"
|
||||
|
||||
to_chat(world, text)
|
||||
|
||||
return 1
|
||||
|
||||
/proc/changeling_transform(mob/living/carbon/human/user, datum/changelingprofile/chosen_prof)
|
||||
var/datum/dna/chosen_dna = chosen_prof.dna
|
||||
user.real_name = chosen_prof.name
|
||||
|
||||
@@ -65,13 +65,16 @@ Credit where due:
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/add_servant_of_ratvar(mob/L, silent = FALSE)
|
||||
/proc/add_servant_of_ratvar(mob/L, silent = FALSE, create_team = TRUE)
|
||||
if(!L || !L.mind)
|
||||
return
|
||||
var/update_type = ANTAG_DATUM_CLOCKCULT
|
||||
if(silent)
|
||||
update_type = ANTAG_DATUM_CLOCKCULT_SILENT
|
||||
. = L.mind.add_antag_datum(update_type)
|
||||
var/datum/antagonist/clockcult/C = new update_type(L.mind)
|
||||
C.make_team = create_team
|
||||
C.show_in_roundend = create_team //tutorial scarabs begone
|
||||
. = L.mind.add_antag_datum(C)
|
||||
|
||||
/proc/remove_servant_of_ratvar(mob/L, silent = FALSE)
|
||||
if(!L || !L.mind)
|
||||
@@ -88,7 +91,6 @@ Credit where due:
|
||||
///////////////
|
||||
|
||||
/datum/game_mode
|
||||
var/datum/mind/eminence //The clockwork Eminence
|
||||
var/list/servants_of_ratvar = list() //The Enlightened servants of Ratvar
|
||||
var/clockwork_explanation = "Defend the Ark of the Clockwork Justiciar and free Ratvar." //The description of the current objective
|
||||
|
||||
@@ -110,6 +112,8 @@ Credit where due:
|
||||
var/servants_to_serve = list()
|
||||
var/roundstart_player_count
|
||||
var/ark_time //In minutes, how long the Ark waits before activation; this is equal to 30 + (number of players / 5) (max 40 mins.)
|
||||
|
||||
var/datum/objective_team/clockcult/main_clockcult
|
||||
|
||||
/datum/game_mode/clockwork_cult/pre_setup()
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
@@ -185,22 +189,21 @@ Credit where due:
|
||||
return FALSE
|
||||
|
||||
/datum/game_mode/clockwork_cult/check_finished()
|
||||
var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar
|
||||
if(G && !GLOB.ratvar_awakens) // Doesn't end until the Ark is destroyed or completed
|
||||
if(GLOB.ark_of_the_clockwork_justiciar && !GLOB.ratvar_awakens) // Doesn't end until the Ark is destroyed or completed
|
||||
return FALSE
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/clockwork_cult/proc/check_clockwork_victory()
|
||||
return main_clockcult.check_clockwork_victory()
|
||||
|
||||
/datum/game_mode/clockwork_cult/set_round_result()
|
||||
..()
|
||||
if(GLOB.clockwork_gateway_activated)
|
||||
SSticker.news_report = CLOCK_SUMMON
|
||||
return TRUE
|
||||
SSticker.mode_result = "win - servants completed their objective (summon ratvar)"
|
||||
else
|
||||
SSticker.news_report = CULT_FAILURE
|
||||
return FALSE
|
||||
|
||||
/datum/game_mode/clockwork_cult/declare_completion()
|
||||
..()
|
||||
return //Doesn't end until the round does
|
||||
SSticker.mode_result = "loss - servants failed their objective (summon ratvar)"
|
||||
|
||||
/datum/game_mode/clockwork_cult/generate_report()
|
||||
return "Bluespace monitors near your sector have detected a continuous stream of patterned fluctuations since the station was completed. It is most probable that a powerful entity \
|
||||
@@ -210,30 +213,6 @@ Credit where due:
|
||||
working for this entity and utilizing highly-advanced technology to cross the great distance at will. If they should turn out to be a credible threat, the task falls on you and \
|
||||
your crew to dispatch it in a timely manner."
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_clockwork_cult()
|
||||
var/text = ""
|
||||
if(istype(SSticker.mode, /datum/game_mode/clockwork_cult)) //Possibly hacky?
|
||||
var/datum/game_mode/clockwork_cult/C = SSticker.mode
|
||||
if(C.check_clockwork_victory())
|
||||
text += "<span class='bold large_brass'>Ratvar's servants defended the Ark until its activation!</span>"
|
||||
SSticker.mode_result = "win - servants completed their objective (summon ratvar)"
|
||||
else
|
||||
text += "<span class='userdanger'>The Ark was destroyed! Ratvar will rust away for all eternity!</span>"
|
||||
SSticker.mode_result = "loss - servants failed their objective (summon ratvar)"
|
||||
text += "<br><b>The servants' objective was:</b> [CLOCKCULT_OBJECTIVE]."
|
||||
text += "<br>Ratvar's servants had <b>[GLOB.clockwork_caches]</b> Tinkerer's Caches."
|
||||
text += "<br><b>Construction Value(CV)</b> was: <b>[GLOB.clockwork_construction_value]</b>"
|
||||
for(var/i in SSticker.scripture_states)
|
||||
if(i != SCRIPTURE_DRIVER)
|
||||
text += "<br><b>[i] scripture</b> was: <b>[SSticker.scripture_states[i] ? "UN":""]LOCKED</b>"
|
||||
if(SSticker.mode.eminence)
|
||||
text += "<br><b>The Eminence was:</b> [printplayer(SSticker.mode.eminence)]"
|
||||
if(servants_of_ratvar.len)
|
||||
text += "<br><b>Ratvar's servants were:</b>"
|
||||
for(var/datum/mind/M in servants_of_ratvar - SSticker.mode.eminence)
|
||||
text += printplayer(M)
|
||||
to_chat(world, text)
|
||||
|
||||
/datum/game_mode/proc/update_servant_icons_added(datum/mind/M)
|
||||
var/datum/atom_hud/antag/A = GLOB.huds[ANTAG_HUD_CLOCKWORK]
|
||||
A.join_hud(M.current)
|
||||
|
||||
@@ -98,12 +98,12 @@
|
||||
if(severity == 1 && uses)
|
||||
uses = 0
|
||||
visible_message("<span class='warning'>[src] is disrupted!</span>")
|
||||
animate(src, alpha = 0, transform = matrix()*2, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
animate(src, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
|
||||
deltimer(timerid)
|
||||
timerid = QDEL_IN(src, 10)
|
||||
linked_gateway.uses = 0
|
||||
linked_gateway.visible_message("<span class='warning'>[linked_gateway] is disrupted!</span>")
|
||||
animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
animate(linked_gateway, alpha = 0, transform = matrix()*2, time = 10, flags = ANIMATION_END_NOW)
|
||||
deltimer(linked_gateway.timerid)
|
||||
linked_gateway.timerid = QDEL_IN(linked_gateway, 10)
|
||||
return TRUE
|
||||
@@ -144,13 +144,13 @@
|
||||
uses = max(0, uses - 1)
|
||||
linked_gateway.uses = max(0, linked_gateway.uses - 1)
|
||||
if(!uses)
|
||||
animate(src, transform = matrix() * 0.1, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
animate(linked_gateway, transform = matrix() * 0.1, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
animate(src, transform = matrix() * 0.1, time = 10, flags = ANIMATION_END_NOW)
|
||||
animate(linked_gateway, transform = matrix() * 0.1, time = 10, flags = ANIMATION_END_NOW)
|
||||
density = FALSE
|
||||
linked_gateway.density = FALSE
|
||||
else
|
||||
animate(src, transform = matrix() / 1.5, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags_1 = ANIMATION_END_NOW)
|
||||
animate(src, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
|
||||
animate(linked_gateway, transform = matrix() / 1.5, time = 10, flags = ANIMATION_END_NOW)
|
||||
addtimer(CALLBACK(src, .proc/check_uses), 10)
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
var/doortype = /obj/machinery/door/airlock/clockwork
|
||||
if(glass)
|
||||
doortype = /obj/machinery/door/airlock/clockwork/brass
|
||||
return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir)
|
||||
return list("operation_time" = 60, "new_obj_type" = doortype, "power_cost" = POWER_WALL_TOTAL, "spawn_dir" = dir, "transfer_name" = TRUE)
|
||||
|
||||
/obj/machinery/door/airlock/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
|
||||
return FALSE
|
||||
@@ -188,7 +188,7 @@
|
||||
|
||||
//Windoor conversion
|
||||
/obj/machinery/door/window/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
|
||||
return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE)
|
||||
return list("operation_time" = 30, "new_obj_type" = /obj/machinery/door/window/clockwork, "power_cost" = POWER_STANDARD, "spawn_dir" = dir, "dir_in_new" = TRUE, "transfer_name" = TRUE)
|
||||
|
||||
/obj/machinery/door/window/clockwork/fabrication_vals(mob/living/user, obj/item/clockwork/replica_fabricator/fabricator, silent)
|
||||
return FALSE
|
||||
|
||||
@@ -91,7 +91,8 @@
|
||||
|
||||
/obj/item/clockwork/construct_chassis/cogscarab/pre_spawn()
|
||||
if(infinite_resources)
|
||||
construct_type = /mob/living/simple_animal/drone/cogscarab/ratvar //During rounds where they can't interact with the station, let them experiment with builds
|
||||
//During rounds where they can't interact with the station, let them experiment with builds
|
||||
construct_type = /mob/living/simple_animal/drone/cogscarab/ratvar
|
||||
|
||||
/obj/item/clockwork/construct_chassis/cogscarab/post_spawn(mob/living/construct)
|
||||
if(infinite_resources) //Allow them to build stuff and recite scripture
|
||||
|
||||
@@ -144,10 +144,14 @@
|
||||
else
|
||||
if(new_thing_type)
|
||||
if(fabrication_values["dir_in_new"])
|
||||
new new_thing_type(get_turf(target), fabrication_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New()
|
||||
var/atom/A = new new_thing_type(get_turf(target), fabrication_values["spawn_dir"]) //please verify that your new object actually wants to get a dir in New()
|
||||
if(fabrication_values["transfer_name"])
|
||||
A.name = target.name
|
||||
else
|
||||
var/atom/A = new new_thing_type(get_turf(target))
|
||||
A.setDir(fabrication_values["spawn_dir"])
|
||||
if(fabrication_values["transfer_name"])
|
||||
A.name = target.name
|
||||
if(!fabrication_values["no_target_deletion"]) //for some cases where fabrication_vals() modifies the object but doesn't want it deleted
|
||||
qdel(target)
|
||||
adjust_clockwork_power(-fabrication_values["power_cost"])
|
||||
|
||||
@@ -14,16 +14,6 @@
|
||||
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
|
||||
var/static/superheated_walls = 0
|
||||
|
||||
/mob/camera/eminence/Initialize()
|
||||
if(SSticker.mode.eminence)
|
||||
return INITIALIZE_HINT_QDEL
|
||||
. = ..()
|
||||
|
||||
/mob/camera/eminence/Destroy(force)
|
||||
if(!force && mind && SSticker.mode.eminence == mind)
|
||||
return QDEL_HINT_LETMELIVE
|
||||
return ..()
|
||||
|
||||
/mob/camera/eminence/CanPass(atom/movable/mover, turf/target)
|
||||
return TRUE
|
||||
|
||||
@@ -39,12 +29,20 @@
|
||||
|
||||
/mob/camera/eminence/Login()
|
||||
..()
|
||||
add_servant_of_ratvar(src, TRUE)
|
||||
var/datum/antagonist/clockcult/C = mind.has_antag_datum(/datum/antagonist/clockcult,TRUE)
|
||||
if(!C)
|
||||
add_servant_of_ratvar(src, TRUE)
|
||||
C = mind.has_antag_datum(/datum/antagonist/clockcult,TRUE)
|
||||
if(C && C.clock_team)
|
||||
if(C.clock_team.eminence)
|
||||
remove_servant_of_ratvar(src,TRUE)
|
||||
qdel(src)
|
||||
else
|
||||
C.clock_team.eminence = src
|
||||
to_chat(src, "<span class='bold large_brass'>You have been selected as the Eminence!</span>")
|
||||
to_chat(src, "<span class='brass'>As the Eminence, you lead the servants. Anything you say will be heard by the entire cult.</span>")
|
||||
to_chat(src, "<span class='brass'>Though you can move through walls, you're also incorporeal, and largely can't interact with the world except for a few ways.</span>")
|
||||
to_chat(src, "<span class='brass'>Additionally, unless the herald's beacon is activated, you can't understand any speech while away from Reebe.</span>")
|
||||
SSticker.mode.eminence = mind
|
||||
eminence_help()
|
||||
for(var/V in actions)
|
||||
var/datum/action/A = V
|
||||
|
||||
@@ -17,7 +17,11 @@
|
||||
return
|
||||
if(kingmaking)
|
||||
return
|
||||
if(SSticker.mode.eminence)
|
||||
|
||||
var/datum/antagonist/clockcult/C = user.mind.has_antag_datum(/datum/antagonist/clockcult)
|
||||
if(!C || !C.clock_team)
|
||||
return
|
||||
if(C.clock_team.eminence)
|
||||
to_chat(user, "<span class='warning'>There's already an Eminence!</span>")
|
||||
return
|
||||
if(!GLOB.servants_active)
|
||||
@@ -34,7 +38,9 @@
|
||||
/obj/structure/destructible/clockwork/eminence_spire/attack_ghost(mob/user)
|
||||
if(!IsAdminGhost(user))
|
||||
return
|
||||
if(SSticker.mode.eminence)
|
||||
|
||||
var/datum/antagonist/clockcult/random_cultist = locate() in GLOB.antagonists //if theres no cultists new team without eminence will be created anyway.
|
||||
if(random_cultist && random_cultist.clock_team && random_cultist.clock_team.eminence)
|
||||
to_chat(user, "<span class='warning'>There's already an Eminence - too late!</span>")
|
||||
return
|
||||
if(!GLOB.servants_active)
|
||||
|
||||
@@ -2,24 +2,23 @@
|
||||
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/cult = list()
|
||||
var/list/cult_objectives = list()
|
||||
var/eldergod = 1 //for the summon god objective
|
||||
|
||||
/proc/iscultist(mob/living/M)
|
||||
return istype(M) && M.mind && M.mind.has_antag_datum(ANTAG_DATUM_CULT)
|
||||
|
||||
/proc/is_sacrifice_target(datum/mind/mind)
|
||||
if(mind == GLOB.sac_mind)
|
||||
return TRUE
|
||||
/datum/objective_team/cult/proc/is_sacrifice_target(datum/mind/mind)
|
||||
for(var/datum/objective/sacrifice/sac_objective in objectives)
|
||||
if(mind == sac_objective.target)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/is_convertable_to_cult(mob/living/M)
|
||||
|
||||
/proc/is_convertable_to_cult(mob/living/M,datum/objective_team/cult/specific_cult)
|
||||
if(!istype(M))
|
||||
return FALSE
|
||||
if(M.mind)
|
||||
if(ishuman(M) && (M.mind.assigned_role in list("Captain", "Chaplain")))
|
||||
return FALSE
|
||||
if(is_sacrifice_target(M.mind))
|
||||
if(specific_cult && specific_cult.is_sacrifice_target(M.mind))
|
||||
return FALSE
|
||||
if(M.mind.enslaved_to && !iscultist(M.mind.enslaved_to))
|
||||
return FALSE
|
||||
@@ -55,10 +54,10 @@
|
||||
|
||||
var/list/cultists_to_cult = list() //the cultists we'll convert
|
||||
|
||||
var/datum/objective_team/cult/main_cult
|
||||
|
||||
|
||||
/datum/game_mode/cult/pre_setup()
|
||||
cult_objectives += "sacrifice"
|
||||
|
||||
if(CONFIG_GET(flag/protect_roles_from_antagonist))
|
||||
restricted_jobs += protected_jobs
|
||||
|
||||
@@ -86,82 +85,19 @@
|
||||
|
||||
|
||||
/datum/game_mode/cult/post_setup()
|
||||
if("sacrifice" in cult_objectives)
|
||||
var/list/possible_targets = get_unconvertables()
|
||||
if(!possible_targets.len)
|
||||
message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
|
||||
for(var/mob/living/carbon/human/player in GLOB.player_list)
|
||||
if(player.mind && !(player.mind in cultists_to_cult))
|
||||
possible_targets += player.mind
|
||||
if(possible_targets.len > 0)
|
||||
GLOB.sac_mind = pick(possible_targets)
|
||||
if(!GLOB.sac_mind)
|
||||
message_admins("Cult Sacrifice: ERROR - Null target chosen!")
|
||||
else
|
||||
var/datum/job/sacjob = SSjob.GetJob(GLOB.sac_mind.assigned_role)
|
||||
var/datum/preferences/sacface = GLOB.sac_mind.current.client.prefs
|
||||
var/icon/reshape = get_flat_human_icon(null, sacjob, sacface)
|
||||
reshape.Shift(SOUTH, 4)
|
||||
reshape.Shift(EAST, 1)
|
||||
reshape.Crop(7,4,26,31)
|
||||
reshape.Crop(-5,-3,26,30)
|
||||
GLOB.sac_image = reshape
|
||||
else
|
||||
message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!")
|
||||
if(!GLOB.summon_spots.len)
|
||||
while(GLOB.summon_spots.len < SUMMON_POSSIBILITIES)
|
||||
var/area/summon = pick(GLOB.sortedAreas - GLOB.summon_spots)
|
||||
if((summon.z in GLOB.station_z_levels) && summon.valid_territory)
|
||||
GLOB.summon_spots += summon
|
||||
cult_objectives += "eldergod"
|
||||
|
||||
for(var/datum/mind/cult_mind in cultists_to_cult)
|
||||
equip_cultist(cult_mind.current)
|
||||
update_cult_icons_added(cult_mind)
|
||||
to_chat(cult_mind.current, "<span class='userdanger'>You are a member of the cult!</span>")
|
||||
cult_mind.current.playsound_local(get_turf(cult_mind.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE)//subject to change
|
||||
add_cultist(cult_mind, 0)
|
||||
add_cultist(cult_mind, 0, equip=TRUE)
|
||||
..()
|
||||
|
||||
/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob,tome = 0)
|
||||
if(!istype(mob))
|
||||
return
|
||||
if (mob.mind)
|
||||
if (mob.mind.assigned_role == "Clown")
|
||||
to_chat(mob, "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
|
||||
mob.dna.remove_mutation(CLOWNMUT)
|
||||
|
||||
if(tome)
|
||||
. += cult_give_item(/obj/item/tome, mob)
|
||||
else
|
||||
. += cult_give_item(/obj/item/paper/talisman/supply, mob)
|
||||
to_chat(mob, "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>")
|
||||
|
||||
/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
|
||||
var/list/slots = list(
|
||||
"backpack" = slot_in_backpack,
|
||||
"left pocket" = slot_l_store,
|
||||
"right pocket" = slot_r_store
|
||||
)
|
||||
|
||||
var/T = new item_path(mob)
|
||||
var/item_name = initial(item_path.name)
|
||||
var/where = mob.equip_in_one_of_slots(T, slots)
|
||||
if(!where)
|
||||
to_chat(mob, "<span class='userdanger'>Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).</span>")
|
||||
return 0
|
||||
else
|
||||
to_chat(mob, "<span class='danger'>You have a [item_name] in your [where].</span>")
|
||||
if(where == "backpack")
|
||||
var/obj/item/storage/B = mob.back
|
||||
B.orient2hud(mob)
|
||||
B.show_to(mob)
|
||||
return 1
|
||||
|
||||
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun) //BASE
|
||||
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind, stun , equip = FALSE) //BASE
|
||||
if (!istype(cult_mind))
|
||||
return 0
|
||||
if(cult_mind.add_antag_datum(ANTAG_DATUM_CULT))
|
||||
|
||||
var/datum/antagonist/cult/new_cultist = new(cult_mind)
|
||||
new_cultist.give_equipment = equip
|
||||
|
||||
if(cult_mind.add_antag_datum(new_cultist))
|
||||
if(stun)
|
||||
cult_mind.current.Unconscious(100)
|
||||
return 1
|
||||
@@ -187,25 +123,19 @@
|
||||
culthud.leave_hud(cult_mind.current)
|
||||
set_antag_hud(cult_mind.current, null)
|
||||
|
||||
/datum/game_mode/cult/proc/get_unconvertables()
|
||||
var/list/ucs = list()
|
||||
for(var/mob/living/carbon/human/player in GLOB.player_list)
|
||||
if(player.mind && !is_convertable_to_cult(player) && !(player.mind in cultists_to_cult))
|
||||
ucs += player.mind
|
||||
return ucs
|
||||
|
||||
/datum/game_mode/cult/proc/check_cult_victory()
|
||||
var/cult_fail = 0
|
||||
if(cult_objectives.Find("survive"))
|
||||
cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise
|
||||
if(cult_objectives.Find("eldergod"))
|
||||
cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once
|
||||
if(cult_objectives.Find("sacrifice"))
|
||||
if(GLOB.sac_mind && !GLOB.sac_complete) //if the target has been GLOB.sacrificed, ignore this step. otherwise, add 1 to cult_fail
|
||||
cult_fail++
|
||||
return cult_fail //if any objectives aren't met, failure
|
||||
return main_cult.check_cult_victory()
|
||||
|
||||
|
||||
/datum/game_mode/cult/set_round_result()
|
||||
..()
|
||||
if(check_cult_victory())
|
||||
SSticker.mode_result = "win - cult win"
|
||||
SSticker.news_report = CULT_SUMMON
|
||||
else
|
||||
SSticker.mode_result = "loss - staff stopped the cult"
|
||||
SSticker.news_report = CULT_FAILURE
|
||||
|
||||
/datum/game_mode/cult/proc/check_survive()
|
||||
var/acolytes_survived = 0
|
||||
for(var/datum/mind/cult_mind in cult)
|
||||
@@ -218,57 +148,6 @@
|
||||
return 1
|
||||
|
||||
|
||||
/datum/game_mode/cult/declare_completion()
|
||||
|
||||
if(!check_cult_victory())
|
||||
SSticker.mode_result = "win - cult win"
|
||||
to_chat(world, "<span class='greentext'>The cult has succeeded! Nar-sie has snuffed out another torch in the void!</span>")
|
||||
else
|
||||
SSticker.mode_result = "loss - staff stopped the cult"
|
||||
to_chat(world, "<span class='redtext'>The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!</span>")
|
||||
|
||||
var/text = ""
|
||||
|
||||
if(cult_objectives.len)
|
||||
text += "<br><b>The cultists' objectives were:</b>"
|
||||
for(var/obj_count=1, obj_count <= cult_objectives.len, obj_count++)
|
||||
var/explanation
|
||||
switch(cult_objectives[obj_count])
|
||||
if("survive")
|
||||
if(!check_survive())
|
||||
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='greenannounce'>Success!</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_survive", "SUCCESS"))
|
||||
SSticker.news_report = CULT_ESCAPE
|
||||
else
|
||||
explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) <span class='boldannounce'>Fail.</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_survive", "FAIL"))
|
||||
SSticker.news_report = CULT_FAILURE
|
||||
if("sacrifice")
|
||||
if(GLOB.sac_complete)
|
||||
explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. <span class='greenannounce'>Success!</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "SUCCESS"))
|
||||
else
|
||||
explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. <span class='boldannounce'>Fail.</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "FAIL"))
|
||||
if("eldergod")
|
||||
if(!eldergod)
|
||||
explanation = "Summon Nar-Sie. The summoning can only be accomplished in [english_list(GLOB.summon_spots)].<span class='greenannounce'>Success!</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "SUCCESS"))
|
||||
SSticker.news_report = CULT_SUMMON
|
||||
else
|
||||
explanation = "Summon Nar-Sie. The summoning can only be accomplished in [english_list(GLOB.summon_spots)]<span class='boldannounce'>Fail.</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "FAIL"))
|
||||
SSticker.news_report = CULT_FAILURE
|
||||
|
||||
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
|
||||
if(cult.len)
|
||||
text += "<br><b>The cultists were:</b>"
|
||||
for(var/datum/mind/M in cult)
|
||||
text += printplayer(M)
|
||||
to_chat(world, text)
|
||||
..()
|
||||
return 1
|
||||
|
||||
/datum/game_mode/cult/generate_report()
|
||||
return "Some stations in your sector have reported evidence of blood sacrifice and strange magic. Ties to the Wizards' Federation have been proven not to exist, and many employees \
|
||||
have disappeared; even Central Command employees light-years away have felt strange presences and at times hysterical compulsions. Interrogations point towards this being the work of \
|
||||
@@ -276,41 +155,4 @@
|
||||
devoted to stopping this cult. Note that holy water seems to weaken and eventually return the minds of cultists that ingest it, and mindshield implants will prevent conversion \
|
||||
altogether."
|
||||
|
||||
/datum/game_mode/proc/datum_cult_completion()
|
||||
var/text = ""
|
||||
var/cult_fail = 0
|
||||
cult_fail += eldergod
|
||||
if(!GLOB.sac_complete)
|
||||
cult_fail++
|
||||
if(!cult_fail)
|
||||
SSticker.mode_result = "win - cult win"
|
||||
to_chat(world, "<span class='greentext'>The cult has succeeded! Nar-sie has snuffed out another torch in the void!</span>")
|
||||
else
|
||||
SSticker.mode_result = "loss - staff stopped the cult"
|
||||
to_chat(world, "<span class='redtext'>The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!</span>")
|
||||
if(cult_objectives.len)
|
||||
text += "<br><b>The cultists' objectives were:</b>"
|
||||
for(var/obj_count in 1 to 2)
|
||||
var/explanation
|
||||
switch(cult_objectives[obj_count])
|
||||
if("sacrifice")
|
||||
if(GLOB.sac_mind)
|
||||
if(GLOB.sac_complete)
|
||||
explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. <span class='greenannounce'>Success!</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "SUCCESS"))
|
||||
else
|
||||
explanation = "Sacrifice [GLOB.sac_mind], the [GLOB.sac_mind.assigned_role]. <span class='boldannounce'>Fail.</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_sacrifice", "FAIL"))
|
||||
if("eldergod")
|
||||
if(!eldergod)
|
||||
explanation = "Summon Nar-Sie. <span class='greenannounce'>Success!</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "SUCCESS"))
|
||||
SSticker.news_report = CULT_SUMMON
|
||||
else
|
||||
explanation = "Summon Nar-Sie. <span class='boldannounce'>Fail.</span>"
|
||||
SSblackbox.record_feedback("nested tally", "cult_objective", 1, list("cult_narsie", "FAIL"))
|
||||
SSticker.news_report = CULT_FAILURE
|
||||
text += "<br><B>Objective #[obj_count]</B>: [explanation]"
|
||||
to_chat(world, text)
|
||||
|
||||
#undef CULT_SCALING_COEFFICIENT
|
||||
|
||||
@@ -88,19 +88,21 @@
|
||||
button_icon_state = "cultvote"
|
||||
|
||||
/datum/action/innate/cult/mastervote/IsAvailable()
|
||||
if(GLOB.cult_vote_called || !ishuman(owner))
|
||||
var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
if(!C || C.cult_team.cult_vote_called || !ishuman(owner))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/datum/action/innate/cult/mastervote/Activate()
|
||||
pollCultists(owner)
|
||||
var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
pollCultists(owner,C.cult_team)
|
||||
|
||||
/proc/pollCultists(var/mob/living/Nominee) //Cult Master Poll
|
||||
/proc/pollCultists(var/mob/living/Nominee,datum/objective_team/cult/team) //Cult Master Poll
|
||||
if(world.time < CULT_POLL_WAIT)
|
||||
to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].")
|
||||
return
|
||||
GLOB.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try
|
||||
for(var/datum/mind/B in SSticker.mode.cult)
|
||||
team.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try
|
||||
for(var/datum/mind/B in team.members)
|
||||
if(B.current)
|
||||
B.current.update_action_buttons_icon()
|
||||
if(!B.current.incapacitated())
|
||||
@@ -108,39 +110,39 @@
|
||||
to_chat(B.current, "<span class='cultlarge'>Acolyte [Nominee] has asserted that they are worthy of leading the cult. A vote will be called shortly.</span>")
|
||||
sleep(100)
|
||||
var/list/asked_cultists = list()
|
||||
for(var/datum/mind/B in SSticker.mode.cult)
|
||||
for(var/datum/mind/B in team.members)
|
||||
if(B.current && B.current != Nominee && !B.current.incapacitated())
|
||||
SEND_SOUND(B.current, 'sound/magic/exit_blood.ogg')
|
||||
asked_cultists += B.current
|
||||
var/list/yes_voters = pollCandidates("[Nominee] seeks to lead your cult, do you support [Nominee.p_them()]?", poll_time = 300, group = asked_cultists)
|
||||
if(QDELETED(Nominee) || Nominee.incapacitated())
|
||||
GLOB.cult_vote_called = FALSE
|
||||
for(var/datum/mind/B in SSticker.mode.cult)
|
||||
team.cult_vote_called = FALSE
|
||||
for(var/datum/mind/B in team.members)
|
||||
if(B.current)
|
||||
B.current.update_action_buttons_icon()
|
||||
if(!B.current.incapacitated())
|
||||
to_chat(B.current,"<span class='cultlarge'>[Nominee] has died in the process of attempting to win the cult's support!</span>")
|
||||
return FALSE
|
||||
if(!Nominee.mind)
|
||||
GLOB.cult_vote_called = FALSE
|
||||
for(var/datum/mind/B in SSticker.mode.cult)
|
||||
team.cult_vote_called = FALSE
|
||||
for(var/datum/mind/B in team.members)
|
||||
if(B.current)
|
||||
B.current.update_action_buttons_icon()
|
||||
if(!B.current.incapacitated())
|
||||
to_chat(B.current,"<span class='cultlarge'>[Nominee] has gone catatonic in the process of attempting to win the cult's support!</span>")
|
||||
return FALSE
|
||||
if(LAZYLEN(yes_voters) <= LAZYLEN(asked_cultists) * 0.5)
|
||||
GLOB.cult_vote_called = FALSE
|
||||
for(var/datum/mind/B in SSticker.mode.cult)
|
||||
team.cult_vote_called = FALSE
|
||||
for(var/datum/mind/B in team.members)
|
||||
if(B.current)
|
||||
B.current.update_action_buttons_icon()
|
||||
if(!B.current.incapacitated())
|
||||
to_chat(B.current, "<span class='cultlarge'>[Nominee] could not win the cult's support and shall continue to serve as an acolyte.</span>")
|
||||
return FALSE
|
||||
GLOB.cult_mastered = TRUE
|
||||
team.cult_mastered = TRUE
|
||||
SSticker.mode.remove_cultist(Nominee.mind, TRUE)
|
||||
Nominee.mind.add_antag_datum(ANTAG_DATUM_CULT_MASTER)
|
||||
for(var/datum/mind/B in SSticker.mode.cult)
|
||||
for(var/datum/mind/B in team.members)
|
||||
if(B.current)
|
||||
for(var/datum/action/innate/cult/mastervote/vote in B.current.actions)
|
||||
vote.Remove(B.current)
|
||||
@@ -159,6 +161,9 @@
|
||||
button_icon_state = "sintouch"
|
||||
|
||||
/datum/action/innate/cult/master/finalreck/Activate()
|
||||
var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
if(!antag)
|
||||
return
|
||||
for(var/i in 1 to 4)
|
||||
chant(i)
|
||||
var/list/destinations = list()
|
||||
@@ -169,7 +174,7 @@
|
||||
to_chat(owner, "<span class='warning'>You need more space to summon the cult!</span>")
|
||||
return
|
||||
if(do_after(owner, 30, target = owner))
|
||||
for(var/datum/mind/B in SSticker.mode.cult)
|
||||
for(var/datum/mind/B in antag.cult_team.members)
|
||||
if(B.current && B.current.stat != DEAD)
|
||||
var/turf/mobloc = get_turf(B.current)
|
||||
switch(i)
|
||||
@@ -194,7 +199,7 @@
|
||||
addtimer(CALLBACK(B.current, /mob/.proc/reckon, final), 10)
|
||||
else
|
||||
return
|
||||
GLOB.reckoning_complete = TRUE
|
||||
antag.cult_team.reckoning_complete = TRUE
|
||||
Remove(owner)
|
||||
|
||||
/mob/proc/reckon(turf/final)
|
||||
@@ -269,34 +274,37 @@
|
||||
var/turf/T = get_turf(ranged_ability_user)
|
||||
if(!isturf(T))
|
||||
return FALSE
|
||||
|
||||
var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
|
||||
if(target in view(7, get_turf(ranged_ability_user)))
|
||||
GLOB.blood_target = target
|
||||
C.cult_team.blood_target = target
|
||||
var/area/A = get_area(target)
|
||||
attached_action.cooldown = world.time + attached_action.base_cooldown
|
||||
addtimer(CALLBACK(attached_action.owner, /mob.proc/update_action_buttons_icon), attached_action.base_cooldown)
|
||||
GLOB.blood_target_image = image('icons/effects/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER)
|
||||
GLOB.blood_target_image.appearance_flags = RESET_COLOR
|
||||
GLOB.blood_target_image.pixel_x = -target.pixel_x
|
||||
GLOB.blood_target_image.pixel_y = -target.pixel_y
|
||||
C.cult_team.blood_target_image = image('icons/effects/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER)
|
||||
C.cult_team.blood_target_image.appearance_flags = RESET_COLOR
|
||||
C.cult_team.blood_target_image.pixel_x = -target.pixel_x
|
||||
C.cult_team.blood_target_image.pixel_y = -target.pixel_y
|
||||
for(var/datum/mind/B in SSticker.mode.cult)
|
||||
if(B.current && B.current.stat != DEAD && B.current.client)
|
||||
to_chat(B.current, "<span class='cultlarge'><b>Master [ranged_ability_user] has marked [GLOB.blood_target] in the [A.name] as the cult's top priority, get there immediately!</b></span>")
|
||||
to_chat(B.current, "<span class='cultlarge'><b>Master [ranged_ability_user] has marked [C.cult_team.blood_target] in the [A.name] as the cult's top priority, get there immediately!</b></span>")
|
||||
SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75))
|
||||
B.current.client.images += GLOB.blood_target_image
|
||||
B.current.client.images += C.cult_team.blood_target_image
|
||||
attached_action.owner.update_action_buttons_icon()
|
||||
remove_ranged_ability("<span class='cult'>The marking rite is complete! It will last for 90 seconds.</span>")
|
||||
GLOB.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, .proc/reset_blood_target), 900, TIMER_STOPPABLE)
|
||||
C.cult_team.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, .proc/reset_blood_target,C.cult_team), 900, TIMER_STOPPABLE)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/proc/reset_blood_target()
|
||||
for(var/datum/mind/B in SSticker.mode.cult)
|
||||
/proc/reset_blood_target(datum/objective_team/cult/team)
|
||||
for(var/datum/mind/B in team.members)
|
||||
if(B.current && B.current.stat != DEAD && B.current.client)
|
||||
if(GLOB.blood_target)
|
||||
if(team.blood_target)
|
||||
to_chat(B.current,"<span class='cultlarge'><b>The blood mark has expired!</b></span>")
|
||||
B.current.client.images -= GLOB.blood_target_image
|
||||
QDEL_NULL(GLOB.blood_target_image)
|
||||
GLOB.blood_target = null
|
||||
B.current.client.images -= team.blood_target_image
|
||||
QDEL_NULL(team.blood_target_image)
|
||||
team.blood_target = null
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
|
||||
/obj/item/twohanded/required/cult_bastard/afterattack(atom/target, mob/user, proximity, click_parameters)
|
||||
. = ..()
|
||||
if(dash_toggled && jaunt.IsAvailable())
|
||||
if(dash_toggled)
|
||||
jaunt.Teleport(user, target)
|
||||
return
|
||||
if(!proximity)
|
||||
|
||||
@@ -100,10 +100,9 @@
|
||||
if(cooldowntime > world.time)
|
||||
to_chat(user, "<span class='cultitalic'>The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].</span>")
|
||||
return
|
||||
var/option = "Shielded Robe"
|
||||
option = input(user, "You study the schematics etched into the forge...", "[src]", option) as null|anything in list("Shielded Robe", "Flagellant's Robe", "Bastard Sword", "Nar-Sien Hardsuit")
|
||||
var/choice = alert(user,"You study the schematics etched into the forge...",,"Shielded Robe","Flagellant's Robe","Bastard Sword")
|
||||
var/pickedtype
|
||||
switch(option)
|
||||
switch(choice)
|
||||
if("Shielded Robe")
|
||||
pickedtype = /obj/item/clothing/suit/hooded/cultrobes/cult_shield
|
||||
if("Flagellant's Robe")
|
||||
|
||||
@@ -179,6 +179,13 @@ This file contains the arcane tome files.
|
||||
var/list/shields = list()
|
||||
var/area/A = get_area(src)
|
||||
|
||||
var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
if(!user_antag)
|
||||
return
|
||||
|
||||
var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives
|
||||
var/datum/objective/sacrifice/sac_objective = locate() in user_antag.cult_team.objectives
|
||||
|
||||
if(!check_rune_turf(Turf, user))
|
||||
return
|
||||
entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in GLOB.rune_types
|
||||
@@ -196,18 +203,20 @@ This file contains the arcane tome files.
|
||||
A = get_area(src)
|
||||
if(!src || QDELETED(src) || !Adjacent(user) || user.incapacitated() || !check_rune_turf(Turf, user))
|
||||
return
|
||||
|
||||
//AAAAAAAAAAAAAAAH, i'm rewriting enough for now so TODO: remove this shit
|
||||
if(ispath(rune_to_scribe, /obj/effect/rune/narsie))
|
||||
if(!("eldergod" in SSticker.mode.cult_objectives))
|
||||
if(!summon_objective)
|
||||
to_chat(user, "<span class='warning'>Nar-Sie does not wish to be summoned!</span>")
|
||||
return
|
||||
if(!GLOB.sac_complete)
|
||||
if(sac_objective && !sac_objective.check_completion())
|
||||
to_chat(user, "<span class='warning'>The sacrifice is not complete. The portal would lack the power to open if you tried!</span>")
|
||||
return
|
||||
if(!SSticker.mode.eldergod)
|
||||
if(summon_objective.check_completion())
|
||||
to_chat(user, "<span class='cultlarge'>\"I am already here. There is no need to try to summon me now.\"</span>")
|
||||
return
|
||||
if(!(A in GLOB.summon_spots))
|
||||
to_chat(user, "<span class='cultlarge'>The Geometer can only be summoned where the veil is weak - in [english_list(GLOB.summon_spots)]!</span>")
|
||||
if(!(A in summon_objective.summon_spots))
|
||||
to_chat(user, "<span class='cultlarge'>The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!</span>")
|
||||
return
|
||||
var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie; it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No")
|
||||
if(confirm_final == "No")
|
||||
@@ -215,8 +224,8 @@ This file contains the arcane tome files.
|
||||
return
|
||||
Turf = get_turf(user)
|
||||
A = get_area(src)
|
||||
if(!(A in GLOB.summon_spots)) // Check again to make sure they didn't move
|
||||
to_chat(user, "<span class='cultlarge'>The Geometer can only be summoned where the veil is weak - in [english_list(GLOB.summon_spots)]!</span>")
|
||||
if(!(A in summon_objective.summon_spots)) // Check again to make sure they didn't move
|
||||
to_chat(user, "<span class='cultlarge'>The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!</span>")
|
||||
return
|
||||
priority_announce("Figments from an eldritch god are being summoned by [user] into [A.map_name] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensional Affairs", 'sound/ai/spanomalies.ogg')
|
||||
for(var/B in spiral_range_turfs(1, user, 1))
|
||||
@@ -257,8 +266,10 @@ This file contains the arcane tome files.
|
||||
to_chat(user, "<span class='cult'>There is already a rune here.</span>")
|
||||
return FALSE
|
||||
|
||||
|
||||
if(!(T.z in GLOB.station_z_levels) && T.z != ZLEVEL_MINING)
|
||||
to_chat(user, "<span class='warning'>The veil is not weak enough here.</span>")
|
||||
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -349,7 +349,11 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
color = RUNE_COLOR_DARKRED
|
||||
var/mob/living/L = pick(myriad_targets)
|
||||
var/is_clock = is_servant_of_ratvar(L)
|
||||
var/is_convertable = is_convertable_to_cult(L)
|
||||
|
||||
var/mob/living/F = invokers[1]
|
||||
var/datum/antagonist/cult/C = F.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
|
||||
var/is_convertable = is_convertable_to_cult(L,C.cult_team)
|
||||
if(L.stat != DEAD && (is_clock || is_convertable))
|
||||
invocation = "Mah'weyh pleggh at e'ntrath!"
|
||||
..()
|
||||
@@ -397,17 +401,27 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
return 1
|
||||
|
||||
/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
|
||||
var/mob/living/first_invoker = invokers[1]
|
||||
if(!first_invoker)
|
||||
return FALSE
|
||||
var/datum/antagonist/cult/C = first_invoker.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
if(!C)
|
||||
return
|
||||
|
||||
|
||||
var/big_sac = FALSE
|
||||
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
|
||||
if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
|
||||
for(var/M in invokers)
|
||||
to_chat(M, "<span class='cultitalic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
|
||||
log_game("Offer rune failed - not enough acolytes and target is living or sac target")
|
||||
return FALSE
|
||||
if(sacrificial.mind)
|
||||
GLOB.sacrificed += sacrificial.mind
|
||||
if(is_sacrifice_target(sacrificial.mind))
|
||||
GLOB.sac_complete = TRUE
|
||||
big_sac = TRUE
|
||||
for(var/datum/objective/sacrifice/sac_objective in C.cult_team.objectives)
|
||||
if(sac_objective.target == sacrificial.mind)
|
||||
sac_objective.sacced = TRUE
|
||||
sac_objective.update_explanation_text()
|
||||
big_sac = TRUE
|
||||
else
|
||||
GLOB.sacrificed += sacrificial
|
||||
|
||||
@@ -481,7 +495,6 @@ structure_check() searches for nearby cultist structures required for the invoca
|
||||
sleep(40)
|
||||
if(src)
|
||||
color = RUNE_COLOR_RED
|
||||
SSticker.mode.eldergod = FALSE
|
||||
new /obj/singularity/narsie/large/cult(T) //Causes Nar-Sie to spawn even if the rune has been removed
|
||||
|
||||
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
|
||||
|
||||
@@ -3,32 +3,6 @@
|
||||
var/list/datum/mind/devils = list()
|
||||
var/devil_ascended = 0 // Number of arch devils on station
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_sintouched()
|
||||
var/text = ""
|
||||
if(sintouched.len)
|
||||
text += "<br><span class='big'><b>The sintouched were:</b></span>"
|
||||
var/list/sintouchedUnique = uniqueList(sintouched)
|
||||
for(var/S in sintouchedUnique)
|
||||
var/datum/mind/sintouched_mind = S
|
||||
text += printplayer(sintouched_mind)
|
||||
text += printobjectives(sintouched_mind)
|
||||
text += "<br>"
|
||||
text += "<br>"
|
||||
to_chat(world, text)
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_devils()
|
||||
/var/text = ""
|
||||
if(devils.len)
|
||||
text += "<br><span class='big'><b>The devils were:</b></span>"
|
||||
for(var/D in devils)
|
||||
var/datum/mind/devil = D
|
||||
text += printplayer(devil)
|
||||
text += printdevilinfo(devil.current)
|
||||
text += printobjectives(devil)
|
||||
text += "<br>"
|
||||
text += "<br>"
|
||||
to_chat(world, text)
|
||||
|
||||
/datum/game_mode/proc/add_devil_objectives(datum/mind/devil_mind, quantity)
|
||||
var/list/validtypes = list(/datum/objective/devil/soulquantity, /datum/objective/devil/soulquality, /datum/objective/devil/sintouch, /datum/objective/devil/buy_target)
|
||||
for(var/i = 1 to quantity)
|
||||
@@ -41,18 +15,6 @@
|
||||
else
|
||||
objective.find_target()
|
||||
|
||||
/datum/game_mode/proc/printdevilinfo(mob/living/ply)
|
||||
var/datum/antagonist/devil/devilinfo = is_devil(ply)
|
||||
if(!devilinfo)
|
||||
return "Target is not a devil."
|
||||
var/text = "</br>The devil's true name is: [devilinfo.truename]</br>"
|
||||
text += "The devil's bans were:</br>"
|
||||
text += " [GLOB.lawlorify[LORE][devilinfo.ban]]</br>"
|
||||
text += " [GLOB.lawlorify[LORE][devilinfo.bane]]</br>"
|
||||
text += " [GLOB.lawlorify[LORE][devilinfo.obligation]]</br>"
|
||||
text += " [GLOB.lawlorify[LORE][devilinfo.banish]]</br></br>"
|
||||
return text
|
||||
|
||||
/datum/game_mode/proc/update_devil_icons_added(datum/mind/devil_mind)
|
||||
var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_DEVIL]
|
||||
hud.join_hud(devil_mind.current)
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
var/probability = 0
|
||||
var/false_report_weight = 0 //How often will this show up incorrectly in a centcom report?
|
||||
var/station_was_nuked = 0 //see nuclearbomb.dm and malfunction.dm
|
||||
var/nuke_off_station = 0 //Used for tracking where the nuke hit
|
||||
var/round_ends_with_antag_death = 0 //flags the "one verse the station" antags as such
|
||||
var/list/datum/mind/antag_candidates = list() // List of possible starting antags goes here
|
||||
var/list/restricted_jobs = list() // Jobs it doesn't make sense to be. I.E chaplain or AI cultist
|
||||
@@ -73,7 +74,6 @@
|
||||
/datum/game_mode/proc/pre_setup()
|
||||
return 1
|
||||
|
||||
|
||||
///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things
|
||||
/datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report.
|
||||
if(!report)
|
||||
@@ -241,55 +241,9 @@
|
||||
return 0
|
||||
|
||||
|
||||
/datum/game_mode/proc/declare_completion()
|
||||
var/clients = 0
|
||||
var/surviving_humans = 0
|
||||
var/surviving_total = 0
|
||||
var/ghosts = 0
|
||||
var/escaped_humans = 0
|
||||
var/escaped_total = 0
|
||||
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.client)
|
||||
clients++
|
||||
if(ishuman(M))
|
||||
if(!M.stat)
|
||||
surviving_humans++
|
||||
if(M.z == ZLEVEL_CENTCOM)
|
||||
escaped_humans++
|
||||
if(!M.stat)
|
||||
surviving_total++
|
||||
if(M.z == ZLEVEL_CENTCOM)
|
||||
escaped_total++
|
||||
|
||||
|
||||
if(isobserver(M))
|
||||
ghosts++
|
||||
|
||||
if(clients)
|
||||
SSblackbox.record_feedback("nested tally", "round_end_stats", clients, list("clients"))
|
||||
if(ghosts)
|
||||
SSblackbox.record_feedback("nested tally", "round_end_stats", ghosts, list("ghosts"))
|
||||
if(surviving_humans)
|
||||
SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_humans, list("survivors", "human"))
|
||||
if(surviving_total)
|
||||
SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_total, list("survivors", "total"))
|
||||
if(escaped_humans)
|
||||
SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_humans, list("escapees", "human"))
|
||||
if(escaped_total)
|
||||
SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_total, list("escapees", "total"))
|
||||
|
||||
send2irc("Server", "Round just ended.")
|
||||
if(cult.len && !istype(SSticker.mode, /datum/game_mode/cult))
|
||||
datum_cult_completion()
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
/datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere.
|
||||
return 0
|
||||
|
||||
|
||||
/datum/game_mode/proc/send_intercept()
|
||||
var/intercepttext = "<b><i>Central Command Status Summary</i></b><hr>"
|
||||
intercepttext += "<b>Central Command has intercepted and partially decoded a Syndicate transmission with vital information regarding their movements. The following report outlines the most \
|
||||
@@ -451,34 +405,6 @@
|
||||
for (var/C in GLOB.admins)
|
||||
to_chat(C, msg)
|
||||
|
||||
/datum/game_mode/proc/printplayer(datum/mind/ply, fleecheck)
|
||||
var/text = "<br><b>[ply.key]</b> was <b>[ply.name]</b> the <b>[ply.assigned_role]</b> and"
|
||||
if(ply.current)
|
||||
if(ply.current.stat == DEAD)
|
||||
text += " <span class='boldannounce'>died</span>"
|
||||
else
|
||||
text += " <span class='greenannounce'>survived</span>"
|
||||
if(fleecheck)
|
||||
var/turf/T = get_turf(ply.current)
|
||||
if(!T || !(T.z in GLOB.station_z_levels))
|
||||
text += " while <span class='boldannounce'>fleeing the station</span>"
|
||||
if(ply.current.real_name != ply.name)
|
||||
text += " as <b>[ply.current.real_name]</b>"
|
||||
else
|
||||
text += " <span class='boldannounce'>had their body destroyed</span>"
|
||||
return text
|
||||
|
||||
/datum/game_mode/proc/printobjectives(datum/mind/ply)
|
||||
var/text = ""
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in ply.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='greenannounce'>Success!</span>"
|
||||
else
|
||||
text += "<br><b>Objective #[count]</b>: [objective.explanation_text] <span class='boldannounce'>Fail.</span>"
|
||||
count++
|
||||
return text
|
||||
|
||||
//If the configuration option is set to require players to be logged as old enough to play certain jobs, then this proc checks that they are, otherwise it just returns 1
|
||||
/datum/game_mode/proc/age_check(client/C)
|
||||
if(get_remaining_days(C) == 0)
|
||||
@@ -518,15 +444,25 @@
|
||||
station_goals += new picked
|
||||
|
||||
|
||||
/datum/game_mode/proc/declare_station_goal_completion()
|
||||
for(var/V in station_goals)
|
||||
var/datum/station_goal/G = V
|
||||
G.print_result()
|
||||
|
||||
/datum/game_mode/proc/generate_report() //Generates a small text blurb for the gamemode in centcom report
|
||||
return "Gamemode report for [name] not set. Contact a coder."
|
||||
|
||||
//By default nuke just ends the round
|
||||
/datum/game_mode/proc/OnNukeExplosion(off_station)
|
||||
nuke_off_station = off_station
|
||||
if(off_station < 2)
|
||||
station_was_nuked = TRUE //Will end the round on next check.
|
||||
|
||||
//Additional report section in roundend report
|
||||
/datum/game_mode/proc/special_report()
|
||||
return
|
||||
|
||||
//Set result and news report here
|
||||
/datum/game_mode/proc/set_round_result()
|
||||
SSticker.mode_result = "undefined"
|
||||
if(station_was_nuked)
|
||||
SSticker.news_report = STATION_DESTROYED_NUKE
|
||||
if(EMERGENCY_ESCAPED_OR_ENDGAMED)
|
||||
SSticker.news_report = STATION_EVACUATED
|
||||
if(SSshuttle.emergency.is_hijacked())
|
||||
SSticker.news_report = SHUTTLE_HIJACK
|
||||
@@ -367,12 +367,12 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list(
|
||||
var/sec_left = seconds_remaining()
|
||||
if(!sec_left)
|
||||
timing = FALSE
|
||||
detonate(T.z)
|
||||
detonate()
|
||||
else if(world.time >= next_announce)
|
||||
minor_announce("[sec_left] SECONDS UNTIL DOOMSDAY DEVICE ACTIVATION!", "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4", TRUE)
|
||||
next_announce += DOOMSDAY_ANNOUNCE_INTERVAL
|
||||
|
||||
/obj/machinery/doomsday_device/proc/detonate(z_level = ZLEVEL_STATION_PRIMARY)
|
||||
/obj/machinery/doomsday_device/proc/detonate()
|
||||
sound_to_playing_players('sound/machines/alarm.ogg')
|
||||
sleep(100)
|
||||
for(var/i in GLOB.mob_living_list)
|
||||
|
||||
@@ -30,30 +30,29 @@
|
||||
spawn_meteors(ramp_up_final, wavetype)
|
||||
|
||||
|
||||
/datum/game_mode/meteor/declare_completion()
|
||||
var/text
|
||||
/datum/game_mode/meteor/special_report()
|
||||
var/survivors = 0
|
||||
var/list/survivor_list = list()
|
||||
|
||||
for(var/mob/living/player in GLOB.player_list)
|
||||
if(player.stat != DEAD)
|
||||
++survivors
|
||||
|
||||
if(player.onCentCom())
|
||||
text += "<br><b><font size=2>[player.real_name] escaped to the safety of CentCom.</font></b>"
|
||||
survivor_list += "<span class='greentext'>[player.real_name] escaped to the safety of CentCom.</span>"
|
||||
else if(player.onSyndieBase())
|
||||
text += "<br><b><font size=2>[player.real_name] escaped to the (relative) safety of Syndicate Space.</font></b>"
|
||||
survivor_list += "<span class='greentext'>[player.real_name] escaped to the (relative) safety of Syndicate Space.</span>"
|
||||
else
|
||||
text += "<br><font size=1>[player.real_name] survived but is stranded without any hope of rescue.</font>"
|
||||
|
||||
survivor_list += "<span class='neutraltext'>[player.real_name] survived but is stranded without any hope of rescue.</span>"
|
||||
|
||||
if(survivors)
|
||||
to_chat(world, "<span class='boldnotice'>The following survived the meteor storm</span>:[text]")
|
||||
return "<span class='header'>The following survived the meteor storm:</span><br>[survivor_list.Join("<br>")]"
|
||||
else
|
||||
to_chat(world, "<span class='boldnotice'>Nobody survived the meteor storm!</span>")
|
||||
return "<span class='redtext big'>Nobody survived the meteor storm!</span>"
|
||||
|
||||
SSticker.mode_result = "end - evacuation"
|
||||
/datum/game_mode/meteor/set_round_result()
|
||||
..()
|
||||
return 1
|
||||
SSticker.mode_result = "end - evacuation"
|
||||
|
||||
/datum/game_mode/meteor/generate_report()
|
||||
return "[pick("Asteroids have", "Meteors have", "Large rocks have", "Stellar minerals have", "Space hail has", "Debris has")] been detected near your station, and a collision is possible, \
|
||||
|
||||
@@ -105,7 +105,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event
|
||||
/obj/effect/meteor/Move()
|
||||
if(z != z_original || loc == dest)
|
||||
qdel(src)
|
||||
return
|
||||
return FALSE
|
||||
|
||||
. = ..() //process movement...
|
||||
|
||||
|
||||
@@ -1,19 +1,5 @@
|
||||
/datum/objective_team/abductor_team
|
||||
member_name = "abductor"
|
||||
var/list/objectives = list()
|
||||
var/team_number
|
||||
|
||||
/datum/objective_team/abductor_team/is_solo()
|
||||
return FALSE
|
||||
|
||||
/datum/objective_team/abductor_team/proc/add_objective(datum/objective/O)
|
||||
O.team = src
|
||||
O.update_explanation_text()
|
||||
objectives += O
|
||||
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/abductors = list()
|
||||
var/list/datum/mind/abductees = list()
|
||||
|
||||
/datum/game_mode/abduction
|
||||
name = "abduction"
|
||||
@@ -64,6 +50,7 @@
|
||||
antag_candidates -= scientist
|
||||
team.members |= scientist
|
||||
scientist.assigned_role = "Abductor Scientist"
|
||||
scientist.special_role = "Abductor Scientist"
|
||||
log_game("[scientist.key] (ckey) has been selected as [team.name] abductor scientist.")
|
||||
|
||||
if(!agent)
|
||||
@@ -71,6 +58,7 @@
|
||||
antag_candidates -= agent
|
||||
team.members |= agent
|
||||
agent.assigned_role = "Abductor Agent"
|
||||
agent.special_role = "Abductor Agent"
|
||||
log_game("[agent.key] (ckey) has been selected as [team.name] abductor agent.")
|
||||
|
||||
abductor_teams += team
|
||||
@@ -99,35 +87,6 @@
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/abduction/declare_completion()
|
||||
for(var/datum/objective_team/abductor_team/team in abductor_teams)
|
||||
var/won = TRUE
|
||||
for(var/datum/objective/O in team.objectives)
|
||||
if(!O.check_completion())
|
||||
won = FALSE
|
||||
if(won)
|
||||
to_chat(world, "<span class='greenannounce'>[team.name] team fulfilled its mission!</span>")
|
||||
else
|
||||
to_chat(world, "<span class='boldannounce'>[team.name] team failed its mission.</span>")
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_abduction()
|
||||
var/text = ""
|
||||
if(abductors.len)
|
||||
text += "<br><span class='big'><b>The abductors were:</b></span>"
|
||||
for(var/datum/mind/abductor_mind in abductors)
|
||||
text += printplayer(abductor_mind)
|
||||
text += printobjectives(abductor_mind)
|
||||
text += "<br>"
|
||||
if(abductees.len)
|
||||
text += "<br><span class='big'><b>The abductees were:</b></span>"
|
||||
for(var/datum/mind/abductee_mind in abductees)
|
||||
text += printplayer(abductee_mind)
|
||||
text += printobjectives(abductee_mind)
|
||||
text += "<br>"
|
||||
to_chat(world, text)
|
||||
|
||||
// LANDMARKS
|
||||
/obj/effect/landmark/abductor
|
||||
var/team_number = 1
|
||||
|
||||
@@ -236,11 +236,10 @@
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/activate()
|
||||
to_chat(owner, "<span class='warning'>You feel bloated.</span>")
|
||||
sleep(150)
|
||||
if(!owner)
|
||||
return
|
||||
to_chat(owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>")
|
||||
sleep(50)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, "<span class='userdanger'>A massive stomachache overcomes you.</span>"), 150)
|
||||
addtimer(CALLBACK(src, .proc/vomit_plasma), 200)
|
||||
|
||||
/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
|
||||
if(!owner)
|
||||
return
|
||||
owner.visible_message("<span class='danger'>[owner] vomits a cloud of plasma!</span>")
|
||||
|
||||
@@ -151,13 +151,18 @@
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mob_occupant.stat != DEAD)
|
||||
if(href_list["experiment"])
|
||||
flash = Experiment(occupant,href_list["experiment"])
|
||||
flash = Experiment(occupant,href_list["experiment"],usr)
|
||||
updateUsrDialog()
|
||||
add_fingerprint(usr)
|
||||
|
||||
/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type)
|
||||
/obj/machinery/abductor/experiment/proc/Experiment(mob/occupant,type,mob/user)
|
||||
LAZYINITLIST(history)
|
||||
var/mob/living/carbon/human/H = occupant
|
||||
|
||||
var/datum/antagonist/abductor/user_abductor = user.mind.has_antag_datum(/datum/antagonist/abductor)
|
||||
if(!user_abductor)
|
||||
return "<span class='bad'>Authorization failure. Contact mothership immidiately.</span>"
|
||||
|
||||
var/point_reward = 0
|
||||
if(H in history)
|
||||
return "<span class='bad'>Specimen already in database.</span>"
|
||||
@@ -182,15 +187,8 @@
|
||||
if(3)
|
||||
to_chat(H, "<span class='warning'>You feel intensely watched.</span>")
|
||||
sleep(5)
|
||||
to_chat(H, "<span class='warning'><b>Your mind snaps!</b></span>")
|
||||
H.gain_trauma_type(BRAIN_TRAUMA_MILD)
|
||||
to_chat(H, "<big><span class='warning'><b>You can't remember how you got here...</b></span></big>")
|
||||
var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random))
|
||||
var/datum/objective/abductee/O = new objtype()
|
||||
SSticker.mode.abductees += H.mind
|
||||
H.mind.objectives += O
|
||||
H.mind.announce_objectives()
|
||||
SSticker.mode.update_abductor_icons_added(H.mind)
|
||||
user_abductor.team.abductees += H.mind
|
||||
H.mind.add_antag_datum(/datum/antagonist/abductee)
|
||||
|
||||
for(var/obj/item/organ/heart/gland/G in H.internal_organs)
|
||||
G.Start()
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/datum/round_event_control/spawn_swarmer
|
||||
name = "Spawn Swarmer Shell"
|
||||
typepath = /datum/round_event/spawn_swarmer
|
||||
weight = 0
|
||||
max_occurrences = 0 //Only once okay fam
|
||||
weight = 7
|
||||
max_occurrences = 1 //Only once okay fam
|
||||
earliest_start = 18000 //30 minutes
|
||||
min_players = 15
|
||||
|
||||
|
||||
@@ -105,13 +105,18 @@
|
||||
monkey_mind.special_role = null
|
||||
|
||||
|
||||
/datum/game_mode/monkey/declare_completion()
|
||||
/datum/game_mode/monkey/set_round_result()
|
||||
..()
|
||||
if(check_monkey_victory())
|
||||
SSticker.mode_result = "win - monkey win"
|
||||
to_chat(world, "<span class='userdanger'>The monkeys have overthrown their captors! Eeek eeeek!!</span>")
|
||||
else
|
||||
SSticker.mode_result = "loss - staff stopped the monkeys"
|
||||
to_chat(world, "<span class='userdanger'>The staff managed to contain the monkey infestation!</span>")
|
||||
|
||||
/datum/game_mode/monkey/special_report()
|
||||
if(check_monkey_victory())
|
||||
return "<span class='redtext big'>The monkeys have overthrown their captors! Eeek eeeek!!</span>"
|
||||
else
|
||||
return "<span class='redtext big'>The staff managed to contain the monkey infestation!</span>"
|
||||
|
||||
/datum/game_mode/monkey/generate_report()
|
||||
return "Reports of an ancient [pick("retrovirus", "flesh eating bacteria", "disease", "magical curse blamed on viruses", "banana blight")] outbreak that turn humans into monkeys has been reported in your quadrant. Any such infections may be treated with banana juice. If an outbreak occurs, ensure the station is quarantined to prevent a largescale outbreak at CentCom."
|
||||
|
||||
@@ -227,6 +227,7 @@
|
||||
player_mind.assigned_role = "Morph"
|
||||
player_mind.special_role = "Morph"
|
||||
SSticker.mode.traitors |= player_mind
|
||||
player_mind.add_antag_datum(/datum/antagonist/auto_custom)
|
||||
to_chat(S, S.playstyle_string)
|
||||
SEND_SOUND(S, sound('sound/magic/mutate.ogg'))
|
||||
message_admins("[key_name_admin(S)] has been made into a morph by an event.")
|
||||
|
||||
@@ -87,6 +87,7 @@
|
||||
mind.assigned_role = "revenant"
|
||||
mind.special_role = "Revenant"
|
||||
SSticker.mode.traitors |= mind //Necessary for announcing
|
||||
mind.add_antag_datum(/datum/antagonist/auto_custom)
|
||||
AddSpell(new /obj/effect/proc_holder/spell/targeted/night_vision/revenant(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/targeted/revenant_transmit(null))
|
||||
AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/revenant/defile(null))
|
||||
@@ -374,7 +375,7 @@
|
||||
return
|
||||
var/key_of_revenant
|
||||
message_admins("Revenant ectoplasm was left undestroyed for 1 minute and is reforming into a new revenant.")
|
||||
loc = get_turf(src) //In case it's in a backpack or someone's hand
|
||||
forceMove(drop_location()) //In case it's in a backpack or someone's hand
|
||||
revenant.forceMove(loc)
|
||||
if(client_to_revive)
|
||||
for(var/mob/M in GLOB.dead_mob_list)
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
player_mind.assigned_role = "Slaughter Demon"
|
||||
player_mind.special_role = "Slaughter Demon"
|
||||
SSticker.mode.traitors |= player_mind
|
||||
player_mind.add_antag_datum(/datum/antagonist/auto_custom)
|
||||
to_chat(S, S.playstyle_string)
|
||||
to_chat(S, "<B>You are currently not currently in the same plane of existence as the station. Blood Crawl near a blood pool to manifest.</B>")
|
||||
SEND_SOUND(S, 'sound/magic/demon_dies.ogg')
|
||||
|
||||
@@ -1,7 +1,3 @@
|
||||
/datum/game_mode
|
||||
var/list/datum/mind/syndicates = list()
|
||||
var/nukeops_lastname = ""
|
||||
|
||||
/datum/game_mode/nuclear
|
||||
name = "nuclear emergency"
|
||||
config_tag = "nuclear"
|
||||
@@ -18,12 +14,11 @@
|
||||
<span class='notice'>Crew</span>: Defend the nuclear authentication disk and ensure that it leaves with you on the emergency shuttle."
|
||||
|
||||
var/const/agents_possible = 5 //If we ever need more syndicate agents.
|
||||
|
||||
var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer!
|
||||
var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station
|
||||
var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level
|
||||
var/list/pre_nukeops = list()
|
||||
|
||||
var/datum/objective_team/nuclear/nuke_team
|
||||
|
||||
/datum/game_mode/nuclear/pre_setup()
|
||||
var/n_agents = min(round(num_players() / 10), antag_candidates.len, agents_possible)
|
||||
for(var/i = 0, i < n_agents, ++i)
|
||||
@@ -33,120 +28,23 @@
|
||||
new_op.special_role = "Nuclear Operative"
|
||||
log_game("[new_op.key] (ckey) has been selected as a nuclear operative")
|
||||
return TRUE
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
/datum/game_mode/proc/update_synd_icons_added(datum/mind/synd_mind)
|
||||
var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
|
||||
opshud.join_hud(synd_mind.current)
|
||||
set_antag_hud(synd_mind.current, "synd")
|
||||
|
||||
/datum/game_mode/proc/update_synd_icons_removed(datum/mind/synd_mind)
|
||||
var/datum/atom_hud/antag/opshud = GLOB.huds[ANTAG_HUD_OPS]
|
||||
opshud.leave_hud(synd_mind.current)
|
||||
set_antag_hud(synd_mind.current, null)
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/game_mode/nuclear/post_setup()
|
||||
var/nuke_code = random_nukecode()
|
||||
var/agent_number = 1
|
||||
var/datum/mind/leader = pick(pre_nukeops)
|
||||
syndicates += pre_nukeops
|
||||
for(var/i = 1 to pre_nukeops.len)
|
||||
var/datum/mind/op = pre_nukeops[i]
|
||||
|
||||
forge_syndicate_objectives(op)
|
||||
greet_syndicate(op)
|
||||
equip_syndicate(op.current)
|
||||
|
||||
if(nuke_code)
|
||||
op.store_memory("<B>Syndicate Nuclear Bomb Code</B>: [nuke_code]", 0, 0)
|
||||
to_chat(op.current, "The nuclear authorization code is: <B>[nuke_code]</B>")
|
||||
|
||||
if(op == leader)
|
||||
op.current.forceMove(pick(GLOB.nukeop_leader_start))
|
||||
prepare_syndicate_leader(op, nuke_code)
|
||||
else
|
||||
op.current.forceMove(GLOB.nukeop_start[((i - 1) % GLOB.nukeop_start.len) + 1])
|
||||
op.current.real_name = "[syndicate_name()] Operative #[agent_number++]"
|
||||
|
||||
update_synd_icons_added(op)
|
||||
op.current.playsound_local(get_turf(op.current), 'sound/ambience/antag/ops.ogg',100,0)
|
||||
|
||||
var/obj/machinery/nuclearbomb/nuke = locate("syndienuke") in GLOB.nuke_list
|
||||
if(nuke)
|
||||
nuke.r_code = nuke_code
|
||||
//Assign leader
|
||||
var/datum/mind/leader_mind = pre_nukeops[1]
|
||||
var/datum/antagonist/nukeop/L = leader_mind.add_antag_datum(/datum/antagonist/nukeop/leader)
|
||||
nuke_team = L.nuke_team
|
||||
//Assign the remaining operatives
|
||||
for(var/i = 2 to pre_nukeops.len)
|
||||
var/datum/mind/nuke_mind = pre_nukeops[i]
|
||||
nuke_mind.add_antag_datum(/datum/antagonist/nukeop,nuke_team)
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/proc/prepare_syndicate_leader(datum/mind/synd_mind, nuke_code)
|
||||
var/leader_title = pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")
|
||||
addtimer(CALLBACK(src, .proc/nuketeam_name_assign, synd_mind), 1)
|
||||
synd_mind.current.real_name = "[syndicate_name()] [leader_title]"
|
||||
to_chat(synd_mind.current, "<B>You are the Syndicate [leader_title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors.</B>")
|
||||
to_chat(synd_mind.current, "<B>If you feel you are not up to this task, give your ID to another operative.</B>")
|
||||
to_chat(synd_mind.current, "<B>In your hand you will find a special item capable of triggering a greater challenge for your team. Examine it carefully and consult with your fellow operatives before activating it.</B>")
|
||||
|
||||
var/obj/item/device/nuclear_challenge/challenge = new /obj/item/device/nuclear_challenge
|
||||
synd_mind.current.put_in_hands(challenge, TRUE)
|
||||
|
||||
var/static/id_cache = typecacheof(/obj/item/card/id)
|
||||
var/list/foundIDs = typecache_filter_list(synd_mind.current.GetAllContents(), id_cache)
|
||||
if(foundIDs.len)
|
||||
for(var/i in 1 to foundIDs.len)
|
||||
var/obj/item/card/id/ID = foundIDs[i]
|
||||
ID.name = "lead agent card"
|
||||
ID.access += ACCESS_SYNDICATE_LEADER
|
||||
else
|
||||
message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!")
|
||||
|
||||
var/obj/item/device/radio/headset/syndicate/alt/A = locate() in synd_mind.current
|
||||
if(A)
|
||||
A.command = TRUE
|
||||
|
||||
if(nuke_code)
|
||||
var/obj/item/paper/P = new
|
||||
P.info = "The nuclear authorization code is: <b>[nuke_code]</b>"
|
||||
P.name = "nuclear bomb code"
|
||||
var/mob/living/carbon/human/H = synd_mind.current
|
||||
H.put_in_hands(P, TRUE)
|
||||
H.update_icons()
|
||||
else
|
||||
nuke_code = "code will be provided later"
|
||||
return
|
||||
|
||||
/datum/game_mode/proc/nuketeam_name_assign(datum/mind/synd_mind)
|
||||
nukeops_lastname = nukelastname(synd_mind.current)
|
||||
NukeNameAssign(nukeops_lastname, syndicates)
|
||||
|
||||
|
||||
/datum/game_mode/proc/forge_syndicate_objectives(datum/mind/syndicate)
|
||||
var/datum/objective/nuclear/syndobj = new
|
||||
syndobj.owner = syndicate
|
||||
syndicate.objectives += syndobj
|
||||
|
||||
|
||||
/datum/game_mode/proc/greet_syndicate(datum/mind/syndicate, you_are=1)
|
||||
if(you_are)
|
||||
to_chat(syndicate.current, "<span class='notice'>You are a [syndicate_name()] agent!</span>")
|
||||
syndicate.announce_objectives()
|
||||
|
||||
/datum/game_mode/proc/equip_syndicate(mob/living/carbon/human/synd_mob, telecrystals = TRUE)
|
||||
synd_mob.set_species(/datum/species/human) //Plasamen burn up otherwise, and lizards are vulnerable to asimov AIs
|
||||
|
||||
if(telecrystals)
|
||||
synd_mob.equipOutfit(/datum/outfit/syndicate)
|
||||
else
|
||||
synd_mob.equipOutfit(/datum/outfit/syndicate/no_crystals)
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/nuclear/OnNukeExplosion(off_station)
|
||||
..()
|
||||
nukes_left--
|
||||
var/obj/docking_port/mobile/Shuttle = SSshuttle.getShuttle("syndicate")
|
||||
syndies_didnt_escape = (Shuttle && (Shuttle.z == ZLEVEL_CENTCOM || Shuttle.z == ZLEVEL_TRANSIT)) ? 0 : 1
|
||||
nuke_off_station = off_station
|
||||
|
||||
/datum/game_mode/nuclear/check_win()
|
||||
if (nukes_left == 0)
|
||||
@@ -154,8 +52,8 @@
|
||||
return ..()
|
||||
|
||||
/datum/game_mode/proc/are_operatives_dead()
|
||||
for(var/datum/mind/operative_mind in syndicates)
|
||||
if(ishuman(operative_mind.current) && (operative_mind.current.stat!=2))
|
||||
for(var/datum/mind/operative_mind in get_antagonists(/datum/antagonist/nukeop))
|
||||
if(ishuman(operative_mind.current) && (operative_mind.current.stat != DEAD))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -164,142 +62,55 @@
|
||||
return replacementmode.check_finished()
|
||||
if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked)
|
||||
return TRUE
|
||||
if(are_operatives_dead())
|
||||
if(nuke_team.operatives_dead())
|
||||
var/obj/machinery/nuclearbomb/N
|
||||
pass(N) //suppress unused warning
|
||||
if(N.bomb_set) //snaaaaaaaaaake! It's not over yet!
|
||||
return FALSE //its a static var btw
|
||||
..()
|
||||
|
||||
/datum/game_mode/nuclear/declare_completion()
|
||||
var/disk_rescued = 1
|
||||
for(var/obj/item/disk/nuclear/D in GLOB.poi_list)
|
||||
if(!D.onCentCom())
|
||||
disk_rescued = 0
|
||||
break
|
||||
var/crew_evacuated = (SSshuttle.emergency.mode == SHUTTLE_ENDGAME)
|
||||
|
||||
if(nuke_off_station == NUKE_SYNDICATE_BASE)
|
||||
SSticker.mode_result = "loss - syndicate nuked - disk secured"
|
||||
to_chat(world, "<FONT size = 3><B>Humiliating Syndicate Defeat</B></FONT>")
|
||||
to_chat(world, "<B>The crew of [station_name()] gave [syndicate_name()] operatives back their bomb! The syndicate base was destroyed!</B> Next time, don't lose the nuke!")
|
||||
|
||||
SSticker.news_report = NUKE_SYNDICATE_BASE
|
||||
|
||||
else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape)
|
||||
SSticker.mode_result = "win - syndicate nuke"
|
||||
to_chat(world, "<FONT size = 3><B>Syndicate Major Victory!</B></FONT>")
|
||||
to_chat(world, "<B>[syndicate_name()] operatives have destroyed [station_name()]!</B>")
|
||||
|
||||
SSticker.news_report = STATION_NUKED
|
||||
|
||||
else if (!disk_rescued && station_was_nuked && syndies_didnt_escape)
|
||||
SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time"
|
||||
to_chat(world, "<FONT size = 3><B>Total Annihilation</B></FONT>")
|
||||
to_chat(world, "<B>[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion.</B> Next time, don't lose the disk!")
|
||||
|
||||
SSticker.news_report = STATION_NUKED
|
||||
|
||||
else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape)
|
||||
SSticker.mode_result = "halfwin - blew wrong station"
|
||||
to_chat(world, "<FONT size = 3><B>Crew Minor Victory</B></FONT>")
|
||||
to_chat(world, "<B>[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()].</B> Next time, don't do that!")
|
||||
|
||||
SSticker.news_report = NUKE_MISS
|
||||
|
||||
else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape)
|
||||
SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time"
|
||||
to_chat(world, "<FONT size = 3><B>[syndicate_name()] operatives have earned Darwin Award!</B></FONT>")
|
||||
to_chat(world, "<B>[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion.</B> Next time, don't do that!")
|
||||
|
||||
SSticker.news_report = NUKE_MISS
|
||||
|
||||
else if ((disk_rescued || SSshuttle.emergency.mode != SHUTTLE_ENDGAME) && are_operatives_dead())
|
||||
SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead"
|
||||
to_chat(world, "<FONT size = 3><B>Crew Major Victory!</B></FONT>")
|
||||
to_chat(world, "<B>The Research Staff has saved the disk and killed the [syndicate_name()] Operatives</B>")
|
||||
|
||||
SSticker.news_report = OPERATIVES_KILLED
|
||||
|
||||
else if (disk_rescued)
|
||||
SSticker.mode_result = "loss - evacuation - disk secured"
|
||||
to_chat(world, "<FONT size = 3><B>Crew Major Victory</B></FONT>")
|
||||
to_chat(world, "<B>The Research Staff has saved the disk and stopped the [syndicate_name()] Operatives!</B>")
|
||||
|
||||
SSticker.news_report = OPERATIVES_KILLED
|
||||
|
||||
else if (!disk_rescued && are_operatives_dead())
|
||||
SSticker.mode_result = "halfwin - evacuation - disk not secured"
|
||||
to_chat(world, "<FONT size = 3><B>Neutral Victory!</B></FONT>")
|
||||
to_chat(world, "<B>The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!</B>")
|
||||
|
||||
SSticker.news_report = OPERATIVE_SKIRMISH
|
||||
|
||||
else if (!disk_rescued && crew_evacuated)
|
||||
SSticker.mode_result = "halfwin - detonation averted"
|
||||
to_chat(world, "<FONT size = 3><B>Syndicate Minor Victory!</B></FONT>")
|
||||
to_chat(world, "<B>[syndicate_name()] operatives survived the assault but did not achieve the destruction of [station_name()].</B> Next time, don't lose the disk!")
|
||||
|
||||
SSticker.news_report = OPERATIVE_SKIRMISH
|
||||
|
||||
else if (!disk_rescued && !crew_evacuated)
|
||||
SSticker.mode_result = "halfwin - interrupted"
|
||||
to_chat(world, "<FONT size = 3><B>Neutral Victory</B></FONT>")
|
||||
to_chat(world, "<B>Round was mysteriously interrupted!</B>")
|
||||
|
||||
SSticker.news_report = OPERATIVE_SKIRMISH
|
||||
|
||||
/datum/game_mode/nuclear/set_round_result()
|
||||
..()
|
||||
return
|
||||
var result = nuke_team.get_result()
|
||||
switch(result)
|
||||
if(NUKE_RESULT_FLUKE)
|
||||
SSticker.mode_result = "loss - syndicate nuked - disk secured"
|
||||
SSticker.news_report = NUKE_SYNDICATE_BASE
|
||||
if(NUKE_RESULT_NUKE_WIN)
|
||||
SSticker.mode_result = "win - syndicate nuke"
|
||||
SSticker.news_report = STATION_NUKED
|
||||
if(NUKE_RESULT_NOSURVIVORS)
|
||||
SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time"
|
||||
SSticker.news_report = STATION_NUKED
|
||||
if(NUKE_RESULT_WRONG_STATION)
|
||||
SSticker.mode_result = "halfwin - blew wrong station"
|
||||
SSticker.news_report = NUKE_MISS
|
||||
if(NUKE_RESULT_WRONG_STATION_DEAD)
|
||||
SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time"
|
||||
SSticker.news_report = NUKE_MISS
|
||||
if(NUKE_RESULT_CREW_WIN_SYNDIES_DEAD)
|
||||
SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead"
|
||||
SSticker.news_report = OPERATIVES_KILLED
|
||||
if(NUKE_RESULT_CREW_WIN)
|
||||
SSticker.mode_result = "loss - evacuation - disk secured"
|
||||
SSticker.news_report = OPERATIVES_KILLED
|
||||
if(NUKE_RESULT_DISK_LOST)
|
||||
SSticker.mode_result = "halfwin - evacuation - disk not secured"
|
||||
SSticker.news_report = OPERATIVE_SKIRMISH
|
||||
if(NUKE_RESULT_DISK_STOLEN)
|
||||
SSticker.mode_result = "halfwin - detonation averted"
|
||||
SSticker.news_report = OPERATIVE_SKIRMISH
|
||||
else
|
||||
SSticker.mode_result = "halfwin - interrupted"
|
||||
SSticker.news_report = OPERATIVE_SKIRMISH
|
||||
|
||||
/datum/game_mode/nuclear/generate_report()
|
||||
return "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \
|
||||
transport containing a nuclear fission explosive, although it is useless without the proper code and authorization disk. While the code was likely found in minutes, the only disk that \
|
||||
can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders."
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_nuclear()
|
||||
if( syndicates.len || (SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) )
|
||||
var/text = "<br><FONT size=3><B>The syndicate operatives were:</B></FONT>"
|
||||
var/purchases = ""
|
||||
var/TC_uses = 0
|
||||
for(var/datum/mind/syndicate in syndicates)
|
||||
text += printplayer(syndicate)
|
||||
for(var/datum/component/uplink/H in GLOB.uplinks)
|
||||
if(H.purchase_log)
|
||||
purchases += H.purchase_log.generate_render()
|
||||
else
|
||||
stack_trace("WARNING: Uplink with no purchase_log in nuclear mode! Owner: [H.owner]")
|
||||
text += "<br>"
|
||||
text += "(Syndicates used [TC_uses] TC) [purchases]"
|
||||
if(TC_uses == 0 && station_was_nuked && !are_operatives_dead())
|
||||
text += "<BIG>[icon2html('icons/badass.dmi', world, "badass")]</BIG>"
|
||||
to_chat(world, text)
|
||||
return TRUE
|
||||
|
||||
|
||||
/proc/nukelastname(mob/M) //--All praise goes to NEO|Phyte, all blame goes to DH, and it was Cindi-Kate's idea. Also praise Urist for copypasta ho.
|
||||
var/randomname = pick(GLOB.last_names)
|
||||
var/newname = copytext(sanitize(input(M,"You are the nuke operative [pick("Czar", "Boss", "Commander", "Chief", "Kingpin", "Director", "Overlord")]. Please choose a last name for your family.", "Name change",randomname)),1,MAX_NAME_LEN)
|
||||
|
||||
if (!newname)
|
||||
newname = randomname
|
||||
|
||||
else
|
||||
if (newname == "Unknown" || newname == "floor" || newname == "wall" || newname == "rwall" || newname == "_")
|
||||
to_chat(M, "That name is reserved.")
|
||||
return nukelastname(M)
|
||||
|
||||
return capitalize(newname)
|
||||
|
||||
/proc/NukeNameAssign(lastname,list/syndicates)
|
||||
for(var/datum/mind/synd_mind in syndicates)
|
||||
var/mob/living/carbon/human/H = synd_mind.current
|
||||
synd_mind.name = H.dna.species.random_name(H.gender,0,lastname)
|
||||
synd_mind.current.real_name = synd_mind.name
|
||||
return
|
||||
|
||||
/proc/is_nuclear_operative(mob/M)
|
||||
return M && istype(M) && M.mind && SSticker && SSticker.mode && M.mind in SSticker.mode.syndicates
|
||||
return M && istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/nukeop)
|
||||
|
||||
/datum/outfit/syndicate
|
||||
name = "Syndicate Operative - Basic"
|
||||
@@ -312,18 +123,28 @@
|
||||
l_pocket = /obj/item/pinpointer/nuke/syndicate
|
||||
id = /obj/item/card/id/syndicate
|
||||
belt = /obj/item/gun/ballistic/automatic/pistol
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1)
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1,\
|
||||
/obj/item/kitchen/knife/combat/survival)
|
||||
|
||||
var/tc = 25
|
||||
var/command_radio = FALSE
|
||||
|
||||
|
||||
/datum/outfit/syndicate/leader
|
||||
name = "Syndicate Leader - Basic"
|
||||
id = /obj/item/card/id/syndicate/nuke_leader
|
||||
r_hand = /obj/item/device/nuclear_challenge
|
||||
command_radio = TRUE
|
||||
|
||||
/datum/outfit/syndicate/no_crystals
|
||||
tc = 0
|
||||
|
||||
|
||||
/datum/outfit/syndicate/post_equip(mob/living/carbon/human/H)
|
||||
var/obj/item/device/radio/R = H.ears
|
||||
R.set_frequency(GLOB.SYND_FREQ)
|
||||
R.freqlock = 1
|
||||
R.set_frequency(FREQ_SYNDICATE)
|
||||
R.freqlock = TRUE
|
||||
if(command_radio)
|
||||
R.command = TRUE
|
||||
|
||||
if(tc)
|
||||
var/obj/item/device/radio/uplink/nuclear/U = new(H, H.key, tc)
|
||||
@@ -348,4 +169,5 @@
|
||||
r_hand = /obj/item/gun/ballistic/automatic/shotgun/bulldog
|
||||
backpack_contents = list(/obj/item/storage/box/syndie=1,\
|
||||
/obj/item/tank/jetpack/oxygen/harness=1,\
|
||||
/obj/item/gun/ballistic/automatic/pistol=1)
|
||||
/obj/item/gun/ballistic/automatic/pistol=1,\
|
||||
/obj/item/kitchen/knife/combat/survival)
|
||||
|
||||
@@ -77,16 +77,16 @@
|
||||
icon = 'icons/obj/machines/nuke_terminal.dmi'
|
||||
icon_state = "nuclearbomb_base"
|
||||
anchored = TRUE //stops it being moved
|
||||
use_tag = TRUE
|
||||
|
||||
/obj/machinery/nuclearbomb/syndicate
|
||||
use_tag = TRUE
|
||||
//ui_style = "syndicate" // actually the nuke op bomb is a stole nt bomb
|
||||
|
||||
/obj/machinery/nuclearbomb/syndicate/get_cinematic_type(off_station)
|
||||
var/datum/game_mode/nuclear/NM = SSticker.mode
|
||||
switch(off_station)
|
||||
if(0)
|
||||
if(istype(NM) && NM.syndies_didnt_escape)
|
||||
if(istype(NM) && !NM.nuke_team.syndies_escaped())
|
||||
return CINEMATIC_ANNIHILATION
|
||||
else
|
||||
return CINEMATIC_NUKE_WIN
|
||||
|
||||
@@ -71,9 +71,9 @@
|
||||
target = null
|
||||
var/list/possible_targets = list()
|
||||
var/turf/here = get_turf(src)
|
||||
for(var/V in SSticker.mode.syndicates)
|
||||
for(var/V in get_antagonists(/datum/antagonist/nukeop))
|
||||
var/datum/mind/M = V
|
||||
if(M.current && M.current.stat != DEAD)
|
||||
if(ishuman(M.current) && M.current.stat != DEAD)
|
||||
possible_targets |= M.current
|
||||
var/mob/living/closest_operative = get_closest_atom(/mob/living/carbon/human, possible_targets, here)
|
||||
if(closest_operative)
|
||||
|
||||
@@ -47,9 +47,9 @@
|
||||
. = list()
|
||||
for(var/V in GLOB.data_core.locked)
|
||||
var/datum/data/record/R = V
|
||||
var/mob/M = R.fields["reference"]
|
||||
if(M && M.mind)
|
||||
. += M.mind
|
||||
var/datum/mind/M = R.fields["mindref"]
|
||||
if(M)
|
||||
. += M
|
||||
|
||||
/datum/objective/proc/find_target()
|
||||
var/list/datum/mind/owners = get_owners()
|
||||
@@ -537,25 +537,25 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
var/captured_amount = 0
|
||||
var/area/centcom/holding/A = locate() in GLOB.sortedAreas
|
||||
for(var/mob/living/carbon/human/M in A)//Humans.
|
||||
if(M.stat==2)//Dead folks are worth less.
|
||||
if(M.stat == DEAD)//Dead folks are worth less.
|
||||
captured_amount+=0.5
|
||||
continue
|
||||
captured_amount+=1
|
||||
for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure.
|
||||
captured_amount+=0.1
|
||||
for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research.
|
||||
if(M.stat==2)
|
||||
if(M.stat == DEAD)
|
||||
captured_amount+=0.5
|
||||
continue
|
||||
captured_amount+=1
|
||||
for(var/mob/living/carbon/alien/humanoid/M in A)//Aliens are worth twice as much as humans.
|
||||
if(istype(M, /mob/living/carbon/alien/humanoid/royal/queen))//Queens are worth three times as much as humans.
|
||||
if(M.stat==2)
|
||||
if(M.stat == DEAD)
|
||||
captured_amount+=1.5
|
||||
else
|
||||
captured_amount+=3
|
||||
continue
|
||||
if(M.stat==2)
|
||||
if(M.stat == DEAD)
|
||||
captured_amount+=1
|
||||
continue
|
||||
captured_amount+=2
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
var/list/datum/mind/members = list()
|
||||
var/name = "team"
|
||||
var/member_name = "member"
|
||||
var/list/objectives = list() //common objectives, these won't be added or removed automatically, subtypes handle this, this is here for bookkeeping purposes.
|
||||
|
||||
/datum/objective_team/New(starting_members)
|
||||
. = ..()
|
||||
@@ -12,7 +13,6 @@
|
||||
add_member(M)
|
||||
else
|
||||
add_member(starting_members)
|
||||
members += starting_members
|
||||
|
||||
/datum/objective_team/proc/is_solo()
|
||||
return members.len == 1
|
||||
@@ -21,4 +21,14 @@
|
||||
members |= new_member
|
||||
|
||||
/datum/objective_team/proc/remove_member(datum/mind/member)
|
||||
members -= member
|
||||
members -= member
|
||||
|
||||
//Display members/victory/failure/objectives for the team
|
||||
/datum/objective_team/proc/roundend_report()
|
||||
var/list/report = list()
|
||||
|
||||
report += "<b>[name]:</b>"
|
||||
report += "The [member_name]s were:"
|
||||
report += printplayerlist(members)
|
||||
|
||||
return report.Join("<br>")
|
||||
@@ -169,62 +169,22 @@
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
//Announces the end of the game with all relavent information stated//
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
/datum/game_mode/revolution/declare_completion()
|
||||
|
||||
/datum/game_mode/revolution/set_round_result()
|
||||
..()
|
||||
if(finished == 1)
|
||||
SSticker.mode_result = "win - heads killed"
|
||||
to_chat(world, "<span class='redtext'>The heads of staff were killed or exiled! The revolutionaries win!</span>")
|
||||
|
||||
SSticker.news_report = REVS_WIN
|
||||
|
||||
else if(finished == 2)
|
||||
SSticker.mode_result = "loss - rev heads killed"
|
||||
to_chat(world, "<span class='redtext'>The heads of staff managed to stop the revolution!</span>")
|
||||
|
||||
SSticker.news_report = REVS_LOSE
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_revolution()
|
||||
var/list/targets = list()
|
||||
var/list/datum/mind/headrevs = get_antagonists(/datum/antagonist/rev/head)
|
||||
var/list/datum/mind/revs = get_antagonists(/datum/antagonist/rev,TRUE)
|
||||
if(headrevs.len)
|
||||
var/num_revs = 0
|
||||
var/num_survivors = 0
|
||||
for(var/mob/living/carbon/survivor in GLOB.alive_mob_list)
|
||||
if(survivor.ckey)
|
||||
num_survivors++
|
||||
if(survivor.mind)
|
||||
if(is_revolutionary(survivor))
|
||||
num_revs++
|
||||
if(num_survivors)
|
||||
to_chat(world, "[GLOB.TAB]Command's Approval Rating: <B>[100 - round((num_revs/num_survivors)*100, 0.1)]%</B>" )
|
||||
var/text = "<br><font size=3><b>The head revolutionaries were:</b></font>"
|
||||
for(var/datum/mind/headrev in headrevs)
|
||||
text += printplayer(headrev, 1)
|
||||
text += "<br>"
|
||||
to_chat(world, text)
|
||||
|
||||
if(revs.len)
|
||||
var/text = "<br><font size=3><b>The revolutionaries were:</b></font>"
|
||||
for(var/datum/mind/rev in revs)
|
||||
text += printplayer(rev, 1)
|
||||
text += "<br>"
|
||||
to_chat(world, text)
|
||||
|
||||
if(revs.len || headrevs.len)
|
||||
var/text = "<br><font size=3><b>The heads of staff were:</b></font>"
|
||||
var/list/heads = SSjob.get_all_heads()
|
||||
for(var/datum/mind/head in heads)
|
||||
var/target = (head in targets)
|
||||
if(target)
|
||||
text += "<span class='boldannounce'>Target</span>"
|
||||
text += printplayer(head, 1)
|
||||
text += "<br>"
|
||||
to_chat(world, text)
|
||||
//TODO What should be displayed for revs in non-rev rounds
|
||||
/datum/game_mode/revolution/special_report()
|
||||
if(finished == 1)
|
||||
return "<span class='redtext big'>The heads of staff were killed or exiled! The revolutionaries win!</span>"
|
||||
else if(finished == 2)
|
||||
return "<span class='redtext big'>The heads of staff managed to stop the revolution!</span>"
|
||||
|
||||
/datum/game_mode/revolution/generate_report()
|
||||
return "Employee unrest has spiked in recent weeks, with several attempted mutinies on heads of staff. Some crew have been observed using flashbulb devices to blind their colleagues, \
|
||||
|
||||
@@ -27,7 +27,7 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
|
||||
//items that shouldn't spawn on the floor because they would bug or act weird
|
||||
var/global/list/spawn_forbidden = list(
|
||||
/obj/item/tk_grab, /obj/item/implant, // not implanter, the actual thing that is inside you
|
||||
/obj/item/assembly, /obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai,
|
||||
/obj/item/assembly, /obj/item/device/onetankbomb, /obj/item/device/pda/ai,
|
||||
/obj/item/smallDelivery, /obj/item/projectile,
|
||||
/obj/item/borg/sight, /obj/item/borg/stun, /obj/item/robot_module)
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
var/traitors_possible = 4 //hard limit on traitors if scaling is turned off
|
||||
var/num_modifier = 0 // Used for gamemodes, that are a child of traitor, that need more than the usual.
|
||||
var/antag_datum = ANTAG_DATUM_TRAITOR //what type of antag to create
|
||||
var/traitors_required = TRUE //Will allow no traitors
|
||||
|
||||
|
||||
/datum/game_mode/traitor/pre_setup()
|
||||
@@ -55,7 +56,7 @@
|
||||
log_game("[traitor.key] (ckey) has been selected as a [traitor_name]")
|
||||
antag_candidates.Remove(traitor)
|
||||
|
||||
return pre_traitors.len > 0
|
||||
return !traitors_required || pre_traitors.len > 0
|
||||
|
||||
|
||||
/datum/game_mode/traitor/post_setup()
|
||||
@@ -85,80 +86,10 @@
|
||||
new_antag.should_specialise = TRUE
|
||||
character.add_antag_datum(new_antag)
|
||||
|
||||
|
||||
|
||||
/datum/game_mode/traitor/declare_completion()
|
||||
..()
|
||||
return//Traitors will be checked as part of check_extra_completion. Leaving this here as a reminder.
|
||||
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_traitor()
|
||||
if(traitors.len)
|
||||
var/text = "<br><font size=3><b>The [traitor_name]s were:</b></font>"
|
||||
for(var/datum/mind/traitor in traitors)
|
||||
var/traitorwin = TRUE
|
||||
|
||||
text += printplayer(traitor)
|
||||
|
||||
var/TC_uses = 0
|
||||
var/uplink_true = FALSE
|
||||
var/purchases = ""
|
||||
for(var/datum/component/uplink/H in GLOB.uplinks)
|
||||
if(H && H.owner && H.owner == traitor.key)
|
||||
TC_uses += H.spent_telecrystals
|
||||
uplink_true = TRUE
|
||||
purchases += H.purchase_log.generate_render(FALSE)
|
||||
|
||||
var/objectives = ""
|
||||
if(traitor.objectives.len)//If the traitor had no objectives, don't need to process this.
|
||||
var/count = 1
|
||||
for(var/datum/objective/objective in traitor.objectives)
|
||||
if(objective.check_completion())
|
||||
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font> [istype(objective, /datum/objective/crew) ? "<font color='grey'>(Optional)</font>" : ""]"
|
||||
SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "SUCCESS"))
|
||||
else
|
||||
objectives += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font> [istype(objective, /datum/objective/crew) ? "<font color='grey'>(Optional)</font>" : ""]"
|
||||
SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "FAIL"))
|
||||
if(!(istype(objective, /datum/objective/crew)))
|
||||
traitorwin = FALSE
|
||||
count++
|
||||
|
||||
if(uplink_true)
|
||||
text += " (used [TC_uses] TC) [purchases]"
|
||||
if(TC_uses==0 && traitorwin)
|
||||
var/static/icon/badass = icon('icons/badass.dmi', "badass")
|
||||
text += "<BIG>[icon2html(badass, world)]</BIG>"
|
||||
|
||||
text += objectives
|
||||
|
||||
var/special_role_text
|
||||
if(traitor.special_role)
|
||||
special_role_text = lowertext(traitor.special_role)
|
||||
else
|
||||
special_role_text = "antagonist"
|
||||
|
||||
|
||||
if(traitorwin)
|
||||
text += "<br><font color='green'><B>The [special_role_text] was successful!</B></font>"
|
||||
SSblackbox.record_feedback("tally", "traitor_success", 1, "SUCCESS")
|
||||
else
|
||||
text += "<br><font color='red'><B>The [special_role_text] has failed!</B></font>"
|
||||
SSblackbox.record_feedback("tally", "traitor_success", 1, "FAIL")
|
||||
SEND_SOUND(traitor.current, 'sound/ambience/ambifailure.ogg')
|
||||
|
||||
text += "<br>"
|
||||
|
||||
text += "<br><b>The code phrases were:</b> <font color='red'>[GLOB.syndicate_code_phrase]</font><br>\
|
||||
<b>The code responses were:</b> <font color='red'>[GLOB.syndicate_code_response]</font><br>"
|
||||
to_chat(world, text)
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/traitor/generate_report()
|
||||
return "Although more specific threats are commonplace, you should always remain vigilant for Syndicate agents aboard your station. Syndicate communications have implied that many \
|
||||
Nanotrasen employees are Syndicate agents with hidden memories that may be activated at a moment's notice, so it's possible that these agents might not even know their positions."
|
||||
|
||||
|
||||
/datum/game_mode/proc/update_traitor_icons_added(datum/mind/traitor_mind)
|
||||
var/datum/atom_hud/antag/traitorhud = GLOB.huds[ANTAG_HUD_TRAITOR]
|
||||
traitorhud.join_hud(traitor_mind.current)
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
|
||||
var/mob/living/carbon/human/target = null
|
||||
var/list/mob/living/carbon/human/possible = list()
|
||||
var/obj/item/link = null
|
||||
var/obj/item/linked_item = null
|
||||
var/cooldown_time = 30 //3s
|
||||
var/cooldown = 0
|
||||
max_integrity = 10
|
||||
@@ -237,10 +237,10 @@
|
||||
cooldown = world.time +cooldown_time
|
||||
return
|
||||
|
||||
if(!link)
|
||||
if(!linked_item)
|
||||
if(I.loc == user && istype(I) && I.w_class <= WEIGHT_CLASS_SMALL)
|
||||
if (user.transferItemToLoc(I,src))
|
||||
link = I
|
||||
linked_item = I
|
||||
to_chat(user, "You attach [I] to the doll.")
|
||||
update_targets()
|
||||
|
||||
@@ -255,11 +255,11 @@
|
||||
return
|
||||
|
||||
if(user.zone_selected == "chest")
|
||||
if(link)
|
||||
if(linked_item)
|
||||
target = null
|
||||
link.loc = get_turf(src)
|
||||
to_chat(user, "<span class='notice'>You remove the [link] from the doll.</span>")
|
||||
link = null
|
||||
linked_item.forceMove(drop_location())
|
||||
to_chat(user, "<span class='notice'>You remove the [linked_item] from the doll.</span>")
|
||||
linked_item = null
|
||||
update_targets()
|
||||
return
|
||||
|
||||
@@ -291,10 +291,10 @@
|
||||
|
||||
/obj/item/voodoo/proc/update_targets()
|
||||
possible = list()
|
||||
if(!link)
|
||||
if(!linked_item)
|
||||
return
|
||||
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
|
||||
if(md5(H.dna.uni_identity) in link.fingerprints)
|
||||
if(md5(H.dna.uni_identity) in linked_item.fingerprints)
|
||||
possible |= H
|
||||
|
||||
/obj/item/voodoo/proc/GiveHint(mob/victim,force=0)
|
||||
|
||||
@@ -64,7 +64,6 @@
|
||||
to_chat(user, "<span class='cultlarge'>\"Come now, do not capture your bretheren's soul.\"</span>")
|
||||
return
|
||||
add_logs(user, M, "captured [M.name]'s soul", src)
|
||||
|
||||
transfer_soul("VICTIM", M, user)
|
||||
|
||||
///////////////////Options for using captured souls///////////////////////////////////////
|
||||
@@ -142,7 +141,8 @@
|
||||
|
||||
if("VICTIM")
|
||||
var/mob/living/carbon/human/T = target
|
||||
if(is_sacrifice_target(T.mind))
|
||||
var/datum/antagonist/cult/C = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
|
||||
if(C && C.cult_team.is_sacrifice_target(T.mind))
|
||||
if(iscultist(user))
|
||||
to_chat(user, "<span class='cult'><b>\"This soul is mine.</b></span> <span class='cultlarge'>SACRIFICE THEM!\"</span>")
|
||||
else
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
for(var/datum/mind/wizard in wizards)
|
||||
if(isliving(wizard.current) && wizard.current.stat!=DEAD)
|
||||
return FALSE
|
||||
|
||||
|
||||
for(var/obj/item/phylactery/P in GLOB.poi_list) //TODO : IsProperlyDead()
|
||||
if(P.mind && P.mind.has_antag_datum(/datum/antagonist/wizard))
|
||||
return FALSE
|
||||
@@ -55,68 +55,19 @@
|
||||
if(SSevents.wizardmode) //If summon events was active, turn it off
|
||||
SSevents.toggleWizardmode()
|
||||
SSevents.resetFrequency()
|
||||
|
||||
|
||||
return TRUE
|
||||
|
||||
/datum/game_mode/wizard/declare_completion()
|
||||
/datum/game_mode/wizard/set_round_result()
|
||||
..()
|
||||
if(finished)
|
||||
SSticker.mode_result = "loss - wizard killed"
|
||||
to_chat(world, "<span class='userdanger'>The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!</span>")
|
||||
|
||||
SSticker.news_report = WIZARD_KILLED
|
||||
..()
|
||||
return 1
|
||||
|
||||
/datum/game_mode/wizard/special_report()
|
||||
if(finished)
|
||||
return "<span class='redtext big'>The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!</span>"
|
||||
|
||||
/datum/game_mode/proc/auto_declare_completion_wizard()
|
||||
if(wizards.len)
|
||||
var/text = "<br><font size=3><b>the wizards/witches were:</b></font>"
|
||||
|
||||
for(var/datum/mind/wizard in wizards)
|
||||
|
||||
text += "<br><b>[wizard.key]</b> was <b>[wizard.name]</b> ("
|
||||
if(wizard.current)
|
||||
if(wizard.current.stat == DEAD)
|
||||
text += "died"
|
||||
else
|
||||
text += "survived"
|
||||
if(wizard.current.real_name != wizard.name)
|
||||
text += " as <b>[wizard.current.real_name]</b>"
|
||||
else
|
||||
text += "body destroyed"
|
||||
text += ")"
|
||||
|
||||
var/count = 1
|
||||
var/wizardwin = 1
|
||||
for(var/datum/objective/objective in wizard.objectives)
|
||||
if(objective.check_completion())
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='green'><B>Success!</B></font> [istype(objective, /datum/objective/crew) ? "<font color='grey'>(Optional)</font>" : ""]"
|
||||
SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "SUCCESS"))
|
||||
else
|
||||
text += "<br><B>Objective #[count]</B>: [objective.explanation_text] <font color='red'>Fail.</font> [istype(objective, /datum/objective/crew) ? "<font color='grey'>(Optional)</font>" : ""]"
|
||||
SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "FAIL"))
|
||||
if(!(istype(objective, /datum/objective/crew)))
|
||||
wizardwin = 0
|
||||
count++
|
||||
|
||||
if(wizard.current && wizardwin)
|
||||
text += "<br><font color='green'><B>The wizard was successful!</B></font>"
|
||||
SSblackbox.record_feedback("tally", "wizard_success", 1, "SUCCESS")
|
||||
else
|
||||
text += "<br><font color='red'><B>The wizard has failed!</B></font>"
|
||||
SSblackbox.record_feedback("tally", "wizard_success", 1, "FAIL")
|
||||
if(wizard.spell_list.len>0)
|
||||
text += "<br><B>[wizard.name] used the following spells: </B>"
|
||||
var/i = 1
|
||||
for(var/obj/effect/proc_holder/spell/S in wizard.spell_list)
|
||||
text += "[S.name]"
|
||||
if(wizard.spell_list.len > i)
|
||||
text += ", "
|
||||
i++
|
||||
text += "<br>"
|
||||
|
||||
to_chat(world, text)
|
||||
return 1
|
||||
//returns whether the mob is a wizard (or apprentice)
|
||||
/proc/iswizard(mob/living/M)
|
||||
return M.mind && M.mind.has_antag_datum(/datum/antagonist/wizard,TRUE)
|
||||
|
||||
@@ -134,7 +134,7 @@
|
||||
return
|
||||
|
||||
if(storedpda)
|
||||
storedpda.loc = get_turf(src.loc)
|
||||
storedpda.forceMove(drop_location())
|
||||
storedpda = null
|
||||
update_icon()
|
||||
else
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
state_open = TRUE
|
||||
circuit = /obj/item/circuitboard/machine/sleeper
|
||||
var/efficiency = 1
|
||||
var/min_health = 30
|
||||
var/min_health = -25
|
||||
var/list/available_chems
|
||||
var/controls_inside = FALSE
|
||||
var/list/possible_chems = list(
|
||||
@@ -42,7 +42,7 @@
|
||||
I += M.rating
|
||||
|
||||
efficiency = initial(efficiency)* E
|
||||
min_health = initial(min_health) - (10*E)
|
||||
min_health = initial(min_health) * E
|
||||
available_chems = list()
|
||||
for(var/i in 1 to I)
|
||||
available_chems |= possible_chems[i]
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption)
|
||||
if(!signal)
|
||||
return
|
||||
|
||||
if(id_tag != signal.data["tag"] || !signal.data["command"])
|
||||
@@ -52,15 +52,13 @@
|
||||
|
||||
/obj/machinery/door/airlock/proc/send_status()
|
||||
if(radio_connection)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
|
||||
signal.data["door_status"] = density?("closed"):("open")
|
||||
signal.data["lock_status"] = locked?("locked"):("unlocked")
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = GLOB.RADIO_AIRLOCK)
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = id_tag,
|
||||
"timestamp" = world.time,
|
||||
"door_status" = density ? "closed" : "open",
|
||||
"lock_status" = locked ? "locked" : "unlocked"
|
||||
))
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
|
||||
/obj/machinery/door/airlock/open(surpress_send)
|
||||
@@ -79,10 +77,10 @@
|
||||
SSradio.remove_object(src, frequency)
|
||||
if(new_frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_AIRLOCK)
|
||||
radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
/obj/machinery/door/airlock/Destroy()
|
||||
if(frequency && SSradio)
|
||||
if(frequency)
|
||||
SSradio.remove_object(src,frequency)
|
||||
return ..()
|
||||
|
||||
@@ -97,7 +95,7 @@
|
||||
|
||||
var/id_tag
|
||||
var/master_tag
|
||||
var/frequency = 1449
|
||||
var/frequency = FREQ_AIRLOCK_CONTROL
|
||||
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
@@ -115,36 +113,34 @@
|
||||
icon_state = "airlock_sensor_off"
|
||||
|
||||
/obj/machinery/airlock_sensor/attack_hand(mob/user)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = master_tag
|
||||
signal.data["command"] = "cycle"
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = master_tag,
|
||||
"command" = "cycle"
|
||||
))
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = GLOB.RADIO_AIRLOCK)
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
flick("airlock_sensor_cycle", src)
|
||||
|
||||
/obj/machinery/airlock_sensor/process()
|
||||
if(on)
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data["tag"] = id_tag
|
||||
signal.data["timestamp"] = world.time
|
||||
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
|
||||
var/pressure = round(air_sample.return_pressure(),0.1)
|
||||
alert = (pressure < ONE_ATMOSPHERE*0.8)
|
||||
|
||||
signal.data["pressure"] = num2text(pressure)
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = id_tag,
|
||||
"timestamp" = world.time,
|
||||
"pressure" = num2text(pressure)
|
||||
))
|
||||
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = GLOB.RADIO_AIRLOCK)
|
||||
radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK)
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/airlock_sensor/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_AIRLOCK)
|
||||
radio_connection = SSradio.add_object(src, frequency, RADIO_AIRLOCK)
|
||||
|
||||
/obj/machinery/airlock_sensor/Initialize()
|
||||
. = ..()
|
||||
@@ -152,4 +148,4 @@
|
||||
|
||||
/obj/machinery/airlock_sensor/Destroy()
|
||||
SSradio.remove_object(src,frequency)
|
||||
return ..()
|
||||
return ..()
|
||||
@@ -53,7 +53,7 @@
|
||||
|
||||
radio = new(src)
|
||||
radio.keyslot = new radio_key
|
||||
radio.subspace_transmission = 1
|
||||
radio.subspace_transmission = TRUE
|
||||
radio.canhear_range = 0
|
||||
radio.recalculateChannels()
|
||||
|
||||
|
||||
@@ -280,7 +280,7 @@
|
||||
playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
if(emagged)
|
||||
usr.gib()
|
||||
SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (emagged ? "emagged":"normal")))
|
||||
SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (emagged ? "emagged":"normal")))
|
||||
|
||||
blocked = FALSE
|
||||
return
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
icon_keyboard = "atmos_key"
|
||||
var/list/priority_alarms = list()
|
||||
var/list/minor_alarms = list()
|
||||
var/receive_frequency = 1437
|
||||
var/receive_frequency = FREQ_ATMOS_ALARMS
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
light_color = LIGHT_COLOR_CYAN
|
||||
@@ -57,10 +57,10 @@
|
||||
/obj/machinery/computer/atmos_alert/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, receive_frequency)
|
||||
receive_frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, receive_frequency, GLOB.RADIO_ATMOSIA)
|
||||
radio_connection = SSradio.add_object(src, receive_frequency, RADIO_ATMOSIA)
|
||||
|
||||
/obj/machinery/computer/atmos_alert/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption)
|
||||
if(!signal)
|
||||
return
|
||||
|
||||
var/zone = signal.data["zone"]
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
var/on = TRUE
|
||||
|
||||
var/id_tag
|
||||
var/frequency = 1441
|
||||
var/frequency = FREQ_ATMOS_STORAGE
|
||||
var/datum/radio_frequency/radio_connection
|
||||
|
||||
/obj/machinery/air_sensor/update_icon()
|
||||
@@ -19,31 +19,29 @@
|
||||
|
||||
/obj/machinery/air_sensor/process_atmos()
|
||||
if(on)
|
||||
var/datum/signal/signal = new
|
||||
var/datum/gas_mixture/air_sample = return_air()
|
||||
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data = list(
|
||||
var/datum/signal/signal = new(list(
|
||||
"sigtype" = "status",
|
||||
"id_tag" = id_tag,
|
||||
"timestamp" = world.time,
|
||||
"pressure" = air_sample.return_pressure(),
|
||||
"temperature" = air_sample.temperature,
|
||||
"gases" = list()
|
||||
)
|
||||
))
|
||||
var/total_moles = air_sample.total_moles()
|
||||
if(total_moles)
|
||||
for(var/gas_id in air_sample.gases)
|
||||
var/gas_name = air_sample.gases[gas_id][GAS_META][META_GAS_NAME]
|
||||
signal.data["gases"][gas_name] = air_sample.gases[gas_id][MOLES] / total_moles * 100
|
||||
|
||||
radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
|
||||
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
|
||||
|
||||
|
||||
/obj/machinery/air_sensor/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
|
||||
radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
|
||||
|
||||
/obj/machinery/air_sensor/Initialize()
|
||||
. = ..()
|
||||
@@ -66,7 +64,7 @@
|
||||
icon_keyboard = "atmos_key"
|
||||
circuit = /obj/item/circuitboard/computer/atmos_control
|
||||
|
||||
var/frequency = 1441
|
||||
var/frequency = FREQ_ATMOS_STORAGE
|
||||
var/list/sensors = list(
|
||||
"n2_sensor" = "Nitrogen Tank",
|
||||
"o2_sensor" = "Oxygen Tank",
|
||||
@@ -117,7 +115,7 @@
|
||||
return data
|
||||
|
||||
/obj/machinery/computer/atmos_control/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption)
|
||||
if(!signal)
|
||||
return
|
||||
|
||||
var/id_tag = signal.data["id_tag"]
|
||||
@@ -129,7 +127,7 @@
|
||||
/obj/machinery/computer/atmos_control/proc/set_frequency(new_frequency)
|
||||
SSradio.remove_object(src, frequency)
|
||||
frequency = new_frequency
|
||||
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_ATMOSIA)
|
||||
radio_connection = SSradio.add_object(src, frequency, RADIO_ATMOSIA)
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
// LARGE TANK CONTROL
|
||||
@@ -138,7 +136,7 @@
|
||||
/obj/machinery/computer/atmos_control/tank
|
||||
var/input_tag
|
||||
var/output_tag
|
||||
frequency = 1441
|
||||
frequency = FREQ_ATMOS_STORAGE
|
||||
circuit = /obj/item/circuitboard/computer/atmos_control/tank
|
||||
|
||||
var/list/input_info
|
||||
@@ -147,7 +145,7 @@
|
||||
// This hacky madness is the evidence of the fact that a lot of machines were never meant to be constructable, im so sorry you had to see this
|
||||
/obj/machinery/computer/atmos_control/tank/proc/reconnect(mob/user)
|
||||
var/list/IO = list()
|
||||
var/datum/radio_frequency/freq = SSradio.return_frequency(1441)
|
||||
var/datum/radio_frequency/freq = SSradio.return_frequency(FREQ_ATMOS_STORAGE)
|
||||
var/list/devices = freq.devices["_default"]
|
||||
for(var/obj/machinery/atmospherics/components/unary/vent_pump/U in devices)
|
||||
var/list/text = splittext(U.id_tag, "_")
|
||||
@@ -194,10 +192,7 @@
|
||||
/obj/machinery/computer/atmos_control/tank/ui_act(action, params)
|
||||
if(..() || !radio_connection)
|
||||
return
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1
|
||||
signal.source = src
|
||||
signal.data = list("sigtype" = "command")
|
||||
var/datum/signal/signal = new(list("sigtype" = "command"))
|
||||
switch(action)
|
||||
if("reconnect")
|
||||
reconnect(usr)
|
||||
@@ -214,10 +209,10 @@
|
||||
target = Clamp(target, 0, 50 * ONE_ATMOSPHERE)
|
||||
signal.data += list("tag" = output_tag, "set_internal_pressure" = target)
|
||||
. = TRUE
|
||||
radio_connection.post_signal(src, signal, filter = GLOB.RADIO_ATMOSIA)
|
||||
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
|
||||
|
||||
/obj/machinery/computer/atmos_control/tank/receive_signal(datum/signal/signal)
|
||||
if(!signal || signal.encryption)
|
||||
if(!signal)
|
||||
return
|
||||
|
||||
var/id_tag = signal.data["tag"]
|
||||
@@ -227,4 +222,4 @@
|
||||
else if(output_tag == id_tag)
|
||||
output_info = signal.data
|
||||
else
|
||||
..(signal)
|
||||
..(signal)
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
var/const/STATE_TOGGLE_EMERGENCY = 10
|
||||
var/const/STATE_PURCHASE = 11
|
||||
|
||||
var/status_display_freq = "1435"
|
||||
var/stat_msg1
|
||||
var/stat_msg2
|
||||
|
||||
@@ -228,7 +227,7 @@
|
||||
log_game("[key_name(usr)] answered [currmsg.title] comm message. Answer : [currmsg.answered]")
|
||||
if(currmsg)
|
||||
currmsg.answer_callback.Invoke()
|
||||
|
||||
|
||||
state = STATE_VIEWMESSAGE
|
||||
if("status")
|
||||
state = STATE_STATUSDISPLAY
|
||||
@@ -464,8 +463,9 @@
|
||||
if (authenticated==2)
|
||||
dat += "<BR><BR><B>Captain Functions</B>"
|
||||
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=announce'>Make a Captain's Announcement</A> \]"
|
||||
if(CONFIG_GET(string/cross_server_address))
|
||||
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver'>Send a message to an allied station</A> \]"
|
||||
var/cross_servers_count = length(CONFIG_GET(keyed_string_list/cross_server))
|
||||
if(cross_servers_count)
|
||||
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=crossserver'>Send a message to [cross_servers_count == 1 ? "an " : ""]allied station[cross_servers_count > 1 ? "s" : ""]</A> \]"
|
||||
if(SSmapping.config.allow_custom_shuttles)
|
||||
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=purchase_menu'>Purchase Shuttle</A> \]"
|
||||
dat += "<BR>\[ <A HREF='?src=[REF(src)];operation=changeseclevel'>Change Alert Level</A> \]"
|
||||
@@ -693,16 +693,12 @@
|
||||
|
||||
/obj/machinery/computer/communications/proc/post_status(command, data1, data2)
|
||||
|
||||
var/datum/radio_frequency/frequency = SSradio.return_frequency(1435)
|
||||
var/datum/radio_frequency/frequency = SSradio.return_frequency(FREQ_STATUS_DISPLAYS)
|
||||
|
||||
if(!frequency)
|
||||
return
|
||||
|
||||
var/datum/signal/status_signal = new
|
||||
status_signal.source = src
|
||||
status_signal.transmission_method = 1
|
||||
status_signal.data["command"] = command
|
||||
|
||||
var/datum/signal/status_signal = new(list("command" = command))
|
||||
switch(command)
|
||||
if("message")
|
||||
status_signal.data["msg1"] = data1
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
// Allows you to monitor messages that passes the server.
|
||||
|
||||
|
||||
|
||||
@@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E
|
||||
|
||||
/obj/machinery/computer/telecrystals/uplinker/proc/ejectuplink()
|
||||
if(uplinkholder)
|
||||
uplinkholder.loc = get_turf(src.loc)
|
||||
uplinkholder.forceMove(drop_location())
|
||||
uplinkholder = null
|
||||
update_icon()
|
||||
|
||||
@@ -154,7 +154,8 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E
|
||||
|
||||
/obj/machinery/computer/telecrystals/boss/proc/getDangerous()//This scales the TC assigned with the round population.
|
||||
..()
|
||||
var/danger = GLOB.joined_player_list.len - SSticker.mode.syndicates.len
|
||||
var/list/nukeops = get_antagonists(/datum/antagonist/nukeop)
|
||||
var/danger = GLOB.joined_player_list.len - nukeops.len
|
||||
danger = Ceiling(danger, 10)
|
||||
scaleTC(danger)
|
||||
|
||||
@@ -223,4 +224,4 @@ GLOBAL_LIST_INIT(possible_uplinker_IDs, list("Alfa","Bravo","Charlie","Delta","E
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
#undef NUKESCALINGMODIFIER
|
||||
#undef NUKESCALINGMODIFIER
|
||||
|
||||
@@ -161,12 +161,8 @@
|
||||
var/list/areaindex = list()
|
||||
if(regime_set == "Teleporter")
|
||||
for(var/obj/item/device/radio/beacon/R in GLOB.teleportbeacons)
|
||||
var/turf/T = get_turf(R)
|
||||
if(!T)
|
||||
continue
|
||||
if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX)
|
||||
continue
|
||||
L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R
|
||||
if(is_eligible(R))
|
||||
L[avoid_assoc_duplicate_keys(R.loc.loc.name, areaindex)] = R
|
||||
|
||||
for(var/obj/item/implant/tracking/I in GLOB.tracked_implants)
|
||||
if(!I.imp_in || !ismob(I.loc))
|
||||
@@ -176,12 +172,8 @@
|
||||
if(M.stat == DEAD)
|
||||
if(M.timeofdeath + 6000 < world.time)
|
||||
continue
|
||||
var/turf/T = get_turf(M)
|
||||
if(!T)
|
||||
continue
|
||||
if(T.z == ZLEVEL_CENTCOM)
|
||||
continue
|
||||
L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I
|
||||
if(is_eligible(I))
|
||||
L[avoid_assoc_duplicate_keys(M.real_name, areaindex)] = I
|
||||
|
||||
var/desc = input("Please select a location to lock in.", "Locking Computer") as null|anything in L
|
||||
target = L[desc]
|
||||
@@ -192,12 +184,8 @@
|
||||
to_chat(user, "<span class='alert'>No connected stations located.</span>")
|
||||
return
|
||||
for(var/obj/machinery/teleport/station/R in S)
|
||||
var/turf/T = get_turf(R)
|
||||
if(!T || !R.teleporter_hub || !R.teleporter_console)
|
||||
continue
|
||||
if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX)
|
||||
continue
|
||||
L[avoid_assoc_duplicate_keys(T.loc.name, areaindex)] = R
|
||||
if(is_eligible(R))
|
||||
L[avoid_assoc_duplicate_keys(R.loc.loc.name, areaindex)] = R
|
||||
var/desc = input("Please select a station to lock in.", "Locking Computer") as null|anything in L
|
||||
target = L[desc]
|
||||
if(target)
|
||||
@@ -209,4 +197,15 @@
|
||||
trg.teleporter_hub.update_icon()
|
||||
if(trg.teleporter_console)
|
||||
trg.teleporter_console.stat &= ~NOPOWER
|
||||
trg.teleporter_console.update_icon()
|
||||
trg.teleporter_console.update_icon()
|
||||
|
||||
/obj/machinery/computer/teleporter/proc/is_eligible(atom/movable/AM)
|
||||
var/turf/T = get_turf(AM)
|
||||
if(!T)
|
||||
return FALSE
|
||||
if(T.z == ZLEVEL_CENTCOM || T.z > ZLEVEL_SPACEMAX)
|
||||
return FALSE
|
||||
var/area/A = get_area(T)
|
||||
if(!A || A.noteleport)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -157,15 +157,15 @@
|
||||
if(istype(P, /obj/item/crowbar))
|
||||
playsound(src.loc, P.usesound, 50, 1)
|
||||
state = 2
|
||||
circuit.loc = src.loc
|
||||
circuit.forceMove(drop_location())
|
||||
components.Remove(circuit)
|
||||
circuit = null
|
||||
if(components.len == 0)
|
||||
to_chat(user, "<span class='notice'>You remove the circuit board.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You remove the circuit board and other components.</span>")
|
||||
for(var/atom/movable/A in components)
|
||||
A.loc = src.loc
|
||||
for(var/atom/movable/AM in components)
|
||||
AM.forceMove(drop_location())
|
||||
desc = initial(desc)
|
||||
req_components = null
|
||||
components = null
|
||||
@@ -186,9 +186,9 @@
|
||||
qdel(O)
|
||||
new_machine.component_parts = list()
|
||||
for(var/obj/O in src)
|
||||
O.loc = null
|
||||
O.moveToNullspace()
|
||||
new_machine.component_parts += O
|
||||
circuit.loc = null
|
||||
circuit.moveToNullspace()
|
||||
new_machine.RefreshParts()
|
||||
qdel(src)
|
||||
return
|
||||
@@ -257,4 +257,5 @@
|
||||
for(var/X in components)
|
||||
var/obj/item/I = X
|
||||
I.forceMove(loc)
|
||||
|
||||
..()
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
#define AIRLOCK_INTEGRITY_N 300 // Normal airlock integrity
|
||||
#define AIRLOCK_INTEGRITY_MULTIPLIER 1.5 // How much reinforced doors health increases
|
||||
#define AIRLOCK_DAMAGE_DEFLECTION_N 20 // Normal airlock damage deflection
|
||||
#define AIRLOCK_DAMAGE_DEFLECTION_N 21 // Normal airlock damage deflection
|
||||
#define AIRLOCK_DAMAGE_DEFLECTION_R 30 // Reinforced airlock damage deflection
|
||||
|
||||
#define NOT_ELECTRIFIED 0
|
||||
@@ -209,23 +209,27 @@
|
||||
/obj/machinery/door/airlock/narsie_act()
|
||||
var/turf/T = get_turf(src)
|
||||
var/runed = prob(20)
|
||||
var/obj/machinery/door/airlock/cult/A
|
||||
if(glass)
|
||||
if(runed)
|
||||
new/obj/machinery/door/airlock/cult/glass(T)
|
||||
A = new/obj/machinery/door/airlock/cult/glass(T)
|
||||
else
|
||||
new/obj/machinery/door/airlock/cult/unruned/glass(T)
|
||||
A = new/obj/machinery/door/airlock/cult/unruned/glass(T)
|
||||
else
|
||||
if(runed)
|
||||
new/obj/machinery/door/airlock/cult(T)
|
||||
A = new/obj/machinery/door/airlock/cult(T)
|
||||
else
|
||||
new/obj/machinery/door/airlock/cult/unruned(T)
|
||||
A = new/obj/machinery/door/airlock/cult/unruned(T)
|
||||
A.name = name
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/door/airlock/ratvar_act() //Airlocks become pinion airlocks that only allow servants
|
||||
var/obj/machinery/door/airlock/clockwork/A
|
||||
if(glass)
|
||||
new/obj/machinery/door/airlock/clockwork/brass(get_turf(src))
|
||||
A = new/obj/machinery/door/airlock/clockwork/brass(get_turf(src))
|
||||
else
|
||||
new/obj/machinery/door/airlock/clockwork(get_turf(src))
|
||||
A = new/obj/machinery/door/airlock/clockwork(get_turf(src))
|
||||
A.name = name
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/door/airlock/Destroy()
|
||||
@@ -1036,7 +1040,7 @@
|
||||
panel_open = TRUE
|
||||
update_icon(AIRLOCK_OPENING)
|
||||
visible_message("<span class='warning'>[src]'s panel is blown off in a spray of deadly shrapnel!</span>")
|
||||
charge.loc = get_turf(src)
|
||||
charge.forceMove(drop_location())
|
||||
charge.ex_act(EXPLODE_DEVASTATE)
|
||||
detonated = 1
|
||||
charge = null
|
||||
@@ -1340,7 +1344,7 @@
|
||||
else
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.loc = src.loc
|
||||
ae.forceMove(drop_location())
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/door/airlock/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd)
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
glass = TRUE
|
||||
|
||||
var/datum/radio_frequency/air_connection
|
||||
var/air_frequency = 1437
|
||||
var/air_frequency = FREQ_ATMOS_ALARMS
|
||||
autoclose = FALSE
|
||||
|
||||
/obj/machinery/door/airlock/alarmlock/New()
|
||||
@@ -22,7 +22,7 @@
|
||||
/obj/machinery/door/airlock/alarmlock/Initialize()
|
||||
. = ..()
|
||||
SSradio.remove_object(src, air_frequency)
|
||||
air_connection = SSradio.add_object(src, air_frequency, GLOB.RADIO_TO_AIRALARM)
|
||||
air_connection = SSradio.add_object(src, air_frequency, RADIO_TO_AIRALARM)
|
||||
open()
|
||||
|
||||
/obj/machinery/door/airlock/alarmlock/receive_signal(datum/signal/signal)
|
||||
@@ -41,4 +41,4 @@
|
||||
close()
|
||||
if("minor", "clear")
|
||||
autoclose = FALSE
|
||||
open()
|
||||
open()
|
||||
@@ -112,8 +112,8 @@
|
||||
return 0
|
||||
|
||||
if(!forced)
|
||||
Radio.set_frequency(GLOB.SEC_FREQ)
|
||||
Radio.talk_into(src, "Timer has expired. Releasing prisoner.", GLOB.SEC_FREQ, get_default_language())
|
||||
Radio.set_frequency(FREQ_SECURITY)
|
||||
Radio.talk_into(src, "Timer has expired. Releasing prisoner.", FREQ_SECURITY)
|
||||
|
||||
timing = FALSE
|
||||
activation_time = null
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
|
||||
/obj/machinery/door/Move()
|
||||
var/turf/T = loc
|
||||
..()
|
||||
. = ..()
|
||||
move_update_air(T)
|
||||
|
||||
/obj/machinery/door/CanPass(atom/movable/mover, turf/target)
|
||||
|
||||
@@ -1,66 +1,66 @@
|
||||
/obj/machinery/door/poddoor
|
||||
name = "blast door"
|
||||
desc = "A heavy duty blast door that opens mechanically."
|
||||
icon = 'icons/obj/doors/blastdoor.dmi'
|
||||
icon_state = "closed"
|
||||
var/id = 1
|
||||
/obj/machinery/door/poddoor
|
||||
name = "blast door"
|
||||
desc = "A heavy duty blast door that opens mechanically."
|
||||
icon = 'icons/obj/doors/blastdoor.dmi'
|
||||
icon_state = "closed"
|
||||
var/id = 1
|
||||
sub_door = TRUE
|
||||
explosion_block = 3
|
||||
explosion_block = 3
|
||||
heat_proof = TRUE
|
||||
safe = FALSE
|
||||
max_integrity = 600
|
||||
armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70)
|
||||
resistance_flags = FIRE_PROOF
|
||||
damage_deflection = 70
|
||||
|
||||
/obj/machinery/door/poddoor/preopen
|
||||
icon_state = "open"
|
||||
max_integrity = 600
|
||||
armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70)
|
||||
resistance_flags = FIRE_PROOF
|
||||
damage_deflection = 70
|
||||
|
||||
/obj/machinery/door/poddoor/preopen
|
||||
icon_state = "open"
|
||||
density = FALSE
|
||||
opacity = 0
|
||||
|
||||
/obj/machinery/door/poddoor/ert
|
||||
desc = "A heavy duty blast door that only opens for dire emergencies."
|
||||
|
||||
//special poddoors that open when emergency shuttle docks at centcom
|
||||
/obj/machinery/door/poddoor/shuttledock
|
||||
var/checkdir = 4 //door won't open if turf in this dir is `turftype`
|
||||
var/turftype = /turf/open/space
|
||||
|
||||
/obj/machinery/door/poddoor/shuttledock/proc/check()
|
||||
var/turf/T = get_step(src, checkdir)
|
||||
if(!istype(T, turftype))
|
||||
INVOKE_ASYNC(src, .proc/open)
|
||||
else
|
||||
INVOKE_ASYNC(src, .proc/close)
|
||||
|
||||
opacity = 0
|
||||
|
||||
/obj/machinery/door/poddoor/ert
|
||||
desc = "A heavy duty blast door that only opens for dire emergencies."
|
||||
|
||||
//special poddoors that open when emergency shuttle docks at centcom
|
||||
/obj/machinery/door/poddoor/shuttledock
|
||||
var/checkdir = 4 //door won't open if turf in this dir is `turftype`
|
||||
var/turftype = /turf/open/space
|
||||
|
||||
/obj/machinery/door/poddoor/shuttledock/proc/check()
|
||||
var/turf/T = get_step(src, checkdir)
|
||||
if(!istype(T, turftype))
|
||||
INVOKE_ASYNC(src, .proc/open)
|
||||
else
|
||||
INVOKE_ASYNC(src, .proc/close)
|
||||
|
||||
/obj/machinery/door/poddoor/CollidedWith(atom/movable/AM)
|
||||
if(density)
|
||||
return 0
|
||||
else
|
||||
return ..()
|
||||
|
||||
//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS.
|
||||
/obj/machinery/door/poddoor/ex_act(severity, target)
|
||||
if(severity == 3)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/door/poddoor/do_animate(animation)
|
||||
switch(animation)
|
||||
if("opening")
|
||||
flick("opening", src)
|
||||
if("closing")
|
||||
flick("closing", src)
|
||||
|
||||
/obj/machinery/door/poddoor/update_icon()
|
||||
if(density)
|
||||
icon_state = "closed"
|
||||
else
|
||||
icon_state = "open"
|
||||
|
||||
/obj/machinery/door/poddoor/try_to_activate_door(mob/user)
|
||||
return
|
||||
|
||||
/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user)
|
||||
if(stat & NOPOWER)
|
||||
open(1)
|
||||
if(density)
|
||||
return 0
|
||||
else
|
||||
return ..()
|
||||
|
||||
//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS.
|
||||
/obj/machinery/door/poddoor/ex_act(severity, target)
|
||||
if(severity == 3)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/machinery/door/poddoor/do_animate(animation)
|
||||
switch(animation)
|
||||
if("opening")
|
||||
flick("opening", src)
|
||||
if("closing")
|
||||
flick("closing", src)
|
||||
|
||||
/obj/machinery/door/poddoor/update_icon()
|
||||
if(density)
|
||||
icon_state = "closed"
|
||||
else
|
||||
icon_state = "open"
|
||||
|
||||
/obj/machinery/door/poddoor/try_to_activate_door(mob/user)
|
||||
return
|
||||
|
||||
/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user)
|
||||
if(stat & NOPOWER)
|
||||
open(1)
|
||||
|
||||
@@ -26,4 +26,4 @@
|
||||
|
||||
/obj/machinery/door/poddoor/shutters/close(ignorepower = 0)
|
||||
..()
|
||||
layer = CLOSED_DOOR_LAYER
|
||||
layer = CLOSED_DOOR_LAYER
|
||||
@@ -1,25 +1,25 @@
|
||||
/obj/machinery/door/unpowered
|
||||
|
||||
/obj/machinery/door/unpowered
|
||||
|
||||
/obj/machinery/door/unpowered/CollidedWith(atom/movable/AM)
|
||||
if(src.locked)
|
||||
return
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/door/unpowered/attackby(obj/item/I, mob/user, params)
|
||||
if(locked)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/unpowered/emag_act()
|
||||
return
|
||||
|
||||
/obj/machinery/door/unpowered/shuttle
|
||||
icon = 'icons/turf/shuttle.dmi'
|
||||
name = "door"
|
||||
icon_state = "door1"
|
||||
opacity = 1
|
||||
if(src.locked)
|
||||
return
|
||||
..()
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/door/unpowered/attackby(obj/item/I, mob/user, params)
|
||||
if(locked)
|
||||
return
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/door/unpowered/emag_act()
|
||||
return
|
||||
|
||||
/obj/machinery/door/unpowered/shuttle
|
||||
icon = 'icons/turf/shuttle.dmi'
|
||||
name = "door"
|
||||
icon_state = "door1"
|
||||
opacity = 1
|
||||
density = TRUE
|
||||
explosion_block = 1
|
||||
@@ -192,7 +192,8 @@
|
||||
add_atom_colour("#7D1919", FIXED_COLOUR_PRIORITY)
|
||||
|
||||
/obj/machinery/door/window/ratvar_act()
|
||||
new/obj/machinery/door/window/clockwork(src.loc, dir)
|
||||
var/obj/machinery/door/window/clockwork/C = new(loc, dir)
|
||||
C.name = name
|
||||
qdel(src)
|
||||
|
||||
/obj/machinery/door/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
|
||||
@@ -275,7 +276,7 @@
|
||||
else
|
||||
ae = electronics
|
||||
electronics = null
|
||||
ae.loc = src.loc
|
||||
ae.forceMove(drop_location())
|
||||
|
||||
qdel(src)
|
||||
return
|
||||
@@ -495,4 +496,4 @@
|
||||
/obj/machinery/door/window/brigdoor/security/holding/southright
|
||||
dir = SOUTH
|
||||
icon_state = "rightsecure"
|
||||
base_state = "rightsecure"
|
||||
base_state = "rightsecure"
|
||||
|
||||
@@ -19,6 +19,10 @@ GLOBAL_LIST_EMPTY(doppler_arrays)
|
||||
GLOB.doppler_arrays -= src
|
||||
return ..()
|
||||
|
||||
/obj/machinery/doppler_array/examine(mob/user)
|
||||
..()
|
||||
to_chat(user, "<span class='notice'>Its dish is facing to the [dir2text(dir)].</span>")
|
||||
|
||||
/obj/machinery/doppler_array/process()
|
||||
return PROCESS_KILL
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
var/target_state = AIRLOCK_STATE_CLOSED
|
||||
var/sensor_pressure = null
|
||||
|
||||
/datum/computer/file/embedded_program/airlock_controller/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
/datum/computer/file/embedded_program/airlock_controller/receive_signal(datum/signal/signal)
|
||||
var/receive_tag = signal.data["tag"]
|
||||
if(!receive_tag)
|
||||
return
|
||||
@@ -68,19 +68,17 @@
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = interior_door_tag,
|
||||
"command" = "secure_close"
|
||||
)))
|
||||
else
|
||||
if(memory["pump_status"] != "off")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = airpump_tag,
|
||||
"power" = 0,
|
||||
"sigtype"="command"
|
||||
)
|
||||
post_signal(signal)
|
||||
"sigtype" = "command"
|
||||
)))
|
||||
|
||||
if(AIRLOCK_STATE_PRESSURIZE)
|
||||
if(target_state < state)
|
||||
@@ -89,16 +87,15 @@
|
||||
state = AIRLOCK_STATE_INOPEN
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = interior_door_tag,
|
||||
"command" = "secure_open"
|
||||
)))
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
"sigtype" = "command"
|
||||
))
|
||||
if(memory["pump_status"] == "siphon")
|
||||
signal.data["stabalize"] = 1
|
||||
else if(memory["pump_status"] != "release")
|
||||
@@ -114,29 +111,27 @@
|
||||
state = AIRLOCK_STATE_DEPRESSURIZE
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = interior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = interior_door_tag,
|
||||
"command" = "secure_close"
|
||||
)))
|
||||
else if(target_state < state)
|
||||
if(memory["exterior_status"] == "closed")
|
||||
state = AIRLOCK_STATE_PRESSURIZE
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = exterior_door_tag,
|
||||
"command" = "secure_close"
|
||||
)))
|
||||
|
||||
else
|
||||
if(memory["pump_status"] != "off")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = airpump_tag,
|
||||
"power" = 0,
|
||||
"sigtype"="command"
|
||||
)
|
||||
post_signal(signal)
|
||||
"sigtype" = "command"
|
||||
)))
|
||||
|
||||
if(AIRLOCK_STATE_DEPRESSURIZE)
|
||||
var/target_pressure = ONE_ATMOSPHERE*0.05
|
||||
@@ -148,10 +143,10 @@
|
||||
if(memory["exterior_status"] == "open")
|
||||
state = AIRLOCK_STATE_OUTOPEN
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_open"
|
||||
post_signal(signal)
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = exterior_door_tag,
|
||||
"command" = "secure_open"
|
||||
)))
|
||||
else if(target_state < state)
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
process_again = 1
|
||||
@@ -159,12 +154,10 @@
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data = list(
|
||||
var/datum/signal/signal = new(list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
"sigtype" = "command"
|
||||
))
|
||||
if(memory["pump_status"] == "release")
|
||||
signal.data["purge"] = 1
|
||||
else if(memory["pump_status"] != "siphon")
|
||||
@@ -181,19 +174,17 @@
|
||||
state = AIRLOCK_STATE_CLOSED
|
||||
process_again = 1
|
||||
else
|
||||
var/datum/signal/signal = new
|
||||
signal.data["tag"] = exterior_door_tag
|
||||
signal.data["command"] = "secure_close"
|
||||
post_signal(signal)
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = exterior_door_tag,
|
||||
"command" = "secure_close"
|
||||
)))
|
||||
else
|
||||
if(memory["pump_status"] != "off")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = airpump_tag,
|
||||
"power" = 0,
|
||||
"sigtype"="command"
|
||||
)
|
||||
post_signal(signal)
|
||||
"sigtype" = "command"
|
||||
)))
|
||||
|
||||
memory["sensor_pressure"] = sensor_pressure
|
||||
memory["processing"] = state != target_state
|
||||
@@ -209,7 +200,7 @@
|
||||
name = "airlock console"
|
||||
density = FALSE
|
||||
|
||||
frequency = 1449
|
||||
frequency = FREQ_AIRLOCK_CONTROL
|
||||
power_channel = ENVIRON
|
||||
|
||||
// Setup parameters only
|
||||
@@ -293,4 +284,4 @@
|
||||
</div>
|
||||
[state_options]"}
|
||||
|
||||
return output
|
||||
return output
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
/datum/computer/file/embedded_program/proc/receive_user_command(command)
|
||||
|
||||
/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
/datum/computer/file/embedded_program/proc/receive_signal(datum/signal/signal)
|
||||
return null
|
||||
|
||||
/datum/computer/file/embedded_program/process()
|
||||
@@ -43,13 +43,9 @@
|
||||
/obj/machinery/embedded_controller/proc/post_signal(datum/signal/signal, comm_line)
|
||||
return 0
|
||||
|
||||
/obj/machinery/embedded_controller/receive_signal(datum/signal/signal, receive_method, receive_param)
|
||||
if(!signal || signal.encryption)
|
||||
return
|
||||
|
||||
if(program)
|
||||
program.receive_signal(signal, receive_method, receive_param)
|
||||
//spawn(5) program.process() //no, program.process sends some signals and machines respond and we here again and we lag -rastaf0
|
||||
/obj/machinery/embedded_controller/receive_signal(datum/signal/signal)
|
||||
if(istype(signal) && program)
|
||||
program.receive_signal(signal)
|
||||
|
||||
/obj/machinery/embedded_controller/Topic(href, href_list)
|
||||
if(..())
|
||||
|
||||
@@ -5,34 +5,27 @@
|
||||
/datum/computer/file/embedded_program/simple_vent_controller/receive_user_command(command)
|
||||
switch(command)
|
||||
if("vent_inactive")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
signal.data["power"] = 0
|
||||
post_signal(signal)
|
||||
"sigtype" = "command",
|
||||
"power" = 0
|
||||
)))
|
||||
|
||||
if("vent_pump")
|
||||
var/datum/signal/signal = new
|
||||
signal.data = list(
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
signal.data["stabalize"] = 1
|
||||
signal.data["power"] = 1
|
||||
post_signal(signal)
|
||||
"sigtype" = "command",
|
||||
"stabalize" = 1,
|
||||
"power" = 1
|
||||
)))
|
||||
|
||||
if("vent_clear")
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 //radio signal
|
||||
signal.data = list(
|
||||
post_signal(new /datum/signal(list(
|
||||
"tag" = airpump_tag,
|
||||
"sigtype"="command"
|
||||
)
|
||||
signal.data["purge"] = 1
|
||||
signal.data["power"] = 1
|
||||
post_signal(signal)
|
||||
"sigtype" = "command",
|
||||
"purge" = 1,
|
||||
"power" = 1
|
||||
)))
|
||||
|
||||
/datum/computer/file/embedded_program/simple_vent_controller/process()
|
||||
return 0
|
||||
@@ -45,7 +38,7 @@
|
||||
name = "vent controller"
|
||||
density = FALSE
|
||||
|
||||
frequency = 1229
|
||||
frequency = FREQ_ATMOS_CONTROL
|
||||
power_channel = ENVIRON
|
||||
|
||||
// Setup parameters only
|
||||
|
||||
@@ -75,7 +75,7 @@ Possible to do for anyone motivated enough:
|
||||
replay_stop()
|
||||
if(record_mode)
|
||||
record_stop()
|
||||
|
||||
|
||||
QDEL_NULL(disk)
|
||||
|
||||
holopads -= src
|
||||
@@ -256,12 +256,12 @@ Possible to do for anyone motivated enough:
|
||||
temp = ""
|
||||
if(outgoing_call)
|
||||
outgoing_call.Disconnect()
|
||||
|
||||
|
||||
else if(href_list["disk_eject"])
|
||||
if(disk && !replay_mode)
|
||||
disk.forceMove(drop_location())
|
||||
disk = null
|
||||
|
||||
|
||||
else if(href_list["replay_stop"])
|
||||
replay_stop()
|
||||
else if(href_list["replay_start"])
|
||||
@@ -424,7 +424,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
if(masters[user])
|
||||
var/obj/effect/overlay/holo_pad_hologram/H = masters[user]
|
||||
step_to(H, new_turf)
|
||||
H.loc = new_turf
|
||||
H.forceMove(new_turf)
|
||||
var/area/holo_area = get_area(src)
|
||||
var/area/eye_area = new_turf.loc
|
||||
|
||||
@@ -505,7 +505,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
|
||||
current_delay += entry[2]
|
||||
|
||||
var/time_delta = world.time - record_start - current_delay
|
||||
|
||||
|
||||
if(time_delta >= 1)
|
||||
disk.record.entries += list(list(HOLORECORD_DELAY,time_delta))
|
||||
disk.record.entries += list(list(HOLORECORD_SAY,message))
|
||||
|
||||
@@ -213,4 +213,4 @@
|
||||
to_chat(user, "<span class='notice'>[attached ? attached : "No one"] is attached.</span>")
|
||||
|
||||
#undef IV_TAKING
|
||||
#undef IV_INJECTING
|
||||
#undef IV_INJECTING
|
||||
@@ -15,7 +15,7 @@
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 50
|
||||
|
||||
var/freq = 1449 // radio frequency
|
||||
var/freq = FREQ_MAGNETS // radio frequency
|
||||
var/electricity_level = 1 // intensity of the magnetic pull
|
||||
var/magnetic_field = 1 // the range of magnetic attraction
|
||||
var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something
|
||||
@@ -33,7 +33,7 @@
|
||||
var/turf/T = loc
|
||||
hide(T.intact)
|
||||
center = T
|
||||
SSradio.add_object(src, freq, GLOB.RADIO_MAGNETS)
|
||||
SSradio.add_object(src, freq, RADIO_MAGNETS)
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/machinery/magnetic_module/LateInitialize()
|
||||
@@ -198,7 +198,7 @@
|
||||
anchored = TRUE
|
||||
use_power = IDLE_POWER_USE
|
||||
idle_power_usage = 45
|
||||
var/frequency = 1449
|
||||
var/frequency = FREQ_MAGNETS
|
||||
var/code = 0
|
||||
var/list/magnets = list()
|
||||
var/title = "Magnetic Control Console"
|
||||
@@ -224,7 +224,7 @@
|
||||
|
||||
if(path) // check for default path
|
||||
filter_path() // renders rpath
|
||||
radio_connection = SSradio.add_object(src, frequency, GLOB.RADIO_MAGNETS)
|
||||
radio_connection = SSradio.add_object(src, frequency, RADIO_MAGNETS)
|
||||
|
||||
/obj/machinery/magnetic_controller/Destroy()
|
||||
SSradio.remove_object(src, frequency)
|
||||
@@ -278,11 +278,7 @@
|
||||
if(href_list["radio-op"])
|
||||
|
||||
// Prepare signal beforehand, because this is a radio operation
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 // radio transmission
|
||||
signal.source = src
|
||||
signal.frequency = frequency
|
||||
signal.data["code"] = code
|
||||
var/datum/signal/signal = new(list("code" = code))
|
||||
|
||||
// Apply any necessary commands
|
||||
switch(href_list["radio-op"])
|
||||
@@ -302,7 +298,7 @@
|
||||
|
||||
// Broadcast the signal
|
||||
|
||||
radio_connection.post_signal(src, signal, filter = GLOB.RADIO_MAGNETS)
|
||||
radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
|
||||
|
||||
spawn(1)
|
||||
updateUsrDialog() // pretty sure this increases responsiveness
|
||||
@@ -345,11 +341,7 @@
|
||||
looping = 1
|
||||
|
||||
// Prepare the radio signal
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 1 // radio transmission
|
||||
signal.source = src
|
||||
signal.frequency = frequency
|
||||
signal.data["code"] = code
|
||||
var/datum/signal/signal = new(list("code" = code))
|
||||
|
||||
if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list!
|
||||
pathpos = 1
|
||||
@@ -370,7 +362,7 @@
|
||||
|
||||
// Broadcast the signal
|
||||
spawn()
|
||||
radio_connection.post_signal(src, signal, filter = GLOB.RADIO_MAGNETS)
|
||||
radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS)
|
||||
|
||||
if(speed == 10)
|
||||
sleep(1)
|
||||
@@ -393,4 +385,4 @@
|
||||
if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore
|
||||
rpath += copytext(path, i, i+1) // else, add to list
|
||||
|
||||
// there doesn't HAVE to be separators but it makes paths syntatically visible
|
||||
// there doesn't HAVE to be separators but it makes paths syntatically visible
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
var/open = FALSE // true if cover is open
|
||||
var/locked = TRUE // true if controls are locked
|
||||
var/freq = 1445 // radio frequency
|
||||
var/freq = FREQ_NAV_BEACON
|
||||
var/location = "" // location response text
|
||||
var/list/codes // assoc. list of transponder codes
|
||||
var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value"
|
||||
@@ -205,4 +205,4 @@ Transponder Codes:<UL>"}
|
||||
|
||||
codes[newkey] = newval
|
||||
|
||||
updateDialog()
|
||||
updateDialog()
|
||||
@@ -22,6 +22,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
var/creationTime
|
||||
var/authorCensor
|
||||
var/bodyCensor
|
||||
var/photo_file
|
||||
|
||||
/datum/newscaster/feed_message/proc/returnAuthor(censor)
|
||||
if(censor == -1)
|
||||
@@ -97,6 +98,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
var/scannedUser
|
||||
var/isAdminMsg
|
||||
var/icon/img
|
||||
var/photo_file
|
||||
|
||||
/datum/newscaster/feed_network
|
||||
var/list/datum/newscaster/feed_channel/network_channels = list()
|
||||
@@ -126,6 +128,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
if(photo)
|
||||
newMsg.img = photo.img
|
||||
newMsg.caption = photo.scribble
|
||||
newMsg.photo_file = save_photo(photo.img)
|
||||
for(var/datum/newscaster/feed_channel/FC in network_channels)
|
||||
if(FC.channel_name == channel_name)
|
||||
FC.messages += newMsg
|
||||
@@ -143,6 +146,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
wanted_issue.isAdminMsg = adminMsg
|
||||
if(photo)
|
||||
wanted_issue.img = photo.img
|
||||
wanted_issue.photo_file = save_photo(photo.img)
|
||||
if(newMessage)
|
||||
for(var/obj/machinery/newscaster/N in GLOB.allCasters)
|
||||
N.newsAlert()
|
||||
@@ -157,7 +161,12 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
for(var/obj/machinery/newscaster/NEWSCASTER in GLOB.allCasters)
|
||||
NEWSCASTER.update_icon()
|
||||
|
||||
|
||||
/datum/newscaster/feed_network/proc/save_photo(icon/photo)
|
||||
var/photo_file = copytext(md5("\icon[photo]"), 1, 6)
|
||||
if(!fexists("[GLOB.log_directory]/photos/[photo_file].png"))
|
||||
var/icon/p = icon(photo, frame = 1)
|
||||
fcopy(p, "[GLOB.log_directory]/photos/[photo_file].png")
|
||||
return photo_file
|
||||
|
||||
/obj/item/wallframe/newscaster
|
||||
name = "newscaster frame"
|
||||
@@ -780,7 +789,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
/obj/machinery/newscaster/proc/AttachPhoto(mob/user)
|
||||
if(photo)
|
||||
if(!photo.sillynewscastervar)
|
||||
photo.loc = loc
|
||||
photo.forceMove(drop_location())
|
||||
if(!issilicon(user))
|
||||
user.put_in_inactive_hand(photo)
|
||||
else
|
||||
@@ -856,7 +865,7 @@ GLOBAL_LIST_EMPTY(allCasters)
|
||||
NEWSPAPER.wantedBody = GLOB.news_network.wanted_issue.body
|
||||
if(GLOB.news_network.wanted_issue.img)
|
||||
NEWSPAPER.wantedPhoto = GLOB.news_network.wanted_issue.img
|
||||
NEWSPAPER.loc = get_turf(src)
|
||||
NEWSPAPER.forceMove(drop_location())
|
||||
NEWSPAPER.creationTime = GLOB.news_network.lastAction
|
||||
paper_remaining--
|
||||
|
||||
|
||||
@@ -15,17 +15,17 @@
|
||||
var/teleporting = 0 //if it's in the process of teleporting
|
||||
var/power_efficiency = 1
|
||||
var/obj/machinery/quantumpad/linked_pad
|
||||
|
||||
|
||||
//mapping
|
||||
var/static/list/mapped_quantum_pads = list()
|
||||
var/map_pad_id = "" as text //what's my name
|
||||
var/map_pad_link_id = "" as text //who's my friend
|
||||
|
||||
|
||||
/obj/machinery/quantumpad/Initialize()
|
||||
. = ..()
|
||||
if(map_pad_id)
|
||||
mapped_quantum_pads[map_pad_id] = src
|
||||
|
||||
|
||||
/obj/machinery/quantumpad/Destroy()
|
||||
mapped_quantum_pads -= map_pad_id
|
||||
return ..()
|
||||
|
||||
@@ -315,13 +315,13 @@ GLOBAL_LIST_EMPTY(allConsoles)
|
||||
var/radio_freq
|
||||
switch(text2num(href_list["emergency"]))
|
||||
if(1) //Security
|
||||
radio_freq = GLOB.SEC_FREQ
|
||||
radio_freq = FREQ_SECURITY
|
||||
emergency = "Security"
|
||||
if(2) //Engineering
|
||||
radio_freq = GLOB.ENG_FREQ
|
||||
radio_freq = FREQ_ENGINEERING
|
||||
emergency = "Engineering"
|
||||
if(3) //Medical
|
||||
radio_freq = GLOB.MED_FREQ
|
||||
radio_freq = FREQ_MEDICAL
|
||||
emergency = "Medical"
|
||||
if(radio_freq)
|
||||
Radio.set_frequency(radio_freq)
|
||||
@@ -352,17 +352,17 @@ GLOBAL_LIST_EMPTY(allConsoles)
|
||||
var/radio_freq = 0
|
||||
switch(href_list["department"])
|
||||
if("bridge")
|
||||
radio_freq = GLOB.COMM_FREQ
|
||||
radio_freq = FREQ_COMMAND
|
||||
if("medbay")
|
||||
radio_freq = GLOB.MED_FREQ
|
||||
radio_freq = FREQ_MEDICAL
|
||||
if("science")
|
||||
radio_freq = GLOB.SCI_FREQ
|
||||
radio_freq = FREQ_SCIENCE
|
||||
if("engineering")
|
||||
radio_freq = GLOB.ENG_FREQ
|
||||
radio_freq = FREQ_ENGINEERING
|
||||
if("security")
|
||||
radio_freq = GLOB.SEC_FREQ
|
||||
radio_freq = FREQ_SECURITY
|
||||
if("cargobay" || "mining")
|
||||
radio_freq = GLOB.SUPP_FREQ
|
||||
radio_freq = FREQ_SUPPLY
|
||||
Radio.set_frequency(radio_freq)
|
||||
var/authentic
|
||||
if(msgVerified || msgStamped)
|
||||
|
||||
@@ -137,7 +137,7 @@ Please wait until completion...</TT><BR>
|
||||
|
||||
spawn (build_time)
|
||||
if (!isnull(src.being_built))
|
||||
src.being_built.loc = get_turf(src)
|
||||
src.being_built.forceMove(drop_location())
|
||||
src.being_built = null
|
||||
src.use_power = IDLE_POWER_USE
|
||||
operating = FALSE
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
/obj/structure/emergency_shield/Move()
|
||||
var/turf/T = loc
|
||||
..()
|
||||
. = ..()
|
||||
move_update_air(T)
|
||||
|
||||
/obj/structure/emergency_shield/emp_act(severity)
|
||||
@@ -180,19 +180,25 @@
|
||||
anchored = FALSE
|
||||
|
||||
else if(W.GetID())
|
||||
if(allowed(user))
|
||||
if(allowed(user) && !emagged)
|
||||
locked = !locked
|
||||
to_chat(user, "<span class='notice'>You [locked ? "lock" : "unlock"] the controls.</span>")
|
||||
else if(emagged)
|
||||
to_chat(user, "<span class='danger'>Error, access controller damaged!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>Access denied.</span>")
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/machinery/shieldgen/emag_act()
|
||||
if(!(stat & BROKEN))
|
||||
stat |= BROKEN
|
||||
update_icon()
|
||||
/obj/machinery/shieldgen/emag_act(mob/user)
|
||||
if(emagged)
|
||||
to_chat(user, "<span class='warning'>The access controller is damaged!</span>")
|
||||
return
|
||||
emagged = TRUE
|
||||
locked = FALSE
|
||||
playsound(src, "sparks", 100, 1)
|
||||
to_chat(user, "<span class='warning'>You short out the access controller.</span>")
|
||||
|
||||
/obj/machinery/shieldgen/update_icon()
|
||||
if(active)
|
||||
@@ -337,9 +343,11 @@
|
||||
default_unfasten_wrench(user, W, 0)
|
||||
|
||||
else if(W.GetID())
|
||||
if(allowed(user))
|
||||
if(allowed(user) && !emagged)
|
||||
locked = !locked
|
||||
to_chat(user, "<span class='notice'>You [src.locked ? "lock" : "unlock"] the controls.</span>")
|
||||
else if(emagged)
|
||||
to_chat(user, "<span class='danger'>Error, access controller damaged!</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>Access denied.</span>")
|
||||
|
||||
@@ -372,6 +380,14 @@
|
||||
update_activity()
|
||||
add_fingerprint(user)
|
||||
|
||||
/obj/machinery/shieldwallgen/emag_act(mob/user)
|
||||
if(emagged)
|
||||
to_chat(user, "<span class='warning'>The access controller is damaged!</span>")
|
||||
return
|
||||
emagged = TRUE
|
||||
locked = FALSE
|
||||
playsound(src, "sparks", 100, 1)
|
||||
to_chat(user, "<span class='warning'>You short out the access controller.</span>")
|
||||
|
||||
//////////////Containment Field START
|
||||
/obj/machinery/shieldwall
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
settableTemperatureMedian + settableTemperatureRange)
|
||||
if("eject")
|
||||
if(panel_open && cell)
|
||||
cell.loc = get_turf(src)
|
||||
cell.forceMove(drop_location())
|
||||
cell = null
|
||||
. = TRUE
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
var/index1 // display index for scrolling messages or 0 if non-scrolling
|
||||
var/index2
|
||||
|
||||
var/frequency = 1435 // radio frequency
|
||||
var/frequency = FREQ_STATUS_DISPLAYS
|
||||
var/supply_display = 0 // true if a supply shuttle display
|
||||
var/shuttle_id // Id used for "generic shuttle timer" mode
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
if(data == 1)
|
||||
for(var/obj/item/device/radio/intercom/R in GLOB.all_radios["[freq]"])
|
||||
if(R.receive_range(freq, level) > -1)
|
||||
if(R.can_receive(freq, level))
|
||||
radios += R
|
||||
|
||||
// --- Broadcast only to intercoms and station-bounced radios ---
|
||||
@@ -97,7 +97,7 @@
|
||||
if(R.subspace_transmission)
|
||||
continue
|
||||
|
||||
if(R.receive_range(freq, level) > -1)
|
||||
if(R.can_receive(freq, level))
|
||||
radios += R
|
||||
|
||||
// --- This space left blank for Syndicate data ---
|
||||
@@ -110,19 +110,19 @@
|
||||
if(!R.independent)
|
||||
continue
|
||||
|
||||
if(R.receive_range(freq, level) > -1)
|
||||
if(R.can_receive(freq, level))
|
||||
radios += R
|
||||
|
||||
// --- Broadcast to ALL radio devices ---
|
||||
|
||||
else
|
||||
for(var/obj/item/device/radio/R in GLOB.all_radios["[freq]"])
|
||||
if(R.receive_range(freq, level) > -1)
|
||||
if(R.can_receive(freq, level))
|
||||
radios += R
|
||||
|
||||
var/freqtext = num2text(freq)
|
||||
for(var/obj/item/device/radio/R in GLOB.all_radios["[GLOB.SYND_FREQ]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving.
|
||||
if(R.receive_range(GLOB.SYND_FREQ, list(R.z)) > -1 && freqtext in GLOB.reverseradiochannels)
|
||||
for(var/obj/item/device/radio/R in GLOB.all_radios["[FREQ_SYNDICATE]"]) //syndicate radios use magic that allows them to hear everything. this was already the case, now it just doesn't need the allinone anymore. solves annoying bugs that aren't worth solving.
|
||||
if(R.can_receive(FREQ_SYNDICATE, list(R.z)) && freqtext in GLOB.reverseradiochannels)
|
||||
radios |= R
|
||||
|
||||
// Get a list of mobs who can hear from the radios we collected.
|
||||
@@ -150,16 +150,11 @@
|
||||
|
||||
//Use this to test if an obj can communicate with a Telecommunications Network
|
||||
|
||||
/atom/proc/test_telecomms()
|
||||
var/datum/signal/signal = telecomms_process()
|
||||
var/turf/position = get_turf(src)
|
||||
return (position.z in signal.data["level"] && signal.data["done"])
|
||||
|
||||
/atom/proc/telecomms_process()
|
||||
|
||||
// First, we want to generate a new radio signal
|
||||
var/datum/signal/signal = new
|
||||
signal.transmission_method = 2 // 2 would be a subspace transmission.
|
||||
signal.transmission_method = TRANSMISSION_SUBSPACE
|
||||
var/turf/pos = get_turf(src)
|
||||
|
||||
// --- Finally, tag the actual signal with the appropriate values ---
|
||||
@@ -173,7 +168,7 @@
|
||||
"done" = 0,
|
||||
"level" = pos.z // The level it is being broadcasted at.
|
||||
)
|
||||
signal.frequency = 1459// Common channel
|
||||
signal.frequency = FREQ_COMMON
|
||||
|
||||
//#### Sending the signal to all subspace receivers ####//
|
||||
for(var/obj/machinery/telecomms/receiver/R in GLOB.telecomms_list)
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
if(newfreq && canAccess(usr))
|
||||
if(findtext(num2text(newfreq), "."))
|
||||
newfreq *= 10 // shift the decimal one place
|
||||
if(newfreq == GLOB.SYND_FREQ)
|
||||
if(newfreq == FREQ_SYNDICATE)
|
||||
temp = "<font color = #FF0000>-% Error: Interference preventing filtering frequency: \"[newfreq] GHz\" %-</font color>"
|
||||
else
|
||||
if(!(newfreq in freq_listening) && newfreq < 10000)
|
||||
|
||||
@@ -36,12 +36,12 @@
|
||||
|
||||
|
||||
/* ###### Copy all syndie communications to the Syndicate Frequency ###### */
|
||||
if(intercept && signal.frequency == GLOB.SYND_FREQ)
|
||||
if(intercept && signal.frequency == FREQ_SYNDICATE)
|
||||
Broadcast_Message(signal.data["mob"],
|
||||
signal.data["vmask"],
|
||||
signal.data["radio"], signal.data["message"],
|
||||
signal.data["name"], signal.data["job"],
|
||||
signal.data["realname"],, signal.data["compression"], list(0, z), GLOB.SYND_FREQ, signal.data["spans"],
|
||||
signal.data["realname"],, signal.data["compression"], list(0, z), FREQ_SYNDICATE, signal.data["spans"],
|
||||
signal.data["verb_say"], signal.data["verb_ask"], signal.data["verb_exclaim"], signal.data["verb_yell"],
|
||||
signal.data["language"])
|
||||
/* ###### Broadcast a message using signal.data ###### */
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
if(is_freq_listening(signal))
|
||||
if(change_frequency)
|
||||
if(signal.frequency != GLOB.SYND_FREQ)
|
||||
if(signal.frequency != FREQ_SYNDICATE)
|
||||
signal.frequency = change_frequency
|
||||
|
||||
if(!istype(machine_from, /obj/machinery/telecomms/processor) && machine_from != src) // Signal must be ready (stupid assuming machine), let's send it
|
||||
@@ -54,30 +54,30 @@
|
||||
/obj/machinery/telecomms/bus/preset_one
|
||||
id = "Bus 1"
|
||||
network = "tcommsat"
|
||||
freq_listening = list(GLOB.SCI_FREQ, GLOB.MED_FREQ)
|
||||
freq_listening = list(FREQ_SCIENCE, FREQ_MEDICAL)
|
||||
autolinkers = list("processor1", "science", "medical")
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_two
|
||||
id = "Bus 2"
|
||||
network = "tcommsat"
|
||||
freq_listening = list(GLOB.SUPP_FREQ,GLOB.SERV_FREQ)
|
||||
freq_listening = list(FREQ_SUPPLY, FREQ_SERVICE)
|
||||
autolinkers = list("processor2", "supply", "service")
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_three
|
||||
id = "Bus 3"
|
||||
network = "tcommsat"
|
||||
freq_listening = list(GLOB.SEC_FREQ, GLOB.COMM_FREQ)
|
||||
freq_listening = list(FREQ_SECURITY, FREQ_COMMAND)
|
||||
autolinkers = list("processor3", "security", "command")
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_four
|
||||
id = "Bus 4"
|
||||
network = "tcommsat"
|
||||
freq_listening = list(GLOB.ENG_FREQ)
|
||||
freq_listening = list(FREQ_ENGINEERING)
|
||||
autolinkers = list("processor4", "engineering", "common")
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_four/Initialize()
|
||||
. = ..()
|
||||
for(var/i = 1441, i < 1489, i += 2)
|
||||
for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2)
|
||||
freq_listening |= i
|
||||
|
||||
/obj/machinery/telecomms/bus/preset_one/birdstation
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
return
|
||||
if(!check_receive_level(signal))
|
||||
return
|
||||
if(signal.transmission_method == 2)
|
||||
if(signal.transmission_method == TRANSMISSION_SUBSPACE)
|
||||
|
||||
if(is_freq_listening(signal)) // detect subspace signals
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
id = "Receiver A"
|
||||
network = "tcommsat"
|
||||
autolinkers = list("receiverA") // link to relay
|
||||
freq_listening = list(GLOB.SCI_FREQ, GLOB.MED_FREQ, GLOB.SUPP_FREQ, GLOB.SERV_FREQ) // science, medical, supply, service
|
||||
freq_listening = list(FREQ_SCIENCE, FREQ_MEDICAL, FREQ_SUPPLY, FREQ_SERVICE)
|
||||
|
||||
|
||||
//--PRESET RIGHT--//
|
||||
@@ -67,12 +67,12 @@
|
||||
id = "Receiver B"
|
||||
network = "tcommsat"
|
||||
autolinkers = list("receiverB") // link to relay
|
||||
freq_listening = list(GLOB.COMM_FREQ, GLOB.ENG_FREQ, GLOB.SEC_FREQ) //command, engineering, security
|
||||
freq_listening = list(FREQ_COMMAND, FREQ_ENGINEERING, FREQ_SECURITY)
|
||||
|
||||
//Common and other radio frequencies for people to freely use
|
||||
/obj/machinery/telecomms/receiver/preset_right/Initialize()
|
||||
. = ..()
|
||||
for(var/i = 1441, i < 1489, i += 2)
|
||||
for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2)
|
||||
freq_listening |= i
|
||||
|
||||
/obj/machinery/telecomms/receiver/preset_left/birdstation
|
||||
|
||||
@@ -131,22 +131,22 @@
|
||||
|
||||
/obj/machinery/telecomms/server/presets/science
|
||||
id = "Science Server"
|
||||
freq_listening = list(GLOB.SCI_FREQ)
|
||||
freq_listening = list(FREQ_SCIENCE)
|
||||
autolinkers = list("science")
|
||||
|
||||
/obj/machinery/telecomms/server/presets/medical
|
||||
id = "Medical Server"
|
||||
freq_listening = list(GLOB.MED_FREQ)
|
||||
freq_listening = list(FREQ_MEDICAL)
|
||||
autolinkers = list("medical")
|
||||
|
||||
/obj/machinery/telecomms/server/presets/supply
|
||||
id = "Supply Server"
|
||||
freq_listening = list(GLOB.SUPP_FREQ)
|
||||
freq_listening = list(FREQ_SUPPLY)
|
||||
autolinkers = list("supply")
|
||||
|
||||
/obj/machinery/telecomms/server/presets/service
|
||||
id = "Service Server"
|
||||
freq_listening = list(GLOB.SERV_FREQ)
|
||||
freq_listening = list(FREQ_SERVICE)
|
||||
autolinkers = list("service")
|
||||
|
||||
/obj/machinery/telecomms/server/presets/common
|
||||
@@ -154,26 +154,25 @@
|
||||
freq_listening = list()
|
||||
autolinkers = list("common")
|
||||
|
||||
//Common and other radio frequencies for people to freely use
|
||||
// 1441 to 1489
|
||||
//Common and other radio frequencies for people to freely use
|
||||
/obj/machinery/telecomms/server/presets/common/Initialize()
|
||||
. = ..()
|
||||
for(var/i = 1441, i < 1489, i += 2)
|
||||
for(var/i = MIN_FREQ, i <= MAX_FREQ, i += 2)
|
||||
freq_listening |= i
|
||||
|
||||
/obj/machinery/telecomms/server/presets/command
|
||||
id = "Command Server"
|
||||
freq_listening = list(GLOB.COMM_FREQ)
|
||||
freq_listening = list(FREQ_COMMAND)
|
||||
autolinkers = list("command")
|
||||
|
||||
/obj/machinery/telecomms/server/presets/engineering
|
||||
id = "Engineering Server"
|
||||
freq_listening = list(GLOB.ENG_FREQ)
|
||||
freq_listening = list(FREQ_ENGINEERING)
|
||||
autolinkers = list("engineering")
|
||||
|
||||
/obj/machinery/telecomms/server/presets/security
|
||||
id = "Security Server"
|
||||
freq_listening = list(GLOB.SEC_FREQ)
|
||||
freq_listening = list(FREQ_SECURITY)
|
||||
autolinkers = list("security")
|
||||
|
||||
/obj/machinery/telecomms/server/presets/common/birdstation/Initialize()
|
||||
|
||||
@@ -61,7 +61,7 @@ GLOBAL_LIST_EMPTY(telecomms_list)
|
||||
var/datum/signal/copy = new
|
||||
if(copysig)
|
||||
|
||||
copy.transmission_method = 2
|
||||
copy.transmission_method = TRANSMISSION_SUBSPACE
|
||||
copy.frequency = signal.frequency
|
||||
// Copy the main data contents! Workaround for some nasty bug where the actual array memory is copied and not its contents.
|
||||
copy.data = list(
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
var/move_dir = get_dir(loc, AM.loc)
|
||||
var/mob/living/carbon/human/H = AM
|
||||
if((transform_standing || H.lying) && move_dir == EAST)// || move_dir == WEST)
|
||||
AM.loc = src.loc
|
||||
AM.forceMove(drop_location())
|
||||
do_transform(AM)
|
||||
|
||||
/obj/machinery/transformer/CanPass(atom/movable/mover, turf/target)
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
var/datum/objective/hijack/hijack = new
|
||||
hijack.owner = user.mind
|
||||
user.mind.objectives += hijack
|
||||
user.mind.add_antag_datum(/datum/antagonist/auto_custom)
|
||||
|
||||
user.mind.announce_objectives()
|
||||
|
||||
|
||||
@@ -24,3 +24,5 @@
|
||||
if(occupant && occupant.client && occupant.client.mouse_pointer_icon == 'icons/mecha/mecha_mouse.dmi')
|
||||
occupant.client.mouse_pointer_icon = initial(occupant.client.mouse_pointer_icon)
|
||||
..()
|
||||
|
||||
|
||||
|
||||
@@ -63,3 +63,4 @@
|
||||
/obj/mecha/combat/gygax/dark/RemoveActions(mob/living/user, human_occupant = 0)
|
||||
..()
|
||||
thrusters_action.Remove(user)
|
||||
|
||||
|
||||
@@ -141,3 +141,5 @@
|
||||
for (var/i=0;i<6;i++)
|
||||
color = color+pick(colors)
|
||||
return color
|
||||
|
||||
|
||||
|
||||
@@ -1,90 +1,90 @@
|
||||
/obj/mecha/combat/marauder
|
||||
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
|
||||
name = "\improper Marauder"
|
||||
icon_state = "marauder"
|
||||
step_in = 5
|
||||
max_integrity = 500
|
||||
deflect_chance = 25
|
||||
armor = list(melee = 50, bullet = 55, laser = 40, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
|
||||
max_temperature = 60000
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
infra_luminosity = 3
|
||||
/obj/mecha/combat/marauder
|
||||
desc = "Heavy-duty, combat exosuit, developed after the Durand model. Rarely found among civilian populations."
|
||||
name = "\improper Marauder"
|
||||
icon_state = "marauder"
|
||||
step_in = 5
|
||||
max_integrity = 500
|
||||
deflect_chance = 25
|
||||
armor = list(melee = 50, bullet = 55, laser = 40, energy = 30, bomb = 30, bio = 0, rad = 0, fire = 100, acid = 100)
|
||||
max_temperature = 60000
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
infra_luminosity = 3
|
||||
operation_req_access = list(ACCESS_CENT_SPECOPS)
|
||||
wreckage = /obj/structure/mecha_wreckage/marauder
|
||||
add_req_access = 0
|
||||
internal_damage_threshold = 25
|
||||
force = 45
|
||||
max_equip = 4
|
||||
bumpsmash = 1
|
||||
|
||||
/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0)
|
||||
..()
|
||||
smoke_action.Grant(user, src)
|
||||
thrusters_action.Grant(user, src)
|
||||
zoom_action.Grant(user, src)
|
||||
|
||||
/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0)
|
||||
..()
|
||||
smoke_action.Remove(user)
|
||||
thrusters_action.Remove(user)
|
||||
zoom_action.Remove(user)
|
||||
|
||||
/obj/mecha/combat/marauder/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
|
||||
/obj/mecha/combat/marauder/seraph
|
||||
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
|
||||
name = "\improper Seraph"
|
||||
icon_state = "seraph"
|
||||
wreckage = /obj/structure/mecha_wreckage/marauder
|
||||
add_req_access = 0
|
||||
internal_damage_threshold = 25
|
||||
force = 45
|
||||
max_equip = 4
|
||||
bumpsmash = 1
|
||||
|
||||
/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0)
|
||||
..()
|
||||
smoke_action.Grant(user, src)
|
||||
thrusters_action.Grant(user, src)
|
||||
zoom_action.Grant(user, src)
|
||||
|
||||
/obj/mecha/combat/marauder/RemoveActions(mob/living/user, human_occupant = 0)
|
||||
..()
|
||||
smoke_action.Remove(user)
|
||||
thrusters_action.Remove(user)
|
||||
zoom_action.Remove(user)
|
||||
|
||||
/obj/mecha/combat/marauder/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/energy/pulse(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
|
||||
/obj/mecha/combat/marauder/seraph
|
||||
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
|
||||
name = "\improper Seraph"
|
||||
icon_state = "seraph"
|
||||
operation_req_access = list(ACCESS_CENT_SPECOPS)
|
||||
step_in = 3
|
||||
step_in = 3
|
||||
max_integrity = 550
|
||||
wreckage = /obj/structure/mecha_wreckage/seraph
|
||||
internal_damage_threshold = 20
|
||||
force = 55
|
||||
max_equip = 5
|
||||
|
||||
/obj/mecha/combat/marauder/seraph/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
|
||||
/obj/mecha/combat/marauder/mauler
|
||||
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
|
||||
name = "\improper Mauler"
|
||||
icon_state = "mauler"
|
||||
wreckage = /obj/structure/mecha_wreckage/seraph
|
||||
internal_damage_threshold = 20
|
||||
force = 55
|
||||
max_equip = 5
|
||||
|
||||
/obj/mecha/combat/marauder/seraph/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/teleporter(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
|
||||
/obj/mecha/combat/marauder/mauler
|
||||
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
|
||||
name = "\improper Mauler"
|
||||
icon_state = "mauler"
|
||||
operation_req_access = list(ACCESS_SYNDICATE)
|
||||
wreckage = /obj/structure/mecha_wreckage/mauler
|
||||
max_equip = 5
|
||||
|
||||
/obj/mecha/combat/marauder/mauler/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
|
||||
|
||||
wreckage = /obj/structure/mecha_wreckage/mauler
|
||||
max_equip = 5
|
||||
|
||||
/obj/mecha/combat/marauder/mauler/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/lmg(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/scattershot(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay(src)
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
|
||||
ME.attach(src)
|
||||
|
||||
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
/obj/mecha/combat/reticence
|
||||
desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins."
|
||||
name = "\improper reticence"
|
||||
icon_state = "reticence"
|
||||
step_in = 2
|
||||
dir_in = 1 //Facing North.
|
||||
max_integrity = 100
|
||||
deflect_chance = 3
|
||||
armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
|
||||
max_temperature = 15000
|
||||
wreckage = /obj/structure/mecha_wreckage/reticence
|
||||
/obj/mecha/combat/reticence
|
||||
desc = "A silent, fast, and nigh-invisible miming exosuit. Popular among mimes and mime assassins."
|
||||
name = "\improper reticence"
|
||||
icon_state = "reticence"
|
||||
step_in = 2
|
||||
dir_in = 1 //Facing North.
|
||||
max_integrity = 100
|
||||
deflect_chance = 3
|
||||
armor = list(melee = 25, bullet = 20, laser = 30, energy = 15, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 100)
|
||||
max_temperature = 15000
|
||||
wreckage = /obj/structure/mecha_wreckage/reticence
|
||||
operation_req_access = list(ACCESS_THEATRE)
|
||||
add_req_access = 0
|
||||
internal_damage_threshold = 25
|
||||
max_equip = 2
|
||||
step_energy_drain = 3
|
||||
color = "#87878715"
|
||||
stepsound = null
|
||||
turnsound = null
|
||||
opacity = 0
|
||||
|
||||
/obj/mecha/combat/reticence/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/rcd //HAHA IT MAKES WALLS GET IT
|
||||
ME.attach(src)
|
||||
return
|
||||
add_req_access = 0
|
||||
internal_damage_threshold = 25
|
||||
max_equip = 2
|
||||
step_energy_drain = 3
|
||||
color = "#87878715"
|
||||
stepsound = null
|
||||
turnsound = null
|
||||
opacity = 0
|
||||
|
||||
/obj/mecha/combat/reticence/loaded/New()
|
||||
..()
|
||||
var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
|
||||
ME.attach(src)
|
||||
ME = new /obj/item/mecha_parts/mecha_equipment/rcd //HAHA IT MAKES WALLS GET IT
|
||||
ME.attach(src)
|
||||
return
|
||||
|
||||
@@ -104,7 +104,7 @@
|
||||
/obj/item/mecha_parts/mecha_equipment/proc/attach(obj/mecha/M)
|
||||
M.equipment += src
|
||||
chassis = M
|
||||
src.loc = M
|
||||
forceMove(M)
|
||||
M.log_message("[src] initialized.")
|
||||
if(!M.selected && selectable)
|
||||
M.selected = src
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
O.anchored = TRUE
|
||||
if(do_after_cooldown(target))
|
||||
cargo_holder.cargo += O
|
||||
O.loc = chassis
|
||||
O.forceMove(chassis)
|
||||
O.anchored = FALSE
|
||||
occupant_message("<span class='notice'>[target] successfully loaded.</span>")
|
||||
log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]")
|
||||
@@ -91,7 +91,7 @@
|
||||
O.anchored = TRUE
|
||||
if(do_after_cooldown(target))
|
||||
cargo_holder.cargo += O
|
||||
O.loc = chassis
|
||||
O.forceMove(chassis)
|
||||
O.anchored = FALSE
|
||||
occupant_message("<span class='notice'>[target] successfully loaded.</span>")
|
||||
log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user