From e83d72219dbb8720969cefc8a34d4c3c1396f0a8 Mon Sep 17 00:00:00 2001
From: Joan Lung <3886584+ChangelingRain@users.noreply.github.com>
Date: Mon, 4 Sep 2017 19:58:34 -0400
Subject: [PATCH] Soft crit, except not terrible (#30262)
* Soft crit, except a little bit harder.
* tweak
* :ok_hand:
* why was this even in here
* no radios in critical
* fix that too
* keep to original logic
* not very smart, really
* tip: do nothing tgui-side that you can do code-side, because we can't do defines in tgui
* blood trail
* can't do blood trails
* how does this even work
* harsher slowdown and more obscured vision
* it really puts it into perspective; you're fucking dying.
* stat_attack
* stop fuckin whispering into radios or whatever it is you're doing
* more fixes
* fix
* fix
* fix the radio shit
* bikeshed?
---
code/__DEFINES/combat.dm | 5 +
code/__DEFINES/stat.dm | 7 +-
code/_onclick/hud/fullscreen.dm | 4 +
code/controllers/subsystem/ticker.dm | 4 +-
code/game/gamemodes/objective.dm | 2 +-
code/game/gamemodes/objective_items.dm | 2 +-
code/game/gamemodes/revolution/revolution.dm | 2 +-
code/game/machinery/Sleeper.dm | 14 +-
code/game/machinery/camera/tracking.dm | 4 +-
code/game/machinery/computer/aifixer.dm | 2 +-
code/game/objects/items/devices/PDA/PDA.dm | 8 +-
.../game/objects/items/devices/radio/radio.dm | 4 +-
code/game/objects/items/devices/scanners.dm | 2 +-
code/game/objects/items/stacks/medical.dm | 2 +-
code/game/objects/items/teleportation.dm | 2 +-
code/modules/admin/player_panel.dm | 33 +++--
code/modules/admin/secrets.dm | 2 +-
code/modules/admin/topic.dm | 10 +-
code/modules/admin/verbs/onlyone.dm | 1 -
.../components/unary_devices/cryo.dm | 48 ++++--
code/modules/events/ion_storm.dm | 2 +-
code/modules/hydroponics/grown/replicapod.dm | 2 +-
code/modules/mob/living/carbon/carbon.dm | 139 ++++++++++++------
.../mob/living/carbon/carbon_movement.dm | 10 +-
code/modules/mob/living/carbon/examine.dm | 2 +
.../mob/living/carbon/human/human_helpers.dm | 3 -
.../mob/living/carbon/human/species.dm | 2 +
code/modules/mob/living/living.dm | 40 ++---
code/modules/mob/living/say.dm | 17 ++-
code/modules/mob/living/silicon/ai/ai.dm | 14 +-
.../mob/living/silicon/ai/freelook/eye.dm | 2 +-
code/modules/mob/living/silicon/ai/laws.dm | 2 +-
code/modules/mob/living/silicon/ai/say.dm | 4 +-
.../mob/living/silicon/pai/software.dm | 2 +-
.../mob/living/simple_animal/bot/ed209bot.dm | 2 +-
.../mob/living/simple_animal/bot/medbot.dm | 2 +-
.../simple_animal/hostile/bosses/boss.dm | 2 +-
.../living/simple_animal/hostile/faithless.dm | 2 +-
.../living/simple_animal/hostile/headcrab.dm | 2 +-
.../living/simple_animal/hostile/hostile.dm | 6 +-
.../simple_animal/hostile/jungle/leaper.dm | 2 +-
.../hostile/megafauna/megafauna.dm | 2 +-
.../hostile/mining_mobs/hivelord.dm | 4 +-
.../living/simple_animal/hostile/mushroom.dm | 2 +-
.../simple_animal/hostile/nanotrasen.dm | 2 +-
.../hostile/retaliate/spaceman.dm | 2 +-
.../living/simple_animal/hostile/skeleton.dm | 2 +-
.../living/simple_animal/hostile/stickman.dm | 2 +-
.../living/simple_animal/hostile/syndicate.dm | 2 +-
code/modules/mob/mob.dm | 2 +-
code/modules/mob/status_procs.dm | 10 +-
code/modules/paperwork/paper.dm | 2 +-
code/modules/paperwork/photography.dm | 4 +-
.../spells/spell_types/rightandwrong.dm | 2 +-
icons/mob/screen_full.dmi | Bin 4210714 -> 4340565 bytes
tgui/assets/tgui.css | 2 +-
tgui/assets/tgui.js | 30 ++--
tgui/src/interfaces/cryo.ract | 33 +----
tgui/src/interfaces/sleeper.ract | 16 +-
59 files changed, 296 insertions(+), 240 deletions(-)
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index a307a0819dd..91e28b869ff 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -43,6 +43,7 @@
//Health Defines
#define HEALTH_THRESHOLD_CRIT 0
+#define HEALTH_THRESHOLD_FULLCRIT -30
#define HEALTH_THRESHOLD_DEAD -100
//Actual combat defines
@@ -67,6 +68,10 @@
#define GRAB_NECK 2
#define GRAB_KILL 3
+//slowdown when in softcrit
+#define SOFTCRIT_MIN_SLOWDOWN 8
+#define SOFTCRIT_ADD_SLOWDOWN 6
+
//Attack types for checking shields/hit reactions
#define MELEE_ATTACK 1
#define UNARMED_ATTACK 2
diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm
index 396ff64be9f..29c299e4b63 100644
--- a/code/__DEFINES/stat.dm
+++ b/code/__DEFINES/stat.dm
@@ -3,9 +3,10 @@
*/
//mob/var/stat things
-#define CONSCIOUS 0
-#define UNCONSCIOUS 1
-#define DEAD 2
+#define CONSCIOUS 0
+#define SOFT_CRIT 1
+#define UNCONSCIOUS 2
+#define DEAD 3
//mob disabilities stat
diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm
index 86179b006f2..0dcecf32294 100644
--- a/code/_onclick/hud/fullscreen.dm
+++ b/code/_onclick/hud/fullscreen.dm
@@ -95,6 +95,10 @@
layer = CRIT_LAYER
plane = FULLSCREEN_PLANE
+/obj/screen/fullscreen/crit/vision
+ icon_state = "oxydamageoverlay"
+ layer = BLIND_LAYER
+
/obj/screen/fullscreen/blind
icon_state = "blackimageoverlay"
layer = BLIND_LAYER
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 4815bf3cfdf..32f18b81fe5 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -515,7 +515,7 @@ SUBSYSTEM_DEF(ticker)
//Silicon laws report
for (var/mob/living/silicon/ai/aiPlayer in GLOB.mob_list)
- if (aiPlayer.stat != 2 && aiPlayer.mind)
+ if (aiPlayer.stat != DEAD && aiPlayer.mind)
to_chat(world, "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws at the end of the round were:")
aiPlayer.show_laws(1)
else if (aiPlayer.mind) //if the dead ai has a mind, use its key instead
@@ -535,7 +535,7 @@ SUBSYSTEM_DEF(ticker)
for (var/mob/living/silicon/robot/robo in GLOB.mob_list)
if (!robo.connected_ai && robo.mind)
- if (robo.stat != 2)
+ if (robo.stat != DEAD)
to_chat(world, "[robo.name] (Played by: [robo.mind.key]) survived as an AI-less borg! Its laws were:")
else
to_chat(world, "[robo.name] (Played by: [robo.mind.key]) was unable to survive the rigors of being a cyborg without an AI. Its laws were:")
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index e6a4b22486a..ce91e96698e 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -34,7 +34,7 @@
/datum/objective/proc/find_target()
var/list/possible_targets = list()
for(var/datum/mind/possible_target in get_crewmember_minds())
- if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && is_unique_objective(possible_target))
+ if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && is_unique_objective(possible_target))
possible_targets += possible_target
if(possible_targets.len > 0)
target = pick(possible_targets)
diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm
index c1af4de9f0a..c0aee8bb762 100644
--- a/code/game/gamemodes/objective_items.dm
+++ b/code/game/gamemodes/objective_items.dm
@@ -132,7 +132,7 @@
/datum/objective_item/steal/functionalai/check_special_completion(obj/item/device/aicard/C)
for(var/mob/living/silicon/ai/A in C)
- if(isAI(A) && A.stat != 2) //See if any AI's are alive inside that card.
+ if(isAI(A) && A.stat != DEAD) //See if any AI's are alive inside that card.
return 1
return 0
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 51a2c6c4865..f393dc5338e 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -335,7 +335,7 @@
/datum/game_mode/revolution/proc/check_heads_victory()
for(var/datum/mind/rev_mind in head_revolutionaries)
var/turf/T = get_turf(rev_mind.current)
- if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != 2) && T && (T.z == ZLEVEL_STATION))
+ if((rev_mind) && (rev_mind.current) && (rev_mind.current.stat != DEAD) && T && (T.z == ZLEVEL_STATION))
if(ishuman(rev_mind.current))
return 0
return 1
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index d003b48773b..65a0e1e5239 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -120,7 +120,19 @@
var/mob/living/mob_occupant = occupant
if(mob_occupant)
data["occupant"]["name"] = mob_occupant.name
- data["occupant"]["stat"] = mob_occupant.stat
+ switch(mob_occupant.stat)
+ if(CONSCIOUS)
+ data["occupant"]["stat"] = "Conscious"
+ data["occupant"]["statstate"] = "good"
+ if(SOFT_CRIT)
+ data["occupant"]["stat"] = "Conscious"
+ data["occupant"]["statstate"] = "average"
+ if(UNCONSCIOUS)
+ data["occupant"]["stat"] = "Unconscious"
+ data["occupant"]["statstate"] = "average"
+ if(DEAD)
+ data["occupant"]["stat"] = "Dead"
+ data["occupant"]["statstate"] = "bad"
data["occupant"]["health"] = mob_occupant.health
data["occupant"]["maxHealth"] = mob_occupant.maxHealth
data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD
diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm
index 708e925a362..68f09890b6e 100644
--- a/code/game/machinery/camera/tracking.dm
+++ b/code/game/machinery/camera/tracking.dm
@@ -2,7 +2,7 @@
track.cameras.Cut()
- if(src.stat == 2)
+ if(src.stat == DEAD)
return
var/list/L = list()
@@ -45,7 +45,7 @@
track.humans.Cut()
track.others.Cut()
- if(usr.stat == 2)
+ if(usr.stat == DEAD)
return list()
for(var/mob/living/M in GLOB.mob_list)
diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm
index 759096c5cd8..3d13e8a748b 100644
--- a/code/game/machinery/computer/aifixer.dm
+++ b/code/game/machinery/computer/aifixer.dm
@@ -56,7 +56,7 @@
dat += "Laws:
[laws]
"
- if (src.occupier.stat == 2)
+ if (src.occupier.stat == DEAD)
dat += "AI non-functional"
else
dat += "AI functional"
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 5ceb26ee611..acae2764ae1 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -856,7 +856,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/list/plist = list()
var/list/namecounts = list()
- if(user.stat == 2)
+ if(user.stat == DEAD)
return //won't work if dead
if(src.aiPDA.toff)
@@ -889,7 +889,7 @@ GLOBAL_LIST_EMPTY(PDAs)
/mob/living/silicon/ai/verb/cmd_toggle_pda_receiver()
set category = "AI Commands"
set name = "PDA - Toggle Sender/Receiver"
- if(usr.stat == 2)
+ if(usr.stat == DEAD)
return //won't work if dead
if(!isnull(aiPDA))
aiPDA.toff = !aiPDA.toff
@@ -900,7 +900,7 @@ GLOBAL_LIST_EMPTY(PDAs)
/mob/living/silicon/ai/verb/cmd_toggle_pda_silent()
set category = "AI Commands"
set name = "PDA - Toggle Ringer"
- if(usr.stat == 2)
+ if(usr.stat == DEAD)
return //won't work if dead
if(!isnull(aiPDA))
//0
@@ -910,7 +910,7 @@ GLOBAL_LIST_EMPTY(PDAs)
to_chat(usr, "You do not have a PDA. You should make an issue report about this.")
/mob/living/silicon/ai/proc/cmd_show_message_log(mob/user)
- if(user.stat == 2)
+ if(user.stat == DEAD)
return //won't work if dead
if(!isnull(aiPDA))
var/HTML = "
AI PDA Message Log[aiPDA.tnote]"
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index a0616a00755..c19e3eec923 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -426,7 +426,7 @@
signal.frequency = freqnum // Quick frequency set
for(var/obj/machinery/telecomms/receiver/R in GLOB.telecomms_list)
R.receive_signal(signal)
-
+
// Allinone can act as receivers. (Unless of course whoever coded this last time forgot to put it in somewhere!)
for(var/obj/machinery/telecomms/allinone/R in GLOB.telecomms_list)
R.receive_signal(signal)
@@ -449,6 +449,8 @@
return
if(broadcasting)
if(get_dist(src, speaker) <= canhear_range)
+ if(message_mode == MODE_WHISPER || message_mode == MODE_WHISPER_CRIT)
+ raw_message = stars(raw_message)
talk_into(speaker, raw_message, , spans, language=message_language)
/*
/obj/item/device/radio/proc/accept_rad(obj/item/device/radio/R as obj, message)
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 845ce5b1b20..1d20d9ae106 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -113,7 +113,7 @@ MASS SPECTROMETER
var/tox_loss = M.getToxLoss()
var/fire_loss = M.getFireLoss()
var/brute_loss = M.getBruteLoss()
- var/mob_status = (M.stat > 1 ? "Deceased" : "[round(M.health/M.maxHealth,0.01)*100] % healthy")
+ var/mob_status = (M.stat == DEAD ? "Deceased" : "[round(M.health/M.maxHealth,0.01)*100] % healthy")
if(M.status_flags & FAKEDEATH)
mob_status = "Deceased"
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 92da7f52e78..02d835da16d 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -18,7 +18,7 @@
/obj/item/stack/medical/attack(mob/living/M, mob/user)
- if(M.stat == 2)
+ if(M.stat == DEAD)
var/t_him = "it"
if(M.gender == MALE)
t_him = "him"
diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm
index b46b4f10356..758c7c94552 100644
--- a/code/game/objects/items/teleportation.dm
+++ b/code/game/objects/items/teleportation.dm
@@ -89,7 +89,7 @@ Frequency:
continue
else
var/mob/M = W.loc
- if (M.stat == 2)
+ if (M.stat == DEAD)
if (M.timeofdeath + 6000 < world.time)
continue
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 63d0676ca7f..d75235fbf43 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -389,7 +389,7 @@
for(var/datum/mind/N in SSticker.mode.syndicates)
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW |
"
else
@@ -418,20 +418,20 @@
dat += "| [N.name]([N.key])Head Revolutionary body destroyed! | "
dat += "PM |
"
else
- dat += "| [M.real_name] (Leader)[M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name] (Leader)[M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW |
"
for(var/datum/mind/N in SSticker.mode.revolutionaries)
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW |
"
dat += "| Target(s) | | Location |
"
for(var/datum/mind/N in SSticker.mode.get_living_heads())
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW | "
var/turf/mob_loc = get_turf(M)
@@ -440,12 +440,13 @@
dat += "
| [N.name]([N.key])Head body destroyed! | "
dat += "PM |
"
dat += "
"
+
if(SSticker.mode.changelings.len > 0)
dat += "
| Changelings | | |
"
for(var/datum/mind/changeling in SSticker.mode.changelings)
var/mob/M = changeling.current
if(M)
- dat += "| [M.mind.changeling.changelingID] as [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.mind.changeling.changelingID] as [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW | "
dat += "Show Objective |
"
@@ -459,7 +460,7 @@
for(var/datum/mind/wizard in SSticker.mode.wizards)
var/mob/M = wizard.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW | "
dat += "Show Objective |
"
@@ -473,7 +474,7 @@
for(var/datum/mind/apprentice in SSticker.mode.apprentices)
var/mob/M = apprentice.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW | "
dat += "Show Objective |
"
@@ -487,7 +488,7 @@
for(var/datum/mind/N in SSticker.mode.cult)
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][N.has_antag_datum(ANTAG_DATUM_CULT_MASTER) ? " \[Master\]" : ""][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][N.has_antag_datum(ANTAG_DATUM_CULT_MASTER) ? " \[Master\]" : ""][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW |
"
dat += "
"
@@ -497,7 +498,7 @@
for(var/datum/mind/N in SSticker.mode.servants_of_ratvar)
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (ghost)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (ghost)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW |
"
dat += ""
@@ -507,7 +508,7 @@
for(var/datum/mind/traitor in SSticker.mode.traitors)
var/mob/M = traitor.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW | "
dat += "Show Objective |
"
@@ -521,7 +522,7 @@
for(var/datum/mind/abductor in SSticker.mode.abductors)
var/mob/M = abductor.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW | "
dat += "Show Objective |
"
@@ -534,7 +535,7 @@
for(var/datum/mind/abductee in E.abductee_minds)
var/mob/M = abductee.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW | "
dat += "Show Objective |
"
@@ -550,7 +551,7 @@
var/mob/M = devil.current
var/datum/antagonist/devil/devilinfo = devil.has_antag_datum(ANTAG_DATUM_DEVIL)
if(M)
- dat += "| [M.real_name] : [devilinfo.truename][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name] : [devilinfo.truename][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "Show Objective |
"
dat += "Show all devil info | "
@@ -565,7 +566,7 @@
var/datum/mind/sintouched = X
var/mob/M = sintouched.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "Show Objective |
"
else
@@ -587,7 +588,7 @@
for(var/datum/mind/blob in blob_minds)
var/mob/M = blob.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW |
"
else
@@ -603,7 +604,7 @@
for(var/datum/mind/eek in mode.ape_infectees)
var/mob/M = eek.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "
| [M.real_name][M.client ? "" : " (No Client)"][M.stat == DEAD ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "FLW |
"
else
diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm
index 07c70f1270e..69d80db2b38 100644
--- a/code/modules/admin/secrets.dm
+++ b/code/modules/admin/secrets.dm
@@ -335,7 +335,7 @@
SSblackbox.add_details("admin_secrets_fun_used","Traitor All ([objective])")
for(var/mob/living/H in GLOB.player_list)
if(!(ishuman(H)||istype(H, /mob/living/silicon/))) continue
- if(H.stat == 2 || !H.client || !H.mind || ispAI(H)) continue
+ if(H.stat == DEAD || !H.client || !H.mind || ispAI(H)) continue
if(is_special_character(H)) continue
H.mind.add_antag_datum(ANTAG_DATUM_TRAITOR_CUSTOM)
var/datum/antagonist/traitor/traitordatum = H.mind.has_antag_datum(ANTAG_DATUM_TRAITOR) //original datum self deletes
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 85788e8c169..c77fcc52c09 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1597,11 +1597,13 @@
var/mob/living/L = M
var/status
switch (M.stat)
- if (0)
+ if(CONSCIOUS)
status = "Alive"
- if (1)
- status = "Unconscious"
- if (2)
+ if(SOFT_CRIT)
+ status = "Dying"
+ if(UNCONSCIOUS)
+ status = "[L.InCritical() ? "Unconscious and Dying" : "Unconscious"]"
+ if(DEAD)
status = "Dead"
health_description = "Status = [status]"
health_description += "
Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()] - Stamina: [L.getStaminaLoss()]"
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index d1645919c4f..b675815602c 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -77,4 +77,3 @@ GLOBAL_VAR_INIT(highlander, FALSE)
to_chat(src, "Your [H1.name] cries out for blood. Claim the lives of others, and your own will be restored!\n\
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.")
-
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
index bb5c304074c..94770a45686 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm
@@ -303,30 +303,46 @@
/obj/machinery/atmospherics/components/unary/cryo_cell/ui_data()
var/list/data = list()
data["isOperating"] = on
- data["hasOccupant"] = occupant ? 1 : 0
+ data["hasOccupant"] = occupant ? TRUE : FALSE
data["isOpen"] = state_open
data["autoEject"] = autoeject
- var/list/occupantData = list()
+ data["occupant"] = list()
if(occupant)
var/mob/living/mob_occupant = occupant
- occupantData["name"] = mob_occupant.name
- occupantData["stat"] = mob_occupant.stat
- occupantData["health"] = mob_occupant.health
- occupantData["maxHealth"] = mob_occupant.maxHealth
- occupantData["minHealth"] = HEALTH_THRESHOLD_DEAD
- occupantData["bruteLoss"] = mob_occupant.getBruteLoss()
- occupantData["oxyLoss"] = mob_occupant.getOxyLoss()
- occupantData["toxLoss"] = mob_occupant.getToxLoss()
- occupantData["fireLoss"] = mob_occupant.getFireLoss()
- occupantData["bodyTemperature"] = mob_occupant.bodytemperature
- data["occupant"] = occupantData
-
+ data["occupant"]["name"] = mob_occupant.name
+ switch(mob_occupant.stat)
+ if(CONSCIOUS)
+ data["occupant"]["stat"] = "Conscious"
+ data["occupant"]["statstate"] = "good"
+ if(SOFT_CRIT)
+ data["occupant"]["stat"] = "Conscious"
+ data["occupant"]["statstate"] = "average"
+ if(UNCONSCIOUS)
+ data["occupant"]["stat"] = "Unconscious"
+ data["occupant"]["statstate"] = "average"
+ if(DEAD)
+ data["occupant"]["stat"] = "Dead"
+ data["occupant"]["statstate"] = "bad"
+ data["occupant"]["health"] = round(mob_occupant.health, 1)
+ data["occupant"]["maxHealth"] = mob_occupant.maxHealth
+ data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD
+ data["occupant"]["bruteLoss"] = round(mob_occupant.getBruteLoss(), 1)
+ data["occupant"]["oxyLoss"] = round(mob_occupant.getOxyLoss(), 1)
+ data["occupant"]["toxLoss"] = round(mob_occupant.getToxLoss(), 1)
+ data["occupant"]["fireLoss"] = round(mob_occupant.getFireLoss(), 1)
+ data["occupant"]["bodyTemperature"] = round(mob_occupant.bodytemperature, 1)
+ if(mob_occupant.bodytemperature < 225)
+ data["occupant"]["temperaturestatus"] = "good"
+ else if(mob_occupant.bodytemperature < 273.15)
+ data["occupant"]["temperaturestatus"] = "average"
+ else
+ data["occupant"]["temperaturestatus"] = "bad"
var/datum/gas_mixture/air1 = AIR1
- data["cellTemperature"] = round(air1.temperature)
+ data["cellTemperature"] = round(air1.temperature, 1)
- data["isBeakerLoaded"] = beaker ? 1 : 0
+ data["isBeakerLoaded"] = beaker ? TRUE : FALSE
var beakerContents = list()
if(beaker && beaker.reagents && beaker.reagents.reagent_list.len)
for(var/datum/reagent/R in beaker.reagents.reagent_list)
diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm
index e79d27f7914..4a103e03fa2 100644
--- a/code/modules/events/ion_storm.dm
+++ b/code/modules/events/ion_storm.dm
@@ -34,7 +34,7 @@
//AI laws
for(var/mob/living/silicon/ai/M in GLOB.living_mob_list)
M.laws_sanity_check()
- if(M.stat != 2 && M.see_in_dark != 0)
+ if(M.stat != DEAD && M.see_in_dark != 0)
if(prob(replaceLawsetChance))
M.laws.pick_weighted_lawset()
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 5218c29c44f..3c332b950c6 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -72,7 +72,7 @@
break
else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key
for(var/mob/M in GLOB.player_list)
- if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == 2 && !M.suiciding)
+ if(mind && M.mind && ckey(M.mind.key) == ckey(mind.key) && M.ckey && M.client && M.stat == DEAD && !M.suiciding)
if(isobserver(M))
var/mob/dead/observer/O = M
if(!O.can_reenter_corpse)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 94ce9f04a67..f34b0633c38 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -604,50 +604,94 @@
if(!client)
return
- if(stat == UNCONSCIOUS && health <= HEALTH_THRESHOLD_CRIT)
+ if(health <= HEALTH_THRESHOLD_CRIT)
var/severity = 0
switch(health)
- if(-20 to -10) severity = 1
- if(-30 to -20) severity = 2
- if(-40 to -30) severity = 3
- if(-50 to -40) severity = 4
- if(-60 to -50) severity = 5
- if(-70 to -60) severity = 6
- if(-80 to -70) severity = 7
- if(-90 to -80) severity = 8
- if(-95 to -90) severity = 9
- if(-INFINITY to -95) severity = 10
+ if(-20 to -10)
+ severity = 1
+ if(-30 to -20)
+ severity = 2
+ if(-40 to -30)
+ severity = 3
+ if(-50 to -40)
+ severity = 4
+ if(-50 to -40)
+ severity = 5
+ if(-60 to -50)
+ severity = 6
+ if(-70 to -60)
+ severity = 7
+ if(-90 to -70)
+ severity = 8
+ if(-95 to -90)
+ severity = 9
+ if(-INFINITY to -95)
+ severity = 10
+ if(!InFullCritical())
+ var/visionseverity = 4
+ switch(health)
+ if(-8 to -4)
+ visionseverity = 5
+ if(-12 to -8)
+ visionseverity = 6
+ if(-16 to -12)
+ visionseverity = 7
+ if(-20 to -16)
+ visionseverity = 8
+ if(-24 to -20)
+ visionseverity = 9
+ if(-INFINITY to -24)
+ visionseverity = 10
+ overlay_fullscreen("critvision", /obj/screen/fullscreen/crit/vision, visionseverity)
+ else
+ clear_fullscreen("critvision")
overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity)
else
clear_fullscreen("crit")
- if(oxyloss)
- var/severity = 0
- switch(oxyloss)
- if(10 to 20) severity = 1
- if(20 to 25) severity = 2
- if(25 to 30) severity = 3
- if(30 to 35) severity = 4
- if(35 to 40) severity = 5
- if(40 to 45) severity = 6
- if(45 to INFINITY) severity = 7
- overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity)
- else
- clear_fullscreen("oxy")
+ clear_fullscreen("critvision")
- //Fire and Brute damage overlay (BSSR)
- var/hurtdamage = getBruteLoss() + getFireLoss() + damageoverlaytemp
- if(hurtdamage)
- var/severity = 0
- switch(hurtdamage)
- if(5 to 15) severity = 1
- if(15 to 30) severity = 2
- if(30 to 45) severity = 3
- if(45 to 70) severity = 4
- if(70 to 85) severity = 5
- if(85 to INFINITY) severity = 6
- overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity)
- else
- clear_fullscreen("brute")
+ //Oxygen damage overlay
+ if(oxyloss)
+ var/severity = 0
+ switch(oxyloss)
+ if(10 to 20)
+ severity = 1
+ if(20 to 25)
+ severity = 2
+ if(25 to 30)
+ severity = 3
+ if(30 to 35)
+ severity = 4
+ if(35 to 40)
+ severity = 5
+ if(40 to 45)
+ severity = 6
+ if(45 to INFINITY)
+ severity = 7
+ overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity)
+ else
+ clear_fullscreen("oxy")
+
+ //Fire and Brute damage overlay (BSSR)
+ var/hurtdamage = getBruteLoss() + getFireLoss() + damageoverlaytemp
+ if(hurtdamage)
+ var/severity = 0
+ switch(hurtdamage)
+ if(5 to 15)
+ severity = 1
+ if(15 to 30)
+ severity = 2
+ if(30 to 45)
+ severity = 3
+ if(45 to 70)
+ severity = 4
+ if(70 to 85)
+ severity = 5
+ if(85 to INFINITY)
+ severity = 6
+ overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity)
+ else
+ clear_fullscreen("brute")
/mob/living/carbon/update_health_hud(shown_health_amount)
if(!client || !hud_used)
@@ -682,20 +726,19 @@
if(status_flags & GODMODE)
return
if(stat != DEAD)
- if(health<= HEALTH_THRESHOLD_DEAD)
+ if(health <= HEALTH_THRESHOLD_DEAD)
death()
return
- if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= HEALTH_THRESHOLD_CRIT)
- if(stat == CONSCIOUS)
- stat = UNCONSCIOUS
- blind_eyes(1)
- update_canmove()
+ if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= HEALTH_THRESHOLD_FULLCRIT)
+ stat = UNCONSCIOUS
+ blind_eyes(1)
else
- if(stat == UNCONSCIOUS)
+ if(health <= HEALTH_THRESHOLD_CRIT)
+ stat = SOFT_CRIT
+ else
stat = CONSCIOUS
- resting = 0
- adjust_blindness(-1)
- update_canmove()
+ adjust_blindness(-1)
+ update_canmove()
update_damage_hud()
update_health_hud()
med_hud_set_status()
diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm
index 70ec78092dd..2bacece28d7 100644
--- a/code/modules/mob/living/carbon/carbon_movement.dm
+++ b/code/modules/mob/living/carbon/carbon_movement.dm
@@ -1,10 +1,8 @@
/mob/living/carbon/movement_delay()
- var/FP
- if(iscarbon(src))
- var/mob/living/carbon/C = src
- var/obj/item/device/flightpack/F = C.get_flightpack()
- if(istype(F) && F.flight)
- FP = 1
+ var/FP = FALSE
+ var/obj/item/device/flightpack/F = get_flightpack()
+ if(istype(F) && F.flight)
+ FP = TRUE
. = ..(FP)
if(!FP)
. += grab_state * 1 //Flightpacks are too powerful to be slowed too much by the weight of a corpse.
diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm
index 600a50e5952..e7fe862b1ed 100644
--- a/code/modules/mob/living/carbon/examine.dm
+++ b/code/modules/mob/living/carbon/examine.dm
@@ -79,6 +79,8 @@
if(!appears_dead)
if(stat == UNCONSCIOUS)
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n"
+ else if(InCritical())
+ msg += "[t_His] breathing is shallow and labored.\n"
if(digitalcamo)
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner.\n"
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 1c44c96d640..b5f8ab7c815 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -105,9 +105,6 @@
/mob/living/carbon/human/IsAdvancedToolUser()
return 1//Humans can use guns and such
-/mob/living/carbon/human/InCritical()
- return (health <= HEALTH_THRESHOLD_CRIT && stat == UNCONSCIOUS)
-
/mob/living/carbon/human/reagent_check(datum/reagent/R)
return dna.species.handle_chemicals(R,src)
// if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species.
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 39f4f995832..d142a23a18c 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1036,6 +1036,8 @@
. += (1.5 - flight)
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
. += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
+ if(H.stat == SOFT_CRIT)
+ . = max(SOFTCRIT_MIN_SLOWDOWN, . + SOFTCRIT_ADD_SLOWDOWN) //regardless of how fast you are, you move at a maximum of SOFTCRIT_MIN_SLOWDOWN while in softcrit
return .
//////////////////
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 75aec807c5b..70477e234dd 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -229,8 +229,8 @@
/mob/living/verb/succumb(whispered as null)
set hidden = 1
if (InCritical())
- src.log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] with [round(health, 0.1)] points of health!", INDIVIDUAL_ATTACK_LOG)
- src.adjustOxyLoss(src.health - HEALTH_THRESHOLD_DEAD)
+ log_message("Has [whispered ? "whispered his final words" : "succumbed to death"] while in [InFullCritical() ? "hard":"soft"] critical with [round(health, 0.1)] points of health!", INDIVIDUAL_ATTACK_LOG)
+ adjustOxyLoss(health - HEALTH_THRESHOLD_DEAD)
updatehealth()
if(!whispered)
to_chat(src, "You have given up life and succumbed to death.")
@@ -241,7 +241,10 @@
return 1
/mob/living/proc/InCritical()
- return (health < HEALTH_THRESHOLD_CRIT && health > HEALTH_THRESHOLD_DEAD && stat == UNCONSCIOUS)
+ return (health <= HEALTH_THRESHOLD_CRIT && (stat == SOFT_CRIT || stat == UNCONSCIOUS))
+
+/mob/living/proc/InFullCritical()
+ return (health <= HEALTH_THRESHOLD_FULLCRIT && stat == UNCONSCIOUS)
//This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually
//affects them once clothing is factored in. ~Errorage
@@ -471,31 +474,31 @@
if(MOVE_INTENT_WALK)
. += config.walk_speed
-/mob/living/proc/makeTrail(turf/T)
+/mob/living/proc/makeTrail(turf/target_turf)
if(!has_gravity())
return
- var/blood_exists = 0
+ var/blood_exists = FALSE
- for(var/obj/effect/decal/cleanable/trail_holder/C in src.loc) //checks for blood splatter already on the floor
- blood_exists = 1
- if (isturf(src.loc))
+ for(var/obj/effect/decal/cleanable/trail_holder/C in loc) //checks for blood splatter already on the floor
+ blood_exists = TRUE
+ if(isturf(loc))
var/trail_type = getTrail()
if(trail_type)
- var/brute_ratio = round(getBruteLoss()/maxHealth, 0.1)
+ var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1)
if(blood_volume && blood_volume > max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold
blood_volume = max(blood_volume - max(1, brute_ratio * 2), 0) //that depends on our brute damage.
- var/newdir = get_dir(T, src.loc)
- if(newdir != src.dir)
- newdir = newdir | src.dir
+ var/newdir = get_dir(target_turf, loc)
+ if(newdir != dir)
+ newdir = newdir | dir
if(newdir == 3) //N + S
newdir = NORTH
else if(newdir == 12) //E + W
newdir = EAST
if((newdir in GLOB.cardinals) && (prob(50)))
- newdir = turn(get_dir(T, src.loc), 180)
+ newdir = turn(get_dir(target_turf, loc), 180)
if(!blood_exists)
- new /obj/effect/decal/cleanable/trail_holder(src.loc)
- for(var/obj/effect/decal/cleanable/trail_holder/TH in src.loc)
+ new /obj/effect/decal/cleanable/trail_holder(loc)
+ for(var/obj/effect/decal/cleanable/trail_holder/TH in loc)
if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled)
TH.existing_dirs += newdir
TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir))
@@ -940,13 +943,14 @@
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
//Robots, animals and brains have their own version so don't worry about them
/mob/living/proc/update_canmove()
- var/ko = IsKnockdown() || IsUnconscious() || stat || (status_flags & FAKEDEATH)
+ var/ko = IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (status_flags & FAKEDEATH)
+ var/move_and_fall = stat == SOFT_CRIT && !pulledby
var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK
var/buckle_lying = !(buckled && !buckled.buckle_lying)
var/has_legs = get_num_legs()
var/has_arms = get_num_arms()
var/ignore_legs = get_leg_ignore()
- if(ko || resting || has_status_effect(STATUS_EFFECT_STUN) || chokehold)
+ if(ko || resting || move_and_fall || IsStun() || chokehold)
drop_all_held_items()
unset_machine()
if(pulling)
@@ -958,7 +962,7 @@
else if(!lying)
if(resting)
fall()
- else if(ko || (!has_legs && !ignore_legs) || chokehold)
+ else if(ko || move_and_fall || (!has_legs && !ignore_legs) || chokehold)
fall(forced = 1)
canmove = !(ko || resting || has_status_effect(STATUS_EFFECT_STUN) || has_status_effect(/datum/status_effect/freon) || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms))
density = !lying
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 5c47a35ea62..6f084f3c81e 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -145,11 +145,12 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/succumbed = FALSE
- if(message_mode == MODE_WHISPER)
+ var/fullcrit = InFullCritical()
+ if((InCritical() && !fullcrit) || message_mode == MODE_WHISPER)
message_range = 1
- spans |= SPAN_ITALICS
+ message_mode = MODE_WHISPER
log_talk(src,"[key_name(src)] : [message]",LOGWHISPER)
- if(in_critical)
+ if(fullcrit)
var/health_diff = round(-HEALTH_THRESHOLD_DEAD + health)
// If we cut our message short, abruptly end it with a-..
var/message_len = length(message)
@@ -165,7 +166,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
if(!message)
return
- spans += get_spans()
+ spans |= get_spans()
if(language)
var/datum/language/L = GLOB.language_datum_instances[language]
@@ -296,10 +297,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
/mob/living/proc/get_message_mode(message)
var/key = copytext(message, 1, 2)
- if(key == ";")
- return MODE_HEADSET
- else if(key == "#")
+ if(key == "#")
return MODE_WHISPER
+ else if(key == ";")
+ return MODE_HEADSET
else if(length(message) > 2 && (key in GLOB.department_radio_prefixes))
var/key_symbol = lowertext(copytext(message, 2, 3))
return GLOB.department_radio_keys[key_symbol]
@@ -385,6 +386,8 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
/mob/living/proc/radio(message, message_mode, list/spans, language)
switch(message_mode)
+ if(MODE_WHISPER)
+ return ITALICS
if(MODE_R_HAND)
for(var/obj/item/r_hand in get_held_items_for_side("r", all = TRUE))
if (r_hand)
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 35c107b5322..ea3e274e91e 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -465,7 +465,7 @@
set category = "AI Commands"
set name = "Access Robot Control"
set desc = "Wirelessly control various automatic robots."
- if(stat == 2)
+ if(stat == DEAD)
return //won't work if dead
if(control_disabled)
@@ -522,7 +522,7 @@
/mob/living/silicon/ai/triggerAlarm(class, area/A, O, obj/alarmsource)
if(alarmsource.z != z)
return
- if (stat == 2)
+ if (stat == DEAD)
return 1
var/list/L = alarms[class]
for (var/I in L)
@@ -585,7 +585,7 @@
cameraFollow = null
var/cameralist[0]
- if(stat == 2)
+ if(stat == DEAD)
return //won't work if dead
var/mob/living/silicon/ai/U = usr
@@ -629,7 +629,7 @@
set category = "AI Commands"
set name = "AI Status"
- if(stat == 2)
+ if(stat == DEAD)
return //won't work if dead
var/list/ai_emotions = list("Very Happy", "Happy", "Neutral", "Unsure", "Confused", "Sad", "BSOD", "Blank", "Problems?", "Awesome", "Facepalm", "Friend Computer", "Dorfy", "Blue Glow", "Red Glow")
var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions
@@ -652,7 +652,7 @@
set desc = "Change the default hologram available to AI to something else."
set category = "AI Commands"
- if(stat == 2)
+ if(stat == DEAD)
return //won't work if dead
var/input
switch(alert("Would you like to select a hologram based on a crew member, an animal, or switch to a unique avatar?",,"Crew Member","Unique","Animal"))
@@ -774,7 +774,7 @@
set desc = "Allows you to change settings of your radio."
set category = "AI Commands"
- if(stat == 2)
+ if(stat == DEAD)
return //won't work if dead
to_chat(src, "Accessing Subspace Transceiver control...")
@@ -790,7 +790,7 @@
set desc = "Modify the default radio setting for your automatic announcements."
set category = "AI Commands"
- if(stat == 2)
+ if(stat == DEAD)
return //won't work if dead
set_autosay()
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index 0613cacb47b..2c7d81179ce 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -106,7 +106,7 @@
set category = "AI Commands"
set name = "Toggle Camera Acceleration"
- if(usr.stat == 2)
+ if(usr.stat == DEAD)
return //won't work if dead
acceleration = !acceleration
to_chat(usr, "Camera acceleration has been toggled [acceleration ? "on" : "off"].")
diff --git a/code/modules/mob/living/silicon/ai/laws.dm b/code/modules/mob/living/silicon/ai/laws.dm
index 0e35f5213d8..647aeb7e47c 100644
--- a/code/modules/mob/living/silicon/ai/laws.dm
+++ b/code/modules/mob/living/silicon/ai/laws.dm
@@ -2,7 +2,7 @@
/mob/living/silicon/ai/proc/show_laws_verb()
set category = "AI Commands"
set name = "Show Laws"
- if(usr.stat == 2)
+ if(usr.stat == DEAD)
return //won't work if dead
src.show_laws()
diff --git a/code/modules/mob/living/silicon/ai/say.dm b/code/modules/mob/living/silicon/ai/say.dm
index f0e079b5943..02053681ae5 100644
--- a/code/modules/mob/living/silicon/ai/say.dm
+++ b/code/modules/mob/living/silicon/ai/say.dm
@@ -1,5 +1,5 @@
/mob/living/silicon/ai/say(message, language)
- if(parent && istype(parent) && parent.stat != 2) //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead.
+ if(parent && istype(parent) && parent.stat != DEAD) //If there is a defined "parent" AI, it is actually an AI, and it is alive, anything the AI tries to say is said by the parent instead.
parent.say(message, language)
return
..(message)
@@ -71,7 +71,7 @@
set desc = "Display a list of vocal words to announce to the crew."
set category = "AI Commands"
- if(usr.stat == 2)
+ if(usr.stat == DEAD)
return //won't work if dead
var/dat = "Here is a list of words you can type into the 'Announcement' button to create sentences to vocally announce to everyone on the same level at you.
\
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index 97ac300f8ef..acb74b6372f 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -32,7 +32,7 @@
if(temp)
left_part = temp
- else if(src.stat == 2) // Show some flavor text if the pAI is dead
+ else if(src.stat == DEAD) // Show some flavor text if the pAI is dead
left_part = "�Rr�R �a�� ��Rr����o�"
right_part = "Program index hash not found
"
diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
index 0cfa4629351..a83f7011598 100644
--- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm
@@ -464,7 +464,7 @@ Auto Patrol[]"},
new /obj/effect/temp_visual/emp(loc)
var/list/mob/living/carbon/targets = new
for(var/mob/living/carbon/C in view(12,src))
- if(C.stat==2)
+ if(C.stat==DEAD)
continue
targets += C
if(targets.len)
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 7bbb36e11a8..7b7334befce 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -250,7 +250,7 @@
oldpatient = user
/mob/living/simple_animal/bot/medbot/process_scan(mob/living/carbon/human/H)
- if(H.stat == 2)
+ if(H.stat == DEAD)
return
if((H == oldpatient) && (world.time < last_found + 200))
diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
index 154afc47bc9..cc81367196e 100644
--- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
+++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm
@@ -2,7 +2,7 @@
name = "A Perfectly Generic Boss Placeholder"
desc = ""
robust_searching = 1
- stat_attack = 1
+ stat_attack = UNCONSCIOUS
status_flags = 0
a_intent = INTENT_HARM
gender = NEUTER
diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm
index 165b7f4ec65..3f5f4f5676c 100644
--- a/code/modules/mob/living/simple_animal/hostile/faithless.dm
+++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm
@@ -15,7 +15,7 @@
speed = 0
maxHealth = 80
health = 80
- stat_attack = 1
+ stat_attack = UNCONSCIOUS
robust_searching = 1
harm_intent_damage = 10
diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
index 8d192ab8ed4..2f1fdbc1d2d 100644
--- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm
+++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm
@@ -15,7 +15,7 @@
attack_sound = 'sound/weapons/bite.ogg'
faction = list("creature")
robust_searching = 1
- stat_attack = 2
+ stat_attack = DEAD
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
speak_emote = list("squeaks")
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 0404b44b8aa..cb3b6a3aef8 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -43,8 +43,8 @@
var/search_objects_timer_id //Timer for regaining our old search_objects value after being attacked
var/search_objects_regain_time = 30 //the delay between being attacked and gaining our old search_objects value back
var/list/wanted_objects = list() //A typecache of objects types that will be checked against to attack, should we have search_objects enabled
- var/stat_attack = 0 //Mobs with stat_attack to 1 will attempt to attack things that are unconscious, Mobs with stat_attack set to 2 will attempt to attack the dead.
- var/stat_exclusive = 0 //Mobs with this set to 1 will exclusively attack things defined by stat_attack, stat_attack 2 means they will only attack corpses
+ var/stat_attack = CONSCIOUS //Mobs with stat_attack to UNCONSCIOUS will attempt to attack things that are unconscious, Mobs with stat_attack set to DEAD will attempt to attack the dead.
+ var/stat_exclusive = FALSE //Mobs with this set to TRUE will exclusively attack things defined by stat_attack, stat_attack DEAD means they will only attack corpses
var/attack_same = 0 //Set us to 1 to allow us to attack our own faction, or 2, to only ever attack our own faction
var/AIStatus = AI_ON //The Status of our AI, can be set to AI_ON (On, usual processing), AI_IDLE (Will not process, but will return to AI_ON if an enemy comes near), AI_OFF (Off, Not processing ever)
var/atom/targets_from = null //all range/attack/etc. calculations should be done from this atom, defaults to the mob itself, useful for Vehicles and such
@@ -171,7 +171,7 @@
var/mob/living/L = the_target
var/faction_check = faction_check_mob(L)
if(robust_searching)
- if(L.stat > stat_attack || L.stat != stat_attack && stat_exclusive == 1)
+ if(L.stat > stat_attack || L.stat != stat_attack && stat_exclusive)
return 0
if(faction_check && !attack_same || !faction_check && attack_same == 2)
return 0
diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
index 491aca3233a..de8545d3f06 100644
--- a/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
+++ b/code/modules/mob/living/simple_animal/hostile/jungle/leaper.dm
@@ -19,7 +19,7 @@
pixel_x = -16
layer = LARGE_MOB_LAYER
speed = 10
- stat_attack = 1
+ stat_attack = UNCONSCIOUS
robust_searching = 1
var/hopping = FALSE
var/hop_cooldown = 0 //Strictly for player controlled leapers
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
index c214ee04901..02ca4a4e26e 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -16,7 +16,7 @@
movement_type = FLYING
robust_searching = 1
ranged_ignores_vision = TRUE
- stat_attack = 2
+ stat_attack = DEAD
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
damage_coeff = list(BRUTE = 1, BURN = 0.5, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
minbodytemp = 0
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index c13b63115da..3352c52b572 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -174,7 +174,7 @@
//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/advanced
- stat_attack = 2
+ stat_attack = DEAD
maxHealth = 120
health = 120
brood_type = /mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
@@ -184,7 +184,7 @@
icon_dead = "dwarf_legion"
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/advanced
- stat_attack = 2
+ stat_attack = DEAD
can_infest_dead = TRUE
//Legion that spawns Legions
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index e51c4d3f298..ba2a0f37020 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -21,7 +21,7 @@
attack_sound = 'sound/weapons/bite.ogg'
faction = list("mushroom")
environment_smash = ENVIRONMENT_SMASH_NONE
- stat_attack = 2
+ stat_attack = DEAD
mouse_opacity = MOUSE_OPACITY_ICON
speed = 1
ventcrawler = VENTCRAWLER_ALWAYS
diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
index de69f623bd8..0d4021400cc 100644
--- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
+++ b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm
@@ -12,7 +12,7 @@
response_disarm = "shoves"
response_harm = "hits"
speed = 0
- stat_attack = 1
+ stat_attack = UNCONSCIOUS
robust_searching = 1
maxHealth = 100
health = 100
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
index 96d90874596..d6d46b1a462 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/spaceman.dm
@@ -36,7 +36,7 @@
response_disarm = "shoves"
response_harm = "hits"
speed = 0
- stat_attack = 1
+ stat_attack = UNCONSCIOUS
robust_searching = 1
vision_range = 3
maxHealth = 100
diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
index f2f4cd7d0bb..3a3cfbb27d3 100644
--- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm
@@ -24,7 +24,7 @@
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 10
robust_searching = 1
- stat_attack = 1
+ stat_attack = UNCONSCIOUS
gold_core_spawnable = 1
faction = list("skeleton")
see_in_dark = 8
diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm
index 23921ed1f56..fd66b8d0ae0 100644
--- a/code/modules/mob/living/simple_animal/hostile/stickman.dm
+++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm
@@ -12,7 +12,7 @@
response_disarm = "shoves"
response_harm = "hits"
speed = 0
- stat_attack = 1
+ stat_attack = UNCONSCIOUS
robust_searching = 1
environment_smash = ENVIRONMENT_SMASH_NONE
maxHealth = 100
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index ef109758e81..7cadba01d90 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -23,7 +23,7 @@
response_disarm = "shoves"
response_harm = "hits"
speed = 0
- stat_attack = 1
+ stat_attack = UNCONSCIOUS
robust_searching = 1
maxHealth = 100
health = 100
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index a5522071274..ad4fb0f718a 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -437,7 +437,7 @@
if (!( GLOB.abandon_allowed ))
return
- if ((stat != 2 || !( SSticker )))
+ if ((stat != DEAD || !( SSticker )))
to_chat(usr, "You must be dead to use this!")
return
diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm
index bd938cf5980..80ab6929d56 100644
--- a/code/modules/mob/status_procs.dm
+++ b/code/modules/mob/status_procs.dm
@@ -146,7 +146,7 @@
var/old_eye_blind = eye_blind
eye_blind = max(eye_blind, amount)
if(!old_eye_blind)
- if(stat == CONSCIOUS)
+ if(stat == CONSCIOUS || stat == SOFT_CRIT)
throw_alert("blind", /obj/screen/alert/blind)
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
@@ -155,12 +155,12 @@
var/old_eye_blind = eye_blind
eye_blind += amount
if(!old_eye_blind)
- if(stat == CONSCIOUS)
+ if(stat == CONSCIOUS || stat == SOFT_CRIT)
throw_alert("blind", /obj/screen/alert/blind)
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
else if(eye_blind)
var/blind_minimum = 0
- if(stat != CONSCIOUS || (disabilities & BLIND))
+ if((stat != CONSCIOUS && stat != SOFT_CRIT) || (disabilities & BLIND))
blind_minimum = 1
eye_blind = max(eye_blind+amount, blind_minimum)
if(!eye_blind)
@@ -172,12 +172,12 @@
var/old_eye_blind = eye_blind
eye_blind = amount
if(client && !old_eye_blind)
- if(stat == CONSCIOUS)
+ if(stat == CONSCIOUS || stat == SOFT_CRIT)
throw_alert("blind", /obj/screen/alert/blind)
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
else if(eye_blind)
var/blind_minimum = 0
- if(stat != CONSCIOUS || (disabilities & BLIND))
+ if((stat != CONSCIOUS && stat != SOFT_CRIT) || (disabilities & BLIND))
blind_minimum = 1
eye_blind = blind_minimum
if(!eye_blind)
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 4fbfcd6dc83..f936d365d81 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -97,7 +97,7 @@
H.update_damage_hud()
return
var/n_name = stripped_input(usr, "What would you like to label the paper?", "Paper Labelling", null, MAX_NAME_LEN)
- if((loc == usr && usr.stat == 0))
+ if((loc == usr && usr.stat == CONSCIOUS))
name = "paper[(n_name ? text("- '[n_name]'") : null)]"
add_fingerprint(usr)
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 57da0358903..1cb8295df30 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -47,7 +47,7 @@
if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
var/txt = sanitize(input(user, "What would you like to write on the back?", "Photo Writing", null) as text)
txt = copytext(txt, 1, 128)
- if(loc == user && user.stat == 0)
+ if(loc == user && user.stat == CONSCIOUS)
scribble = txt
..()
@@ -78,7 +78,7 @@
var/n_name = copytext(sanitize(input(usr, "What would you like to label the photo?", "Photo Labelling", null) as text), 1, MAX_NAME_LEN)
//loc.loc check is for making possible renaming photos in clipboards
- if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == 0 && usr.canmove && !usr.restrained())
+ if((loc == usr || loc.loc && loc.loc == usr) && usr.stat == CONSCIOUS && usr.canmove && !usr.restrained())
name = "photo[(n_name ? text("- '[n_name]'") : null)]"
add_fingerprint(usr)
diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm
index be170c25a0c..d805c5bb0b1 100644
--- a/code/modules/spells/spell_types/rightandwrong.dm
+++ b/code/modules/spells/spell_types/rightandwrong.dm
@@ -10,7 +10,7 @@
message_admins("[key_name_admin(user, 1)] summoned [summon_type ? "magic" : "guns"]!")
log_game("[key_name(user)] summoned [summon_type ? "magic" : "guns"]!")
for(var/mob/living/carbon/human/H in GLOB.player_list)
- if(H.stat == 2 || !(H.client)) continue
+ if(H.stat == DEAD || !(H.client)) continue
if(H.mind)
if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice" || H.mind.special_role == "survivalist") continue
if(prob(survivor_probability) && !(H.mind in SSticker.mode.traitors))
diff --git a/icons/mob/screen_full.dmi b/icons/mob/screen_full.dmi
index 207f2d3e9153effb0c367a02b3457596dd7571c9..502e9ad3f98fe599386c9694ed6490a5ccc1a165 100644
GIT binary patch
delta 4095269
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