## About The Pull Request
`/proc/flatten_list()` -> `/proc/assoc_to_values()`, also changes the
code doc to mirror the language of `assoc_to_keys()`'s code doc
## Why It's Good For The Game
Having a proc called `assoc_to_keys` that takes an associative list and
returns a list of the keys, and also having a proc that takes an
associative list and returns a list of the values, and the latter not
being called `assoc_to_values` is very funny
## Changelog
🆑
code: renamed flatten_list proc to assoc_to_values
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Makes Beaker Panel a TGUI so it actually works
<img width="787" height="295" alt="image"
src="https://github.com/user-attachments/assets/343056d2-f059-473d-a1eb-5604d2c3a38e"
/>
There's a lot more I want to do to this UI, namely UX and more features
(like changing grenade types) but I figured I should PR it now that it's
bare minimum functional so I don't get eaten by scope creep
Fixes#89954
## Changelog
🆑 Melbert
admin: Spawn-reagent-container works again, and it's a TGUI
/🆑
## About The Pull Request
Just a simple find + replace PR. All the other tail defines match their
text strings, but for some reason cat tails are just `FEATURE_TAIL`
which is inconsistent.
## Why It's Good For The Game
Consistency, + a lot of downstreams have a generic "tail" feature key
which is distinct from cat tails, so not taking up that define is
better.
## Changelog
Nothing any players would notice
## About The Pull Request
``icon2base64`` does not like animated icons and will display an atlas
in TGUI when one is passed into it
<img width="239" height="220" alt="JKneqDL9NH"
src="https://github.com/user-attachments/assets/47e0ffdf-c155-4c84-94ce-c23203281012"
/>
Additionally added some padding between the icon and the slot name in
the outfit editor because it annoyed me
## Changelog
🆑
fix: Fixed certain broken icons in the outfit editor, stripping menu and
multiple others
/🆑
## About The Pull Request
Non-smooth modification and renaming didn't work, and mass application
broke a lot of things (always, did actually)
## Changelog
🆑
fix: Fixed some Filterrific functions not working
/🆑
## About The Pull Request
- Fixes filteriffic erroring out when trying to edit a filter
- Implements plugs for color/transform matrix editing rather than just
displaying an error
- Fixes bloom threshold displaying as a float rather than a color due to
an overlap with rays filter
- Displace filter flags can now be controlled
- Color matrix filter now allows the user to change the colorspace (not
really that useful considering you still can't edit the matrix)
- Layering filter now allows the user to control its blending mode
(actually useful this time)
## Changelog
🆑
fix: Fixed filteriffic runtiming when editing filters, and claiming that
bloom threshold is a number
admin: Filteriffic got a few new options (you should still avoid using
it)
/🆑
## About The Pull Request
Ports https://github.com/NovaSector/NovaSector/pull/5923 which was a
port of https://github.com/SPLURT-Station/S.P.L.U.R.T-tg/pull/9 the new
menu can be accessed via a toggle in the admin preferences in game
options. To see what it looks like, see the attached video in Proof of
Testing
It also adds a new verb, `Toggle-Admin-TGUI` which can be found in the
debug tab and will toggle ***EVERYONE'S*** UI preference to old TGUI it
also reverts the player panel to the old one in case you have the
preference enabled and are unable to access the preferences menu.
## Why It's Good For The Game
It makes things easier on the staff members to find buttons, plus it is
100% optional.
## Proof Of Testing
See the video below.
<details>
<summary>Screenshots/Videos</summary>
https://github.com/user-attachments/assets/4098bc35-95e1-4ae5-91dd-27cb2564c350
</details>
## Changelog
🆑
admin: Ported a new, toggleable, player panel from NovaSector/SPLURT
admin: Adds a new verb in the debug panel: Toggle Admin TGUI
/🆑
---------
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
## About The Pull Request
update_filters() is more expensive than it should be due to running
timSort every time a filter is added or removed, plus we wipe
re-initialize the entire atom filter list every time we call it. I
swapped it to use binary insertion into the main list, and we can cut
down on the amount of filter churn by storing filters in a separate list
which we can use Insert on, which allows us to stop constantly deleting
and recreating filters completely.
## Why It's Good For The Game
Server CPU consumption go down
## Changelog
🆑
refactor: Refactored filters to utilize binary insertion instead of
timSort. The server should run somewhat faster now, hopefully.
/🆑
## About The Pull Request
Removes the security department from the Captain
Captain still remains under Security in jobbans
<img width="436" height="74" alt="image"
src="https://github.com/user-attachments/assets/ffac3488-282c-458e-80f1-82fd316fb006"
/>
## Why It's Good For The Game
There seemed to be a common misconception that the Captain was
officially integrated into security as a consequence of the Captain
gaining security department for the purpose of jobban sorting
However, Captain is *not* a member of Security.
## Changelog
🆑 Melbert
del: Captain's no longer sorted under Security in places such as the
manifest or job selection
/🆑
## About The Pull Request
A verb is now available on localhost called `"Export Save as Dev
Preferences"`
This exports your current savefile to `/config/dev_preferences.json`
If you then connect to your localhost as a guest, it will load
`dev_preferences.json` as your preference datum
This allows for devs testing the game locally to load preferences for
guests.
(Guests connecting to live servers are completely unaffected.)
## Why It's Good For The Game
Initially I only did this because the recent keybinding changes have
destroyed my muscle memory when testing w/o logging in.
But as I worked on it I thought of a few other usecases, like when
implementing preference version migration - the dev preference is never
saved which means you can re-compile as much as you want without needing
to revert your save manually.
## About The Pull Request
Fixes#92714
Admin Cure all in secrets.dm explicitly did not add immunity from curing
all diseases, which meant re-infection happened, it passed a value of 0
which prevented immunity.
It is permanent immunity to that disease with no time limit so added a
prompt to clarify the button.
## Why It's Good For The Game
- Makes the anti disease button for admins better
## About The Pull Request
this gets rid of the `get_messengers_sorted_by_name` and
`get_messengers_sorted_by_job` procs, instead replacing them with two
new global lists: `GLOB.pda_messengers_by_name` and
`GLOB.pda_messengers_by_job`
those two lists are updated in the `add_messenger` proc, which uses the
binary insert macros to insert it into the properly sorted place.
why? bc sorts suck for performance and all inserts/removals to this list
go thru a single proc anyways, so we can just ensure it's sorted like
this once, instead of re-sorting each time.
thanks to @LemonInTheDark for helping me with this
<details>
<summary><h3>Testing Proof</h3></summary>
<img width="1708" height="1349" alt="2025-08-16 (1755391989) ~
dreamseeker"
src="https://github.com/user-attachments/assets/1e2dc99a-1863-4a35-8032-8ae64706fdaa"
/>
<img width="1708" height="1349" alt="2025-08-16 (1755392002) ~
dreamseeker"
src="https://github.com/user-attachments/assets/4d9b3bd0-7f3a-410b-a073-1bf2bd69690b"
/>
</details>
## Why It's Good For The Game
because doing a sort repeatedly whenever someone has their PDA messenger
open is stupid and sucks
## Changelog
no player-facing changes
## About The Pull Request
So in a recent round I noticed the newscaster UI was acting kind of
funky, where two channels seemed to overlap and weirdly pick between the
two in unpredictable ways. Looking into it, it seemed that somehow the
channels had managed to get their unique IDs to overlap-
Oh.
https://github.com/tgstation/tgstation/blob/5d3353e7af2b88ab9379d5fb567b24afd8776acd/code/game/machinery/newscaster/newscaster_data.dm#L109-L131
I see.
...I think that code speaks for itself, in how this could've gone wrong.
Anyhow, in this pr we entirely ditch this system, and instead make it
use an incremental and thus guaranteed to be unique ID.
This fixes our issues.
While we're here, we also remove the unused `channel_IDs` list, and
replace it with the associative lists `network_channels_by_id` and
`network_channels_by_name`. This allows us to also stop iterating over
every network channel until we find the one with the right name or ID.
We also rename some confusing, wrong, or non-standard vars while we're
here.
## About The Pull Request
<img width="491" height="301" alt="image"
src="https://github.com/user-attachments/assets/a3b5b19f-edf5-4de9-9201-9cbfab9e8827"
/>
Mod computers with the access changing software installed have a
secondary ID slot once again. This ID slot doesn't contribute to access.
You can insert IDs into the slot with right click and remove them with
alt-right click.
Also removes the "New IDs and you" memo paper.
Also tweaks PDA on_deconstruct so contents are dropped on when they're
deconstructed with assembly.
Fixes#92151
## Why It's Good For The Game
Changing IDs is very unnecessarily clunky with the one slot. Insert hop
id, log in, remove hop id, insert crew id, change access, remove crew
id, log out.
We had it right back when we had two slots. Insert hop ID, insert crew
id, log in. It just works.
This also allows for mobile HoPs to change access without necessitating
removing their ID from their PDA.
Other changes:
The "New IDs and you" memo is very old. They haven't been new for 4
years now. I don't think anyone reads it and they served their purpose.
I found it odd that, if your PDA was melted or blown up, it would delete
your ID. If this is a hold-over from old PDA behavior feel free to let
me know but otherwise it seems sensible that it'd spit out the contents
as you would expect.
## Changelog
🆑 Melbert
qol: The access changing software (the HoP console) now has ID two slots
again (one for the HoP's id and one for the ID being changed). You can
insert IDs in the secondary slot via the UI or right click, and remove
them via the UI or alt-right click.
qol: If your PDA is destroyed via acid or bombs, your ID (and similar
contents such as disks) are spit out instead of being deleted
del: Deletes the "New IDs and you" memo in the HoP's office. They
haven't been new for 4 years.
fix: Engineering sub-tab in the access changing software no longer looks
messed up
fix: Fix reversed alt-click logic for mod pcs
/🆑
# Conflicts:
# code/modules/modular_computers/computers/item/computer.dm
## About The Pull Request
this gets rid of the `get_messengers_sorted_by_name` and
`get_messengers_sorted_by_job` procs, instead replacing them with two
new global lists: `GLOB.pda_messengers_by_name` and
`GLOB.pda_messengers_by_job`
those two lists are updated in the `add_messenger` proc, which uses the
binary insert macros to insert it into the properly sorted place.
why? bc sorts suck for performance and all inserts/removals to this list
go thru a single proc anyways, so we can just ensure it's sorted like
this once, instead of re-sorting each time.
thanks to @LemonInTheDark for helping me with this
<details>
<summary><h3>Testing Proof</h3></summary>
<img width="1708" height="1349" alt="2025-08-16 (1755391989) ~
dreamseeker"
src="https://github.com/user-attachments/assets/1e2dc99a-1863-4a35-8032-8ae64706fdaa"
/>
<img width="1708" height="1349" alt="2025-08-16 (1755392002) ~
dreamseeker"
src="https://github.com/user-attachments/assets/4d9b3bd0-7f3a-410b-a073-1bf2bd69690b"
/>
</details>
## Why It's Good For The Game
because doing a sort repeatedly whenever someone has their PDA messenger
open is stupid and sucks
## Changelog
no player-facing changes
## About The Pull Request
So in a recent round I noticed the newscaster UI was acting kind of
funky, where two channels seemed to overlap and weirdly pick between the
two in unpredictable ways. Looking into it, it seemed that somehow the
channels had managed to get their unique IDs to overlap-
Oh.
https://github.com/tgstation/tgstation/blob/5d3353e7af2b88ab9379d5fb567b24afd8776acd/code/game/machinery/newscaster/newscaster_data.dm#L109-L131
I see.
...I think that code speaks for itself, in how this could've gone wrong.
Anyhow, in this pr we entirely ditch this system, and instead make it
use an incremental and thus guaranteed to be unique ID.
This fixes our issues.
While we're here, we also remove the unused `channel_IDs` list, and
replace it with the associative lists `network_channels_by_id` and
`network_channels_by_name`. This allows us to also stop iterating over
every network channel until we find the one with the right name or ID.
We also rename some confusing, wrong, or non-standard vars while we're
here.
Moves all the dna block handling onto singleton datums initialized
inside global lists, to make the handling dna less of a copy-paste mess
and make adding new blocks significantly easier. There is still some
work to be done in the copypaste department but ultimately that falls
under its own PR scope after the core refactor goes through. (Ill
probably do those but it will also be easier for everyone else as the
code is now significantly less of an eyesore)
Both features and identities have been tested through and through, and
seem to be working fine.
Also removed the reliance on weird hardcoded lookup tables for length,
and other similar things that just didn't make sense when I was passing
through DNA code. There's a lot more that fall out of scope for this
exact PR's goal however
I've been told the maintainers will love me for doing this
🆑
code: feature keys are no longer magical strings floating around the
codebase and use proper defines
refactor: DNA blocks are now handled with singleton datums.
/🆑
## About The Pull Request
<img width="491" height="301" alt="image"
src="https://github.com/user-attachments/assets/a3b5b19f-edf5-4de9-9201-9cbfab9e8827"
/>
Mod computers with the access changing software installed have a
secondary ID slot once again. This ID slot doesn't contribute to access.
You can insert IDs into the slot with right click and remove them with
alt-right click.
Also removes the "New IDs and you" memo paper.
Also tweaks PDA on_deconstruct so contents are dropped on when they're
deconstructed with assembly.
Fixes#92151
## Why It's Good For The Game
Changing IDs is very unnecessarily clunky with the one slot. Insert hop
id, log in, remove hop id, insert crew id, change access, remove crew
id, log out.
We had it right back when we had two slots. Insert hop ID, insert crew
id, log in. It just works.
This also allows for mobile HoPs to change access without necessitating
removing their ID from their PDA.
Other changes:
The "New IDs and you" memo is very old. They haven't been new for 4
years now. I don't think anyone reads it and they served their purpose.
I found it odd that, if your PDA was melted or blown up, it would delete
your ID. If this is a hold-over from old PDA behavior feel free to let
me know but otherwise it seems sensible that it'd spit out the contents
as you would expect.
## Changelog
🆑 Melbert
qol: The access changing software (the HoP console) now has ID two slots
again (one for the HoP's id and one for the ID being changed). You can
insert IDs in the secondary slot via the UI or right click, and remove
them via the UI or alt-right click.
qol: If your PDA is destroyed via acid or bombs, your ID (and similar
contents such as disks) are spit out instead of being deleted
del: Deletes the "New IDs and you" memo in the HoP's office. They
haven't been new for 4 years.
fix: Engineering sub-tab in the access changing software no longer looks
messed up
fix: Fix reversed alt-click logic for mod pcs
/🆑
## About The Pull Request
Fixes the issue of usr pointing to admins by making Trigger pass down
clicker, as usr is fucky and can be passed down by other unrelated
procs. Fun.
Added the clicker arg to all usages of Trigger as well
Also changes isobserver check in antagonist ui_act code that prevents
observers from clicking UI's instead to check if the ui.user is
owner.current
## Why It's Good For The Game
Fixes admins giving heretic to people opening the heretic UI for the
admin instead
(cherry picked from commit 0bc42d6940)
## About The Pull Request
Fixes the issue of usr pointing to admins by making Trigger pass down
clicker, as usr is fucky and can be passed down by other unrelated
procs. Fun.
Added the clicker arg to all usages of Trigger as well
Also changes isobserver check in antagonist ui_act code that prevents
observers from clicking UI's instead to check if the ui.user is
owner.current
## Why It's Good For The Game
Fixes admins giving heretic to people opening the heretic UI for the
admin instead
## About The Pull Request
When I was administering one downstream there were often situations when
instead of the standard announcement sound it was necessary to play
something of my own. So I got my hands on it. Together with standard
announcement sounds there is a possibility to play a custom sound.
https://github.com/user-attachments/assets/ba17f4d1-56f6-4022-b049-6ad6dab8481f
## Why It's Good For The Game
Admins will ~~get a soundpad~~ have the ability to play their own
announcement sounds to match the tone of the situation.
## Changelog
🆑
admin: Added the ability to play your own announce sounds.
/🆑
## About The Pull Request
When I was administering one downstream there were often situations when
instead of the standard announcement sound it was necessary to play
something of my own. So I got my hands on it. Together with standard
announcement sounds there is a possibility to play a custom sound.
https://github.com/user-attachments/assets/ba17f4d1-56f6-4022-b049-6ad6dab8481f
## Why It's Good For The Game
Admins will ~~get a soundpad~~ have the ability to play their own
announcement sounds to match the tone of the situation.
## Changelog
🆑
admin: Added the ability to play your own announce sounds.
/🆑
When using `map-export`:
- Exports the welded state of an airlock to the welded airlock mapping
helper
- Exports the paper inside of a noticeboard to pop out and be saved on
the same turf
Both `airlocks` and `noticeboards` handle the outside objects already in
their `Initialization()` procs so I didn't have to change anything. Also
I cleaned up the paper code and added some better code documentation to
`on_object_saved()`.
We convert this:

To this:

## Why It's Good For The Game
There weren't any good examples of using `on_object_saved()` and the
documentation was lacking so I wanted to include some proof of concept
for a few objects. Also airlocks already save their welded state, but I
think it looks better to have it as a mapping helper since it shows up
in StrongDMM instead of being a VV edit.
When using `map-export`:
- Exports the welded state of an airlock to the welded airlock mapping
helper
- Exports the paper inside of a noticeboard to pop out and be saved on
the same turf
Both `airlocks` and `noticeboards` handle the outside objects already in
their `Initialization()` procs so I didn't have to change anything. Also
I cleaned up the paper code and added some better code documentation to
`on_object_saved()`.
We convert this:

To this:

## Why It's Good For The Game
There weren't any good examples of using `on_object_saved()` and the
documentation was lacking so I wanted to include some proof of concept
for a few objects. Also airlocks already save their welded state, but I
think it looks better to have it as a mapping helper since it shows up
in StrongDMM instead of being a VV edit.
## About The Pull Request
Moves all the dna block handling onto singleton datums initialized
inside global lists, to make the handling dna less of a copy-paste mess
and make adding new blocks significantly easier. There is still some
work to be done in the copypaste department but ultimately that falls
under its own PR scope after the core refactor goes through. (Ill
probably do those but it will also be easier for everyone else as the
code is now significantly less of an eyesore)
Both features and identities have been tested through and through, and
seem to be working fine.
Also removed the reliance on weird hardcoded lookup tables for length,
and other similar things that just didn't make sense when I was passing
through DNA code. There's a lot more that fall out of scope for this
exact PR's goal however
## Why It's Good For The Game
I've been told the maintainers will love me for doing this
## Changelog
🆑
code: feature keys are no longer magical strings floating around the
codebase and use proper defines
refactor: DNA blocks are now handled with singleton datums.
/🆑
## About The Pull Request
Make `VV` verb Context Menu only.
As it's very annoing when clicked on, because it's forming the list of
all atoms in world which causes nasty client freeze.
## Why It's Good For The Game
No more accidentally clicking VV when trying to click View Runtimes 😠
## Changelog
🆑
admin: VV verb is removed from Debug tab. Who is even using it?
/🆑
## About The Pull Request
The map export verb was including fired projectiles from
guns/lasers/magic/etc. if a map was saved at the exact time the
projectile was on the screen. This is bad because when the map is
loaded, the projectile is just stationary and doesn't disappear.
## Why It's Good For The Game
Mapping consistency.
## Changelog
🆑
fix: Fix map export including projectiles in saved maps
/🆑
## About The Pull Request
Make `VV` verb Context Menu only.
As it's very annoing when clicked on, because it's forming the list of
all atoms in world which causes nasty client freeze.
## Why It's Good For The Game
No more accidentally clicking VV when trying to click View Runtimes 😠
## Changelog
🆑
admin: VV verb is removed from Debug tab. Who is even using it?
/🆑
## About The Pull Request
The map export verb was including fired projectiles from
guns/lasers/magic/etc. if a map was saved at the exact time the
projectile was on the screen. This is bad because when the map is
loaded, the projectile is just stationary and doesn't disappear.
## Why It's Good For The Game
Mapping consistency.
## Changelog
🆑
fix: Fix map export including projectiles in saved maps
/🆑
## About The Pull Request
This adds ~~3~~ 8 wrappers for SDQL2/Lua: `_floor(x)`, `_ceil(x)` (we
already had `_round(a, b = 1)`), and `_typesof(a, subtypes_only)`
`_typesof` has a second argument, `subtypes_only` (default false), which
makes it act like `subtypesof` instead, to save from having to manually
remove the base type (especially since removing by value is kind of
annoying in Lua)
the Lua SS13 library has had a `SS13.typesof` function added, which does
exactly what it says on the tin (also with the second `subtypes_only`
argument)
also added `_uppertext`, `_html_encode`, `_html_decode`, `_url_encode`,
and `_url_decode`. these should all be selfexplanatory
## Why It's Good For The Game
more utility for Lua and SDQL2
## Changelog
🆑
admin: Added some more Lua/SDQL2 wrappers: _floor(), _ceil(),
_typesof(), _uppertext(), _html_encode(), _html_decode(), _url_encode(),
and _url_decode()
/🆑
## About The Pull Request
Ok there's a lot here, sorry bout that.
- Cleaned up the permissions panel backend pretty signficantly
- Added some extra security measures to said code, mostly proc call
checks
- Properly implemented filtering code jordie wrote years and years ago
for permissions logs
- Cleaned up the permissions ui generally, more bars, nicer lookin
stuff, etc
- Fixed the Management panel's relationship with combined roles, and
renamed it to Housekeeping. Its display is expanded too.
- Added tracking to rank datums on where exactly they came from
- Added a new tab to the permissions panel which allows the modification
and deletion of ranks
- Beefed up rank modification to try and avoid accidential temp rank
additions to the db
I'm doing my best to avoid perms escalation issues, tho they are always
possible right.
Also, got mad at some query cleanup handling, did a pass on it. this
isn't nearly all of em, but it's some.
## Why It's Good For The Game
I realized there is no way to, in game, cleanly edit/create ranks, and
that the way the existing system worked was quite opaque.
I'm trying to fix that here. It does mean potentially opening up DB rank
deletion/modification to bad actors, but frankly I am not overly worried
about that. Admin modification has always been a vulnerability so like.
Here's a video with my changes (mostly, it's lightly outdated)
https://file.house/XqME7KWKk0ULj4ZUkJ5reg==.mp4
## Changelog
🆑
refactor: Fucked with admin rank setup very slightly, please yell at me
if anything is wrong.
admin: Updated the permissions panel to be a good bit more user
friendly, added rank management support to it.
server: I've added code that gives the game modification/deletion perms
for the rank table, be made aware.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Renames the schoolgirl costume to seifuku, the japanese name for sailor
style uniforms.
Resprites the uniform using GAGs.
Adds an 'adjust' style for the uniforms(rolled sleeves).
Tweaks the stock uniform colors from blue, red, green, and orange to
blue, red, teal, and tan.
stock options
blue, red, teal, tan. long sleeve/short sleeve

custom colors as example
+anyone sad about the sailor moon reference being replaced with more
basic colors dont worry you can still make them :)

## Why It's Good For The Game
Updates the sprite to be more inline with our current clothes.
Makes the sprite in-game player customizable.
## Changelog
🆑
image: resprites the schoolgirl outfit using GAGs
/🆑