Merge pull request #5485 from Poojawa/cryopods
Cryopods from Oracle Station
This commit is contained in:
+2195
-1261
File diff suppressed because it is too large
Load Diff
@@ -3633,6 +3633,7 @@
|
||||
/obj/machinery/light/small{
|
||||
dir = 1
|
||||
},
|
||||
/obj/machinery/vending/kink,
|
||||
/turf/open/floor/wood,
|
||||
/area/crew_quarters/electronic_marketing_den)
|
||||
"amQ" = (
|
||||
@@ -58343,6 +58344,9 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/machinery/computer/cryopod{
|
||||
pixel_x = 28
|
||||
},
|
||||
/turf/open/floor/plasteel/neutral/side{
|
||||
dir = 4
|
||||
},
|
||||
@@ -59600,7 +59604,7 @@
|
||||
/obj/machinery/light{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/closet/wardrobe/mixed,
|
||||
/obj/machinery/cryopod,
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
@@ -60394,7 +60398,7 @@
|
||||
/obj/machinery/status_display{
|
||||
pixel_x = 32
|
||||
},
|
||||
/obj/structure/closet/wardrobe/mixed,
|
||||
/obj/machinery/cryopod,
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
@@ -100691,6 +100695,12 @@
|
||||
dir = 10
|
||||
},
|
||||
/area/science/circuit)
|
||||
"hKW" = (
|
||||
/obj/machinery/vending/kink,
|
||||
/turf/open/floor/plasteel/vault{
|
||||
dir = 5
|
||||
},
|
||||
/area/crew_quarters/locker)
|
||||
"hNZ" = (
|
||||
/obj/structure/chair/office/light{
|
||||
dir = 8
|
||||
@@ -100855,6 +100865,11 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/science/research/abandoned)
|
||||
"pGS" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/vending/kink,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port)
|
||||
"pQm" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/structure/cable/white{
|
||||
@@ -129899,7 +129914,7 @@ bWC
|
||||
bYL
|
||||
caE
|
||||
caE
|
||||
ceb
|
||||
pGS
|
||||
cea
|
||||
caE
|
||||
cjp
|
||||
@@ -149439,7 +149454,7 @@ clt
|
||||
cnc
|
||||
coE
|
||||
cqd
|
||||
crr
|
||||
hKW
|
||||
csT
|
||||
cuy
|
||||
cvU
|
||||
|
||||
+52773
-52766
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1460,9 +1460,6 @@
|
||||
/turf/open/floor/plating,
|
||||
/area/ai_monitored/turret_protected/AIsatextAS)
|
||||
"afC" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
|
||||
dir = 4
|
||||
},
|
||||
@@ -29903,10 +29900,6 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/whiteblue/corner,
|
||||
/area/medical/medbay/central)
|
||||
"bwR" = (
|
||||
/obj/machinery/smartfridge/chemistry/preloaded,
|
||||
/turf/closed/wall,
|
||||
/area/medical/chemistry)
|
||||
"bwS" = (
|
||||
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
|
||||
dir = 8
|
||||
@@ -49795,6 +49788,107 @@
|
||||
"cDa" = (
|
||||
/turf/closed/wall,
|
||||
/area/quartermaster/warehouse)
|
||||
"evx" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/turf/open/floor/plasteel/darkpurple,
|
||||
/area/crew_quarters/cryopod)
|
||||
"iVL" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/obj/machinery/cryopod{
|
||||
tag = "icon-cryopod-open (EAST)";
|
||||
icon_state = "cryopod-open";
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/security/prison)
|
||||
"jvQ" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "2-4"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/primary/central)
|
||||
"lcu" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/primary/central)
|
||||
"mhM" = (
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/space/nearstation)
|
||||
"nnS" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-2"
|
||||
},
|
||||
/turf/open/floor/plasteel/darkpurple,
|
||||
/area/crew_quarters/cryopod)
|
||||
"oZq" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "4-8"
|
||||
},
|
||||
/obj/structure/disposalpipe/segment{
|
||||
dir = 4
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-8"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/primary/central)
|
||||
"pgi" = (
|
||||
/obj/machinery/power/apc{
|
||||
areastring = "/area/medical/cryo";
|
||||
dir = 1;
|
||||
name = "Cryogenics APC";
|
||||
pixel_y = 24
|
||||
},
|
||||
/obj/structure/cable{
|
||||
icon_state = "0-2"
|
||||
},
|
||||
/turf/open/floor/plasteel/darkpurple,
|
||||
/area/crew_quarters/cryopod)
|
||||
"pPV" = (
|
||||
/obj/structure/cable{
|
||||
icon_state = "1-2"
|
||||
},
|
||||
/turf/open/floor/plasteel/stairs,
|
||||
/area/crew_quarters/cryopod)
|
||||
"pXL" = (
|
||||
/obj/machinery/computer/cryopod{
|
||||
pixel_y = 24
|
||||
},
|
||||
/turf/open/floor/plasteel/darkpurple,
|
||||
/area/crew_quarters/cryopod)
|
||||
"qSi" = (
|
||||
/turf/closed/wall,
|
||||
/area/crew_quarters/cryopod)
|
||||
"tnH" = (
|
||||
/obj/machinery/cryopod,
|
||||
/obj/machinery/light/small/built{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/darkpurple,
|
||||
/area/crew_quarters/cryopod)
|
||||
"tMS" = (
|
||||
/obj/machinery/cryopod,
|
||||
/turf/open/floor/plasteel/darkpurple,
|
||||
/area/crew_quarters/cryopod)
|
||||
"tUf" = (
|
||||
/turf/open/floor/plasteel/darkpurple,
|
||||
/area/crew_quarters/cryopod)
|
||||
|
||||
(1,1,1) = {"
|
||||
aaa
|
||||
@@ -69389,7 +69483,7 @@ aem
|
||||
aem
|
||||
aeT
|
||||
afn
|
||||
aem
|
||||
iVL
|
||||
afZ
|
||||
agn
|
||||
agy
|
||||
@@ -80044,8 +80138,8 @@ cgv
|
||||
cgV
|
||||
bBW
|
||||
bBW
|
||||
aaa
|
||||
cgV
|
||||
mhM
|
||||
aaa
|
||||
bBW
|
||||
bBW
|
||||
@@ -80258,7 +80352,7 @@ bpV
|
||||
bpY
|
||||
bpY
|
||||
bvq
|
||||
bwR
|
||||
bpX
|
||||
bpY
|
||||
bpY
|
||||
bpY
|
||||
@@ -80820,7 +80914,7 @@ cis
|
||||
ciG
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
cgV
|
||||
cfV
|
||||
bTE
|
||||
abI
|
||||
@@ -81069,7 +81163,7 @@ cfd
|
||||
cfw
|
||||
cfW
|
||||
cgw
|
||||
cgV
|
||||
mhM
|
||||
abI
|
||||
abI
|
||||
cij
|
||||
@@ -81077,7 +81171,7 @@ cit
|
||||
ciH
|
||||
abI
|
||||
abI
|
||||
cgV
|
||||
mhM
|
||||
cfV
|
||||
bTE
|
||||
abI
|
||||
@@ -81326,7 +81420,7 @@ cfe
|
||||
cfx
|
||||
cfa
|
||||
cgv
|
||||
aaa
|
||||
cgV
|
||||
aaa
|
||||
aaa
|
||||
cik
|
||||
@@ -82101,8 +82195,8 @@ cgV
|
||||
bBW
|
||||
aaa
|
||||
aaa
|
||||
mhM
|
||||
cgV
|
||||
aaa
|
||||
bBW
|
||||
bBW
|
||||
cgV
|
||||
@@ -86384,12 +86478,12 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
awd
|
||||
aHN
|
||||
aIU
|
||||
qSi
|
||||
pgi
|
||||
evx
|
||||
pPV
|
||||
jvQ
|
||||
oZq
|
||||
aJI
|
||||
aLe
|
||||
aMe
|
||||
@@ -86641,11 +86735,11 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
awd
|
||||
aHN
|
||||
qSi
|
||||
pXL
|
||||
tUf
|
||||
nnS
|
||||
lcu
|
||||
aIU
|
||||
aJH
|
||||
aLe
|
||||
@@ -86898,10 +86992,10 @@ apX
|
||||
aBL
|
||||
aBL
|
||||
apX
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aAN
|
||||
qSi
|
||||
tnH
|
||||
tMS
|
||||
qSi
|
||||
aHN
|
||||
aIU
|
||||
aJI
|
||||
@@ -115330,4 +115424,4 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
"}
|
||||
"}
|
||||
|
||||
@@ -11,3 +11,8 @@
|
||||
|
||||
/area/crew_quarters/theatre/mime
|
||||
name = "Mime's Office"
|
||||
|
||||
/area/crew_quarters/cryopod
|
||||
name = "Cryogenics"
|
||||
icon = 'code/citadel/icons/areas.dmi'
|
||||
icon_state = "cryo"
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 403 B After Width: | Height: | Size: 559 B |
@@ -1,3 +1,7 @@
|
||||
//CITADEL EDIT
|
||||
GLOBAL_LIST_EMPTY(objectives)
|
||||
//END EDIT
|
||||
|
||||
/datum/objective
|
||||
var/datum/mind/owner //The primary owner of the objective. !!SOMEWHAT DEPRECATED!! Prefer using 'team' for new code.
|
||||
var/datum/team/team //An alternative to 'owner': a team. Use this when writing new code.
|
||||
@@ -9,6 +13,7 @@
|
||||
var/martyr_compatible = 0 //If the objective is compatible with martyr objective, i.e. if you can still do it while dead.
|
||||
|
||||
/datum/objective/New(var/text)
|
||||
GLOB.objectives += src // CITADEL EDIT FOR CRYOPODS
|
||||
if(text)
|
||||
explanation_text = text
|
||||
|
||||
@@ -72,6 +77,8 @@
|
||||
possible_targets = all_possible_targets
|
||||
if(possible_targets.len > 0)
|
||||
target = pick(possible_targets)
|
||||
else
|
||||
target = null//we'd rather have no target than an invalid one // CITADEL EDIT
|
||||
update_explanation_text()
|
||||
return target
|
||||
|
||||
@@ -818,6 +825,3 @@ GLOBAL_LIST_EMPTY(possible_items_special)
|
||||
/datum/objective/changeling_team_objective/impersonate_department/impersonate_heads
|
||||
explanation_text = "Have X or more heads of staff escape on the shuttle disguised as heads, while the real heads are dead"
|
||||
command_staff_only = TRUE
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -89,6 +89,10 @@ GLOBAL_LIST_EMPTY(announcement_systems)
|
||||
message = CompileText(arrival, user, rank)
|
||||
else if(message_type == "NEWHEAD" && newheadToggle)
|
||||
message = CompileText(newhead, user, rank)
|
||||
//CITADEL EDIT for cryopods
|
||||
else if(message_type == "CRYOSTORAGE")
|
||||
message = CompileText("%PERSON, %RANK has been moved to cryo storage.", user, rank)
|
||||
//END EDIT
|
||||
else if(message_type == "ARRIVALS_BROKEN")
|
||||
message = "The arrivals shuttle has been damaged. Docking for repairs..."
|
||||
|
||||
|
||||
@@ -270,6 +270,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
set name = "Ghost"
|
||||
set desc = "Relinquish your life and enter the land of the dead."
|
||||
|
||||
// CITADEL EDIT
|
||||
if(istype(loc, /obj/machinery/cryopod))
|
||||
var/response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost whilst still alive you may not play again this round! You can't change your mind so choose wisely!!)","Are you sure you want to ghost?","Ghost","Stay in body")
|
||||
if(response != "Ghost")//darn copypaste
|
||||
return
|
||||
var/obj/machinery/cryopod/C = loc
|
||||
C.despawn_occupant()
|
||||
return
|
||||
// END EDIT
|
||||
if(stat != DEAD)
|
||||
succumb()
|
||||
if(stat == DEAD)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 78 KiB |
@@ -25,3 +25,12 @@
|
||||
if(!M.equip_to_slot_if_possible(I, G.category, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // If the job's dresscode compliant, try to put it in its slot, first
|
||||
if(!M.equip_to_slot_if_possible(I, slot_in_backpack, disable_warning = TRUE, bypass_equip_delay_self = TRUE)) // Otherwise, try to put it in the backpack
|
||||
I.forceMove(get_turf(M)) // If everything fails, just put it on the floor under the mob.
|
||||
|
||||
/datum/controller/subsystem/job/proc/FreeRole(rank)
|
||||
if(!rank)
|
||||
return
|
||||
Debug("Freeing role: [rank]")
|
||||
var/datum/job/job = GetJob(rank)
|
||||
if(!job)
|
||||
return FALSE
|
||||
job.current_positions = max(0, job.current_positions - 1)
|
||||
|
||||
@@ -0,0 +1,441 @@
|
||||
/*
|
||||
* Cryogenic refrigeration unit. Basically a despawner.
|
||||
* Stealing a lot of concepts/code from sleepers due to massive laziness.
|
||||
* The despawn tick will only fire if it's been more than time_till_despawned ticks
|
||||
* since time_entered, which is world.time when the occupant moves in.
|
||||
* ~ Zuhayr
|
||||
*/
|
||||
|
||||
|
||||
//Main cryopod console.
|
||||
|
||||
/obj/machinery/computer/cryopod
|
||||
name = "cryogenic oversight console"
|
||||
desc = "An interface between crew and the cryogenic storage oversight systems."
|
||||
icon = 'icons/obj/Cryogenic2.dmi'
|
||||
icon_state = "cellconsole_1"
|
||||
circuit = /obj/item/circuitboard/cryopodcontrol
|
||||
density = FALSE
|
||||
interact_offline = TRUE
|
||||
req_one_access = list(ACCESS_HEADS, ACCESS_ARMORY) //Heads of staff or the warden can go here to claim recover items from their department that people went were cryodormed with.
|
||||
var/mode = null
|
||||
|
||||
//Used for logging people entering cryosleep and important items they are carrying.
|
||||
var/list/frozen_crew = list()
|
||||
var/list/frozen_items = list()
|
||||
|
||||
var/storage_type = "crewmembers"
|
||||
var/storage_name = "Cryogenic Oversight Control"
|
||||
var/allow_items = TRUE
|
||||
|
||||
/obj/machinery/computer/cryopod/attack_ai()
|
||||
attack_hand()
|
||||
|
||||
/obj/machinery/computer/cryopod/attack_hand(mob/user = usr)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
add_fingerprint(user)
|
||||
|
||||
var/dat
|
||||
|
||||
dat += "<hr/><br/><b>[storage_name]</b><br/>"
|
||||
dat += "<i>Welcome, [user.real_name].</i><br/><br/><hr/>"
|
||||
dat += "<a href='?src=[REF(src)];log=1'>View storage log</a>.<br>"
|
||||
if(allow_items)
|
||||
dat += "<a href='?src=[REF(src)];view=1'>View objects</a>.<br>"
|
||||
dat += "<a href='?src=[REF(src)];item=1'>Recover object</a>.<br>"
|
||||
dat += "<a href='?src=[REF(src)];allitems=1'>Recover all objects</a>.<br>"
|
||||
|
||||
user << browse(dat, "window=cryopod_console")
|
||||
onclose(user, "cryopod_console")
|
||||
|
||||
/obj/machinery/computer/cryopod/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
|
||||
var/mob/user = usr
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
if(href_list["log"])
|
||||
|
||||
var/dat = "<b>Recently stored [storage_type]</b><br/><hr/><br/>"
|
||||
for(var/person in frozen_crew)
|
||||
dat += "[person]<br/>"
|
||||
dat += "<hr/>"
|
||||
|
||||
user << browse(dat, "window=cryolog")
|
||||
|
||||
if(href_list["view"])
|
||||
if(!allow_items) return
|
||||
|
||||
var/dat = "<b>Recently stored objects</b><br/><hr/><br/>"
|
||||
for(var/obj/item/I in frozen_items)
|
||||
dat += "[I.name]<br/>"
|
||||
dat += "<hr/>"
|
||||
|
||||
user << browse(dat, "window=cryoitems")
|
||||
|
||||
else if(href_list["item"])
|
||||
if(!allowed(user))
|
||||
to_chat(user, "<span class='warning'>Access Denied.</span>")
|
||||
return
|
||||
if(!allow_items) return
|
||||
|
||||
if(frozen_items.len == 0)
|
||||
to_chat(user, "<span class='notice'>There is nothing to recover from storage.</span>")
|
||||
return
|
||||
|
||||
var/obj/item/I = input(user, "Please choose which object to retrieve.","Object recovery",null) as null|anything in frozen_items
|
||||
if(!I)
|
||||
return
|
||||
|
||||
if(!(I in frozen_items))
|
||||
to_chat(user, "<span class='notice'>\The [I] is no longer in storage.</span>")
|
||||
return
|
||||
|
||||
visible_message("<span class='notice'>The console beeps happily as it disgorges \the [I].</span>")
|
||||
|
||||
I.forceMove(get_turf(src))
|
||||
frozen_items -= I
|
||||
|
||||
else if(href_list["allitems"])
|
||||
if(!allowed(user))
|
||||
to_chat(user, "<span class='warning'>Access Denied.</span>")
|
||||
return
|
||||
if(!allow_items) return
|
||||
|
||||
if(frozen_items.len == 0)
|
||||
to_chat(user, "<span class='notice'>There is nothing to recover from storage.</span>")
|
||||
return
|
||||
|
||||
visible_message("<span class='notice'>The console beeps happily as it disgorges the desired objects.</span>")
|
||||
|
||||
for(var/obj/item/I in frozen_items)
|
||||
I.forceMove(get_turf(src))
|
||||
frozen_items -= I
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/item/circuitboard/cryopodcontrol
|
||||
name = "Circuit board (Cryogenic Oversight Console)"
|
||||
build_path = "/obj/machinery/computer/cryopod"
|
||||
|
||||
|
||||
//Cryopods themselves.
|
||||
/obj/machinery/cryopod
|
||||
name = "cryogenic freezer"
|
||||
desc = "Suited for Cyborgs and Humanoids, the pod is a safe place for personnel affected by the Space Sleep Disorder to get some rest."
|
||||
icon = 'icons/obj/cryogenic2.dmi'
|
||||
icon_state = "cryopod-open"
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
state_open = TRUE
|
||||
|
||||
var/on_store_message = "has entered long-term storage."
|
||||
var/on_store_name = "Cryogenic Oversight"
|
||||
|
||||
// 15 minutes-ish safe period before being despawned.
|
||||
var/time_till_despawn = 15 * 600 // This is reduced by 90% if a player manually enters cryo
|
||||
var/despawn_world_time = null // Used to keep track of the safe period.
|
||||
|
||||
var/obj/machinery/computer/cryopod/control_computer
|
||||
var/last_no_computer_message = 0
|
||||
|
||||
// These items are preserved when the process() despawn proc occurs.
|
||||
var/list/preserve_items = list(
|
||||
/obj/item/hand_tele,
|
||||
/obj/item/card/id/captains_spare,
|
||||
/obj/item/device/aicard,
|
||||
/obj/item/device/mmi,
|
||||
/obj/item/device/paicard,
|
||||
/obj/item/gun,
|
||||
/obj/item/pinpointer,
|
||||
/obj/item/clothing/shoes/magboots,
|
||||
/obj/item/areaeditor/blueprints,
|
||||
/obj/item/clothing/head/helmet/space,
|
||||
/obj/item/clothing/suit/space,
|
||||
/obj/item/clothing/suit/armor,
|
||||
/obj/item/defibrillator/compact,
|
||||
/obj/item/reagent_containers/hypospray/CMO,
|
||||
/obj/item/clothing/accessory/medal/gold/captain,
|
||||
/obj/item/clothing/gloves/krav_maga,
|
||||
/obj/item/nullrod,
|
||||
/obj/item/tank/jetpack,
|
||||
/obj/item/documents,
|
||||
/obj/item/nuke_core_container
|
||||
)
|
||||
// These items will NOT be preserved
|
||||
var/list/do_not_preserve_items = list (
|
||||
/obj/item/device/mmi/posibrain
|
||||
)
|
||||
|
||||
/obj/machinery/cryopod/Initialize()
|
||||
update_icon()
|
||||
find_control_computer()
|
||||
return ..()
|
||||
|
||||
/obj/machinery/cryopod/proc/find_control_computer(urgent = 0)
|
||||
for(var/obj/machinery/computer/cryopod/C in area_contents(get_area(src)))
|
||||
control_computer = C
|
||||
break
|
||||
|
||||
// Don't send messages unless we *need* the computer, and less than five minutes have passed since last time we messaged
|
||||
if(!control_computer && urgent && last_no_computer_message + 5*60*10 < world.time)
|
||||
log_admin("Cryopod in [get_area(src)] could not find control computer!")
|
||||
message_admins("Cryopod in [get_area(src)] could not find control computer!")
|
||||
last_no_computer_message = world.time
|
||||
|
||||
return control_computer != null
|
||||
|
||||
/obj/machinery/cryopod/close_machine(mob/user)
|
||||
if(!control_computer)
|
||||
find_control_computer(TRUE)
|
||||
if((isnull(user) || istype(user)) && state_open && !panel_open)
|
||||
..(user)
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mob_occupant && mob_occupant.stat != DEAD)
|
||||
to_chat(occupant, "<span class='boldnotice'>You feel cool air surround you. You go numb as your senses turn inward.</span>")
|
||||
if(mob_occupant.client)//if they're logged in
|
||||
despawn_world_time = world.time + (time_till_despawn * 0.1)
|
||||
else
|
||||
despawn_world_time = world.time + time_till_despawn
|
||||
icon_state = "cryopod"
|
||||
|
||||
/obj/machinery/cryopod/open_machine()
|
||||
..()
|
||||
icon_state = "cryopod-open"
|
||||
density = TRUE
|
||||
name = initial(name)
|
||||
|
||||
/obj/machinery/cryopod/container_resist(mob/living/user)
|
||||
visible_message("<span class='notice'>[occupant] emerges from [src]!</span>",
|
||||
"<span class='notice'>You climb out of [src]!</span>")
|
||||
open_machine()
|
||||
|
||||
/obj/machinery/cryopod/relaymove(mob/user)
|
||||
container_resist(user)
|
||||
|
||||
/obj/machinery/cryopod/process()
|
||||
if(!occupant)
|
||||
return
|
||||
|
||||
var/mob/living/mob_occupant = occupant
|
||||
if(mob_occupant)
|
||||
// Eject dead people
|
||||
if(mob_occupant.stat == DEAD)
|
||||
open_machine()
|
||||
|
||||
if(!(world.time > despawn_world_time + 100))//+ 10 seconds
|
||||
return
|
||||
|
||||
if(!mob_occupant.client && mob_occupant.stat < 2) //Occupant is living and has no client.
|
||||
if(!control_computer)
|
||||
find_control_computer(urgent = TRUE)//better hope you found it this time
|
||||
|
||||
despawn_occupant()
|
||||
|
||||
// This function can not be undone; do not call this unless you are sure
|
||||
/obj/machinery/cryopod/proc/despawn_occupant()
|
||||
var/mob/living/mob_occupant = occupant
|
||||
var/list/target_candidates = list()
|
||||
|
||||
if(istype(SSticker.mode, /datum/antagonist/cult))//thank
|
||||
if("sacrifice" in SSticker.mode.cult)
|
||||
for(var/mob/living/carbon/human/player in GLOB.player_list)
|
||||
if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD)
|
||||
target_candidates += player.mind
|
||||
|
||||
target_candidates -= mob_occupant.mind
|
||||
|
||||
if(target_candidates.len == 0)
|
||||
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.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD)
|
||||
target_candidates += player.mind
|
||||
|
||||
listclearnulls(target_candidates)
|
||||
if(LAZYLEN(target_candidates))
|
||||
var/datum/objective/sacrifice/sac_objective = locate() in GLOB.objectives
|
||||
sac_objective.target = pick(target_candidates)
|
||||
sac_objective.update_explanation_text()
|
||||
|
||||
var/datum/job/sacjob = SSjob.GetJob(sac_objective.target.assigned_role)
|
||||
var/datum/preferences/sacface = sac_objective.target.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)
|
||||
sac_objective.sac_image = reshape
|
||||
|
||||
for(var/datum/mind/H in SSticker.mode.cult)
|
||||
if(H.current)
|
||||
to_chat(H.current, "<span class='danger'>Nar'Sie</span> murmurs, <span class='cultlarge'>[occupant] is beyond your reach. Sacrifice [sac_objective.target.current] instead...</span></span>")
|
||||
|
||||
else
|
||||
message_admins("Cult Sacrifice: Could not find unconvertable or convertable target after cryopod. WELP!")
|
||||
|
||||
//Update any existing objectives involving this mob.
|
||||
for(var/datum/objective/O in GLOB.objectives)
|
||||
// We don't want revs to get objectives that aren't for heads of staff. Letting
|
||||
// them win or lose based on cryo is silly so we remove the objective.
|
||||
if(istype(O,/datum/objective/mutiny) && O.target == mob_occupant.mind)
|
||||
qdel(O)
|
||||
else if(O.target && istype(O.target, /datum/mind))
|
||||
if(O.target == mob_occupant.mind)
|
||||
if(O.owner && O.owner.current)
|
||||
to_chat(O.owner.current, "<BR><span class='userdanger'>You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!</span>")
|
||||
O.target = null
|
||||
spawn(10) //This should ideally fire after the occupant is deleted.
|
||||
if(!O)
|
||||
return
|
||||
O.find_target()
|
||||
O.update_explanation_text()
|
||||
if(!(O.target))
|
||||
O.owner.objectives -= O
|
||||
qdel(O)
|
||||
|
||||
if(mob_occupant.mind && mob_occupant.mind.assigned_role)
|
||||
//Handle job slot/tater cleanup.
|
||||
var/job = mob_occupant.mind.assigned_role
|
||||
SSjob.FreeRole(job)
|
||||
if(mob_occupant.mind.objectives.len)
|
||||
mob_occupant.mind.objectives.Cut()
|
||||
mob_occupant.mind.special_role = null
|
||||
|
||||
// Delete them from datacore.
|
||||
|
||||
var/announce_rank = null
|
||||
for(var/datum/data/record/R in GLOB.data_core.medical)
|
||||
if((R.fields["name"] == mob_occupant.real_name))
|
||||
qdel(R)
|
||||
for(var/datum/data/record/T in GLOB.data_core.security)
|
||||
if((T.fields["name"] == mob_occupant.real_name))
|
||||
qdel(T)
|
||||
for(var/datum/data/record/G in GLOB.data_core.general)
|
||||
if((G.fields["name"] == mob_occupant.real_name))
|
||||
announce_rank = G.fields["rank"]
|
||||
qdel(G)
|
||||
|
||||
for(var/obj/machinery/computer/cloning/cloner in world)
|
||||
for(var/datum/data/record/R in cloner.records)
|
||||
if(R.fields["name"] == mob_occupant.real_name)
|
||||
cloner.records.Remove(R)
|
||||
|
||||
//Make an announcement and log the person entering storage.
|
||||
if(control_computer)
|
||||
control_computer.frozen_crew += "[mob_occupant.real_name]"
|
||||
|
||||
if(GLOB.announcement_systems.len)
|
||||
var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems)
|
||||
announcer.announce("CRYOSTORAGE", mob_occupant.real_name, announce_rank, list())
|
||||
visible_message("<span class='notice'>\The [src] hums and hisses as it moves [mob_occupant.real_name] into storage.</span>")
|
||||
|
||||
|
||||
for(var/obj/item/W in mob_occupant.GetAllContents())
|
||||
if(W.loc.loc && (( W.loc.loc == loc ) || (W.loc.loc == control_computer)))
|
||||
continue//means we already moved whatever this thing was in
|
||||
//I'm a professional, okay
|
||||
for(var/T in preserve_items)
|
||||
if(istype(W, T))
|
||||
if(control_computer && control_computer.allow_items)
|
||||
control_computer.frozen_items += W
|
||||
mob_occupant.transferItemToLoc(W, control_computer, TRUE)
|
||||
else
|
||||
mob_occupant.transferItemToLoc(W, loc, TRUE)
|
||||
|
||||
for(var/obj/item/W in mob_occupant.GetAllContents())
|
||||
qdel(W)//because we moved all items to preserve away
|
||||
//and yes, this totally deletes their bodyparts one by one, I just couldn't bother
|
||||
|
||||
if(iscyborg(mob_occupant))
|
||||
var/mob/living/silicon/robot/R = occupant
|
||||
if(!istype(R)) return ..()
|
||||
|
||||
R.contents -= R.mmi
|
||||
qdel(R.mmi)
|
||||
|
||||
// Ghost and delete the mob.
|
||||
if(!mob_occupant.get_ghost(1))
|
||||
if(world.time < 30 * 600)//before the 30 minute mark
|
||||
mob_occupant.ghostize(0) // Players despawned too early may not re-enter the game
|
||||
else
|
||||
mob_occupant.ghostize(1)
|
||||
QDEL_NULL(occupant)
|
||||
open_machine()
|
||||
name = initial(name)
|
||||
|
||||
/obj/machinery/cryopod/MouseDrop_T(mob/living/target, mob/user)
|
||||
if(!istype(target) || user.incapacitated() || !target.Adjacent(user) || !Adjacent(user) || !ismob(target) || (!ishuman(user) && !iscyborg(user)) || !istype(user.loc, /turf) || target.buckled)
|
||||
return
|
||||
|
||||
if(occupant)
|
||||
to_chat(user, "<span class='boldnotice'>The cryo pod is already occupied!</span>")
|
||||
return
|
||||
|
||||
if(target.stat == DEAD)
|
||||
to_chat(user, "<span class='notice'>Dead people can not be put into cryo.</span>")
|
||||
return
|
||||
|
||||
if(target.client && user != target)
|
||||
if(iscyborg(target))
|
||||
to_chat(user, "<span class='danger'>You can't put [target] into [src]. They're online.</span>")
|
||||
else
|
||||
to_chat(user, "<span class='danger'>You can't put [target] into [src]. They're conscious.</span>")
|
||||
return
|
||||
else if(target.client)
|
||||
if(alert(target,"Would you like to enter cryosleep?",,"Yes","No") == "No")
|
||||
return
|
||||
|
||||
var/generic_plsnoleave_message = " Please adminhelp before leaving the round, even if there are no administrators online!"
|
||||
|
||||
if(target == user && world.time - target.client.cryo_warned > 5 * 600)//if we haven't warned them in the last 5 minutes
|
||||
var/caught = FALSE
|
||||
if(target.mind.assigned_role in GLOB.command_positions)
|
||||
alert("<span class='userdanger'>You're a Head of Staff![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
if(iscultist(target) || is_servant_of_ratvar(target))
|
||||
to_chat(target, "<span class='userdanger'>You're a Cultist![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
if(istype(SSticker.mode, /datum/antagonist/blob))
|
||||
if(target.mind in GLOB.overminds)
|
||||
alert("<span class='userdanger'>You're a Blob![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
if(is_devil(target))
|
||||
alert("<span class='userdanger'>You're a Devil![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
if(istype(SSticker.mode, /datum/antagonist/rev))
|
||||
if(target.mind.has_antag_datum(/datum/antagonist/rev/head))
|
||||
alert("<span class='userdanger'>You're a Head Revolutionary![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
else if(target.mind.has_antag_datum(/datum/antagonist/rev))
|
||||
alert("<span class='userdanger'>You're a Revolutionary![generic_plsnoleave_message]</span>")
|
||||
caught = TRUE
|
||||
|
||||
if(caught)
|
||||
target.client.cryo_warned = world.time
|
||||
return
|
||||
|
||||
if(target == user)
|
||||
visible_message("[user] starts climbing into the cryo pod.")
|
||||
else
|
||||
visible_message("[user] starts putting [target] into the cryo pod.")
|
||||
|
||||
if(occupant)
|
||||
to_chat(user, "<span class='boldnotice'>\The [src] is in use.</span>")
|
||||
return
|
||||
close_machine(target)
|
||||
|
||||
to_chat(target, "<span class='boldnotice'>If you ghost, log out or close your client now, your character will shortly be permanently removed from the round.</span>")
|
||||
name = "[name] ([occupant.name])"
|
||||
log_admin("<span class='notice'>[key_name(target)] entered a stasis pod.</span>")
|
||||
message_admins("[key_name_admin(target)] entered a stasis pod. (<A HREF='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
add_fingerprint(target)
|
||||
|
||||
//Attacks/effects.
|
||||
/obj/machinery/cryopod/blob_act()
|
||||
return //Sorta gamey, but we don't really want these to be destroyed.
|
||||
@@ -0,0 +1,2 @@
|
||||
/client
|
||||
var/cryo_warned = -3000//when was the last time we warned them about not cryoing without an ahelp, set to -5 minutes so that rounstart cryo still warns
|
||||
@@ -2522,6 +2522,7 @@
|
||||
#include "modular_citadel\code\datums\uplink_items_cit.dm"
|
||||
#include "modular_citadel\code\datums\mutations\hulk.dm"
|
||||
#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm"
|
||||
#include "modular_citadel\code\game\machinery\cryopod.dm"
|
||||
#include "modular_citadel\code\game\machinery\Sleeper.dm"
|
||||
#include "modular_citadel\code\game\objects\ids.dm"
|
||||
#include "modular_citadel\code\game\objects\items\handcuffs.dm"
|
||||
@@ -2541,6 +2542,7 @@
|
||||
#include "modular_citadel\code\modules\admin\topic.dm"
|
||||
#include "modular_citadel\code\modules\cargo\console.dm"
|
||||
#include "modular_citadel\code\modules\cargo\packs.dm"
|
||||
#include "modular_citadel\code\modules\client\client_defines.dm"
|
||||
#include "modular_citadel\code\modules\client\client_procs.dm"
|
||||
#include "modular_citadel\code\modules\client\preferences.dm"
|
||||
#include "modular_citadel\code\modules\client\preferences_savefile.dm"
|
||||
|
||||
Reference in New Issue
Block a user