## About The Pull Request
Basically, if your long and well-thought-out OOC message gets eaten due
to your client not being fully initialized, the server will feed back
the message to you so you can copy-paste and try again.
In order to facilitate this, I turned `validate_client` into a proc.
This didn't have the ubiquitous usage that we were hoping for (where it
could be dropped and placed anywhere) and I don't think I liked the
"always exit out of proc" stuff anyhow. Also adds some code niceties.
There's probably a way cooler way to do this with tgui_say and whatever
but I don't use tgui_say (byond command bar my beloved) so we'll cope
with this.
## Why It's Good For The Game

Let me know if I should revert the `span_big()` stuff, I just added it
because I wanted it to be obvious to the player instead of look like a
generic error message.
## Changelog
🆑
qol: If your OOC message gets eaten due to some weird circumstance in
how your message is handled, it will feed the applicable message back to
you so you can copy-paste and try to send it again.
/🆑
## About The Pull Request
We'd finish a set of atom creation, then try and smooth those atoms The
problem is they might try and smooth with an uninitialized neighbor,
which wouldn't have its smoothing vars parsed.
This fixes that by pooling "to be smoothed" things into a list based off
the source of the init stoppage, which we then release when we're done.
Also fixes things staying in mapload, even during a sleep. This can
cause massive headaches so it's good to avoid.
This has a cost but it's minuscule (on the order of like 0.006s (6ms
over all of init), so I'm happy with it.
## Why It's Good For The Game
Closes#77040
## Changelog
🆑
fix: Maps loaded in after roundstart will no longer have broken
smoothing
/🆑
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request
This is a REALLY hot proc, takes up to like 2% of total cpu at highpop
Let's micro it then
First, clients do not go null at random. It's not predictable per say
but it is consistent.
We can use this understanding to remove a bunch of null checks here
For loops are expensive. So rather then doing one each keyLoop, let's
cache the client's intended move direction on the client. Simplifies
some other code too
There is no sense running a turn call if it would have no effect, let's
be more intelligent about this
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
🆑
refactor: Fucks with how movement keys are handled. Please report any
bugs
/🆑
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
## About The Pull Request
Rather than utilizing `client.color`, client color datums now apply
their colors to the render game plane.
This means
1. The player's HUD is no longer affected by client colors. Being
colorblind (in game) no longer makes all hud elements grey as well, only
the world.
2. Overall, less harsh colors.
## Why It's Good For The Game
1. The player's HUD, being an OOC concept, should remain unaffected by
stuff like glasses and blindness. This is how it worked in the past,
before plane cube (IIRC), but it was lost in the transition.
2. Overall just looks a lot better, IMO.
Here's what meson goggles with glasses colors active looks like:
Before:

After:

