diff --git a/code/datums/shuttle_controller.dm b/code/datums/shuttle_controller.dm
index 9f529dfb282..2c3a703ce2c 100644
--- a/code/datums/shuttle_controller.dm
+++ b/code/datums/shuttle_controller.dm
@@ -15,6 +15,7 @@ datum/shuttle_controller
direction = 1 //-1 = going back to central command, 1 = going back to SS13
endtime // timeofday that shuttle arrives
+ timelimit //important when the shuttle gets called for more than shuttlearrivetime
//timeleft = 360 //600
fake_recall = 0 //Used in rounds to prevent "ON NOES, IT MUST [INSERT ROUND] BECAUSE SHUTTLE CAN'T BE CALLED"
@@ -22,12 +23,12 @@ datum/shuttle_controller
// call the shuttle
// if not called before, set the endtime to T+600 seconds
// otherwise if outgoing, switch to incoming
- proc/incall()
+ proc/incall(coeff = 1)
if(endtime)
if(direction == -1)
setdirection(1)
else
- settimeleft(SHUTTLEARRIVETIME)
+ settimeleft(SHUTTLEARRIVETIME*coeff)
online = 1
proc/recall()
@@ -57,6 +58,7 @@ datum/shuttle_controller
// sets the time left to a given delay (in seconds)
proc/settimeleft(var/delay)
endtime = world.timeofday + delay * 10
+ timelimit = delay
// sets the shuttle direction
// 1 = towards SS13, -1 = back to centcom
@@ -79,7 +81,7 @@ datum/shuttle_controller
timeleft = 0
switch(location)
if(0)
- if(timeleft>SHUTTLEARRIVETIME)
+ if(timeleft>timelimit)
online = 0
direction = 1
endtime = null
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 4012cb6e242..6784bd64deb 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -482,4 +482,54 @@
if("alert")
set_picture(signal.data["picture_state"])
-*/
\ No newline at end of file
+*/
+
+/obj/machinery/computer/communications/Del()
+
+ for(var/obj/machinery/computer/communications/commconsole in world)
+ if(istype(commconsole.loc,/turf) && commconsole != src)
+ return ..()
+
+ for(var/obj/item/weapon/circuitboard/communications/commboard in world)
+ if(istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage))
+ return ..()
+
+ for(var/mob/living/silicon/ai/shuttlecaller in world)
+ if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf))
+ return ..()
+
+ if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || sent_strike_team)
+ return ..()
+
+ emergency_shuttle.incall(2)
+ log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
+ message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
+ world << "\blue Alert: The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes."
+ world << sound('shuttlecalled.ogg')
+
+ ..()
+
+/obj/item/weapon/circuitboard/communications/Del()
+
+ for(var/obj/machinery/computer/communications/commconsole in world)
+ if(istype(commconsole.loc,/turf))
+ return ..()
+
+ for(var/obj/item/weapon/circuitboard/communications/commboard in world)
+ if((istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage)) && commboard != src)
+ return ..()
+
+ for(var/mob/living/silicon/ai/shuttlecaller in world)
+ if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf))
+ return ..()
+
+ if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || sent_strike_team)
+ return ..()
+
+ emergency_shuttle.incall(2)
+ log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
+ message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
+ world << "\blue Alert: The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes."
+ world << sound('shuttlecalled.ogg')
+
+ ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 5f47da1a9e8..f9c7697ea98 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1030,15 +1030,30 @@
src.overlays += image("icon" = 'genetics.dmi', "icon_state" = "telekinesishead[fat][!src.lying ? "_s" : "_l"]")
if (src.mutantrace)
- src.overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace][fat][!src.lying ? "_s" : "_l"]")
- if(src.face_standing)
- del(src.face_standing)
- if(src.face_lying)
- del(src.face_lying)
- if(src.stand_icon)
- del(src.stand_icon)
- if(src.lying_icon)
- del(src.lying_icon)
+ switch(mutantrace)
+ if("lizard","golem","metroid")
+ src.overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace][fat][!src.lying ? "_s" : "_l"]")
+ if(src.face_standing)
+ del(src.face_standing)
+ if(src.face_lying)
+ del(src.face_lying)
+ if(src.stand_icon)
+ del(src.stand_icon)
+ if(src.lying_icon)
+ del(src.lying_icon)
+ if("plant")
+ if(stat != 2) //if not dead, that is
+ src.overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace][fat]_[gender][!src.lying ? "_s" : "_l"]")
+ else
+ src.overlays += image("icon" = 'genetics.dmi', "icon_state" = "[mutantrace]_d")
+ if(src.face_standing)
+ del(src.face_standing)
+ if(src.face_lying)
+ del(src.face_lying)
+ if(src.stand_icon)
+ del(src.stand_icon)
+ if(src.lying_icon)
+ del(src.lying_icon)
else
if(!src.face_standing || !src.face_lying)
src.update_face()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index c525b7514ce..575271bdb41 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -567,6 +567,9 @@
return
var/discomfort = min(abs(exposed_temperature - bodytemperature)*(exposed_intensity)/2000000, 1.0)
+ if(mutantrace == "plant")
+ discomfort *= 3 //I don't like magic numbers. I'll make mutantraces a datum with vars sometime later. -- Urist
+
switch(body_part)
if(HEAD)
TakeDamage("head", 0, 2.5*discomfort)
@@ -589,6 +592,23 @@
handle_chemicals_in_body()
if(reagents) reagents.metabolize(src)
+
+ if(mutantrace == "plant") //couldn't think of a better place to place it, since it handles nutrition -- Urist
+ var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
+ if(istype(loc,/turf)) //else, there's considered to be no light
+ light_amount = min(10,loc:sd_lumcount) - 5 //hardcapped so it's not abused by having a ton of flashlights
+ if(nutrition < 500) //so they can't store nutrition to survive without light forever
+ nutrition += light_amount
+ if(light_amount > 0) //if there's enough light, heal
+ if(fireloss)
+ heal_overall_damage(0,1)
+ if(bruteloss)
+ heal_overall_damage(1,0)
+ if(toxloss)
+ toxloss--
+ if(oxyloss)
+ oxyloss--
+
if(overeatduration > 500 && !(src.mutations & 32))
src << "\red You suddenly feel blubbery!"
src.mutations |= 32
@@ -603,9 +623,15 @@
nutrition = max (0, nutrition - HUNGER_FACTOR)
if (nutrition > 450)
- overeatduration++
+ if(overeatduration < 600) //capped so people don't take forever to unfat
+ overeatduration++
else
- overeatduration = max (0, overeatduration - 1)
+ if(overeatduration > 1)
+ overeatduration -= 2 //doubled the unfat rate
+
+ if(mutantrace == "plant")
+ if(nutrition < 200)
+ take_overall_damage(2,0)
if (src.drowsyness)
src.drowsyness--
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 6238e343d7a..dcb49f9c23d 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -12,8 +12,26 @@
src.lying = 1
src.icon_state = "ai-crash"
+ for(var/obj/machinery/computer/communications/commconsole in world)
+ if(istype(commconsole.loc,/turf))
+ return
+ for(var/obj/item/weapon/circuitboard/communications/commboard in world)
+ if(istype(commboard.loc,/turf) || istype(commboard.loc,/obj/item/weapon/storage))
+ return
+ for(var/mob/living/silicon/ai/shuttlecaller in world)
+ if(!shuttlecaller.stat && shuttlecaller.client && istype(shuttlecaller.loc,/turf))
+ return
+
+ if(ticker.mode.name == "revolution" || ticker.mode.name == "AI malfunction" || sent_strike_team)
+ return
+
+ emergency_shuttle.incall(2)
+ log_game("All the AIs, comm consoles and boards are destroyed. Shuttle called.")
+ message_admins("All the AIs, comm consoles and boards are destroyed. Shuttle called.", 1)
+ world << "\blue Alert: The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes."
+ world << sound('shuttlecalled.ogg')
for(var/obj/machinery/ai_status_display/O in world) //change status
spawn( 0 )
diff --git a/icons/effects/genetics.dmi b/icons/effects/genetics.dmi
index 0f02d3f0f4e..26a555e6dd6 100644
Binary files a/icons/effects/genetics.dmi and b/icons/effects/genetics.dmi differ
diff --git a/icons/obj/hydroponics.dmi b/icons/obj/hydroponics.dmi
index 07cea94b208..9c32cf02818 100644
Binary files a/icons/obj/hydroponics.dmi and b/icons/obj/hydroponics.dmi differ
diff --git a/icons/obj/seeds.dmi b/icons/obj/seeds.dmi
index 9224b6792df..be3f6b3eb2a 100644
Binary files a/icons/obj/seeds.dmi and b/icons/obj/seeds.dmi differ