## About The Pull Request
On the occupations page, there's now a dropdown for characters
You can drag characters to jobs to assign that slot to that job
If you spawn as that job, the game will automatically load that slot
instead of whatever slot you had selected
https://github.com/user-attachments/assets/44c0f45b-46a4-4d2c-9c83-4e9286273bb3
Job preferences are still per-character, but slot assignments are
per-player, meaning they persist across character slots.
Latejoining will ALWAYS use your active character slot even if you join
as a job which you have another slot assigned.
## Why It's Good For The Game
Plenty of people create characters for specific jobs as a gimmick, but
it kind of leaves you as a fish out of water if you roll a different job
as that character
This lets people with these characters roll for as many jobs as they
desire without getting stuck in the lobby - in turn this should
encourage more people to ready up at game start (hopefully).
## Changelog
🆑
add: Allow you to assign character slots to jobs, to load that slot if
you end up selected for that job.
/🆑
## About The Pull Request
1. Redid the formula for calculating mutual language understanding
Old: `base + (10 * (1 - (min(commonness, 1250) / 500)))`, or in other
words `base + 10% to -15%`
New: `base + max(20 - (commonness / 1000) * 20, -5)`, or in other words
`base + 20% to -5%`
2. CSL strength preference has been changed
Old: `"90%", "75%", "50%", "33%", "25%", "10%"`
New: `"75%", "50%", "25%"`
3. If you understand a language partially, the icon in chat is
differentiated slightly
<img width="414" height="30" alt="image"
src="https://github.com/user-attachments/assets/16af293a-698e-4ab8-9638-580920a38543"
/>
(Icon subject to change, it's just a `?` spliced with the icon rn)
4. CSL can now be taken by humans, doing so grants you gal-uncommon
5. Fixed a bug where contractions, due to being encoded, would be
treated as lower frequency / rarer and thus be more likely to be
translated
## Why It's Good For The Game
1. The current formula was a bit too harsh and resulted in more words
being translated than you'd expect. The altered formula should make it
less persistent.
2. These values were tweaked according to the new formula. If I left the
90% value it'd mean like every word would get translated and that
defeats the point.
3. Makes things a bit clearer when it comes to partial understanding.
4. Requested, sounds like fun so why not.
5. Bugfix.
## Changelog
🆑 Melbert
fix: Fixed a bug where contractions were treated as rarer words than
they should be for the sake of partial language understanding
balance: Tweaked the formula of partial language understanding: Less
common words are penalized less, more common words are rewarded more. In
other words more words will be understood on average.
balance: Common Second Language numbers were tweaked according to the
new formula. Now "75%", "50%", "25%".
balance: Humans can now take Common Second Language. Doing so also
grants Galactic Uncommon.
add: Partially understood sentences now get an altered language icon in
chat and runechat, indicating that only some of the words were
translated.
/🆑
## About The Pull Request
Converts all of these random css files to all pull from our department
datums turning this:
<img width="1920" height="1044" alt="image"
src="https://github.com/user-attachments/assets/966d77a3-7382-4ea6-859e-2a57508e28b3"
/>
into this:
<img width="1920" height="1034" alt="image"
src="https://github.com/user-attachments/assets/73fda9cd-8546-42d8-ba60-1135a12b2d6f"
/>
The only real note here is that that purple that prefs use is prob alot
better for sillicon then what the datum uses right now.
## Why It's Good For The Game
I think its horribly bad behavior to have like 10 loose spots you need
to add to if you are trying to add a new
feature/datum/department/whatever. There is a lot of code (mostly old
but some still linger) that does this and its horrible for
maintainability.
There is prob a few other aspects of departments i would like to rework
to tamper down on this but atomization is good.
This also creates a consistent color scheme for jobs instead of using
just like... The default values for "red" for instance. It should make
it easier to tell departments apart across the different menus.
## Changelog
🆑
qol: All panels displaying jobs now use a consistent color pallet
/🆑
## About The Pull Request
Moves `"character_profiles"` out of `ui_static_data()`. We already have
the `tainted_character_profiles` to prevent unnecessary updates, and
this data is not static.
<details><summary>Before, button doesn't update</summary>
<img width="661" height="629" alt="061mR8KEUA"
src="https://github.com/user-attachments/assets/4fc362f5-25e8-42a3-a0f0-4e17418506fd"
/>
</details>
<details><summary>After</summary>
<img width="679" height="639" alt="dreamseeker_vpIRPDgDKp"
src="https://github.com/user-attachments/assets/42f5457c-f471-468b-a391-87a8762d44bd"
/>
</details>
<details><summary>Deletion is functional and updates as well</summary>
<img width="568" height="559" alt="obZYCZ5A1K"
src="https://github.com/user-attachments/assets/a5a375fe-84ca-4b52-99fb-095c149a9c4c"
/>
</details>
<details><summary>Quirks update when switching slots</summary>
<img width="920" height="770" alt="mJJGxYTvPj"
src="https://github.com/user-attachments/assets/6260a862-e59d-4fc7-9ff8-3140e7122283"
/>
</details>
## Why It's Good For The Game
Fixes a bug/oversight
## Changelog
🆑
fix: in prefs menu, changing your character name will now update your
slot button correctly
fix: fixes an issue where switching slots would carry over the quirks of
a previous slot until you add or remove a quirk
/🆑
## About The Pull Request
Closes#96601
Also fixes pref button breaking one of the modes permanently when
swapped within a round, rain not displaying (due to missing overlay
states) when particle weather is disabled, and weather particle plates
having the same name as weather planes (causes dupe entries in the
planecube debugger)
## Changelog
🆑
fix: Radstorms (and other weather) no longer go over your hud on multi-z
maps
fix: Rain is no longer invisible when you have particle weather disabled
fix: Changing the particle weather pref no longer permanently breaks
some weathers for the round
/🆑
## About The Pull Request
Re-did blips to be significantly nicer sounding and way better. Alien
speech you don't understand now comes through as Blips. If you have TTS
entirely disabled, you won't hear blips. Blips also now include more
customization options, and a dedicated Blips preview button by clicking
the leaf icon.
<img width="1749" height="354" alt="ApplicationFrameHost_5nKJEvaNV1"
src="https://github.com/user-attachments/assets/ef6c6b61-7c22-4a87-94c9-be50e89c65bb"
/>
https://github.com/user-attachments/assets/8cab7e55-6370-4e4e-99ba-ea2475569453
Radio TTS has been implemented. By default, you will hear all TTS over
the radio, but will not hear yourself over the radio. You can configure
this in Game Settings.
https://github.com/user-attachments/assets/94a44d84-17a9-4e6e-ac5c-3b800b11c159
<img width="743" height="193" alt="chrome_MOIcXaC2gh"
src="https://github.com/user-attachments/assets/907379b7-0689-486c-b29c-9be0a2259b05"
/>
The new TTS stack is located at
https://github.com/Iamgoofball/tgtts-qwen3 and is AGPLv3 licensed. The
new blips design was inspired by
https://github.com/joshxviii/animalese-typing.
The configuration to disable TTS on whispering has been removed, as it
is no longer needed and also interferes with radio TTS functioning
properly.
The Tram now utilizes TTS, and has had a general audio tune-up.
https://github.com/user-attachments/assets/f532d002-939c-43a1-95d0-0f0c43048997
TTS audio is now 3D and in space, see attached.
https://github.com/user-attachments/assets/b00df49a-9d1d-4b27-a8a0-d103099f5c7e
## Why It's Good For The Game
Quality of life improvements to the TTS system, long overdue. Also, TGMC
can migrate to this new method of doing radio audio so they aren't
sending double the TTS requests anymore.
## Changelog
🆑
add: Added support for Radio TTS. You will now hear players over the
radio via the TTS system.
add: Configure this in Game Options under the Sound tab.
sound: Re-did blips to be significantly nicer sounding and way better.
sound: Alien speech you don't understand now comes through as Blips. If
you have TTS entirely disabled, you won't hear blips.
sound: The Tram and Computers now utilize the TTS system. Configs have
been added to set a consistent voice.
sound: TTS audio now utilizes 3D audio; you can now walk away from
people saying stupid shit and it gets quieter.
sound: Blips also now include more customization options, and a
dedicated Blips preview button by clicking the leaf icon.
del: The configuration to disable TTS on whispering has been removed, as
it is no longer needed and also interferes with radio TTS functioning
properly.
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Lucy <lucy@absolucy.moe>
Co-authored-by: Aleksej Komarov <stylemistake@gmail.com>
## About The Pull Request
Due to a BYOND bug, large amounts of particles will cause immense lag
and framedrops on AMD GPUs, no matter how good the GPU itself is.
Unfortunately this is most noticeable with new particle weather, to the
point where storms reduce framerate to single digits for players who
haven't invested into NVIDIA before the AI market boom.
By rendering overlays twice and only enabling one of the planes, we can
allow players to toggle between new particle weather (semi-transparent
overlays + particles) and old (fully opaque overlays)
Unfortunately we don't have a way to check the player's GPU (at least
not easily) so players will have to change it themselves
https://github.com/user-attachments/assets/0c36fca4-c8a4-42ed-895f-42e853b10f44
(Particle weather is a bit more dense without ghost vision but i'm too
lazy to re-record)
Closes#96460 (Sort of)
## Changelog
🆑
qol: Particle weather can now be disabled in favor of old weather. !!!
AMD GPU USERS NEED TO SWITCH TO OLD WEATHER TO FIX THE LAG!!!
/🆑
## About The Pull Request
Closes#96092
Also added missing midround clowns to alias/species prefs for ops
## Changelog
🆑
fix: Having only midround clown ops (but not normal clown ops) enabled
in antag prefs now displays operative alias/species toggles
admin: Added clown ops to the ban panel
/🆑
## 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>
## About The Pull Request
https://github.com/tgstation/tgstation/pull/95111 introduced code that
threw me off a bit and felt like a bug.
If your physique is set to 'Use Gender', and you change your gender to
plural, for some reason it edits your physique pref to 'Female' each
time. Which leads to a disorienting user experience as you would expect
the physique to change back to male when clicking the male gender icon.
except it never will until you update your physique pref, which on a lot
of codebases you have to scroll down far to find and likely wouldn't see
changing in real time.
I don't see why it's necessary to touch the prefs when the
apply_to_human code already handles everything related to defaulting to
'female' physique.
<details><summary>before (note the Body Type setting on the right hand
side)</summary>
<img width="586" height="397" alt="dreamseeker_F6LzOphJkn"
src="https://github.com/user-attachments/assets/ba87bba1-b3cd-4744-82fd-24185eb4b31f"
/>
</details>
<details><summary>after</summary>
<img width="654" height="583" alt="9Inr4Xbh3b"
src="https://github.com/user-attachments/assets/e5f78417-5886-48e9-ad56-0ce191b45095"
/>
</details>
## Why It's Good For The Game
Prefs which are located in separate panes shouldn't be rewriting
themselves automatically like this. Better UX
## Changelog
🆑
fix: changing your gender choice in character prefs no longer modifies
your physique preference
/🆑
## About The Pull Request
It was me I broke it
## Why It's Good For The Game
Unchecking this should actually hide mismatched parts
## Proof Of Testing
Yes
## Changelog
🆑
fix: fixed mismatched parts toggle doing nothing
/🆑
## 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>
## 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
/🆑
## 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
/🆑
## 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.
/🆑
## About The Pull Request
Ports some bags for roundstart selection from Nova Sector. Same amount
of space as any other bag ever.
## Why It's Good For The Game
Cool bags. Different aesthetics, if desired.
## Proof Of Testing
works on my machine or something. Screenshot below.
<details>
<summary>Screenshots/Videos</summary>
<img width="1287" height="735" alt="image"
src="https://github.com/user-attachments/assets/d7ecf201-1442-4f80-99cd-a116ea04de51"
/>
</details>
## Changelog
🆑
add: Front pack, waist pack and belt pack for selection in character
preferences, found under the regular bag selection. Despite the names,
still equipped on your back.
image: Supporting sprites for the new roundstart bags
/🆑
---------
Co-authored-by: Waterpig <49160555+Majkl-J@users.noreply.github.com>
## About The Pull Request
An easy point for https://hackmd.io/443_dE5lRWeEAp9bjGcKYw?view
Status bar is now a preference instead of a verb in OOC.
I thought I would have to make a migration for this but then I found out
this is straight up just a client verb and doesn't persist through
rounds, so I'm adding that too ig.
## Why It's Good For The Game
This is literally just a pref but as a verb for some reason.
## Changelog
🆑
qol: The Status bar is now a preference instead of a verb in the OOC
tab, which means you can permanently turn it off if you're not a fan (or
use tooltips instead)
/🆑
## About The Pull Request
Converts species and antagonist icon generation to the batched
spritesheet system using IconForge, thanks to the new
`get_flat_uni_icon` implementation. Unfortunately the cost of *building*
the sprite is still expensive (GFI is always expensive, even a fancy
list-based one), but the generation is SIGNIFICANTLY faster. We will see
evidence of parity in the screenshot tests. but here:
<img width="892" height="634" alt="image"
src="https://github.com/user-attachments/assets/2a17f2e3-c024-41f6-9d1e-c2cb70642a81"
/>
The main advantage is that species and antag icons can now take
advantage of the development-time smart cache which invalidates
automatically. On the server this PR does very little except make antag
icon generation a little bit more likely to find and announce errors
(BYOND has a habit of silently eating weird icon proc calls).
Also optimizes the greyscale preview generator from #90940 (~2x speedup)
using `rustg_iconforge_generate_headless` instead of `Insert()` to build
the resulting sheets. This can be further optimized in the future by
implementing a smart cache, like batched spritesheets, and storing it in
the repo, but for now it's not important/slow enough to be worth the
effort. Also fixes a silent compilation error that would always happen
outside unit tests, but for some reason doesn't appear on local? Notice
how `map_icon_key` is not a defined variable anywhere. That's because
`USE_RUSTG_ICONFORGE_GAGS` is *never* defined at this point, so it was
always using the 'slow' generation.
I also took the liberty of cleaning up the cultist and heretic icon
generation randomly initializing a blade object when it could just use a
static access.
## Why It's Good For The Game
The subsystem timing may not be much faster, but the interactivity
benefits during spritesheet realization are undeniable. Opening the
preferences menu during init on local is orders of magnitude faster.
**Old**
Early Assets: 5.02 seconds
Greyscale Previews: 1.38 seconds
**Fresh (No Cache)**
Early Assets: 4.21 seconds
Greyscale Previews: 0.5 seconds
**Cache Invalidated**
Early Assets: 4.27 seconds
**Cache Hit**
Early Assets: 4.05~4.2 seconds
**Preferences lag:**
~6 sec to open to ~2 sec to open due to caching in dev
## Changelog
🆑
code: Optimized species and antagonist icon loading in the preferences
menu on local, speeding up time to open in development.
fix: GAGS map preview generation no longer silently errors outside of
unit tests due to a compilation error.
/🆑
## About The Pull Request
Port of https://github.com/Monkestation/Monkestation2.0/pull/10634
simply makes it so updating a character preference that is unrelated to
character appearance won't regenerate/update the character preview, by
adding a `should_update_preview` var to `/datum/preference`.
## Why It's Good For The Game
Avoids wasting precious tick time on regenerating a whole-ass human and
equipping them when you're just changing your PDA ringtone or whatever.
## Changelog
No player-facing changes, as well, none of these affect appearance
anyways.
## About The Pull Request
Ghosts now have runechat between eachother and when the round's over.
Taken from https://github.com/Monkestation/Monkestation2.0/pull/797
## Why It's Good For The Game
It makes for better screenshots and for messages to not be drowned out
between ghost convo.
## Changelog
🆑 dwasint
qol: Ghosts now have runechat.
/🆑
---------
Co-authored-by: Jordan Dominion <jordanhcbrown+github@gmail.com>
## About The Pull Request
A very small change that slightly improves the keybinds section by
changing the word "Unbound" to "...", also known as the
[ellipses](https://www.thepunctuationguide.com/ellipses.html).
This PR only changes string names, no other mechanics, so everything
else _should_ be working normally. Every string in the code matching
"Unbound" has been changed, including one comment for clarity.
There doesn't seem to be any issue with existing custom keybinds. All of
mine transferred seamlessly, so no one should need to redo their
keybinds.
## Why It's Good For The Game
Better visibility. Rather than playing 'find the numpad bind' scrolling
through a long list of ~100 keybinds, they show up a little easier now.
This is also the standard in other games, but not always an ellipses -
sometimes a double dash "--", but I figured there's already a dash "-"
bind by default (for the A.I. to reconnect to its shell) so the ellipses
might fit better. The ellipses is also commonly used for "awaiting
input" of some kind.

## Changelog
🆑
qol: Keybinding visual improvements: "Unbound" is grayed out and custom
binds are highlighted in green for better visibility
/🆑
This is not politics. Having it be set as not `MALE` or `FEMALE` causes
unsolvable inconsistencies in the code because everything assumes "if
not MALE, then FEMALE" or vice versa.
- Migrated "Use gender" enby body types to female (alert user when this
happens).
- Disabled "Use gender" in prefs menu when enby.
🆑
fix: Fixed some inconsistencies with bodytypes when non-binary genders
had it set to "Use gender". This is no longer possible. If you use have
previously used this setting, your bodytype will be explicitly set to
female.
/🆑
---------
Co-authored-by: Jordan Dominion <Cyberboss@users.noreply.github.com>
## About The Pull Request
Deletes `can_hear`, replaces it with trait-checking deafness.
The only two non-trait sources of deafness (hardcrit and lacking ears)
were refactored into using the trait.
## Why It's Good For The Game
Many places inconsistently check for the deaf trait rather than use
can_hear which meant behavior was not consistent.
Some code would treat "do we lack ears?" as being deaf, some would not.
This unifies all the behavior so being deaf means you're deaf
everywhere.
It also means we can now easily react to gaining and losing deafness via
signal, where before we could not react to it without hooking the trait,
organ remove, AND stat change. Which no one did, of course, because who
would ever think to do that?
## Changelog
🆑 Melbert
refactor: Refactored how deafness is tracked. Please report any weird
interactions with sounds, like messages or sfx being missing.
fix: Lacking ears and being in hard crit now consistently treats you as
"being deaf". This affects a few minor interactions like empath, the
jukebox, and sleeping.
/🆑
## About The Pull Request
Makes you able to see one extra tile to the left/right, making it feel
as if you have a wider screen. But you can also keep the original 19x15
if you want.
## Why It's Good For The Game
I feel like it looks better? Less square? Mode modern and widescreen?
idk. I feel like people will generally like this.
If you think it doesn't look better? stick with 19x15, the choice is
yours.
<details>
<summary>Before</summary>
<img width="1258" height="989" alt="afbeelding"
src="https://github.com/user-attachments/assets/3a7b259c-bd22-4fbd-94f5-6257d2c13772"
/>
</details>
<details>
<summary>After</summary>
<img width="1384" height="989" alt="afbeelding"
src="https://github.com/user-attachments/assets/bdebd573-4920-4cc1-b7be-9d99ef961062"
/>
</details>
## Proof Of Testing
With chatbar because someone told me they were worried the chatbox would
be too small with the change
<details>
<summary>After with chatbar</summary>
<img width="1920" height="1080" alt="afbeelding"
src="https://github.com/user-attachments/assets/55ca42ae-391d-4d38-9069-730669f53c9a"
/>
</details>
<details>
<summary>Before with chatbar</summary>
<img width="1919" height="1030" alt="afbeelding"
src="https://github.com/user-attachments/assets/34b443ea-ffaa-49b7-97d4-baef56f67f01"
/>
</details>
## Changelog
🆑
add: There's a new widescreen dropdown within game preferences, letting
you pick between 15x15 (4x3), 19x15 (widescreen), and 21x15 (ultrawide)
/🆑
---------
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
## About The Pull Request
Adds a slider to the gameplay tab which allows users to control the size
of the emissive bloom.
## Why It's Good For The Game
This is mostly visual and doesn't have a noticeable performance impact,
but some people might find it distracting or might want a stronger bloom
for prettier lights.
## Changelog
🆑
qol: Added a preference to adjust emissive bloom size
/🆑
## About The Pull Request
This defaults every tgui to fancy mode and removes the preference
entirely.
## Why It's Good For The Game
If you look through the code you'll find comments like these
> //some browsers (IE8) have trouble with unsupported css3 elements that
break the panel's functionality, so we won't load those if a user is in
no frills tgui mode since that's for similar compatability support
We're far and away from IE8, therefore our need for compatibility
support, so I think it's valid to remove this so called 'no frills tgui
mode'. It's tied into the event message system with every backend
update, so there's a tad less overhead.
## Changelog
🆑
del: TGUI now defaults to fancy mode, there is only fancy mode. Welcome
to the future.
/🆑
## About The Pull Request
Port of https://github.com/shiptest-ss13/Shiptest/pull/3330
Partial port of https://github.com/shiptest-ss13/Shiptest/pull/1601
Makes two changes to how guns handle recoil.
- Changes recoil from an erratic shaking to a kicking of your screen
relative to your firing angle
- Adds a small cosmetic recoil to all ballistics (with an accompanying
pref option to tweak or disable it)
Primary recoil still is only used as a balance lever for a very small
handful of guns (and sawoff)
## Why It's Good For The Game
Cosmetic recoil makes guns feel a lot more punchier. People who think
its a competitive disadvantage (nerds/loosers) or people with a
legitimate sickness to screen shake or similar can just turn it off.
Old recoil was just reused explosion, while new recoil feels like its
actually recoil
## About The Pull Request
Moves eyes to there own folder and makes it so they state there icon
folder rather then it being hard coded
## Why It's Good For The Game
It felt weird that these are lumped into a file that's mostly hair and
that its hard-coded like this. This makes it easier to sort out icons.
(Thinly veiled downstream support)
## Changelog
N/A
## About The Pull Request
1. Stairs are now on the floor plane, meaning they don't have AO and
blend in with turfs
2. Stairs now blend with adjacent stairs, forming a contiguous sprite
3. There is now a visual indicator that stairs will take you up in the
form of an arrow - The arrow appears when within three tiles and only
appears if the stairs can actually take you up.
https://github.com/user-attachments/assets/d941a312-9470-4d2a-95f0-a1834adf0212
## Why It's Good For The Game
1. The common method of making stairs (stair objects on stair turfs)
looks ugly due to AO
2. Stair turfs have these sprites but not the objects themselves
3. Given stairs now blend in better, I figured there should be a proper
indicator that stairs exist. Helps with fake stair confusion
## Changelog
🆑 Melbert
qol: Stairs now have an indicator that stepping beyond them will take
you upwards. You can disable it in accessibility settings if desired.
image: Stairs blend in and together better.
/🆑
## About The Pull Request
Despite what the code comments said we can rename them and we should
because they make no sense
## Why It's Good For The Game
The save file keys for cat features should have cat in the name and not
human
## Changelog
🆑
server: renamed feature_human_ears and feature_human_tail to
feature_cat_ears and feature_cat_tail respectively
/🆑