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