## About The Pull Request
Seemingly, someone forgot to close those tags properly
## Why It's Good For The Game
## Changelog
No player facing changes, just an oversight in the admin UI
## About The Pull Request
This adds `/datum/http_request/proc/fire_and_forget()`, which wraps
`rustg_http_request_fire_and_forget`, used for http requests that you
just send and don't care about the response. I've changed
`send2adminchat_webhook` to use this, as it didn't care about the
response at all.
Also added a return type hint to `into_response()`, and did some minor
cleanup on some assorted `/datum/http_request` code.
## Why It's Good For The Game
`fire_and_forget` is very useful because it prevents http request jobs
from forever taking up memory if you never call `is_complete()`
## Changelog
No user-facing changes.
* Fix runtimes in `/datum/id_trim` and when equipping corpses if a map's
.json file fully removes a job
* Remove unused `/datum/powernet/var/number`
* Fix ctrl+clicking a telescreen to mute it also activating it normally
* Unmark `_liver.dm` as executable
## About The Pull Request
This PR adds an option to the context menu of objects that allows admins
to open player panel of mobs inside closets/crates/coffins, body bags
(both folded and unfolded), machinery, vehicles, morgue trays and
crematoriums without selecting particular mob in VV of the object.
Supported types of objects:
/obj/vehicle;
/obj/structure/closet;
/obj/structure/bodycontainer;
/obj/machinery;
/obj/item/bodybag.
The selection menu displays mob names and tags. If an /obj/vehicle is
selected, its driver is marked accordingly in the menu. This verb also
checks /obj/structure/closet and /obj/structure/bodycontainer for body
bags (both folded and unfolded), adding any mobs inside them to the
list.
<img width="483" height="343" alt="prtest-pp-2"
src="https://github.com/user-attachments/assets/5b387d15-5f86-4f78-b85b-3590ce9d1495"
/>
<img width="390" height="391" alt="prtest-pp-1"
src="https://github.com/user-attachments/assets/e16c24a3-1741-43a7-8f3c-4f4d4dbba089"
/>
https://github.com/user-attachments/assets/2c75b7f8-5879-4476-973b-38f2fa638d10
## Why It's Good For The Game
QOL. You don't have to open PP via object's
VV->occupants/contents->list->VV of a particular mob->show PP.
## Changelog
🆑
admin: New adminverb "show occupants PP". You can now open the PP of
mobs inside vehicles, closets, machinery, body bags, etc. via the RMB
context menu.
/🆑
---------
Co-authored-by: AlexTheEng1neer <128976622+AlexTheEng1neer@users.noreply.github.com>
Co-authored-by: Cornka <112967882+Kocma-san@users.noreply.github.com>
## About The Pull Request
ERT Commanders id cards now separated from Emergency Responce Team
Intern one, also changed some code where probably should be commander
cards(debug map, ert commander ofc and ert join button)
## Changelog
🆑
fix: ert commander card properly appear in game, no longer overriding
basetype ert card
/🆑
## About The Pull Request
- Port of https://github.com/Monkestation/Monkestation2.0/pull/10283
Adds a CI checker for unescaped brackets ([]) in strings.
Examples:
```
// Flag
var/wuh = "[] mrrp"
// Flag
bluh("whu [] guh buh")
// Flag
var/meow = {"
[]
[]
mewr
wefwefa"}
// Flag
var/varasdf = "sdfk;lkdsf \
ok []\
what the heck []"
```
## About The Pull Request
- Adds a prompt when an admin is removing someone's antagonist datum if
they would like to re-roll for a new antagonist to replace them
- Brings back the Create Antagonist verb
- When creating an antagonist, it tells the admin who was selected
## Why It's Good For The Game
Admin quality of life
## Changelog
🆑 LT3
admin: Admin button in the traitor panel to automatically re-roll
antagonists
admin: Admin create-antagonist verb
admin: Game logs now include what player gets turned into an antagonist
/🆑
## About The Pull Request
This was LONG overdue and its finally time. Refactors 2 components to
regular datums
- `/datum/component/material_container` -> `/datum/material_container`
- `/datum/component/remote_materials` -> `/datum/remote_materials`
Reduced memory overhead and stops misuse of component i.e. storing it in
a variable
## Changelog
🆑
refactor: refactored material container code to reduce memory overhead.
Report bugs on github
/🆑
## About The Pull Request
Multiz pipes will, on any map without 3 z levels, always be
"unconnected" to this mapping verb. This is because they're `TRINARY`,
and thus must fill `nodes` with three connection points in order to not
fail this verb, which they will never do unless they're on the center of
three z levels(and have pipes above and below them, which is the case
precisely nowhere). They need to keep `TRINARY` in order to keep
working, so I'm making an exception in the verb.
## Why It's Good For The Game
Check plumbing will no longer fill your chatbox with one million pipes
that are, in fact, connected.
Closes#94378
## Changelog
🆑
No player facing changes. Or admin facing changes. This is just for us.
/🆑
## About The Pull Request
A weather anomaly can spawn on the station, causing a sandstorm,
snowstorm, or rainstorm to affect the room (and nearby rooms). These
weathers range from "harmless" to "mildly damaging".
They last for around five minutes.
The weather doesn't start immediately, giving people time to neutralize
it before it causes damage.
Neutralizing the anomaly stops the weather.
If they detonate, it just throw objects away from itself.
<img width="407" height="225" alt="image"
src="https://github.com/user-attachments/assets/2de1b797-2b17-442c-9023-11085b4849cf"
/>
<img width="991" height="674" alt="image"
src="https://github.com/user-attachments/assets/afe5a21d-9cf8-4e9d-95ec-adef6fd12a93"
/>
A rarer version of the anomaly can also occur, which brings a lightning
storm, which may damage the station itself.
Also, reactive weather armor. When you are hit, it summons a lightning
strike below nearby assailants.
## Why It's Good For The Game
With the added rain mechanics I wanted to use them, but it's kinda hard
to shoe them into the station because, "why is it raining on a space
station that makes no sense"
However, anomalies are weird, so this fits perfectly
## Changelog
🆑 Melbert
add: Weather anomalies, in four variants: Rain, snow, sand, and the rare
lightning storm.
add: Reactive Weather Armor
/🆑
## About The Pull Request
Last Christmas we had and resolved this bug #88595 where via the
mechanic of buying random trash, Cargo could roll on the roulette to try
and get random Christmas presents and open them for random items.
This was removed because it's not supposed to work that way and was a
way of exploiting Christmas cheer for personal gain, which is grinchsome
behaviour.
That said, being able to order Christmas presents is also kind of
soulful, so this PR brings that mechanic back but on purpose this time.
During the Christmas season _only_, Cargo can spend 3000 credits of
their budget to order a "Surplus Christmas Gifts" crate which contains
4-6 presents _with pre-assigned recipients_.
In a similar system to addressed mail, only the person written on the
gift tag can open the present, so unless you're sufficiently scroogeous
to collect a huge pile of presents on the cargo room floor in hopes of
getting a couple with your name on (in my testing these contained raw
unbaked croissant dough, and a piece of paper from a space ruin) you
should mostly be using this to deliver generalised holiday cheer to the
crew rather than just yourself.
This PR also contains (maybe as more lines than the actual feature) a
refactor changing a bunch of boolean vars on `/datum/supply_pack` into
bitflags, because I needed to add one more and it seemed silly to have
so many booleans.
## Why It's Good For The Game
It allows those with the yuletide spirit to deliver some christmas cheer
to their fellow man, isn't that the season's reason?
## Changelog
🆑
add: When the game considers it to be Christmas, Cargo can order
additional Christmas gifts pre-addressed to random crew members.
/🆑
## About The Pull Request
This defaults every tgui to fancy mode and removes the preference
entirely.
## Why It's Good For The Game
If you look through the code you'll find comments like these
> //some browsers (IE8) have trouble with unsupported css3 elements that
break the panel's functionality, so we won't load those if a user is in
no frills tgui mode since that's for similar compatability support
We're far and away from IE8, therefore our need for compatibility
support, so I think it's valid to remove this so called 'no frills tgui
mode'. It's tied into the event message system with every backend
update, so there's a tad less overhead.
## Changelog
🆑
del: TGUI now defaults to fancy mode, there is only fancy mode. Welcome
to the future.
/🆑
## About The Pull Request
There is technically an `/obj/item/stamp/granted` in that one traitor
objective refers to it and tries to override a proc on it thus making it
a valid type, but not really. This changes the base `/obj/item/stamp`
from being the granted stamp to being an abstract type, and creates a
proper subtype for the granted stamp.
## Why It's Good For The Game
Base types being concrete outside of scenarios where its intuitive are
very annoying
## Changelog
🆑
code: makes /obj/item/stamp abstract, creates /obj/item/stamp/granted
/🆑
## About The Pull Request
This PR converts the native text/list input that pops up when the Spawn
verb is used into a TGUI panel with a dynamic search function. It now
displays atom names, as well if they are abstract (and probably
shouldn't be spawned).
You can still input a typepath after the spawn verb in the tab bar which
will open the menu with said path already in the input box. If only one
typepath matches the input, it will be spawned immediately without
opening the panel.
<img width="400" height="500" alt="Qs0t8xkGj7"
src="https://github.com/user-attachments/assets/d54a57d5-fc22-4f59-af18-45b4fab0b256"
/>
It features RegEx support which activates when the input starts with
``re:``, as well as toggles for searching in atom names and fancy
typepath display. They can be toggled via buttons, or Alt+R/N/F for
regex/names/fancy paths respectively. Invalid regex-es will highlight
the search bar red.
The list itself can be navigated using arrow keys, enter/double click
will spawn the atom, and escape will close the menu.
<img width="400" height="500" alt="xgK2vCd1ck"
src="https://github.com/user-attachments/assets/e621c6ba-ad6b-4a30-922f-eb863797c65a"
/>
<img width="400" height="500" alt="2DeOPBRqoC"
src="https://github.com/user-attachments/assets/18fbba32-17d7-4351-bbc2-bc8e66eb24ae"
/>
Old functionality of spawning multiple objects by leaving a colon +
number after the typepath has been preserved. Using ``*`` and``!`` to
signify final path/end of a path respectively also still works when
regex mode isn't active.
## Why It's Good For The Game
Spawn isn't a critical tool, and using TGUI allows it to have dynamic
search and shifts searching from serverside to clientside, making it
significantly more responsive. Because we don't need to build a fancy
list of atom types, using it the first time won't cause a lag spike on
weaker machines anymore, which should make debugging locally a bit less
annoying.
## Changelog
🆑
admin: Converted the Spawn verb into a TGUI input, featuring for dynamic
search and RegEx support
/🆑
## 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
Adds a playerpanel button that just plays roleplay.ogg to the player
(with a chat message to accompany it)
## Why It's Good For The Game
Gives admins a button which literally just tells the player to roleplay
appropriately. So they can take the hint
## Changelog
🆑 Melbert
admin: Adds "roleplay reminder" button to player panel
/🆑
## About The Pull Request
The primary feature of this pr is two admin verbs:
Both locked behind `R_SERVER` at present. Also both can be removed from
this pr if we arent interested in giving admins easy control over this.
Changes will not take effect untill the next round unless someone has
yet to touch/spawn a jukebox.
please ignore the "#. " in the titles, thats just how my spotify scraper
formats the titles and I am lazy.
### Jukebox Upload Music
Allows for the upload of any music to the jukebox (currently restricted
to `.ogg` file types for being the better format but I can release that
restriction). Adding Beats is optional but not required as it does not
do a ton tbh.
https://github.com/user-attachments/assets/859cdba8-c1dd-4ce4-bfce-40727a0a30b8
### Jukebox Browse Music
Allows you to delete any of them, this noticeably catches ANY sound
format stored within the list.
Also play and download
https://github.com/user-attachments/assets/cffca3dc-d7f2-4926-bda9-2bf3fef80adb
### Refactors
In order to add both of these verbs seemisly i made a bunch of
improvments,
Sound length for music is now gotten via the rust_g call instead of
being baked into the title, this means you only need two args for
jukebox titles. (This will mess up the bpm of old music tracks
unfortunately.)
Standerized the behavoir for validating the file type of a file, this is
not full proof from what im aware and there is no checks for if the file
ACCTALLY exists.
## Why It's Good For The Game
Atleast on a downstream, R_SERVER is alot more commonly handed out then
direct access to the tgs configs. And TGS kinda blows bubbles for doing
large scale file managment.
## Changelog
🆑
code: generic helpers and defines for validating file extenstion
refactor: the jukebox has had some improvements in how it validates the
sound file. hopefully none of your funny songs disappear.
admin: command_report_menu will let you set ANY sound file type for the
sound it plays.
admin: Admins can now manage jukebox songs in game
server: Jukebox songs length are now set automatically, update your
jukebox configs!
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
renames Debug2 and kills Debug as its last use (atleast the one
described in its comment) was removed
added it to the check to print to print stack traces to chat in the
instance your debugging without a debugger attached for some reason (if
this var is enabled on live it already causes random to_world messages,
kinda fuck it we ball at that point)
## Why It's Good For The Game
The first one was ENTIRELY unused now
this name makes more sense
## Changelog
N/A
## About The Pull Request
Allows users to edit color matrix filters and layered filters'
transforms through Filterrific, which were the two last unsupported
filter fields. The menus are pretty minimal, but you shouldn't be
touching them if you don't know what you're doing anyways.
https://github.com/user-attachments/assets/e87447f3-e5d6-4f6c-a8e4-bf50a1d5fa79
## Why It's Good For The Game
Makes our tooling actually work
## Changelog
🆑
admin: Implemented color matrix and transform modification support for
Filterrific
/🆑
## About The Pull Request
why
<img width="325" height="329" alt="image"
src="https://github.com/user-attachments/assets/8a9aa05a-b85b-415e-977c-9d43d35297e3"
/>
Now they're only sorted within their own categories instead of being
sorted twice
## Changelog
🆑
fix: Spawn Ruin verb no longer "sorts" its ruins alphabetically, instead
sorting them within their categories
/🆑
## About The Pull Request
`/proc/find_safe_turf()` was cleaned up so that it did not have two
arguments that accomplished the same thing, removing opportunities for
user errors when calling the proc. Additionally, since I was here, I
decided to clean up some of the code and document it.
Some thresholds were changed in this PR (the max temperature threshold
was dropped from 360K to 340K), but I believe that it's better to keep
them consistent instead of using arbitrary values.
## Uncomfortably large gap
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
## Changelog
No user facing changes.
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Fixes all instances of numbers being used as assoc list keys in things
that aren't alists, either by turning them into alists or changing the
keys to something else. Also adds new macros to support creating global
alists, as a few global lists became alists. Most of these are pretty
simple and self-explanatory but
- The GLOB.huds one necessitated rewriting because code depended on it
being a non-assoc list, which it technically was because the defines it
used as keys were numbers so BYOND turned it into a regular list, most
of this was for loops through all the subtypes of
`/datum/atom_hud/data/diagnostic` of which there's only one, so I just
changed it to get that type directly by key
- NT Frontier used number indexes which it looped through for some
reason and also passed to TGUI, changed these to strings and adjusted
the TGUI to match, I tested this and it works fine
## Why It's Good For The Game
Makes the code compile, I couldn't test everything but I tried to check
all usages of affected vars to make sure they wouldn't break from being
switched to alists, a TM might be in order just to be sure nothing's
fucked
## Changelog
🆑
refactor: rewrote all cases of numbers being used as keys in non-alist
associative lists
/🆑
## 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
Adds a verb, Mass Modify Traits, which allows an admin to apply or
remove a specific trait from all living mobs.
This lets you do things like give all mobs the `TRAIT_NOBREATHING`, or
making all mobs able to fly.
<img width="345" height="138" alt="JvkEnGMkQI"
src="https://github.com/user-attachments/assets/fad89db3-a1a5-42d7-ae54-67ca7ba92301"
/>
You can specify only cliented mobs, as well as the trait source for
removals.
<details><summary>results</summary>

</details>
## Why It's Good For The Game
More tools for admins to get creative with is always a good thing, I
think! The trait system uses macros so it's difficult to use SQL to
mass-apply, so here's an easy verb for it instead.
## Changelog
🆑
admin: added new admin verb, 'Mass Modify Traits', which can be used to
add or remove a trait to/from every living mob.
/🆑
---------
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
## About The Pull Request
Hi I'm on a downstream server and this is driving me actually insane
## Why It's Good For The Game
I can't speak for tgstation admins but I like it when the buttons in a
panel are not lies
## Changelog
🆑
admin: Made the buttons asking you for anonymity when you select/approve
a Play Internet Sound request actually do what they say, instead of the
opposite.
/🆑
## 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)
/🆑