## About The Pull Request
Changes Guardian HUD to use action buttons instead of HUD elements,
which means their buttons
1. Can now be moved
2. Can be binded
Other Holoparasite HUD changes:
1- Moves some special buttons like explosive's explosion ability to be
where the "Toggle Mode" button typically is, to be consistent with some
other modes (assassin, gas) that also works like their unique ability.
2- Gives non-dextrous holoparasites the ability to move floors, since
they float.
3- Fixes dextrous holoparasites having 2 health HUDs
4- Moves "Check Guardian Type" verb to a new action button meant to
mimick the Antag UI Info button.
Gives Soulscythes a Combat mode indicator
Locks Revenant's combat mode indicator (cause it does nothing)
Adds another hoverable HUD element, basic mobs can now hover over their
healthdoll to see their Health %
<img width="85" height="123" alt="image"
src="https://github.com/user-attachments/assets/ad660ba4-296c-4699-9ec4-03a6e7b97880"
/>
<img width="95" height="101" alt="image"
src="https://github.com/user-attachments/assets/12d4d9d3-cf2c-4c52-81aa-17ce538b9d48"
/>
Adds a Unit Test to ensure all basic mobs have a HUD that shows some
form of health & combat mode (unless unnecessary like Revenants), to not
lose any information from basic mob conversion now that they lose the
stat panel.
## Why It's Good For The Game
This is yet another supplement of
https://github.com/tgstation/tgstation/pull/95383 - Removing stat panel
entries for all basic mobs is a great move towards lessening the
reliance of mobs on the stat panel.
This is also just good QoL for Holoparasites, especially since their
stat panel had 2 entries for "Master HP" and your "Own" HP, despite
Holoparasites not even having their own HP at all.
## Changelog
🆑
qol: Holoparasites' abilities are now action buttons, so you can rebind
or move them.
qol: Holoparasites now have floor change buttons.
fix: Holoparasites and Soulscythes now have a combat mode indicator.
fix: Dextrous holoparasites now have their inventory slot again while
non-dextrous had it taken away (not that they could use it).
/🆑
## About The Pull Request
this translates some various
- `FLOOR(x, 1)` -> `floor(x)`
- `CEILING(x, 1)` -> `ceil(x)`
- `SIGN(x)` define is gone, just uses the native BYOND `sign()` now.
Also, the `MODULUS` define is just a wrapper for the [BYOND `%%`
operator](https://ref.harry.live/operator/modulomodulo) now.
would be nice if someone double checked to make sure there's no
potential subtle oddities resulting from this.
## Why It's Good For The Game
These procs presumably did not exist whenever the defines were written -
and they are BYOND builtins, meaning it will just be, say, one `sign`
instruction, instead of two comparisons and a subtraction.
## Changelog
no player-facing changes
## About The Pull Request
Dont show swap hand tutorial if you only have 1 hand as you cannot
complete it.
## Why It's Good For The Game
Someone on a downstream had an issue where it kept showing them the
tutorial but they could not complete it as they play a character with
only 1 arm.
Could prob extend this to a disabled limb as well.. dunno.
## Changelog
🆑
fix: The swap hand tutorial wont be shown to someone missing a hand
/🆑
## About The Pull Request
Since grabs that failed due to a comsig return or the grab being blocked
returned FALSE, they'd still result in the target being passively
grabbed from being pulled as that was called upon the grab failing. I've
added multiple return types to grabs to alleviate this.
Per anne's recommendation, hunter boxing is exempt from the grab
restriction (since it never functioned in the first place).
## Changelog
🆑
fix: Fixed boxing or successful blocking not preventing grabs
/🆑
## About The Pull Request
This was my bad.
Combat mode now stores it's default screen location, so it can be
restored when swapping to "Full" HUD. We can't simply do initial screen
location because most mobs do not have their initial position the same
as humans.
Also fixes sleep icon being permanently invisible, makes "Toggle hotkeys
button" respect the Rest button, and makes combat mode an "info" button
solely so we don't have to manually add it for minimized HUD mode.
## Why It's Good For The Game
Fixes some UI issues that popped up.
## Changelog
🆑
fix: The Combat indicator will now properly move back to its original
location when using F12.
fix: Sleep icon now appears again & rest icon now respects "Toggle
Hotkeys button" mode.
/🆑
## About The Pull Request
This is a port/revival of Kapu's
https://github.com/DaedalusDock/daedalusdock/pull/883
By god, please TM this for a while, as HUDs are rather volatile and I
might've missed something (also the original PR had harddel issues, so
we should probably be on the lookout for those)
Instead of being stored in a metric ton of separate variables, all HUD
elements are now kept in a ``key -> element`` assoc list, and separate
category lists have been turned into a single ``group_key -> list of
elements`` assoc list for easier management.
This massively simplifies HUD creation and management, and allows us to
sanely dynamically modify HUDs without having to keep track of our
elements ourselves (harddel fuel)
I've also noticed that plasma vessels had... interesting, to say the
least, way of managing their HUD and in humans were unable to display
it, which I've changed (the element itself is displayed below stamina in
non-aliens, as latter occupies the spot where you'd normally see it)
Also fixes a bunch of minor unlikely to occur issues with HUD not
updating when it should've sometimes.
## Why It's Good For The Game
The two most important results of this is that A) we can fix the issue
with items larger than 32x32 not displaying properly in inventories (in
a separate PR) and B) this paves the way for datumized inventory slots,
although that is a separate nightmare
Some of this code is also actually over a decade old, and is an absolute
nightmare to work with.
## Changelog
🆑
qol: Non-aliens with an implanted plasma vessel now see their plasma
level in their HUD instead of just the stat panel
refactor: Refactored the entirety of HUD management code, report if
anything breaks!
/🆑
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
## About The Pull Request
There's a 30% chance that there's no random layer which leads to
runtimes occuring whenever anyone with maxed out parallax tries to move
## Changelog
🆑
fix: Fixed parallax runtiming horribly whenever parallax SS doesnt pick
a random layer to display
/🆑
## About The Pull Request
When you put on a space suit, it gives you stat panel entries for
whether the thermal regulator is on, and the charge in the cell.
This replaces it with the already-existing HUD element, and improves
upon it.
1. Re-uses mod's "very low" icon for the HUD, now "max" charge is
100-60%, "mid" is 60-40%, "low" is 40-20% and under that is "very low"
2. The icon now displays "OFF" when the thermal regulator isn't running
3. You can click on the HUD element to turn the thermal regulator on
4. You can hover over the HUD element to see the exact percentage your
space suit is at
https://github.com/user-attachments/assets/3a6cc33d-25d1-479d-99d5-f8160316c230
Maybe in the future we could remove the action button as well if the HUD
element is preferable, as we already seem to have an excess amount of
action buttons. Alternatively we can remove the HUD element entirely and
move the behaviour to the action button, like what we did with the
internals HUD. I'll leave that up to future discussion though I lean
more on it being a HUD element.
## Why It's Good For The Game
Helps me kill the stat panel as part of
https://hackmd.io/443_dE5lRWeEAp9bjGcKYw?view
Space suits is one of the larger parts of this issue as people are
typically expected to wear a space suit, so I think it's pretty
important we get this one done sooner rather than later. Same as my
other recent PRs, this one is also a complement of
https://github.com/tgstation/tgstation/pull/95383
## Changelog
🆑
qol: The stat panel entry for space suits has been replaced with the HUD
element. You can now hover over it to see exact cell percentage, and
click it to turn the regulator on, while it'll also display when it's
off.
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
The stat panel for Changelings shows how much DNA you have absorbed (for
your objectives) & The upper limit to how many chemicals you can hold.
How many people you have absorbed now shows up in your Antag info page
(which you'll already be there to see how many genomes you'll need for
the objective anyways), and the upper limit to your ling chems is now
shown when you hover your mouse on the HUD element.
This is also now explained when you click on the HUD & in the Antag Info
page. Hovering over the icon also turns it red to indicate it's a
different thing being shown, and that it is clickable (to get another
explanation).
https://github.com/user-attachments/assets/71c935d3-2d21-4d4b-bb8c-cc183110e2e2
## Why It's Good For The Game
Moving things away from the stat panel is a goal I've been focusing on
because it borderline hides information away from people who don't know
when and what information is listed in the stat panel.
This hopes to make that information much easier to access and improving
on Changeling's lackluster hud & explanations on things. My first time
playing Changeling I remember clicking on the HUD, it not responding to
my clicks, and being confused what the number was for. This is what gave
me the idea to have this more dynamic & clickable HUD, and my hope is
that this makes it easier for new players to understand.
We also now explain how a Changeling's max chem can increase much better
now, than the current version's 'grows in power'.
This also pairs well with
https://github.com/tgstation/tgstation/pull/95383 as it becomes one less
source of forcefully giving people stat panels if they turn it off.
## Changelog
🆑
qol: Changeling's stat panel entry has been moved to the HUD & Antag
panel. Also added some extra explanations on how Changelings work in
there.
/🆑
## About The Pull Request
Ok so on the parallax pr I moved a bunch of dumb plane group signal
registration to the set home proc. Unfortunately because set_home is run
BEFORE update_offset, any created relays will then be offset down X from
where they should be.
For the master plate, this means #1's relay to transparent plate #0 will
instead draw to transparent plate #1 (which of course renders into
master plate #1)
To fix this I've moved update_offset to BEFORE set_home, so children can
hook into it and do things in a sane and normal way. Near as I can tell
there's no reason they're ordered as they currently are. I've also added
a failsafe check to prevent relay creation before update_offset is
called, and attached a CRASH() to such.
Interestingly enough this caused crashes on shift right click. That's
fun I think
## About The Pull Request
I want to do stuff with parallax (like placing stuff in the backdrop and
moving it around), but I'm in my not doing 100 things in one pr arc so
we're doing this piecemeal.
To start, I wanted to try adding oldspace back as a parallax layer. This
is something I was considering when it was first removed but never got
around to, so here we are.
I started by [writing a rust
program](https://github.com/LemonInTheDark/old_space_gen) to fabricate
the required icon state, then realized that all the different parts of
space have their own animation delays. There's no way I could make one
icon state with all them looping, so instead I split them up into
multiple components and then overlayed them together.
This works, but is infeasible (my gpu died) at the scale required for
parallax (17 480x480 sets, 15 unique delays per 1 set) so I used render
targets to render one copy, then mirror it to the rest of the overlays.
This works wonderfully, and gets us down to (on my machine) a gpu cost
comprable with about medium parallax intensity.
I'm open to making these tile bound but I thought making them look "far
away" feels better.
In the process of all this I got very mad at the existing parallax code,
soooooooo
Parallax layers are no longer stored on the client, they are stored on
and managed by the parallax home atom that holds them for display. Said
atom also tracks all the information about how they are selected.
Parallax layers no longer take a hud as input, instead expecting a
client. (we were just swapping them back and forth and I thought it was
dumb).
Parallax no longer tries to support passing in a mob that does not
actually own the hud it is displayed on. This feature wasn't even being
used anymore because it was fully broken, so all it was doing was making
the code worse.
Parallax no longer has to do a full refresh anytime something about WHAT
layers are displayed might have changed. We cache based off the
variables we care about, and use the change in state to determine what
should happen (this is improved by moving "rendering the layers" fully
to the control of the home datum).
Parallax no longer directly modifies the hud's plane masters, instead
relying on trait based signals to manipulate them (this avoids wasted
time in the common event of a needless parallax prefs check).
Parallax no longer has 2 procs that are only called together to
"remove/readd/update" the layers, instead doing both in a new check()
proc.
Cleans up some plane master cruft to do with tracking/managing huds
(might break, tested, think it's fine).
## Why It's Good For The Game
https://github.com/user-attachments/assets/79138a0f-9f6d-447d-843e-0d237db13276
## Changelog
🆑
add: Added an option for rendering space parallax with old space sprites
(the ones from before we invented parallax), they're animated and I feel
quite pretty.
fix: Space parallax should hopefully behave a little more consistently
now
refactor: Rewrote a lot of how space parallax handled itself, please
yell at me if any bugs make themselves known
/🆑
## About The Pull Request
- The `prosthetic replacement` surgical operation has been reverted to
be closer to how it used to work: The operation is done targeting the
limb that's missing
The change was made out of necessity, as surgical state was tied to
limbs - you had to operate on the chest to re-attach limbs because there
was no limb to operate on.
To circumvent that, I have done the unthinkable of adding stumps when
you are dismembered.
- Missing limbs are now represented as an invisible, un-removable,
un-interactable limb.
Making this change was not as difficult as originally anticipated, and
(at least surface level) seems to have broken very little.
Surprisingly little had to change to make this work.
Direct accesses to `mob.bodyparts` was changed to `mob.get_bodyparts()`
with an optional `include_stumps` argument.
Similarly, `get_bodypart()` had an optional `include_stumps` added.
This means we ultimately barely needed to change anything, and in fact,
some loops/checks were able to be streamlined.
## Why It's Good For The Game
- As mentioned, this change was out of necessity and was easily the
least intuitive part of the broader changes. Reverting it back to how it
used to work should make it far easier for people to pick up on, and
means we can cut out a bunch of bespoke instruction sets that I had to
include.
- The addition of stumps also adds a ton of future potential - code wise
it allows for stuff like better damage tracking (we can transfer damage
between limb <-> stump rather than limb <-> chest), and feature we can
do "fun" stuff like have stumps bleed on dismemberment that you can
bandage.
## Changelog
🆑 Melbert
del: "Add prosthetic limb" surgical operation has been reverted to be a
bit closer to how it used to work - you operate on the missing limb /
limb stump, rather than on the chest.
refactor: Missing limbs are now represented as limb stumps. In practice
this should change nothing (for now), as no features were rewritten to
make use of these besides surgery. Please report any oddities with
missing limbs, however.
/🆑
## About The Pull Request
Turns out `/datum/hud/proc/update_parallax` still had a lot of remnant
code back from when it ticked an update on every tick, even though it
now only gets called on movement/z level changes. This prevented it from
updating the locations of parallax layers unless you move, which is
usually not an issue and goes unnoticed in the case of hud reloads or
pref changes, since the parallax layer cache keeps the correct offsets.
Except in the one specific case that needs to clear this cache entirely
(`swap_out_random_parallax_layer`), which causes it to regenerate with
no offsets, and jump to the correct position abrubtly when you move.
This fixes that
## Why It's Good For The Game
Fixes a bug. I tested when the proc gets called extensively and it's
exclusively on movement and on hud/pref updates concerning the parallax,
which all should get a full reload and not a half-attempt.
## Changelog
🆑
fix: Parallax layers no longer snap to and from the center of the screen
abrubtly when changing the random parallax layer.
/🆑
## About The Pull Request
Revival of https://github.com/tgstation/tgstation/pull/91378 for renewed
effort of ruining the stat panel for everyone.
This PR does a few things to address issues I've had with the HUD in
hopes to bring reliance less upon the stat panel.
1. Adds a Memory button
<img width="133" height="169" alt="image"
src="https://github.com/user-attachments/assets/7f643882-5666-4099-9c68-5d6092a6d82c"
/>
<img width="134" height="169" alt="image"
src="https://github.com/user-attachments/assets/e7592ec3-ec3e-4afe-baa3-6d0e6d5d22c8"
/>
Potential alt icon, but I don't know if it's better
<img width="1322" height="115" alt="image"
src="https://github.com/user-attachments/assets/82cc6ad9-becd-4502-8b83-276b0ef6ed0d"
/>
2. Makes Alien, Animal & Borg HUDs more compact (This is uploaded before
Borg HUD icons were made)
Borg - Removed 'Store' button, now you left click your model to store it
(RMB to open/close), think of it more like a bag now.
<img width="1054" height="324" alt="image"
src="https://github.com/user-attachments/assets/5352a350-8f3e-4b3a-8634-929e2c9aa2f4"
/>
Alien
<img width="305" height="189" alt="image"
src="https://github.com/user-attachments/assets/c0f0b9f0-941a-405e-bdfd-4b5b46690fb6"
/>
Animals - Their HUDs now appear in the corner of the screen rather than
having the strange offset
<img width="202" height="168" alt="image"
src="https://github.com/user-attachments/assets/ddf26108-d930-4744-8ef5-17f981a3384b"
/>
I didn't touch gorilla, they still look weird.
<img width="732" height="181" alt="image"
src="https://github.com/user-attachments/assets/5c1534c3-7190-491d-8a1f-6fe51eebd9a2"
/>
2. Fixes borg numbers not showing up at the request of a user
<img width="701" height="312" alt="image"
src="https://github.com/user-attachments/assets/65464e15-8e31-41f8-b506-050fa27cebde"
/>
Closes https://github.com/tgstation/tgstation/issues/95163
I also added a rustle sound when you drop something as a borg so you
have an audio cue that you dropped something, sometimes as a borg I'll
drop something and think it disappeared, cause I didn't realize I
accidentally hit drop. This is a local sound, so it doesn't play to
anyone near you. Purely for feedback.
3. If you didn't notice, this de-hardcodes the UI for non-humans
UIs now respect your prefs for many more mobs now, pretty much only the
ones with unique special UIs (Alien, pAI, AI, Borg) will now respect
your prefs.
## Why It's Good For The Game
UIs make a bit more sense, takes Memories out of being only accessible
through the stat panel, allows your prefs to be respected more and makes
inventories a little more consistent through mob types.
If the stat panel is to be removed or made optional, we can't afford to
hide Memories through it because certain antagonists (see: nukies)
absolutely rely on it.
## Changelog
🆑 ttt, JohnFulpWillard
add: Added a Memory HUD to your UI. In case you didn't know, you get
memories of things happening around the station, or important antagonist
info such as the nuclear codes.
del: Removed Borg's "store" button, now the cyborg module will behave
more similar to a backpack (LMB to store, RMB to open/close)
fix: Borg material now properly displays how much materials they can
afford with their cell's charge.
qol: Your HUD prefs are respected on more mobs now.
qol: Improved the HUD of simple/basic animals, as well as Cyborgs, AIs,
pAIs and Xenomorphs.
/🆑
---------
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
## About The Pull Request
While initializations are running, the, slowly updating, time to start
will be displayed.
## Why It's Good For The Game
I'm hoping to psychologically manipulate players with this to retain
them between rounds.
## Changelog
🆑 Dominion
qol: Did you know the roundstart countdown is inclusive of loading
times? Now you can see it.
/🆑
Co-authored-by: Jordan Dominion <Cyberboss@users.noreply.github.com>
## About The Pull Request
Makes the ghost toggles that make your clicks produce health and chem
scans on people show the scan information after standard examine
information
## Why It's Good For The Game
This makes these scans less annoying to use, as you don't have to scroll
up after using them.
## Changelog
🆑
qol: Ghost health and chem scanning displays after examine information
rather than before
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Adds a slider to the gameplay tab which allows users to control the size
of the emissive bloom.
## Why It's Good For The Game
This is mostly visual and doesn't have a noticeable performance impact,
but some people might find it distracting or might want a stronger bloom
for prettier lights.
## Changelog
🆑
qol: Added a preference to adjust emissive bloom size
/🆑
## About The Pull Request
On the bottom right of the ghost hud, there will be buttons to toggle
the various ghost hud changes
<img width="253" height="130" alt="image"
src="https://github.com/user-attachments/assets/98e66f4f-b211-4d45-9f18-382d4a50de37"
/>
- Darkness level
- Atmos click scan
- Heath click scan
- Chem click scan
- Data huds
- Tray scan
- Ghost vision
## Why It's Good For The Game
Provides an easy place to toggle things without needing to fish though a
side panel or UI, or type something in chat.
Plus shows you at a glance what you all have on.
## Changelog
🆑 Melbert
add: Adds screen hud elements for ghost toggles
/🆑
## About The Pull Request
What it says on the tin. `times_fired` is the most unused parameter in
all mob procs. I say most because there were just 2 cases where it was
used
- handling breathing
- handling heartbeat
Besides these 2 cases this parameter did nothing in every proc. Removing
it does 2 things
- Makes those procs more readable as it now has 1 less parameter that
was documented poorly and did nothing
- Makes those procs slightly faster as we are passing 1 less variable to
its parameter call stack
It can easily be substituted with `SSmobs.times_fired` which was its
original value anyways
## Changelog
🆑
code: removes an unused parameter `times_fired` from mob life procs.
Making them function slightly faster
/🆑
## About The Pull Request
Splinter of #94324
Plasmamen no longer take 1.5x brute and burn damgae
Plasmamen are now affected by demolition modifier, meaning they take
less damage from sharp objects and more damage from blunt objects
Skeletons and golems are also affected by demolition modifier
## Why It's Good For The Game
As a part of #94324 I was making `MINERAL` mobs affected by demo mod
But I realized this would absolutely murder the heck out of Plasmamen!
1.5x brute + another 1.25x brute from blunt objects!
But then I realized "wait that kinda makes sense... a lot *more* sense
than the arbitrary damage modifier"
So here we are
Plasmemes are as vulnerable to being smashed to bits as before, but can
now boast a minor resistance to being stabbed due to their lack of
fleshy bits
This feels a bit more appropriate to their skeletal nature without
completely removing that aspect of their character. It also gives them a
very minor upside (they need it)
## Changelog
🆑 Melbert
balance: Plasmamen no longer take flat 1.5x brute and burn damage
balance: Plasmamen are now affected by weapon demolition modifier,
meaning blunt attacks deal more damage but slashing or piercing deal
less damage
balance: Skeletons and Golems are also affected by weapon demolition
modifier, as well as any mineral type mobs (of which none currently
exist)
/🆑
## About The Pull Request
show_hud() did not properly unregister the signals which caused stack
traces from signal overrides
## Changelog
🆑
fix: Fixed runtimes caused by auto-observing someone repeatedly
/🆑
## About The Pull Request
On production, I sign up for rounds (and I know I pushed the button
because the auto-deadmin message comes up) but it doesn't inject me in
the game and fails without a warning. I have no idea why it's doing this
but I shifted some stuff around and added a few logs to hopefully stop
this strange consistent failure for me to start a shift.
I just cleaned up a lot of the code and turned the ready defines into
strings instead of a boolean (so I could log it more efficiently with
little overhead, as well as standardize it to a define without people
doing wacky shit everywhere). I don't think this will fix the issue but
it will definitely make some things more clear as to why I'm not joining
rounds without warning despite clicking ready.
## Why It's Good For The Game
Cleans the code up while trying to resolve a really puzzling bug I've
been having.
## Changelog
🆑
server: The ready/not ready states of new players are logged when a
shift starts.
/🆑
## About The Pull Request
Since simplemobs can be dealt stamina damage
(https://github.com/tgstation/tgstation/pull/90675)
gives simplemobs who take stamina damage a stamina bar - Since it's
missing
Simplemobs who can't take stamina damage still wont be able to see the
hud - so don't worry about clutter/miss information
## Why It's Good For The Game
Simplemobs have a missing stamina hud
## Changelog
🆑 ArchBTW
fix: Gives eligible sentient simplemobs a stamina hud
/🆑
Co-authored-by: glue0000 <230859540+glue0000@users.noreply.github.com>
## About The Pull Request
So something i missed from when i played Goonstation a long while ago
was my blind characters, i tried recreating them in TGCode but found
that the blind quirk here is far more harsh to play visually. So i got
some help from Melbert and got a plan goin and here's the results.

Players can see colors! But muted, this change is strictly for visual
enjoyment as the constant monochrome is just - i cant really describe
how much i hate seeing it for more than 15 minutes.
Secondly the flicker is gone from the quirk but remains for all the
temporary blindness, this is 100% Melberts code as they're a helluva lot
smarter than I am and I just nod and smile before pasting it. This did
entail creating a new fulscreen in the dmi, but i just copy/pasted the
existing one and took out the animated frames and named it as 'static'
so it wouldnt interfere with anything else using it.
## Why It's Good For The Game
Playing a blind character is great, however it causes some serious
eyestrain after prolonged playstyle
## Changelog
🆑 MrMelbert, Zergspower
qol: The world is now heavily desaturated while blind, rather than pure
monochrome, to give players some visual stimulus
qol: When blind, the brief flicker of the entire screen now only appears
for mobs temporarily blinded - ie, mobs blinded from quirk / trauma /
genetic mutation no longer experience it
/🆑
## About The Pull Request
I was gonna make a PR to delete this then I realized the code for it is
still in game the script just doesn't work anymore so I made it work for
a laugh
EDIT: okay i got a little invested and cleaned up how it looks a bit too
## Why It's Good For The Game
https://files.catbox.moe/9pwdr4.mp4
Everyone Is Here
## Changelog
N/A
## About The Pull Request
It's just a partial cleanup of
anti-[STYLE](https://github.com/tgstation/tgstation/blob/master/.github/guides/STYLE.md)
code from /tg/'s ancient history. I compiled & tested with my helpful
assistant and damage is still working.
<img width="1920" height="1040" alt="image"
src="https://github.com/user-attachments/assets/26dabc17-088f-4008-b299-3ff4c27142c3"
/>
I'll upload the .cs script I used to do it shortly.
## Why It's Good For The Game
Just minor code cleanup.
Script used is located at https://metek.tech/camelTo-Snake.7z
EDIT 11/23/25: Updated the script to use multithreading and sequential
scan so it works a hell of a lot faster
```
/*
//
Copyright 2025 Joshua 'Joan Metekillot' Kidder
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
//
*/
using System.Text.RegularExpressions;
class Program
{
static async Task Main(string[] args)
{
var readFile = new FileStreamOptions
{
Access = FileAccess.Read,
Share = FileShare.ReadWrite,
Options = FileOptions.Asynchronous | FileOptions.SequentialScan
};
FileStreamOptions writeFile = new FileStreamOptions
{
Share = FileShare.ReadWrite,
Access = FileAccess.ReadWrite,
Mode = FileMode.Truncate,
Options = FileOptions.Asynchronous
};
RegexOptions regexOptions = RegexOptions.Multiline | RegexOptions.Compiled;
Dictionary<string, int> changedProcs = new();
string regexPattern = @"(?<=\P{L})([a-z]+)([A-Z]{1,2}[a-z]+)*(Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss)([A-Z]{1,2}[a-z]+)*";
Regex camelCaseProcRegex = new(regexPattern, regexOptions);
string snakeify(Match matchingRegex)
{
var vals =
matchingRegex.Groups.Cast<Group>().SelectMany(_ => _.Captures).Select(_ => _.Value).ToArray();
var newVal = string.Join("_", vals.Skip(1).ToArray()).ToLower();
string logString = $"{vals[0]} => {newVal}";
if (changedProcs.TryGetValue(logString, out int value))
{
changedProcs[logString] = value + 1;
}
else
{
changedProcs.Add(logString, 1);
}
return newVal;
}
var dmFiles = Directory.EnumerateFiles(".", "*.dm", SearchOption.AllDirectories).ToAsyncEnumerable<string>();
// uses default ParallelOptions
// https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions?view=net-10.0#main
await Parallel.ForEachAsync(dmFiles, async (filePath, UnusedCancellationToken) =>
{
var reader = new StreamReader(filePath, readFile);
string oldContent = await reader.ReadToEndAsync();
string newContent = camelCaseProcRegex.Replace(oldContent, new MatchEvaluator((Func<Match, string>)snakeify));
if (oldContent != newContent)
{
var writer = new StreamWriter(filePath, writeFile);
await writer.WriteAsync(newContent);
await writer.DisposeAsync();
}
reader.Dispose();
});
var logToList = changedProcs.Cast<KeyValuePair<string, int>>().ToList();
foreach (var pair in logToList)
{
Console.WriteLine($"{pair.Key}: {pair.Value} locations");
}
}
}
```
## Changelog
🆑 Bisar
code: All (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use
snake_case, in-line with the STYLE guide. Underscores rule!
/🆑
## About The Pull Request
Fixes#93887 by checking the client's viewport when positioning the
station trait buttons.
## Why It's Good For The Game
Fixes bug.
## Changelog
🆑 LT3
fix: Station trait buttons display correctly on non-widescreen clients
/🆑
## About The Pull Request
Moves all blood handling into procs and adds ways to easily hook into
basically every basic blood behavior.
This PR is not meant to fix every single case of janky blood logic in
the game. The main point and motivation of this PR is to add hooks for
blood behaviors. This allows for way more flexibility with blood code.
I am not going to fix our 3000 instances of single-letter vars, wacky
blood transfers, etc. This is just the groundwork for future PRs to
build off of, and by itself, should do very little to change blood
behavior.
I also added a rigorous set of unit tests for verifying that all of the
basic blood volume procs work correctly.
## Why It's Good For The Game
Previously, blood was handled via directly reading/writing
[var/blood_volume]. This was INCREDIBLY inconsistent and there was no
way to hook into it. This PR makes blood handling way more consistent,
which is great for all sorts of features.
## About The Pull Request
Isolates signpost teleport code into a component
`/datum/component/houlihan_teleport`, which takes a question argument
and a list of zlevels.
Removes `/obj/structure/no_effect_signpost` and turns existing mapped-in
instances into `/obj/structure/signpost`s
Adds/documents/fixes some attack signals that were added to the element
## Jebediah
<img width="100%" alt="image"
src="https://github.com/user-attachments/assets/b227e5bd-1c93-41b3-b87f-1a559cf81112"
/>
## Changelog
🆑
refactor: Signposts have had their code improved internally. Please make
an issue if a signpost that should teleport you no longer can.
/🆑
## About The Pull Request
When a camera update is triggered, it is instead added to a queue on a
background subsystem
An AI entering a camera chunk which is queued to update will force the
update immediately (bypassing the queue)
While the root problem of this is, ultimately, not addressed...
<img width="554" height="58"
alt="467828777-eff3f0e5-49d6-4997-b4d7-05eff6432155"
src="https://github.com/user-attachments/assets/c2d6a5f5-d958-463e-959f-116bd0dab475"
/>
...the change will ultimately prevent update spam from consuming all of
the server's resources - instead allocating updates to the backburner in
times of high server stress (or on multi-z maps)
## Changelog
🆑 Melbert
refactor: Refactored the way camera updates are handled to hopefully
reduce some lag. Report any oddities
/🆑
## About The Pull Request
<img width="585" height="67" alt="image"
src="https://github.com/user-attachments/assets/9f189a3f-db21-4a9c-a079-bb8399483533"
/>
Fixing runtime spam...here's one where it's just due to `owner` being
nulled in the `Destroy()`. A `datum/action_group` gets qdeleted, nulls
owner, deletes its individual actions, which in turn call
`refresh_actions()`.
## Why It's Good For The Game
Bugfix
## Changelog
Not player-facing
## About The Pull Request
Most screen alerts that use the midnight hud style no longer have the
button baked in their icon. Other screen alerts with their own
background or shape (robot and mech alerts, atmos, heretic buffs or
debuffs etc.) are not affected. Also updated a couple sprites but didn't
spend too much time on them. Mostly reusing existing assets.
Montage of how the alerts look on threee different hud styles
(Operative, Trasen-Knox, Detective, ALSO I FIXED THE BUCKLED ALERT
ALREADY):
<img width="293" height="323" alt="image"
src="https://github.com/user-attachments/assets/3a2b972b-aa5a-4c27-a454-c8c39acf6e20"
/>
It looks only a smidge iffy on the syndicate since the top and bottom
borders aren't layered over all the overlays, but it isn't something to
worry about in this PR.
## Why It's Good For The Game
Screen alerts always had the midnight hud button baked in their icon
states (now overlays), which completely disregard the player's hud
setting, much unlike action alerts buttons. Melbert has also said that
it'd be nice if the code for action buttons could also be used in screen
alerts and viceversa, to slim things down. That's obviously not what I'm
doing today, but having most of the screen alerts already without the
baked background will surely help if we ever pursue that objective.
## Changelog
🆑
refactor: Refactored screen alerts a little. Most should now fit the
player's hud style. Report any issue.
imageadd: A few screen alerts have been polished/updated a little.
/🆑
## About The Pull Request
If something harddels with its reference still in ``open_containers``
due to whatever reasons, it will permanently brick HUDs of anyone who
had that storage open until their mob or HUD is reset by admins,
rendering the game completely unplayable. I'm not sure what exactly went
wrong as ``COMSIG_ATOM_EXITED`` should handle deletions already, but
[this runtime
log](https://terry-logs.tgstation13.org/2025/10/20/round-257110/runtime.log)
contains some info if anyone is willing to poke at the issue more.
I know this technically "silences the real problem" but the issue is
harddels caused by storage not being informed of item deletion, its
logged as a harddel and shouldn't brick clients while at it.
## Changelog
🆑
fix: Fixed an issue which could randomly completely break a player's
visuals until an admin resets their HUD
/🆑