diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 696952e9b89..d9cd9029cc9 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -125,10 +125,14 @@
if(!M.brainmob)
user << "Sticking an empty MMI into the frame would sort of defeat the purpose."
return
- if(M.brainmob.stat == 2)
+ if(M.brainmob.stat == DEAD)
user << "Sticking a dead brain into the frame would sort of defeat the purpose."
return
+ if(!M.brainmob.client)
+ user << "Sticking an inactive brain into the frame would sort of defeat the purpose."
+ return
+
if((config) && (!config.allow_ai))
user << "This MMI does not seem to fit."
return
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 045886e7065..adb250796fe 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -318,28 +318,33 @@
/obj/item/proc/eyestab(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
- var/mob/living/carbon/human/H = M
- if(istype(H) && ( \
- (H.head && H.head.flags & HEADCOVERSEYES) || \
+ var/is_human_victim = 0
+ if(ishuman(M))
+ is_human_victim = 1
+ var/mob/living/carbon/human/H = M
+ if((H.head && H.head.flags & HEADCOVERSEYES) || \
(H.wear_mask && H.wear_mask.flags & MASKCOVERSEYES) || \
- (H.glasses && H.glasses.flags & GLASSESCOVERSEYES) \
- ))
- // you can't stab someone in the eyes wearing a mask!
- user << "You're going to need to remove that mask/helmet/glasses first."
- return
+ (H.glasses && H.glasses.flags & GLASSESCOVERSEYES))
+ // you can't stab someone in the eyes wearing a mask!
+ user << "You're going to need to remove that mask/helmet/glasses first."
+ return
- var/mob/living/carbon/monkey/Mo = M
- if(istype(Mo) && ( \
- (Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES) \
- ))
- // you can't stab someone in the eyes wearing a mask!
- user << "You're going to need to remove that mask/helmet/glasses first."
- return
+
+ if(ismonkey(M))
+ var/mob/living/carbon/monkey/Mo = M
+ if(Mo.wear_mask && Mo.wear_mask.flags & MASKCOVERSEYES)
+ // you can't stab someone in the eyes wearing a mask!
+ user << "You're going to need to remove that mask/helmet/glasses first."
+ return
if(isalien(M))//Aliens don't have eyes./N slimes also don't have eyes!
user << "You cannot locate any eyes on this creature!"
return
+ if(isbrain(M))
+ user << "You cannot locate any organic eyes on this brain!"
+ return
+
add_logs(user, M, "attacked", object="[src.name]", addition="(INTENT: [uppertext(user.a_intent)])")
src.add_fingerprint(user)
@@ -352,7 +357,7 @@
"[user] has stabbed themself in the eyes with [src]!", \
"You stab yourself in the eyes with [src]!" \
)
- if(istype(M, /mob/living/carbon/human))
+ if(is_human_victim)
var/mob/living/carbon/human/U = M
var/obj/item/organ/limb/affecting = U.get_organ("head")
if(affecting.take_damage(7))
@@ -360,6 +365,7 @@
else
M.take_organ_damage(7)
+
M.eye_blurry += rand(3,4)
M.eye_stat += rand(2,4)
if (M.eye_stat >= 10)
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 9641f540d89..168fa97d638 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -160,32 +160,31 @@
var/obj/item/device/mmi/M = W
if(check_completion())
if(!istype(loc,/turf))
- user << "You can't put the MMI in, the frame has to be standing on the ground to be perfectly precise."
+ user << "You can't put the MMI in, the frame has to be standing on the ground to be perfectly precise."
return
if(!M.brainmob)
- user << "Sticking an empty MMI into the frame would sort of defeat the purpose."
- return
- if(!M.brainmob.key)
- var/ghost_can_reenter = 0
- if(M.brainmob.mind)
- for(var/mob/dead/observer/G in player_list)
- if(G.can_reenter_corpse && G.mind == M.brainmob.mind)
- ghost_can_reenter = 1
- break
- if(!ghost_can_reenter)
- user << "The mmi indicates that their mind is completely unresponsive; there's no point."
- return
-
- if(M.brainmob.stat == DEAD)
- user << "Sticking a dead brain into the frame would sort of defeat the purpose."
+ user << "Sticking an empty MMI into the frame would sort of defeat the purpose."
return
- if((M.brainmob.mind in ticker.mode.head_revolutionaries) || (M.brainmob.mind in ticker.mode.A_bosses) || (M.brainmob.mind in ticker.mode.B_bosses))
+ var/mob/living/carbon/brain/BM = M.brainmob
+ if(!BM.key || !BM.mind)
+ user << "The mmi indicates that their mind is completely unresponsive; there's no point."
+ return
+
+ if(!BM.client) //braindead
+ user << "The mmi indicates that their mind is currently inactive; it might change."
+ return
+
+ if(BM.stat == DEAD)
+ user << "Sticking a dead brain into the frame would sort of defeat the purpose."
+ return
+
+ if((BM.mind in ticker.mode.head_revolutionaries) || (BM.mind in ticker.mode.A_bosses) || (BM.mind in ticker.mode.B_bosses))
user << "The frame's firmware lets out a shrill sound, and flashes 'Abnormal Memory Engram'. It refuses to accept the MMI."
return
- if(jobban_isbanned(M.brainmob, "Cyborg"))
- user << "This MMI does not seem to fit."
+ if(jobban_isbanned(BM, "Cyborg"))
+ user << "This MMI does not seem to fit."
return
var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc))
@@ -211,7 +210,7 @@
if(ticker.mode.config_tag == "malfunction") //Don't let humans get a cyborg on their side during malf, for balance reasons.
O.set_zeroth_law("ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK#*�&110010")
- M.brainmob.mind.transfer_to(O)
+ BM.mind.transfer_to(O)
if(O.mind && O.mind.special_role)
O.mind.store_memory("As a cyborg, any objectives listed here are null and void, and will be marked as failed. They are simply here for memory purposes.")
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 45ca0a7748b..944e5a957e4 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -221,8 +221,8 @@
if(world.time > last_event+15)
active = 1
for(var/mob/living/L in range(3,src))
- L.irradiate(12)
- for(var/turf/simulated/wall/mineral/uranium/T in range(3,src))
+ L.irradiate(2)
+ for(var/turf/simulated/wall/mineral/uranium/T in orange(1,src))
T.radiate()
last_event = world.time
active = null
diff --git a/code/game/turfs/simulated/floor/mineral_floor.dm b/code/game/turfs/simulated/floor/mineral_floor.dm
index be064079ef9..ca8716d2d82 100644
--- a/code/game/turfs/simulated/floor/mineral_floor.dm
+++ b/code/game/turfs/simulated/floor/mineral_floor.dm
@@ -165,7 +165,7 @@
active = 1
for(var/mob/living/L in range(3,src))
L.irradiate(1)
- for(var/turf/simulated/floor/mineral/uranium/T in range(3,src))
+ for(var/turf/simulated/floor/mineral/uranium/T in orange(1,src))
T.radiate()
last_event = world.time
active = 0
diff --git a/code/game/turfs/simulated/walls_mineral.dm b/code/game/turfs/simulated/walls_mineral.dm
index ffa184a2a66..ea427c7f21d 100644
--- a/code/game/turfs/simulated/walls_mineral.dm
+++ b/code/game/turfs/simulated/walls_mineral.dm
@@ -64,8 +64,8 @@
if(world.time > last_event+15)
active = 1
for(var/mob/living/L in range(3,src))
- L.irradiate(12)
- for(var/turf/simulated/wall/mineral/uranium/T in range(3,src))
+ L.irradiate(2)
+ for(var/turf/simulated/wall/mineral/uranium/T in orange(1,src))
T.radiate()
last_event = world.time
active = null
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 49a3bc558d3..8dd48d93f90 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -19,14 +19,35 @@
var/obj/item/organ/brain/brain = null //The actual brain
/obj/item/device/mmi/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+ user.changeNext_move(CLICK_CD_MELEE)
if(istype(O,/obj/item/organ/brain)) //Time to stick a brain in it --NEO
var/obj/item/organ/brain/newbrain = O
if(brain)
- user << "There's already a brain in the MMI!"
+ user << "There's already a brain in the MMI!"
return
if(!newbrain.brainmob)
- user << "You aren't sure where this brain came from, but you're pretty sure it's a useless brain."
+ user << "You aren't sure where this brain came from, but you're pretty sure it's a useless brain."
return
+
+ var/mob/living/carbon/brain/B = newbrain.brainmob
+ if(!B.key)
+ var/mob/dead/observer/ghost = B.get_ghost()
+ if(ghost)
+ if(ghost.client)
+ user << "The brain's activity spikes for a second then settles down. Next connection attempts may be successful."
+ ghost << "Someone is trying to put your brain in a MMI. Return to your body if you want to! (Verbs -> Ghost -> Re-enter corpse)"
+ ghost << sound('sound/effects/genetics.ogg')
+ else
+ user << "The brain seems currently inactive; it might change."
+ else
+ user << "The brain is completely unresponsive; there's no point."
+ return
+
+ if(!B.client)
+ user << "The brain seems currently inactive; it might change."
+ return
+
+
visible_message("[user] sticks \a [newbrain] into \the [src]")
brainmob = newbrain.brainmob
diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm
index be2b01d8732..fff5bebcdeb 100644
--- a/code/modules/mob/living/carbon/brain/life.dm
+++ b/code/modules/mob/living/carbon/brain/life.dm
@@ -124,16 +124,27 @@
return 1
/mob/living/carbon/brain/handle_disabilities()
- return
+ //Eyes
+ if(disabilities & BLIND || stat)
+ eye_blind = max(eye_blind, 1)
+ else
+ if(eye_blind)
+ eye_blind = 0
+ if(eye_blurry)
+ eye_blurry = 0
+ if(eye_stat)
+ eye_stat = 0
+
+ //Ears
+ if(disabilities & DEAF)
+ setEarDamage(-1, max(ear_deaf, 1))
+ else if(ear_damage < 100)
+ setEarDamage(0, 0)
/mob/living/carbon/brain/handle_status_effects()
return
/mob/living/carbon/brain/handle_regular_hud_updates()
-
handle_vision()
-
handle_hud_icons_health()
-
return 1
-
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 3b4025f9528..0e2333ca0ba 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -246,7 +246,9 @@
/mob/living/carbon/proc/handle_heart()
return
-/mob/living/carbon/handle_environment(var/datum/gas_mixture/environment) return
+
+/mob/living/carbon/handle_environment(var/datum/gas_mixture/environment)
+ return
/mob/living/carbon/handle_stomach()
spawn(0)
diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm
index 15457054fbc..ca469d59ec4 100644
--- a/code/modules/mob/living/silicon/robot/examine.dm
+++ b/code/modules/mob/living/silicon/robot/examine.dm
@@ -27,6 +27,9 @@
else
msg += "Its cover is closed[locked ? "" : ", and looks unlocked"].\n"
+ if(cell && cell.charge <= 0)
+ msg += "Its battery indicator is blinking red!\n"
+
switch(src.stat)
if(CONSCIOUS)
if(!src.client) msg += "It appears to be in stand-by mode.\n" //afk
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 09aef431b21..003adc85328 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -24,7 +24,8 @@
if(cell)
if(cell.charge <= 0)
uneq_all()
- stat = UNCONSCIOUS
+ Stun(5)
+ update_icons()
else if (cell.charge <= 100)
uneq_all()
cell.use(1)
@@ -38,7 +39,8 @@
cell.use(1)
else
uneq_all()
- stat = UNCONSCIOUS
+ Stun(5)
+ update_icons()
/mob/living/silicon/robot/handle_regular_status_updates()
@@ -68,7 +70,7 @@
if(getOxyLoss() > 50)
Paralyse(3)
- if (paralysis || stunned || weakened) //Stunned etc.
+ if(paralysis)
stat = UNCONSCIOUS
use_power()
@@ -80,7 +82,7 @@
if (stuttering)
stuttering = max(0, stuttering - 1)
- if (druggy)
+ if(druggy)
druggy = max(0, druggy - 1)
/mob/living/silicon/robot/handle_regular_hud_updates()
@@ -216,3 +218,11 @@
else
canmove = 1
return canmove
+
+/mob/living/silicon/robot/handle_environment(var/datum/gas_mixture/environment)
+ if(environment.temperature > FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT) //hotter than what a firesuit can handle
+ spark_system.start()
+ adjustFireLoss(4)
+ throw_alert("temp","hot",3)
+ else
+ clear_alert("temp")
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 15b7d70d17c..f5ecaaa6f07 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -719,7 +719,7 @@
/mob/living/silicon/robot/update_icons()
overlays.Cut()
- if(stat == 0)
+ if(stat == 0 && cell && cell.charge > 0)
switch(icon_state)
if("robot")
overlays += "eyes-standard"
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 243159ff767..c7886c7e818 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -41,11 +41,9 @@
/mob/living/simple_animal/hostile/carp/AttackingTarget()
..()
- if(isliving(target))
- var/mob/living/L = target
- if(prob(15))
- L.Weaken(3)
- L.visible_message("\the [src] knocks down \the [L]!")
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.adjustStaminaLoss(8)
/mob/living/simple_animal/hostile/carp/holocarp
icon_state = "holocarp"
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 1864c0d1f84..66ebd16f531 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -98,6 +98,8 @@
eye_blind = 0
if(eye_blurry)
eye_blurry = 0
+ if(eye_stat)
+ eye_stat = 0
//Ears
if(disabilities & DEAF)
@@ -490,4 +492,4 @@
canmove = 0
else
canmove = 1
- return canmove
+ return canmove