Commit Graph

5652 Commits

Author SHA1 Message Date
shayoki f17515f75d Update statpanel.dm 2026-06-03 17:10:08 -05:00
shayoki a3e7973adf soft statpanel revert 2026-06-03 17:03:58 -05:00
shayoki 7b6e5356b9 Update statpanel.dm 2026-06-03 16:11:11 -05:00
shayoki f601a6ddaf Merge remote-tracking branch 'tgstation/master' into upstream-6-2-2026 2026-06-03 01:23:54 -05:00
MrMelbert 6b631cb2c2 Roundstart nuke ops now spawn on an elevator to wait while the base loads in (#96178) 2026-06-02 20:59:42 +10:00
mcbalaam 052b3a654d feat: Vote panel UI cleanup; auto-close fix (#96166) 2026-05-27 20:42:04 -04:00
John Willard ad450f76e8 Re-attempt at vv editing lobby music (#96093)
## About The Pull Request

Previous attempt was in
https://github.com/tgstation/tgstation/pull/95870 but I got 0 feedback
and it just staled and closed.
Instead of adding it as a secret button I am simply making it so vv
editing the ticker's lobby music will properly update it for everyone.

## Why It's Good For The Game

QoL for admins.

## Changelog

🆑
admin: Changing lobby music now updates for people in the lobby.
/🆑
2026-05-20 19:13:42 +02:00
MrGloopy 7303e7777c remove mutual exclusivity of Common second language and Bilingual because i wanted multiple languages once (#5582)
## About The Pull Request
Simply removes the mutual exclusivity of CSL and Bilingual quirks, since
you can have the other language quirk with CSL but not Bilingual.

## Why It's Good For The Game
If you can have the other language quirk with CSL, why not Bilingual?

## Proof Of Testing
if it compiles it works, submitting via vscode
<img width="525" height="447" alt="image"
src="https://github.com/user-attachments/assets/aaf562a6-3ee5-433e-bbed-924196441bb5"
/>

<details>
<summary>Screenshots/Videos</summary>

</details>

## Changelog

🆑
balance: Removed mutual exclusivity of Common Second Language and
Bilingual quirks.
/🆑
2026-05-16 01:04:56 +02:00
Alexis 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
John Willard e698a66f5e Fixes a merge conflict that broke stat panel (#96071)
## About The Pull Request

Fixes a merge conflict between 2 of my stat panel PRs that caused the
'Toggle Stat Panel' button to not work.
Also converts more skin stuff to defines that I missed in the last PR.

## Why It's Good For The Game

Button works wahoo!

## Changelog

🆑
fix: Stat panel's "Toggle Stat Panel" button now works.
/🆑
2026-05-14 22:35:12 -07:00
Jinshee 45a5980443 Tele-Port: Ports Telepathy changes from NovaSector (#5531)
## About The Pull Request

This ports changes from
https://github.com/NovaSector/NovaSector/pull/6016 and
https://github.com/NovaSector/NovaSector/pull/6398.

- The quirk no longer automatically applies the Genetics power to the
quirk user. Prior to this PR, communication was mostly anonymized and
only _not_ so when one possessed the gene. This presented a clear
downgrade for individuals who had the genetic variant over the quirk
variant. With this PR, communication through the quirk is not anonymous,
but adding the gene on top of the quirk will allow a user to upgrade it
into being anonymous.
- Every time someone uses the quirk everyone else (in sight) will see
where their attention is sent. This does not add a visual cue besides
the warning in the chat, so it's still somewhat discrete.
- Added a new quirk, Psionic Dampener. This blocks most forms of
telepathic communication.
- Telepathy was made multiline for readability.

## Why It's Good For The Game

Currently, Telepathy as a quirk has a discrepancy where non-synths
receive the mutation Telepathy, while synths receive a different
version. The mechanical differences of these created a problem where,
depending on who was using it, this either did or did not anonymize the
identity of the caster. Additionally, these changes allow the quirk
holder who seeks the genetic variant in-round to properly receive the
benefits of such.

Other changes allow people to opt-out of receiving telepathic messages,
in order to avoid negative interactions from those who abuse it.

Multiline telepathy is a desirable feature for the sake of proof
reading.

## Proof Of Testing

<img width="654" height="279" alt="image"
src="https://github.com/user-attachments/assets/056f4d52-5365-4b5f-a422-40791c5e568d"
/>


## Changelog

🆑
add: Added a new quirk Psionic Dampener, affecting telepathy from
quirks, genetics, slimes, xenomorphs, revenants and so on.
balance: Telepathy (Quirk) no longer automatically gives the gene.
qol: The telepathic communication power granted by the quirk or the
genetic power is only anonymous if the caster has the mutation, not the
target.
qol: Telepathy (Quirk) now shows when the user uses the power and on
whom, but not the contents of the message.
qol: Telepathy is now multiline.
/🆑
2026-05-14 03:07:32 +02:00
CabinetOnFire af8f69da13 Adds "Event Logging", or EVLogging, A new debug system that allows us to track individual datums and log events on a timeline (#96035)
## About The Pull Request

This Pull Request adds a new logging system that uses a timeline to
track and visualize important events for specific datums.

This is done via a new window in which you can select a datum for
tracking, which adds it to the timeline. If this datum implements the
EVLOGGING macros, it can track important events onto this timeline. As
an example, we can log whenever an AI is deciding to make a new path, if
it decides to generate a new decisionmaking plan, it finishes an action,
or it decides to target someone/something.

We can select these events to see more information, and optionally get a
snapshot of important variables at the time this event was logged (like
the blackboard and current plan for AI controllers).

You can also filter out specific events / track info, which is done via
categories. Each event / piece of track info is given a category and if
you disable a category all events / track info in that category is
hidden. This lets you filter out things you might not care about.

<img width="2346" height="1209" alt="image"
src="https://github.com/user-attachments/assets/0763077c-e349-4c7c-b017-23d29e1d089b"
/>

_whoever thinks we didnt need advanced cleanbot logging is a noob_


In the video below I showcase how this works;
https://file.house/7nsOiqdvmSTxlsk3fs-e8g==.mp4
A cleanbot is roaming the halls, I turn on the event logger, click the
"pick target" button and click on the datum I'd like to track (the
cleanbot). This results in the cleanbot now tracking its events. I spawn
some dirt and the cleanbot decides to clean it, and I go through the
events; You can see theres different events being listed, such as when
the cleanbot starts targetting the dirt, when it cleans plan, when it
makes it JPS path and every time it moves over it.


The macros I've currently implemented are as follows:

**EVLOG_TEXT(DATUM, CATEGORY, INFO)**
Only adds text to the event logger window, no world-visuals

EVLOG_LOCATION(DATUM, CATEGORY, INFO, TURF) 
Adds text to the event logger and adds an image to where that turf is.

EVLOG_TURFS(DATUM, CATEGORY, INFO, TURFS)
Adds text to the event logger and adds an image to each turf in the
TURFS list

EVLOG_LINES(DATUM, CATEGORY, INFO, TURF_A, TURF_B)
Adds text to the event logger and adds a line from turf_a to turf_B

EVLOG_PATH(DATUM, CATEGORY, INFO, TURFS)
Adds text to the event logger and visualizes a path from A to B (same
way as the pathfinding debugger, of which I moved the visualization
before to SSPathfinder)

In terms of performance, the logger is a singleton, and events are ONLY
logged if
1. The logger is running
2. The datum has the DF_EVLOGGING flag.

This means most of the time, logging an event is a single var lookup
(Since the runner is off by default). The DF_EVLOGGING flag is off by
default as well and has to be enabled by the event logger, or set
temporarily by a dev in code.

This system can easily be extended with more event types / visualization
types as well. (I'm thinking of datumizing the ones I have now)

The TGUI is still a bit of a mess, I would love some pointers because
I'm not really good at react so I just kind of hit it with a hammer
until it did what I wanted 😎

Also, all of this is based on VisLogging from Unreal Engine, so it will
have some likeness https://unreal-garden.com/tutorials/visual-logger/

## Why It's Good For The Game

This system allows us to debug more complex systems (like basic AI) in
an understandable and clear way. While the implementation cases are not
super common right now, extending this system could make debugging these
systems much more comprehensible, and hopefully lets more developers
help us with improving these systems. (plus, we LOVE timelines)

## Changelog

🆑 CabinetOnFire
refactor: Implements "Event Logging" an improved way for programmers to
debug specific datums.
/🆑

---------

Co-authored-by: Lucy <lucy@absolucy.moe>
2026-05-13 12:37:56 +00:00
Arturlang d67ca75e37 kills cargo imports (#5491)
## About The Pull Request
kills cargo imports with no mercy, moves it into goodies with
newly-added subcategories
also adds a persi only agent ID single pack per request
also also tarkon and persi can buy private packs via id money
## Why It's Good For The Game
ugly UI that doesn't work for other factions and needs hacks to work
with cargo ui is not great

## Proof Of Testing


<summary>Screenshots/Videos</summary>
<img width="1268" height="1124" alt="image"
src="https://github.com/user-attachments/assets/fd3d9a58-ea0b-4242-88d2-b6123a214c72"
/>

## Changelog

🆑
add: cargo imports moved into it's own category with a brand subcategory
system, and orderable without a private account (god why did i do this)
add: persistence only agent ID single pack
add: persistence and tarkon can now buy stuff via ids directly
add: captain access can always unlock departmental orders
fix: persistence and persistence cargo consoles sending cargo pods to
the station if cargo bay is selected
del: entire cargo company imports system
/🆑
2026-05-12 17:20:32 -07:00
LemonInTheDark 2dfbf0b81a Adds a unit test that makes sure subsystem flags make sense (#96022)
## About The Pull Request

There's a few of these that conflict, mostly relating to timing. This
conflicting won't actually break anything but it does muddy "what is
this doing" somewhat and it's good to be clear so here we go

## Why It's Good For The Game

Makes the MC very slightly harder to confuse yourself with
2026-05-11 11:20:24 -04:00
Bloop 1fcc2cafc7 Makes disable dead keyloop lagswitch measure smarter (#95976)
## About The Pull Request

As it is now, you enable it once, and all the current observers and dead
mobs are removed from the keyloop list.

New ghosts and observers are unaffected entirely.
But the worst part is you can get mobs reviving into their corpses and
being unable to move, requiring admin intervention.

This should fix all these issues. We have procs that always get called
when mobs die or are created, let's just hook into those?

## Why It's Good For The Game

Less admin intervention required for a tool that shouldn't require any

## Changelog

🆑
fix: disable dead keyloop lagswitch measure now properly affects new
ghosts, and fixes an issue where people can revive and still be frozen
/🆑
2026-05-11 15:05:32 +02:00
John Willard 067d8f9680 Reorganizing the non-game UI (#95383) 2026-05-09 15:06:03 +03:00
SmArtKar 119c1e9ccc Adds a priority targeting framework, and priority targeting to mining mobs (#95720)
## About The Pull Request

Introduces a new targeting priority strategy system for basicmob AIs,
which allows controllers to decide which mob to prioritize over others.

Mining mobs will now focus on the NODE drone unless hit, and will pursue
the attacker for 25 seconds before dropping the aggro. They also get
increased aggro if you've attacked other mobs in their view recently,
and after a few hits will have enough aggro to swap to you from the NODE
drone. Ashwalkers get a reduction in aggro because they live there.
Legion broods and brimdemons will immediately target anyone who attacks
their allies rather than waiting for multiple hits. Broods also now
inherit their parent's targets and retaliation/reinforcements lists.


https://github.com/user-attachments/assets/6baaba8a-8b3c-4b2f-ae8b-842f0b1f2b6d

#### This is a bounty for ArcaneMusic

## Why It's Good For The Game

Makes vent defense mob behavior more predictable and easier for players
to manipulate, allowing them to draw aggro from the NODE drone should
make vents more engaging and less of an AI rng fest

## Changelog
🆑
add: Mining mobs now use priority when choosing their target,
prioritizing NODE drones over miners who haven't attacked them or their
allies
/🆑
2026-05-08 20:40:01 +01:00
MrGloopy 8795043656 Adds Super Depression because I got slipped once (Removes mutual exclusivity of Depression and Hypersensitivity quirks) (#5537)
## About The Pull Request
Removes mutual exclusivity of Hypersensitive and Depressed. Woe.

This is technically a SPLURT port but like
it's two lines and a commented out line so uh
yeah
## Why It's Good For The Game
### _**ULTRADEPRESSION UPON YE**_

(There's no reason these quirks should be mutually exclusive. They
compound against one another, making the other worse. If you want to
have super depression, you should be able to)
## Proof Of Testing
<img width="582" height="288" alt="image"
src="https://github.com/user-attachments/assets/0549b2ee-cef3-4048-81df-2bc33923bd03"
/>
<details>
<summary>Screenshots/Videos</summary>

</details>

## Changelog
🆑
balance: Removes mutual exclusivity of "Depressed" and "Hypersensitive"
quirks.
/🆑
2026-05-08 07:34:28 +02:00
Bloop faaa1f1516 Ghosts now have (better) runechat (#95843)
## About The Pull Request

Ports our optimizations to the version of ghost runechat introduced by
https://github.com/tgstation/tgstation/pull/95223

Instead of looping through all the mobs a second time it will do it in
deadchat_broadcast(). Also adds a global for if drunechat is
enabled/disabled and an admin verb for toggling it on or off.

<details><summary>still works</summary>

<img width="330" height="220" alt="dreamseeker_kkNBPBjbMv"
src="https://github.com/user-attachments/assets/4706ad98-fafe-4f88-9de0-6b72983ab044"
/>

</details>

## Why It's Good For The Game

Better option for performance

## Changelog

🆑
code: speeds ghost runechat up a bit, and makes it show as italic
admin: adds a 'toggle dead runechat' admin verb in case you need to
disable it midround for an event or something
/🆑
2026-05-05 14:54:04 -04:00
Bloop e6e0200edb Makes quirk points configs get loaded into vars on the subsystem, + a small biome fix (#95941) 2026-05-03 20:23:12 +02:00
Roxy e9e9a97ccb Revert "Adds a quirk thats let you not have character mood" (#5501)
Reverts Bubberstation/Bubberstation#5486

As it turns out, there are far more mood interactions than initially
thought and it is in fact breaking things.

As well as tg adding more and more meaningful interactions for mood it's
not a good idea to keep this right now.
2026-04-28 16:16:29 -04:00
levels0 d2f84512b5 [No GBP] Actually fix random recipes for real (#95895)
## About The Pull Request
Just the fix parts from #95892
Fixes #95876
## Why It's Good For The Game
## Changelog
🆑
fix: metalgen and secret sauce should now generate properly
/🆑

---------

Co-authored-by: l0 <-->
2026-04-27 18:23:15 +02:00
John Willard aa4dc56835 Removes Station-time (more time changes) (#95744)
## About The Pull Request

Removes Station-Time entirely
Server Time is now NST (Nanotrasen Standard Time). SS13 takes place
exactly 540 years in the future of the current day, so every second is 1
second in-game.
Round Time is now PT (Pay-Time), how Nanotrasen keeps track of how long
the current rotation of Employees has been working for.

Telecomms uses NST due to its importance of being the communication to
the blackbox.

Autopsy report, clocks, scientific reports and requisitions use both
timestamps due to them being more official documents that NT may need to
know beyond just the current round (just for flavortext).

Pretty much everything else (Det scanner, PDA, IC logs, Time-of-Death,
AI law changes, Cyborg file downloading) uses PT

PT
<img width="305" height="217" alt="image"
src="https://github.com/user-attachments/assets/cef73025-6292-4f9c-8565-197397bda2ca"
/>
<img width="168" height="59" alt="image"
src="https://github.com/user-attachments/assets/a99db568-045d-45fc-8206-0d9a7b13c7d2"
/>
<img width="308" height="122" alt="image"
src="https://github.com/user-attachments/assets/37ca6f17-8916-4af2-9c91-0f0707038ca5"
/>



https://github.com/user-attachments/assets/29445051-c98b-4af3-a657-812083aab91a


Clock (Literate)
<img width="748" height="292" alt="image"
src="https://github.com/user-attachments/assets/c824e812-91b5-4737-858d-768336e9a7c4"
/>

Clock (Illiterate)
<img width="446" height="94" alt="image"
src="https://github.com/user-attachments/assets/90d5ea0d-eaff-4ced-aa31-ffdf0b4832a5"
/>

New paperwork time working properly

<img width="311" height="190" alt="image"
src="https://github.com/user-attachments/assets/6d048926-db61-4c91-893b-ce93e1ea7775"
/>

NST
<img width="800" height="115" alt="image"
src="https://github.com/user-attachments/assets/35ffde49-13c1-4ce7-ab24-858e48b608bd"
/>
<img width="1288" height="142" alt="image"
src="https://github.com/user-attachments/assets/40c30d16-e0de-4efc-b460-9486eeb901d6"
/>

# Other changes

1. Circuit time checker will now get the value of the given input (Hour,
Minute, Second) rather than the full dedisecond time converted into
hour/minutes/seconds

<img width="270" height="67" alt="image"
src="https://github.com/user-attachments/assets/097440cc-1c45-447f-9976-18de7f9c722c"
/>

2. Turns nightshift into a round event that'll last approximately 22
minutes
3. 12-hour pref (doesn't apply to the stat panel because it's global
info) & removal of "TCT" time

<img width="569" height="440" alt="image"
src="https://github.com/user-attachments/assets/d39083b1-d248-41c0-9a1c-b2398ca203a7"
/>

4. The chocolate pudding negative moodlet is now based on the server's
IRL time.
5. Admins can now use ``class``, ``style`` and ``background`` (they were
already given perms to use ``img`` so hiding background, which was
removed to prevent image embedding, is pointless)
6. Also fixes ``year`` being off on localhost.


## Why It's Good For The Game

Server Time is approximately 1s = 12s converted, not including it
desyncing from lag (I believe?).
This makes it pretty much impossible for people to actually use this as
a unit of measurement for in-game actions.
Different things also uses different timestamps which is a bit more
confusing.

The main change here is for accessibility and, hopefully, using time as
a source of immersion. "20 minutes ago" is no longer OOC, they're just
speaking in PT. There's no timezones in space, Nanotrasen Standard Time
is the closest there is, but Pay Time is how NT considers when you get
your paychecks, so it's what is more commonly used.

It also fixes major inconsistencies between "IC time" and "Station
time", things like breakfast moodlet was the first 15mins of the round
despite the round starting like 7 hours in? Nukies with an L6 SAW firing
down the halls was shooting like 1 bullet every 3 seconds (assuming 4
bullets per second), overall there was just a disconnect between how
long time actually is in the universe.

The secondary reason for this change (though it is what pushed me to
actually get around to making this change) is the greater stat-panel
removal. This hopes to lessen the dependence on the stat panel for
station-time by making it easier to understand, and the end-goal I have
is for this information to be limited to Admins & the AI (AI will get
the IC version with the accurate year), so until that happens I would
like to improve the use of station-time by making it consistent (for
example, you should only care for PT for IC, which is also what your PDA
displays), so that when it gets removed it won't leave players timeless.

If you haven't already, and is interested in helping remove the stat
panel, every entry that needs to be removed can be found here -
https://hackmd.io/443_dE5lRWeEAp9bjGcKYw?view

Closes https://github.com/tgstation/tgstation/issues/94988

## Changelog

🆑
del: Removed Station Time, now we use NST (Nanotrasen Standard Time),
which is IRL server time +540 years, and PT (Pay Time), the amount of
time since the round has started.
del: Station nightshift is now a Station event rather than being based
on Server time.
balance: Time circuit's Unit of Measure now tells the amount of time in
hour/minute/seconds rather than giving the whole time translated to
hours/minutes/seconds.
qol: Added a 12-hour clock pref for people who prefer it.
qol: Hovering over NST timestamps on official documents will now
translate how much it is in PT/Shift Time.
admin: Admins can now use style/class/background in their papercode.
/🆑

---------

Co-authored-by: Isratosh <Isratosh@hotmail.com>
2026-04-25 14:13:31 -06:00
explosivekitty f472588418 Adds a quirk thats let you not have character mood (#5486)
## About The Pull Request
Adds a free quirk that locks you out of other mood quirks, hides judging
mood face from your screen and moves hunger meter to where mood face
was. All of the negative and positive bonuses are disabled with this
quirk and mood slow down will be replaced with slow down if you are
hungry
## Why It's Good For The Game
I'm huge hater of this feature since the day i started playing this game
and i absolutely despise seeing the mood face on my screen and with this
quirk you will no longer have to worry about some arbitrary mood meter
saying how your character feels like, you can roleplay how you are
feeling like and do whatever you please. and no this is not turbo
broken, the positive mood you can have has way more mechanic value than
having mood always set to neutral so you are locking yourself out of the
positives and negatives
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
<img width="232" height="281" alt="quirk equipped"
src="https://github.com/user-attachments/assets/97108596-4135-411e-86dd-a2fe9d1d864d"
/>


<img width="162" height="276" alt="hungry"
src="https://github.com/user-attachments/assets/a3569085-3581-49b0-8483-807d70203bb4"
/>



<img width="539" height="122" alt="quirk selection"
src="https://github.com/user-attachments/assets/30043354-e36a-4756-80a1-75c87d350907"
/>

</details>

## Changelog
🆑
add: Added new quirk that lets you disable and hide your mood from your
hud
/🆑

---------

Co-authored-by: Copilot <copilot@github.com>
2026-04-25 08:35:45 -04:00
Ghom 5110eef308 Express consoles have crab rockets once again... (#95817)
## About The Pull Request
Alternative to https://github.com/tgstation/tgstation/pull/95658 that
involves fewer lines rather than more.

## Why It's Good For The Game
Makes it possible to order crab rockets on the express console without
copypasta. I'm not sure if express consoles are supposed to be usable
for special/emag orders (there was a check against that in the code for
some reason), but because they've had the exact same options of a
standard cargo delivery console for such a long time and because I
haven't found any explicit reason for that to not be the case (in lieu
of that, I found a bit of a reference to homoerotic material in the code
comments), I guess it's fine and nothing bad will happen.

## Changelog

🆑
fix: Packs exclusive to the express console (crab rockets for example)
can now be ordered from express consoles.
/🆑
2026-04-23 09:39:26 +12:00
Tsar-Salat bb357ce892 Fix tattoo persistence version (#95839)
## About The Pull Request

Hi, strange thing with tattoos.


https://github.com/tgstation/tgstation/blob/55366497a3f156f5553a6446edf4c0b0cbba6716/code/controllers/subsystem/persistence/tattoos.dm#L25-L42

The tattoo persistence version seems to be setting based on engravings'
persistence version, ``ENGRAVING_PERSISTENCE_VERSION``

Yet, in ``load_prisoner_tattoos()``, the conditional checks the value of
TATTOO_PERSISTENCE_VERSION

https://github.com/tgstation/tgstation/blob/55366497a3f156f5553a6446edf4c0b0cbba6716/code/controllers/subsystem/persistence/tattoos.dm#L10-L11

This PR just replaces the engraving version being set with the tattoo
version being set.
## Why It's Good For The Game

This seems rather blatantly incorrect. 
The TATTOO_PERSISTENCE_VERSION has no setter for its value other than
when defined.

Realistically? This does nothing. They are both 0 lol.
2026-04-23 08:58:49 +12:00
Lucy 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
SmArtKar 2680aafa3f [MDB IGNORE] Lavaland Mineral Rework: Yapmining 2026 (#95682) 2026-04-20 10:52:59 -04:00
mrmanlikesbt 928df286a6 Kills /datum/asset/var/_abstract, uses abstract_type instead (#95756)
## About The Pull Request

It's all in the title

## Why It's Good For The Game

Forgotten in #92909

## Changelog

no player facing changes
2026-04-13 17:20:12 -04:00
Tim d2e5e35d68 Keen Nose Quirk - The Smell of Discovery (#95697)
## About The Pull Request
This adds a new positive quirk called "**Keen Nose**" that costs 3
points.

It lets you examine any open container with reagents to smell them. It
generates the smell based on the taste description. Also added an effect
to pepper spray, where it causes you to lose your sense of smell
temporarily.

This quirk is blacklisted against the Anosmia quirk, which is the
opposite. (no sense of smell)

## Why It's Good For The Game
Since there is a serious lack of positive quirks, I figured this one
might be useful as a utility quirk. It's a niche thing that could come
in handy. Keep in mind, there are several ways to identify chemicals,
like using the bartender's beer goggles, the science goggles, a chem
machine, or just eyeballing the color. Also, many chems have overlapping
taste descriptions (several different things taste like "death") so it's
not foolproof.
2026-04-13 13:03:26 -05:00
Tim 2e35b8bc13 Fix admin shuttle recall revealing admin location (#95733)
## About The Pull Request
- Fixes #95441

Using the admin shuttle recall command no longer reveals the admins
location.

## Why It's Good For The Game
Less bugs.
2026-04-13 12:40:40 -05:00
Leland Kemble 41ce7bf46c fixes second-choice headrevs having their preferences ignored (#95751)
## About The Pull Request

Second-choice headrevs after a first choice became indisposed did not
check client preferences.
Also, moves `ROLE_HEAD_REV` define into roundstart section of defines
because it is a roundstart ruleset

## Why It's Good For The Game

fixes #95742
2026-04-13 12:37:10 -05:00
Lucy 79e7aa569e fixes up some math defines to use byond builtins instead of workarounds (#95652)
## About The Pull Request

this translates some various
- `FLOOR(x, 1)` -> `floor(x)`
- `CEILING(x, 1)` -> `ceil(x)`
- `SIGN(x)` define is gone, just uses the native BYOND `sign()` now.

Also, the `MODULUS` define is just a wrapper for the [BYOND `%%`
operator](https://ref.harry.live/operator/modulomodulo) now.

would be nice if someone double checked to make sure there's no
potential subtle oddities resulting from this.

## Why It's Good For The Game

These procs presumably did not exist whenever the defines were written -
and they are BYOND builtins, meaning it will just be, say, one `sign`
instruction, instead of two comparisons and a subtraction.

## Changelog

no player-facing changes
2026-04-13 15:32:42 +12:00
SmArtKar 93ea8085cb Datumizes material effects, slots, and material spears (#95341) 2026-04-11 09:15:07 +10:00
MrMelbert fbfacd2792 Let's make sure solo rulesets work too (#95694) 2026-04-10 00:53:11 +02:00
SmArtKar 43c59a17d2 Prevents people crashing into their own mounts if they're thrown together (#95647)
## About The Pull Request

Throwing code checked for the obstacle being buckled to the thrown
object, but not vise versa. In some cases (such as riding a mob) this
could cause you to violently crash into your own mount while flying but
still continue your flight.

## Changelog
🆑
fix: Fixed people crashing into their own mounts if they're thrown
together
/🆑
2026-04-07 15:27:13 -04:00
LemonInTheDark 185a04a767 Implements configurable policy.json paths, so admins can better implement per server policy (#95620)
## About The Pull Request

Headmins were having trouble with per server policy (due to changes in
how their config is structured), this lets them repath policy.json, so
they can override it to a per server config (see the structure seen in
https://github.com/tgstation-operations/server-config)

Moved heretic ascension config into game_options, cause I think that's
what it is.
## Why It's Good For The Game

Mei asked me for this, headmins should be able to headmin
2026-04-05 21:40:37 -05:00
MrMelbert b79743df08 Randomize tts voice more appropriately (#95272)
## About The Pull Request

Adds a helper `SStts.random_tts_voice(gender)` which attempts to pick an
appropriate voice for the passed gender

## Why It's Good For The Game

Randomization into a completely wrong voice kinda ruins it

## Changelog

🆑 Melbert
qol: TTS voice is more appropriately randomized to gender
qol: Getting randomized through means such as mulligan toxin randomizes
TTS voices
/🆑

---------

Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com>
2026-04-04 12:25:12 +00:00
MrMelbert a3bfe66765 Fixes wizard, cult, nukies, revs, and malf from unable to be be rolled roundstart (#95609)
## About The Pull Request

#94899 did not fix all instances where `pick_roundstart_rulesets` added
rulesets to the list

## Changelog

🆑 Melbert
fix: Fixes wizard, cult, nukies, revs, and malf being unable to be
selected for roundstart antag (yes, you read that right)
/🆑
2026-04-02 23:30:43 -04:00
MrMelbert f94302188b Admins can actually ban from recovered crew, blood worm, fugitive(/hunter), paradox clone, monkey helmet, glitch (#95522)
## About The Pull Request

`ROLE_RECOVERED_CREW` jobban flag was used for recovered crew,
experimental cloner, and now Thantorenasia, but it was never actually an
option in the banning panel. Now it is.

While investigating this, I noticed there was several polls that checked
for an role that you couldn't ban from, so they were either added or
folded into a different preference. (Blood worms, fugitive, fugitive
hunter, paradox clone, glitch, monkey helmet)

## Changelog
🆑 Melbert
admin: Admins can ban from "recovered crew", "blood worm", "fugitive" /
"fugitive hunter", "glitch", and "paradox clone"
admin: Mind Magnification Monkeys are now affected by a sentience ban
(previously unbannable)
/🆑
2026-03-29 17:10:39 +01:00
SyncIt21 e0ffb2e962 General maintenance for random chemical reactions (#95339)
## About The Pull Request
- `/datum/chemical_reaction/randomized` is now created along with the
main chemical reaction list and not loaded separately inside the
persistent subsystem. This ensures slightly faster init time and less
snowflake code for adding those chemical reactions later on
- Removed vars that are unused inside
`/datum/chemical_reaction/randomized` but keep those that could be
potentially changed for future recipes
- Merged procs and moves loading recipe data into `New()` making the
code clean and slightly faster
- Random reactions now retry 5 times to be re-added when collisions
happen before giving up
- Removed global lists `GLOB.food_reagents` and
`GLOB.medicine_reagents`. This significantly saves memory for global
lists and makes init faster because we no longer create and delete food
items to init the former list
- `/obj/item/paper/secretrecipe` now picks from all valid random recipes
by default making it robust

## Changelog
🆑
refactor: random recipes like metalgen & secret sause have been
refactored. Please report bugs on github
/🆑
2026-03-28 09:20:54 +01:00
ArcaneMusic 8a6649c8a9 Adds a cargo shuttle upgrade for plastic flaps and air refills. (#95393)
## About The Pull Request

We've all been there before. You send the cargo shuttle, you return it
only to find the blast doors were wide open, and air is now venting out
into space, and with the airlock cycling you are now trapped in a
freezing death trap of your own unwitting design.

This is funny and I want us to keep doing this.

But in an effort to continue to offer interesting things for cargo to
buy in a given shift, this PR offers the ability for cargo to buy an
upgrade to the cargo shuttle itself, that being 2 ~~tiny fans~~ Plastic
Flaps that are installed into the shuttle, as denoted by landmarks
mapped into the cargo shuttle.

Upon being picked up, also includes a certificate of installation. to go
onto the shuttle. Honestly, this is mostly so that I can be lazy and not
just spawn an empty crate but Ideally I open this up for future
categories of "cargo upgrades" that just spawn onto the station.

The other feature here is in shuttles having their air refilled on the
way to/from the station, as part of their subscription to air ™️

It's currently offered for the fairly steep price of 8,000 credits.

## Why It's Good For The Game

This is admittedly a luxury purchase, but, for players who are doing
well enough on credits, either through stocks, bounties, shuttle loans,
cargo events, whatever, this is something that players may want to
purchase for peace of mind, while being entirely optional in-game. The
cargo shuttle can be finicky in many ways and can tend towards easy
mistakes causing lots of pressure-related injuries in a round.

Again, this is intentionally offered at a high price point to avoid this
being an automatic purchase early into the round, but also something
that feels like an earned luxury if you have it, allowing you to focus
on your loop of buying and selling items, hustling if you will, without
caring if Larry over there is going to vent the shuttle for the
umpteenth time.

Like other tiny fans, these are not deconstruct-able and intentionally
should be locked to the cargo shuttle in practice.
2026-03-26 17:37:48 -05:00
MrMelbert af27eda051 Adds support for gags underclothing / Uses it to make them look less jank on lizards (#95454)
## About The Pull Request

1. Underclothes have all been repathed as
`/datum/sprite_accessory/clothing`

2. Underclothes now have support for GAGS. Currently it ONLY supports
static GAGS colors, ie only preset colors, however prefs support could
easily be added in the future

3. Uses the GAGS support to implement the existing digitigrade
templating system for some undergarmants - lizards will use a generic
template for their underclothings when applicable

Example

<img width="169" height="124" alt="image"
src="https://github.com/user-attachments/assets/30b6689b-13a4-4cf9-811c-0d5d0bd5da59"
/>

## Why It's Good For The Game

Existing undergarmants look really jank on lizards

<img width="170" height="140" alt="image"
src="https://github.com/user-attachments/assets/de0704e0-d403-4bdb-a4c5-432d704b9c99"
/>

<img width="118" height="102" alt="image"
src="https://github.com/user-attachments/assets/7ec47327-c2a9-4a90-aab5-fb57105d5111"
/>

I would like to solve this, and well... the two solutions are "we force
lizards to run around naked" or "we use the cool templating system". The
latter seemed preferable


<img width="165" height="125" alt="image"
src="https://github.com/user-attachments/assets/6a8e4225-10a4-4044-9a12-c220713cd613"
/>

I did yoink the template from the jumpsuit template so it might look too
similar, might need to tweak it

## Changelog

🆑 Melbert
add: Some undergarmants will now use a generic replacement on lizard
body shapes that fit more appropriately
refactor: Refactored how undergarmants generate their icons, report any
oddities with that
/🆑
2026-03-23 20:06:58 -07:00
LemonInTheDark f2360d64fd Gives subsystem controllers a bitfield def to make vv easier, renames their flags var (#95439) 2026-03-22 19:06:30 -04:00
MrMelbert 284e23c504 Vendors in audit log are no longer prefixed with "the" (#95389)
## About The Pull Request

Uses `vendor.name` if possible, so it's referred to as "VendingMachine"
rather than "The VendingMachine"

## Why It's Good For The Game

Reads a bit better with all the entries presented

## Changelog

🆑 Melbert
qol: Audit log formats vendors without "the"
/🆑
2026-03-22 17:29:54 -04:00
LemonInTheDark 9d14e327b5 Begins Improving Sparks/Flares Somewhat, Adds Animatable Light Overlays (#95362)
## 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-4a1c3e68533a


https://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-c8a1eeef35a5


https://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!
/🆑
2026-03-20 14:48:57 +13:00
LemonInTheDark 3729ee3ef3 Getting Mad at Parallax (Includes Boomerspace!) (#95382)
## About The Pull Request

I want to do stuff with parallax (like placing stuff in the backdrop and
moving it around), but I'm in my not doing 100 things in one pr arc so
we're doing this piecemeal.

To start, I wanted to try adding oldspace back as a parallax layer. This
is something I was considering when it was first removed but never got
around to, so here we are.

I started by [writing a rust
program](https://github.com/LemonInTheDark/old_space_gen) to fabricate
the required icon state, then realized that all the different parts of
space have their own animation delays. There's no way I could make one
icon state with all them looping, so instead I split them up into
multiple components and then overlayed them together.

This works, but is infeasible (my gpu died) at the scale required for
parallax (17 480x480 sets, 15 unique delays per 1 set) so I used render
targets to render one copy, then mirror it to the rest of the overlays.
This works wonderfully, and gets us down to (on my machine) a gpu cost
comprable with about medium parallax intensity.

I'm open to making these tile bound but I thought making them look "far
away" feels better.

In the process of all this I got very mad at the existing parallax code,
soooooooo

Parallax layers are no longer stored on the client, they are stored on
and managed by the parallax home atom that holds them for display. Said
atom also tracks all the information about how they are selected.

Parallax layers no longer take a hud as input, instead expecting a
client. (we were just swapping them back and forth and I thought it was
dumb).

Parallax no longer tries to support passing in a mob that does not
actually own the hud it is displayed on. This feature wasn't even being
used anymore because it was fully broken, so all it was doing was making
the code worse.

Parallax no longer has to do a full refresh anytime something about WHAT
layers are displayed might have changed. We cache based off the
variables we care about, and use the change in state to determine what
should happen (this is improved by moving "rendering the layers" fully
to the control of the home datum).

Parallax no longer directly modifies the hud's plane masters, instead
relying on trait based signals to manipulate them (this avoids wasted
time in the common event of a needless parallax prefs check).

Parallax no longer has 2 procs that are only called together to
"remove/readd/update" the layers, instead doing both in a new check()
proc.

Cleans up some plane master cruft to do with tracking/managing huds
(might break, tested, think it's fine).

## Why It's Good For The Game


https://github.com/user-attachments/assets/79138a0f-9f6d-447d-843e-0d237db13276

## Changelog
🆑
add: Added an option for rendering space parallax with old space sprites
(the ones from before we invented parallax), they're animated and I feel
quite pretty.
fix: Space parallax should hopefully behave a little more consistently
now
refactor: Rewrote a lot of how space parallax handled itself, please
yell at me if any bugs make themselves known
/🆑
2026-03-20 14:46:30 +13:00
MrMelbert 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
John Willard d1086750d9 Moves Reboot timer to the game screen (#95357)
## About The Pull Request

Since I'm trying to move away from the stat panel as part of my project
here - https://hackmd.io/443_dE5lRWeEAp9bjGcKYw?view - I thought the
reboot timer should be moved out before the stat panel could be made
optional, due to its importance to post-round players (especially to
know if the round is rebooted).

Once the round is over the whole screen kinda becomes pointless, so we
can take as much screen space as we can.

I put this under the tooltips, using similar behavior to it, like the
layer & outline.

This is inspired by the Goon roundend, which does pretty much 1:1 what
this is.

#### Goon's, for reference:

<img width="1397" height="787" alt="image"
src="https://github.com/user-attachments/assets/309b5d6e-c4dd-4f6f-8b83-2256eecd4569"
/>

#### Ours:



https://github.com/user-attachments/assets/b14efae2-e280-47e9-b3db-f57b2060cce7


It's also non-widescreen friendly


## Why It's Good For The Game

Moving things away from the stat panel and to being more player visible
is a positive IMO.
It's also a necessary step to taking away from reliance away from said
stat panel.

## Changelog

🆑
add: The endround timer telling you when a reboot is happening has been
taken out of the stat panel and is instead text over your screen
(similar to Goon)
/🆑
2026-03-13 16:08:56 -06:00
Sutures 096c4a0e10 Fix bugs with area contents system (#95337)
## About The Pull Request
Contains two changes cherry-picked from my CM PR,
https://github.com/cmss13-devs/cmss13/pull/11826.

1) Fixes incorrect args to `block()` in `increase_max_y()` that caused
it to add turfs to every z-level's world.area contents list instead of
just the correct one. This is probably left over from when the area
contents list wasn't split by z-level.

2) Avoids a case where turfs could be removed from area contents twice
if the subsystem returned early on a later Z-level.

## Why It's Good For The Game
Fixes two bugs with the area contents system.

## Changelog

🆑 MoondancerPony
fix: fixed turfs sometimes not being in any area's contents
/🆑
2026-03-08 05:12:24 -07:00