## About The Pull Request
broken by #95408
## Why It's Good For The Game
## Changelog
🆑
fix: The crystallizer can be rotated once again, on left click
/🆑
## About The Pull Request
This PR adds USB functionality to temperature pumps, emitters and
temperature control unit machines.
<img width="1082" height="340" alt="working"
src="https://github.com/user-attachments/assets/25e40c17-33ab-4159-b431-b3ccbe83626d"
/>
### New USB Components
<img width="139" height="101" alt="emitter"
src="https://github.com/user-attachments/assets/66580351-6cca-4dfe-9de4-3813cf62678c"
/>
* Emitter
New exposed controls allow you to manually fire a single beam, and get
signals whenever it is toggled on/off/fired.
It doesn't allow a player to toggle it on/off (must be done physically).
ID locking the emitter will also lock out the ability to fire the
emitter via USB.
<img width="303" height="226" alt="temp pump"
src="https://github.com/user-attachments/assets/4d0e6758-d653-4ac1-a080-d8e31d64408d"
/>
* Temperature Pump
This works exactly the same as the other USB controlled pumps, with the
addition of setting the heat rate.
<img width="267" height="151" alt="temperature control"
src="https://github.com/user-attachments/assets/6fff5148-bd70-4a1c-9899-10c997279669"
/>
* Temperature Control Unit
The USB interface now allows this to be remotely turned off and on like
the other USB pump interfaces.
## Why It's Good For The Game
These three parts are crucial to engineering/atmos projects, and gives
experienced players more depth to toy with circuits.
## Changelog
🆑
add: Added USB interface to emitters, temperature pumps and temperature
control unit machines
/🆑
## About The Pull Request
Refactor the majority of the current gasmix mole change use cases into a
proc called adjust_gas which simply adds the designated mole count of
the species into the gas mix while also handling asserting the gas and
garbage_collect()
I also added adjust_multiple_gases and convert_gas() for modifying
multiple gases and within a gasmix
## Why It's Good For The Game
Lemon wanted this to be done as part of the air group refactor
## Changelog
🆑
refactor: refactored majority of gas_mix mole change into adjust_gas()
proc
/🆑
## About The Pull Request
<img width="600" height="400" alt="xHRp2P1JWN"
src="https://github.com/user-attachments/assets/46812be5-0405-472e-9b5f-c5b1e3e79e7e"
/>
<img width="600" height="400" alt="3yxQA3GkVJ"
src="https://github.com/user-attachments/assets/3d5c0fb9-cfd1-4306-a7bd-01049c7caf78"
/>
I am really sick of seeing this spam absolutely polluting the crap out
of the logs, no one else seems to be willing to touch this code so I
guess I will.
This PR just adds a very minimal cost guard against this condition,
which apparently occurs when you have a passive vent trying to equalize
with space tiles (which, the gas mixtures force vacuum heat capacity
when they have no gases), resulting in the passive vent trying to
equalize with it even with its pipenet being empty.
I'm no atmos expert but I can say the cost of doing this check is
basically nothing, and the cost of having runtime spam overhead is
significantly worse (but more importantly it hurts log readability).
If someone can come up with a better fix then by all means but I think
this is better than what we have had happening for the past year and a
half now (maybe longer, that's just when I first noticed it). And it's
basically all I'm able to come up with, I'm not able to rewrite vast
swaths of atmos sadly
## Why It's Good For The Game
Less runtime spam plx
## Changelog
Not player-facing
## About The Pull Request
Removes a lot of cargo cult copypasta with
`default_deconstruction_screwdriver`, `default_deconstruction_crowbar`,
and to a lesser extent `default_pry_open` and
`default_change_direction_wrench`
ALL you gotta do now if you want your machine to have an openable panel
or be deconstructible with a crowbar is this
```dm
/obj/machinery/dish_drive/screwdriver_act(mob/living/user, obj/item/tool)
return default_deconstruction_screwdriver(user, tool)
/obj/machinery/dish_drive/crowbar_act(mob/living/user, obj/item/tool)
return default_deconstruction_crowbar(user, tool)
```
`default_deconstruction_screwdriver` no longer directly sets
`icon_state`, requiring the user pass in the open and closed icon
states. Now, it just calls `update_appearance`, and everything that once
passed the icon state now uses `base_icon_state` and
`update_icon_state`.
## Why It's Good For The Game
Many of these procs were terribly overcomplicated and difficult to work
with for what should be a relatively simple action
Streamlining it makes it easier for coders to understand and work with
## Changelog
🆑 Melbert
refactor: A majority of machines had their screwdriver/crowbar/wrench
interactions rewritten, report any oddities like being unable to open a
machine's panel or deconstruct a machine
/🆑
## About The Pull Request
Came back to the game after a break, while in ghost mode I noticed my
GPU usage flew up near toxins lab, Next round tested it with an admin in
Thunderdrone, turns out pipes are very inefficient and GPU hungry.
Some suggestions about render relays / spatial grid were made but the
performance impact is so big I'd rather put in a fix that significantly
reduces the burden on player clients, anyone walking through station
maints, medbay cryo, engineering/atmos/toxins is affected by this.
Removed keep_apart and colour filter.
| Before | After |
|--------|--------|
| <img width="959" height="999" alt="Screenshot 2026-03-31 042655"
src="https://github.com/user-attachments/assets/6bca9cb3-5482-463a-b4e2-84e01fff9949"
/> | <img width="941" height="1020" alt="Screenshot 2026-03-31 052710"
src="https://github.com/user-attachments/assets/619f8591-0107-49ad-97f3-48b7197e95f6"
/> |
| <img width="1009" height="1074" alt="Screenshot 2026-03-31 042738"
src="https://github.com/user-attachments/assets/31b6c96c-0cf0-478d-b156-4cdc176f9dcb"
/> | <img width="1005" height="1105" alt="Screenshot 2026-03-31 052832"
src="https://github.com/user-attachments/assets/4fd44aff-5fe6-4ab0-b787-72d113ae215f"
/> |
## Why It's Good For The Game
Takes GPU usage at Meta atmos from 58.2% to a reduction in the main pipe
loop and 33.4% at air room to a reduction.
Tested in game.
## Changelog
🆑
code: Atmos pipes GPU performance - Station areas with pipes will be
less taxing on the client.
/🆑
---------
Co-authored-by: loganuk <fakeemail123@aol.com>
## About The Pull Request
A substantial number of number circuit ports, input and output alike,
effectively act as boolean flags. That is, they are either input ports
that only care about whether the value is or is not zero, or they are
output ports that can only output zero or one. This PR adds a boolean
datatype, and converts all these ports to booleans.
Anything can be connected to a boolean input port, effectively setting
the port to the truthiness of the input. Booleans can be connected to
number and signal ports, as they all use numbers as their underlying
values.
## Why It's Good For The Game
Having a proper boolean datatype makes the affected ports a bit more
intuitive to compute with.
## Changelog
🆑
qol: Many circuit components have had ports that effectively act as
boolean inputs or outputs converted into a new boolean datatype.
/🆑
---------
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
## About The Pull Request
[Adds a visual tick helper, integrates it into SSmove and
such](https://github.com/tgstation/tgstation/commit/e97035f9f74fad5c67c5bf19d8d5d3bb4bd476b4)
Basically, if we do "stuff" during verb time then the next chance
clients have to actually see it is on the next visual tick (rather then
the normal "this tick"). This is cause clients get their next frame
during maptick, and maptick runs before verbs.
We want to be able to handle this properly because if you say, create an
object and then move it on the same VISUAL tick (NOT game tick), it will
just teleport instead of playing out the move. I don't want this for
stuff like sparks, so we need a way to work around it.
[Moves most users of the _FAST flag to
_INSTANT](https://github.com/tgstation/tgstation/commit/6f96daac00519c69adc7554f52114798a65f3ad5)
These are the kids that don't immediately spawn something and the move
it, and we want to allow them to move actually as soon as possible
(important for stuff like space)
[Improves basic effect systems, makes their products delete when they
stop
moving](https://github.com/tgstation/tgstation/commit/172cb25d80ed34e1ec523172a1677fb524239fba)
Moves some stuff out to getters or vars so children can better decide
how long effects should last/how fast they should move. Uses this to
clean up weird dupe code used by explosions.
Makes all these effects delete on contact with something that stops
them. I'm doing this because an effect just hanging in the air looks
really really odd. Does have consequences for sparks that are already
moving at a wall though, might need a better way to handle that.
Makes all these effects use _FAST loops so they don't just hang in the
air for a second on spawn
Adds a setter proc on sparks for their duration, gonna use this to
improve their effects some
[Refactors overlay lights, adds support for animating their
images](https://github.com/tgstation/tgstation/commit/3ad0083cf2b536df51a6d93dca40eac20c1d62d1)
Implements light_render_source and relevant setters, this allows us to
replace the components of an overlay light with basically whatever we
want
Refactors overlay lighting to handle its images more consistently,
allowing us to hook into an image being modified
Combining the two of these will allow us to consistently copy a light's
image, modify it in some way, and then relay that modification back
down. Allowing us to animate it or do more advanced effects painlessly
Also, fixes ranges of 1 or less not rendering at all on initial set
(thank you kapu)
[In which I get fed up and add a macro helper for UID
generation](https://github.com/tgstation/tgstation/commit/aab48b03d407104d4f9cf9acb034494237def911)
[adds vv hooking for all existing lighting
vars](https://github.com/tgstation/tgstation/commit/b81c6200a0d74c36b440aa3f4c1f22c422090a2d)
[Upgrade effect system's dir picking to avoid duplicates when
possible](https://github.com/tgstation/tgstation/commit/18b622586b509c6be4c4bca4e3e7c175ad75fe91)
[Uses the technique described above to animate spark's lights out as
they
move](https://github.com/tgstation/tgstation/commit/67ba177982213799984a70e89536c5efb3d17e14)
This is a decently nice effect imo, it allows us to bump their power
(read, alpha) since it'll get animated away. I try to sync the animation
to the actual icon state's flow (it's 0.7s long). I also sped them up
somewhat to hopefully have a nicer looking effect? we'll see.
[Abstracts away intercepting overlay lights into a holder
datum](https://github.com/tgstation/tgstation/pull/95362/commits/b3f1fe74f2c3bab1d8912ab8a666bd05677ad032)
This should make it far easier to reuse this pattern!
[Fixes overlay lights flashing to double intensity when picked up off
the
ground](https://github.com/tgstation/tgstation/pull/95362/commits/1d83f2031fa2b33312b2aea4359c0c37c9d04ac7)
We needed to clear out their underlays BEFORE the animation
[Adds a flickering effect to flares and their
children](https://github.com/tgstation/tgstation/pull/95362/commits/b7a858e04a607c58b6c7fbe1476ffe2239e63bde)
I'm still not 100% happy with this, I was trying to avoid it feeling
like a heartbeat with random noise and I.. THINK it worked? it's
honestly quite hard to tell
[Adds the same flickering to lighters, welding tools and life
candles](https://github.com/tgstation/tgstation/pull/95362/commits/3ec44027e17835ae96702cec5f0b12d1f4deb32b)
Also, updated light candles to mirror the appearance of normal candles
and use overlay lighting
EDIT:
I realized while working on flares that I accidentally double applied
color, so if you saw the sparks animations before now it was different
(less vibrant). IDK if I like this better or worse but it is RIGHT and
that's what matters.
## Why It's Good For The Game
I got mad about how bad these looked, and this is a start at improving
them.
Also, adds a framework for more dynamic effects applied to overlay
lights (you could use this to apply a sort of "emergency rotating"
effect, or flicker/buzz for example).
<details>
<summary>Before</summary>
https://github.com/user-attachments/assets/66437f27-ee3c-4f14-a7ee-4a1c3e68533ahttps://github.com/user-attachments/assets/ed14fff8-a7eb-47fe-bab5-9a490ac96629
</details>
<details>
<summary>After</summary>
https://github.com/user-attachments/assets/fb24ff2e-c745-42a5-8e11-c8a1eeef35a5https://github.com/user-attachments/assets/fd8c2116-cb92-4fe6-ad3e-786a6538e52a
</details>
## Changelog
🆑
add: Reworks how sparks render. They're now a bit brighter, will fade
out as they move/if they hit something, will stack with each other less
and also won't start hang in the air on spawn.
add: Added a flickering effect to lighters, welding tools, flares,
torches and candles (since they're flames).
fix: Overlay based lights (think flashlights) will no longer flash to
double intensity while being picked up.
refactor: Reworked how some effects (explosion particles, sparks, some
reagent stuff) function, report any bugs!
/🆑
## About The Pull Request
Splits the active icons for the HFR into overlays and makes them
emissive, cleans up the icon state code a little
## Why It's Good For The Game

look at it go
## Changelog
🆑
image: the HFR glows in the dark now
/🆑
## About The Pull Request
`shock` was copy pasted across a bunch of base types
I needed the behavior unified and it was fairly trivial to do
So now we have `/obj/proc/shock` which all the old implementations call
## Changelog
🆑 Melbert
refactor: Made some minor changes to how things like airlocks, vendors,
and autolathes shock you. Report any wierdness with that
/🆑
## About The Pull Request
If an airlock pump's link is broken, it unbolts all airlocks
Closes#95232 - while it technically fixes the issue, the airlock should
really still be automatically opened even if the pumps are unlinked
## Why It's Good For The Game
Stop them from getting perma-stuck if strange things happen
## Changelog
🆑 Melbert
qol: If an airlock pump's link is broken, it unbolts all airlocks
/🆑
## About The Pull Request
Currently, Tier 5 gases (like BZ and Pluoxium) at higher power levels
(Levels 5-6) suffer from restrictive production penalties, yielding only
about 2 mol/tick.
I have extended the mechanic that exists on **Level 2** (which allows
producing Tier 3 gases) and applied it to Level 4. This now allows for
the production of Tier 5 gases using a plasma moderator on level 4.
This makes the HFR a viable alternative to traditional pipe/chamber
heating for gas synthesis, provided the player can manage the increased
instability.
This has minimal impact on overall balance. It primarily serves as a
viable alternative for experienced players, while also lowering the
barrier for newcomers who struggle to produce BZ and Pluoxium without
significant time loss.
## Why It's Good For The Game
- **Smooth Progression:** Currently, Level 5 is only used for safe Tier
6 gas farming. This change smooths out the progression, making the HFR
useful and less niche. Local testing shows that the gas production feels
"fair", you actually feel the impact of the machine you spent so much
time setting up.
- **Enhanced Risk-Reward:** Instead of setting a Level 3 plasma-o2
reaction with massive plasma amounts in moderator and walking away make
BZ&Pluoxium, players are encouraged to actively manage a high-level HFR.
It rewards active gameplay with HFR and attention over "set and forget"
mechanics.
- **Viable Alternative:** It provides a legitimate alternative to
pipe-burning for BZ and Pluoxium. It gives players more choices in how
they want to reach their goals.
- This change makes the HFR less niche. Since it’s one of the most
unique and mechanically interesting machines in the game, encouraging
players to use it more often is a net positive for Engineering gameplay.
At least, that's my take on it.
## About The Pull Request
This PR refactors ``effect_system``s to be a bit easier to use by
getting rid of ``set_up``, allowing ``attach()`` to be chained into
``start()`` and refactoring most direct system usages in our code to use
helper procs.
``set_up`` was unnecessary and only existed to allow ``New``'s behavior
to be fully overriden, which is not required if we split
sparks/lightning/steam into a new ``/datum/effect_system/basic`` subtype
which houses the effect spreading behavior. This allows us to roll all
logic from ``set_up`` into ``New`` and cut down on code complexity.
Chaining setup as ``system.attach(src).start()`` also helps a bit in
case no helper method exists
I've added ``do_chem_smoke`` and ``do_foam`` helpers, which respectively
allow chemical smoke or foam to be spawned easily without having to
manually create effect datums and reagent holders.
Also turns out we've had some nonfunctional effect systems which either
never set themselves up, or never started, so I fixed those while I was
at it (mostly by moving them to aforementioned helper procs)
## Why It's Good For The Game
Cleaner code, makes it significantly easier for users to work with. Also
most of our effect system usage was copypasta which was passing booleans
as numbers, while perfectly fine helper procs existed in our code.
## Changelog
🆑
refactor: Refactored sparks, foam, smoke, and other miscellaneous effect
systems.
refactor: Vapes now have consistent rigging with cigs using the new
system.
fix: Fixed some effects never working.
/🆑
## About The Pull Request
Fixes the HFRs damage from being over the 10 000 moles of fuel limit.
Also makes the code easier to read, by separating the lines of code a
little.
Tested on a local repo by launching the HFR and exceeding the 10 000
moles fuel limit. Instead of the HFR exploding almost instantly, it now
started taking damage at a reasonable rate and could be saved.
## Why It's Good For The Game
Fixes#94786
Also makes the code slightly more readable and as such easier to
maintain.
## Changelog
🆑 Swan
fix: fixes the HFR health dropping exponentially once it starts taking
damage from having too many moles
/🆑
Co-authored-by: NiceNiceSwan <kubapawelczyk41@gmail.com>
## About The Pull Request
Extracts the starting amount of pressure of pressure tanks to a variable
that can be edited by subtypes or mappers
## Why It's Good For The Game
A standard pressure tank comes with ~26,000 mols which is a lot
(compared to a canister being ~4,000), sometimes you just want a
liiiiiiiiiittle less for your map use.
## About The Pull Request
Not 100% sure, but somehow we ended up with a missing hot group on Terry
which caused newer hotspots to runtime and not get theirs which caused
more hotspots- you get it.
Only idea I have is that possibly we could've gotten a hard delete, but
there are none in the logs? This should solve the infinite hotspot
runtimes at the very least, and possibly? prevent harddels by changing
the nullcheck to a qdel check.
## Changelog
🆑
fix: Added some safeties to ensure that hotspots don't cause an infinite
infectious runtime and crash clients
/🆑
## About The Pull Request
Adds new Firebot variant and new Freon Firefighting Foam
Freon Firefighting Foam works same as Firefighting Foam (like ones in
advanced extingishers) with added beenfit of bringing temperature
down/up to 20C even if there's no fire, it also leaves no plasma stains
on the floor. This foam is not meant to be available to players and used
only by the upgraded Firebot.
You can upgrade standard Firebot by giving it a piece of Hot Ice! Doing
so will make it use it's foam if air temperature is below 18C or above
22C, effectively helping keep corridors at room temperature.
## Why It's Good For The Game
Firebots are rarely given a chance to shine, giving them option to
effectively work as walking space heaters widens their use and
practicality by a lot, especiely on maps like Ice Box notorious for
having their corridors go cold all the time. The upgrade also require
Hot Ice which is an atmos made material made with Freon, that currently
doesn't have many uses, giving atmos techs another way to contribute
with their projects to well being of the station.
## Proof Of Testing
<img width="404" height="216" alt="image"
src="https://github.com/user-attachments/assets/bf2e968e-18c3-495d-8ed7-335daca6fdbb"
/>
<img width="393" height="35" alt="image"
src="https://github.com/user-attachments/assets/0e327489-2360-4c9f-b05b-b26e78ede0af"
/>
<img width="428" height="131" alt="image"
src="https://github.com/user-attachments/assets/bdb0500d-d83c-4880-8c23-0d2b2399f627"
/>
## Changelog
🆑
add: You can upgrade Firebots by giving them Hot Ice. Doing so makes
their foam fix air to room temperature.
/🆑
---------
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
## About The Pull Request
<img width="579" height="67" alt="image"
src="https://github.com/user-attachments/assets/d7a4427e-2a6e-44d3-94ba-c90a2d474984"
/>
Simple rotation components number in the 8-9k range per round, and each
contains a needless callback datum as well.
These do not need to hold any state and can be bespoke elements, and the
proc to do things post_rotation can just be a normal atom proc.
<details><summary>Still works as you'd expect, including items that have
flag requirements like the wrench</summary>


</details>
## Why It's Good For The Game
Makes a heavily used element much more lightweight, saves a few mb of
memory.
## Changelog
🆑
refactor: simple rotation component has been refactored into an element
Please report any bugs to github.
/🆑
## About The Pull Request
Volume pumps work in walls again. I just removed the code added in
[#94007](https://github.com/tgstation/tgstation/pull/94007)
## Why It's Good For The Game
The bug to place overclocked pumps in walls has been around for years at
this point, long enough to become stable among atmosians for making
compact setups by ignoring pressure limits. Only thing that changes with
wall placement no longer working, is that atmos techs have to waste
extra time.
Removing floor from a tile surrounded by windows does effectivly exact
same thing as placing pumps in walls, but takes extra time in a job that
is already heavily time consuming, it's just an annoyance, it doesn't
introduce any new problem to solve or workaround when solution is pretty
straightforward.
The loss of gas isn't relevant either, placing pumps in walls did not
stop leaking, it just stopped it from spreading into air, the loss of
gas is already at 0.1%, it's not enough to mess with efficiency of the
setup.
Proper approach would be actually changing the way pumps work, make it
engineering problem to solve instead of just adding annoying friction to
playerbase of atmos techs that's already pretty small, which is why I
believe it'd be best course to revert the change introduced by
[#94007](https://github.com/tgstation/tgstation/pull/94007) until
someone actually bothers to properly work on atmos content like this.
## Proof Of Testing
<img width="224" height="135" alt="image"
src="https://github.com/user-attachments/assets/5a226421-070c-4691-98b5-c7d807da2de1"
/>
## Changelog
🆑
balance: Overclocked volume pumps work in walls again
/🆑
---------
Co-authored-by: nevimer <77420409+nevimer@users.noreply.github.com>
## About The Pull Request
falloff_distance should never be equal to or higher than maxdistance,
which was the case for very large fires, preventing them from playing
any sounds
## Changelog
🆑
fix: Fixed fire sound runtimes caused by incorrect arguments
/🆑
## About The Pull Request
Depends on #94064 for the unit test but offers a better method for
finding an atom to mount on
- Finding a mount now takes into consideration the objects pixel x & y
offsets meaning diagonal mounting is now supported. Gives great
flexibility for mappers
- If you don't want to use pixel offsets but default back to using the
objects direction that behaviour is still preserved. Useful if your
object uses directional icon states(lights & cameras for now) AND don't
use offsets
- If no direction could be specified then as the last resort it defaults
back to the objects local turf for mounting
## Changelog
🆑
fix: all mounted objects on tables, fences, windows & walls should fall
of correctly when the atom it is placed on is destroyed
fix: security telescreen now falls off when their mounted wall is
destroyed
fix: defib wall mount falls off when their mounted wall is destroyed
fix: floor lights are mounted to the ground/catwalk/tram floor they are
sitting on meaning destroying it will destroy the light
fix: wall mounted plaques now fall off when their mounted wall is
destroyed
/🆑
## About The Pull Request
Empy lists. There are a lot of 'em.
<img width="981" height="512" alt="image"
src="https://github.com/user-attachments/assets/b94b041a-2904-466b-ab89-54bd1de11b4e"
/>
Going through ways to reduce memory I found a few easy ones here. Wires,
the edible component, the seethrough component. None of these are really
a concern when it comes to needing lists in memory for performance
reasons. Wires aren't going to be cut most of the time for each door. A
lot of food does not have any junkiness. Seethrough component lies
dormant most of the round. Etc.
Making lists lazy in these cases should be a no brainer.
Everything I tested still seems to work exactly the same.
## Why It's Good For The Game
Frees memory that is just taking up space a lot of the time.
## Changelog
Not player-facing, this is all under-the-hood stuff.
## About The Pull Request
Extends the part of the crafting unit test that ensures consistency
between the total mats of the components of a recipe (or rather, the
result of said recipe) and a generic instance of the same type as its
result, previously only implemented on food recipes.
## Why It's Good For The Game
This ensures a degree of consistency with the material composition of
various objects in the game. I couldn't do it in the original PR as that
one was too big already and it took months to get it merged, and have
the relative bugs fixed.
Currently a WIP as I slowly deal with the unit test reports.
## Changelog
🆑
refactor: Follow-up to the crafting/material refactor from months ago.
All objects crafted with stacks now inherit their mat composition (not
necessarily the effects and color) by default, while previously only a
few things like chair, sinks and toilets did. Report any object looking
or behaving weirdly as a result.
fix: The material composition of ammo boxes is no longer a 1/10 of what
it's supposed to be. It was a shitty hack to make it harder to recycle
empty ammo boxes. Instead, they lose materials as they're emptied now.
/🆑
## About The Pull Request
Depends on #94064 for the unit test but offers a better method for
finding an atom to mount on
- Finding a mount now takes into consideration the objects pixel x & y
offsets meaning diagonal mounting is now supported. Gives great
flexibility for mappers
- If you don't want to use pixel offsets but default back to using the
objects direction that behaviour is still preserved. Useful if your
object uses directional icon states(lights & cameras for now) AND don't
use offsets
- If no direction could be specified then as the last resort it defaults
back to the objects local turf for mounting
## Changelog
🆑
fix: all mounted objects on tables, fences, windows & walls should fall
of correctly when the atom it is placed on is destroyed
fix: security telescreen now falls off when their mounted wall is
destroyed
fix: defib wall mount falls off when their mounted wall is destroyed
fix: floor lights are mounted to the ground/catwalk/tram floor they are
sitting on meaning destroying it will destroy the light
fix: wall mounted plaques now fall off when their mounted wall is
destroyed
/🆑
## About The Pull Request
Macros that are strings do not need to be doing this.
## Why It's Good For The Game
Less improper things to copy paste existing in the codebase
Turns off overclocking when the volume pump is overclocked while inside
a wall.
Closes#88513
## About The Pull Request
Overclocked pumps will turn off overclocking when they try to operate
inside a closed turf.
## Why It's Good For The Game
Removes an unintended exploit that trivialises the leaking
functionality. This makes it consistent with commit
ba6d08d5eb from #57971.
## Changelog
🆑
fix: Fixes overclocked volume pumps being able to work on walls.
/🆑
## 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
This 1st has to be PR'd so the integration tests can point out all
wallmounts that could not find a support structure to mount on. I then
will do many map edits to align them onto the closest atom
Yes we no longer use wall mount but atom mounted component. All objects
that are mounted on windows/tables & fences now also fall off when
destroyed
It'll probably be a WHILE before I can fix all wall mounts. Long day.
Expect me to misalign many stuff to fix failing CI so make sure to
provide suggestions when possible
Improved wallmount code overall
- Fixes#93793
## Changelog
🆑
fix: fixes all incorrectly maploded wall mounts that aren't actually
hanging on any support structure
fix: objects mounted on tables, windows & fences also fall off now when
destoryed
qol: lights can be mounted on windows
qol: cameras can be mounted on windows
qol: buttons can be mounted on tables
refactor: improved how wall mounts interact with objects as a whole
report bugs on github
/🆑
## About The Pull Request
This pull request makes the HFR process at the same rate as other
atmospheric components. Because its temperature changes previously
didn't take `seconds_per_tick` into account, heat output and a few
things related to it had to be adjusted to compensate. This also fixes a
bug preventing the moderator from being able to leak its gases from
cracked parts.
## Why It's Good For The Game
The HFR not processing with the rest of atmospheric machinery can
occasionally cause odd behavior such as pressure spikes in the waste
output every 1 in 4 atmos ticks, which this PR corrects.
## Changelog
🆑
fix: Fixed cracked HFR parts not being able to leak moderator gases.
code: The HFR now processes at the same rate as other atmos machinery.
/🆑
## About The Pull Request
closes#93805
## Why It's Good For The Game
we actually have almost no emp logging at all lol, not even emp chem
reaction, so you barely can track potential griefer?
## Changelog
🆑
admin: EMP logs are improved, additionally chemical EMP reactions are
now logged.
/🆑
## 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
- Fixes#93392
- Replaces all custom callbacks with call to `deconstruct()`. The
callbacks weren't necessary as it did the same thing as `deconstruct()`
but in an round about way
- Removed duplicate `Initialize()` procs and the params `building` &
`ndir` from all wall mounts. Makes everything cleaner
## Changelog
🆑
fix: wall mounts placed by player now falls off when the wall they are
mounted on is destroyed
code: cleaned up wall mount code
/🆑
## About The Pull Request
Converts the following:
- Medical Kiosk
- Implant case
- Flamethrower
- Chemical implant case
- Pappercutter
Also I've looked at some alt click procs and adjusted some of their
returns
## About The Pull Request
Lowers the power needed for the unary vents & gas miners by making unary
vents respect going idle and gas miners taking 7.5kW power less since it
doesn't really have a way to "turn off".
## Why It's Good For The Game
These machines are straight up power sinks that sucks up a lot of power
away from ghost roles & arrivals. The unary vents is quite a big issue
as on Metastation arrivals loses power about 3-4 minutes in and prevents
the rest of the station to charge their APCs, significantly cutting the
15 minute delay Engineering gets to set up power.
## About The Pull Request
It needs to match parent plane
## Changelog
🆑 Melbert
fix: Multi-z map cryo no longer makes locked fighting game characters
/🆑
## About The Pull Request
- Added full support for RETA system
- Categorized all configs for search purposes
- Added channel check for most usages of get_announcement_system() calls
## Why It's Good For The Game
## Changelog
🆑
code: Little AAS code cleanup. Added full RETA support. Grouped configs
for search purposes.
/🆑