## Changelog
🆑 Melbert
qol: Glasses colors should be a lot less harsh, and being blind no
longer also blinds your hud.
/🆑
## About The Pull Request
This PR adds two new config options for quirks:
- *Flag* `DISABLE_QUIRK_POINTS`
- When enabled, disables quirk points balancing.
- When enabled, players can select positive quirks without first
selecting negative ones.
- When enabled, the quirk points balance visually hides itself on the
Quirks page.
- *Number* `MAX_POSITIVE_QUIRKS`
- Limits the maximum quantity of positive quirks which players can
select using the Character Preferences page.
- I ported this from the old `MAX_QUIRKS` define.
- When set to `0`, players won't be able to select any positive quirks,
and they won't appear on the Quirks page.
- When set to `-1`, players will be able to select any quantity of
positive quirks.
- When commented-out or undefined, the default is `6`.
- When set to `0` or `-1`, the positive quirk balance visually hides
itself on the Quirks page.
## Why It's Good For The Game
There is some downstream repositories asking for the quirks system to be
configurable. Additionally, I always find myself tweaking these values
on my own private servers and I thought it would be nice to share my
edits. Usually I was simply commenting-out sections of this code in
order to get the same result, so it helps to have an official way to
disable quirk points.
## Changelog
🆑 A.C.M.O.
config: Added two new config flags for quirks, DISABLE_QUIRK_POINTS and
MAX_POSITIVE_QUIRKS.
/🆑
Pretty self explanatory. I suppose this isn't a 100% fix or refactor,
since it adds a UI for their features and makes it removable, but also
these never happen
🆑
code: The mushroom cap is now an external organ (jungle station will
never happen)
fix: Mushpeople caps are no longer solid black
/🆑
## About The Pull Request
Wrong fuckin name brother (also topic doesn't automake textnums into
nums)
## Why It's Good For The Game
Closes#80020
## Changelog
🆑
admin: Confirming that you have read an admin message now uh, works.
it's been 2 years bros
/🆑
## About The Pull Request
After https://github.com/tgstation/tgstation/pull/80628, these shouldn't
be needed anymore right?
## Why It's Good For The Game
Cleans up some vestigial code
## Changelog
EDIT: Not player-facing.
This PR converts the procs `color_matrix_identity`,
`color_matrix_lightness` and `color_matrix_contrast` into
defines/macros. Also adds in defines for common color matrix filters.
I don't like how `color_matrix_identity` is a one-line proc with no arg.
Also these help people identify the sort of color matrix filter is being
used.
## About The Pull Request
Makes all spritesheets cache by default. This wasn't the case originally
because some spritesheets like vending machines relied on in world
state, but none of them do anymore because that's whack.
Also fixes a bug that would cause half completed caches to break other
stuff. This didn't happen in real gameplay, but would've happened if you
tried to change cachable on anything while you already had a tmp folder.
## Changelog
🆑
fix: Cut down a significant amount of time that caused the start of
rounds to lag.
/🆑
## About The Pull Request
as we added a command role that isn't a head of staff, itd be good to
untie some checks from the command department
so i added a job flag for that, and moved what made sense to different
traits that are added to head of staff minds
## Why It's Good For The Game
revs (the gamemode not the players) shouldnt care about the bridge
assistant existing
## Changelog
🆑
fix: bridge assistant no longer passes some head of staff checks
qol: if you steal a command member's liver, you can now sabre better!
/🆑
## About The Pull Request
FOV as it is currently implemented is incompatible* with wallening.
I'm doin wallening, so we gotta redo things here.
The issue is the masking of mobs. Wallening relies on sidemap (layering
based off physical position), which only works on things on the same
plane (because planes are basically sheets we render down onto)
So rather then masking mobs, let's reuse the masking idea from old fov,
and use it to cut out a bit of the game render plane, and
blur/over-saturate the bit that's masked out.
My hope is this makes things visible in light, but not as much in
darkness, alongside making more vivid shit more easily seen (just like
real life)
Here's some videos, what follows after is the commits I care about
(since I had to rip a bunch of planes to nothing, so the files changed
tab might be a bit of a mess)
Oh also I had to remove the darkness pref since the darkness is doing a
lot of the heavy lifting now. I'm sorry.
Edit:
NEW FOV SPRITES! Thanks dongle your aviator glasses will guide us to a
better future.
https://github.com/tgstation/tgstation/assets/58055496/afa9eeb8-8b7b-4364-b0c0-7ac8070b5609https://github.com/tgstation/tgstation/assets/58055496/0eff040c-8bf1-47e4-a4f3-dac56fb2ccc8
## Commits I Care About
[Implements something like fov, but without the planes as layers
hell](a604c7b1c8)
Rather then masking out mobs standing behind us, we use a combo color
matrix and blur filter to make the stuff covered by fov harder to see.
We achive this by splitting the game plane into two, masking both by fov
(one normally and one inversely), and then applying effects to one of
the two.
I want to make the fov fullscreens more gradient, but as an effect this
is a good start
[Removes WALL_PLANE_UPPER by adding a WALL_PLANE overlay to material
walls (init cost comes
here)](2548933739)
@Mothblocks see this. comment in commit explains further but uh, we need
to draw material walls to the light mask plane so things actually can be
seen on them, but we can't do that and also have them be big, so they
get an overlay. Sorry, slight init time bump, about 0.5 seconds. I can
kill it with wallening.
[Moves SEETHROUGH_PLANE above
ABOVE_GAME_PLANE](beec4c00e0)
I don't think it actually wants to draw here
@Time-Green I think this was you so pinging for opinion
[Resprites FOV masks to be clean (and more
consistent)](f02ad13696)
[f02ad13](f02ad13696)
This is 100% donglesplonge's work, he's spent a week or so going back
and forth with me sharpening these to a mirror shine, real chill
## Why It's Good For The Game
Walls are closing in
## Changelog
🆑 LemonInTheDark, Donglesplonge
image: Redoes fov "mask" sprites. They're clean, have a very pleasant
dithering effect, and look real fuckin good!
del: Changed FOV, it no longer hides mobs, instead it blurs the hidden
area, and makes it a bit darker/oversaturated
/🆑
###### * It's technically possible if we start using render targets to
create 2 sets of sources but that's insane and we aren't doing it
## About The Pull Request
If the station rolls the "Cargo Gorilla" trait, a button will now be
visible on the lobby.
Clicking on this button before the round has started will add you to a
list of participants, one of whom will be selected to become a gorilla
when the round begins.
If nobody signs up (because they're really boring I guess) the job will
instead appear on the latejoin menu.
Once someone has become the gorilla the button will disappear.

While implementing this I noticed that an inverted check means we were
never populating the "GLOB.cargo_sloth" field which means the station
trait wasn't even working.
BEHIND THE SCENES
This also adds a generic "job station trait" which can be expanded in
the future.
Future developers can extend this to add other "rare jobs" with relative
ease.
By default I have made it so all subtypes of this trait are mutually
exclusive, only one can roll at a time.
This also means that I have converted "cargo gorilla" into a job, which
applies most of the code previously located in the mob's typepath or in
the station trait.
The fact that it is a job means that **admins** can enable any number of
gorillas to be present on the latejoin menu (but not the roundstart one,
as it is not possible to add Cargo Gorilla to your occupation
preferences) if they so desire.
The random beurocratic station trait, event, and traitor item (and the
job console) are not able to add gorilla slots.
Because I changed "Cargo Gorilla" to a job it now no longer exists on
the map until a player gains the role, and there wasn't a non-hacky way
to copy the name of this round's cargo sloth. Instead I just added a
small cargo gorilla name list.
## Why It's Good For The Game
Makes the presence of a fun trait more visible to players.
Means that people who aren't observing get a chance to be a monkey.
This is a framework several other people have wanted to exist for their
own features.
## Changelog
🆑 Jacquerel and Fikou
qol: If the station rolls the "Cargo Gorilla" station trait. you will be
able to sign up for the role from the game lobby.
qol: If nobody signs up to be the Cargo Gorilla then you can select it
from the Late Join menu and arrive on the arrival shuttle.
fix: The Cargo Gorilla will actually spawn.
/🆑
## About The Pull Request
Closes#79969
In administration, things shouldn't be _required_ to have unique names.
I think that searching by ckey/key in logs should still work fine but I
can see the value in having the mob tag (which is also exposed in places
like `debug.log`, and in public spots too like `hallucinations.html`)
being added with all this data for even more trimming if you wanna find
all the rule-breaking stuff someone does as a very specific mob.
Anyways, the player details datum tracks both the name as well as the
mob tag in an associated list that we can access in order to do work
with it in stuff like the player panel.
We do this by the following
* Rework the player details list to be associated, as well as updating
all instances of the proc that sets this list.
* Make the code for handling duplicates a bit more explicit so it
actually works.
* Make the formatting in the player panel better as well.
* Also add the mob tag information to wherever we might need to log it
via a new proc `key_name_and_tag()`
* Also adds this information to the per-player player panel
## Why It's Good For The Game
Better administration tools, should be more helpful when it comes to
filtering as well as post-mortem cross-comparison for coders in order to
find out exactly _which_ mob was problematic when looking at debug.log
or whatever you may have.
```txt
[2023-11-28 01:25:37.434] GAME-SAY: San7890/(Katie Yossarian) (mob_2759) (DEAD) "deez nuts" (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:39.478] GAME-SAY: San7890/(Katie Yossarian) (mob_2759) (DEAD) "as big chungus" (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:40.617] GAME: *no key*/(Katie Yossarian) (mob_2759) *no key*/(Katie Yossarian) is no longer owning mob Katie Yossarian(/mob/dead/observer) (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:40.618] GAME-ACCESS: Mob Login: San7890/(Katie Yossarian) was assigned to a /mob/living/carbon/human
[2023-11-28 01:25:40.624] GAME: San7890/(Katie Yossarian) (mob_2760) Client San7890/(Katie Yossarian) has taken ownership of mob Katie Yossarian(/mob/living/carbon/human) (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:42.305] GAME-EMOTE: *no key*/(chasm lobstrosity) (mob_88) chitters. (Lavaland Wastes (126,178,3))
[2023-11-28 01:25:42.435] GAME-SAY: San7890/(Katie Yossarian) (mob_2760) "i hate it here" (Primary Tool Storage (138,140,2))
[2023-11-28 01:25:43.058] GAME-COMPAT: ADMIN: San7890/(Katie Yossarian) admin ghosted.
```


this was taken over three rounds ignore discrepancies
i'm rather fond of having this information in the per-player panel
because otherwise you need to
A) scroll through the F6 window until you find your match
B) pull up three different VV windows
## Changelog
🆑
admin: The Player Panel should now contain the unique mob tag associated
to a certain mob that a player might inhabit at one time, which is
stored on their player details datum on their client (which is
guaranteed to always exist).
admin: The "Old Names" details of a player is now visible in their own
personal per-player player panel.
/🆑
## About The Pull Request
Literally nothing wrote to or accessed this variable, in pretty much
_every_ case we just use `get_area(mob)` instead of ever looking at the
client's area (again, ???)
## Why It's Good For The Game
this variable was added 12 years ago and I don't think anyone has ever
novelly used this.
## Changelog
Doesn't matter to players.
## About The Pull Request
Adds pixel perfect 4x and 4.5x scaling. I tested it and it seems to work
though 4.5 scaling causes very slightly distorted pixel sizes. There's
also a bit of letterboxing but I think that happens with all of the
pixel perfect settings.
## Why It's Good For The Game
better fits 4k monitors and isn't stretch to fit
## Changelog
🆑
qol: adds pixel perfect 4x, 4.5x, and 5x
/🆑
## About The Pull Request
Nuclear operatives now receive an alias for their first name, instead of
a default human name. This alias is randomly selected, or can be set in
your name preferences.

