## About The Pull Request
Previous attempt was in
https://github.com/tgstation/tgstation/pull/95870 but I got 0 feedback
and it just staled and closed.
Instead of adding it as a secret button I am simply making it so vv
editing the ticker's lobby music will properly update it for everyone.
## Why It's Good For The Game
QoL for admins.
## Changelog
🆑
admin: Changing lobby music now updates for people in the lobby.
/🆑
## About The Pull Request
Simply removes the mutual exclusivity of CSL and Bilingual quirks, since
you can have the other language quirk with CSL but not Bilingual.
## Why It's Good For The Game
If you can have the other language quirk with CSL, why not Bilingual?
## Proof Of Testing
if it compiles it works, submitting via vscode
<img width="525" height="447" alt="image"
src="https://github.com/user-attachments/assets/aaf562a6-3ee5-433e-bbed-924196441bb5"
/>
<details>
<summary>Screenshots/Videos</summary>
</details>
## Changelog
🆑
balance: Removed mutual exclusivity of Common Second Language and
Bilingual quirks.
/🆑
## 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
This ports changes from
https://github.com/NovaSector/NovaSector/pull/6016 and
https://github.com/NovaSector/NovaSector/pull/6398.
- The quirk no longer automatically applies the Genetics power to the
quirk user. Prior to this PR, communication was mostly anonymized and
only _not_ so when one possessed the gene. This presented a clear
downgrade for individuals who had the genetic variant over the quirk
variant. With this PR, communication through the quirk is not anonymous,
but adding the gene on top of the quirk will allow a user to upgrade it
into being anonymous.
- Every time someone uses the quirk everyone else (in sight) will see
where their attention is sent. This does not add a visual cue besides
the warning in the chat, so it's still somewhat discrete.
- Added a new quirk, Psionic Dampener. This blocks most forms of
telepathic communication.
- Telepathy was made multiline for readability.
## Why It's Good For The Game
Currently, Telepathy as a quirk has a discrepancy where non-synths
receive the mutation Telepathy, while synths receive a different
version. The mechanical differences of these created a problem where,
depending on who was using it, this either did or did not anonymize the
identity of the caster. Additionally, these changes allow the quirk
holder who seeks the genetic variant in-round to properly receive the
benefits of such.
Other changes allow people to opt-out of receiving telepathic messages,
in order to avoid negative interactions from those who abuse it.
Multiline telepathy is a desirable feature for the sake of proof
reading.
## Proof Of Testing
<img width="654" height="279" alt="image"
src="https://github.com/user-attachments/assets/056f4d52-5365-4b5f-a422-40791c5e568d"
/>
## Changelog
🆑
add: Added a new quirk Psionic Dampener, affecting telepathy from
quirks, genetics, slimes, xenomorphs, revenants and so on.
balance: Telepathy (Quirk) no longer automatically gives the gene.
qol: The telepathic communication power granted by the quirk or the
genetic power is only anonymous if the caster has the mutation, not the
target.
qol: Telepathy (Quirk) now shows when the user uses the power and on
whom, but not the contents of the message.
qol: Telepathy is now multiline.
/🆑
## About The Pull Request
This Pull Request adds a new logging system that uses a timeline to
track and visualize important events for specific datums.
This is done via a new window in which you can select a datum for
tracking, which adds it to the timeline. If this datum implements the
EVLOGGING macros, it can track important events onto this timeline. As
an example, we can log whenever an AI is deciding to make a new path, if
it decides to generate a new decisionmaking plan, it finishes an action,
or it decides to target someone/something.
We can select these events to see more information, and optionally get a
snapshot of important variables at the time this event was logged (like
the blackboard and current plan for AI controllers).
You can also filter out specific events / track info, which is done via
categories. Each event / piece of track info is given a category and if
you disable a category all events / track info in that category is
hidden. This lets you filter out things you might not care about.
<img width="2346" height="1209" alt="image"
src="https://github.com/user-attachments/assets/0763077c-e349-4c7c-b017-23d29e1d089b"
/>
_whoever thinks we didnt need advanced cleanbot logging is a noob_
In the video below I showcase how this works;
https://file.house/7nsOiqdvmSTxlsk3fs-e8g==.mp4
A cleanbot is roaming the halls, I turn on the event logger, click the
"pick target" button and click on the datum I'd like to track (the
cleanbot). This results in the cleanbot now tracking its events. I spawn
some dirt and the cleanbot decides to clean it, and I go through the
events; You can see theres different events being listed, such as when
the cleanbot starts targetting the dirt, when it cleans plan, when it
makes it JPS path and every time it moves over it.
The macros I've currently implemented are as follows:
**EVLOG_TEXT(DATUM, CATEGORY, INFO)**
Only adds text to the event logger window, no world-visuals
EVLOG_LOCATION(DATUM, CATEGORY, INFO, TURF)
Adds text to the event logger and adds an image to where that turf is.
EVLOG_TURFS(DATUM, CATEGORY, INFO, TURFS)
Adds text to the event logger and adds an image to each turf in the
TURFS list
EVLOG_LINES(DATUM, CATEGORY, INFO, TURF_A, TURF_B)
Adds text to the event logger and adds a line from turf_a to turf_B
EVLOG_PATH(DATUM, CATEGORY, INFO, TURFS)
Adds text to the event logger and visualizes a path from A to B (same
way as the pathfinding debugger, of which I moved the visualization
before to SSPathfinder)
In terms of performance, the logger is a singleton, and events are ONLY
logged if
1. The logger is running
2. The datum has the DF_EVLOGGING flag.
This means most of the time, logging an event is a single var lookup
(Since the runner is off by default). The DF_EVLOGGING flag is off by
default as well and has to be enabled by the event logger, or set
temporarily by a dev in code.
This system can easily be extended with more event types / visualization
types as well. (I'm thinking of datumizing the ones I have now)
The TGUI is still a bit of a mess, I would love some pointers because
I'm not really good at react so I just kind of hit it with a hammer
until it did what I wanted 😎
Also, all of this is based on VisLogging from Unreal Engine, so it will
have some likeness https://unreal-garden.com/tutorials/visual-logger/
## Why It's Good For The Game
This system allows us to debug more complex systems (like basic AI) in
an understandable and clear way. While the implementation cases are not
super common right now, extending this system could make debugging these
systems much more comprehensible, and hopefully lets more developers
help us with improving these systems. (plus, we LOVE timelines)
## Changelog
🆑 CabinetOnFire
refactor: Implements "Event Logging" an improved way for programmers to
debug specific datums.
/🆑
---------
Co-authored-by: Lucy <lucy@absolucy.moe>
## About The Pull Request
kills cargo imports with no mercy, moves it into goodies with
newly-added subcategories
also adds a persi only agent ID single pack per request
also also tarkon and persi can buy private packs via id money
## Why It's Good For The Game
ugly UI that doesn't work for other factions and needs hacks to work
with cargo ui is not great
## Proof Of Testing
<summary>Screenshots/Videos</summary>
<img width="1268" height="1124" alt="image"
src="https://github.com/user-attachments/assets/fd3d9a58-ea0b-4242-88d2-b6123a214c72"
/>
## Changelog
🆑
add: cargo imports moved into it's own category with a brand subcategory
system, and orderable without a private account (god why did i do this)
add: persistence only agent ID single pack
add: persistence and tarkon can now buy stuff via ids directly
add: captain access can always unlock departmental orders
fix: persistence and persistence cargo consoles sending cargo pods to
the station if cargo bay is selected
del: entire cargo company imports system
/🆑
## About The Pull Request
There's a few of these that conflict, mostly relating to timing. This
conflicting won't actually break anything but it does muddy "what is
this doing" somewhat and it's good to be clear so here we go
## Why It's Good For The Game
Makes the MC very slightly harder to confuse yourself with
## About The Pull Request
As it is now, you enable it once, and all the current observers and dead
mobs are removed from the keyloop list.
New ghosts and observers are unaffected entirely.
But the worst part is you can get mobs reviving into their corpses and
being unable to move, requiring admin intervention.
This should fix all these issues. We have procs that always get called
when mobs die or are created, let's just hook into those?
## Why It's Good For The Game
Less admin intervention required for a tool that shouldn't require any
## Changelog
🆑
fix: disable dead keyloop lagswitch measure now properly affects new
ghosts, and fixes an issue where people can revive and still be frozen
/🆑
## About The Pull Request
Introduces a new targeting priority strategy system for basicmob AIs,
which allows controllers to decide which mob to prioritize over others.
Mining mobs will now focus on the NODE drone unless hit, and will pursue
the attacker for 25 seconds before dropping the aggro. They also get
increased aggro if you've attacked other mobs in their view recently,
and after a few hits will have enough aggro to swap to you from the NODE
drone. Ashwalkers get a reduction in aggro because they live there.
Legion broods and brimdemons will immediately target anyone who attacks
their allies rather than waiting for multiple hits. Broods also now
inherit their parent's targets and retaliation/reinforcements lists.
https://github.com/user-attachments/assets/6baaba8a-8b3c-4b2f-ae8b-842f0b1f2b6d
#### This is a bounty for ArcaneMusic
## Why It's Good For The Game
Makes vent defense mob behavior more predictable and easier for players
to manipulate, allowing them to draw aggro from the NODE drone should
make vents more engaging and less of an AI rng fest
## Changelog
🆑
add: Mining mobs now use priority when choosing their target,
prioritizing NODE drones over miners who haven't attacked them or their
allies
/🆑
## About The Pull Request
Removes mutual exclusivity of Hypersensitive and Depressed. Woe.
This is technically a SPLURT port but like
it's two lines and a commented out line so uh
yeah
## Why It's Good For The Game
### _**ULTRADEPRESSION UPON YE**_
(There's no reason these quirks should be mutually exclusive. They
compound against one another, making the other worse. If you want to
have super depression, you should be able to)
## Proof Of Testing
<img width="582" height="288" alt="image"
src="https://github.com/user-attachments/assets/0549b2ee-cef3-4048-81df-2bc33923bd03"
/>
<details>
<summary>Screenshots/Videos</summary>
</details>
## Changelog
🆑
balance: Removes mutual exclusivity of "Depressed" and "Hypersensitive"
quirks.
/🆑
## 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
/🆑
Reverts Bubberstation/Bubberstation#5486
As it turns out, there are far more mood interactions than initially
thought and it is in fact breaking things.
As well as tg adding more and more meaningful interactions for mood it's
not a good idea to keep this right now.
## About The Pull Request
Just the fix parts from #95892Fixes#95876
## Why It's Good For The Game
## Changelog
🆑
fix: metalgen and secret sauce should now generate properly
/🆑
---------
Co-authored-by: l0 <-->
## 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
Adds a free quirk that locks you out of other mood quirks, hides judging
mood face from your screen and moves hunger meter to where mood face
was. All of the negative and positive bonuses are disabled with this
quirk and mood slow down will be replaced with slow down if you are
hungry
## Why It's Good For The Game
I'm huge hater of this feature since the day i started playing this game
and i absolutely despise seeing the mood face on my screen and with this
quirk you will no longer have to worry about some arbitrary mood meter
saying how your character feels like, you can roleplay how you are
feeling like and do whatever you please. and no this is not turbo
broken, the positive mood you can have has way more mechanic value than
having mood always set to neutral so you are locking yourself out of the
positives and negatives
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
<img width="232" height="281" alt="quirk equipped"
src="https://github.com/user-attachments/assets/97108596-4135-411e-86dd-a2fe9d1d864d"
/>
<img width="162" height="276" alt="hungry"
src="https://github.com/user-attachments/assets/a3569085-3581-49b0-8483-807d70203bb4"
/>
<img width="539" height="122" alt="quirk selection"
src="https://github.com/user-attachments/assets/30043354-e36a-4756-80a1-75c87d350907"
/>
</details>
## Changelog
🆑
add: Added new quirk that lets you disable and hide your mood from your
hud
/🆑
---------
Co-authored-by: Copilot <copilot@github.com>
## About The Pull Request
Alternative to https://github.com/tgstation/tgstation/pull/95658 that
involves fewer lines rather than more.
## Why It's Good For The Game
Makes it possible to order crab rockets on the express console without
copypasta. I'm not sure if express consoles are supposed to be usable
for special/emag orders (there was a check against that in the code for
some reason), but because they've had the exact same options of a
standard cargo delivery console for such a long time and because I
haven't found any explicit reason for that to not be the case (in lieu
of that, I found a bit of a reference to homoerotic material in the code
comments), I guess it's fine and nothing bad will happen.
## Changelog
🆑
fix: Packs exclusive to the express console (crab rockets for example)
can now be ordered from express consoles.
/🆑
## About The Pull Request
Continuation of https://github.com/tgstation/tgstation/pull/78857
FOR TOOO LONG WE HAVE SUFF-
Ok yeah so like, we made them overlays to save on maptick, but with
threaded maptick that is potentially not an issue anymore.
I'm opening this pr so I can tm it and see. If it works, it'll save
about 50% of lighting object update costs, which is pretty damn good.
I'm also removing the fullbright light icon state, since it is barely
ever used (it was added as a clientside op, but we don't hit fullbright
very much at all so it does nothing but eat my cpu time)
Also also changing how SSlighting does its resolution. Rather then
waiting for all sources to process, then working on corners and objects,
instead we will do all the sources we had at the start, then all the
sources after, and so on.
The goal is to avoid churn causing the system to constantly choke. it is
better to potentially double operate then it is for things to feel
horrifically slow.
## Why It's Good For The Game
Faster. Also you won't be able to see lights through walls anymore, so
mesons will be less dumb. Can maybe bump their nightvision a bit idk
we'll see.
## Current Issues
to be found
## Changelog
🆑 Absolucy, LemonInTheDark
fix: You can no longer see lights through walls when using mesons or
when ventcrawling.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
This adds a new positive quirk called "**Keen Nose**" that costs 3
points.
It lets you examine any open container with reagents to smell them. It
generates the smell based on the taste description. Also added an effect
to pepper spray, where it causes you to lose your sense of smell
temporarily.
This quirk is blacklisted against the Anosmia quirk, which is the
opposite. (no sense of smell)
## Why It's Good For The Game
Since there is a serious lack of positive quirks, I figured this one
might be useful as a utility quirk. It's a niche thing that could come
in handy. Keep in mind, there are several ways to identify chemicals,
like using the bartender's beer goggles, the science goggles, a chem
machine, or just eyeballing the color. Also, many chems have overlapping
taste descriptions (several different things taste like "death") so it's
not foolproof.
## About The Pull Request
- Fixes#95441
Using the admin shuttle recall command no longer reveals the admins
location.
## Why It's Good For The Game
Less bugs.
## About The Pull Request
Second-choice headrevs after a first choice became indisposed did not
check client preferences.
Also, moves `ROLE_HEAD_REV` define into roundstart section of defines
because it is a roundstart ruleset
## Why It's Good For The Game
fixes#95742
## About The Pull Request
this translates some various
- `FLOOR(x, 1)` -> `floor(x)`
- `CEILING(x, 1)` -> `ceil(x)`
- `SIGN(x)` define is gone, just uses the native BYOND `sign()` now.
Also, the `MODULUS` define is just a wrapper for the [BYOND `%%`
operator](https://ref.harry.live/operator/modulomodulo) now.
would be nice if someone double checked to make sure there's no
potential subtle oddities resulting from this.
## Why It's Good For The Game
These procs presumably did not exist whenever the defines were written -
and they are BYOND builtins, meaning it will just be, say, one `sign`
instruction, instead of two comparisons and a subtraction.
## Changelog
no player-facing changes
## About The Pull Request
Throwing code checked for the obstacle being buckled to the thrown
object, but not vise versa. In some cases (such as riding a mob) this
could cause you to violently crash into your own mount while flying but
still continue your flight.
## Changelog
🆑
fix: Fixed people crashing into their own mounts if they're thrown
together
/🆑
## 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
#94899 did not fix all instances where `pick_roundstart_rulesets` added
rulesets to the list
## Changelog
🆑 Melbert
fix: Fixes wizard, cult, nukies, revs, and malf being unable to be
selected for roundstart antag (yes, you read that right)
/🆑
## About The Pull Request
`ROLE_RECOVERED_CREW` jobban flag was used for recovered crew,
experimental cloner, and now Thantorenasia, but it was never actually an
option in the banning panel. Now it is.
While investigating this, I noticed there was several polls that checked
for an role that you couldn't ban from, so they were either added or
folded into a different preference. (Blood worms, fugitive, fugitive
hunter, paradox clone, glitch, monkey helmet)
## Changelog
🆑 Melbert
admin: Admins can ban from "recovered crew", "blood worm", "fugitive" /
"fugitive hunter", "glitch", and "paradox clone"
admin: Mind Magnification Monkeys are now affected by a sentience ban
(previously unbannable)
/🆑
## About The Pull Request
- `/datum/chemical_reaction/randomized` is now created along with the
main chemical reaction list and not loaded separately inside the
persistent subsystem. This ensures slightly faster init time and less
snowflake code for adding those chemical reactions later on
- Removed vars that are unused inside
`/datum/chemical_reaction/randomized` but keep those that could be
potentially changed for future recipes
- Merged procs and moves loading recipe data into `New()` making the
code clean and slightly faster
- Random reactions now retry 5 times to be re-added when collisions
happen before giving up
- Removed global lists `GLOB.food_reagents` and
`GLOB.medicine_reagents`. This significantly saves memory for global
lists and makes init faster because we no longer create and delete food
items to init the former list
- `/obj/item/paper/secretrecipe` now picks from all valid random recipes
by default making it robust
## Changelog
🆑
refactor: random recipes like metalgen & secret sause have been
refactored. Please report bugs on github
/🆑
## About The Pull Request
We've all been there before. You send the cargo shuttle, you return it
only to find the blast doors were wide open, and air is now venting out
into space, and with the airlock cycling you are now trapped in a
freezing death trap of your own unwitting design.
This is funny and I want us to keep doing this.
But in an effort to continue to offer interesting things for cargo to
buy in a given shift, this PR offers the ability for cargo to buy an
upgrade to the cargo shuttle itself, that being 2 ~~tiny fans~~ Plastic
Flaps that are installed into the shuttle, as denoted by landmarks
mapped into the cargo shuttle.
Upon being picked up, also includes a certificate of installation. to go
onto the shuttle. Honestly, this is mostly so that I can be lazy and not
just spawn an empty crate but Ideally I open this up for future
categories of "cargo upgrades" that just spawn onto the station.
The other feature here is in shuttles having their air refilled on the
way to/from the station, as part of their subscription to air ™️
It's currently offered for the fairly steep price of 8,000 credits.
## Why It's Good For The Game
This is admittedly a luxury purchase, but, for players who are doing
well enough on credits, either through stocks, bounties, shuttle loans,
cargo events, whatever, this is something that players may want to
purchase for peace of mind, while being entirely optional in-game. The
cargo shuttle can be finicky in many ways and can tend towards easy
mistakes causing lots of pressure-related injuries in a round.
Again, this is intentionally offered at a high price point to avoid this
being an automatic purchase early into the round, but also something
that feels like an earned luxury if you have it, allowing you to focus
on your loop of buying and selling items, hustling if you will, without
caring if Larry over there is going to vent the shuttle for the
umpteenth time.
Like other tiny fans, these are not deconstruct-able and intentionally
should be locked to the cargo shuttle in practice.
## 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
Uses `vendor.name` if possible, so it's referred to as "VendingMachine"
rather than "The VendingMachine"
## Why It's Good For The Game
Reads a bit better with all the entries presented
## Changelog
🆑 Melbert
qol: Audit log formats vendors without "the"
/🆑
## About The Pull Request
[Adds a visual tick helper, integrates it into SSmove and
such](https://github.com/tgstation/tgstation/commit/e97035f9f74fad5c67c5bf19d8d5d3bb4bd476b4)
Basically, if we do "stuff" during verb time then the next chance
clients have to actually see it is on the next visual tick (rather then
the normal "this tick"). This is cause clients get their next frame
during maptick, and maptick runs before verbs.
We want to be able to handle this properly because if you say, create an
object and then move it on the same VISUAL tick (NOT game tick), it will
just teleport instead of playing out the move. I don't want this for
stuff like sparks, so we need a way to work around it.
[Moves most users of the _FAST flag to
_INSTANT](https://github.com/tgstation/tgstation/commit/6f96daac00519c69adc7554f52114798a65f3ad5)
These are the kids that don't immediately spawn something and the move
it, and we want to allow them to move actually as soon as possible
(important for stuff like space)
[Improves basic effect systems, makes their products delete when they
stop
moving](https://github.com/tgstation/tgstation/commit/172cb25d80ed34e1ec523172a1677fb524239fba)
Moves some stuff out to getters or vars so children can better decide
how long effects should last/how fast they should move. Uses this to
clean up weird dupe code used by explosions.
Makes all these effects delete on contact with something that stops
them. I'm doing this because an effect just hanging in the air looks
really really odd. Does have consequences for sparks that are already
moving at a wall though, might need a better way to handle that.
Makes all these effects use _FAST loops so they don't just hang in the
air for a second on spawn
Adds a setter proc on sparks for their duration, gonna use this to
improve their effects some
[Refactors overlay lights, adds support for animating their
images](https://github.com/tgstation/tgstation/commit/3ad0083cf2b536df51a6d93dca40eac20c1d62d1)
Implements light_render_source and relevant setters, this allows us to
replace the components of an overlay light with basically whatever we
want
Refactors overlay lighting to handle its images more consistently,
allowing us to hook into an image being modified
Combining the two of these will allow us to consistently copy a light's
image, modify it in some way, and then relay that modification back
down. Allowing us to animate it or do more advanced effects painlessly
Also, fixes ranges of 1 or less not rendering at all on initial set
(thank you kapu)
[In which I get fed up and add a macro helper for UID
generation](https://github.com/tgstation/tgstation/commit/aab48b03d407104d4f9cf9acb034494237def911)
[adds vv hooking for all existing lighting
vars](https://github.com/tgstation/tgstation/commit/b81c6200a0d74c36b440aa3f4c1f22c422090a2d)
[Upgrade effect system's dir picking to avoid duplicates when
possible](https://github.com/tgstation/tgstation/commit/18b622586b509c6be4c4bca4e3e7c175ad75fe91)
[Uses the technique described above to animate spark's lights out as
they
move](https://github.com/tgstation/tgstation/commit/67ba177982213799984a70e89536c5efb3d17e14)
This is a decently nice effect imo, it allows us to bump their power
(read, alpha) since it'll get animated away. I try to sync the animation
to the actual icon state's flow (it's 0.7s long). I also sped them up
somewhat to hopefully have a nicer looking effect? we'll see.
[Abstracts away intercepting overlay lights into a holder
datum](https://github.com/tgstation/tgstation/pull/95362/commits/b3f1fe74f2c3bab1d8912ab8a666bd05677ad032)
This should make it far easier to reuse this pattern!
[Fixes overlay lights flashing to double intensity when picked up off
the
ground](https://github.com/tgstation/tgstation/pull/95362/commits/1d83f2031fa2b33312b2aea4359c0c37c9d04ac7)
We needed to clear out their underlays BEFORE the animation
[Adds a flickering effect to flares and their
children](https://github.com/tgstation/tgstation/pull/95362/commits/b7a858e04a607c58b6c7fbe1476ffe2239e63bde)
I'm still not 100% happy with this, I was trying to avoid it feeling
like a heartbeat with random noise and I.. THINK it worked? it's
honestly quite hard to tell
[Adds the same flickering to lighters, welding tools and life
candles](https://github.com/tgstation/tgstation/pull/95362/commits/3ec44027e17835ae96702cec5f0b12d1f4deb32b)
Also, updated light candles to mirror the appearance of normal candles
and use overlay lighting
EDIT:
I realized while working on flares that I accidentally double applied
color, so if you saw the sparks animations before now it was different
(less vibrant). IDK if I like this better or worse but it is RIGHT and
that's what matters.
## Why It's Good For The Game
I got mad about how bad these looked, and this is a start at improving
them.
Also, adds a framework for more dynamic effects applied to overlay
lights (you could use this to apply a sort of "emergency rotating"
effect, or flicker/buzz for example).
<details>
<summary>Before</summary>
https://github.com/user-attachments/assets/66437f27-ee3c-4f14-a7ee-4a1c3e68533ahttps://github.com/user-attachments/assets/ed14fff8-a7eb-47fe-bab5-9a490ac96629
</details>
<details>
<summary>After</summary>
https://github.com/user-attachments/assets/fb24ff2e-c745-42a5-8e11-c8a1eeef35a5https://github.com/user-attachments/assets/fd8c2116-cb92-4fe6-ad3e-786a6538e52a
</details>
## Changelog
🆑
add: Reworks how sparks render. They're now a bit brighter, will fade
out as they move/if they hit something, will stack with each other less
and also won't start hang in the air on spawn.
add: Added a flickering effect to lighters, welding tools, flares,
torches and candles (since they're flames).
fix: Overlay based lights (think flashlights) will no longer flash to
double intensity while being picked up.
refactor: Reworked how some effects (explosion particles, sparks, some
reagent stuff) function, report any bugs!
/🆑
## 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
Since I'm trying to move away from the stat panel as part of my project
here - https://hackmd.io/443_dE5lRWeEAp9bjGcKYw?view - I thought the
reboot timer should be moved out before the stat panel could be made
optional, due to its importance to post-round players (especially to
know if the round is rebooted).
Once the round is over the whole screen kinda becomes pointless, so we
can take as much screen space as we can.
I put this under the tooltips, using similar behavior to it, like the
layer & outline.
This is inspired by the Goon roundend, which does pretty much 1:1 what
this is.
#### Goon's, for reference:
<img width="1397" height="787" alt="image"
src="https://github.com/user-attachments/assets/309b5d6e-c4dd-4f6f-8b83-2256eecd4569"
/>
#### Ours:
https://github.com/user-attachments/assets/b14efae2-e280-47e9-b3db-f57b2060cce7
It's also non-widescreen friendly
## Why It's Good For The Game
Moving things away from the stat panel and to being more player visible
is a positive IMO.
It's also a necessary step to taking away from reliance away from said
stat panel.
## Changelog
🆑
add: The endround timer telling you when a reboot is happening has been
taken out of the stat panel and is instead text over your screen
(similar to Goon)
/🆑
## About The Pull Request
Contains two changes cherry-picked from my CM PR,
https://github.com/cmss13-devs/cmss13/pull/11826.
1) Fixes incorrect args to `block()` in `increase_max_y()` that caused
it to add turfs to every z-level's world.area contents list instead of
just the correct one. This is probably left over from when the area
contents list wasn't split by z-level.
2) Avoids a case where turfs could be removed from area contents twice
if the subsystem returned early on a later Z-level.
## Why It's Good For The Game
Fixes two bugs with the area contents system.
## Changelog
🆑 MoondancerPony
fix: fixed turfs sometimes not being in any area's contents
/🆑