Skip to content

upstream 01.09.2025#24

Closed
Bruh-24 wants to merge 284 commits into
Alliance-codeBase:masterfrom
Bruh-24:master
Closed

upstream 01.09.2025#24
Bruh-24 wants to merge 284 commits into
Alliance-codeBase:masterfrom
Bruh-24:master

Conversation

@Bruh-24

@Bruh-24 Bruh-24 commented Sep 1, 2025

Copy link
Copy Markdown
Contributor

No description provided.

Needicla and others added 30 commits August 15, 2025 04:21
…(Settler) (#92541)

## About The Pull Request


https://github.com/user-attachments/assets/858081ed-114a-4f34-a925-e6b0250c29e2


Fixes spraycan-painted clothing not appearing painted when worn by
short-height characters (e.g., with the Settler quirk). The item color
filter was being effectively dropped when height displacement filters
were applied to worn overlays.

Implementation: update color_atom_overlay() to apply the atom’s color as
a named filter on the overlay (and recursively on child
overlays/underlays), preserving coloration even when additional filters
(like height) are later added.
## Why It's Good For The Game
Fixes #92536
Fixes a visible inconsistency: painted clothes now look painted on-mob
for short-height characters.
Improves clarity and player feedback; reduces confusion when using spray
cans.
The approach is robust and benefits other cases where overlays receive
filters after coloration.
## Changelog
:cl:
fix: Spraycan-painted clothing now displays correctly when worn by
short-height characters (e.g., Settler); paint no longer disappears on
the mob sprite.
code: Worn overlay coloration now uses named filters and recurses to
child overlays, making it resilient to later filter changes (like height
displacement).
/:cl:
… "1 minute" (#92539)

## About The Pull Request
<img width="397" height="190" alt="image"
src="https://github.com/user-attachments/assets/41e915bc-6d8c-4180-83f1-12380c76554c"
/>

<img width="220" height="112" alt="image"
src="https://github.com/user-attachments/assets/ef3aa542-e6e3-4983-8917-66009d4f843e"
/>

## Why It's Good For The Game
It. is good 👍 

## Changelog

:cl:
spellcheck: shuttles will now say "arriving in 1 minute" instead of "1
minutes"
/:cl:
…or toggling it (#92523)

## About The Pull Request

Don't let un-detachable or un-toggleable equipment be detached or
toggled.

## Changelog

:cl: Melbert
fix: Fixes some potential exploits in mecha ui code
/:cl:
## About The Pull Request

Fixes #92558

Currently `attacked_by` does not differentiate an attack that did 0
damage with an attack that failed (due to blocking or whatnot)

See also: This hack I left in

https://github.com/tgstation/tgstation/blob/ce958c77c006a5fe279fb46fed513206e341cfce/code/_onclick/item_attack.dm#L346-L347

This causes problems because successful attacks can deal 0 damage. See
linked issue.

This PR addresses the issue by having `attacked_by` return `-1`
(`ATTACK_FAILED`) for attacks which entirely do not connect.
-1 was used so consumers can easily check if an attack did 0 damage OR
failed (via checking `<= 0`)

This isn't the preferred fix - I'd prefer if all block checking and zone
targeting was moved to `/item/proc/attack`, but that requires attack
itself be reigned in a bit (cuz it's still a bit of a mess).

## Changelog

:cl: Melbert
fix: Item on-attack effects will trigger as expected when hitting a limb
at damage cap
/:cl:
## About The Pull Request
This change reduces the cost of Unmelting Protection by 300 favor points
and Blazing Star by 500 favor points.
Unmelting Protection: 1000 -> 700
Blazing Star: 2000 -> 1500

Why such a change? Simple, 1000 and 2000 are round numbers without a
deeper thought about favor economy.

By making the Unmelting Protection cost 700 now a Chaplain can try
getting a one PERFECT Burning Sacrifice to cover the cost.
It would require him to get a body with all limbs attached and without a
scratch as any brute dmg means it can't get the most burn damage. (600
burn damage = 600 favor points + 100 extra points)

As for Blazing Star, it would require 2 perfect rituals and few candles
(3).

## Why It's Good For The Game
Favor points balance economy - not simple round number. Chaplain player
can try to achieve better results by preparing bodies before sacrificing
them. For example tend their brute wounds and attach limbs.
Quality over quantity!
## Changelog
:cl:
balance: Reduced cost of Unmelting Protection and Blazing Star
/:cl:
## About The Pull Request
Turns the surface z-level of icebox into a 1x3 area, effectively adding
2 wilderness new z-levels surrounding the station

Because it's not always clear to other people what I'm talking about,
this is what I mean with making the surface level a 3x3 z-level

The wilderness z-levels are gridlinked, instead of crosslinked, which
just means the connections are consistent and not randomized. If you
keep going right, you will always end up where you started again,
eventually. This also removes the black border around the surface icebox
z-level (cause you can just go there now)

**Wilderness levels**
I've added some Z-level templates that can be generated. They're
incredibly basic, but all can spawn runes on them as well.
- Snow planes (5x)
- Ice planes (1x)
- Forest planes (1x)
- Mountain planes (1x)

I've also tweaked surface generation quite a bit. It being completely
covered in bones always felt weird, and the intersparsed rocks and
chasms never sat right with me. The default overworldgen is now more
like the Forested trait, but with more sparse trees.

All of this is modular btw. You can increase the amount of z-levels,
make any space z-level be unrandomized gridlinked or add your own
wilderness z-levels (either to your own map or icebox)

## Why It's Good For The Game
Icebox exploration is kind of depressing. We have this unique setting,
but we can't really go anywhere? You can go down and find that one pool,
which is about the peak of exploration of icebox.

Now you can literally explore the entire round and get incredibly lost!
It's also a great opportunity for mappers! (Especially since the
templates I made were made rather quickly as I wasn't sure if this had
merit).

2 extra z-levels isn't a lot, but it'll let us further develop planetary
wilderness z-levels further without impacting load times that much.
Maybe 3x3 icebox can be real in the future, but for now 1x3 icebox will
have to do
## About The Pull Request
This is a follow up patch for #92508, otherwise than said in coderbus,
calling the cleanup too early can lead to bad assets. We'll now keep
track of the count of assets in generation and only clean up after they
all have passed the generation.
<img width="3067" height="455" alt="grafik"
src="https://github.com/user-attachments/assets/0b65acf3-464f-436c-8a60-84c9472be6cd"
/>
## Why It's Good For The Game
## Changelog
There should be nothing player facing here as the asset job fails
straight up if the cache was cleared too early.
…e condition from brimdemon fang (#92498)

## About The Pull Request

Tin, some more hard dels that were found. Additionally there was a
balloon alert meant to display phrases like "Kapow!" "Bam!" etc but it
is runtiming before it can do so because the mob gets deleted before the
balloon alert gets displayed. (solution for these sorts of issues is to
display the balloon alert on the `loc` instead.

## Why It's Good For The Game

Less chug, and a bugfix.

## Changelog

Probably nothing worth mentioning
## About The Pull Request

Jukebox now has context tips & has a new RMB that allows you to quick
toggle music playing on/off. Also replaces messages to chat with balloon
alerts.

## Why It's Good For The Game

To be honest I'm just clicking random files and making things use
balloon alerts & context tips, I think the more consistent we are w/ it
the better it will be for players.

## Changelog

:cl:
qol: Jukebox now has context tips, balloon alerts over messages to chat,
and can now RMB to quick toggle music from playing.
/:cl:
## About The Pull Request

I found out this admin only mech couldn't move because the 0 it had as
step power consumption ended up as infinity somewhere.
I removed it since there's no real reason why it shouldn't use power for
movement.

## Why It's Good For The Game

Mechs have legs for a reason.
Bumps
[actions/download-artifact](https://github.com/actions/download-artifact)
from 4 to 5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/download-artifact/releases">actions/download-artifact's
releases</a>.</em></p>
<blockquote>
<h2>v5.0.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Update README.md by <a
href="https://github.com/nebuk89"><code>@​nebuk89</code></a> in <a
href="https://redirect.github.com/actions/download-artifact/pull/407">actions/download-artifact#407</a></li>
<li>BREAKING fix: inconsistent path behavior for single artifact
downloads by ID by <a
href="https://github.com/GrantBirki"><code>@​GrantBirki</code></a> in <a
href="https://redirect.github.com/actions/download-artifact/pull/416">actions/download-artifact#416</a></li>
</ul>
<h2>v5.0.0</h2>
<h3>🚨 Breaking Change</h3>
<p>This release fixes an inconsistency in path behavior for single
artifact downloads by ID. <strong>If you're downloading single artifacts
by ID, the output path may change.</strong></p>
<h4>What Changed</h4>
<p>Previously, <strong>single artifact downloads</strong> behaved
differently depending on how you specified the artifact:</p>
<ul>
<li><strong>By name</strong>: <code>name: my-artifact</code> → extracted
to <code>path/</code> (direct)</li>
<li><strong>By ID</strong>: <code>artifact-ids: 12345</code> → extracted
to <code>path/my-artifact/</code> (nested)</li>
</ul>
<p>Now both methods are consistent:</p>
<ul>
<li><strong>By name</strong>: <code>name: my-artifact</code> → extracted
to <code>path/</code> (unchanged)</li>
<li><strong>By ID</strong>: <code>artifact-ids: 12345</code> → extracted
to <code>path/</code> (fixed - now direct)</li>
</ul>
<h4>Migration Guide</h4>
<h5>✅ No Action Needed If:</h5>
<ul>
<li>You download artifacts by <strong>name</strong></li>
<li>You download <strong>multiple</strong> artifacts by ID</li>
<li>You already use <code>merge-multiple: true</code> as a
workaround</li>
</ul>
<h5>⚠️ Action Required If:</h5>
<p>You download <strong>single artifacts by ID</strong> and your
workflows expect the nested directory structure.</p>
<p><strong>Before v5 (nested structure):</strong></p>
<pre lang="yaml"><code>- uses: actions/download-artifact@v4
  with:
    artifact-ids: 12345
    path: dist
# Files were in: dist/my-artifact/
</code></pre>
<blockquote>
<p>Where <code>my-artifact</code> is the name of the artifact you
previously uploaded</p>
</blockquote>
<p><strong>To maintain old behavior (if needed):</strong></p>
<pre lang="yaml"><code>&lt;/tr&gt;&lt;/table&gt; 
</code></pre>
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/actions/download-artifact/commit/634f93cb2916e3fdff6788551b99b062d0335ce0"><code>634f93c</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/download-artifact/issues/416">#416</a>
from actions/single-artifact-id-download-path</li>
<li><a
href="https://github.com/actions/download-artifact/commit/b19ff4302770b82aa4694b63703b547756dacce6"><code>b19ff43</code></a>
refactor: resolve download path correctly in artifact download tests
(mainly ...</li>
<li><a
href="https://github.com/actions/download-artifact/commit/e262cbee4ab8c473c61c59a81ad8e9dc760e90db"><code>e262cbe</code></a>
bundle dist</li>
<li><a
href="https://github.com/actions/download-artifact/commit/bff23f9308ceb2f06d673043ea6311519be6a87b"><code>bff23f9</code></a>
update docs</li>
<li><a
href="https://github.com/actions/download-artifact/commit/fff8c148a8fdd56aa81fcb019f0b5f6c65700c4d"><code>fff8c14</code></a>
fix download path logic when downloading a single artifact by id</li>
<li><a
href="https://github.com/actions/download-artifact/commit/448e3f862ab3ef47aa50ff917776823c9946035b"><code>448e3f8</code></a>
Merge pull request <a
href="https://redirect.github.com/actions/download-artifact/issues/407">#407</a>
from actions/nebuk89-patch-1</li>
<li><a
href="https://github.com/actions/download-artifact/commit/47225c44b359a5155efdbbbc352041b3e249fb1b"><code>47225c4</code></a>
Update README.md</li>
<li>See full diff in <a
href="https://github.com/actions/download-artifact/compare/v4...v5">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/download-artifact&package-manager=github_actions&previous-version=4&new-version=5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…sync (#92553)

## About The Pull Request

Followup to tgstation/tgstation#92504

Removes the conditional that was stopping the labeler from checking the
PR body for labels on sync.

<details><summary>No more of this weirdness</summary>

<img width="877" height="488" alt="firefox_zppJmK5qz2"
src="https://github.com/user-attachments/assets/74a556b5-a3e3-40e7-93dd-e18c62ed9649"
/>

</details>

Any time someone updates a PR and it syncs, you can potentially lose
some of the PR labels from the body (the changelog specifically) if they
are not configured as `add_only` in the autoLabelConfig.js

I had kept it in previously since it was how it was before, but thinking
on it I do not think this is even necessary anymore now that the php
webhook method is replaced with the action. Let's remove it!

## Why It's Good For The Game

QoL for maintainers and contributors

## Changelog

Nothing player-facing
ough
## About The Pull Request
diode disk fucky mc wucky
## Why It's Good For The Game
bugg
## Changelog
:cl:
fix: Diode Disks are no longer improperly /improper.
/:cl:
… suit storage able to hold any "tiny" item (#92406)
…r ability to use them. (#92598)

## About The Pull Request

So I was notified MODlinks break after you use them, sometimes! 
Looking into it, seems the culprit code was this:

https://github.com/tgstation/tgstation/blob/138a670347eee4127d4713cbf11b3d8f0642cbe1/code/modules/mod/mod_link.dm#L461-L467
Specifically, MODlinks use `TRAIT_IN_CALL` to check whether the given
user is already in a call to block them from opening new calls even with
other MODlink devices.
However, as seen above, the call datum actually gets the *current* user
when cleaning up after itself, which if the call was ended by for
example taking off a scryer... returns null, and thus doesn't remove the
trait, and bars you from making new calls forever.
A similar issue exists when deleting the visuals! Where it fails to
unregister its signals on the user for the same reason.

We fix this by tracking our current calling user in a weakref, and
use/forward it where necessary.
We also move more of the behaviour away from the call itself, and
instead tell the MODlinks we've entered or exited a call.

I feel this entire system should really be refactored, but due to how
many hooks it needs and different ways to interact with it I'm not 100%
certain on the best way to do it. So, well, posting this fix instead of
letting it sit for the indeterminate amount of time needed for me to
work that out.
## Why It's Good For The Game

It's good if the things are actually functional.
## Changelog
:cl:
fix: Ending a MODlink call in any non-standard way no longer bricks your
ability to use MODlinks.
fix: Ending a MODlink call in any non-standard way and then giving the
item to someone else to call with no longer moves the visuals based on
the first person to try to use the item.
/:cl:
## About The Pull Request

the family heirloom quirk runs `get_all_contents` on the quirk holder
every process. which is kinda dumb and wasteful when we are looking to
see if the quirk holder has an item _that we already have a reference
to_... `/atom/proc/contains` exists and works just fine for this.

## Why It's Good For The Game

`get_all_contents` is very wasteful and unneeded for this use-case

## Changelog

no user-facing changes
…s (#92585)

## About The Pull Request



https://github.com/user-attachments/assets/074a0959-5dce-40ef-8eb5-d2ad86117d83



Fixes an old bug where abductor agent disguises were revealed after
moving between z-levels. While stealth is active, the vest now listens
for z-level changes and reasserts the disguise overlays on the next
tick; it unregisters this listener when stealth is deactivated.
## Why It's Good For The Game

Fixes #92555
Prevents unintended reveal of abductors during multi-Z movement
## Changelog
:cl:
fix: Abductor agent disguises no longer break when moving between
z-levels.
/:cl:
tgstation-ci Bot and others added 19 commits August 31, 2025 16:28
## About The Pull Request
Adds portable wind turbines that can be put in your back slot or
anchored to the ground. They accept a cell-powered item and charge it
while you walk, or when space wind passes over them. Can be purchased
for 400 credits or crafted with 3 kitchen knives, plastic, and servos.
Requires a capacitor to charge things, and higher tiers charge faster,
faster walkspeed also charges faster.

<img width="592" height="644" alt="im222age"
src="https://github.com/user-attachments/assets/e9997536-5ee0-4417-a31c-cb58666d4d07"
/>


https://github.com/user-attachments/assets/1cf7fce5-d385-4e3e-be97-fb15e253c308

## Why It's Good For The Game
Sometimes you don't have a cell charger. And you need to charge
something. Now you can charge something by running laps around the
station.
During a blob, rechargers are brought to the front lines to charge
energy guns and such but what if the blob turns off the power? And what
are bar-rp'ers to do? Kill two birds with one stone by having them run
laps instead of sitting around doing nothing.
Also its funny.

## Changelog

:cl:
add: Added a portable wind turbine which can charge things when you walk
around
add: Added a signal that procs when an object resists space wind (from
being anchored / pulled)
sound: added woosh.ogg as a low "wooshing" noise
image: added a wind turbine sprite
/:cl:

---------

Co-authored-by: tattle <66640614+dragomagol@users.noreply.github.com>
## About The Pull Request

Alternative to 3️⃣(#92591), which has been fatally shot.

Makes it so that His Grace can be turned into Her Grace via a
xenobiology gender-change potion. Her Grace turns the souls of the
consumed into confetti, creating a nice party atmosphere.

Also adds pronoun helpers for /atom/s, as they weren't there before.

## Why It's Good For The Game

I thought this was a good idea
<img width="934" height="153" alt="image"
src="https://github.com/user-attachments/assets/aff7abe0-86b6-47e1-a8e6-2c233544e9aa"
/>

It's a silly little variation, and it's purely voluntary. Couldn't hurt.

## Changelog
:cl:
add: His Grace will now drink gender-change potions
/:cl:

---------

Co-authored-by: Thunder12345 <Thunder12345@users.noreply.github.com>
…anel (#92813)

## About The Pull Request

Adds a new bind `AltShiftClickOn` for explicitly opening the TGUI loot
panel at some tile without raising any signals or calling into an
override-able proc. This bind is in addition to the already existing
alt-click and it is not intended to replace it.

This is similar to [this
pr](tgstation/tgstation#92307) but does not
replace the old bind nor add any features beyond the bind opening the
loot panel.

## Why It's Good For The Game

Originally I started looking into this because it was very obnoxious
that I was able to interact with pipes placed in walls, but not pipes
placed underneath windows. I had thought the issue was because the
window overlapped the pipe and was unable to open the loot panel to get
at it because the window handles alt-clicks through the
`simple_rotation` component's signal handler. Unfortunately the pipe is
still obscured by the window, so this does not fix that.

However I still see this as useful as it allows opening the very nice
and wonderful loot panel on a pile of items which may or may not handle
the alt click signal without needing to hunt for a pixel of the tile (or
of an item you _think_ may not handle it) to do so.

## Changelog

:cl:
qol: shift+alt will open the tgui loot panel on any tile without being
intercepted by items that may be on the tile
code: adds a shift+alt click on proc for living mobs to explicitly open
the tgui loot panel in addition to the already existing alt bind
/:cl:
## About The Pull Request
This fixes several bitfield operations that were missing parenthesis
encapsulation. I noticed this problem in:
- #92601

And decided to use regex to search for similar patterns which I came
across in:
- Move loops bypassing the `MOVELOOP_STATUS_RUNNING` status
- Elastic arms mutation bypassing `ABSTRACT` object flags for picking up
objects
- Species radiation bypassing `HEAD_HAIR` hairstyle flags for balding
- Damaged APC board status bypassing `EMAGGED` and `BROKEN` status for
screentips
- Shuttle cleanup code bypassing `MOVE_CONTENTS` for moving old turfs
- Tram crossing signals bypassing `NORTH` and `EAST` direction checks

## Why It's Good For The Game
Code behaves as intended.
## About The Pull Request

Adds config to github readme

## Why It's Good For The Game

Im lazy, its easy accessible from the tgstation github itself and
removes some unneccesary hyperlinks (including the link itself aswell)

## Changelog
## About The Pull Request

If a migo somehow (adminbus, ahem ahem) gets 100% dodge chance, it will
create an infinite move recursion and crash the server. Or if we just
get incredibly unlucky with a low health migo, as each failed dodge has
a 75% chance to result in another dodge (due to calling move twice),
even more so with diagonal movement.

Happened twice already, if you're wondering.

## Changelog
:cl:
fix: Fixed a potential server crash caused by Mi-Gos
/:cl:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.