This does not affect Operative Leaders selecting the team's last name.
This means that **operative names are now "[Alias chosen by player]
[Team name chosen by leader]".**
There is a list of default aliases, in case no alias has been selected.
I randomly came up with a bunch of stuff from the top of my head and put
it in a text file. If you think of something better, choose it yourself!
**OH, ALSO:**
There's some hair dye in the Firebase dorms now. Useful if you want to
further differentiate between your Operative/Crew characters, or just
look pretty.
## Why It's Good For The Game
No longer shall nukies be "your character but with a different name".
Now you can give yourself a bit more identity instead of just a random
name.
More customization options means more opportunities for people doing
interesting stuff, and to branch away from the beaten path of boring
meta strats.
## Changelog
🆑 Rhials
add: Nuclear Operatives, in an attempt to appeal to the more "tacticool"
members of their cause, have begun using callsigns to designate
themselves. Check your preferences to set your Operative Alias!
qol: At the request of the more vain members of the cause, hair dye has
been added to the Operative Firebase dorms.
/🆑
## About The Pull Request
Reopened#78997
Larger patch for bitrunning that addresses a few issues.
- Two new antagonists: cyber tac and netguardian
- Quantum server emag opportunity
- Modular mob packs: Like random spawners, but for groups
- Antag spawning fixed: vdom antags now have up to a 10% chance to spawn
based on domains loaded
- Virtual domains are no longer all fullbright by default, only the
outdoorsy ones
- Actually deletes legion map file, since it was removed in #79424
<details>
<summary>images</summary>
The netguardian prime


