Merge pull request #5485 from Poojawa/cryopods

Cryopods from Oracle Station
This commit is contained in:
deathride58
2018-02-16 05:56:34 +00:00
committed by GitHub
15 changed files with 55632 additions and 55638 deletions
File diff suppressed because it is too large Load Diff
+19 -4
View File
@@ -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
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+125 -31
View File
@@ -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
"}
"}
+5
View File
@@ -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

+7 -3
View File
@@ -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
+2
View File
@@ -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"