Files
Bubberstation/code/modules/mapfluff/ruins/spaceruin_code/meatderelict.dm
jimmyl d31c21ff1b new space ruin, the biological research outpost (#79149)
## About The Pull Request

![2023-10-21 18 02
39](https://github.com/tgstation/tgstation/assets/70376633/5829e939-3b04-465f-a186-095ceb360bba)

adds this ruin to space ruin pool
this is a shady (as NT always is) bioresearch outpost that got fucked up
by an experiment
this has like some puzzle aspect to it since you gotta find keycards and
shit and press buttons to unlock shield gates
this ends with you fighting a heart which if you defeat, destroys the
blockade that prevents you from entering the outpost vault

also you can no longer literally just cut indestructible grilles or
unanchor indestructible windows

### new puzzle elements or something idk
variant of pressure plate that you cannot remove and it sends a puzzle
signal
cooler red puzzle doors that look very foreboding or something idk
theyre for this ruin
also puzzle blockades, which are indestructible dense objects that are
destroyed if they receive a puzzle signal
and also buttons and keycard pads for puzzles


https://github.com/tgstation/tgstation/assets/70376633/c98807ec-1e7b-49c4-a757-cdbb76a1b566



https://github.com/tgstation/tgstation/assets/70376633/9d5d9dd1-5868-44e6-a978-5ea57b30c298

stuff that throws electric shocks in a pattern, ignores insuls and only
knocks down, and no you cannot just run past


https://github.com/tgstation/tgstation/assets/70376633/5772917c-a963-48a4-a743-b0f610801d25

### enemies
living floor, it can only attack stuff on top of it and it attacks until
the victim is dead
it is invincible to all but a crowbar, and it cannot move, and it
remains hidden until a victim is in range


https://github.com/tgstation/tgstation/assets/70376633/aa1d54f6-b259-4e58-9d44-e393d2131acf

living flesh, it can replace your limbs with itself
the conditions for that are; the limb must have 20 or more brute, victim
must be alive and dismemberable, the limb may not be torso or head, or
the limb may not be living flesh
alternatively it can replace a missing limb
these are all checked with every attack
they have 20 hp
the limbs in question will sometimes act up, while passively draining
nutrition, arms will randomly start pulling nearby stuff, legs may step
randomly
limbs when detached, turn into mobs and reactivate AI 2 seconds later.
if the host is shocked, all living flesh limbs will detach, or if the
host dies they will also do that


https://github.com/tgstation/tgstation/assets/70376633/765cc99e-c800-4efb-aabe-d68817bbd7ae



## Why It's Good For The Game

ruin variety is cool i think
also the other things i added should be useful for other mappers for
bitrunning or whatever

also bug bad for that one fix
## Changelog
🆑
add: living floor, living flesh, and other stuff for the bioresearch
outpost ruin
add: bioresearch outpost ruin
fix: you may not defeat indestructible grilles and windows with mere
tools
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
2023-10-31 08:15:42 +13:00

157 lines
7.7 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/obj/item/keycard/meatderelict/director
name = "directors keycard"
desc = "A fancy keycard. Likely unlocks the directors office. The name tag is all smudged."
color = "#990000"
puzzle_id = "md_director"
/obj/item/keycard/meatderelict/engpost
name = "post keycard"
desc = "A fancy keycard. Has the engineering insignia on it."
color = "#f0da12"
puzzle_id = "md_engpost"
/obj/item/keycard/meatderelict/armory
name = "armory keycard"
desc = "A red keycard. Has a really cool image of a gun on it. Fancy."
color = "#FF7276"
puzzle_id = "md_armory"
/obj/item/paper/crumpled/bloody/fluff/meatderelict/directoroffice
name = "directors note"
default_raw_text = "<i>The research was going smooth... but the experiment did not go as planned. He convulsed and screamed as he slowly mutated into... that thing. It started to spread everywhere, outside the lab too. There is no way we can cover up that we are not a teleport research outpost, so I locked down the lab, but they already know. They sent a squad to rescue us, but...</i>"
/obj/item/paper/crumpled/fluff/meatderelict/shieldgens
name = "shield gate marketing sketch"
default_raw_text = "The <b>QR-109 Shield Gate</b> is a robust hardlight machine capable of producing a strong shield to bar entry. With control panel integration, it can be enabled or disabled from anywhere, such as ship's Bridge, <b>Engineering Bay</b>, or wherever else! <i>The rest is faded...</i>"
/obj/item/paper/crumpled/fluff/meatderelict
name = "engineer note"
default_raw_text = "I've overclocked the power generators to add that needed juice to the experiment, though they're a bit unstable."
/obj/item/paper/crumpled/fluff/meatderelict/fridge
name = "engineer complaint"
default_raw_text = "Whoever keeps stealing my fucking ice cream from my fridge, I swear I will actually fuck you up. It is not cheap to get this delicious ice cream here, nor is it for you. <b>And don't touch my snacks in the drawer!</b>"
/obj/machinery/computer/terminal/meatderelict
upperinfo = "COPYRIGHT 2500 NANOSOFT-TM - DO NOT REDISTRIBUTE - Now with audio!" //not that old
content = list(
"Experimental Test Satellite 37B<br/>Nanotrasen™ approved deep space experimentation lab<br/><br/>Entry 1:<br/><br/>Subject - \[Species 501-C-12\]<br/>Date - \[REDACTED\]<br/>We have acquired a biological sample of unknown origins \[Species 501-C-12\] from an NT outpost on the far reaches. Initial experiments have determined the sample to be a creature never previously recorded. It weighs approximately 7 grams and seems to be docile. Initial examinations determine that it is an extremely fast replicating organism which can alter its physiology to take multiple differing shapes. \[Recording Terminated\]<br/>- Dr. Phil Cornelius",
"Entry 2:<br/><br/>Subject - \[Species 501-C-12\]<br/>Date - \[REDACTED\]<br/>The creature responds to electrical stimuli. It has failed to respond to Light, Heat, Cold, Oxygen, Plasma, CO2, Nitrogen. It, within moments, seemed to have generated muscle tissue within its otherwise shapeless form and moved away from the source of electricity. Feeding the creature has been a simple matter, it consumed just about any form of protein. It appears to rapidly digest and convert forms of protein into more of itself. Any undigestible products are simply left alone. Will continue to monitor creature and provide reports to Nanotrasen Central Command. \[Recording Terminated\]<br/>- Dr. Phil Cornelius",
"Entry 3:<br/><br/>Subject - \[Species 501-C-12\]<br/>Date - \[REDACTED\]<br/>Any attempts at contacting Nanotrasen has failed. I've never seen anything like it. I... I don't think I'm going to survive much longer, I can hear it pushing on my room door. If anyone reads this, let my family know that I- \[Loud crash\]<br/>GET BACK \[Gunshots\]<br/>AHHHHHHHHHHHH \[Recording Terminated\]<br/>- Dr. Phil Cornelius"
)
/obj/machinery/door/puzzle/meatderelict
name = "lockdown door"
desc = "A beaten door, still sturdy. Impervious to conventional methods of destruction, must be a way to open it nearby."
icon = 'icons/obj/doors/puzzledoor/danger.dmi'
puzzle_id = "md_prevault"
/mob/living/basic/meteor_heart/opens_puzzle_door
///the puzzle id we send on death
var/id
///queue size, must match
var/queue_size = 2
/mob/living/basic/meteor_heart/opens_puzzle_door/Initialize(mapload)
. = ..()
new /obj/effect/puzzle_death_signal_holder(loc, src, id, queue_size)
/obj/effect/puzzle_death_signal_holder // ok apparently registering signals on qdeling stuff is not very functional
///delay
var/delay = 2.5 SECONDS
invisibility = INVISIBILITY_ABSTRACT
/obj/effect/puzzle_death_signal_holder/Initialize(mapload, mob/listened, id, queue_size = 2)
. = ..()
if(isnull(id))
return INITIALIZE_HINT_QDEL
RegisterSignal(listened, COMSIG_LIVING_DEATH, PROC_REF(on_death))
SSqueuelinks.add_to_queue(src, id, queue_size)
/obj/effect/puzzle_death_signal_holder/proc/on_death(datum/source)
SIGNAL_HANDLER
addtimer(CALLBACK(src, PROC_REF(send_sig)), delay)
/obj/effect/puzzle_death_signal_holder/proc/send_sig()
SEND_SIGNAL(src, COMSIG_PUZZLE_COMPLETED)
qdel(src)
/obj/machinery/puzzle_button/meatderelict
name = "lockdown panel"
desc = "A panel that controls the lockdown of this outpost."
id = "md_prevault"
/obj/machinery/puzzle_button/meatderelict/open_doors()
. = ..()
playsound(src, 'sound/effects/alert.ogg', 100, TRUE)
visible_message(span_warning("[src] lets out an alarm as the lockdown is lifted!"))
/obj/structure/puzzle_blockade/meat
name = "mass of meat and teeth"
desc = "A horrible mass of meat and teeth. Can it see you? You hope not. Virtually indestructible, must be a way around."
icon = 'icons/obj/structures.dmi'
icon_state = "meatblockade"
opacity = TRUE
/obj/structure/puzzle_blockade/meat/try_signal(datum/source)
Shake(duration = 0.5 SECONDS)
addtimer(CALLBACK(src, PROC_REF(open_up)), 0.5 SECONDS)
/obj/structure/puzzle_blockade/meat/proc/open_up()
new /obj/effect/gibspawner/generic(drop_location())
qdel(src)
/obj/lightning_thrower
name = "overcharged SMES"
desc = "An overclocked SMES, bursting with power."
anchored = TRUE
density = TRUE
icon = 'icons/obj/machines/engine/other.dmi'
icon_state = "smes"
/// do we currently want to shock diagonal tiles? if not, we shock cardinals
var/throw_diagonals = FALSE
/// flags we apply to the shock
var/shock_flags = SHOCK_KNOCKDOWN | SHOCK_NOGLOVES
/// damage of the shock
var/shock_damage = 20
/// list of turfs that are currently shocked so we can unregister the signal
var/list/signal_turfs = list()
/// how long do we shock
var/shock_duration = 0.5 SECONDS
/obj/lightning_thrower/Initialize(mapload)
. = ..()
START_PROCESSING(SSprocessing, src)
/obj/lightning_thrower/Destroy()
. = ..()
signal_turfs = null
STOP_PROCESSING(SSprocessing, src)
/obj/lightning_thrower/process(seconds_per_tick)
var/list/dirs = throw_diagonals ? GLOB.diagonals : GLOB.cardinals
throw_diagonals = !throw_diagonals
playsound(src, 'sound/magic/lightningbolt.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE)
for(var/direction in dirs)
var/victim_turf = get_step(src, direction)
if(isclosedturf(victim_turf))
continue
Beam(victim_turf, icon_state="lightning[rand(1,12)]", time = shock_duration)
RegisterSignal(victim_turf, COMSIG_ATOM_ENTERED, PROC_REF(shock_victim)) //we cant move anyway
signal_turfs += victim_turf
for(var/mob/living/victim in victim_turf)
shock_victim(null, victim)
addtimer(CALLBACK(src, PROC_REF(clear_signals)), shock_duration)
/obj/lightning_thrower/proc/clear_signals(datum/source)
SIGNAL_HANDLER
for(var/turf in signal_turfs)
UnregisterSignal(turf, COMSIG_ATOM_ENTERED)
signal_turfs -= turf
/obj/lightning_thrower/proc/shock_victim(datum/source, mob/living/victim)
SIGNAL_HANDLER
if(!istype(victim))
return
victim.electrocute_act(shock_damage, src, flags = shock_flags)