The glitch effect - this mob is being mutated

Cyber tac (t2 antagonist)

</details>
## Why It's Good For The Game
- Bitrunning antagonists are so incredibly rare that it's underwhelming
to play as one for the solid second they offer if you even get the role
- Bitrunners had basically no traitor route to follow, they became
assistants with black outfits
Fixes#79465
<details>
<summary>More info</summary>
Bitrunners don't have any type of traitor options. If they're made into
traitors, there's nothing bitrunner related they can do, and their
access is particularly bad so it's like they're a worse assistant. I've
coupled this with the bitrunning antagonist system, which is now
fixed.\. Bitrunners can now attempt to coax these entities to come onto
the station, however they are not given any form of allegiance for doing
so (and are quite counterable).
Previously, vdom antagonists relied on so many factors to spawn that it
basically wouldn't happen. Now, it runs on the server each time there is
a map loaded, with increasing probability as the round progresses. This
builds up the list of spawnable antagonists, of which two are new,
including an entirely new giant mech megafauna. This is the first
"megafauna-esque" basic mob in the game. Its AI is bad, it's really only
meant to be player controlled, but this does mean an admin can spawn
them. Being mech, they are very counterable with ion rifles and the
like.
Several refactors, rewrites, and overall bug fixes are included in this
PR.
Lastly, I added a framework for making bitrunner maps more random, the
modular mob spawning system, which works in conjunction with random
crate locations.
</details>
## Changelog
jlsnow301, infraredbaron
🆑
add: Bitrunning Patch 1 features a host of changes!
add: Added randomized mobs to virtual domains, which will be indicated
with a unique icon.
add: New emag interaction with the quantum server. Antags will spawn
more frequently, and they can hack themselves onto the station. You have
been warned.
add: Both living and dead players can now see which mob is going to
spawn an antagonist in the vdom.
add: Two new vdom antagonists: Cyber Tac and the NetGuardian. These
unlock at specific thresholds.
balance: You can no longer stack copies of the same ability with
bitrunning disks.
balance: Some of the disk items have been replaced with stronger
versions.
fix: You can no longer spy on crew using the advanced camera console on
syndicate assault.
fix: Fixed the spawning mechanism of virtual domain antagonists. You
should now have a chance of playing as one. This chance increases as
more domains are completed.
fix: Vdom antagonists shouldn't spawn at the end of the run any longer.
fix: The preference for vdom antagonists has been changed to factor in
the new types. Check your preferences!
fix: The quantum server will now show its balloon alerts to all
observers.
fix: Random domains should be fully random again.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
Title. Adds a little cog button that expands a popper with a preference
list of relevant preferences.
https://github.com/tgstation/tgstation/assets/59709059/5718ad5d-fadb-489f-9a31-9e7173c6f35a
## Why It's Good For The Game
Customizable quirks are cool. Having a proper framework for customizable
quirks is even cooler. Good UX is even COOLER.
## Changelog
🆑
code: Quirks are now customizable on the quirks page instead of on the
character prefs page
/🆑
---------
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
## About The Pull Request
Title.
https://github.com/tgstation/tgstation/assets/59709059/c9fa7d41-6ca4-4b8b-97ec-fdfdd437ce25
## Why It's Good For The Game
The inability to use descriptions in character preferences really limits
the context you can give to readers, which becomes a big problem when
preferences become complicated or laden with policy that must be given
to the reader.
## Changelog
🆑
qol: Character preferences now have descriptions as tooltips - hover
over their names to see them
/🆑
## About The Pull Request
Same vein of #71170 (2d3e7f2383) / #69845
(61d49cb11a) in an attempt to lessen the
number of cruddy "system messages" that just print straight text to
chat.
This could be improved CSS wise but I think a standard examine block
helps a lot while maintaing clarity, see below:

