From 664b5e84dd58e9273c20c32b273397f2508ebd81 Mon Sep 17 00:00:00 2001
From: CHOMPStation2 <58959929+CHOMPStation2@users.noreply.github.com>
Date: Sat, 7 Sep 2024 16:27:57 -0700
Subject: [PATCH] [MIRROR] September 2024 various fixes (#8920)
Co-authored-by: Heroman3003 <31296024+Heroman3003@users.noreply.github.com>
Co-authored-by: Nadyr <41974248+Darlantanis@users.noreply.github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
---
code/_helpers/global_lists.dm | 2 +-
code/datums/ai_laws.dm | 2 +-
code/game/machinery/adv_med.dm | 3 ++
code/game/machinery/computer/ai_core.dm | 6 ++++
code/game/machinery/doors/airlock.dm | 11 +++++--
code/game/machinery/medical_kiosk.dm | 29 +++++++++++-------
.../objects/items/devices/scanners/health.dm | 2 ++
code/game/objects/items/weapons/AI_modules.dm | 5 +++
.../objects/items/weapons/storage/belt.dm | 8 +++--
.../structures/crates_lockers/crates.dm | 8 +++++
.../preference_setup/vore/04_resleeving.dm | 19 ++++++++++--
.../modules/mob/living/silicon/robot/robot.dm | 2 +-
.../simple_mob/subtypes/vore/greatwolf.dm | 2 +-
.../simple_mob/subtypes/vore/greatwolf_ch.dm | 2 +-
.../mob/new_player/sprite_accessories.dm | 6 ++++
.../mob/new_player/sprite_accessories_vr.dm | 2 +-
code/modules/reagents/reagents/other.dm | 3 ++
code/modules/vehicles/cargo_train.dm | 3 ++
icons/mob/human_races/markings_vox.dmi | Bin 5463 -> 5578 bytes
.../BodyScannerMainAbnormalities.tsx | 3 +-
.../tgui/interfaces/BodyScanner/constants.ts | 5 +++
.../tgui/interfaces/BodyScanner/types.ts | 1 +
22 files changed, 99 insertions(+), 25 deletions(-)
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index c98a903251..b372bcc48e 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -293,7 +293,7 @@ GLOBAL_LIST_EMPTY(mannequins)
// Custom species icon bases
var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //VOREStation Edit
- var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID, SPECIES_SHADEKIN) //CHOMPedit
+ var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID,SPECIES_TESHARI,SPECIES_VOX,SPECIES_SHADEKIN) //CHOMPedit
for(var/species_name in GLOB.playable_species)
if(species_name in blacklisted_icons)
continue
diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm
index fb152cefa8..19fc7ec7ae 100644
--- a/code/datums/ai_laws.dm
+++ b/code/datums/ai_laws.dm
@@ -1,4 +1,4 @@
-var/global/const/base_law_type = /datum/ai_laws/nanotrasen
+// var/global/const/base_law_type = /datum/ai_laws/nanotrasen //VOREstation edit: unused
/datum/ai_law
var/law = ""
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 87d4146259..e35c1ad202 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -334,6 +334,7 @@
occupantData["blind"] = (H.sdisabilities & BLIND)
occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED)
+ occupantData["husked"] = (HUSK in H.mutations) // VOREstation edit
occupantData = attempt_vr(src, "get_occupant_data_vr", list(occupantData, H)) //VOREStation Insert
data["occupant"] = occupantData
@@ -537,6 +538,8 @@
dat += "Cataracts detected.
"
if(occupant.disabilities & NEARSIGHTED)
dat += "Retinal misalignment detected.
"
+ if(HUSK in occupant.mutations) // VOREstation edit
+ dat += "Anatomical structure lost, resuscitation not possible!
"
else
dat += "\The [src] is empty."
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 504b1801ab..a1b75dc071 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -10,6 +10,12 @@
var/obj/item/weapon/circuitboard/circuit = null
var/obj/item/device/mmi/brain = null
+// VOREstation edit: Respect map config's default
+/obj/structure/AIcore/Initialize(var/mapload)
+ . = ..()
+ if(mapload)
+ laws = new global.using_map.default_law_type
+// VOREstation edit end
/obj/structure/AIcore/attackby(obj/item/P as obj, mob/user as mob)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 1fbf697a4f..221dae6f32 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1015,8 +1015,15 @@ About the new airlock wires panel:
flick("door_deny", src)
playsound(src, knock_hammer_sound, 50, 0, 3)
else if(arePowerSystemsOn()) //ChompEDIT - removed intent check
- src.visible_message("[user] presses the door bell on \the [src].", "\The [src]'s bell rings.")
- src.add_fingerprint(user)
+ if(isElectrified())
+ src.visible_message("[user] presses the door bell on \the [src], making it violently spark!", "\The [src] sparks!")
+ src.add_fingerprint(user)
+ var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ s.set_up(5, 1, src)
+ s.start()
+ else
+ src.visible_message("[user] presses the door bell on \the [src].", "\The [src]'s bell rings.")
+ src.add_fingerprint(user)
if(icon_state == "door_closed")
flick("door_deny", src)
playsound(src, knock_sound, 50, 0, 3)
diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
index 7fc98cb443..e42aa23bcd 100644
--- a/code/game/machinery/medical_kiosk.dm
+++ b/code/game/machinery/medical_kiosk.dm
@@ -6,6 +6,7 @@
#define RADIATION_DAMAGE 0x20
#define TOXIN_DAMAGE 0x40
#define OXY_DAMAGE 0x80
+#define HUSKED_BODY 0x100
/obj/machinery/medical_kiosk
name = "medical kiosk"
@@ -76,14 +77,14 @@
if(!choice || choice == "Cancel" || !Adjacent(user) || inoperable() || panel_open)
suspend()
return
-
+
// Service begins, delay
visible_message("\The [src] scans [user] thoroughly!")
flick("kiosk_active", src)
if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
suspend()
return
-
+
// Service completes
switch(choice)
if("Health Scan")
@@ -95,7 +96,7 @@
else
var/scan_report = do_backup_scan(user)
to_chat(user, "Backup scan results:"+scan_report)
-
+
// Standby
suspend()
@@ -104,7 +105,7 @@
return "
Unable to perform diagnosis on this type of life form."
if(user.isSynthetic())
return "
Unable to perform diagnosis on synthetic life forms."
-
+
var/problems = 0
for(var/obj/item/organ/external/E in user)
if(E.status & ORGAN_BROKEN)
@@ -119,13 +120,16 @@
problems |= INTERNAL_BLEEDING
else
problems |= EXTERNAL_BLEEDING
-
+
for(var/obj/item/organ/internal/I in user)
if(I.status & (ORGAN_BROKEN|ORGAN_DEAD|ORGAN_DESTROYED))
problems |= SERIOUS_INTERNAL_DAMAGE
if(I.status & ORGAN_BLEEDING)
problems |= INTERNAL_BLEEDING
-
+
+ if(HUSK in user.mutations)
+ problems |= HUSKED_BODY
+
if(user.getToxLoss() > 0)
problems |= TOXIN_DAMAGE
if(user.getOxyLoss() > 0)
@@ -134,13 +138,13 @@
problems |= RADIATION_DAMAGE
if(user.getFireLoss() > 40 || user.getBruteLoss() > 40)
problems |= SERIOUS_EXTERNAL_DAMAGE
-
+
if(!problems)
if(user.getHalLoss() > 0)
return "
Mild concussion detected - advising bed rest until patient feels well. No other anatomical issues detected."
else
return "
No anatomical issues detected."
-
+
var/problem_text = ""
if(problems & BROKEN_BONES)
problem_text += "
Broken bones detected - see a medical professional and move as little as possible."
@@ -158,6 +162,8 @@
problem_text += "
Exposure to toxic materials detected - induce vomiting if you have consumed anything recently."
if(problems & OXY_DAMAGE)
problem_text += "
Blood/air perfusion level is below acceptable norms - use concentrated oxygen if necessary."
+ if(problems & HUSKED_BODY)
+ problem_text += "
Anatomical structure lost, resuscitation not possible!"
return problem_text
@@ -166,11 +172,11 @@
return "
Unable to perform full scan. Please see a medical professional."
if(!user.mind)
return "
Unable to perform full scan. Please see a medical professional."
-
+
var/nif = user.nif
if(nif)
persist_nif_data(user)
-
+
our_db.m_backup(user.mind,nif,one_time = TRUE)
var/datum/transhuman/body_record/BR = new()
BR.init_from_mob(user, TRUE, TRUE, database_key = db_key)
@@ -184,4 +190,5 @@
#undef SERIOUS_INTERNAL_DAMAGE
#undef RADIATION_DAMAGE
#undef TOXIN_DAMAGE
-#undef OXY_DAMAGE
\ No newline at end of file
+#undef OXY_DAMAGE
+#undef HUSKED_BODY
diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm
index 2d0b040c99..8d4d444e5c 100644
--- a/code/game/objects/items/devices/scanners/health.dm
+++ b/code/game/objects/items/devices/scanners/health.dm
@@ -244,6 +244,8 @@
severity = "Mild"
if(severity)
dat += "[severity] inflammation detected in subject [a.name].
"
+ if(HUSK in H.mutations)
+ dat += "Anatomical structure lost, resuscitation not possible!
"
// Infections, fractures, and IB
var/basic_fracture = 0 // If it's a basic scanner
var/basic_ib = 0 // If it's a basic scanner
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index 96cdd170d0..24f7d0b475 100644
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -269,6 +269,11 @@ AI MODULES
desc = "A 'reset' AI module: 'Clears all, except the inherent, laws.'"
origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4)
+// VOREstation edit: use map default laws
+/obj/item/weapon/aiModule/reset/Initialize()
+ . = ..()
+ laws = new global.using_map.default_law_type // Pull from loaded map
+
/obj/item/weapon/aiModule/reset/transmitInstructions(var/mob/living/silicon/ai/target, var/mob/sender)
log_law_changes(target, sender)
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 9665920385..47a6ef897c 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -249,8 +249,12 @@
/obj/item/device/flashlight,
/obj/item/weapon/cell/device,
/obj/item/weapon/extinguisher/mini,
- /obj/item/weapon/storage/quickdraw/syringe_case,
- /obj/item/ammo_casing/macrobattery // CHOMPedit: Macrobatteries for the Curabitur can fit into medbelts.
+ /obj/item/ammo_casing/macrobattery, // CHOMPedit: Macrobatteries for the Curabitur can fit into medbelts.
+ /obj/item/device/antibody_scanner, // VOREstation edit start
+ /obj/item/device/sleevemate,
+ /obj/item/device/mass_spectrometer,
+ /obj/item/weapon/surgical,
+ /obj/item/clothing/mask/chewable/candy/lolli // VOREstation edit end
)
/obj/item/weapon/storage/belt/medical/emt
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 511e505330..00aac28c59 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -69,6 +69,14 @@
update_icon()
return 1
+/obj/structure/closet/crate/MouseDrop_T(mob/target, mob/user)
+ // Adds climbing from drag, You can't put yourself in crates with a drag anyway... Nore anyone else actually.
+ var/mob/living/H = user
+ if(istype(H) && can_climb(H) && target == user)
+ do_climb(target)
+ else
+ return ..()
+
/obj/structure/closet/crate/verb/rotate_clockwise()
set name = "Rotate Crate Clockwise"
set category = "Object"
diff --git a/code/modules/client/preference_setup/vore/04_resleeving.dm b/code/modules/client/preference_setup/vore/04_resleeving.dm
index 22fba4e6a7..b953ef56ad 100644
--- a/code/modules/client/preference_setup/vore/04_resleeving.dm
+++ b/code/modules/client/preference_setup/vore/04_resleeving.dm
@@ -2,6 +2,7 @@
/datum/preferences
var/resleeve_lock = 0 // Whether movs should have OOC reslieving protection. Default false.
var/resleeve_scan = 1 // Whether mob should start with a pre-spawn body scan. Default true.
+ var/mind_scan = 1 // Whether mob should start with a pre-spawn mind scan. Default true.
// Definition of the stuff for Sizing
/datum/category_item/player_setup_item/vore/resleeve
@@ -11,24 +12,32 @@
/datum/category_item/player_setup_item/vore/resleeve/load_character(var/savefile/S)
S["resleeve_lock"] >> pref.resleeve_lock
S["resleeve_scan"] >> pref.resleeve_scan
+ S["mind_scan"] >> pref.mind_scan
/datum/category_item/player_setup_item/vore/resleeve/save_character(var/savefile/S)
S["resleeve_lock"] << pref.resleeve_lock
S["resleeve_scan"] << pref.resleeve_scan
+ S["mind_scan"] << pref.mind_scan
/datum/category_item/player_setup_item/vore/resleeve/sanitize_character()
pref.resleeve_lock = sanitize_integer(pref.resleeve_lock, 0, 1, initial(pref.resleeve_lock))
pref.resleeve_scan = sanitize_integer(pref.resleeve_scan, 0, 1, initial(pref.resleeve_scan))
+ pref.mind_scan = sanitize_integer(pref.mind_scan, 0, 1, initial(pref.mind_scan))
/datum/category_item/player_setup_item/vore/resleeve/copy_to_mob(var/mob/living/carbon/human/character)
if(character && !istype(character,/mob/living/carbon/human/dummy))
spawn(50)
if(QDELETED(character) || QDELETED(pref))
return // They might have been deleted during the wait
- if(pref.resleeve_scan)
- var/datum/transhuman/body_record/BR = new()
- BR.init_from_mob(character, pref.resleeve_scan, pref.resleeve_lock)
+ if(!character.virtual_reality_mob && !(/mob/living/carbon/human/proc/exit_vr in character.verbs)) // CHOMPedit start: janky fix to prevent resleeving VR avatars but beats refactoring transcore
+ if(pref.resleeve_scan)
+ var/datum/transhuman/body_record/BR = new()
+ BR.init_from_mob(character, pref.resleeve_scan, pref.resleeve_lock)
+ if(pref.mind_scan)
+ var/datum/transcore_db/our_db = SStranscore.db_by_key(null)
+ if(our_db)
+ our_db.m_backup(character.mind,character.nif,one_time = TRUE) // CHOMPedit end
if(pref.resleeve_lock)
character.resleeve_lock = character.ckey
character.original_player = character.ckey
@@ -36,6 +45,7 @@
/datum/category_item/player_setup_item/vore/resleeve/content(var/mob/user)
. += "
"
. += "Start With Body Scan: [pref.resleeve_scan ? "Yes" : "No"]
"
+ . += "Start With Mind Scan: [pref.mind_scan ? "Yes" : "No"]
"
. += "Prevent Body Impersonation: [pref.resleeve_lock ? "Yes" : "No"]
"
/datum/category_item/player_setup_item/vore/resleeve/OnTopic(var/href, var/list/href_list, var/mob/user)
@@ -45,4 +55,7 @@
else if(href_list["toggle_resleeve_scan"])
pref.resleeve_scan = pref.resleeve_scan ? 0 : 1;
return TOPIC_REFRESH
+ else if(href_list["toggle_mind_scan"])
+ pref.mind_scan = pref.mind_scan ? 0 : 1;
+ return TOPIC_REFRESH
return ..();
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 4c34bd7ac5..3bd8c18632 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -239,7 +239,7 @@
/mob/living/silicon/robot/proc/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
- laws = new /datum/ai_laws/nanotrasen()
+ laws = new global.using_map.default_law_type // VOREstation edit: use map's default
additional_law_channels["Binary"] = "#b"
var/new_ai = select_active_ai_with_fewest_borgs()
if(new_ai)
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm
index 42bb0b91a4..ed91983fed 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm
@@ -131,7 +131,7 @@
B.desc = "The moment the wolf gets its jaws around you, it scoops you right up off of the ground, and greedily scarfs you down with a few swift gulps. Your small frame alone is hardly enough to make him look somewhat plump as you slop wetly into that dark, hot chamber, although the dense squish is rather comfortable. The thick, humid air is tinged with the smell of digested meat, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder."
B.vore_sound = "Tauric Swallow"
B.release_sound = "Pred Escape"
- B.mode_flags = list(DM_FLAG_NUMBING, DM_FLAG_THICKBELLY, DM_FLAG_AFFECTWORN)
+ B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_AFFECTWORN
B.fancy_vore = 1
B.vore_verb = "slurp"
B.contamination_color = "grey"
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf_ch.dm
index 8eaf3d97bf..37694ad0f2 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf_ch.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf_ch.dm
@@ -125,7 +125,7 @@
B.desc = "The moment the wolf gets its jaws around you, it scoops you right up off of the ground, and greedily scarfs you down with a few swift gulps. Your small frame alone is hardly enough to make him look somewhat plump as you slop wetly into that dark, hot chamber, although the dense squish is rather comfortable. The thick, humid air is tinged with the smell of digested meat, and the surrounding flesh wastes no time in clenching and massaging down over its newfound fodder."
B.vore_sound = "Tauric Swallow"
B.release_sound = "Pred Escape"
- B.mode_flags = list(DM_FLAG_NUMBING, DM_FLAG_THICKBELLY, DM_FLAG_AFFECTWORN)
+ B.mode_flags = DM_FLAG_NUMBING | DM_FLAG_THICKBELLY | DM_FLAG_AFFECTWORN
B.fancy_vore = 1
B.vore_verb = "slurp"
B.contamination_color = "grey"
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 35016326a7..e008f953aa 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -3730,3 +3730,9 @@ shaved
icon_state = "Voxscales"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_R_ARM,BP_L_ARM,BP_R_HAND,BP_L_HAND,BP_R_LEG,BP_L_LEG,BP_R_FOOT,BP_L_FOOT)
+
+/datum/sprite_accessory/marking/vox/dinomuzzle
+ name = "Vox Dinosaur Muzzle"
+ icon_state = "vox_muzzle"
+ color_blend_mode = ICON_MULTIPLY
+ body_parts = list(BP_HEAD)
diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm
index bafcc73d65..941f12ac13 100644
--- a/code/modules/mob/new_player/sprite_accessories_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_vr.dm
@@ -492,7 +492,7 @@
name = "Shaved"
icon_state = "bald"
gender = NEUTER
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use the facial hair styles.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL, SPECIES_VOX) //This needed to be manually defined, apparantly.
/datum/sprite_accessory/facial_hair/neck_fluff
name = "Neck Fluff"
diff --git a/code/modules/reagents/reagents/other.dm b/code/modules/reagents/reagents/other.dm
index b35d24c3e0..cf22c049b1 100644
--- a/code/modules/reagents/reagents/other.dm
+++ b/code/modules/reagents/reagents/other.dm
@@ -456,6 +456,9 @@
var/turf/simulated/S = T
S.dirt = 0
T.clean_blood()
+ for(var/obj/effect/O in T)
+ if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay))
+ qdel(O)
for(var/mob/living/simple_mob/slime/M in T)
M.adjustToxLoss(rand(5, 10))
diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm
index 9961f32aab..934d7994b2 100644
--- a/code/modules/vehicles/cargo_train.dm
+++ b/code/modules/vehicles/cargo_train.dm
@@ -156,6 +156,9 @@
verbs += /obj/vehicle/train/engine/verb/stop_engine
/obj/vehicle/train/RunOver(var/mob/living/M)
+ if(pulledby == M) // VOREstation edit: Don't destroy people pulling vehicles up stairs
+ return
+
var/list/parts = list(BP_HEAD, BP_TORSO, BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM)
M.apply_effects(5, 5)
diff --git a/icons/mob/human_races/markings_vox.dmi b/icons/mob/human_races/markings_vox.dmi
index e60cb65e3838b824d93cb2e126d2da8da004a140..6fb8297552b38b43c22851a1deb5bd178a3a7384 100644
GIT binary patch
delta 5362
zcmZu#cT^M1vWG|)X-X52B8bwJ-VB0(NC{0)iUcW2P3S$L2qI02)KH~;(t>mW35b9Q
zp?3&X0)|cqB?NeS@BPmG-aBvp*fKk_XJ=;5Z)bK=jWOLNCZF(JG!l;Iu?<@RjG0&osceZM*lg_pg-y~`O>DQ80oVohtg
z`pXIDtUFud^kik1YNbAY;`=!>r03<4#EpPUNEk(=40dVmD?vv)aNqdvRYb86ZpwKV
z-yY2WiPeu@+;(6mX?~aU)bi}BeV5JL+B~flr#2eArmON4v>TC1zFUVSyLS?xZLI34
zg@?n60&g4RqYM`p-6SVhuILAPzc2wNKHq3vz3XkE@xTq#h`3NL(XF4ZM4fxwCqKCO
zj1#;h%uYsjH9+U#15^L(t(?ntGfga!ITTiL^u>3{FBt^b&q{>(rW_v5W6mysn+fy*
zU>UnR(cs14XX{_T-z->3avOU3;CCQ?6a3%ZpSHaP>JhNcHsulEvCg&`5i9!Ut9iFX
zQ`3HNeh13r^q~a066h--;WFXif(ZXI+q0VPuw7?cKbWJYF^Sj?-u$EphC_+`4-bI>=aQ7*Vy6d2{#jsI%0L5
zXgr4?eJH!r0mez@W?$AU42{U=Z-#puEb73_*ydSskqRzKlHo-=WW`wH%X6k7D_;L)
z4ZefckbvQM-7A{fRa?r+b1gk}ni&^8OKcjNyz+zJ~(cVU}vj|A42wLv-L=`c`BPm=`wDga!b{*6ZeX~
zkkTMzD^(k-Iy!fjEFrl(YMh}zeK|o~G8?yUO}F@GHW108i>~R{Q#_YIkV4;VnA@D;@E&I_0B#h2Rlq
zH@Ycjp<*sg3}WM$2rm(R2tGHrCFc^%&*N?7LM-S`aGAMZWvOm0tW*&~0B*6lx0LDb
z4@sNz{Q$iXsmL=MntdIqbgIs`SHwH)XjA=KFc-JK5OpYUUA=JLeQQSgO)hj_&br^rB4?UZ`jQ2PkJ}EFuyFg@aJmreVF?t*Nw0HwXx2kO1
zW=(j)L}aH2a}T@ag=YE99Bo)}Q#9YHz(Z)%t6x-6OnnPRN`TaR(}Ov_@~?pfnd1vO!__~3$tzOIqAYz^j)Xw`uT(Oh
zed(phzj3v5_;xYMs7X}|i#%+AspdrtDu0n^MRS~p`%E~%E2=uBTFnF#ozB|t
zbGk#|I>352U{Hf{{q2mCfD~wrL7Q~cT8h()>MF`+hKSu6!J)^CjDlM@PCy$ie=9)s
zp#e+m&t9oaSH@2k40M&dN=*zt6j^Mco8^pW9#Y$I!&zUZbzXself;Tnl3P>`NE;X}>ElsK#Kv_Swi?KWJu76;twrU;(vx
zXHlx)!K=*1yep-j)kX^fHrP+&&gj?l)AC{*ISUze(p7T5`0X606EXfLj#u_^^8nj0v~idE|kvp
z%*@i%l}tvn-jdGE*DLztCc`BL+6=MP-PR(~1k4k~s6`
zw@%k%>5|&^?z3+0`0VUzSUjV|)88_#?sbe#eoF`K)t}&v>xGOG-noT*XKgaw_|eqd
zYaM8&uV*J*3g_c|AA{GCw_GR5%?37Et4%^SG^#>-k@)2~(upX!&!WN;kJ>)kDYtGB
z9t2PgXcpy%milGX40GXS(Szl%FOcI;7$3u8KCVHujm$ywSc;-@QXQA(iOl)HK@ta
zS35t#K!7a#M(Z&{l{PD4A~(-BIs8sYH-Ao1Vy=~uTWpI4k<3(O0jK#O{WWKa*!a!}
zRQ}?eB`|87rJC!fz$?m@1AZs6CwE5M$s@tsCI#D%QETy+CS5O=)HND7?r)He?@!S<
zSHX{T)SB-<`elN%R4ncXKcY%br(2D*aT9CubBaOLdZpZiW84q!dwO7xVBea!p~OJ+OjVj6q6#
z&jJPz5F$TCX;3XWV^tF=o*2mH_K!fU})XCi%=SA<1QOy!OI$hh1phFxuC~4ee&F(Qa8Q@Zix)zERJ_Wolc}n(Uq#G{K>)ET@1Tm*6K<8
zW||qZKbm%^G1;a(NhQ3)5H)5L?7{)3=6ktXH6=(*LEA<7i3n&B%|2M_GPoYa>2n3>a;yd
zI>3MZorv5K&R88M??^a!u8Qh{?Gm^KvvYB(K(4nzPTWVwve_eJj%Ql8nDq8oE3r)|%E9}p@RRF(1
zi{eJU*Zb#U+$(kAPDTsq1TF#~o^3-OOW8Q_du`o!MS<INCKLf0=o`p-Sy$E5#g}X2H48hQ^_rv8?}J>1gDENw5b1Co?nuD%Jr({
z=g0+)bmS_$ih4N38nw4Ex#v%M5-nvcB|Z#6MVl{u9G7jj{%E&)Xf{#W|L?4pA)*zQ
zuL&5##I@+^IXNP%8a22EI6cnVCD~$u^JorA?NMWLw`6m-8R$g+S7xse-T`$)8^TDj
zb9VGsx}<~Uz7NX%lJR?TGO|`+5*Do~)<6YsF&gPIGU+P2)e{H#1-3sD3vT2@H^_^eLG%V~v!ZkrKv`e~>uiKxYVte?#1_rPe5^t3M6b!0Z#
z59MkdpFIW2(-OGO3mm!KOLwgA)TRT#?uU#xv(gv+Dz#F7rY3ntDjn86E@fPJq6POO
z)o;HXsHzKpL6ID8)X0T-7#WcR3n>);01N2Jg8_Hq*AKBuZEe5km@_Wk0?Mk4PwJN9
zr+GFSzej5Y)jdu#^8kz_$$Fqi>P0uFI-t{7wB#TAfAQ!~
zUhaoT@kvNQ&Fsfb2vj!gxdmY1Wf~~=6F=v?xtN5A(!v4^ZmM4iCh&`c)wQuGAccYG
zcH-xnHx|QIi|3JdD?J}pb?p~;rOUt0qM`G$HeI9fkoJi~j>(whD@%Q67=M2p058PwD^H;WIF{q$3xMfumoE$k4BJrK(>_4v7oO3J*EgN=z&{0@29v0f8
zS3VjR-lL}uXht)@FO3U?!L%6;E|GE5^pN5rJd(Ze5e>Qn(E))$v$J=a{#A)u2rDU~
z9N;8_{!?hn%EuJ_bL$!5QAHhcOpRU4XHk$rus-MSGBoQ;XG#v12ImVvzb8yc-_kxe
z*aexY{T*?#)-czvj=65P#3sQ1yw6?+FC{-9uU7s#mf_vfeE@MEY8j?abfertf?$
zVOK;9Z1+E)?xZhTKcZ_qbZ>0ckEPgAPj;pIj^Uv*O_MwQ2N?d=oQnSpZb^>=`>`np
zJ%z2wHec+qQ_KnXIqZUsV&u^~?3Z=gyTT}g=R&AisX27n;O~OU+tq;|i6_Q%YR1r$
z6`pIP&sO);#nVvV#PK|aB5Ey*st{|jbfB&!I|Zr|rPeazB?&+Fj`2!O-$vfnIwt^z~$PPiPmUoQ6c;yAitv{4uk8
z!w7141F&LC+(S7KDZMG!k1m4tuB{B?xYb3EZGOp=v|c#{(*K5+|B^zGiXOfH%O2ql
z<80ccufdZEFqwS<+QS*u*^~_m`$2~v=UdtspsCh4p5G4i*SNN3zy+~GSK;FMy`2-i6XD~@k0eyM(zj0Y@EVvs!d=#yO;77
z%ySpnH{aV(|LviFe8>D@Efy)nkQy*oT|wzPN4ds&M;Qy+`maN|7t(XL-|s~-J?O1J9ki!HTXIE$N-@978{Qu7WKBWdhcMK5cFdQKXjq4
zY=t;JbPK6l4%s+LTWH)6_Jc$h--INHtA6o2%iTXE$zJ{2ia))G-qz3+vTwm{Pp`Re
zHd%>b*-U7iWpDdKvG~>HbC^lTxN@8^&yDx4H%Hy6llDgU(X9<
z9N{VbU-#`_Ckk!cMIz~ghLiNgmFw)+n*SpKDSf_X6NWQEj^pM;p%i1+3G8T{bvW1e
zKqZmu^%h(8p%fz$2{BqL1Y6{Dh#K&p*8O8#OyZ4&1&B>|UB>_6>S!7~tWpPu{|_2H
BOZfl*
delta 5178
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 {
occupant.blind ||
occupant.colourblind ||
occupant.nearsighted ||
- occupant.hasVirus;
+ occupant.hasVirus ||
+ occupant.husked;
hasAbnormalities =
hasAbnormalities ||
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/constants.ts b/tgui/packages/tgui/interfaces/BodyScanner/constants.ts
index 14dfe60770..39b64a2594 100644
--- a/tgui/packages/tgui/interfaces/BodyScanner/constants.ts
+++ b/tgui/packages/tgui/interfaces/BodyScanner/constants.ts
@@ -43,6 +43,11 @@ export const abnormalities: (string | ((occupant: occupant) => string))[][] = [
return 'Foreign Object(s) detected: ' + occupant.objectPrey;
},
],
+ [
+ 'husked',
+ 'bad',
+ (occupant) => 'Anatomical structure lost, resuscitation not possible!',
+ ],
];
export const damages: string[][] = [
diff --git a/tgui/packages/tgui/interfaces/BodyScanner/types.ts b/tgui/packages/tgui/interfaces/BodyScanner/types.ts
index 45aacd61ce..0dd1991e99 100644
--- a/tgui/packages/tgui/interfaces/BodyScanner/types.ts
+++ b/tgui/packages/tgui/interfaces/BodyScanner/types.ts
@@ -35,6 +35,7 @@ export type occupant = {
humanPrey: number;
objectPrey: number;
weight: number;
+ husked: BooleanLike;
};
type reagent = { name: string; amount: number; overdose: BooleanLike };