Files
bf98195fda Ghosts can see more info on health scan (#96792)
## About The Pull Request

I have no idea how to word this so here's a list instead. 

1. Fixes #96445 by making it so that instead of healthscan code coming
up with cure text on the spot for viruses, advanced diseases have a
function that can generate cure text so you can use it in things other
than healthscanning.
2. Rewords a single letter var in medical kiosk code
3. As a result of 1, the code for disease state analyzers healthscanning
has been shortened because the cure text generating function only has to
be written once and not twice.
4. Health scans now have a power level instead of just being advanced or
basic. There is a new power level called super, and it's only available
to ghosts. Super scans can see all virus symptoms instead of just 3, and
the current stage of an alien embryo.
5. For some reason a bunch of healthscan code (like stuff from the eye
of god and health scanner mod module) were using 1 instead of
SCANMODE_VERBOSE (a define that equals 1 but is more readable) for the
scanmode. That's no longer the case.
6. A new health scanner, the super health scanner, that replaces the
advanced one in the box of debug tools.

<img width="620" height="223" alt="image"
src="https://github.com/user-attachments/assets/a0c5e56e-cf19-4db2-a2df-b72456123c50"
/>
<img width="73" height="65" alt="image"
src="https://github.com/user-attachments/assets/27f8c81b-4f89-455b-82fa-a0ecf94656cf"
/>

## Why It's Good For The Game

Ghosts should be able to see everything, I think

## Changelog

🆑
qol: Ghosts can see alien embryo stage and all virus symptoms when
health scanning
code: Health scanners now support multiple scan levels
fix: Fixes medical kiosks not being able to identify advanced disease
cures.
/🆑

---------

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2026-07-17 00:07:13 +02:00

142 lines
4.8 KiB
Plaintext

// A 10% chance that out of a group of 25 people, one person will get appendicitis in 1 hour.
#define APPENDICITIS_PROB 100 * (0.1 * (1 / 25) / 3600)
#define INFLAMATION_ADVANCEMENT_PROB 2
/obj/item/organ/appendix
name = "appendix"
icon_state = "appendix"
base_icon_state = "appendix"
zone = BODY_ZONE_PRECISE_GROIN
slot = ORGAN_SLOT_APPENDIX
food_reagents = list(/datum/reagent/consumable/nutriment/organ_tissue = 5, /datum/reagent/toxin/bad_food = 5)
healing_factor = STANDARD_ORGAN_HEALING
decay_factor = STANDARD_ORGAN_DECAY
now_failing = span_warning("An explosion of pain erupts in your lower right abdomen!")
now_fixed = span_info("The pain in your abdomen has subsided.")
visual = FALSE
var/inflamation_stage = 0
/obj/item/organ/appendix/grind_results()
return list(/datum/reagent/toxin/bad_food = 5)
/obj/item/organ/appendix/update_name()
. = ..()
name = "[inflamation_stage ? "inflamed " : null][initial(name)]"
/obj/item/organ/appendix/update_icon_state()
icon_state = "[base_icon_state][inflamation_stage ? "inflamed" : ""]"
return ..()
/obj/item/organ/appendix/on_life(seconds_per_tick)
. = ..()
if(!owner)
return
if(organ_flags & ORGAN_FAILING)
// forced to ensure people don't use it to gain tox as slime person
owner.adjust_tox_loss(2 * seconds_per_tick, forced = TRUE)
else if(inflamation_stage)
inflamation(seconds_per_tick)
else if(SPT_PROB(APPENDICITIS_PROB, seconds_per_tick) && !HAS_TRAIT(owner, TRAIT_TEMPORARY_BODY))
become_inflamed()
/obj/item/organ/appendix/proc/become_inflamed()
inflamation_stage = 1
update_appearance()
if(isnull(owner))
return
ADD_TRAIT(owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type)
owner.med_hud_set_status()
RegisterSignal(owner, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_fully_heal))
if(isnull(owner.client))
return
notify_ghosts(
"[owner.real_name] has developed spontaneous appendicitis!",
source = owner,
header = "Whoa, Sick!",
)
/obj/item/organ/appendix/proc/inflamation(seconds_per_tick)
var/mob/living/carbon/organ_owner = owner
if(inflamation_stage < 3 && SPT_PROB(INFLAMATION_ADVANCEMENT_PROB, seconds_per_tick))
inflamation_stage += 1
switch(inflamation_stage)
if(1)
if(SPT_PROB(2.5, seconds_per_tick))
organ_owner.emote("cough")
if(2)
if(SPT_PROB(1.5, seconds_per_tick))
to_chat(organ_owner, span_warning("You feel a stabbing pain in your abdomen!"))
organ_owner.adjust_organ_loss(ORGAN_SLOT_APPENDIX, 5)
organ_owner.Stun(rand(40, 60))
organ_owner.adjust_tox_loss(1, forced = TRUE)
if(3)
if(SPT_PROB(0.5, seconds_per_tick))
organ_owner.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 95)
organ_owner.adjust_organ_loss(ORGAN_SLOT_APPENDIX, 15)
/obj/item/organ/appendix/feel_for_damage(self_aware)
var/effective_stage = floor(inflamation_stage + (damage / maxHealth))
switch(effective_stage)
if(1)
return span_warning("Your [self_aware ? "appendix" : "lower abdomen"] feels a little off.")
if(2)
return span_warning("Your [self_aware ? "appendix" : "lower right abdomen"] feels sore.")
if(3 to INFINITY)
return span_boldwarning("Your [self_aware ? "appendix" : "lower right abdomen"] feels like it's on fire!")
/obj/item/organ/appendix/get_availability(datum/species/owner_species, mob/living/owner_mob)
return owner_species.mutantappendix
/obj/item/organ/appendix/on_mob_remove(mob/living/carbon/organ_owner)
. = ..()
UnregisterSignal(organ_owner, COMSIG_LIVING_POST_FULLY_HEAL)
REMOVE_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type)
organ_owner.med_hud_set_status()
/obj/item/organ/appendix/on_mob_insert(mob/living/carbon/organ_owner)
. = ..()
if(!inflamation_stage)
return
ADD_TRAIT(organ_owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type)
organ_owner.med_hud_set_status()
RegisterSignal(organ_owner, COMSIG_LIVING_POST_FULLY_HEAL, PROC_REF(on_fully_heal))
/obj/item/organ/appendix/proc/on_fully_heal(datum/source, heal_flags)
SIGNAL_HANDLER
if (!(heal_flags & HEAL_ORGANS))
return
inflamation_stage = 0
update_appearance()
UnregisterSignal(owner, COMSIG_LIVING_POST_FULLY_HEAL)
REMOVE_TRAIT(owner, TRAIT_DISEASELIKE_SEVERITY_MEDIUM, type)
owner.med_hud_set_status()
/obj/item/organ/appendix/get_status_text(scanpower, add_tooltips, colored)
if(!(organ_flags & ORGAN_FAILING) && inflamation_stage)
return conditional_tooltip("<font color='#ff9933'>Inflamed</font>", "Remove surgically.", add_tooltips)
return ..()
/obj/item/organ/appendix/pod
name = "pod thingy"
desc = "Strangest salad you've ever seen."
foodtype_flags = PODPERSON_ORGAN_FOODTYPES
color = COLOR_LIME
/obj/item/organ/appendix/pod/Initialize(mapload)
. = ..()
// this could be anything... anything. still useless though
name = pick("pod endoplasmic reticulum", "pod golgi apparatus", "pod plastid", "pod vesicle")
/obj/item/organ/appendix/pod/become_inflamed()
return
#undef APPENDICITIS_PROB
#undef INFLAMATION_ADVANCEMENT_PROB