I also heavily refactored adminwho code to not have so much copypasta
while using more `jointext()` and keeping everything a bit more readable
than what it previously was. User-facing stuff should all be the same
(with the addition of an examine block) except in two spots
* Custom header message when no admins are online. I think this is a far
clearer message than having `Current Admins:` and then the message about
adminhelps being relayed to Discord
* There's no tabs per each entry. This was replaced by a bullet point. I
think it's better to read.
## Why It's Good For The Game
As time goes on, I'm more and more peeved by these pretty critical
messages constantly blending in with output from the rest of the game.
This is why balloon_alerts and whatever became so popular to my eyes,
there's just constant junk. I figure that we may as well just keep the
systematic stuff that _must_ live in the chat box looking as neat as
possible.
## Changelog
🆑
qol: Adminwho messages are now in an examine block for heightened
clarity.
/🆑
## About The Pull Request
Adds food allergies as a counterpart to medicinal allergies.
This is about as you would expect. Eating food you are allergic to
causes Anaphylaxis, which can be cured with epinephrine. If you are not
cured rapidly, you will shortly fall into a coma and die.
There is a preference for choosing your character's allergy.
Not all food types are viable allergen types: Only `"Alcohol", "Bugs",
"Dairy", "Fruit", "Grain", "Meat", "Nuts", "Seafood", "Sugar",
"Vegetables"`.
You also get a dogtag like med allergies.
Minor implementation detail: I added a "dangerous" level of food quality
/ scale, so I gave it to the Death Sandwich.
## Why It's Good For The Game
This was a request, and I saw it fairly harmless, so I said why not.
Similar to Medicine Allergy, it adds a small mechanic to concern
yourself with when you visit the kitchen, encouraging you to get a bit
more familiar with food types before diving into food at the kitchen.
As it is not as impactful as Medicine Allergy, it is only a -2 quirk.
## Changelog
🆑 Melbert
add: Adds Food Allergies as a -2 quirk. You can select which food you're
allergic to or rock a random option.
/🆑
## About The Pull Request
Tells the preferences datum to reload the savefile when we associate to
an already existing one
## Why It's Good For The Game
This trolled me locally for a good hour wondering "why aren't my prefs
updating when I swap out the file"
## Changelog
## About The Pull Request
It's exactly 6 months from April 1st, so this is a date for very serious
PRs only.
We've all seen that one tip at the beginning of the round:

So the afro must be really big, right? Having one must be a very large
sacrifice in the realm of pixel-based combat, right?
WRONG.

This is the largest afro currently available. Absolutely pathetic. It's
not even the largest hairstyle in terms of pixel volume.
Here's a bigger one.


The sprite overlaps the tile above by 6 pixels, which is noticeable, but
not enough to interfere significantly with gameplay (apart from having a
sacrificially larger hitbox).

