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 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 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 };