[MIRROR] new space ruin, the biological research outpost [MDB IGNORE] (#24662)

* 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>

* new space ruin, the biological research outpost

---------

Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@ gmail.com>
This commit is contained in:
SkyratBot
2023-10-31 06:35:11 +01:00
committed by GitHub
parent 7d438d620c
commit 1a2ddececa
28 changed files with 5121 additions and 15 deletions

View File

@@ -0,0 +1,68 @@
/atom/proc/MatchedLinks(id, list/partners)
SUBSYSTEM_DEF(queuelinks)
name = "Queue Links"
flags = SS_NO_FIRE
init_order = INIT_ORDER_QUEUELINKS
///assoc list of pending queues, id = /datum/queue_link
var/list/queues = list()
/datum/controller/subsystem/queuelinks/Initialize()
return SS_INIT_SUCCESS
///Creates or adds to a queue with the id supplied, if the queue is now or above the size of the queue, calls MatchedLinks and clears queue.
/// queues with a size of 0 wait never pop until something is added with an actual queue_max
/datum/controller/subsystem/queuelinks/proc/add_to_queue(atom/what, id, queue_max = 0)
if(!isatom(what))
CRASH("Attempted to add a non-atom to queue; [what]!")
if(isnull(id))
CRASH("Attempted to add to queue with no ID; [what]")
var/datum/queue_link/link
if(isnull(queues[id]))
link = new /datum/queue_link(id)
queues[id] = link
else
link = queues[id]
if(link.add(what, queue_max))
queues -= id
/datum/queue_link
/// atoms in our queue
var/list/partners = list()
/// how much length until we pop, only incrementable, 0 means the queue will not pop until a maximum is set
var/queue_max = 0
/// id
var/id
/datum/queue_link/New(new_id)
id = new_id
return ..()
///adds an atom to the queue, if we are popping this returns TRUE
/datum/queue_link/proc/add(atom/what, max = 0)
. = FALSE
if(what in partners)
return
partners += what
if(queue_max != 0 && max != 0 && max != queue_max)
CRASH("Tried to change queue size to [max] from [queue_max]!")
else if(!queue_max)
queue_max = max
if(!queue_max || length(partners) < queue_max)
return
pop()
return TRUE
/datum/queue_link/proc/pop()
for(var/atom/item as anything in partners)
item.MatchedLinks(id, partners)
qdel(src)
/datum/queue_link/Destroy()
. = ..()
partners = null