diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index e2f999b0da7..f54d069b9d4 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -197,7 +197,7 @@
if(href_list["chemical"] in available_chemicals) // Your hacks are bad and you should feel bad
inject_chemical(usr, href_list["chemical"], text2num(href_list["amount"]))
if(href_list["change_stasis"])
- var/new_stasis = input("Levels deeper than 50% metabolic rate will render the patient unconscious.","Stasis Level") as null|anything in stasis_choices
+ var/new_stasis = input("Levels deeper than 50% stasis level will render the patient unconscious.","Stasis Level") as null|anything in stasis_choices
if(new_stasis && CanUseTopic(usr, default_state) == STATUS_INTERACTIVE)
stasis_level = stasis_choices[new_stasis]
@@ -205,7 +205,11 @@
/obj/machinery/sleeper/attackby(var/obj/item/I, var/mob/user)
add_fingerprint(user)
- if(default_deconstruction_screwdriver(user, I))
+ if(istype(I, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = I
+ if(G.affecting)
+ go_in(G.affecting, user)
+ else if(default_deconstruction_screwdriver(user, I))
return
else if(default_deconstruction_crowbar(user, I))
return
@@ -219,6 +223,28 @@
user << "\The [src] has a beaker already."
return
+/obj/machinery/sleeper/verb/move_eject()
+ set name = "Eject occupant"
+ set category = "Object"
+ set src in oview(1)
+ if(usr == occupant)
+ switch(usr.stat)
+ if(DEAD)
+ return
+ if(UNCONSCIOUS)
+ usr << "You struggle through the haze to hit the eject button. This will take a couple of minutes..."
+ sleep(2 MINUTES)
+ if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already
+ return
+ go_out()
+ if(CONSCIOUS)
+ go_out()
+ else
+ if(usr.stat != 0)
+ return
+ go_out()
+ add_fingerprint(usr)
+
/obj/machinery/sleeper/MouseDrop_T(var/mob/target, var/mob/user)
if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user)|| !ishuman(target))
return
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 6237e43e0f9..c9a3a2d292f 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -159,6 +159,20 @@
else
in_stasis = amount
+/mob/living/carbon/human/proc/getStasis()
+ if((species.flags & NO_SCAN) || isSynthetic())
+ return 0
+
+ return in_stasis
+
+//This determines if, RIGHT NOW, the life() tick is being skipped due to stasis
+/mob/living/carbon/human/proc/inStasisNow()
+ var/stasisValue = getStasis()
+ if(stasisValue && (life_tick % stasisValue))
+ return 1
+
+ return 0
+
/mob/living/carbon/human/getCloneLoss()
if((species.flags & NO_SCAN) || isSynthetic())
cloneloss = 0
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 8308c35034d..a21073f9190 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -62,11 +62,12 @@
voice = GetVoice()
- //No need to update all of these procs if the guy is dead.
- if(stat != DEAD && (!in_stasis || life_tick % in_stasis == 1))
- if(in_stasis > 2)
- Sleeping(10)
+ var/stasis = inStasisNow()
+ if(getStasis() > 2)
+ Sleeping(20)
+ //No need to update all of these procs if the guy is dead.
+ if(stat != DEAD && !stasis)
//Updates the number of stored chemicals for powers
handle_changeling()
@@ -99,7 +100,7 @@
return 1
/mob/living/carbon/human/breathe()
- if(!in_stasis || life_tick % in_stasis == 1)
+ if(!inStasisNow())
..()
// Calculate how vulnerable the human is to under- and overpressure.
@@ -209,7 +210,7 @@
/mob/living/carbon/human/handle_mutations_and_radiation()
- if(in_stasis && life_tick % in_stasis != 1)
+ if(inStasisNow())
return
if(getFireLoss())
@@ -791,7 +792,7 @@
/mob/living/carbon/human/handle_chemicals_in_body()
- if(in_stasis && life_tick % in_stasis != 1)
+ if(inStasisNow())
return
if(reagents)
@@ -1341,7 +1342,7 @@
if(!druggy && !seer) see_invisible = SEE_INVISIBLE_LIVING
/mob/living/carbon/human/handle_random_events()
- if(in_stasis && life_tick % in_stasis != 1)
+ if(inStasisNow())
return
// Puke if toxloss is too high
diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm
index 0f5ea190f26..c6670d2a30e 100644
--- a/code/modules/organs/blood.dm
+++ b/code/modules/organs/blood.dm
@@ -37,7 +37,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5
// Takes care blood loss and regeneration
/mob/living/carbon/human/handle_blood()
- if(in_stasis)
+ if(inStasisNow())
return
if(!should_have_organ(O_HEART))