## About The Pull Request
Continuation of https://github.com/tgstation/tgstation/pull/78857
FOR TOOO LONG WE HAVE SUFF-
Ok yeah so like, we made them overlays to save on maptick, but with
threaded maptick that is potentially not an issue anymore.
I'm opening this pr so I can tm it and see. If it works, it'll save
about 50% of lighting object update costs, which is pretty damn good.
I'm also removing the fullbright light icon state, since it is barely
ever used (it was added as a clientside op, but we don't hit fullbright
very much at all so it does nothing but eat my cpu time)
Also also changing how SSlighting does its resolution. Rather then
waiting for all sources to process, then working on corners and objects,
instead we will do all the sources we had at the start, then all the
sources after, and so on.
The goal is to avoid churn causing the system to constantly choke. it is
better to potentially double operate then it is for things to feel
horrifically slow.
## Why It's Good For The Game
Faster. Also you won't be able to see lights through walls anymore, so
mesons will be less dumb. Can maybe bump their nightvision a bit idk
we'll see.
## Current Issues
to be found
## Changelog
🆑 Absolucy, LemonInTheDark
fix: You can no longer see lights through walls when using mesons or
when ventcrawling.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
The previous logging messages were copy pastes from eachother so this is
fixing that, but I thought it was better to have more clear wording
while I was here.
## About The Pull Request
Any VV edits to a map that involved numbers in a variable name would get
skipped during loading. This is because the regex pattern used to detect
variable names did not account for numbers. So for example, if you
wanted to VV edit an object's `flags_1` variable, it would get ignored
and be replaced by the initial value.
## Why It's Good For The Game
Map VV's for a ton of objects should work now.
## Changelog
🆑
fix: Fix map reader ignoring valid variable names. If a variable had a
number inside the name anywhere the map reader would ignore this value
when a map was loaded and use the initial value instead. This was due to
a faulty regex pattern that did not properly match variable names.
/🆑
## About The Pull Request
This PR adds a change to a pretty prevalent feature that's been around
since #66588 (April 28th, 2022). Although it has been controversial to
some extent, I believe that it was a good change in principle for
reasons I will later get into. For now, this is what the PR does:
* All _station_ unrestricted door helpers (e.g. those in maintenance)
have been replaced with a subtype that adds a random 2-3 second delay to
opening the door, using a new "unrestricted latch" feature. **This does
not occur if the user has regular access to that door.**
* The unrestricted side will initiate a do_after and plays a distinct
small hissing sound (because I presume you're disengaging some hydraulic
lever on that side), after which the door will open as players have come
to expect.
* While you're engaging the lever, you will be resistant to pressure
movements as you are presumably holding onto the lever or something. All
other movements (e.g. voluntary, being shoved, etc.) will continue to
function as expected.
* We will statistically tabulate each time someone attempts to use the
unrestricted "lever", and every time one successfully occurs. This is
just for analysis to see player trends as we have lacked this over the
last 3.5 years.
Here's a link to the sound I added:
https://freesound.org/people/Usernameis1337/sounds/632755, the version
in this PR was converted using OGG Vorbis.
https://github.com/user-attachments/assets/4167bda4-63b5-4dc0-a7b2-694a9e3d3201
## Why It's Good For The Game
Back in 2022, I was one of the major proponents for adding such a change
to the game. This is for a few reasons:
* It doesn't really make human sense for a station to have
hallways/spaces that you can enter and then just get completely trapped
in. The station is a deathtrap because of _who_ is on it, not because it
_is_ a death trap. I have always maintained that we should assume that
the station is competently made to give the hijinx a much more jarring
background. To me, maintenance isn't old sections of a station (although
it can have those elements), but vital side pathways in the event of
emergencies, like having extra fire stairs in a building. The doors to
those fire stairs are always unlocked because they need to ensure that
people are able to efflux to save themselves from danger rather than
die.
* It was easily subvertable anyways. You can easily ask the HoP for
maintenance access or AI to let you out of maintenance (although the
latter was a bit harder to articulate). I don't find myself agreeing
with this as much nowadays but I remember the frustration I felt waiting
for minutes for someone to open the door had something occurred for me
to have found myself in maintenance. It's simply not fun and doesn't
make sense for a station to have this.
* I thought that it added a unique element to antagonism. You can't drag
someone in maintenance and then have the whole entire subsection of the
station be your den. It's important for you to secure your base should
you be dragging people in there instead of just always being able to win
via dragging.
* People tend to forget this point, but it actually did cause a lot
_more_ deaths in situations where threats originate outside the
station/in maintenance. It was much easier for the killy-stabby mass
murderers to ingress into main hallways and get to killing faster. This
is why the change felt "equal" in a way.
### Why not remove it outright?
I believe that a lot of balance changes over the last 3.5 years (30000
issues ago!) have been weighting for these interactions, and I think
removing it all cold-turkey like will cause a huge upturn in deadliness
and just not be what players are looking for in the new game loop. To
me, this was a vital step in getting more towards 90-minute rounds, and
I think we would see a drop in that. I also have those above three
reasons that I am still a firm believer in, but I am still interested in
seeing what a different system might entail and how that could play out.
I added stat gathering so after we get 4-6 weeks of data, we can
determine to keep or shelve this feature. I will probably always be on
the "blocking" side of removing it outright unless there's some severe
data that can convince me (which will probably need it's own test-merged
PR, while this is meant to be added into the game right now).
### Why are we changing it?
I think not enough people are dying. I played a few rounds yesterday and
while a decent chunk of people were dying, I saw a few follies in my
original line of thought. Maintenance should be a bit creepier and not
auxiliary hallways (in normal circumstances), I already thought we did a
really good job of that but I noticed that it wasn't as good as memory
served me. I think maintenance should have a little bit more difficulty
to navigate (i.e. if you're being chased down by someone and it's taking
2.5 seconds to open, that would be an excellent heart-pounding tension
moment) and would overall be more interesting than the status quo. It is
a bit sillier to me but some IRL buildings do have to have you hold down
the push bar for a few seconds until it disengages, so this is
agreeable.
I also don't think the unidirectional exit design flow standards are
where they were due to drift in application, so this is also a better
way to uniformly apply it.
## Changelog
🆑
balance: After noticing it was too easy for animals to crawl through
maintenance by abusing the Easy-Exit sensors, Nanotrasen has replaced
all unrestricted door sensors (like in maintenance) with a pull-down
lever that should take around 2-3 seconds to engage. It has been
designed to allow the employee to actuate it despite any pressure
differentials within an area.
balance: The above change does not apply to select doors in the medical
section of the station, which will continue to use the "older"
Ready-Exit system.
sound: In order to ensure that staff in high-traffic areas don't go
bonkers due to this new change, sound dampeners have been installed to
prevent the hydraulics from being heard for super long distances.
However, they skimped out on the quality for the ones in maintenance...
/🆑
FYI Mappers/Tweakers: This PR replaces all station map unres mapping
helpers with the new subtype. You are welcome to replace certain doors
with the old helper (the base type) to get the old behavior as you see
fit, just explain why that behavior is desired in that location.
Otherwise, it would be appreciated if we have this new behavior >95% of
the time.
## About The Pull Request
A lot of unit tests give coordinates in their failure messages, if the
cause of the failure is something in a ruin, not only will the failure
be flaky but because placement is random you have no way of matching the
coordinates to a given ruin. This adds logging for the bottom left and
top right coordinates of a ruin upon placement
## Why It's Good For The Game
Lets you know what ruin was placed at a given set of coordinates for
debugging purposes
## Changelog
🆑
code: ruin loading now logs placement coordinates
/🆑
## About The Pull Request
Moves a lot of the unique renaming implementations described in #82664
to the functions given by the `obj_flag` `UNIQUE_RENAME`.
`UNIQUE_RENAME` has been given new properties to account for
non-standard renaming, these being the `RENAME_NO_DESC` flag that
prevents changing the description, the `nameformat()` and `descformat()`
procs that, when modified, allow for applying naming formats(i.e. "Body
Bag - [input]"), as well as other post-renaming handling such as
changing the name of the output plant of a renamed seed, the
`rename_checks()` proc that allows for unique naming prevention(such as
a locked personal closet), and the `rename_reset()` proc to clean up
other possible renamed variables potentially changed in `nameformat()`
and `descformat()`.
This also adds `/datum/element/tool_renaming` to crayons, which will let
them rename anything that has `UNIQUE_RENAME`. I looked through
everything with that flag, and I didn't see anything that I don't think
should be renameable by a crayon(except things that shouldn't be
renamable with pens), so it shouldn't fuck anything up.
## Why It's Good For The Game
moves all of the non-honorable mentions in #82664 to the same renaming
system, and also moves all of the honorable mentions save for:
- plaques, as they only get renamed once and wouldn't benefit from
`UNIQUE_RENAME` imo
- books, because they're far more than just renaming, and are persistent
- paintings, because they're persistent
- photos, because they're not normal renaming and they're persistent
- endoskeletons, because they're done with a multitool in UI
- cardboard IDs, because they're far more than just renaming
Additionally, this fixes:
- Implanter renaming didn't work because a ! was missing
- Clown borg picket sign renaming didn't work because they didn't use
the correct arguments
This'll make it easier to make renameable objects in the future, as
well.
## Changelog
🆑
fix: fixes implanter renaming not working
fix: fixes clownborg picket sign renaming not working
code: brought most unique renaming implementations under UNIQUE_RENAME
/🆑
## About The Pull Request
One of the development hell cycles with mapping is how long it takes to
fix quality or run issues with maps.
By adding a prefix called "maptest_" to some of the unit tests it allows
mappers to only target some tests instead of the usual 350+ tests to run
each time or trying to trigger them individually and faffing.
This does not rename the unit test files themselves to preserve history
but just the "/datum/unit_test/" in each file.
This does not break the current CI or obstruct other tests - A few other
map files that call these tests specifically have been edited to point
at the new datum name.
This assumes you are using the TG testing extension to do this.
| All Tests | maptest_ |
|--------|--------|
| <img width="426" height="106" alt="image"
src="https://github.com/user-attachments/assets/d1d6f81e-16bd-473a-88da-e8b56f8bd3d0"
/> | <img width="434" height="96" alt="image"
src="https://github.com/user-attachments/assets/ea1c47fe-a6ce-40c6-b2cb-65b9c8e94a29"
/> |
| <img width="360" height="886" alt="image"
src="https://github.com/user-attachments/assets/65bcd774-79ad-432e-8211-c67fb9d3e443"
/> | <img width="370" height="833" alt="Screenshot 2025-10-01 204609"
src="https://github.com/user-attachments/assets/ad360796-5698-42fd-bd2e-51de1a02ab87"
/> |
## Why It's Good For The Game
- Should make it easier for mappers to test locally, saving CI/Github
resource for TG
- Mappers can now test their work 56% faster
## Changelog
🆑
code: Mappers can now run just mapping unit tests - Should be 56% faster
- Should have no player impact
/🆑
Co-authored-by: loganuk <falseemail@aol.com>
## About The Pull Request
Station alarm consoles now register to all Station Z levels+Areas if
they were created on a station Z level (this doesn't include mining, but
station ones will see mining areas), otherwise will be a "local" console
to that Z level only.
Mostly the same applies for Cyborg/AI, but if they were built on a
non-station Z level then they have their Z level added on top of Station
Z levels, so example Nukie saboteur borgs will see alarms they might
need, while a Golem/Oldstation AI will also be able to see their own
alarms.
Because of how alarms and spawning in worked, Cyborgs/AIs had CentCom's
Z level as something it would detect, so we simply create the mob at the
spawn location rather than on the title screen during Initialization,
fixing that issue as well.
## Why It's Good For The Game
Adds easy multi-z support for station alarms and removes the previous
bandaid of having to deconstruct your board and multitool it or map in
every single station alarm console to allow station alerts (which is
quite silly) which was done in
https://github.com/tgstation/tgstation/pull/88343.
Closes https://github.com/tgstation/tgstation/issues/61592
Closes https://github.com/tgstation/tgstation/issues/83042
Closes https://github.com/tgstation/tgstation/issues/69314
I find this solution better since it catches pretty much all use cases
without the need for special subtypes and needing players to actually
know the difference between these things.
## Changelog
🆑
fix: Cyborgs and AIs will now see alerts of the whole station rather
than solely the Z level they were spawned on.
fix: Cyborgs and AIs will no longer get alerts about Thunderdome.
/🆑
## About The Pull Request
Changes the "Bolt Lights" wire to a "Feedback" wire, which as well as
disabling the door's lights also disables the deny access sound. Sounds
that happen because the door is actually moving or bolting are
unchanged.
## Why It's Good For The Game
closes#65244
Justification is mostly in mentioned issue, primarily the accessibility
issue of denied door feedback being sound-only when the lights are cut.
Also, "Bolt Lights" is just inaccurate, as it controls all of the lights
on the door.
## Changelog
🆑
balance: The "Bolt Lights" wire is now the "Feedback" wire, and controls
both lights and sounds for the airlock.
/🆑
## About The Pull Request
The `(x, y, size)` arguments for `CHORDS_TO_1D` were in the wrong
position when a map grid layout is procedurally generated. This results
in z-levels that will likely be clustered together near the edge instead
of spreading out evenly from the center.
## Why It's Good For The Game
Code works as intended now.
## Changelog
🆑
fix: Fix map z-level generation starting position. Z-levels used to
cluster together near the edges and will now instead be spread out
evenly from the center.
/🆑
## About The Pull Request
I haven't seen an use case for this but upon reviewing my code i saw it
didn't match up with how the char pointer is incremented everywhere
else. It should increment fully over to the next char instead of the
default increment of 1 which might not always be the case based on the
char type in the list
## Changelog
🆑
code: non ascii chars inside lists in map files can be read without
error
/🆑
## About The Pull Request
- Fixes the proc skipping `0` & `null` values. Text like `"0"` &
`"null"` when sent to `parse_constant()` will yield `0` & `null`
respectively but when checked against `!` operator
https://github.com/tgstation/tgstation/blob/c3e716323e3bbcfdd8704def76791664a34b8adc/code/modules/mapping/reader.dm#L1019
It gets mistaken as an empty value/new line so its skipped So if you had
a list such as `list("Hello", 0, "null")` When parsed it would yield
`list("Hello")`. That's fixed now. We check the text before parsing it
- Fixes `=` symbol getting mistaken for a key/value pair if it is
embedded inside a string expression. Consider this list `list("A", "B =
C")`. This list should just be linear because the equals symbol is meant
to escaped as it is within a string literal. However `findtext()` proc
doesn't account for that
https://github.com/tgstation/tgstation/blob/c3e716323e3bbcfdd8704def76791664a34b8adc/code/modules/mapping/reader.dm#L1014
So we end up creating a key/value pair and a linear element, creating a
broken list like that runtimes(because of the missing `"` symbol in
breaking up the string at the middle)
The solution is simple, we already have the proc
`find_next_delimiter_position()` that will escape everything between `"`
so we now use that to find the position of `=`
- Fixes the proc being unable to parse alists who's values themselves
are lists. Consider the example `list("A" = list(1, 2))`
When we look for `,` symbol to check for the next list element here
https://github.com/tgstation/tgstation/blob/c3e716323e3bbcfdd8704def76791664a34b8adc/code/modules/mapping/reader.dm#L1015
You get a broken left literal like this `"A" = list(1` because the comma
within the list is getting mistaken for a new element. Now we check for
such edge cases and remember to parse the full list before checking for
the next comma & now your alists can contain lists as elements
themselves
- Map reader can read nested lists to any degree e.g. `list(list(3, 4),
list(5, 6))` parses correctly
## Changelog
🆑
fix: the map reader now reads null & 0 values into lists
fix: the map reader now parses associative lists(maps/alists) correctly
in cases where = sign is embedded within a string
fix: the map reader now parses associative lists(maps/alists) who's
values themselves can be lists
fix: the map reader can now parse nested lists to any degree
/🆑
## About The Pull Request
Turns the surface z-level of icebox into a 1x3 area, effectively adding
2 wilderness new z-levels surrounding the station
Because it's not always clear to other people what I'm talking about,
this is what I mean with making the surface level a 3x3 z-level
The wilderness z-levels are gridlinked, instead of crosslinked, which
just means the connections are consistent and not randomized. If you
keep going right, you will always end up where you started again,
eventually. This also removes the black border around the surface icebox
z-level (cause you can just go there now)
**Wilderness levels**
I've added some Z-level templates that can be generated. They're
incredibly basic, but all can spawn runes on them as well.
- Snow planes (5x)
- Ice planes (1x)
- Forest planes (1x)
- Mountain planes (1x)
I've also tweaked surface generation quite a bit. It being completely
covered in bones always felt weird, and the intersparsed rocks and
chasms never sat right with me. The default overworldgen is now more
like the Forested trait, but with more sparse trees.
All of this is modular btw. You can increase the amount of z-levels,
make any space z-level be unrandomized gridlinked or add your own
wilderness z-levels (either to your own map or icebox)
## Why It's Good For The Game
Icebox exploration is kind of depressing. We have this unique setting,
but we can't really go anywhere? You can go down and find that one pool,
which is about the peak of exploration of icebox.
Now you can literally explore the entire round and get incredibly lost!
It's also a great opportunity for mappers! (Especially since the
templates I made were made rather quickly as I wasn't sure if this had
merit).
2 extra z-levels isn't a lot, but it'll let us further develop planetary
wilderness z-levels further without impacting load times that much.
Maybe 3x3 icebox can be real in the future, but for now 1x3 icebox will
have to do
## About The Pull Request
Turns the surface z-level of icebox into a 1x3 area, effectively adding
2 wilderness new z-levels surrounding the station
Because it's not always clear to other people what I'm talking about,
this is what I mean with making the surface level a 3x3 z-level
The wilderness z-levels are gridlinked, instead of crosslinked, which
just means the connections are consistent and not randomized. If you
keep going right, you will always end up where you started again,
eventually. This also removes the black border around the surface icebox
z-level (cause you can just go there now)
**Wilderness levels**
I've added some Z-level templates that can be generated. They're
incredibly basic, but all can spawn runes on them as well.
- Snow planes (5x)
- Ice planes (1x)
- Forest planes (1x)
- Mountain planes (1x)
I've also tweaked surface generation quite a bit. It being completely
covered in bones always felt weird, and the intersparsed rocks and
chasms never sat right with me. The default overworldgen is now more
like the Forested trait, but with more sparse trees.
All of this is modular btw. You can increase the amount of z-levels,
make any space z-level be unrandomized gridlinked or add your own
wilderness z-levels (either to your own map or icebox)
## Why It's Good For The Game
Icebox exploration is kind of depressing. We have this unique setting,
but we can't really go anywhere? You can go down and find that one pool,
which is about the peak of exploration of icebox.
Now you can literally explore the entire round and get incredibly lost!
It's also a great opportunity for mappers! (Especially since the
templates I made were made rather quickly as I wasn't sure if this had
merit).
2 extra z-levels isn't a lot, but it'll let us further develop planetary
wilderness z-levels further without impacting load times that much.
Maybe 3x3 icebox can be real in the future, but for now 1x3 icebox will
have to do
## About The Pull Request
This old mapping helper had a problem with loading notes supplied via
its 'note_path' variable.
## Why It's Good For The Game
The morgue memo note upon the morgue office door on Wawastation now
appears.
Here's me testing it on runtime with a different note...

