3056 Commits
Author SHA1 Message Date
Alexis 88e84645b1 Merge commit '6b52b564a50e4f3091470529c683587e5de15d49' into upstream-sync-7-22-2026 2026-07-22 13:39:09 -04:00
LemonInTheDarkandGitHub ffc4b692f6 Fixes weird banding on mineral turfs adjacent to space (on the bottom z level) (#96997)
## About The Pull Request

You need to block emissives for starlight to color you, and this turf
isn't well, doing that.

So we should do that.

This is hot code, which is why I have guard checks like I do. It's about
0.2-0.3 seconds of init on my machine, somewhere in there at least.

## Why It's Good For The Game

This bugs me a lot

## Changelog
🆑
fix: Starlight will light rock walls adjacent to space... better.
/🆑
2026-07-17 12:47:05 +02:00
Leland KembleandGitHub d6f14fe29d Moves an amount up to interpretation of things from attackby() to item_interaction() (#96757)
## About The Pull Request

Thirty files changed, one's not really changed, one's actually just a
copy of a change from a different pr, because for the sake of pipe
cleaners I decided to change the base turf. Probably wasn't a good idea.
This one contains the full set of `/turf/` `attackby()`s(besides those
meant for attacks), converted all at once because the tree of turf
subtypes looks a lot more like a spire than a bush.

Changes beyond conversion:
I added messaging for when you're crowbarring transit tube pods out of
the tubes because I genuinely wasted half an hour trying to figure out
what I'd done wrong in conversion because they don't look any different
so I thought it wasn't working.

If you're reinforcing plating and the plating is reinforced
mid-reinforcement you will no longer waste your plasteel reinforcing the
reinforced plating.


## Why It's Good For The Game

what are we at, ~120? I was expecting this to be a lot more drawn out,
but most of them are really small. I'm gonna have to do a final pass of
calls to `attackby()` once the dust settles, but the end of non-attack
`attackby()`s is just a week away.
2026-07-15 17:37:00 -05:00
SmArtKarandGitHub 299fc82b54 Fixes atmos diffs and incorrect atmos in lavaland hermit ruin (#96973)
## About The Pull Request
Caused by #95955, solved by adding a subtype of biome replace turf that
has standard atmos

## Changelog
🆑
fix: Fixed atmos diffs and incorrect atmos in lavaland hermit ruin
/🆑
2026-07-15 23:39:28 +02:00
0716e3fff4 Atmos refactor & speedup by utilizing BYOND 516 vector functions (#96448)
## About The Pull Request

### Summary
This PR changes internal structure of `/datum/gas_mixture`:
`gases[gas_id][MOLES]` refactored into `moles[gas_id]`,
`gases[gas_id][ARCHIVE]` into `moles_archive[gas_id]` and
`gases[gas_id][GAS_META]` into `gas_meta` static variable. This allows
us to use BYOND 516 vector functions for calculating total moles and
heat capacity. Also it simplifies some parts of the code, allowing us to
get rid of macros `ADD_GAS` and `ASSERT_GAS`. According to the profiler
`/turf/open/process_cell` time is reduced by ~20%.

### Details
`gas_mixture.gases` was a nested 2d-list with MOLES, ARCHIVE and
GAS_META for each gas_id. For example, to get gas moles you had to do
`gases[gas_id][MOLES]`. I've changed this structure to be as follows:
`moles[gas_id]` - moles for the gas, `moles_archive[gas_id]` - archived
version of moles, `gas_meta[KEY][gas_id]` - static var with meta
information for the gas.

Since I removed key GAS_META from the gases, `gas_meta` was moved to the
static variable and the order of keys in the array was changed from
`gas_meta[gas_id][META_KEY]' to 'gas_meta[META_KEY][gas_id]`. This was
done to allow using it in vector calculations (for example heat capacity
or fusion power). Static variable access is very fast and it is
considered as accessing a global in the bytecode.

Byond 516 introduced new vector functions: `values_sum`, `values_dot`
and others. These functions are very fast, but operate only on
associative lists. This allows us to change the way we calculate
total_moles and heat_capacity - very hot and heavily used functions.
`total_moles()` became just `values_sum(moles)`, and `heat_capacity` is
just a dot product: `values_dot(moles,
gas_meta[META_GAS_SPECIFIC_HEAT])`.

As a side bonus, since `moles` is just an associative list, you don't
really need old macros `ADD_GAS` and `ASSERT_GAS` - all they did was to
make a copy of a list[3] with default value [0, 0, gas_meta] for
specific gas. Now when you're adding gas you can just use `moles[gas_id]
+= amount` and when you query amount of gas you can just query the key
(for example `moles[/datum/gas/oxygen]`) if the key does not exist, it
returns null and works as 0 for all arithmetic and logic operations. For
example, old code would be `if (!air.gases[/datum/gas/oxygen] ||
air.gases[/datum/gas/oxygen][MOLES] < 1)` and now it is `if
(moles[/datum/gas/oxygen] < 1)`. This simplifies some parts of the code
and also speeds things up.

For the performance comparison I used Tracy profiler. I've done many
different tests, and they all show slightly different numbers, but
overall speedup for `process_cell` is about 20%. (-20% to average time
per call from ). My testing setup was as follows:
Load Icebox, drop 30/60/90 radius bomb in the middle of the bridge, set
code to blue, wait 10 minutes until the round ends.
Also I fixed random seed in the master controller and in the planetary
gas randomization so generated maps are the same between tests.
Althought it's not very realistic, it generates a lot of samples for the
`process_cell` (around ~3.5M per 10 minutes).
Another test I did was a plasmafire in an 8x8 space, on runtime station,
it showed (-24% time on process_cell).
Another test was a emagged holodeck burn test, it showed (-13% time)
As for other functions of gas_mixture: `total_moles`: -50%(2x speedup),
`heat_capacity`: -65%(3x speedup), `share`: -30%, `react`: -20%. Timings
of all those functions is in microseconds range and they are very hot
(call count is in the same order as process_cell)

<details><summary>Some pictures from profiler</summary>
<img width="569" height="642" alt="process_cell"
src="https://github.com/user-attachments/assets/76fa0c27-719d-485d-9bfc-859fef788999"
/>
<img width="572" height="315" alt="image"
src="https://github.com/user-attachments/assets/f68497e9-4db8-4a9c-b43f-ad04e6dc5cac"
/>
<img width="569" height="317" alt="image"
src="https://github.com/user-attachments/assets/d7249e7b-f344-47a6-8b39-1bab0521182d"
/>
<img width="541" height="316" alt="image"
src="https://github.com/user-attachments/assets/1bef71fd-533d-40fa-a85e-7a803ad322f7"
/>
<img width="519" height="409" alt="image"
src="https://github.com/user-attachments/assets/51165289-174e-403d-a09c-787dd9af136a"
/>
<img width="523" height="318" alt="image"
src="https://github.com/user-attachments/assets/fe4b1db0-17d8-47f9-8fd0-e2ecef2ee66a"
/>
</details>

<details><summary>Setting up a profiler</summary>
If you wanna to reproduce my results here is a list of steps

1. download: https://github.com/goonstation/byond-tracy-writer (this one
has offsets for my version 1677)
2. build the dll, drop in the tgstation/ folder
3. download rtracy https://github.com/Dimach/rtracy
4. download Tracy profiler (0.13.1) https://github.com/wolfpld/tracy
5. uncomment `#define USE_BYOND_TRACY` in `_compile_options.dm`
6. build tgstation
7. open dream daemon, run the desired test, after round end dream daemon
closes
8. navigate to tgstation/data/profiler, find the `123412341234.utracy`
file
9. run `rtracty 123412341234.utracy`
10. open tracy-profiler.exe, press Connect, save the profiler data
11. repeat steps 5-10 with another branch, save another profiler data
12. open tracy-profiler, open first data, press compare, open second
data
</details>

## Why It's Good For The Game

## Changelog
🆑
refactor: Atmos refactor & speedup by utilizing BYOND 516 vector
functions
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2026-07-14 20:34:31 -07:00
GhomandGitHub 60e1346474 Custom materials of turfs and walls are no longer lost on shuttle move. (#96822) 2026-07-07 15:28:52 +02:00
SmArtKarandGitHub 4c7e25ac11 Fixes random black siderite/shale tiles appearing after ash storms (#96794)
## About The Pull Request
Storms refilling dug siderite/shale floors would create black spots due
to refilling assigning base_icon_state to the icon_state without
accounting for smoothing that those variants use

<img width="741" height="674" alt="image"
src="https://github.com/user-attachments/assets/ae997d8a-46bb-4851-b1c0-6637993fc47b"
/>

## Changelog
🆑
fix: Fixed random black siderite/shale tiles appearing after ash storms
/🆑
2026-07-04 19:51:47 +02:00
JacquerelandGitHub ec3e8a90cd Rebalance the work camp again (#96731)
## About The Pull Request

People had been noting that it was taking longer to pay off a 1000 point
gulag sentence than expected, because we made some changes to mining and
forgot to update it

So now:
- There are ores in the walls again (iron, plasma, silver, and gold)
- Materials are now worth a variable amount of points (iron = plasma <
silver < gold)
- Boulders mined from the walls pop into a large amount of the kinds of
ores you can mine
- Boulders dragged out of the infinite use "work pit" contain a
guaranteed large amount of iron

The upshot of these changes are:
- You can pull 14 boulders out of the hole for a guaranteed time spent
of about 6 and a half quite boring minutes to guarantee finishing your
sentence (if you know exactly what you are doing and optimise it,
probably a bit longer for many people)
- You can mine the walls for ore at the mercy of RNG, you will _likely_
be done in about 5 minutes of mining if you're an early sentence and
obviously it gets harder the more people have already mined out the ores

I aimed for about 5 and 6 minutes as a target because of a combination
of travel time, the fact that you need to actively do something, and
because of the weather.
Remember that's only 5 or 6 minutes actually doing _mining_ (or...
watching progress bars and repeatedly falling over), doesn't include
variations in skill or luck, being hustled into the teleporter, suiting
up, processing the ores, summoning the shuttle, taking the ores to the
shuttle, and an ash storm if you're unlucky. So all around, probably
adds up to be reasonably close to a 10 minute brig timer.

We all know most people given a 1 point sentence are just going to kill
themselves anyway.

Also I moved some lightbulbs in the mining station work camp area
because you couldn't see some of the important tiles and it was annoying
me

## Why It's Good For The Game

We advise players that 1000 points in the work camp is work about a 10
minute brig sentence and this is basically ban-baiting from our policy
page if it's not actually true

## Changelog

🆑
balance: Adjusted the values of ores from the work camp to make a 1000
point sentence closer to a 10 minute brig timer
map: Moved some lightbulbs around in the work camp so you can see the
bars getting printed
/🆑

<!-- 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. -->
2026-07-03 12:05:50 +02:00
Leland KembleandGitHub eaeb4b07c4 Moves a small few things from attackby() to item_interaction() (#96663)
## About The Pull Request

Ten files. No mechanical changes this time around, so the most notable
thing about this is a change to the way laying pipe cleaners works. I
guess since there's only ten, I can list them. But I'm not going to.

## Why It's Good For The Game

You probably don't regard the way pipe cleaner laying works to be sacred

## Changelog
🆑

code: Ten files have been moved from attackby() to item_interaction()

/🆑
2026-07-02 09:59:51 +02:00
SmArtKarandGitHub bc40a3f3f4 Prevents ore veins from spreading into gibtonite (#96746)
## About The Pull Request

Closes #96440

## Changelog
🆑
fix: Ore veins can no longer spread into gibtonite turfs
/🆑
2026-07-02 09:51:22 +02:00
GhomandGitHub 77fbd93641 Operation "WDYM They can teleport on away missions?!" phase 1: Stuck Inside Indestructible Walls (#96370)
## About The Pull Request
Somehow, we can teleport on away missions when we used not to be able to
a long time ago.
I'm not against it, however it can end quite badly with people getting
stuck in indestructible walls or stuff like that, or end up somewhere
with cordon turfs decoupled from the cordon area (museum cough cough),
which doto your spaceman what Dr. Manhattan did to Rorschach btw.

I'm totally fine with spacemen getting stuck on destructible turfs,
rocks that can be mined, machinery and other destructible or movable
structures, areas that are hard to access in and out, behind shutters
and puzzle doors or even at the rims of indestructible walls if they're
connected to any of the aforementioned things. It isn't a rigid
standard, using random teleportation to cheese away levels should be a
risky endeavor, but I also don't believe that you should end up
teleported somewhere that you cannot otherwise escape on your own or be
hypothetically freed from by another spaceman without more teleportation
having to be involved 100% of the times (or admins if they feel
merciful). That's where I draw the line.

Beside, more than a few maps didn't use cordon turfs and/or turfs or had
these massive portions of indestructible walls.

Oh, by the by, a little unrelated but I'm bringing the visuals of
indestructible "rock" walls up to date with the visuals for rock turfs
that can be mined. Included are also icon-states so that the two can be
easily distinguished during mapping.

Feedback welcome.

## Why It's Good For The Game
I'm not against using teleportation for away missions. Right now there
are a couple easter egg areas that can only be accessed that way.
However the risks of getting GBJ'd are immense if done randomly.

Also for some reason, despite having the secret z-trait injector for the
museum stops phasing/jaunting, the museum areas are not of the secret
type, so they don't block teleportation. WHATEVER, IT ISN'T LIKE IT HAS
SOME OMEGA LOOT WORTH THE TROUBLE

## Changelog

🆑
map: Made it a bit harder to get stuck on away missions if you willingly
or unwillingly use teleportation techniques. You still definitely can,
but usually only on sections of the map that can be reached one way or
another, including rock walls that can be mined, just not those that
cannot.
image: Updated the visuals for indestructible rock walls to match the
destructible ones.
balance: RNG teleportation should work marginally better around areas
and turfs where teleportation is restricted by skipping them instead of
having a chance to fumble because of that.
/🆑
2026-06-27 16:57:04 -07:00
SmArtKarandGitHub 097a822b8b Fixes broken visuals on siderite/shale turfs when dug (#96634)
## About The Pull Request

Fixes this jank 

<img width="163" height="141" alt="image"
src="https://github.com/user-attachments/assets/496fb4d6-f376-472f-a8f7-736c83aca239"
/>

## Changelog
🆑
fix: Fixed broken visuals on siderite/shale turfs when dug
/🆑
2026-06-25 21:24:33 +02:00
Roxy de4c3b255d Merge branch 'master' of github.com:tgstation/tgstation into upstream-2026-06-23 2026-06-23 15:51:55 -04:00
SmArtKarandGitHub 0f0be33fcd Drastically lowers the amount of gibtonite on icebox, fixes incorrect wall typepath (#96504)
## About The Pull Request

Significantly reduces the amount of gibtonite spawned on icebox, and
fixes underground cavegen spawning normal icemoon walls rather than
special underground ones (which have numbers equals to those of lavaland
walls, rather than reduced surface numbers) which caused icebox to have
significantly less ore than intended.

## Why It's Good For The Game

Its everywhere man, I'm pretty sure underground has more gibtonite than
titanium at this point. Its so common that I've had 5-6 long chain
reactions occur just from shooting one of them, which caused the station
to shake for half a minute straight.

<img width="533" height="619" alt="dreamseeker_WiZO1oTeM6"
src="https://github.com/user-attachments/assets/04080f36-5687-42d3-9754-a93a2b26c3fc"
/>

## Changelog
🆑
balance: Drastically reduced the amount of gibtonite spawning on icebox
fix: Fixed icebox underground spawning significantly less ores than
intended
/🆑
2026-06-22 13:28:55 +12:00
GhomandGitHub e700e5c8b1 Floor decals are no longer rainbow-colored every round during pride week (#96557) 2026-06-21 22:13:13 +00:00
ArcaneMusicandGitHub 0846c1f602 Standarizes some moon outpost 19 fixes and map tweaks. (#96278) 2026-06-18 17:16:10 +02:00
Leland KembleandGitHub f75cff4b99 Fixes runtime in pathfinding (#96468)
## About The Pull Request

Obvious

## Why It's Good For The Game

<img width="532" height="112" alt="image"
src="https://github.com/user-attachments/assets/d4e82701-943c-4301-a301-2db53b135e5b"
/>

## Changelog
🆑

fix: fixed a runtime in pathfinding

/🆑
2026-06-13 14:45:44 -07:00
SmArtKarandGitHub 4cbef7bc28 Makes TESTING mineral depth overlay work on larger rocks (#96415)
## About The Pull Request

<img width="345" height="347" alt="dreamseeker_g3fZveerSI"
src="https://github.com/user-attachments/assets/bb80332e-8392-4cc4-b754-bf3075da60fb"
/>

New rocks are noticeably larger and old maptext offsets resulted in
depth numbers being partly covered

## Changelog
🆑
fix: Fixed debug overlays on new biome rocks on lavaland
/🆑
2026-06-11 03:25:44 +02:00
0bd4b0820f Adds TGMC Tactical maps to the game and to Nuclear Operatives! (#96068)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request

Brought to you by Team Powercrèpe.(same group of people that delivered
the Heretic Overhaul)

This PR ports the TGMC Tacmaps and grants em to our NukeOps.

Code by Me, @Xander3359, @Arturlang, @Absolucy.

Mapping by @RipGrayson 

Sprites by @KillerOrcaCora

Writing bits by @necromanceranne

Tacmaps are essentially dynamically generated minimaps,

<img width="1711" height="1335" alt="Tac map examples"
src="https://github.com/user-attachments/assets/f936fac0-fb7c-4b84-970d-7195b4995ca7"
/>



<img width="1274" height="714" alt="Tac-Maps Icons"
src="https://github.com/user-attachments/assets/0f04e388-af4b-4955-be7a-04650cfd746b"
/>






As you can see from the screenshots above, departments are classified by
color, hovering your cursor over an area or a team mate, will display
their name, the system does allow the user to switch between Multi-Z,
and lastly you can draw and add labels to the map, although the last
option is only available to the NukeOps Leader and OW agents.


The functionality is tied to the Syndicate implants nukies start with,
Cayenne, Syndie borgs and Mechs also have the ability to toggle the map.

Likewise, the tacmaps will display the positioning of the following in
real time!

- Nuke ops agents

- Syndie borgs and Mechs

- Cayenne

- Location of the nuclear fission device (and beer nuke)

- Location of the Nuclear Authentication Disk.

<img width="1274" height="714" alt="SkyBridge OFF"
src="https://github.com/user-attachments/assets/3915e7d7-644a-4e9a-b213-997834dde2ea"
/>

<img width="1274" height="714" alt="SkyBridge ON"
src="https://github.com/user-attachments/assets/13748290-fd16-42ba-a9c4-a6b4f7e69c79"
/>

<img width="566" height="459" alt="Holo table done"
src="https://github.com/user-attachments/assets/1a43c5b7-ee51-4794-9c09-16b4fb50e2ad"
/>






https://github.com/user-attachments/assets/caf38538-ef04-4330-992c-3137a67ea0d0






Lastly The tactiical map implant cannot be be used on the nuke ops
base,If the team wishes to interact with the map they'll have to
Interact with the "Reconnaisance Platform" (Sprite by Orcacora) in the
briefing room, which has seen some mapping changes (Brought to you by
TheLastGrayson).



<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

## Why It's Good For The Game

Originally this feature was planned for the Upcoming Contractor Rework
our team is currently working on, but given the massive size of it all,
we decided to atomize it.

But without that consideration in mind, I think it makes sense for
Nuclear operatives of all antagonists to have the means to Recon and
plot an assault plan onto the station and actually be able to know the
whereabouts of their teammates.

Obviously this feature has a lot of other potential applications, we
have wanted to have functional Maps for a very long time, if someone
wants to give it a go once the feature is merged, by all means.

<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
add: Tactical Maps have been added to the game!
add: Nuclear Operatives implants now grant the ability to open a
Minimap, this map will display and show the names of various areas of
the station, and the positioning of the Nukeops team,borgs,mechs,Cayenne
and the nuke disk in real time!
add: Nukie leaders and OW agents can also draw and apply labels to the
map.
add: the "Recoinassance Platform" has been added to the Nukie Base, it
allows displaying of the Tactical maps while on the Syndicate Base Z
level.
map: The briefing room in the NukeOps base has been remapped to better
accomodate the new Holographic table.
map: Changed the front shutters on the Syndicate Infiltrator to the more
fitting Syndicate Shutters.
/🆑

<!-- 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: Xander3359 <66163761+Xander3359@users.noreply.github.com>
Co-authored-by: Artur Lang <24881678+Arturlang@users.noreply.github.com>
Co-authored-by: Lucy <lucy@absolucy.moe>
Co-authored-by: Copilot <copilot@github.com>
Co-authored-by: RipGrayson <49290523+RipGrayson@users.noreply.github.com>
Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com>
2026-06-09 16:38:00 +02:00
SmArtKarandGitHub 8033a47936 Implements overlay-based smoothing for lavaland lava and water (#96151)
## About The Pull Request

<img width="714" height="648" alt="dreamseeker_4N3ALTkuIp"
src="https://github.com/user-attachments/assets/3a05782a-b620-4193-a6fe-b5797a16d586"
/>

By smoothing with natural walls and floors and utilizing overlays to add
artificial smoothing with them, we can have nice-looking multi-type
smoothing on the same tile without too much overhead.
I've implemented this for both lavaland lava and water (despite latter
only being mapped in near the raptor area which has guaranteed basalt
flooring, it might be useful to have in the future for ruins and what
not)

## Why It's Good For The Game

Lava smoothing using basalt edges looks really weird and jank.

## Changelog
🆑
refactor: Implemented overlay-based smoothing for lavaland lava and
water
/🆑
2026-06-05 03:57:43 -07:00
shayoki f601a6ddaf Merge remote-tracking branch 'tgstation/master' into upstream-6-2-2026 2026-06-03 01:23:54 -05:00
+37 21b4095dfd [MDB IGNORE] [IDB IGNORE] Upstream Sync - 04/17/2026 (#5453)
Upstream 04/17/2026

fixes https://github.com/Bubberstation/Bubberstation/issues/5549

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com>
Co-authored-by: rageguy505 <54517726+rageguy505@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com>
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: Maxipat <108554989+Maxipat112@users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
Co-authored-by: SimplyLogan <47579821+loganuk@users.noreply.github.com>
Co-authored-by: loganuk <fakeemail123@aol.com>
Co-authored-by: Leland Kemble <70413276+lelandkemble@users.noreply.github.com>
Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
Co-authored-by: Lucy <lucy@absolucy.moe>
Co-authored-by: siliconOpossum <138069572+siliconOpossum@users.noreply.github.com>
Co-authored-by: Isratosh <Isratosh@hotmail.com>
Co-authored-by: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com>
Co-authored-by: Neocloudy <88008002+Neocloudy@users.noreply.github.com>
Co-authored-by: Alexander V. <volas@ya.ru>
Co-authored-by: ElGitificador <168473461+ElGitificador@users.noreply.github.com>
Co-authored-by: Twaticus <46540570+Twaticus@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
Co-authored-by: Tim <timothymtorres@gmail.com>
Co-authored-by: Iamgoofball <iamgoofball@gmail.com>
Co-authored-by: Layzu666 <121319428+Layzu666@users.noreply.github.com>
Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com>
Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com>
Co-authored-by: mrmanlikesbt <99309552+mrmanlikesbt@users.noreply.github.com>
Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
Co-authored-by: John F. Kennedy <54908920+MacaroniCritter@users.noreply.github.com>
Co-authored-by: Cursor <102828457+theselfish@users.noreply.github.com>
Co-authored-by: Josh <josh.adam.powell@gmail.com>
Co-authored-by: Josh Powell <josh.powell@softwire.com>
Co-authored-by: Yobrocharlie <Charliemiller5617@gmail.com>
Co-authored-by: Hardly3D <66234359+Hardly3D@users.noreply.github.com>
Co-authored-by: shayoki <96078776+shayoki@users.noreply.github.com>
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2026-05-16 00:56:00 +02:00
19c2327893 I promise It's Not Wallening™ + New Tile Variations (#5169)
## About The Pull Request

As the second half of
https://github.com/Bubberstation/Bubberstation/pull/4918, this pr is
apart of my effort to comprehensively resprite many common assets to be
more cohesive in style and whatnot.

The extra tile variations are just thrown in for more mapper freedom.
They're not deserving of an entire pr dedicated to them.

## Why It's Good For The Game

Skyrat's walls and windows are for the most part ripped from other
codebases. While they have done a serviceable job, their implementation
is not all encompassing and many variations of the standard
walls/windows they intend to replace are simply not accounted for
(namely indestructible variants).

Not to mention, with walls specifically, what has been implemented is
incredibly tedious to modify as they do not use automated icon cutting.
Instead, the dmi is manually built and false wall variations are added
to them.

On top of replacing almost every wall and window tile, walls that were
previously bereft of icon smoothing, now have the capability to do said
smoothing.

Also it's not wallening™.

## Proof Of Testing

<details>
<summary>Screenshots/Videos</summary>
<img width="2304" height="1600" alt="image"
src="https://github.com/user-attachments/assets/94c3ef7b-d754-4754-aac1-4ac36cc81086"
/>

The tile variations: 
<img width="1216" height="896" alt="image"
src="https://github.com/user-attachments/assets/cbc6707e-5258-4cbc-9a79-befaea5efb4e"
/>

<details>
<summary>Contextual Examples</summary>

**Station**
<img width="1216" height="960" alt="image"
src="https://github.com/user-attachments/assets/98357cc3-0b2b-4da4-b148-0aa8005b7efd"
/>
<img width="1216" height="960" alt="image"
src="https://github.com/user-attachments/assets/bef30efd-ae88-49f3-b706-fe34d1df97a7"
/>
<img width="1216" height="960" alt="image"
src="https://github.com/user-attachments/assets/933786f6-a6f8-4fab-b222-fbcef88a440f"
/>

**Centcom**
<img width="1216" height="960" alt="image"
src="https://github.com/user-attachments/assets/7c92c645-4fdb-4e05-91c3-100508fcf0da"
/>

**Shuttle**
<img width="1216" height="896" alt="image"
src="https://github.com/user-attachments/assets/3304c842-8bac-40b0-8024-7c6616717331"
/>

**Plastitanium**
<img width="1088" height="576" alt="image"
src="https://github.com/user-attachments/assets/cb252aab-b501-4218-bd0d-ab60492676a4"
/>
<img width="448" height="704" alt="image"
src="https://github.com/user-attachments/assets/434bceb2-4884-4d2a-826b-b524ec054a56"
/>

**Necropolis**
<img width="1216" height="960" alt="image"
src="https://github.com/user-attachments/assets/aed42870-c4a4-4255-9ff0-7544127469f5"
/>

**Assorted With Notes**

<img width="1216" height="704" alt="image"
src="https://github.com/user-attachments/assets/01f826ee-ca4d-44dc-bc9f-9057f71cb9ea"
/>
Many variations of wall replacements were not previously accounted for.
The most immediate one I could think of were the indestructible wooden
walls in the Ghost Cafe.


<img width="1216" height="960" alt="image"
src="https://github.com/user-attachments/assets/1ad067c3-840c-4f78-a24d-b597dfc34743"
/>
<img width="1216" height="960" alt="image"
src="https://github.com/user-attachments/assets/d0f44e35-46fe-4c38-865c-c3421a2c2282"
/>
The "interior" of many of the wall sprites were kept intentionally flat
and dark as to more convincingly sell perspective*.


<img width="382" height="318" alt="dreamseeker_Cy4kIapjp6"
src="https://github.com/user-attachments/assets/fa5bd972-4a44-4eef-9faf-8992a768f144"
/>

The standard walls are an exception to this rule as they need to be
readily apparent to unscrupulous ne'er-do-wells with mesons.

</details>
</details>

## Changelog

🆑 Robwo
add: Added new variations to small tiles and pod floors
image: Almost all of the wall and window sprites have been redone
image: The palette of wooden platforms now more closely match wooden
floors
image: New bronze table sprites
fix: Fixed rock wall sprites being incorrectly (un)colored
fix: Decal painter now sprays our override decals.
/🆑

---------

Co-authored-by: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com>
2026-05-12 00:09:07 +02:00
SmArtKarandGitHub 940d91bb62 [MDB IGNORE] Adds new features and tiles for lavaland biomes (#95955)
## About The Pull Request

Adds new floor types and natural decor to both Siderite and Shale
biomes, as well as makes flora and fauna spawns differ between said
biomes.

<img width="1216" height="997" alt="dreamseeker_uIv1OgVkpD"
src="https://github.com/user-attachments/assets/327d9caa-a58c-4d70-acbe-477da69b4d71"
/>

---

Basalt biome now spawns more legions and goliaths, but less watchers and
no brimdemons. You can rarely find new volcanic pore rocks which will
spew out lava when destroyed.

<img width="505" height="361" alt="dreamseeker_TA9rXzOgad"
src="https://github.com/user-attachments/assets/fb19a60a-c927-441b-abad-161ce5022a60"
/>


Siderite biome has a lot of rock formations and may sometimes spawn new
stalagmites. You can expect to see a ton of bileworms, raptors and
watchers there.


<img width="747" height="613" alt="dreamseeker_uZgRX8qqh3"
src="https://github.com/user-attachments/assets/d356f1c6-371a-4b8b-899b-470edb0d2790"
/>


Shale is full of lobstrocities, goldgrubs and brimdemons, and home to a
new glowgrowth "plant" - colony of bioluminescent fungi growing on
natural air vents.

<img width="274" height="220" alt="dreamseeker_EtxiS4X9M7"
src="https://github.com/user-attachments/assets/cbefba67-b618-4a65-ad12-9ee5182b650c"
/>


While it cannot be planted by itself, it contains luminescent fluid
inside which will grant whoever eats it minor night vision as long as it
is inside their bloodstream (as well as cyan-glowing eyes)

---

Ruins now properly respect their biome's rock (and now floor as well)
type, since it was broken for some of them previously.

<details>
<summary>More images under the dropdown</summary>

<img width="1216" height="997" alt="dreamseeker_fpXXV0Rt3D"
src="https://github.com/user-attachments/assets/fa790ca1-7045-490e-bcb2-c1f9da9f277c"
/>
<img width="414" height="303" alt="dreamseeker_l6E8S2fzCe"
src="https://github.com/user-attachments/assets/8b10dcca-c546-41ce-9363-a12b0f225881"
/>
<img width="784" height="587" alt="dreamseeker_RUWQo0unNp"
src="https://github.com/user-attachments/assets/d7364abc-ec68-4daf-b3cb-a03b8ba7e5de"
/>
<img width="1216" height="997" alt="dreamseeker_zoltABvkBw"
src="https://github.com/user-attachments/assets/324f50f8-83c9-4451-8eff-33ebf81c1d0d"
/>
<img width="1125" height="571" alt="dreamseeker_ky5qvl2XtC"
src="https://github.com/user-attachments/assets/ff08d22f-fc15-4961-b76e-7c10d7814096"
/>

</details>

Credit for original versions of new flora/feature sprites to
SentryPrimis on the /tg/station discord

## Why It's Good For The Game

Makes biomes more distinct and interesting, as well as gives them unique
atmosphere, since right now they only differ in rock type and mineral
distribution.

## Changelog
🆑 SmArtKar, SentryPrimis
add: Siderite and Shale lavaland biomes now have unique floors, as well
as flora, features and fauna!
fix: Fixed some ruins generating with default basalt walls instead of
their biome's walls
/🆑
2026-05-07 10:20:43 +01:00
BloopandGitHub 966d6547e8 Big tooltype decargo-culting (continued) (#95814)
## About The Pull Request

Gets some instances that I caught missed by
https://github.com/tgstation/tgstation/pull/95408
2026-04-29 12:19:00 -05:00
9b6e752f3e Makes lighting objects objects again (#95332)
## About The Pull Request

Continuation of https://github.com/tgstation/tgstation/pull/78857

FOR TOOO LONG WE HAVE SUFF-
Ok yeah so like, we made them overlays to save on maptick, but with
threaded maptick that is potentially not an issue anymore.
I'm opening this pr so I can tm it and see. If it works, it'll save
about 50% of lighting object update costs, which is pretty damn good.

I'm also removing the fullbright light icon state, since it is barely
ever used (it was added as a clientside op, but we don't hit fullbright
very much at all so it does nothing but eat my cpu time)

Also also changing how SSlighting does its resolution. Rather then
waiting for all sources to process, then working on corners and objects,
instead we will do all the sources we had at the start, then all the
sources after, and so on.
The goal is to avoid churn causing the system to constantly choke. it is
better to potentially double operate then it is for things to feel
horrifically slow.

## Why It's Good For The Game

Faster. Also you won't be able to see lights through walls anymore, so
mesons will be less dumb. Can maybe bump their nightvision a bit idk
we'll see.

## Current Issues

to be found

## Changelog
🆑 Absolucy, LemonInTheDark
fix: You can no longer see lights through walls when using mesons or
when ventcrawling.
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2026-04-23 08:55:26 +12:00
FinancialGooseandGitHub e98cb75c57 Refactor gasmix mole change into a proc (#95327)
## 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
/🆑
2026-04-21 13:43:47 -07:00
SmArtKarandGitHub 2680aafa3f [MDB IGNORE] Lavaland Mineral Rework: Yapmining 2026 (#95682) 2026-04-20 10:52:59 -04:00
MrMelbertandGitHub bad46d8600 Walking in snow leaves snowprints, snowstorms clear them (#95569)
## About The Pull Request

<img width="444" height="318" alt="image"
src="https://github.com/user-attachments/assets/d2b21460-0b11-499a-b05e-33d3a9768e71"
/>

Walking through snow or sand leaves behind a trail of prints similar to
that of bloody footprints (they use the old sprites, in fact). Like
bloody footprints, you can examine them to get a hint at what left the
prints (shoe type or leg type if barefoot).

When weather comes through (snow storm or sand storm), all prints will
be cleared off. During a raging snow or sand storm, you won't leave
prints at all.

Snowprints can be filled with snow to remove them as well. 

Some equipment or effects will stop you from leaving snowprints (ski
shoes, ice shoes*, heretic's cloak of shadows). Also you obviously don't
leave prints if you're flying or crawling or riding something.

**We don't have snow shoes* 

## Why It's Good For The Game

Initially I made this as a cute little detail, but I realized it has far
reaching implications for play on Icebox (and many, many sandbox
applications)

On Icebox, any average joe can run into the wastes and become
untraceable, which makes it almost impossible to track down antagonists.
Snowprints... are a method for tracking people who run off into the
snow.

But you can play around it - You can make fake trails and retrace your
steps. You can wait for a snowstorm to clear your tracks. You can even
fill in your tracks with snow if you're patient. Alternatively,
acquiring snow shoes means you leave no trail... or you could learn to
fly, crawl through the snow, use a vehicle, so on.

If you're assigned to assassinate a miner, you can follow their
snowprint trail as they head into the wastes. However, this may only
works early in the round, as the caverns have no snowstorm to clear
prints - as miners come and go, it will become harder to follow trails.

Speaking of miners, they can follow their co-workers trail if they get
injured, or look for prints to see if a ruin has been looted. Similarly
if a crew member falls down to the mining layers, they could find a
miner's trail to follow it back to the station.

And If you're a paramedic and someone was wounded out in the wastes, you
might be able to find their trail to track them down. But you can't
dilly-dally, as the storm will wipe away any chance of that.

Ultimately I think a small detail like this has some big potential for
emergent gameplay which could be cool. My intent is not to affect
antagonists too negatively, so more tools to avoid leaving prints (snow
shoes) could be added.

## Changelog

🆑 Melbert
add: Walking in snow or sand leaves behind prints. You can examine the
turf to see what left the prints, like with bloodprints.
add: Snowstorms or sandstorms clear away any footprints left behind in
the snow or sand.
add: Some equipment or effects, like skis or snowshoes, prevent you from
leaving prints in the snow.
add: You can fill in snowprints with snow. 
/🆑
2026-04-03 15:32:09 +01:00
MrMelbertandGitHub da64374423 Reverts "Add prosthetic limb" surgery to involve targeting limbs, rather than targeting chest. (Adds stumps) (#95252)
## 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.
/🆑
2026-03-20 14:32:41 +13:00
Cody BrittainandGitHub 965c4a40a9 Add an equivalent to balloon_alert_to_viewers, but for hearing (#95376) 2026-03-17 17:28:27 -04:00
Alexis 5c5a636485 Merge branch 'master' into upstream-feb12-2026 2026-03-02 07:42:16 -05:00
SmArtKarandGitHub 88ec27b2e1 Fixes material turfs not functioning for 3+ years (#95246)
## About The Pull Request

A flipped length check prevented turfs from initializing their
materials, and made all non-material turfs initialize theirs instead.
Also, the integrity needs to be set before materials are applied, not
after.

Yeeeeah.

## Changelog
🆑
fix: Material turfs, such as plasma floors, now function again after 3+
years.
/🆑
2026-02-25 14:41:34 +13:00
5597d3556b fix: Roundstart atmos dif's (#5263)
Just fixes some tiles where there is a difference in atmos roundstart
which causes lag.

🆑
fix: fixes some roundstart atmos differences with lizard gas and the
persistence
/🆑

Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
Co-authored-by: gavla <96078776+shayoki@users.noreply.github.com>
2026-02-24 09:11:18 -06:00
SmArtKarandGitHub a3498fdcd7 Material Science 1: A bunch of math (#95090) 2026-02-22 16:53:51 +11:00
nevimer 00ccf0c6b5 Merge remote-tracking branch 'tgstation/master' into upstream-feb12-2026
# Conflicts:
#	.github/CODEOWNERS
#	.github/workflows/compile_changelogs.yml
#	.github/workflows/stale.yml
#	SQL/database_changelog.md
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/__DEFINES/atom_hud.dm
#	code/__DEFINES/inventory.dm
#	code/__DEFINES/mobs.dm
#	code/__DEFINES/species_clothing_paths.dm
#	code/__DEFINES/subsystems.dm
#	code/__DEFINES/surgery.dm
#	code/__HELPERS/global_lists.dm
#	code/_globalvars/lists/maintenance_loot.dm
#	code/_globalvars/traits/_traits.dm
#	code/controllers/subsystem/minor_mapping.dm
#	code/controllers/subsystem/processing/quirks.dm
#	code/controllers/subsystem/shuttle.dm
#	code/datums/components/palette.dm
#	code/datums/components/surgery_initiator.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/hud.dm
#	code/datums/mood.dm
#	code/datums/mutations/chameleon.dm
#	code/datums/quirks/negative_quirks/nyctophobia.dm
#	code/datums/status_effects/debuffs/debuffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/slime/slime_leech.dm
#	code/datums/weather/weather.dm
#	code/game/data_huds.dm
#	code/game/objects/items.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/frog_statue.dm
#	code/game/objects/items/rcd/RLD.dm
#	code/game/objects/items/robot/items/hypo.dm
#	code/game/objects/items/stacks/medical.dm
#	code/game/objects/items/stacks/wrap.dm
#	code/game/objects/items/storage/garment.dm
#	code/game/objects/items/tools/medical/defib.dm
#	code/game/objects/items/weaponry.dm
#	code/game/objects/items/weaponry/melee/misc.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/game/objects/structures/curtains.dm
#	code/game/objects/structures/dresser.dm
#	code/game/objects/structures/girders.dm
#	code/game/objects/structures/maintenance.dm
#	code/game/objects/structures/mirror.dm
#	code/modules/admin/greyscale_modify_menu.dm
#	code/modules/admin/verbs/light_debug.dm
#	code/modules/antagonists/ashwalker/ashwalker.dm
#	code/modules/antagonists/heretic/knowledge/starting_lore.dm
#	code/modules/antagonists/ninja/ninjaDrainAct.dm
#	code/modules/art/paintings.dm
#	code/modules/client/preferences.dm
#	code/modules/client/verbs/ooc.dm
#	code/modules/clothing/head/wig.dm
#	code/modules/events/disease_outbreak.dm
#	code/modules/holodeck/holo_effect.dm
#	code/modules/jobs/job_types/head_of_security.dm
#	code/modules/jobs/job_types/security_officer.dm
#	code/modules/library/skill_learning/generic_skillchips/point.dm
#	code/modules/mining/lavaland/ash_flora.dm
#	code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/basic/guardian/guardian.dm
#	code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
#	code/modules/mob/living/carbon/carbon.dm
#	code/modules/mob/living/carbon/human/human.dm
#	code/modules/mob/living/carbon/human/human_defines.dm
#	code/modules/mob/living/carbon/life.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob/living/living_defines.dm
#	code/modules/mob/mob.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mod/mod_control.dm
#	code/modules/mod/modules/modules_general.dm
#	code/modules/modular_computers/computers/item/computer_ui.dm
#	code/modules/paperwork/paper.dm
#	code/modules/paperwork/paperbin.dm
#	code/modules/power/lighting/light.dm
#	code/modules/projectiles/guns/energy/kinetic_accelerator.dm
#	code/modules/projectiles/projectile.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/food_reagents.dm
#	code/modules/reagents/chemistry/reagents/other_reagents.dm
#	code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
#	code/modules/research/xenobiology/crossbreeding/_clothing.dm
#	code/modules/research/xenobiology/crossbreeding/prismatic.dm
#	code/modules/surgery/advanced/brainwashing.dm
#	code/modules/surgery/advanced/lobotomy.dm
#	code/modules/surgery/amputation.dm
#	code/modules/surgery/blood_filter.dm
#	code/modules/surgery/bodyparts/_bodyparts.dm
#	code/modules/surgery/brain_surgery.dm
#	code/modules/surgery/cavity_implant.dm
#	code/modules/surgery/coronary_bypass.dm
#	code/modules/surgery/gastrectomy.dm
#	code/modules/surgery/healing.dm
#	code/modules/surgery/limb_augmentation.dm
#	code/modules/surgery/organ_manipulation.dm
#	code/modules/surgery/revival.dm
#	code/modules/surgery/sleeper_protocol.dm
#	code/modules/surgery/surgery_helpers.dm
#	code/modules/surgery/surgery_step.dm
#	code/modules/unit_tests/_unit_tests.dm
#	code/modules/unit_tests/designs.dm
#	code/modules/unit_tests/icon_state_worn.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png
#	icons/map_icons/clothing/head/_head.dmi
#	icons/map_icons/clothing/shoes.dmi
#	icons/map_icons/items/_item.dmi
#	icons/mob/huds/hud.dmi
#	icons/mob/inhands/64x64_lefthand.dmi
#	icons/mob/inhands/64x64_righthand.dmi
#	icons/obj/machines/computer.dmi
#	tgui/packages/tgui/interfaces/OperatingComputer.jsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
#	tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
#	tools/icon_cutter/check.py
2026-02-12 23:50:09 -05:00
RikuTheKillerandGitHub 3e504a77ae Refactor girders and wall construction (#94364)
## About The Pull Request

This PR refactors wall construction on girders, wooden barricades and
metal foam to use a centralized element, which listens to item
interaction signals and attempts to make any available wall recipe.

This change is an atomized prerequisite to my blueprinting system, since
that system requires a sane way to dynamically change the speed at which
walls are built.

This PR will later be expanded to refactor girder construction steps in
general.

I also added `proc/valid_typesof(base_type)` as a side effect of my
previous attempts at refactoring this stuff. There's now what amounts to
a code comment easter egg in the same file, because DM is wacko and
you're going to get cursed now too. :)
## Why It's Good For The Game

The old system had ~20 bespoke yet highly similar wall construction
steps. Some of the wall recipes were also concatenated from a string on
the used stack type. To put it bluntly, the code was fucking horrible.

Same thing goes for the rest of the girder construction steps, they were
all bespoke.
## Changelog
🆑
refactor: Refactored girders and wall construction. Report any bugs.
tweak: Some niche wall types might have their wall delay changed by like
2 seconds. This doesn't affect normal walls, reinforced walls,
falsewalls or any other important wall types.
/🆑
2026-01-26 11:36:16 -05:00
JacquerelandGitHub faf2000100 Rust doesn't apply effects to people who aren't touching it (#94733)
## About The Pull Request

Heretic rusted tiles do not apply any effects to things which are
jaunting or inside vents.
They also don't apply any _negative_ effects to things that are flying
(but they do apply positive ones, just because flight is a cool thing to
have earned and it would be sad to lose your bonuses because you have
wings).

I also renamed the element so that it isn't named after the rust passive
(in fact, the rust heretics with that passive don't use the element) and
simply describes what it does, and removed a subtype in favour of just
passing in some arguments.

I also added a trait which bypasses the negative effects of standing in
rust, in case an admin creates a non-heretic creature and gives it rust
healing. They shouldn't have _both_ healing _and_ gain disgust and minor
damage from starting in rust (possibly the heretical harvester was being
effected by this?)

Finally I adjusted the `rust_heretic_act` and `rust_turf` procs to
remove a footgun I saw a developer fall into recently where they didn't
realise that the generically named "rust turf" proc actually assumes a
wizard did it, now if we add anything else that wants to non-magically
rust a turf then it will work the way you expect.
As a side effect this changes the two item sources of rust that heretics
get to actually use rust resistance rather than rusting every turf, I
set them to effect all inorganic turfs as a default.
And finally I noticed that rust heretic ascension was passing
"RUST_RESISTANCE_ABSOLUTE" as a value into its proc which reads `Should
not be rustable. EVER.` in its comment, which smelled like a bug. So I
changed it to just "things which should be rustable ever".

## Why It's Good For The Game

It is the logical way you would expect these things to work;
Heretics crawling in vents or (for instance) using space crawl should
not be healed for touching rust that they aren't touching, as they are
not readily accessible to other players. The idea of the rust healing is
that it's a tradeoff for exposing yourself in a visible "territory", so
you shouldn't be able to avoid it by being in that territory but
untouchable and invisible.
Similarly, players who have gained the ability to fly would not expect
to get sick from flying over rusty flooring. They're out of range.

## Changelog

🆑
balance: Eldritch rusted tiles don't apply their effects to anyone who
is jaunted or in vents, and don't apply negative effects to people who
are flying.
balance: Heretic items which apply rust (grenades and eldritch reagent)
check the rust resistance level of the turf rather than always rusting
it.
fix: Rust Heretics ascending don't rust unrustable turfs, like space
tiles.
/🆑
2026-01-15 12:43:39 +00:00
SyncIt21andGitHub b5055f0a42 Converts some map focused tests to map logging (#94538) 2025-12-29 11:28:33 -07:00
nevimer 6e9f2ccfc0 Merge remote-tracking branch 'tgstation/master' into upstream-12-15
# Conflicts:
#	.github/workflows/compile_all_maps.yml
#	.github/workflows/run_integration_tests.yml
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/_onclick/hud/credits.dm
#	code/controllers/subsystem/networks/id_access.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/game/machinery/doors/door.dm
#	code/game/objects/structures/crates_lockers/closets/secure/medical.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/modules/antagonists/malf_ai/malf_ai_modules.dm
#	code/modules/jobs/job_types/_job.dm
#	code/modules/loadout/categories/accessories.dm
#	code/modules/loadout/loadout_helpers.dm
#	code/modules/loadout/loadout_items.dm
#	code/modules/loadout/loadout_preference.dm
#	code/modules/mob/living/silicon/robot/robot_defense.dm
#	code/modules/mod/mod_theme.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/reagents/reagent_containers/cups/drinks.dm
#	code/modules/shuttle/mobile_port/variants/supply.dm
#	code/modules/surgery/organs/internal/eyes/_eyes.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png
#	icons/hud/screen_full.dmi
2025-12-15 18:12:29 -05:00
shayoki c1399360c1 Update indestructible.dm 2025-12-13 09:55:41 -06:00
6838a7b580 Scoop water from water turfs (#93878)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2025-12-03 20:33:32 +01:00
archbtwandGitHub 10ff097c7c Fix click dragging something onto a tile with a decal (pool of oil/blood, etc) (#94200)
## About The Pull Request
Clicking a floor decal (pool of oil, etc) while dragging something will
move it onto it's tile

## Why It's Good For The Game

Oversight 
Decals are cosmetic - Clicking on a decal should Move_Pulled as intended
Some decals (pool of oil) take up nearly the whole tile - makes pulling
onto that tile near improbable/frustrating in practice
2025-12-01 21:59:49 +00:00
BloopandGitHub 9c8a60a0b8 Removes some cargo cult string interpolations (#94210)
## 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
2025-11-30 13:25:45 -06:00
nevimer baf3837ae8 Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29
# Conflicts:
#	_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
#	_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	_maps/map_files/tramstation/tramstation.dmm
#	code/_onclick/hud/new_player.dm
#	code/datums/components/squashable.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/datums/diseases/chronic_illness.dm
#	code/datums/status_effects/buffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/stamcrit.dm
#	code/game/machinery/computer/crew.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/wall_mounted.dm
#	code/game/turfs/closed/indestructible.dm
#	code/modules/admin/view_variables/filterrific.dm
#	code/modules/antagonists/heretic/influences.dm
#	code/modules/cargo/orderconsole.dm
#	code/modules/client/preferences.dm
#	code/modules/events/space_vines/vine_mutations.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/carbon/human/death.dm
#	code/modules/mob/living/carbon/human/species_types/jellypeople.dm
#	code/modules/mob/living/damage_procs.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mob_spawn/mob_spawn.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/projectiles/guns/ballistic/launchers.dm
#	code/modules/projectiles/guns/energy/laser.dm
#	code/modules/reagents/chemistry/machinery/chem_dispenser.dm
#	code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/medicine_reagents.dm
#	code/modules/surgery/healing.dm
#	code/modules/unit_tests/designs.dm
#	icons/mob/inhands/items_lefthand.dmi
#	icons/mob/inhands/items_righthand.dmi
#	tgui/packages/tgui/interfaces/ChemDispenser.tsx
2025-11-29 22:49:21 -05:00
Y0SH1M4S73RandGitHub 6979f2b374 Fixes interactions between shuttles and trapdoors (#93970)
## About The Pull Request

This PR makes several changes to trapdoors to remove wrong interactions
that occur should one be built on a shuttle:
- Trapdoors built on a shuttle will be carried along with the shuttle
when it moves. Even when they are open.
- If a shuttle lands on a trapdoor without breaking it, the trapdoor
will not function while the shuttle's floor lies on top of it.
- Shuttles with open trapdoors inside of them will not magically bring
open space into transit.
- A trapdoor moved on top of a non-openspace tile using a shuttle will
open to the turf that was originally under the shuttle.

## Why It's Good For The Game

Fixes #93924, and also adds a new feature to what is possible with
custom shuttles on multi-z maps.

## Changelog

🆑
add: Trapdoors built inside of a shuttle will move along with the
shuttle.
fix: Open trapdoors will not cause shuttles containing them to bring
open space into transit.
/🆑
2025-11-28 16:15:18 +13:00
Joshua KidderandGitHub 7a3ad79506 All camelCase (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use snake_case. UNDERSCORES RULE! (#94111)
## 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!
/🆑
2025-11-27 15:50:23 -05:00
SyncIt21andGitHub 81427cd5cf Unit tests, refactor & realignment for map loaded wall mounts (#93662)
## 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
/🆑
2025-11-18 22:37:12 -07:00
MrMelbertandGitHub c3b29b8823 Monkeys will avoid glass tables (#93997)
## About The Pull Request

Ai pathing will avoid turfs that have glass tables on them.

## Why It's Good For The Game

Monkeys loooove glass tables

## Changelog

🆑 Melbert
qol: Monkeys will avoid stepping over glass tables
/🆑
2025-11-18 17:24:53 -07:00
SyncIt21andGitHub 7e31936558 Some RHD(Rapid Hand-Held Device) Fixes (#93945) 2025-11-17 23:37:02 -07:00