Files
Bubberstation/code/datums/instability_meltdown.dm
FalloutFalcon d2f34e33be moves abstract_type up to datum, spawners wont spawn them (#92909)
## About The Pull Request
moves all implementations (im aware of) for "Im a parent type dont spawn
me please" to the datum layer to standardized behavior
adds a standerized proc for filtering out "bad" items that we dont want
spawning. applies to it the subtype vendor, gifts, and a new spawner and
mystery box for a random gun (neither playerfacing)
"port" of https://github.com/shiptest-ss13/Shiptest/pull/4621



https://github.com/user-attachments/assets/22f6f0b2-b44e-411a-b3dc-6b97dc0287aa

small warning: I dont have EVERY abstract type defined right now but,
ive done a good enough job for now. Im tired of data entry rn
## Why It's Good For The Game
standardizing behavior. Might be a micro hit to performance however

having this lets us not rely on icon state to determine whether
something is a parent type and makes it much easier to tell something is
a parent type (could be applied further to things like admin spawning
menus and things like that).

need feedback on if this is actually good for the game.
## Changelog
🆑
add: Soda cans show up in the silver slime drink table.
add: Examine tag for items that are not mean to show up ingame.
refactor: Standardizes how gifts rule out abstract types.
fix: gifts no longer check if something has an inhand, massively
expanding the list of potential items.
/🆑
2025-09-13 00:36:15 +02:00

165 lines
6.3 KiB
Plaintext

/// A possible genetic meltdown that occurs when someone exceeds 100 genetic instability
/datum/instability_meltdown
/// Used to ensure that abstract subtypes do not get picked
abstract_type = /datum/instability_meltdown
/// How likely a meltdown is to be picked
var/meltdown_weight = 1
/// If this meltdown is considered "fatal" or not
var/fatal = FALSE
/// Code that runs when this meltdown is picked
/datum/instability_meltdown/proc/meltdown(mob/living/carbon/human/victim)
return
// Nonfatal meltdowns
/// Turns you into a monkey
/datum/instability_meltdown/monkey
/datum/instability_meltdown/monkey/meltdown(mob/living/carbon/human/victim)
victim.monkeyize()
/// Gives you brain trauma that makes your legs disfunctional and gifts you a wheelchair
/datum/instability_meltdown/paraplegic
/datum/instability_meltdown/paraplegic/meltdown(mob/living/carbon/human/victim)
victim.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic)
new /obj/vehicle/ridden/wheelchair(get_turf(victim))
to_chat(victim, span_warning("My flesh turned into a wheelchair and I can't feel my legs."))
/// Turns you into a corgi
/datum/instability_meltdown/corgi
/datum/instability_meltdown/corgi/meltdown(mob/living/carbon/human/victim)
victim.corgize()
/// Does nothing
/datum/instability_meltdown/alright
/datum/instability_meltdown/alright/meltdown(mob/living/carbon/human/victim)
to_chat(victim, span_notice("Oh, I actually feel quite alright!"))
/// Gives you the same text as above but now when you're hit you take 200 times more damage
/datum/instability_meltdown/not_alright
/datum/instability_meltdown/not_alright/meltdown(mob/living/carbon/human/victim)
to_chat(victim, span_notice("Oh, I actually feel quite alright!"))
victim.physiology.damage_resistance -= 20000 //you thought
victim.log_message("has received x200 damage multiplier from [type] genetic meltdown")
/// Turns you into a slime
/datum/instability_meltdown/slime
/datum/instability_meltdown/slime/meltdown(mob/living/carbon/human/victim)
to_chat(victim, span_notice("Oh, I actually feel quite alright!"))
victim.reagents.add_reagent(/datum/reagent/aslimetoxin, 10)
/// Makes you phase through walls into a random direction
/datum/instability_meltdown/yeet
/datum/instability_meltdown/yeet/meltdown(mob/living/carbon/human/victim)
victim.apply_status_effect(/datum/status_effect/go_away)
/// Makes you take cell damage and gibs you after some time
/datum/instability_meltdown/decloning
/datum/instability_meltdown/decloning/meltdown(mob/living/carbon/human/victim)
to_chat(src, span_notice("Oh, I actually feel quite alright!"))
victim.ForceContractDisease(new /datum/disease/decloning) // slow acting, non-viral GBS
/// Makes you vomit up a random organ
/datum/instability_meltdown/organ_vomit
/datum/instability_meltdown/organ_vomit/meltdown(mob/living/carbon/human/victim)
var/list/elligible_organs = list()
for(var/obj/item/organ/organ as anything in victim.organs) //make sure we dont get an implant or cavity item
if(!(organ.organ_flags & ORGAN_EXTERNAL))
elligible_organs += organ
victim.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 10)
if(!elligible_organs.len)
return
var/obj/item/organ/picked_organ = pick(elligible_organs)
picked_organ.Remove(src)
victim.visible_message(span_danger("[victim] vomits up [p_their()] [picked_organ.name]!"), span_danger("You vomit up your [picked_organ.name]")) //no "vomit up your heart"
picked_organ.forceMove(victim.drop_location())
if(prob(20))
picked_organ.animate_atom_living()
/// Turns you into a snail
/datum/instability_meltdown/snail
meltdown_weight = 2
/datum/instability_meltdown/snail/meltdown(mob/living/carbon/human/victim)
to_chat(victim, span_notice("Oh, I actually feel quite alright!"))
victim.ForceContractDisease(new/datum/disease/gastrolosis())
/// Turns you into the ultimate lifeform
/datum/instability_meltdown/crab
/datum/instability_meltdown/crab/meltdown(mob/living/carbon/human/victim)
to_chat(victim, span_notice("Your DNA mutates into the ultimate biological form!"))
victim.crabize()
// Fatal meltdowns
/datum/instability_meltdown/fatal
fatal = TRUE
abstract_type = /datum/instability_meltdown/fatal
/// Instantly gibs you
/datum/instability_meltdown/fatal/gib
/datum/instability_meltdown/fatal/gib/meltdown(mob/living/carbon/human/victim)
victim.investigate_log("has been gibbed by DNA instability.", INVESTIGATE_DEATHS)
victim.gib(DROP_ALL_REMAINS)
/// Dusts you
/datum/instability_meltdown/fatal/dust
/datum/instability_meltdown/fatal/dust/meltdown(mob/living/carbon/human/victim)
victim.investigate_log("has been dusted by DNA instability.", INVESTIGATE_DEATHS)
victim.dust()
/// Turns you into a statue
/datum/instability_meltdown/fatal/petrify
/datum/instability_meltdown/fatal/petrify/meltdown(mob/living/carbon/human/victim)
victim.investigate_log("has been transformed into a statue by DNA instability.", INVESTIGATE_DEATHS)
victim.death()
victim.petrify(statue_timer = INFINITY, save_brain = FALSE)
victim.ghostize(FALSE)
/// Either dismembers you, or if unable to, gibs you
/datum/instability_meltdown/fatal/dismember
/datum/instability_meltdown/fatal/dismember/meltdown(mob/living/carbon/human/victim)
var/obj/item/bodypart/part = victim.get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD))
if(part)
part.dismember()
return
victim.investigate_log("has been gibbed by DNA instability.", INVESTIGATE_DEATHS)
victim.gib(DROP_ALL_REMAINS)
/// Turns you into a skeleton, with a high chance of killing you soon after
/datum/instability_meltdown/fatal/skeletonize
/datum/instability_meltdown/fatal/skeletonize/meltdown(mob/living/carbon/human/victim)
victim.visible_message(span_warning("[victim]'s skin melts off!"), span_boldwarning("Your skin melts off!"))
victim.spawn_gibs()
victim.set_species(/datum/species/skeleton)
if(prob(90))
addtimer(CALLBACK(victim, TYPE_PROC_REF(/mob/living, death)), 3 SECONDS)
/// Makes you look up and melts out your eyes
/datum/instability_meltdown/fatal/ceiling
/datum/instability_meltdown/fatal/ceiling/meltdown(mob/living/carbon/human/victim)
to_chat(victim, span_phobia("LOOK UP!"))
addtimer(CALLBACK(victim, TYPE_PROC_REF(/mob/living/carbon/human, something_horrible_mindmelt)), 3 SECONDS)
/// Slowly turns you into a psyker
/datum/instability_meltdown/fatal/psyker
/datum/instability_meltdown/fatal/psyker/meltdown(mob/living/carbon/human/victim)
victim.slow_psykerize()