## About The Pull Request
It was caused by `tainted_character_profiles` not being reset upon
`send_full_update()`. To get around this issue, since `ui_data()` has no
way of knowing whether it's a full update or not we will just keep the
list of profiles in memory in the event that tgui gets its copy cleared.
No other functional difference, everything still works the same. It's
just a little more reliable now.
<details><summary>Working as intended</summary>
<img width="1109" height="1054" alt="dreamseeker_2zhIL6owdE"
src="https://github.com/user-attachments/assets/bfb9f7b9-5963-47b9-b726-cc9185e531a8"
/>
</details>
## Changelog
🆑
fix: fixes an issue that would cause the character preferences menu to
bluescreen if you press f5 to reload or used the Refresh-Tgui verb while
it was open
fix: fixes an issue that was preventing a selected new slot from
updating properly
/🆑
## 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
`remove_listener` would fail on logout so instead I figure we could
track the tokens on the mob, rather than the client
Functionally not much is changed - but if you go from ghost to mob it'll
remove the token from the ghost and adds the token to the new mob, so it
should fix the issue
There also doesn't need to be any code in `/mob/destroy` because we
listen for `listener_deleted` and remove listeners on the token itself
## About The Pull Request
This PR moves most of the code for using an item to commit suicide from
`human` to `living`, so that anything with hands can use what it is
holding to commit suicide.
This was surprisingly painless, as most `suicide_act` procs were already
written without the assumption that the person killing themselves was a
human even though they couldn't be anything else.
This might occasionally mean that in some cases (like drones) it may
reference anatomy that they don't have (like necks) but I think that's
not a big deal and don't worry about it.
## Why It's Good For The Game
It's funny.
## Changelog
🆑
balance: Anything with hands can now use the things it is holding to
commit suicide
/🆑
## 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
just macro-izes all the usages of verbs in the codebase as a
pre-requisite to my follow up pr that serializes all the verbs arguments
so we can tgui-ify the command bar, so we can then put it on the
onscreen map.
this also basically does the same as #94487 so can easily be integrated
into the verb queueing stuff... but does not actually do any verb
queueing by itself. basically im just trying to be
https://github.com/tgstation/tgstation/labels/Atomic
## Why It's Good For The Game
it doesn't really do anything by itself but it does let us do more stuff
## Changelog
🆑
code: the backend to all verbs in the game has been played with, please
report any issues to github
/🆑
---------
Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
## About The Pull Request
This PR attempts to somewhat port
https://github.com/cmss13-devs/cmss13/pull/11252
In order to add Wine/Linux CID into an ignore list to stop the
`Your ComputerID has already logged in with another key this round,
please log out of this one NOW or risk being banned!`
Jumpscare message from appearing and log users which connect with
ignored CID's to admins properly.
### Testing the Pull Reuqest
I've attempted to test the PR locally, but I have been unable to
replicate the duplicated CID message, so this might need to be **test
merged** if approved.
In addition, please review the code, my experience with Byond is very
limited so feel free to edit, commit, or requested changes per need.
## Why It's Good For The Game
If two players with the same CID (such as the case with players who play
using Wine), the joining players will get a pop-up saying they are using
the same CID and get a **scary** message that they risk getting banned
for multiboxing if they don't log off.
Experienced game staff, most of the time already know to ignore the CID
`4055623708` which is often thrown by Wine.
However, players could abuse this fact to still and try to multibox for
whatever reason, and even if a legit Linux player uses this CID, giving
the admins a separate log for it is useful, to be distinct from normal
multibox messages.
`MULTIKEYING: [key_name(src)] Connecting player joined with IGNORED CID
[computer_id].`
## Changelog
🆑 Richard Blonski
admin: Added Ignored CIDs, a message will appear when a player joins
with an Ignored CID.
/🆑
## 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!!!
/🆑
🆑
fix: Fixes a hard-del and signal override with sound tokens
/🆑
The comsig issue was basically: both source and listener register for
qdel, but they can be the same thing resulting in a double register.
lame!
the hard-del was caused by me running remove_listener when a client
logged out of a mob...but at that point the client is null...so we cant
clear its sound tokens. boo! not smart!
## About The Pull Request
This pull request implements sound tokens, based on the implementation
by Kapu at https://github.com/DaedalusDock/daedalusdock/pull/1379
I've taken that implementation and extended it to looping_sounds,
allowing us to have spatial audio that updates much more nicely when
players walk closer. This system also lets players that walk into range
after the sound has started playing to also hear the sound, before if
you missed the sound, you would never hear it. This is particularly
noticeable with long sounds (Which is lame!)
**VIDEOS**:
griddle:
https://streamable.com/v7ayqm
engineering / SM:
https://streamable.com/5lr1oj
The system essentially sends the sound to every client, and changes the
volume based on distance to the sound. There are some performance
concerns here, so we will need to testmerge this and see how impactful
it is. It is in a subsystem though, so there is some limit to the amount
of cpu it will use. Do keep this in mind when watching the videos; it
will probably not be AS responsive as in there.
I've also changed how intense our fall-off is, making sounds lose their
volume slower. Before taking one step away from a 50 volume sound would
make it 18 volume, this is way too big of a drop and it became
particularly jarring with the changes in this PR.
Some sounds might be too long range now, but I think we should just
reduce the max range of those sounds as we were basically playing them
at <5 volume after 10 tiles, at which point we should maybe just reduce
the range a bit since at those volumes theyre really not audible.
**OLD FALLOFF;** note the MASSIVE drop from 1 tile to 2 tiles
<img width="1416" height="897" alt="image"
src="https://github.com/user-attachments/assets/805b270e-6aa5-4e84-868e-39585966f0a4"
/>
**NEW FALLOFF:**
<img width="1418" height="905" alt="image"
src="https://github.com/user-attachments/assets/eabbd592-ae9c-4690-8945-fbd0b4f6614f"
/>
Also tweaked a few looping sounds (deep-fryer in particular got some
clean-up, as its mid-length was way too short for the sounds and it had
a double-definition)
## Why It's Good For The Game
This system allows us to have a richer audio experience, I really don't
like how choppy our looping sounds are, especially in some areas where
you hear them a lot (kitchen and engineering)
## Changelog
🆑 CabinetOnFire, Kapu
sound: Changed our falloff to be less intense, as it was punching volume
down way too fast.
refactor: Implements a system for spatial audio to improve our looping
sounds
/🆑
---------
Co-authored-by: mrmanlikesbt <99309552+mrmanlikesbt@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## 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
Fixes a merge conflict between 2 of my stat panel PRs that caused the
'Toggle Stat Panel' button to not work.
Also converts more skin stuff to defines that I missed in the last PR.
## Why It's Good For The Game
Button works wahoo!
## Changelog
🆑
fix: Stat panel's "Toggle Stat Panel" button now works.
/🆑
## About The Pull Request
Ports our optimizations to the version of ghost runechat introduced by
https://github.com/tgstation/tgstation/pull/95223
Instead of looping through all the mobs a second time it will do it in
deadchat_broadcast(). Also adds a global for if drunechat is
enabled/disabled and an admin verb for toggling it on or off.
<details><summary>still works</summary>
<img width="330" height="220" alt="dreamseeker_kkNBPBjbMv"
src="https://github.com/user-attachments/assets/4706ad98-fafe-4f88-9de0-6b72983ab044"
/>
</details>
## Why It's Good For The Game
Better option for performance
## Changelog
🆑
code: speeds ghost runechat up a bit, and makes it show as italic
admin: adds a 'toggle dead runechat' admin verb in case you need to
disable it midround for an event or something
/🆑
## About The Pull Request
Removes Say/Me/OOC/Pray/Whisper as stat panel verbs
1. Adds a hotkey for Pray, P by default, and also adds it to the list of
say modes (so tabbing on tgui-say will show it)
2. Makes Whisper a button on the commandbar, which is literally just
``say "#``, letting players know it exists in a more direct manner.
3. You now need 2 characters to be considered "typing", so `#` for
whisper won't cause you to start to think anymore.
Also messes around with the skin a bit, moving the commandbar to be
separate from the chat window, therefore not resizing if the chat
window/stat panel splitter changes, since I was already messing with the
command bar entirely I might as well look into getting this fixed. This
will go even better with
https://github.com/tgstation/tgstation/pull/95383 as it wont stretch the
command bar when the stat panel is closed.
https://github.com/user-attachments/assets/26cd9df0-7582-445e-9f67-c03d2c9cf46d
Also adds a new Adminhelp submenu for the Pray button for additional
visibility
https://github.com/user-attachments/assets/64f31f86-92a2-4f04-b248-6bbe301919fe
My current goal is the deletion of the IC tab so I've been trying to
inch towards that.
## Why It's Good For The Game
Moves Praying & Whispering into something that's more easily seen by
newer players, and helps cut some of the more useless verbs out of the
stat panel.
This is also part of my project you can see more of here -
https://hackmd.io/443_dE5lRWeEAp9bjGcKYw?view
## Changelog
🆑
qol: Pray verb is now a hotkey, Whisper is now a command bar button, and
all say verbs have been removed from the stat panel.
qol: Admin button on the escape menu is now its own section for praying,
as well as seeing your latest ticket & admin notes.
fix: Resizing the stat panel will no longer change the size of the
command bar.
/🆑
## 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
Add the `ooc_colour` var to a `client`. admins can feel free to set it
to whatever. It will even override other admins ooc colour preferences!
GO be dickheads to each other!
## Why It's Good For The Game
Admin freedom is always good.
## Changelog
🆑
admin: admins can more freely mess with ooc colours
/🆑
Co-authored-by: Josh Powell <josh.powell@softwire.com>
## 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
Removes Object tab, which didn't work as it required a whole reload of
your verbs to update to what verbs would show up in it (which is very
hard to actually trigger as a player), but leaves the verbs that had
them show in the dropdown menu.
Removes the Point-To and Examine verbs from the Stat panel, now it's
commandbar only. Originally only did Point-To, but because the stat
panel sorts itself by the category of the item, then the order of the
name, I had to remove Examine's category so it would remain sorted the
same.
bruuuuuh
<img width="1259" height="985" alt="image"
src="https://github.com/user-attachments/assets/ea89db24-fafd-41d6-939e-4dbc7bbf3828"
/>
<img width="309" height="244" alt="image"
src="https://github.com/user-attachments/assets/3b8d9c52-056b-44ce-8ee8-051439a2fa51"
/>
Removes Server tab for players (not Admins) by moving Show Map Vote
Tallies to the OOC tab, as that was the only verb there.
Activate Held Object has been moved to IC since it's a roundstart verb,
I thought I should leave it be (do we have numbers on how many people
use these? Why would someone use the verb over clicking on the item
in-game or Z? Should I remove this too?).
Admin's Object Possession verbs are now in Admin Fun instead of Object.
Player stat panel
<img width="299" height="194" alt="image"
src="https://github.com/user-attachments/assets/8a3c9ad0-514a-44c5-b023-f71e57de4758"
/>
Admin stat panel
<img width="581" height="224" alt="image"
src="https://github.com/user-attachments/assets/7232485f-af41-469e-abfd-fce066816eec"
/>
<img width="624" height="297" alt="image"
src="https://github.com/user-attachments/assets/6eb540be-4912-44f6-be36-5fe3a74b7f19"
/>
## Why It's Good For The Game
We have 2 tabs that exists for a total of 3 procs, 2 of them fit
elsewhere and the last one doesn't work at all. Most verbs here don't
show up in the stat panel at all for the vast majority of players due to
the stat panel not actually loading them in when it's available, which
to me shows that it's a feature that isn't really cared about anyways.
It also helps newer players because there's less tabs to navigate and
less verbs to sift through, we have a ton of verbs that basically don't
need to exist and they only exist to make looking for the important
verbs a larger hassle.
## Changelog
🆑
del: Deleted Object tab, and Server tab for players. Activate Held
Object verb is now in the IC tab. Examine and Point To was removed from
the stat panel.
admin: Object possession verbs have been moved to Admin Fun.
/🆑
## 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
This is a port/revival of Kapu's
https://github.com/DaedalusDock/daedalusdock/pull/883
By god, please TM this for a while, as HUDs are rather volatile and I
might've missed something (also the original PR had harddel issues, so
we should probably be on the lookout for those)
Instead of being stored in a metric ton of separate variables, all HUD
elements are now kept in a ``key -> element`` assoc list, and separate
category lists have been turned into a single ``group_key -> list of
elements`` assoc list for easier management.
This massively simplifies HUD creation and management, and allows us to
sanely dynamically modify HUDs without having to keep track of our
elements ourselves (harddel fuel)
I've also noticed that plasma vessels had... interesting, to say the
least, way of managing their HUD and in humans were unable to display
it, which I've changed (the element itself is displayed below stamina in
non-aliens, as latter occupies the spot where you'd normally see it)
Also fixes a bunch of minor unlikely to occur issues with HUD not
updating when it should've sometimes.
## Why It's Good For The Game
The two most important results of this is that A) we can fix the issue
with items larger than 32x32 not displaying properly in inventories (in
a separate PR) and B) this paves the way for datumized inventory slots,
although that is a separate nightmare
Some of this code is also actually over a decade old, and is an absolute
nightmare to work with.
## Changelog
🆑
qol: Non-aliens with an implanted plasma vessel now see their plasma
level in their HUD instead of just the stat panel
refactor: Refactored the entirety of HUD management code, report if
anything breaks!
/🆑
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@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
/🆑