Files
Bubberstation/code/game/objects/structures/petrified_statue.dm
Sealed101 73fa2dd425 Fixes edge case of animated petrified statues nullspacing the mob if expired during a jaunt (#91662)
## About The Pull Request

also makes the paralyze on a mob exiting the statue work
I guess the most plausible way to get this was by getting a wizard
holopara animate the wizard with a staff after they flesh to stone
themselves then jaunting when their petrifaction timer is about to
expire.
The solution does make the petrifaction drop you out of stuff like
closets or cargo holds of mecha or something, but that doesn't really
seem like a huge problem to me.

## Why It's Good For The Game

Fixes #73062
makes code work lmao

## Changelog

🆑
fix: fixed petrified statues dropping victims into nullspace if they
somehow ended up in a jaunt
fix: mobs exiting petrification actually get paralyzed for 10 seconds
now as intended
/🆑
2025-06-18 15:26:07 +02:00

133 lines
5.2 KiB
Plaintext

/obj/structure/statue/petrified
name = "statue"
desc = "An incredibly lifelike marble carving."
icon_state = "human_male"
density = TRUE
anchored = TRUE
max_integrity = 200
///Should we leave a brain behind when the statue is wrecked?
var/brain = TRUE
///Time left before the petrification ends and we let the mob free
var/timer = 48 SECONDS
///The mob that got medusa'd
var/mob/living/petrified_mob
/obj/structure/statue/petrified/relaymove()
return
/obj/structure/statue/petrified/Initialize(mapload, mob/living/living, statue_timer, save_brain)
. = ..()
if(statue_timer)
timer = statue_timer
if(save_brain)
brain = save_brain
if(!living)
return
petrified_mob = living
if(living.buckled)
living.buckled.unbuckle_mob(living, force = TRUE)
living.visible_message(span_warning("[living]'s skin rapidly turns to marble!"), span_userdanger("Your body freezes up! Can't... move... can't... think..."))
living.forceMove(src)
living.add_traits(list(TRAIT_GODMODE, TRAIT_MUTE, TRAIT_NOBLOOD), STATUE_MUTE)
living.faction |= FACTION_MIMIC //Stops mimics from instaqdeling people in statues
atom_integrity = living.health + 100 //stoning damaged mobs will result in easier to shatter statues
max_integrity = atom_integrity
START_PROCESSING(SSobj, src)
/obj/structure/statue/petrified/process(seconds_per_tick)
if(!petrified_mob)
STOP_PROCESSING(SSobj, src)
timer -= seconds_per_tick
petrified_mob.Stun(4 SECONDS) //So they can't do anything while petrified
if(timer <= 0)
STOP_PROCESSING(SSobj, src)
qdel(src)
/obj/structure/statue/petrified/contents_explosion(severity, target)
return
/obj/structure/statue/petrified/Exited(atom/movable/gone, direction)
. = ..()
if(gone == petrified_mob)
petrified_mob.remove_traits(list(TRAIT_GODMODE, TRAIT_MUTE, TRAIT_NOBLOOD), STATUE_MUTE)
petrified_mob.Paralyze(10 SECONDS)
petrified_mob.take_overall_damage((petrified_mob.health - atom_integrity + 100)) //any new damage the statue incurred is transferred to the mob
petrified_mob.faction -= FACTION_MIMIC
petrified_mob = null
/obj/structure/statue/petrified/Destroy()
var/turf/dropoff_turf = drop_location()
if(istype(loc, /mob/living/basic/statue))
var/mob/living/basic/statue/statue_mob = loc
forceMove(dropoff_turf)
if(statue_mob.mind)
if(petrified_mob)
statue_mob.mind.transfer_to(petrified_mob)
to_chat(petrified_mob, span_notice("You slowly come back to your senses. You are in control of yourself again!"))
qdel(statue_mob)
for(var/obj/statue_contents in src)
statue_contents.forceMove(dropoff_turf)
petrified_mob?.forceMove(dropoff_turf)
return ..()
/obj/structure/statue/petrified/atom_deconstruct(disassembled = TRUE)
var/destruction_message = "[src] shatters!"
if(!disassembled)
if(petrified_mob)
petrified_mob.investigate_log("has been dusted by statue deconstruction.", INVESTIGATE_DEATHS)
if(iscarbon(petrified_mob) && brain)
var/mob/living/carbon/petrified_carbon = petrified_mob
var/obj/item/organ/brain/carbon_brain = petrified_carbon.get_organ_slot(ORGAN_SLOT_BRAIN)
carbon_brain.Remove(petrified_carbon)
carbon_brain.forceMove(get_turf(src))
carbon_brain.name = "petrified [carbon_brain.name]"
carbon_brain.desc = "[carbon_brain.desc] This one seems a bit more... smooth than a normal brain. Probably'd still work."
carbon_brain.add_atom_colour(list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)), FIXED_COLOUR_PRIORITY)
destruction_message = "[src] shatters, a solid brain tumbling out!"
petrified_mob.dust()
visible_message(span_danger(destruction_message))
/obj/structure/statue/petrified/animate_atom_living(mob/living/owner)
if(isnull(petrified_mob))
return ..()
var/mob/living/basic/statue/new_statue = new(drop_location())
new_statue.name = "statue of [petrified_mob.name]"
if(owner)
new_statue.befriend(owner)
new_statue.icon = 'icons/blanks/32x32.dmi'
new_statue.icon_state = "nothing"
new_statue.appearance_flags |= KEEP_TOGETHER
new_statue.copy_overlays(src, cut_old = TRUE)
new_statue.atom_colours = atom_colours.Copy()
new_statue.update_atom_colour()
petrified_mob.mind?.transfer_to(new_statue)
to_chat(new_statue, span_userdanger("You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! [owner ? "Do not harm [owner], your creator" : ""]."))
forceMove(new_statue)
/mob/proc/petrify(statue_timer)
return
/mob/living/carbon/human/petrify(statue_timer, save_brain, colorlist)
if(!isturf(loc))
return FALSE
var/obj/structure/statue/petrified/new_statue = new(loc, src, statue_timer, save_brain)
new_statue.name = "statue of [name]"
new_statue.icon = 'icons/blanks/32x32.dmi'
new_statue.icon_state = "nothing"
new_statue.appearance_flags |= KEEP_TOGETHER
new_statue.copy_overlays(src, cut_old = TRUE)
new_statue.add_atom_colour(colorlist || list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)), FIXED_COLOUR_PRIORITY)
return TRUE
/mob/living/basic/pet/dog/corgi/petrify(statue_timer)
if(!isturf(loc))
return FALSE
var/obj/structure/statue/petrified/new_statue = new (loc, src, statue_timer)
new_statue.name = "statue of a corgi"
new_statue.icon_state = "corgi"
new_statue.desc = "If it takes forever, I will wait for you..."
return TRUE