This could already be done by creating a new .dmi file with larger,
non-square pixel bounds, but that's a less than elegant solution.
Instead, added a y offset var to hair sprite accessory datums.
## Why It's Good For The Game
The self-expressive merits of having more hairstyles should be
self-evident, so I will make a mathematical argument here.
Everyone knows that the coolness of an afro is determined by its volume.
As a 2-D sprite, the closet equivalent we have is area. An afro is,
approximately, a circle, so the area can be calculated as πR^2, with R
being the maximum distance from the top of the head to the top of the
sprite bounding box.
The current largest afro has a height of 6 pixels. This new afro has a
height of 12 pixels. As a result, impressiveness increases by a factor
of 4:
```math
coolness_{new\ \ afro} \over coolness_{old\ \ afro}
```
```math
π12^2 \over π6^2
```
```math
12^2 \over 6^2
```
```math
144 \over 36
```
```math
4
```
This means that, for the intrusion of a mere 6 pixels into our northern
neighbor's bounding box, we get **quadruple** the coolness.
## Changelog
🆑
add: Added Afro (Huge) hairstyle
/🆑
---------
Co-authored-by: Cruix <discoveryian2@gmail.com>
## About The Pull Request
Let's see if these can be like 50% playable by Halloween
Fixes#70890 (mostly)
Also one half of #71020 but does not close it because they still cannot
hear audible messages
There was a list of issues in #70890 which are largely fixed by this,
but some of them were not _bugs_.
Anything which is simply an obvious consequence of "not having a head or
being able to wear anything on your head" isn't and cannot be fixed,
because this species doesn't have a head.
That means that all of these things are still true:
```
Dullahans have no radio
Can't get spaceproofed because without the helmet you still take pressure damage
Can't wear modsuits
Can't wear sunglasses or HUDs
Can't wear clown mask
```
The issue causing everything _else_ is that when we sever the head, we
remove the brain. Removing the brain removes the traits
`TRAIT_ADVANCEDTOOLUSER, TRAIT_LITERATE, TRAIT_CAN_STRIP`. Without these
three traits, Dullahans are blocked from several important actions.
Easy fix: Make these properties of the dullahan species independent of
whether they have a brain or not. Clearly they can do these things
without brains, on account of not having them.
Additionally I gave dullahans their own head subtype which preserves
internal organs, because their brains and eyes were decaying and giving
them brain trauma and blindness.
Finally, I changed a few things from checks in `spec_life` to signal
responses, because `spec_life` checks for "did I gain a head recently?"
are gross.
## Changelog
🆑
fix: Dullahans can read, strip people, and utilise tools.
fix: Dullahan brains and eyes will not decay while inside their living
severed head.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Fixes#58401Fixes#58799Fixes#58800
Converts the manual heart-beating effect of the cursed heart into a
component.
Behavior has mostly been maintained, but polished a bit as compared to
the original cursed heart. Most notably, the action for beating your
heart is now a cooldown action - providing a visual indicator of when
you can beat it again, rather than leaving you guessing. Some better
checks have also been put in place for edge cases such as having your
species changed.
Implementation inspired by the existing "manual blinking" and "manual
breathing" components. Currently only used by the cursed heart and the
(now majorly simplified) effect of corazargh.
My first component, so hopefully I didn't miss anything.
## Why It's Good For The Game
The cursed heart was kind of unusably bad - which may have been part of
the intent, but having to count in your head or spam-click the button is
just annoying. With a visual indicator of when you should beat your
heart, hopefully it will be slightly less awful for the cursed.
The real motivation here was that corazargh's implementation was kind of
a travesty - summoning a cursed heart inside of your body while it was
in your system, then restoring your old heart afterward. This was
error-prone as well as just being ridiculous. Making this effect a
component gets rid of these problems, and leaves space open for new uses
of manual heart beating if anyone feels like being cruel.
## Changelog
🆑
fix: Your heart will no longer be deleted if an admin heals you while
you have corazargh in your system.
refactor: The cursed heart has been streamlined a bit, and now gives you
a visual cooldown for when you can beat your heart again.
/🆑
## About The Pull Request
The Prosthetic Limb quirk allows you to pick the limb you want. The
default is still random
## Why It's Good For The Game
Good for character customization, which is always nice. Statics who got
a specific limb replaced can now represent that properly in-game.
Also, this makes the quirk show up on the dummy on the character
customization again. This *does* cause a slight issue where when you
switch to another character, it keeps the previous' skin color, but it's
minor enough that i think the benefits are worth the drawback. If asked
i will make it not appear on the dummy though.
## Changelog
DATA_, with great help from Kapu🆑
add: You can now choose the prosthetic you want with the Prosthetic Limb
quirk.
/🆑
## About The Pull Request
Adds an option to the respawn config which forces you to pick another
character (slot) before you respawn.
## Why It's Good For The Game
Just an idea i'm throwing out there, not necessarily pushing for it to
be enabled on any servers.
Respawning as an alternative character can be a good way to make people
less frustrated at dying, particularly if paired with the cooldown
config that already exists:
"Oh shucks, I died and got my head cut off and got absorbed and got
spaced by some changeling. I won't be able to finish my project or
whatever. At least in 15 minutes I may be able to join as my botanist
character to try something else rather than having to wait an hour and a
half for the round to tick over."
Also nice for downstream support.
(Obviously you can just, *ban* people who respawn as the same character,
use an honor system, but codifying it seems better than not.)
## Changelog
🆑 Melbert
config: Adds a config option for player respawning that enables
respawns, but forces you pick a new character.
config: "NORESPAWN" has been replaced with "ALLOW_RESPAWN 0". Unlimited
respawns is "ALLOW_RESPAWN 1" and character limited respawns is
"ALLOW_RESPAWN 2".
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request

