Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29

# Conflicts:
#	_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
#	_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	_maps/map_files/tramstation/tramstation.dmm
#	code/_onclick/hud/new_player.dm
#	code/datums/components/squashable.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/datums/diseases/chronic_illness.dm
#	code/datums/status_effects/buffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/stamcrit.dm
#	code/game/machinery/computer/crew.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/wall_mounted.dm
#	code/game/turfs/closed/indestructible.dm
#	code/modules/admin/view_variables/filterrific.dm
#	code/modules/antagonists/heretic/influences.dm
#	code/modules/cargo/orderconsole.dm
#	code/modules/client/preferences.dm
#	code/modules/events/space_vines/vine_mutations.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/carbon/human/death.dm
#	code/modules/mob/living/carbon/human/species_types/jellypeople.dm
#	code/modules/mob/living/damage_procs.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mob_spawn/mob_spawn.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/projectiles/guns/ballistic/launchers.dm
#	code/modules/projectiles/guns/energy/laser.dm
#	code/modules/reagents/chemistry/machinery/chem_dispenser.dm
#	code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/medicine_reagents.dm
#	code/modules/surgery/healing.dm
#	code/modules/unit_tests/designs.dm
#	icons/mob/inhands/items_lefthand.dmi
#	icons/mob/inhands/items_righthand.dmi
#	tgui/packages/tgui/interfaces/ChemDispenser.tsx
This commit is contained in:
nevimer
2025-11-29 22:49:21 -05:00
1185 changed files with 39068 additions and 32028 deletions
+1 -1
View File
@@ -159,7 +159,7 @@
if(AI && AI.loc == src)
to_chat(AI, span_userdanger("Your core files are being wiped!"))
while(AI.stat != DEAD && flush)
AI.adjustOxyLoss(5)
AI.adjust_oxy_loss(5)
AI.updatehealth()
sleep(0.5 SECONDS)
flush = FALSE
@@ -56,13 +56,13 @@
/obj/item/blood_scanner/proc/scan_blood(mob/living/scanner, mob/living/carbon/scanned_person)
var/render_list = list()
var/oxy_loss = scanned_person.getOxyLoss()
var/tox_loss = scanned_person.getToxLoss()
var/oxy_loss = scanned_person.get_oxy_loss()
var/tox_loss = scanned_person.get_tox_loss()
render_list += span_info("You read the [src]'s screen:\n")
render_list += "<span class='notice ml-1'>Blood Type: [scanned_person?.dna?.blood_type]</span>\n"
if(oxy_loss > 50)//if they have knockout levels of suffocation damage
render_list += "<span class='danger ml-1'>Warning: Hypoxic blood oxygen levels.</span>\n"
if(scanned_person.blood_volume <= BLOOD_VOLUME_SAFE)
if(scanned_person.get_blood_volume(apply_modifiers = TRUE) <= BLOOD_VOLUME_SAFE)
render_list += "<span class='danger ml-1'>Warning: Dangerously low blood flow.</span>\n"
if(tox_loss > 10)
render_list += "<span class='danger ml-1'>Warning: Toxic buildup detected in bloodstream.</span>\n"
@@ -231,7 +231,7 @@
. += span_notice_ml("[patient] has [pill_count] pill[pill_count > 1 ? "s" : ""] implanted in [patient.p_their()] teeth.\n")
//assess any suffocation damage
var/hypoxia_status = patient.getOxyLoss() > 20
var/hypoxia_status = patient.get_oxy_loss() > 20
if(patient == user)
if(hypoxia_status)
@@ -250,9 +250,11 @@
else
. += span_info_ml("You press a finger to [patient.p_their()] gums:\n")
if(patient.blood_volume <= BLOOD_VOLUME_SAFE && patient.blood_volume > BLOOD_VOLUME_OKAY)
var/cached_blood_volume = patient.get_blood_volume(apply_modifiers = TRUE)
if(cached_blood_volume <= BLOOD_VOLUME_SAFE && cached_blood_volume > BLOOD_VOLUME_OKAY)
. += span_danger_ml("Color returns slowly!\n")//low blood
else if(patient.blood_volume <= BLOOD_VOLUME_OKAY)
else if(cached_blood_volume <= BLOOD_VOLUME_OKAY)
. += span_danger_ml("Color does not return!\n")//critical blood
else
. += span_notice_ml("Color returns quickly.\n")//they're okay :D
@@ -39,7 +39,7 @@
return
RegisterSignal(current_area, COMSIG_AREA_POWER_CHANGE, PROC_REF(AreaPowerCheck))
if(mapload)
find_and_hang_on_wall()
find_and_hang_on_atom()
GLOB.intercoms_list += src
/obj/item/radio/intercom/Destroy()
@@ -67,10 +67,10 @@
autopsy_information += "Time of Death - <b>[scanned.station_timestamp_timeofdeath]</b></br>"
autopsy_information += "Subject has been dead for <b>[DisplayTimeText(round(world.time - scanned.timeofdeath))]</b>.<hr>"
var/oxy_loss = scanned.getOxyLoss()
var/tox_loss = scanned.getToxLoss()
var/fire_loss = scanned.getFireLoss()
var/brute_loss = scanned.getBruteLoss()
var/oxy_loss = scanned.get_oxy_loss()
var/tox_loss = scanned.get_tox_loss()
var/fire_loss = scanned.get_fire_loss()
var/brute_loss = scanned.get_brute_loss()
/// "Body Data" portion of the autopsy - damage, wounds, and limbs
var/dmgreport = "<u><b>Body Data:</b></u>\
<table class='ml-2'>\
@@ -187,31 +187,32 @@
// Blood Info
if(HAS_TRAIT(scanned, TRAIT_HUSK))
autopsy_information += "Blood can't be found, subject is husked by: "
if(HAS_TRAIT_FROM(scanned, TRAIT_HUSK, BURN))
autopsy_information += "Severe burns.</br>"
else if (HAS_TRAIT_FROM(scanned, TRAIT_HUSK, CHANGELING_DRAIN))
autopsy_information += "Subject is husked by: "
if(HAS_TRAIT_FROM(scanned, TRAIT_HUSK, CHANGELING_DRAIN))
autopsy_information += "Desiccation, commonly caused by Changelings.</br>"
else
else if(!HAS_TRAIT_FROM(scanned, TRAIT_HUSK, BURN)) // prioritize showing unknown causes over burns
autopsy_information += "Unknown causes.</br>"
else
var/datum/blood_type/blood_type = scanned.get_bloodtype()
if(blood_type)
var/blood_percent = round((scanned.blood_volume / BLOOD_VOLUME_NORMAL) * 100)
var/blood_type_format
var/level_format
if(scanned.blood_volume <= BLOOD_VOLUME_SAFE && scanned.blood_volume > BLOOD_VOLUME_OKAY)
level_format = "LOW [blood_percent]%, [scanned.blood_volume] cl"
else if(scanned.blood_volume <= BLOOD_VOLUME_OKAY)
level_format = "<u>CRITICAL [blood_percent]%</u>, [scanned.blood_volume] cl"
else
level_format = "[blood_percent]%, [scanned.blood_volume] cl"
if(blood_type.get_type())
blood_type_format = "type: [blood_type.get_type()]"
autopsy_information += "<b>[blood_type.get_blood_name()] level:</b> [level_format], [blood_type_format]</br>"
var/blood_alcohol_content = scanned.get_blood_alcohol_content()
if(blood_alcohol_content > 0)
autopsy_information += "&rdsh; [blood_type?.get_blood_name() || "Blood"] alcohol content: [blood_alcohol_content]%</br>"
else
autopsy_information += "Severe burns.</br>"
var/datum/blood_type/blood_type = scanned.get_bloodtype()
if(blood_type)
var/cached_blood_volume = scanned.get_blood_volume(apply_modifiers = TRUE)
var/blood_percent = round((cached_blood_volume / BLOOD_VOLUME_NORMAL) * 100)
var/blood_type_format
var/level_format
if(cached_blood_volume <= BLOOD_VOLUME_SAFE && cached_blood_volume > BLOOD_VOLUME_OKAY)
level_format = "LOW [blood_percent]%, [cached_blood_volume] cl"
else if(cached_blood_volume <= BLOOD_VOLUME_OKAY)
level_format = "<u>CRITICAL [blood_percent]%</u>, [cached_blood_volume] cl"
else
level_format = "[blood_percent]%, [cached_blood_volume] cl"
if(blood_type.get_type())
blood_type_format = "type: [blood_type.get_type()]"
autopsy_information += "<b>[blood_type.get_blood_name()] level:</b> [level_format], [blood_type_format]</br>"
var/blood_alcohol_content = scanned.get_blood_alcohol_content()
if(blood_alcohol_content > 0)
autopsy_information += "&rdsh; [blood_type?.get_blood_name() || "Blood"] alcohol content: [blood_alcohol_content]%</br>"
autopsy_information += "<hr>"
autopsy_information += "<u>Chemical Data:</u></br>"
@@ -156,10 +156,10 @@
var/list/render_list = list()
// Damage specifics
var/oxy_loss = target.getOxyLoss()
var/tox_loss = target.getToxLoss()
var/fire_loss = target.getFireLoss()
var/brute_loss = target.getBruteLoss()
var/oxy_loss = target.get_oxy_loss()
var/tox_loss = target.get_tox_loss()
var/fire_loss = target.get_fire_loss()
var/brute_loss = target.get_brute_loss()
var/mob_status = (!target.appears_alive() ? span_alert("<b>Deceased</b>") : "<b>[round(target.health / target.maxHealth, 0.01) * 100]% healthy</b>")
if(HAS_TRAIT(target, TRAIT_FAKEDEATH) && target.stat != DEAD)
@@ -188,9 +188,9 @@
render_list += "<span class='alert ml-1'>Subject has been [conditional_tooltip("husked", "Repair burns, then apply choice of: [SYNTHFLESH_UNHUSK_AMOUNT]u pure [/datum/reagent/medicine/c2/synthflesh::name] / up to [SYNTHFLESH_UNHUSK_MAX]u impure [/datum/reagent/medicine/c2/synthflesh::name] / 5u [/datum/reagent/medicine/rezadone::name].", tochat)] due to [husk_reason].</span><br>"
// BUBBER EDIT END
if(target.getStaminaLoss())
if(target.get_stamina_loss())
if(advanced)
render_list += "<span class='alert ml-1'>Fatigue level: [target.getStaminaLoss()]%.</span><br>"
render_list += "<span class='alert ml-1'>Fatigue level: [target.get_stamina_loss()]%.</span><br>"
else
render_list += "<span class='alert ml-1'>Subject appears to be suffering from fatigue.</span><br>"
@@ -371,15 +371,16 @@
// Blood Level
var/datum/blood_type/blood_type = target.get_bloodtype()
if(blood_type)
var/blood_percent = round((target.blood_volume / BLOOD_VOLUME_NORMAL) * 100)
var/cached_blood_volume = target.get_blood_volume(apply_modifiers = TRUE)
var/blood_percent = round((cached_blood_volume / BLOOD_VOLUME_NORMAL) * 100)
var/blood_type_format
var/level_format
if(target.blood_volume <= BLOOD_VOLUME_SAFE && target.blood_volume > BLOOD_VOLUME_OKAY)
level_format = "LOW [blood_percent]%, [target.blood_volume] cl"
if(cached_blood_volume <= BLOOD_VOLUME_SAFE && cached_blood_volume > BLOOD_VOLUME_OKAY)
level_format = "LOW [blood_percent]%, [cached_blood_volume] cl"
if (blood_type.restoration_chem)
level_format = conditional_tooltip(level_format, "Recommendation: [blood_type.restoration_chem::name] supplement.", tochat)
else if(target.blood_volume <= BLOOD_VOLUME_OKAY)
level_format = "<b>CRITICAL [blood_percent]%</b>, [target.blood_volume] cl"
else if(cached_blood_volume <= BLOOD_VOLUME_OKAY)
level_format = "<b>CRITICAL [blood_percent]%</b>, [cached_blood_volume] cl"
var/recommendation = list()
if (blood_type.restoration_chem)
recommendation += "[blood_type.restoration_chem::name] supplement"
@@ -391,7 +392,7 @@
recommendation += "immediate [blood_type.get_blood_name()] transufion"
level_format = conditional_tooltip(level_format, "Recommendation: [english_list(recommendation, and_text = " or ")].", tochat)
else
level_format = "[blood_percent]%, [target.blood_volume] cl"
level_format = "[blood_percent]%, [cached_blood_volume] cl"
if (blood_type.get_type())
blood_type_format = "type: [blood_type.get_type()]"
@@ -401,7 +402,7 @@
compatible_types_readable |= initial(comp_blood_type.name)
blood_type_format = span_tooltip("Can receive from types [english_list(compatible_types_readable)].", blood_type_format)
render_list += "<span class='[target.blood_volume < BLOOD_VOLUME_SAFE ? "alert" : "info"] ml-1'>[blood_type.get_blood_name()] level: [level_format],</span> <span class='info'>[blood_type_format]</span><br>"
render_list += "<span class='[cached_blood_volume < BLOOD_VOLUME_SAFE ? "alert" : "info"] ml-1'>[blood_type.get_blood_name()] level: [level_format],</span> <span class='info'>[blood_type_format]</span><br>"
var/blood_alcohol_content = target.get_blood_alcohol_content()
if(blood_alcohol_content > 0)
@@ -716,7 +717,7 @@
show_emotion(AID_EMOTION_HAPPY)
/obj/item/healthanalyzer/simple/proc/violence_damage(mob/living/user)
user.adjustBruteLoss(4)
user.adjust_brute_loss(4)
/obj/item/healthanalyzer/simple/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!isliving(interacting_with))
@@ -784,7 +785,7 @@
scan_for_what = "diseases"
/obj/item/healthanalyzer/simple/disease/violence_damage(mob/living/user)
user.adjustBruteLoss(1)
user.adjust_brute_loss(1)
user.reagents.add_reagent(/datum/reagent/toxin, rand(1, 3))
/obj/item/healthanalyzer/simple/disease/do_the_scan(mob/living/carbon/scanning, mob/living/user)