## About The Pull Request
Recent events on the station have left me very - unimpressed, as it
comes to our spells.
Some have backticks, most use apostrophes. Some have punctuation, many
don't. Some are in all caps, others aren't.
So I went through and basically just tweaked all the invocations
slightly to make them more consistent. They're all punctuated now, with
whispered invocations preferring periods and shouting invocations
preferring exclamation (though this is not a set rule, as sometimes a
period gets the message across stronger than an exclamation point."
I also made it a bit easier to work with emote invocations. Which in
turn involved me touching the human `p_x` procs.
## Why It's Good For The Game
Spell invocations are wildly inconsistent style wise, tightening them up
helps towards muh immersions. Makes it feel more like a system and less
like stuff thrown together.
## Changelog
🆑 Melbert
qol: All spell invocations have been made a bit more consistent - some
have changed slightly, some are now punctuated. "Dragon Form" and "Bear
Form" are now emotes invocations.
qol: "Unknown" mobs are now properly referred to as they/them
/🆑
## About The Pull Request
This won't actually do anything on live, since those are all set to
UTC±0 currently
Pins logging and IC uses of time2text to UTC±0 instead of using the
system timezone (byond default)
Timezones not being set to utc0 caused issues before (and is again)
All timezones are now passed explicitly to make it more likely it's
cargo culted properly at least
Deletes worldtime2text cus it was gameTimestamp default args
## Why It's Good For The Game
Server timezone changes probably shouldn't affect logging, round times,
file hashes, IC time, when you caught fish, etc
## Changelog
🆑
refactor: Logging and IC timestamps will now always use UTC±0 and not be
affected by server system timezone changes
fix: Station and round times will not longer be incorrect if the system
timezone is not UTC±0
/🆑
---------
Co-authored-by: TiviPlus <572233640+TiviPlus@users.noreply.com>
## About The Pull Request
Reverts the storage initialization refactor and all subsequent related
PRs.
The original PR is below our standards both for code quality and
testing, and is majorly flawed at its core. This has been discussed with
other maintainers and headcoder(s?) over on discord. A lot of changes
from the PR could be brought over later, but in its current state it
should not have been merged.
- Closes#90322
- Closes#90313
- Closes#90315
- Closes#90320
- Closes#90312
- Closes#90344
## Why It's Good For The Game
This PR causes a series of major issues which cannot be resolved without
either completely rewriting a lot of the original PR, or bad code.
Not matching our standards is grounds for not merging a PR, and the fact
that a PR should not have been merged is a reason for a revert.
## Changelog
🆑
fix: Fixed a series of storage-related bugs caused by a refactor PR.
/🆑
## About The Pull Request
Restores the old movement speed on space phase.
## Why It's Good For The Game
introduced with this pr by accident.
https://github.com/tgstation/tgstation/pull/90173
the movement speed of the orb form was set to default resulting in space
phase being much slower as a result.
This pr fixes that.
## Changelog
🆑
fix: Space phase is as fast as it used to be.
/🆑
## About The Pull Request
We ***really*** shouldn't be iterating over all areas for every single
mob. No wonder this lags like hell.
## Changelog
🆑
fix: Fixes incorrect indentation in blob victory code which could cause
immense lag as a result
/🆑
## About The Pull Request
516 requires float layered overlays to be using pixel_w and pixel_z
instead of pixel_x and pixel_y respectively, unless we want
visual/layering errors. This makes sense, as w,z are for visual effects
only. Sadly seems we were not entirely consistent in this, and many
things seem to have been using x,y incorrectly.
This hopefully fixes that, and thus also fixes layering issues. Complete
1:1 compatibility not guaranteed.
I did the lazy way suggested to me by SmArtKar to speed it up (Runtiming
inside apply_overlays), and this is still included in the PR to flash
out possible issues in a TM (Plus I will need someone to grep the
runtimes for me after the TM period to make sure nothing was missed).
After this is done I'll remove all these extra checks.
Lints will probably be failing for a bit, got to wait for [this
update](4b77cd487d)
to them to make it into release. Or just unlint the lines, though that's
probably gonna produce code debt
## Why It's Good For The Game
Fixes this massive 516 mess, hopefully.
closes#90281
## Changelog
🆑
refactor: Changed many of our use cases for pixel_x and pixel_y
correctly into pixel_w and pixel_z, fixing layering issues in the
process.
/🆑
---------
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: SmArtKar <master.of.bagets@gmail.com>
## About The Pull Request
This PR should fix the problem of small previews in TGUI once and for
all (I hope).
What was causing it? Because TGUI takes a long time to open, that's why
previews were generated broken (small).
On Byond 515 this problem was not so noticeable as the interfaces opened
faster, but with the release of 516 it became much worse.
Previews were generated inside a window that was not yet open, so the
scale was broken, sometimes the window would open before the preview was
done and sent, usually with small interfaces, or when reopening.
I'm not very good at working with signals, and to tell the truth this is
my second experience with them, so I hope I did it right.
## Why It's Good For The Game
No more small map previews
<details> <summary> Video </summary>
https://github.com/user-attachments/assets/834f3820-cc6a-4f65-90e5-d6bb2a118bcf
</details>
## Changelog
🆑
fix: Fixed small character preview, color matrix preview, mech preview,
and other previews with uses ByondUI map
/🆑
---------
Co-authored-by: Gaxeer <44334376+Gaxeer@users.noreply.github.com>
## About The Pull Request
Examining an influence gives you a sp00ky message rather than an empty
box
## Why It's Good For The Game
Worldbuilding?
## Changelog
🆑 Melbert
qol: Examining a heretic influence gives you a sp00ky message rather
than an empty box
/🆑
## About The Pull Request
This PR removes the temporary immobilisation applied to users of Phase
Shift and Ashen Passage upon casting it.
Having to wait 0.6 (or 1.6 for phase shift) seconds before moving is
basically just sort of annoying and doesn't provide any particular
benefit that I can see, as it does not really add any additional time
where anyone can do anything about you jaunting away.
This does not effect the visuals, which still play, or buff the duration
of the spell, as the timer would only start once the immobilisation had
ended.
This also doesn't effect the immobilisation when you _exit_, which still
exists unchanged and _is_ necessary for the animation to look good.
## Why It's Good For The Game
This delay made the spells more annoying to use than necessary and I
personally don't think it added anything visually to have this
synchronised with an animation which will continue to play at the space
you left, _especially_ in the case of Ashen Passage.
## Changelog
🆑
qol: Users of Ashen Passage and Phase Shift will be able to move
instantly upon cast rather than after a delay
/🆑
## About The Pull Request
This trainwreck of a PR is (hopefully) a final solution to all rendering
jank stemming from the new filter-based coloring system. I went over
every single instance of RESET_COLOR, either adding KEEP_APART or
rewriting them entirely so they render properly. I've also fixed blood
rendering issues by utilizing alpha filters and adding an abstract
"holder" appearance for worn items, which holds blood overlays on worn
clothing as to avoid coloring it. I've also fixed horrible
inconsistencies with atmos pipe coloring as a result (of getting sucked
down that rabbit hole) and converted all uses of COLOR_VERY_LIGHT_GRAY
in atmos code to ATMOS_COLOR_OMNI to avoid confusion.
MODsuit modules still get colored into MOD unit's color, need to
refactor their rendering for this.
Closes#88989Closes#87526Closes#89837
## Changelog
🆑
refactor: Audited all remaining coloring code - among noticeable
changes, blood should no longer get colored or "leak out" of item
bounds, atmos pipes no longer color weirdly and repairbots are white
again.
/🆑
## About The Pull Request
One of my upcoming PRs affects a significant chunk of the codebase so
I'm cleaning up messes that I've found along the way.
This PR adds wrappers for adjusting sanity/checking if a mob already has
a certain moodlet, fixes an oversight where attempting to set sanity
over passed maximum would abort the change outright (instead of actually
capping it out), moved jolly and depression processing into quirks
themselves (instead of having dedicated traits for them used solely by
said quirks and nothing else that are constantly checked for by mood
datums), and rewrote how blessings return their results to move omen's
deletion on blessing effect from constantly checking mood for a blessing
moodlet to a comsig.
## Why It's Good For The Game
Less jank handling of certain mechanics, we ***really*** shouldn't be
checking for blessings every time mood of all things is updated.
## Changelog
🆑
fix: Adjusting sanity over the allowed maximum will no longer completely
halt the change, and instead actually cap it at the maximum value.
code: Cleaned up mood and mood-adjacent code.
/🆑
## About The Pull Request
Was registered to an incorrect proc, so it didn't refresh eyes when
moving around nor was it starting the cooldown, so ticks double dipped
and unnecessarily refreshed invis.
## Changelog
🆑
fix: Fixed darkness adaptation not refreshing eye status correctly
/🆑
## About The Pull Request
Closes#90163
Space Crawl previously decided if you were in space by identifying your
location as either a space turf or a "misc" turf, an arbitrary typepath
that coincidentally is often but not exclusively used for turfs that are
outside.
This is only coincidentally accurate and fails, for instance, in the
tram underpass specifically if you are stood on the sandy asteroid tiles
but _not_ if you are stood on the grass tiles, which is a pretty weird
inconsistency. It really shouldn't work there at all. Additionally,
there are often _non_-misc turfs outside too, meaning that you can space
crawl on exterior asteroid tiles but not exterior plating tiles for some
reason.
_Now_ it will function under the following criteria:
- You're on a space tile.
- You're in an outdoor area with low pressure,
This preserves the existing behaviour where this ability functions on
icebox and lavaland, but closes the weird outliers both in and outside.
Unfortunately as the tram underpass is classified as outside for some
reason (it shares the area as exterior asteroid) then venting it will
let you spacecrawl there... but then again, if it's vented then arguably
it is in fact in space?
This would be easier if this ability was just dogshit on Icebox so I
could also check if there is gravity but unfortunately players probably
wouldn't like that.
## Why It's Good For The Game
Hopefully makes the ability work in a more consistently understandable
way.
## Changelog
🆑
balance: Space Crawl now functions if you are on a space tile, or if you
are in an outdoor area with low air pressure.
/🆑
## About The Pull Request
A Huge chunk of changes just comes from moving existing storage code
into new files & seperating `atom_storage` code into its own subtype
under the already existing `storage/subtypes` folder.
With that the changes in this PR can be organized into 3 categories.
**1. Refactors how `/obj/item/storage/PopulateContents()` initializes
storages**
- Fixes#88747 and every other storage item that has a similar variant
of this problem
The problem with `PopulateContents()` is that it allows you to create
atoms directly inside the storage via `new(src)` thus bypassing all the
access restrictions enforced by `/datum/storage/can_insert()` resulting
in storages holding stuff they shouldn't be able to hold.
Now how this proc works has been changed. It must now only return a list
of items(each item in the list can either be a typepath or a solid atom
or a mix of them in any order) that should be inserted into the storage.
Each item is then passed into `can_insert()` to check if it can fit in
the storage.
If your list contains solid atoms they must be first moved
to/Initialized in nullspace so `can_insert()` won't count it as already
inserted. `can_insert()` has now also been refactored to throw stack
traces but explaining exactly why the item could not fit in the storage
thus giving you more debugging details to fix your stuff.
A large majority of changes is refactoring `PopulateContents()` to
return a list instead of simply creating the item in place so simple 1
line changes & with that we have fixed all broken storages(medical
toolbox. electrical toolbox, cruisader armor boxes & many more) that
hold more items they can handle
**2. Organizes initialization of `atom_storage` for storage subtypes.**
All subtypes of `/obj/item/storage` should(not enforced) create their
own `/datum/storage/` subtype under the folder `storage/subtypes` if the
default values are not sufficient. This is the 2nd change done across
all existing storages
Not only does this bring code cleanliness & organization (separating
storage code from item code like how `/datum/wire` code is separated
into its own sub folder) but it also makes storage initialization
slightly faster (because you are not modifying default values after
`atom_storage` is initialized but you are directly setting the default
value in place).
You now cannot & should not modify `atom_storage` values inside
`PopulateContents()`. This will make that proc as pure as possible so
less side effects. Of course this principle is not enforced and you can
still modify the storage value after `Initialize()` but this should not
be encouraged in the future
**3. Adds support for automatic storage computations**
Most people don't understand how `atom_storage` values work. The comment
here clearly states that
55bbfef0da/code/game/objects/items/storage/toolbox.dm (L327-L329)
Because of that the linked issue occurs not just for medical toolbox but
for a lot of other items as well.
Which is why if you do not know what you doing, `PopulateContents()` now
comes with a new storage parameter i.e. `/datum/storage_config`
This datum allows you to compute storage values that will perfectly fit
with the initial contents of your storage. It allows you to do stuff
like computing `max_slots`, `max_item_weight`, `max_total_weight` etc
based on your storage initial contents so that all the contents can fit
perfectly leaving no space for excess.
## Changelog
🆑
fix: storages are no longer initialized with items that can't be put
back in after taking them out
refactor: storage initialization has been refactored. Please report bugs
on github
/🆑
## About The Pull Request
I was fucking around testing the Voidwalker earlier for a different
issue and didn't like that I couldn't see myself while in space.
This PR makes it so that Voidwalkers and also any variant of Ethereal
Jaunt place an icon visible only to you at your current position (it's
like your _soul_) so that you can see where you are going.
Nobody else can see it.


There are almost certainly some other sources of being invisible which
could use this so let me know if you are aware of one.
Although if you do that I may need to make my code more generic.
## Why It's Good For The Game
It's nice to be able to see where you are precisely rather than just it
being the centre of the screen
## Changelog
🆑
qol: It is now easier to see where you currently are while jaunting
/🆑
## About The Pull Request
So, last night, I discovered an interesting edge-case after being
attacked by two heretics: if you have a mark applied, then a heretic on
a different path also applies a mark, the second mark will replace the
first _without the effects from said mark being cleaned up_. This could
lead to, for example, permanent pacifism if the first mark was the moon
path mark.
This makes it so heretic mark status effects are _properly_ removed
before being replaced.
## Why It's Good For The Game
bugged permanent pacifism sucks
## Changelog
🆑
fix: Fixed an edge-case where, if two heretics of different paths
applied a mark to the same person, the effects from the first mark (i.e
moon path's pacifism) would likely be permanent.
/🆑
## About The Pull Request
1. Hallucination effects are now tiered
Hallucinations now all have tiers, ranging from common to special.
If you are just hallucinating a teeny bit, you will not experience the
more extreme hallucinations, like bubblegum or your mom.
But if you're hallucinating off your butt, you will be a bit more likely
to experience them.
2. Hallucination rate has been tweaked
Default hallucination cooldown is now 20-80 seconds, up from 10-60
seconds.
However the cooldown will *also* vary depending on just how much you're
hallucinating, going down to 10-40 seconds.
3. RDS is now capped a bit lower (meaning you don't see the higher tiers
like bubblegum).
But I added a preference to uncap it. For the people who actually like
bubblegum visits.
4. If a hallucination fails to trigger, the cooldown will partially
reset. (by 75%)
5. "Fake chat" hallucination will pick more viable subjects.
Fake chat will try to find someone who can actually speak your language,
rather than make a monkey speak mothic or something.
(I may revisit this so if you're super-hallucinating it reverts to old
behavior though.)
6. Adds a hallucination: Fake blood
You hallucinate that you start bleeding, very simple.
7. Adds a hallucination: Fake telepathy
You hallucinate a random telepathic message, similar to fake chat.
8. Adds a hallucination: Eyes in the Dark
A nearby dark turf will have a set of glowing red eyes shine through the
dark. A classic.
9. Adds some new sub-hallucination: PDA ringtone (fake sound), summon
guns/magic (fake item)
Funny prank.
10. Makes mindbreaker a bit more effective at combating RDS.
Pretty much does nothing right now unless you gulp like 50u.
## Why It's Good For The Game
Hallucinations are pretty one note if you experience them for longer
than 10 minutes.
This is due to two fold:
- Many hallucinations are goofy, and not subtle
- Hallucinations trigger very rapidly
You will never fall for a hallucination because in between "You see John
Greytide put the blueprints away", you get your mom yelling at you,
everyone looking like syndies (again), and bubblegum
This pr addresses it by
- Limiting the wacky hallucinations for when you're really off your
gourd
- Reducing the period between triggers
- Adding a few hallucinations
If the wackier hallucinations are reserved for when you're really off
your rocker, this lets the more subtle ones sink in over time, leaves
more room for second guessing
## Changelog
🆑 Melbert
add: Adds 4-5 new hallucinations. Collect them all.
balance: If you are only hallucinating a little bit, the game will
prefer to pick more subtle hallucinations. If you are hallucinating a
ton, it will prefer the more wacky hallucinations.
balance: If you are only hallucinating a little bit, the cooldown
between hallucinations is longer. If you are hallucinating a ton, it
will be shorter.
balance: If a hallucination fails to trigger (such as a deaf person
getting a sound hallucination) the next one will be a lot sooner.
balance: RDS hallucination amount is capped at mid tier hallucinations.
This means bubblegum and co. will be a lot rarer, or will even never
show. HOWEVER, there is now a preference allowing you to uncap your RDS
hallucinations.
balance: Mindbreaker toxin is more effective at suppressing RDS.
balance: Some hallucinations effects have been tweaked up or down
according to the new thresholds. Madness mask as an example.
fix: "Fake Fire" Hallucination works again, and now has a unique message
for if you stop-drop-roll that other people see.
/🆑
## About The Pull Request
Added visual overlays for all arm implants, HUD implants (not the
headrev one), internal thrusters, breathing tube, nutriment pumps and
reviver implant.



Additionally, added a wrapper for eye color setting which solves the
issue where non-pref sourced eyecolors got reset after changing them,
and changed how blinking works so now update_body calls don't force you
to blink.
## Why It's Good For The Game
Gives you incredible drip (which makes augments feel more impactful) and
allows others to see if you have certain important augments (reviver)
that could matter.
As for technical changes, both were required for this to HUDs to work
nicely and fix some bugs as a side effect.
## Changelog
🆑
add: Certain implants now have visuals when implanted
fix: You no longer blink when you adjust your clothing
fix: Fixed an issue where some NPC/midround humans would not get their
eye color set correctly
/🆑
## About The Pull Request
So I was looking for `attackby(...)` instances to kill and, hey look,
table frames- oh what the fuck is this.
Oh why does this have the same checks like five times, across the parent
type and subtypes.
So this pr's primary point is to refactor the table frame
`attackby(...)` into `item_interaction(...)`, and by extension lower the
amount of weird `attackby(...)` override jank going on with them.
Instead of having all of the subtypes define their own almost exactly
the same table construction interactions, we use a single generic
interaction chain and add a new `get_table_type(...)` proc to let
subtypes override what tables to construct for what stacks.
We also move the assigning of frame-and-stack-related things to the
actual table types themselves, instead of specifying all these
interactions on the frame.
We also add screentips for deconstruction and table construction, again
using the `get_table_type(...)` proc so screentips can differentiate
between which stacks can and can't make a table for our table without
needing to change the screentips manually for the subtypes.
Beyond that is mostly generic clean-up.
I'm a bit icky on my implementation of
`/obj/item/stack/proc/get_table_type()`, because of hardcoding for
`/obj/structure/table/greyscale`, but I think it's better than the
alternatives.
This lets us use the old method of letting all `/obj/item/stack/sheet`
subtypes use the generic material table, but limit it to working as long
as they define a `material_type`. I feel it's better than letting broken
tables exist, needing to hardcode it on the table frame, or needing to
expect people to add the generic material table `table_type` whenever
they add a `material_type` (no one would do this).
## Why It's Good For The Game
Screentips good 👍
Less jank encountered good.
Specifically the inability to deconstruct table frames on right click
when tables can be deconstructed on right click has thrown me off so
many times it's wild.
## Changelog
🆑
refactor: Refactored table frame interactions, please report any issues.
fix: You can no longer make material-less material tables out of certain
items.
fix: Fancy tables remember which carpet was used to make them, and no
longer magically transmute carpets into simpler types.
fix: You can no longer stack abductor table frame-using tables
specifically.
qol: Added screentips for deconstructing table frames and constructing
tables out of them if the material you're holding can do so.
qol: Table frames can now also be deconstructed on right click for
parity with tables, in addition to left click.
qol: Table frame interactions use balloon alerts.
/🆑
## About The Pull Request
I was kinda shocked that we didn't have something for this considering
that it's an unspoken rule of cargo to check that a crate does not sell
back for more than it's price and that the one comment saying to do so
has been doing some heavy lifting for the last 12 years.
I'm a novice when it comes to unit testing specifically so hopefully the
smoothing out that needs to be done should be fairly quick.
*Edit (2/22/25):*
The following changes were also made in order to allow for this unit
test to work smoothly:
Exports now have a market define added to them, as the purpose of this
unit test is to test exports that occur on the station, bought from
supply and then sold back to supply. As such, these market defines
exclude exports specific to pirates (since the cargo shuttle cannot sell
living mobs back, preventing you from making 10k per parrot crate.).
I've also added the `abstract` variable to some export datums, to
signify that a given export is either variable, or not meant to be
compared against the value of it's own container, such as with gas
canister's base export value as their export datums are generated
dynamically. (The subtypes are not abstract, however.)
The verb, `/mob/living/verb/tally_physical_credits()` has been changed
to `/mob/living/proc/tally_physical_credits()`, because that's my B and
does effect some economy back end but it's a one line fix so I just
absent-mindedly fixed it here instead of atomizing it out. I can
one-line it otherwise.
Mulebots now no longer runtime on spawn as they set their own to their
own `get_turf` as opposed to pulling their `loc`.
A few supply packs have had their prices bumped up slightly to actually
pass the test itself:
* `/datum/supply_pack/misc/candles_bulk`
* `/datum/supply_pack/security/armor`
* `/datum/supply_pack/security/helmets`
* `/datum/supply_pack/security/baton`
## Why It's Good For The Game
Prevents future infinite credit bugs that could have been missed by
simply checking the sale value in game.
## Changelog
🆑
fix: To prevent infinite sales issues, security helmets, armors, and
batons packs now all cost 600 credits, up from 400.
fix: Candle packs now cost 400 credits, up from 300, and candles now
sell for 12.25 cr each.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
Abductor antags have a 2% chance to be green.
Admins can now choose to set the color of an abductor team they create
in the traitor panel
## Why It's Good For The Game

## Changelog
🆑 Wallem
add: Some aliens have recently been discovered to be green.
/🆑
## About The Pull Request
Cult target now must be on station zlevel
## Why It's Good For The Game
Cultist shouldn't explore space to find their target, since they can't
draw runes there.
## Changelog
🆑
fix: fixed offstation humans being able to be cult target
/🆑
---------
Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>
## About The Pull Request
Implemented a bodypart texture overlay priority system - ensures that
derez suicide always goes ontop of carp infusions, and voidwalker curse
goes ontop of both - currently the last one applied is the one that
sticks with you. Also cleaned up duplicate update_body calls, either
removing them or adding ``update = FALSE`` to overlay code.
## Why It's Good For The Game
Having whichever overlay was applied the latest be displayed is just too
inconsistent. And duplicate calls eat perf, bad.
## About The Pull Request
Soft reworks Ling's Darkness Adaptation
- No longer permanently makes you transparent when active. Transparency
scales based on how dark your area is. Darker areas = more transparent.
- No longer permanently grants dark vision. Darker areas = more dark
vision.
- Now *costs* 15 chemicals rather than just *requiring* 10 chemicals.
Disabling the effect costs 0 chemicals.
- Toggling the effect imparts a click CD. CD is lower for disabling it.
https://github.com/user-attachments/assets/d0384a07-1e23-46f7-8362-f42caa0b9c11
Also fixes a bug with digital camo
## Why It's Good For The Game
While this mutation was designed to be used in stealth shenanigans, it
was instead primarily used for murderboning with low visibility. This is
lame.
These changes will address that.
- Activating the power imparts a click CD and costs chemicals so it is
less wise to use it when you get jumped and more wise to use it when
you're setting up an ambush.
- Flashlights and similar bright lights will disable the power, so it
will shine less (pun intended) when used in bright areas such as space
or, well, any area with a dark floor (most of Nebula Station)
It will also open up potential with other changeling powers:
- For example, EMP screech to disable lights or Disorienting screech to
break light fixtures.
## Changelog
🆑 Melbert
balance: Reworks Changeling's Darkness Adaptation. It's strength now
scales with how dark your environment is, rather than being static
transparency.
fix: Fixes Digital Camo's examine message
/🆑
## About The Pull Request
If you can't immediately invoke a wizard finale, it'll just tell you to
wait a bit.
## Why It's Good For The Game
While the radial does tell you that the effect cannot be invoked yet,
it's quite small text that you have to quickly read while (assumedly)
your ass is public enemy #\1.
Instead of locking you into something you can't do for another 20
minutes, why not just let them pick another one? Or if they really want
to pick that one, they can wait before selecting it?
## Changelog
🆑 Melbert
qol: When reaching the wizard grand finale, you no longer get locked
into finale effects that cannot yet be invoked.
/🆑
## About The Pull Request
"wolves Amont Sheep" cooldown increased from 2 to 5 minutes.
## Why It's Good For The Game
I kinda left it low on purpose so that I could get more people to try it
out.
As it stands 2 minutes it's a bit low for what's arguably the strongest
heretic spell in the game.
## About The Pull Request
Added an headset subtype for ERT leaders. The only difference is the
high-volume mode
Also fixed the fact that Deathsquad Officer spawns with
`/datum/outfit/centcom/death_commando` instead of
`/datum/outfit/centcom/death_commando/officer`
## Why It's Good For The Game
The messages of ERT leaders will have better visibility in chat
## Changelog
🆑
qol: ERT leaders now have a headset with high-volume mode
fix: Deathsquad Officer will now have proper outfit
/🆑
## About The Pull Request
https://github.com/tgstation/tgstation/pull/86605 included a change to
make last resort an innate ability for all lings. This PR reverts that
specific change.
## Why It's Good For The Game
In what is unfortunately the

of ling changes, this change in particular is fine on the surface until
you consider that lings actually have a very, very particular
interaction with one another.
Killing and absorbing one another in order to improve their own power.
If every single ling, upon death, can just explode immediately, there is
no possible way for a ling to be absorbed by another ling under most any
circumstance that isn't highly specific and that the majority of lings
are not reliable affected by. Sleepy chems and stuff don't really stick
to lings. Lings have the few remaining adrenals left in the game. And
killing whatsoever and trying to absorb them will just result in you
getting blown up.
So, this interaction may as well be near impossible, and was already
VERY difficult. This being as hard as it is means that lings kind of
lose their antagonistic nature towards their own kind. The only good
that can come from killing another ling is the removal of a ling from
the round and to no benefit to you. That ling also cannot reasonably do
the same to you, as you will also just explode and leave them with
nothing for their efforts. This means that there is a much greater
encouragement towards these lings working together instead.
The game is more interesting if there is the potential for betrayal. So
removing that aspect really cheapens the potential outcomes of
inter-antagonist conflict.
## Changelog
🆑
balance: Last resort is no longer an innate changeling ability.
Changeling on changeling violence is back on the menu. (literally)
/🆑
## About The Pull Request
This explicitly specifies `type = MESSAGE_TYPE_RADIO` in `to_chat` for
various methods of communication (blood cult communion, abductor
telepathy, xeno hivemind, golem resonator, blob telepathy, changeling
hivemind, and binary chat), so that they will always be considered under
the "Radio" category by tgchat.
Also added `avoid_highlighting` to some, so they won't highlight your
own messages.
## Why It's Good For The Game
Makes going thru older messages find things that I accidentally missed
much easier.
## Changelog
🆑
qol: Messages from blood cult communion, abductor telepathy, xeno
hivemind, golem resonator, blob telepathy, changeling hivemind, and
binary chat are now considered "radio" messages by the chat, so they can
properly be sorted via chat tabs.
qol: Your own messages in blood cult communion,
abductor/xenomorph/changeling hivemind, or golem telepathy will no
longer be highlighted in chat (to prevent highlight spam whenever you
talk if you highlight your own name, mainly)
/🆑
## About The Pull Request
first and primarily the ritual preserves the ID card used
the id itself may not consume (and cant use in the ritual) non-advanced
(advanced IDs are mainly the crew and whoever IDs) IDs because it wasnt
intentional and it kinda breaks a few things and its such a super edge
case to find a not advanced id and use it with the id
closes #89697
## Why It's Good For The Game
makes the ritual not screw people over
## Changelog
🆑
fix: the eldritch id (Lock path) now preserves the ID used.
/🆑
## About The Pull Request
prevents stripping in caretakers last refuge
## Why It's Good For The Game
fixes#89710
## Changelog
🆑
fix: prevents stripping in caretakers last refuge
/🆑
## About The Pull Request
The title pretty much says it all. I'm told that this was done because,
previously, the station would be exploded by the nuclear device - but
when that was removed, all that remained was `qdel(bomb)`.
That said, there's some bizarre stuff behind what pushed me to make this
PR. See below if you want to know.
<details><summary>Bizarre stuff</summary>
For some reason, while trying to port
<https://github.com/tgstation/tgstation/pull/77868> over to
Monkestation, I started getting hard-deletes for the nuclear bomb used
in the `nuke_cinematic` unit test.
```
## REF SEARCH Beginning search for references to a /obj/machinery/nuclearbomb/syndicate.
## REF SEARCH Refcount for /obj/machinery/nuclearbomb/syndicate: 7
## REF SEARCH Finished searching globals
## REF SEARCH Finished searching native globals
## REF SEARCH Finished searching atoms
## REF SEARCH Found /obj/machinery/nuclearbomb/syndicate [0x201f850] in list Datums -> /datum/controller/subsystem/garbage [0x2100001c] -> queues (list) -> /list (list) -> /list (list).
## REF SEARCH Found /obj/machinery/nuclearbomb/syndicate [0x201f850] in list Datums -> /datum/callback [0x21057da8] (obj: Ticker proc: station_explosion_detonation args: ["the nuclear fission explosive"] user: null) -> arguments (list).
## REF SEARCH Finished searching datums
## REF SEARCH Finished searching clients
## REF SEARCH Completed search for references to a /obj/machinery/nuclearbomb/syndicate.
## TESTING: GC: -- [0x201f850] | /obj/machinery/nuclearbomb/syndicate was unable to be GC'd -- (ref count of 3)
Error: /obj/machinery/nuclearbomb/syndicate hard deleted 1 times out of a total del count of 3
FAILURE #1: /obj/machinery/nuclearbomb/syndicate hard deleted 1 times out of a total del count of 3 at code/modules/unit_tests/create_and_destroy.dm:99
Error: FAIL /datum/unit_test/create_and_destroy 308.1s
```
This hard-del would happen on every integration test, no matter the map
and no matter the byond version. I was even able to have it happen
locally.
Thing is, Monkestation only seems to have two differences in our code
for actually exploding a nuke:
1. We mark some z-levels as safe from the nuclear bomb (so you can go to
the lowest reaches of icebox and be safe from the bomb). This only
modifies the list of z-levels to call the "gib everyone on z" code for.
2. We don't have tgstation/tgstation#75967 ported over - but making a
new branch and cherry-picking both 77868 and 75967 didn't seem to fix
the issue either.
So something with how the callback is handled by the `play_cutscene`
global proc is preventing this from being qdel'd properly - resulting in
a hard-delete over five minutes after the nuke cinematic plays.
I tried several things to understand why the callback was causing a
hard-del, but only one gave me any tangible info - changing the
reference to the bomb, into a weakref reference, which stopped the
hard-del.
However, I eventually realized the callback was entirely pointless -
right now, all it does is qdel the bomb. So I just moved it from a
callback to part of the `really_actually_explode()` proc.
</details>
## Why It's Good For The Game
I'd say it fixes a hard-delete, but that hard-delete was only happening
on Monkestation.
So I guess it removes a bit of unnecessary indirection?
## Changelog
:cl:MichiRecRoom
fix: Nukes will now always be deleted upon exploding, no matter if they
have a valid cutscene to play.
/🆑
## About The Pull Request
This PR tackles our piss-poor item action handling. Currently in order
to make an item only have actions when its equipped to a certain slot
you need to override a proc, which I've changed by introducing an
action_slots variable. I've also cleaned up a ton of action code, and
most importantly moved a lot of Trigger effects on items to do_effect,
which allows actions to not call ui_action_click or attack_self on an
item without bypassing IsAvailible and comsigs that parent Trigger has.
This resolves issues like jump boots being usable from your hands, HUDs
being toggleable out of your pockets, etc. Also moved a few actions from
relying on attack_self to individual handling on their side.
This also stops welding masks/hardhats from showing their action while
you hold them, this part of the change is just something I thought
didn't make much sense - you can use their action by using them in-hand,
and flickering on your action bar can be annoying when reshuffling your
backpack.
Closes#89653
## Why It's Good For The Game
Makes action handling significantly less ass, allows us to avoid code
like this
```js
/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/halt))
halt()
else
adjust_visor(user)
```
## About The Pull Request
This PR implements multiple new features:
Foam darts now can stick to people as long as their cap isn't removed.
Riot foam darts have a chance to jostle when you move with one stuck
inside of you, dealing a bit of stamina damage from the weight stuck to
your limbs.
Syringe guns received a second "low power" mode, toggleable with in-hand
right click. In this mode, syringes fired will embed into their target
and slowly leak their reagents instead of instantly delivering them.
Thankfully, they can be plucked out pretty quickly.
You can also insert syringes into uncapped (screwdriver-ed) foam darts
(similarly to pens) to achieve the same result, allowing you to get a
bootleg low-efficiency syringe gun.
Additionally, I fixed/cleaned up some embedding issues/code which I
found while coding this.
## Why It's Good For The Game
This allows players to explore new funny interactions between items and
chems, as we don't have a reliable slow release mechanism aside from IV
drips currently. And foam darts embedding it just (mostly) harmless
fluff, if someone figures out a way to cause havoc with it then I'll be
very proud of them (someone totally will).
## Changelog
🆑
add: Foam darts now stick to people when they have their cap on, riot
foam darts also can passively deal a bit of stamina damage when you move
with one.
add: Syringes can be inserted into foam darts, making them embed and
slowly leak their reagents into their victim.
add: Syringe guns can be toggled (with right click) between high power
and low power modes, former being their normal functionality and latter
making syringes embed and slowly leak their contents.
fix: Fixed projectiles sometimes not embedding when they should've
code: Cleaned embedding code up
/🆑
## About The Pull Request
Doesn't affect anything besides fixing the armsy issue and making
mindless heretic summons also count as, well, summons.
Closes#89696
## Changelog
🆑
fix: Armsy (aka Lord Of The Night (aka flesh snek (aka heretic
ascention))) no longer affects itself with its own spells
/🆑
## About The Pull Request
Converts `/datum/player_details` into `/datum/persistent_client`.
Persistent Clients persist across connections. The only time a mob's
persistent client will change is if the ckey it's bound to logs into a
different mob, or the mob is deleted (duh).
Also adds PossessByPlayer() so that transfering mob control is cleaner
and makes more immediate sense if you don't know byond-fu.
## Why It's Good For The Game
Clients are an abstract representation of a connection that can be
dropped at almost any moment so putting things that should be stable to
access at any time onto an undying object is ideal. This allows for
future expansions like abstracting away client.screen and managing
everything cleanly.
## About The Pull Request
Adds the Spinwarder language, and grants it to Space Russians (including
the mobs, Fugitive Hunters, and the BODA machine).

<details>
<summary>Lore Be Here, Abandon All Hope</summary>
**Spinwarder Russian**, also known simply as **Spinwarder**, was the
official language of the Third Soviet Union, and following the collapse
of that state, has remained the primary spoken language in its former
lands, including the Spinward Stellar Coalition, which is the closest
stellar governing body to SS13. This means its the language spoken by
your average Space Russian who you might find nearby to the station;
it's also the language used by devices made in and around the former
Third Soviet Union.
As an additional tidbit, the icon for the language:

is the state flag of the SSC.
</details>
## About The Pull Request
Closes#89540
## Changelog
🆑
fix: Moon amulet now properly turns insane people into converts and
drains sanity of sane people, instead of doing the inverse
/🆑
## About The Pull Request
Critical fix to the game, less than two months away from the most
wonderful time of the year (on both directions).
## Why It's Good For The Game
See above.
## Changelog
🆑
fix: cult slurring/stuttering now removed before the april fools punch
line upon conversion, thus untarnishing the Rick and Morty reference.
/🆑
## About The Pull Request
Finally, I've done it.
You can get plant limbs attached, and those limbs will actually
regenerate in light!
I've done the same for shadow healing for nightmares and shadowpeople.

**Details:**
I've removed the healing/damage from their species, and instead have the
prospective limbs add a new /datum/status_effect/bodypart_effect to the
carbon, which other bodyparts with the same effect merge into.
Plant people in specific also had oxy and tox healing, as well as
nutritional gain. These attributes have been integrated into the
bodyparts aswell, and scaled to the amount of bodyparts you have. You
can take 1 plant limb to get 1/6th of the oxygen and toxin healing of a
normal podperson. Same for nutritional gain. (Fun fact: you need 2 plant
limbs to never lose hunger, 3 to actually be nutrition positive!) Damage
wise, if you have 1 plant limb, you get 1/6th the plant healing but
focused on only the plant limb. (This is hopefully exactly as you'd
expect).
Fun fact: if you remove your lungs and organs and take plant limbs, you
will still die from oxygen loss or toxin loss because the oxy and tox
healing is really weak.
## Why It's Good For The Game
Honestly this is peak sandbox. I remember when transplants got added,
and I took a plant limb, but it didn't heal in light :(
This shattered my immersion and deeply saddened me. Honestly this is why
I started the whole dedatumisation of species tirade.
But it's here. Trans plant plant transplants will heal in light.
Tgstation is saved and all furry downstreams are rebasing.
## Changelog
🆑
add: Taking plant or shadow limbs will now behave as expected! Take a
plant arm, and it will heal in light! Or take plant and shadow limbs and
be in constant agony as you realize this world was not made for you
refactor: Refactors how we handle photosynthesis/nyxosynthesis by moving
it into a new status_effect framework controlled by podyparts
/🆑
## About The Pull Request
We have this cool jingle that used to play when you picked a Final
Objective, however those don't exist any more so this sound is sitting
unused.
I attached it to "selecting your own objective" instead.
## Why It's Good For The Game
Makes you feel like a badass.
## Changelog
🆑
sound: When you set your own objective as a traitor it makes a cool
sound
/🆑
## About The Pull Request
Closes#89617
Prior to progression traitor some items were only available with a
minimum number of (normally 25) players in the round.
These items were:
- The dual esword
- Noslip shoes
- The ebow
- Holoparasite
- Sleeping Carp
- Contractor Kit
- Maybe a couple of others that I forgot to write down
When we moved to a progression system this concept was merged with
reputation; under 20 players your reputation would advance more slowly
thus making these "dangerous" items less obtainable and also serving as
a sort of scaling factor on rewards (with fewer players the secondary
objectives are easier to complete, so the reward is commesurately
lower).
Now that we have removed secondary objectives this doesn't really make
sense any more, so now reputation simply advances at a rate of one
second per second all the time, but that leaves the old population locks
in question.
So... I just recoded items that are only available when there are enough
players


(This iconography simply vanishes once the pop level is reached).
Note that this is based on "players who have joined" (roundstart +
latejoin), not "players who are online" or "players who are alive".
Once an item becomes available it will never stop being available, but
it only becomes available based on people who are playing and not
watching.
Currently the only items I applied this to (with a value of 20 players)
are:
- Dual esword
- Sleeping Carp
- Spider Extract (the spider antagonist usually requires like 27
players)
- Romerol
It isn't applied to anything else.
## Why It's Good For The Game
Reputation isn't really a tool used to designate how dangerous an item
is any more (if it ever was) and resultingly it doesn't make any sense
to slow its gain based on population.
Some items though we maybe still don't want to show up in a "low pop"
round because they'll create an overall unsatisfying experience, so we
should be able to remove those items from play.
## Changelog
🆑
balance: Traitor reputation now advances at a fixed rate, not dependent
on current server population.
balance: The dual esword, sleeping carp scroll, spider extract, and
romerol vial cannot be purchased if fewer than 20 players have joined
the game.
/🆑
## About The Pull Request
Lost heretic blades can be tracked with the living heart
## Why It's Good For The Game
While this is meant to be punishing, having your blades hidden from you
is just not a fun experience at all for the heretic and is kinda lame.
Making them trackable is not a get-out-of-consequences free card, but it
does mean that you at least get a fighting chance at recovering a
portion of your power.
## About The Pull Request
Updated description so you know what's required to cast the ritual.
## Why It's Good For The Game
Whoops.
## Changelog
🆑
spellcheck: Updated the description on a few heretic knowledges to
display the crafting requirements.
/🆑