## Changelog
🆑
fix: fixed the 'note_path' var of the 'airlock_note_placer' mapping
helper
/🆑
## About The Pull Request
This old mapping helper had a problem with loading notes supplied via
its 'note_path' variable.
## Why It's Good For The Game
The morgue memo note upon the morgue office door on Wawastation now
appears.
Here's me testing it on runtime with a different note...

## Changelog
🆑
fix: fixed the 'note_path' var of the 'airlock_note_placer' mapping
helper
/🆑
Prettier (an auto formatter) is set to only run within the tgui folder
currently. This removes that limitation, allowing it to automatically
format all supported files in the repo (.js, .html, .yml
[etc](https://prettier.io/docs/))
I made a few exceptions for bundled and generated files
I'm of the opinion that code should look uniform and am lazy enough to
want CTRL-S to format files without having to think beyond that
## About The Pull Request
Prettier (an auto formatter) is set to only run within the tgui folder
currently. This removes that limitation, allowing it to automatically
format all supported files in the repo (.js, .html, .yml
[etc](https://prettier.io/docs/))
I made a few exceptions for bundled and generated files
## Why It's Good For The Game
I'm of the opinion that code should look uniform and am lazy enough to
want CTRL-S to format files without having to think beyond that
## Changelog
## About The Pull Request
- Primary Surgical Theaters
- Secondary Surgical Theaters
- Robotics Surgical Theaters
Now all start the game with their scrubbers set to scrub nitrous oxide
from the air, and expanded range active
## Why It's Good For The Game
Using anesthetic is annoying because it griefs all of medbay. By having
scrubbers start to filter nitrous, people should feel less worried about
griefing all of medbay without needing to call over engineering first.
An alternative to this could be adding a full ventilator machine to
medical which they use to hook people up to anesthetic. Said ventilator
would have an exhaust tank which collects breaths.
## Changelog
🆑 Melbert
add: Air alarms of surgical rooms (Robotics, Medical) start with
scrubbers set to filter Nitrous Oxide
/🆑
## About The Pull Request
- Primary Surgical Theaters
- Secondary Surgical Theaters
- Robotics Surgical Theaters
Now all start the game with their scrubbers set to scrub nitrous oxide
from the air, and expanded range active
## Why It's Good For The Game
Using anesthetic is annoying because it griefs all of medbay. By having
scrubbers start to filter nitrous, people should feel less worried about
griefing all of medbay without needing to call over engineering first.
An alternative to this could be adding a full ventilator machine to
medical which they use to hook people up to anesthetic. Said ventilator
would have an exhaust tank which collects breaths.
## Changelog
🆑 Melbert
add: Air alarms of surgical rooms (Robotics, Medical) start with
scrubbers set to filter Nitrous Oxide
/🆑
## About The Pull Request
Terminology:
- Red Alert Access allows airlocks and windoors to become all access if
the station has raised to Red Alert (or higher). This temporary all
access is reverted after the station returns to Blue Alert (or lower).
This mechanic isn't new, just not widely used.
Changes:
- Adds a mapping helper for assigning doors to "Red Alert Access"
- Gives "Red Alert Access" to EVA doors on every map
- Gives "Red Alert Access" to the first aid supply windoors in medbay
storage on all maps. Icebox already had this, which is why I thought I'd
expand it because it's a fun idea. (The doors leading INTO medbay
storage do NOT have this, meaning the CMO would likely have to set those
to emergency access.)
- Removes "Red Alert Access" from the secure storage windoor in Icebox's
medbay. Felt odd that it allowed anyone access to the syringe gun
## Why It's Good For The Game
Discussed in #89390 .
I don't think this will be supremely impactful, but you never know. But
if anything, it may lead to people using Red Alert more appropriately
more often, which would be cool for roleplay.
The only problem is that they aren't telegraphed very well, only in
`examine`. Could probably make it more well known
## Changelog
🆑 Melbert
add: EVA doors become all access on Red Alert
add: First Aid Supplies (the compartments in Medbay Storage which hold
medkits) become all access on Red Alert (already present on Icebox).
Medbay Storage itself does NOT become all access.
/🆑
## About The Pull Request
Terminology:
- Red Alert Access allows airlocks and windoors to become all access if
the station has raised to Red Alert (or higher). This temporary all
access is reverted after the station returns to Blue Alert (or lower).
This mechanic isn't new, just not widely used.
Changes:
- Adds a mapping helper for assigning doors to "Red Alert Access"
- Gives "Red Alert Access" to EVA doors on every map
- Gives "Red Alert Access" to the first aid supply windoors in medbay
storage on all maps. Icebox already had this, which is why I thought I'd
expand it because it's a fun idea. (The doors leading INTO medbay
storage do NOT have this, meaning the CMO would likely have to set those
to emergency access.)
- Removes "Red Alert Access" from the secure storage windoor in Icebox's
medbay. Felt odd that it allowed anyone access to the syringe gun
## Why It's Good For The Game
Discussed in #89390 .
I don't think this will be supremely impactful, but you never know. But
if anything, it may lead to people using Red Alert more appropriately
more often, which would be cool for roleplay.
The only problem is that they aren't telegraphed very well, only in
`examine`. Could probably make it more well known
## Changelog
🆑 Melbert
add: EVA doors become all access on Red Alert
add: First Aid Supplies (the compartments in Medbay Storage which hold
medkits) become all access on Red Alert (already present on Icebox).
Medbay Storage itself does NOT become all access.
/🆑
## About The Pull Request
The sequel to https://github.com/tgstation/tgstation/pull/89234
> someone should do the rest at some point
guess what, I'm that someone :3
## Why It's Good For The Game
Same reasoning as the previous PR:
> less cluttered code is nice, and it should in theory be more optimized
as we avoid the need to run min, max, and locate.
## Changelog
No user-facing changes
## About The Pull Request
Another spurious CI runtime that keeps coming up all the time and is
annoying me. I believe it's occurring due to the chair not being
initialized before a `mob_buckler` mapping helper tries to buckle mobs
to it.
So I moved their code to lateload to hopefully ensure that doesn't
happen, as well as an additional safety measure in the armchair code
itself.
edit: confirmed that this does indeed fix it, as I have it merged
downstream preemptively due to it being such a blocking nuisance

Caused by
## Why It's Good For The Game
Less CI failures
## Changelog
N/A
## About The Pull Request
Target is null so we cannot work with its area, etc etc.
## Changelog
🆑
fix: Fixed a runtime in requests console error logging
/🆑
## About The Pull Request
Moved broken on 516 UI's to browser datum
They now work and have a dark theme
Most of them are admin ones (All except 1)
I tried to check all the raw HTML UI's by typing `<< browse(` into the
VSC search and going through each element, but I might have missed
something.
What worked as it was, I didn't touch, except for the Dynamic control
UI's
## Why It's Good For The Game
Admin can do their things on 516
Coders/Mappers can debug some stuff on 516

## Changelog
🆑
fix: Admin/Debug UI's (Especially the Game Panel) now work properly on
Byond 516, instead of showing raw HTML
/🆑
## About The Pull Request
~~This adds a new test for the CI/CD so that we can load all space ruins
instead of it being RNG.~~
Adds more robust logging for ruins so we can see when they fail/succeed
and how many are placed on a map.
This also removes a deprecated CI config setting. It prevented ALL ruins
from spawning during CI tests which is bad.
The config setting was made redundant in:
- #87910
## Why It's Good For The Game
More robust CI/CD.
## Changelog
🆑
code: Add better logging for ruins
/🆑
## About The Pull Request
The ruins get added to forced_ruins, quite often after all ruin budget
is exhausted and thus they don't get spawned.
This adjusts the logic to ignore the budget when there's forced_ruins to
be had.
Also apparently fixes map_logging CI test which was broken by the logic,
and makes the stacked_lights test scream at you with the area name for
the sake of easier debugging as it can proc on the ruins now
## Why It's Good For The Game
Adjusts some logic to allow multi-ruins to spawn correctly, and to make
sure our mappers make good space ruins too
## Changelog
🆑
fix: Ruins will now correctly spawn their tied ruins in
fix: The map_logging test now runs proper
code: The stacked_lights test now screams with area names too.
/🆑
## About The Pull Request
The ruins get added to forced_ruins, quite often after all ruin budget
is exhausted and thus they don't get spawned.
This adjusts the logic to ignore the budget when there's forced_ruins to
be had.
Also apparently fixes map_logging CI test which was broken by the logic,
and makes the stacked_lights test scream at you with the area name for
the sake of easier debugging as it can proc on the ruins now
## Why It's Good For The Game
Adjusts some logic to allow multi-ruins to spawn correctly, and to make
sure our mappers make good space ruins too
## Changelog
🆑
fix: Ruins will now correctly spawn their tied ruins in
fix: The map_logging test now runs proper
code: The stacked_lights test now screams with area names too.
/🆑
## About The Pull Request
Title. I may have been wrong about how depended on this behaviour was
Also, uh, fixes#87986
## Why It's Good For The Game
trim_reduced no longer needs to exist because trimtext() does it faster,
and there's no reason to have a special proc if trim just calls that
proc anyways. I sincerely doubt the proc overhead is so severe that we
need another proc that will ever only be called directly 3 times in the
code.
Since trimtext() does something we don't expect, it's better to just
have SDQL2 queries use trim() so we're all on the same page.
## Changelog
NO!!!
## About The Pull Request
I randomly came across a `var/list/static` in the code, which does not
actually do what was intended, and thought it was silly. A ctrl+f
revealed that this was a fairly common mistake, so I went and fixed all
the instances of it I could find.
~~Including one in lighting code, which it looked like they were trying
to create a global list to cache generated lighting sheet values for
speed, but it was just a normal list that got created each time
pointlessly. Now those values are actually being cached (using a global
var, because a `static` list was not the right thing to use there in the
first place).~~
Nevermind, it seems that this was in fact being cached even if it
shouldn't have been, because byond. Just rearranged it there seeing as
it works either way.
## Why It's Good For The Game
Code that does what it's supposed to
## Changelog
🆑
fix: fixes a bunch of improper static list declarations
/🆑
# Conflicts:
# code/game/objects/items/kirby_plants/kirbyplants.dm