When #16075 was created in the ancient year of 2016, it was a stopgap
solution to plasmamen spawning in with a regular nukie outfits and
burning to death. As a result, nukies have been human-only for the past
seven years. I come to you today to remove the stopgap, and once again
enable non-human nukies.
This was approved in the past (#59590), and I'm assuming that approval
is still valid. Let's take a look at how things work:
Spawning in as a Nuclear Operative (leader included), Lone Operative,
Clown Operative, or Reinforcement will now set your species to the one
if your prefs. That means lizard, cat, plasma, and ethereal nukies are
all on the table now.
Plasmamen now have their own syndicate envirohelm/suit combo. It doesn't
look fantastic (it's just a palette swapped roboticists envirosuit) but
I think it's serviceable at least. When the operative antag datum is
given, and the owner is a plasmamen, they will instead be given an
alternate outfit with these equipped. Loneop plasmamen will instead be
given a MODsuit with the plasma stabilizer MODule installed. These
MODules also spawn in the firebase lockers in case they're needed.
**But what about the AI?** Fortunately for the balancebrains in the
crowd, there is a preference (enabled by default!) to always roll human
as an operative. The AI still has to reasonably assume that nukies are
human until proven otherwise so please don't think this will affect the
rules of engagement for anyone not _directly opting into it._

(This pref will only appear if you have a nukie job enabled in the antag
menu!)
Huge thanks to Melbert who let me peek at his code on a branch trying to
do the same thing. My approach ended up being entirely on the antag
datum, with nothing on the job datum.
## Why It's Good For The Game
Rectifies a curious change made long long ago. Expands customization to
nukies while not affecting balance for those who care.
## Changelog
🆑 Rhials
add: Nuclear operatives have expanded the scope of their hiring
practices. Members of all species can now roll nukie!
qol: The preferences menu now has an option to always be human when
being selected for a nuclear operative role. Check it out!
image: Plasmaman operative envirosuits.
/🆑
## About The Pull Request
Unlocking an achievement now plays a sound. Which sound is played
depends on the associated preference of the player, found in the Sound
category of the game preferences UI.
The current options are a [glockenspiel
ping](https://freesound.org/people/FunWithSound/sounds/456965/), a
[beeps jingle](https://freesound.org/people/Eponn/sounds/619838/) and a
["tada!"
fanfare](https://freesound.org/people/plasterbrain/sounds/397355/), with
the obvious fourth option to not play a sound at all.
All sounds are from Freesound and are public domain. As such,
attributions are not required. The sounds have been also converted to
.OGG mono 44.1 Khz in accordance to the standards.
## Why It's Good For The Game
Enhancing the player feedback for unlocking an achievement with
choosable sounds.
## Changelog
🆑
sound: Unlocking an achievement now plays a sound by default. You can
change it in the Sound category of the game preferences.
/🆑
Current implementation uses isobserver for checking if we should send to
the player but dead players (who are still in their body) are not
observers and will fail that check.
## About The Pull Request
`init_possible_values()` now only ever returns a list of values instead
of both values and icons. The responsibility of icon generation has
moved from this proc to a new `icon_for(value)` proc, which returns the
icon/typepath of an atom. A runtime is thrown if any value does not have
an icon.
This boosts production initialization times by 3+ seconds, but is
primarily done to allow for further optimizations of this process. As an
example, it is a mapping of value -> icon so that in the code that
executes this we can have more fine grained control over tick overrun.
As a bonus, fixes#67092.
## About The Pull Request
The string list is awful for maintainability and is the reason the
filter_invalid_quirks() proc wouldn't work properly.
randomise_quirks() is still broken though.
## Why It's Good For The Game
## Changelog
🆑
fix: Incompatible quirks in existing savefiles shouldn't be possible
anymore.
/🆑
## About The Pull Request
Makes client upload limit a config. Increases max file size admins can
upload to 5mb, up from 2.5mb.
## Why It's Good For The Game
Makes it easier to do custom maps for events. Some of our in-game maps
are already larger than 2.5mb (delta is almost 3mb).
## Changelog
🆑
admin: admins can now upload files to the server up to 5mb (used to be
2.5mb)
config: file upload restriction is now config
/🆑
## About The Pull Request
this pr made me learn to webedit
## Why It's Good For The Game
turns out headmins have interesting functionality, probably good to have
them around
## Changelog
🆑
balance: Re-escalates terry powergaming by increasing the strength of
sec
/🆑
## About The Pull Request
- Adds the ability to force your TTS voice to always be blips, default
is still normal speech
- Probably fixes a bug with silicon voices not transferring properly?
There was an entire argument missing from tts_request/New
- Fixes problems I got from the Docker build not working at all. Only
thing interesting is `--no-cache-dir` which was to fix the container
running out of RAM even though I literally just got 64GB of RAM today
Got permission from @optimumtact as alternative to being able to disable
your voice, CC @Iamgoofball
## Why It's Good For The Game
I spent two hours trying to find a voice that didn't make me
uncomfortable to use and that was even in the realm of being the voice I
would actually want people to hear. Characters still have distinct
"voices" because the blips are chopped together from the voice itself
## Changelog
🆑
add: You can now set your voice to just blips.
/🆑
## About The Pull Request
This PR adds a bunch of sanity checking to the `prefs.chat_toggles` var
accesses.
Prefs can be null when client is creating/deleting and this causes a
runtime where you might not be able to use emotes.

EDIT: as per suggestion I stopped masking the issue and added stack
traces instead. And made them into helper procs to avoid code
duplication.
For some of these procs it is important that we are able to continue
running to get to the end. **A ghost having null prefs should not stop
everyone else from hearing/seeing the emote.**
So now they will put the stack trace and keep on trucking if that issue
occurs. This is the main 'point' of the PR, which has seemingly gotten
bogged down in the creation of the two helper procs--apologies.
See https://github.com/tgstation/tgstation/pull/70404 for essentially
the same issue but applied to chat messages. I have gone back and
replaced the duplicated code from that to use the new helper procs
instead.
## Why It's Good For The Game
Anything chat related is a bad place to runtime. Some messages can take
a while to type out and to have it not display is frustrating at worst,
possibly detrimental if you have to communicate something urgently.
## Changelog
🆑
fix: fixes a bug that can cause emotes to stop working if a client is
being created or deleted
/🆑
## About The Pull Request
I'm adding a unit test for the sanity of client colours, ancient datums
which I had refactored a long time ago. This also affects the
`color_to_full_rgba_matrix()` proc, which I had also worked on.
## Why It's Good For The Game
Ever since that aforementioned years old refactor, there have always
been a few issues with client colours.
The most annoying one being the monochromacy client color lingering even
after the blindness status effect is ok.
It's unlikely this will fix that. However, this should clear a few other
runtimes with the feature.
## Changelog
N/A.
## About Why It's Good For The Game The Pull Request
What it says on the tin. A requested feature for people who like to keep
an eye on swaths of new players. A config that is off by default, but a
Discord role ID can be added to have TGS ping that role.
Also sends alerts to Discord if a player with sketchy telemetry joins.
## Changelog
🆑 Tattle
admin: Pings an admin role on discord when a new player joins (when
enabled by config)
/🆑
---------
Co-authored-by: tattle <article.disaster@gmail.com>
## About The Pull Request
Adds some nice little mouse button indicators (optional), this is a port
of my version at
[Citadel-Station-13/15973](https://github.com/Citadel-Station-13/Citadel-Station-13/pull/15973).
**There is no more intent coloring**
## Why It's Good For The Game
Quick identification of what to do. Eh, i dunno if it's getting
accepted, mothblocks asked me to port it over.
## Changelog
🆑
image: Changed screentips icons to something a lot fancier unified with
the LMB / RMB text.
qol: There are accessibility preferences to disable this! Look for
"Screentip context with images" beside the other screentip preferences.
/🆑
---------
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>