Skip to content

Commit

Permalink
Tg jan pull 2 (#360)
Browse files Browse the repository at this point in the history
* Fixes the trimline decal (#88995)

* Automatic changelog for PR #88995 [ci skip]

* Automatic changelog compile [ci skip]

* Ethereals: Standardize defines, lower hunger rate, refactor charging methods (#88960)

## About The Pull Request

Man.

### Standardizing Ethereal Defines

The _single_ biggest issue with all of the recent Ethereal prs has been
that, well, none of our Ethereal defines meaningfully tie to each other,
and as shown repeatedly it's _incredibly_ easy to the others when
changing one of them.
To resolve this, we introduce a `STANDARD_ETHEREAL_CHARGE` define that
every single other Ethereal define is scaled around, which itself is
tied to `STANDARD_CELL_CHARGE`.
Now these can be changed without immediately blowing up everything else,
and with awareness that they tie back to something.

As a side to this, we redefine all reagent-based charge recovery to be
relative to `ETHEREAL_DISCHARGE_RATE` rather than an arbitrary power
level, so it's easier to compare them to how quickly an ethereal
discharges.

### Adjusting Ethereal Defines

Previously, we defined `ETHEREAL_DISCHARGE_RATE` as `8e-3 *
STANDARD_CELL_CHARGE` per second, while defining `ETHEREAL_CHARGE_FULL`
as `2 * STANDARD_CELL_CHARGE`.
With some math, we get that we'd `2 / 8e-3 = 250 seconds`, 4 whole
minutes, to go from full charge to none at all.
It only takes half as much to get hungry, and about 3 minutes to start
taking toxin damage from roundstart.
So we slash this by eight, to `1e-3 STANDARD_ETHEREAL_CHARGE`, giving us
a nice 16-17~ minutes until we're hungry, and another 16-17~ until we
are 100% out of charge. This is also closer to the pre-power-rework
discharge rate.

What made this _worse_ was that the Ethereal APC charge define
`ETHEREAL_APC_POWER_GAIN` wasn't updated to match the current
charge/discharge levels, still being at `10 * STANDARD_CELL_CHARGE`,
which due to how it was coded led to it being impossible for Ethereals
to recharge from APCs.
We first and foremost change this to `0.1 * STANDARD_ETHEREAL_CHARGE`,
which is roughly equal to what it was before the most recent change, and
actually falls in line with Ethereal charge levels.

### Refactoring Ethereal Charge Methods

APC and Power Store recharging were both performing some awkward checks,
which led to our primary issues above, where they would refuse to even
attempt to charge if the stomach couldn't handle a full load or the cell
didn't have a full load.
So we rewrite their entire method to instead check how much can be
charged by taking the minimum of the cell charge, stomach used charge,
and charge-per-step.
We do this instead of just discharging it and taking the return value,
as the stomach may not have enough space for the cell's power, and
that'd get wasted.

This rewrite also allows us to address a small list of bugs.
We keep the `to_chat` for power store draining, as it better
communicates that this method is imperfect than a balloon alert would.

# Testing:<br>I spent an extended period of time looking at Ethereals
slowly starve in front of me with a stopwatch in hand.

## Why It's Good For The Game

Fixes #88934.
Fixes #88977.
16-17~ minutes is a _lot_ more bearable than 2-3~ minutes, and more in
line with discharge rates before the power rework.
Having Ethereal charging stuff actually work is nice.

## Changelog
:cl:
balance: Ethereal hunger rate has been adjusted to be 1/8th of its
previous rate, now taking roughly 16-17~ minutes to go down from full to
normal or normal to none. Ethereal defines have been standardized to
help keep this sane.
refactor: Ethereal APC and power store draining/charging methods have
been refactored. Please report any issues.
fix: Ethereal APC and power store draining/charging no longer
arbitrarily caps out at slightly below or above the max/min.
fix: Ethereal APC draining/charging no longer runtimes when there is no
cell or it gets removed mid-charge.
fix: Ethereals can no longer continue charging their stomach even if it
gets surgically removed from them mid-charge.
fix: Ethereal power store draining actually updated the charge level
overlay.
qol: Ethereal APC and power store draining displays a balloon alert when
it can't continue for whatever reason.
/:cl:

* Automatic changelog for PR #88960 [ci skip]

* ProcArgumentGlobal pragma as error from warning (#88992)

## About The Pull Request
Makes OD2211 as an error since it fixes a byond bug that nobody should
be using
```
New Pragma: OD2211 - ProcArgumentGlobal
A new pragma has been added for detecting this BYOND bug: https://www.byond.com/forum/post/2830750
When a proc argument begins with /var/ instead of var/, it creates a global variable instead of an argument.
/datum/proc/foo(/var/bar = 5)
    return

/proc/main()
    world.log << global.bar // This prints 5 in BYOND

Since this is obviously nonsense, elevating this pragma to an error is strongly encouraged. I have only found it in one SS13 codebase so far.
```

* Changed job post-equip order to fix station trait issues (#88890)

## About The Pull Request

Closes #88692
A bit of a tricky one, this fixes station traits using incorrect names
for jobs. Moved name changing to run before the parent proc, and also
moved comsig after job traits so that it truely runs after job spawning,
not in the middle of the process (in case something removed or changes
job-related traits)

## Changelog
:cl:
fix: Station traits no longer use clown and mime's human names (they're
not human)
/:cl:

* Automatic changelog for PR #88890 [ci skip]

* Fixes chameleon cards not updating sechud icons (#88899)

## About The Pull Request

Closes #88510
Also fixed incorrect icon positioning on Big Brother's trim (Human AI)
and medieval punpun icon flickering

## Changelog
:cl:
fix: Fixed chameleon cards not updating sechud icons
image: Fixed human AI's and medieval punpun's ID trims
/:cl:

* Automatic changelog for PR #88899 [ci skip]

* SaturnX no longer destroys player's retinas (#88906)

## About The Pull Request

This PR reduces the strength of SaturnX's radial blur effect, and makes
it use sine easing instead of extremely jumpy elastic easing.

Before:


https://github.com/user-attachments/assets/3f617916-d6d6-4d03-97f8-8a999d568303

After:


https://github.com/user-attachments/assets/b7333f24-7663-4fb8-89e3-e0c5f3232e7b

## Why It's Good For The Game

Invisibility may be strong, but it also requires you to drop all of your
items, including held ones, to truely be invisible. This filter is too
much of a downside/visual effect and needs to be tuned down, as its
strong enough to make you dizzy just from looking at it.

## Changelog
:cl:
balance: Significatly tuned down SaturnX's visual filter's strength
/:cl:

* Automatic changelog for PR #88906 [ci skip]

* Allows admins to filter observable mobs by ckey (#88922)

## About The Pull Request

Adds ckey sorting akin to how you can look someone up by their name or
job in the observer menu, only available for admins.

## Why It's Good For The Game

Wine said it would be mad useful, no reason not to - they can already
observe people by ckey via the ``Who`` verb, this just adds a cleaner
way to do so.

## Changelog
:cl:
admin: Admins can now filter observable mobs by ckey
/:cl:

* Automatic changelog for PR #88922 [ci skip]

* Improves mindbreaker toxin description (#88990)

## About The Pull Request

Improves mindbreaker toxin's reagent description.

## Why It's Good For The Game

Grammar is hard.

## Changelog
:cl:
spellcheck: Improved mindbreaker toxin description
/:cl:

* Automatic changelog for PR #88990 [ci skip]

* [NO GBP] Blinking no longer stacks lizard overlays (#89015)

## About The Pull Request

update_body_parts_head_only is broken and doesn't clean overlays,
resulting in lizard blinking stacking their frills and snouts
infinitely, breaking the overlay cap and turning them into error
sprites. This is pretty bad for perf as update_body is somewhat
expensive, but this is a hotfix as lizards who emote right now turn
"invisible" as they become walking error sprites

## Changelog
:cl:
fix: Lizards no longer turn into error sprites when blinking
/:cl:

* Fix calibre define text (#89014)

## About The Pull Request

Fixes bug inadvertently reported by forum screenshot.
Two defined ammo calibre strings had underscores in them, however this
are occasionally printed to users and thus can and should just use
spaces.

## Changelog

:cl:
spellcheck: Foam Force's brand management team require us to remove an
erroneous underscore which was in violation of their logo usage terms
and conditions.
/:cl:

* Automatic changelog for PR #89014 [ci skip]

* Fixes all luminescent fluid giving unnaturally red eyes on overdose, instead of just the red one (#89009)

## About The Pull Request

While reading the code to answer a technical question I noticed that
luminescent fluid had its `overdose_start(...)` proc defined twice:

https://github.com/tgstation/tgstation/blob/91981e151c75f3e971951612f161e81f9898f5b8/code/modules/reagents/chemistry/reagents/other_reagents.dm#L3227-L3235

https://github.com/tgstation/tgstation/blob/91981e151c75f3e971951612f161e81f9898f5b8/code/modules/reagents/chemistry/reagents/other_reagents.dm#L3237-L3247
...The latter of which permanently applying the unnaturally red eyes
trait.
Given the proc is defined twice, and the latter comes immediately after
the red subtype that gives the same trait on metabolize, it looks like
it was intended to be for the red subtype only.

This fixes that.
## Why It's Good For The Game

Fixes jank.
## Changelog
:cl:
fix: Only red glowstick fluid gives permanent unnaturally red eyes on
overdose.
/:cl:

* Automatic changelog for PR #89009 [ci skip]

* Fixes custom vendors not displaying custom item names (#88985)

## About The Pull Request

Something that's really bugged me for a while, custom vendors don't
display custom names on items. Nobody cared enough to fix this but me.
Guess you can count on me, eh?

Tested this on my own private server, worked fine. The items still
technically merge by type, so if you place one item with a custom name
first, then another of the same type with no custom name OR with a
different custom name, the newly inserted item's listed name will
override the other until it's bought.

## Why It's Good For The Game

Fixes https://github.com/tgstation/tgstation/issues/84937 /
https://github.com/tgstation/tgstation/issues/83151 (technically)

## Changelog

:cl:
fix: A single enthusiastic chemist hell-bent on selling chemicals to his
co-workers single-handedly solved a programming issue with our custom
vendors. They'll begin displaying custom names (such as those provided
by labels) once more.
/:cl:

* Automatic changelog for PR #88985 [ci skip]

* ink kisses now delete the spawned projectile (#88981)

## About The Pull Request

If you ink kissed a obj there would be a floating ink spit as it did not
delete the projectile. This is now fixed

## Why It's Good For The Game

bugg

## Changelog

:cl:
fix: ink kisses now delete the spawned projectile
/:cl:

* Automatic changelog for PR #88981 [ci skip]

* Deprioritise phobias in two sources of random trauma (#88958)

* Automatic changelog for PR #88958 [ci skip]

* Adds an off-by-default config option to optionally disable TTS audio on whispered speech. (#88826)

## About The Pull Request

Adds an off-by-default config option to optionally disable TTS audio on
whispered speech.
### Ignore the Wallening. It's an old branch and I like to be nostalgic
of what could've been.


https://github.com/user-attachments/assets/f97aad31-9a83-421f-a3f0-0c0e54256664


## Why It's Good For The Game

We're trying to claw back as much performance as possible from our TTS
engine and there's literally no reason to play TTS audio if nobody but
the person speaking into the radio is going to hear it. Requested by the
host. Config is off by default.

## Changelog
:cl:
sound: Adds an off-by-default config option to optionally disable TTS
audio on whispered speech.
/:cl:

* Automatic changelog for PR #88826 [ci skip]

* Add mousetraps cargo crate to service category (#88983)

## About The Pull Request
Low cost cargo crate that is filled with 3 boxes of mousetraps. It's
apart of the service category.

## Why It's Good For The Game
Threatening the rat king with using all the station budget to stop his
army should be achievable. Ordering cats was very disappointing.

## Changelog
:cl:
add: Rat kings across the station tremble in fear since mousetraps have
been added to the cargo crate via service category.
/:cl:

* Automatic changelog for PR #88983 [ci skip]

* Automatic changelog compile [ci skip]

* Heretics dream of objects around unused influences (#89003)

## About The Pull Request


![image](https://github.com/user-attachments/assets/5fee2111-289b-46c6-82f8-096fcfadc50f)


![image](https://github.com/user-attachments/assets/1402896d-4d39-4168-a105-7d28bd199999)


![image](https://github.com/user-attachments/assets/20a7a1fd-3f63-4657-9834-0f568f241490)

Heretics can now traverse Mansus in their dreams to see into the real
world through the perspective of unused essences, if any.

They get a mood debuff for five minutes while doing so, and dream
regularly until recovered.

## Why It's Good For The Game

Essences sometimes spawn in closed locations (like vault, telecomms,
toilet room) and stay untapped till the end of the round.

This change should promote a more covert way of gaining a roundstart
knowledge boost for heretics.

They may dream of completely random and useless objects, but it will
still help them to know that there is still an unused essence somewhere.

## Changelog

:cl:
add: Heretics can now get clues about objects around unused influences
in their dreams, with a 5 minute cooldown
/:cl:

* Automatic changelog for PR #89003 [ci skip]

* Fixes broken instances of overflowY for 516 (#89022)

## About The Pull Request

After updating to 516, I tried messing around with some stuff, and found
the Uplink didn't have a scrollbar. Looking into it, I noticed 515 still
had it, so I looked at what was giving it the scrollbar in the first
place, ``overflowY``, and (with the great help of Aylong) found it was a
problem with the individual UIs using it.
Therefore, I went through all instances of it to make sure they work,
here's all UIs that broke, and what I did.

- Oresilo: Replaced with ``scrollable``, also made it a Section instead
of a Box.
- PersonalCrafting: Uses it twice, first one works as intended, second
one doesn't. Updated to work & changed the UI a bit. Video demonstration
below
- TelecommsMonitor: Replaced with ``scrollable``.
- GenericUplink: Replaced with ``scrollable``, no longer uses auto, so
it's always 'scrollable' even if it's on compact mode.

I changed the Crafting UI so the buttons at the bottom left don't get
cropped out anymore, making good use of our scrollable element.
Before:

https://github.com/user-attachments/assets/de074634-4bb9-4013-ac65-869b05fce2cc

After:

https://github.com/user-attachments/assets/e20a7377-69d2-41d1-a042-f79194dcc6f7

Though this doesn't really do anything, I did test this on 515 just to
be 100% sure nothing breaks.

## Why It's Good For The Game

Scrolling works in these few instances on 516 now, few less things to
deal with later.
I think it's better to use scrollable where ``overflowY`` is not needed
because it's what we use more so it's easier to spot when it breaks in
the future.

## Changelog

:cl:
fix: Fixed the ability to scroll for Ore silo's logging, personal
crafting's material section, telecomms monitors, and traitor uplinks for
clients on 516.
/:cl:

* Automatic changelog for PR #89022 [ci skip]

* Stack crafting images (#89020)

## About The Pull Request
- Stack crafting got images, and a redesign, as it now uses the
ImageButtons component instead of the usual buttons
- Search will no longer stop the character when opening the stack
crafting menu
- Icon into SearchBar component now centered

## Why It's Good For The Game
Images greatly simplify interactions with interfaces, especially those
where it is desirable to see what you are doing (crafting)
So... better UI/UX :high:

## Demostration

![image](https://github.com/user-attachments/assets/0b2b1aab-06eb-4ed4-91f2-eae3b23aac96)

<details><summary> Video with almost all materials </summary>


https://github.com/user-attachments/assets/6e0e90b7-064a-48de-afe9-9e097abaa011

</details>

## Changelog

:cl:
qol: Stack crafting UI got images
qol: Search in stack crafting UI will not take control from you, feel
free to craft on walk
/:cl:

---------

Co-authored-by: Jeremiah <[email protected]>

* Automatic changelog for PR #89020 [ci skip]

* Gives cult's blood barrage unique sprites (#88942)

## About The Pull Request


![image](https://github.com/user-attachments/assets/9b4a2487-2604-4ce0-a2c4-7185c3a68bb4)

It now uses blood bolts instead of mini leaper bubbles for projectiles

## Why Is This Good For The Game

Leaper bubbles look seriously out of place

## Changelog
:cl:
image: Cult's blood barrage has received new sprites
/:cl:

* Automatic changelog for PR #88942 [ci skip]

* One Meta Decal Fix (#89005)

* Fixes bluespace fishing rod issues. (#89016)

* Automatic changelog for PR #89016 [ci skip]

* Fixes fake nuclear disks escaping the digital world. (#89001)

* Automatic changelog for PR #89001 [ci skip]

* Fix emag not working on secure briefcases and safes (#88824)

## About The Pull Request
I swear this functionality existed a while back and got lost due to a
refactor.

Regardless both secure briefcases and safes can now be emagged if either
are locked. I also adjusted the secure briefcase sprite to give it the
glowing green/red button near the handle to indicate when it's locked.
The emag icon is just a few black pixels.

Edit - Turns out I was right and not crazy! Git blame shows this feature
already existing but it got lost when storage components got refactored.

## Why It's Good For The Game
Locks must be broken!

## Changelog
:cl:
fix: Fix emag not working on secure briefcases and safes
image: Tweak secure briefcases sprite to have glowing red/green pixels
for lock. Added broken black pixels to signal briefcase/safe are
emagged.
/:cl:

---------

Co-authored-by: Zephyr <[email protected]>

* Automatic changelog for PR #88824 [ci skip]

* Automatic changelog compile [ci skip]

* [s] Records / PAI patching (#89049)

## About The Pull Request

I don't think the PAI one is actually a major issue but it might be so
I'm just bein safe

Anyways sanitizing input is probably a good

* Adds a barbot seat projector to Wawa's bar (#88923)

## About The Pull Request


![image](https://github.com/user-attachments/assets/6cdf66c6-eb47-4060-bb81-6670e469b3ce)

## Why It's Good For The Game

Map parity, you'd expect to be able to do your job roundstart.

## Changelog
:cl:
fix: Added a barboat seat projector to Wawa's bar
/:cl:

* Automatic changelog for PR #88923 [ci skip]

* Makes icebox's cargo warehouse on par with other stations (#88900)

## About The Pull Request
This makes cargo's warehouse on Icebox overall on par with other
stations, by extending its size and increasing its loot

![image](https://github.com/user-attachments/assets/8aaa6709-3211-4a36-aba4-f109acb36db6)
Previously it looked like this:

![image](https://github.com/user-attachments/assets/4ac3038d-4210-4244-9e3a-0bed43bd0be8)
## Why It's Good For The Game
Gives cargo technicians more of a reason to use it rather than just loot
it all roundstart and leave it to rot away
It also gives them their Big Bess APLU ripley-thing which carries crates
all around the station, this is found on every map except Ice Box until
now.
## Changelog
:cl:
qol: Gives cargo their APLU Big Bess on Ice Box Station
map: Extended and revamped cargo's warehouse on Ice Box Station
/:cl:

* Automatic changelog for PR #88900 [ci skip]

* Fixes wawa's xenobio reagent grinders being inaccessible (#88905)

## About The Pull Request

They get offset by tables already
Closes #88550
Closes #87096

## Changelog
:cl:
fix: Fixed wawa's xenobio reagent grinders being inaccessible
/:cl:

* Automatic changelog for PR #88905 [ci skip]

* Charge up Tram's TCOMMS SMES (#88993)

## About The Pull Request

Replaces the SMES in Tram's TCOMMS room at (105, 080, 1) for a fully
charged variant

## Why It's Good For The Game

Currently without touching the station's main SMESes that supply the
powernet, the SMES in Tram's TCOMMS room remains powered for about 3
minutes with another 1 minute on the APC before it shuts down equipment
power. 4 minutes to attend to the powernet while setting up the SM is
Quite Bad(TM). Replacing the 8% charge SMES for a full variant increases
the time to depower to over 30 minutes, giving the station plenty of
time to communicate and force entry into engineering as the rest of the
station runs out of power around them to rig the engine themselves,
which would be Quite Good(TM).

## Changelog

:cl:
fix: NanoTrasen telecomms technicians operating on Tram class stations
have been reminded not to charge their power tools directly from their
TCOMMS SMES
/:cl:

* Automatic changelog for PR #88993 [ci skip]

* [Icebox] Remaps Tech Storage, Public Mining, and Nearby Maint (#88873)

## About The Pull Request

- Tech storage now sits where Public Mining used to be
- Public Mining now sits where Tech Storage used to be
- The maintenance between Old-tech-storage-now-public-mining and
cargo/telecomms has been reworked

<Details>

<Summary> Pictures Within Click Me Pictures Within Click Me Pictures
Within Click Me Pictures Within Click Me </Summary>


![image](https://github.com/user-attachments/assets/70e61176-b50f-4dc8-ba50-ded285897b6b)


![image](https://github.com/user-attachments/assets/8f7f61b8-7b5c-4593-b2e5-e4ae06f1dbe2)

</Details>

## Why It's Good For The Game

I did this for three primary reasons
1. Public mining on Icebox is weird. It's claustrophobic and weirdly, in
a high security area (the core of the station) when all it really has is
a ladder
2. Tech Storage has not been touched since it was Box. The floor is
still plating for god's ake
3. Secure Tech Storage is extremely extremely unsecure. Back when it was
Box it at least had a space gap, but on Icebox anyone can weld a few
walls/windows and get access to the AI upload / comms console board.

This addresses all of the above. Now, secure tech storage is located on
a lower moat, being slightly harder to penetrate by the average joe, but
potentially more open up to heists (such as by busting in from the back
wall or by attempting to bridge over the moat).

Meanwhile Tech Storage itself can still be breached by cutting one of
the soft walls on either side of the door. It's slightly less stealthy
than before but it already wasn't very stealthy.

Public mining now has a bit more room to stretch its legs as well,
having a bit more of a landing on the second floor than a one tile wide
hallway. This should also help prevent the main hall from being
firelock'd randomly.

## Changelog

:cl: Melbert
add: [Icebox] Reworked Tech Storage
add: [Icebox] Reworked Public Mining
/:cl:

* Automatic changelog for PR #88873 [ci skip]

* Fix a few wall mounted issues on icebox (#88980)

## About The Pull Request

Remove a few instances of duplicated wall mounted items and moves the
light switch in engineering shared storage because it's covered by the
APC.

## Why It's Good For The Game

Gotta click the light switch

## Changelog

:cl:
map: fixed the lightswitch in Ice Box shared engineering storage being
covered by the APC.
/:cl:

* Automatic changelog for PR #88980 [ci skip]

* Metastation cargo maintenence (#88668)

## About The Pull Request
For MetaStation:
Removes a wire that went under a wall between Qm's office and maintence.
Removes a redundent disconected scrubber in the Cargo office
Moves a camera in science lobby so its not eaten by the Experimental
Destructive Scanner when someone scans somthing.
Lavaland:
Connects scrubber in the mini hydroponics to network.
## Why It's Good For The Game

Noticed most of these immeditaly after #87968 was merged just normal
fixs to redundent wires and pipes.
Not sure if AI get messaged when the camera is eaten by machinery but it
probbaly shouldnt be.

## Changelog
:cl:
map: Metastation Science lobby camera moved away form Experimental
Destructive Scanner(It was geting eaten on scan)
fix: Lavaland base hydroponics scrubber attached to its network with
missing pipes
map: Redundent disconnected scrubber in cargo office removed on
Metastation
map : Cable remove from under wall of Qm office on Metastation
/:cl:

* Automatic changelog for PR #88668 [ci skip]

* Updates the Turreted Outpost space ruin (#88957)

## About The Pull Request

Updates the Unnamed Turreted Outpost space ruin


![image](https://github.com/user-attachments/assets/1b60c320-437e-45a1-84e3-938c3e6eb6ea)

Old version:


![image](https://github.com/user-attachments/assets/58c37c44-106e-409e-92db-6ff43a35e23a)

It has received a slight improvement in loot quality (SC/FISHER
disruptor in the armory and a couple of syndicate corpses - one with a
neat black ID!), but also an increase in difficulty in form of more
turrets with heavier armor, and some locked doors! Get those multitools
ready!

## Why It's Good For The Game

Its a rather outdated and plain-looking ruin, last updated when its'
camera bug got replaced with a floppy disk. This should make it look
nicer and more alluring to space explorers.

## Changelog
:cl:
map: Updated the Turreted Outpost space ruin
/:cl:

* Automatic changelog for PR #88957 [ci skip]

* [BIRDSHOT] Turning down the thermostat for a seasonal edge.  (#88931)

## About The Pull Request

Sometimes I like doing a little bit extra for the station, especially
when I find things difficult to figure out (curse you science!). It
helps to at least get something done to reduce friction and let new
ideas flow. This is one of those cases.

## Why It's Good For The Game

Well, it's a small change of scenery that I feel some will get a kick
out of. Not really trying to do the whole Holiday thing, just more like,
hey, it's January, and I'm freezing my butt off since it finally got
cold, and my heater is kaput, lets add some ice to the old gal'. No
doubt that this'll get old in no amount of time, but I'll have something
else ready to go that'll remove this and do something cooler.

So basically you can expect some Snowy decals all around Birdshot until
I unfreeze my ass and shuffle some things on the station map. I need to
work on command a tad bit so I can free up some space for Science, but
that's really not what this PR is about. Enjoy the snow folks!

## Changelog
:cl:
map: Who turned down Birdshots Thermostat?
/:cl:

* Automatic changelog for PR #88931 [ci skip]

* Fixes camouflage implant missing icon (#88907)

## About The Pull Request

Error sprite bad

## Changelog
:cl:
fix: Fixed camouflage implant missing icon
/:cl:

* Automatic changelog for PR #88907 [ci skip]

* Circuit Wirenet Components + Assembly Shell Tweaks (#88593)

## About The Pull Request

Assembly shells now use power from whatever machine/borg/mech/modsuit
they are attached to the wires of, instead of their own power cell, when
appropriate.

As for the meat of this PR, circuit wirenet components function like
NTnet and NFC components, but their signals are transmitted across
whatever cable network the shell (or in the case of assembly shells, the
machine or button it's inserted into) is connected to. These components
are available with roundstart tech.

## Why It's Good For The Game

Provides a somewhat intuitive way to make circuit networks that aren't
dependent on external factors to continue functioning.

NTnet components require a functional NTnet relay, which usually means
they need telecomms to be working. NFC components have a range limit,
and you need to provide a specific reference to the circuit being
communicated with. Wirenet components, on the other hand, just need the
shell to be anchored (or for assembly circuits, the thing whose wire it
is attached to), and for the shell to have a cable under it.

Also might indirectly provide a reason to use cable layers other than
the default one.

## Changelog

:cl:
add: Adds circuit wirenet components, allowing data to be transmitted
and received over cable networks.
qol: When attached to a machine, mech, modsuit, or borg, assembly
circuit shells will use power from those instead of the circuit's own
cell.
/:cl:

* Automatic changelog for PR #88593 [ci skip]

* makes the plasma visor overlay a lighter color and also actually work for modsuits (#88751)

## About The Pull Request

the module doesn't actually show the visor thanks to the fact that the
module is not actually active at any point, which the visor attempts to
check for

also the color of purple was like WAY too dark it was practically black
on every modsuit
## Why It's Good For The Game

it'd be cool if it actually worked and you could actually see it
## Changelog
:cl:
fix: fixes plasma stabilizer module not showing a visor on modsuits
fix: makes the plasma stabilizer module actually visible
fix: makes rave module grey by default as it was meant to be
/:cl:

* Automatic changelog for PR #88751 [ci skip]

* Drastically improves body marking update (and filter performance) by not calling it like 50 times per update call (#89019)

* Automatic changelog compile [ci skip]

* Nuar glasses for detective (#88902)

## About The Pull Request
Adds a pair of nuar glasses in detdrobe premium tab, which makes them
see the world in black and white colors.

* Fixing a small typo within contractor.dm (#89039)

## About The Pull Request

It just fixes a small typo i caught while testing other things on my
private server.

## Why It's Good For The Game

TYPOS BAD. ENGLISH GOOD.

* Automatic changelog for PR #88902 [ci skip]

* Automatic changelog for PR #89039 [ci skip]

* Fixes a barricade balloon runtime (#89043)

## About The Pull Request

balloon_alert is async and thus should not be called on objects that are
about to qdelete

* Automatic changelog for PR #89043 [ci skip]

* Radio examine qol (#89028)

## About The Pull Request

Add `span_class` macro to use instead of <span class='class'> (now only
used for changes I made to radio examine).
Make radio channel tokens info from headset examine more readable by
color coding and displaying it in list format.
Currently set broadcast frequence is also color coded and bold.

## Why It's Good For The Game

It's now easier to understand headset examine info :D

<details>
<summary>
Before
</summary>


![image](https://github.com/user-attachments/assets/6b5d7533-6b8e-47b9-9cd2-7c7a92552ca2)

![image](https://github.com/user-attachments/assets/7fcbde2b-0817-4db6-aca8-d15c17d708be)
</details>

<details>
<summary>
After
</summary>


![image](https://github.com/user-attachments/assets/6e9a7156-9c76-4843-8a45-7fce752a7b27)

![image](https://github.com/user-attachments/assets/50e5fb70-eb18-4fc5-803a-070774c73ccf)
</details>

## Changelog

:cl:
qol: tokens and channel names in radio headset examine are now color
coded and display in list format
qol: broadcast frequency in examine is also color coded
code: add new `span_class` macro
/:cl:

* Automatic changelog for PR #89028 [ci skip]

* Space carp speech includes fish puns (#89033)

## About The Pull Request

This PR adds the fish pun speech filter to space carp.
This was originally added and implemented for crabs and lobsters but it
seems like it should be fine on space fish as well.

Space Dragons don't have this because Dragons are more refined than the
riff-raff and take classes on proper diction.

## Why It's Good For The Game

For some reason space carp can speak common if they are sapient.
Most sapient space carp come from space dragon rifts so it's useful for
them to be able to speak to each other and coordinate.
I think it's kind of weird that they can talk to the crew to be honest,
but it's probably more fun that they can. That said, if they are going
to be able to communicate with the crew then they should have to talk
like a fish.

## Changelog

:cl:
add: Space Carp now have a more distinctive accent when speaking Common.
/:cl:

* Automatic changelog for PR #89033 [ci skip]

* Prevent gibspawners from randomly causing failures with mapping nearstation tests (#89026)

## About The Pull Request

this stops gibs from being streaked from spawners during unit tests, as
there's a chance it might just go into space, causing a mapping
nearstation test failure.

there's already a precedent for the "just disable it during unit tests"
solution with https://github.com/tgstation/tgstation/pull/87878

## Why It's Good For The Game

flaky tests bad :3

## Changelog

no player-facing changes

* Fixes icon spacing in late join ui (#89041)

## About The Pull Request
An alternate to #89040
![Screenshot 2025-01-12
035024](https://github.com/user-attachments/assets/230e599a-8cae-4dba-8dee-4e9975b7a61e)

Refactors the UI
Adds scrollbar to section rather than window so that the title doesnt
disappear
Gives more contrast to the window's main content section
Tooltip now shows closer to the mouse. It was far off in some cases
Functions!
## Why It's Good For The Game
Fixes a ui bug
## Changelog
:cl:
fix: Fixed icon spacing in the late join menu.
/:cl:

* Automatic changelog for PR #89041 [ci skip]

* Cap perceived food quality, fix examine index out of bounds runtime when perceived food quality is too high (#89011)

## About The Pull Request

When going through runtime logs earlier, I noticed the edible
component's examine logic would have an index out of bounds runtime
whenever a lizard were to observe a piece of stinging flatbread.
This seems to be because its `examine(...)` proc would call
`get_perceived_food_quality(...)`, getting an `8`, and then use the
resulting value as an index for `GLOB.food_quality_description`, while
the highest value for such is `FOOD_QUALITY_TOP = 7`.

Trying to find similar issues I noticed `checkLiked(...)` would cap it
to `min(food_quality, FOOD_QUALITY_TOP)` before running anything that
cared about it.
So in this pr we just move that `min(food_quality, FOOD_QUALITY_TOP)`
call into `get_perceived_food_quality(...)` right before it returns,
catching all our potential out of bounds issues.

This fixes our issues.
## Why It's Good For The Game

Fixes jank.
## Changelog
:cl:
fix: Examining edible items with too high of a perceived food quality no
longer runtimes and actually displays a food quality message.
/:cl:

* Automatic changelog for PR #89011 [ci skip]

* Prevents xenobio autoinjectors from being deepfried (#89008)

## About The Pull Request
#82676 Added medipens into deepfryer blacklist as it allowed them to be
filled with custom reagents. Xenobio autoinjectors that are made from
industrial crossbreeds function very similarly to medipens with few
differences. However, they have a different typepath from medipens so
they were not included in the original PR. This adds them into the
blacklist too.
## Why It's Good For The Game
Xenobio autoinjectors are not ment to be filled with custom reagents,
this fixes that.
## Changelog
:cl:
fix: Xenobio autoinjectors, such as mending solution from industrial
purple crossbreed, cannot be deepfried and thus filled with custom
reagents using saltshaker anymore.
/:cl:

* Automatic changelog for PR #89008 [ci skip]

* Fix an icon smoothing runtime caused by shuttles during recursive map loading (#89024)

## About The Pull Request

So, funny thing. The syndie base lazy template loads recursively, as it
contains two shuttle docks (infiltrator and steel rain).

But stationary shuttle docks will immediately load their
`roundstart_template` _asynchronously_ upon Initialize. This can cause
issues - such as the shuttle's atoms being initialized before everything
else is, in a weird way. The usual side-effect of this would be runtimes
resulting from the shuttle's initialized walls trying to smooth with
non-initialized turfs on the template that loaded it.

I simply moved to stationary docking port's async load to
LateInitialize. There's prolly a better long-term solution, but this
doesn't hurt, and solves the relevant issue.

you know i really hope we don't have _3_ layer map templates anywhere.

## Why It's Good For The Game

less runtime good.

## Changelog
:cl:
fix: Fixed an icon smoothing error caused by shuttles during recursive
map loading, i.e the nukie shuttles with their base.
/:cl:

* Automatic changelog for PR #89024 [ci skip]

* Fixes the watcher trophy not working on basic mobs (#88991)

## About The Pull Request
currently, the watcher trophy has no effect on 95% of the lavaland mobs
since theyve all been refactored to basic mobs, this rectifies that

## Why It's Good For The Game
Fixes the watcher trophy not working on basic mobs

## Changelog
:cl:
fix: Fixes the watcher trophy not working on basic mobs
/:cl:

---------

Co-authored-by: Jacquerel <[email protected]>

* Automatic changelog for PR #88991 [ci skip]

* The RCD can print hydroponics airlocks (#89045)

## About The Pull Request

I've noticed that the RCD can print every station airlock type besides
hydroponics, this seems to be an oversight.

It still cannot be used to print science airlocks (not research) as
these do not appear on the station by default, if you want to use these
you'll need to use the airlock painter.
## Why It's Good For The Game

This allows the RCD to print all airlock types that start on the station
by default, fufilling its role as a repair tool.
## Changelog
:cl:
fix: The RCD can print Hydroponics airlocks
/:cl:

* Automatic changelog for PR #89045 [ci skip]

* Aquarium component: fixes admiring, fixes panel context, improves context (#89048)

## About The Pull Request

Admiring was broken, and looking into it, it's because it didn't
actually pass the user as `user` and instead as `source`, which is
supposed to be the aquarium movable.
Changing this fixes our issue.

Then I noticed admiring was kind of jank for fish tanks (item)- you
could right click to admire it, but only if it's not in-hand.
At the same time, you could left click admire aquariums when the panel
is closed, but you _can't_ left click admire fish tanks even when
they're in hand.
So in this pr we actually let you admire fish tanks when in your active
hand, both left click and right click, left click only working if the
panel is closed.

Similarly, the tooltips for such would only get displayed when your hand
were to be empty, so this makes it also account for the held item being
the fish tank.

I also noticed the open/close panel tooltip was inverted, so I inverted
it to be the right way around.
## Why It's Good For The Game

Nice if it works.
Nice if it doesn't feel incredibly jank.
Nice if the tooltips display more.
## Changelog
:cl:
fix: Aquarium/fish tank admiring works again.
fix: Inverted aquarium/fish tank panel opening tooltip to be the right
way.
qol: You can actually admire an in-hand fish tank by clicking on it.
qol: Aquarium/fish tank admiring tooltips are more consistent.
/:cl:

* Automatic changelog for PR #89048 [ci skip]

* [NO GBP] Fixes division by zero runtimes caused by black eyes (#89042)

## About The Pull Request

Fully black eyes caused division by zero in their overlays yeah.

## Changelog
:cl:
fix: Fixed division by zero runtimes caused by black eyes
/:cl:

* Automatic changelog for PR #89042 [ci skip]

* Sanitizes custom vendor inputs, and fixes a division by zero in their examine code (#89036)

## About The Pull Request

Closes #89006
Also fixed a division by zero in very, very weird examine code

## Changelog
:cl:
fix: Custom vendors now sanitize their inputs
fix: Fixed a division by zero in custom vendor code
/:cl:

* Automatic changelog for PR #89036 [ci skip]

* Adds a localhost-only "Start Now" lobby button (#88973)

## About The Pull Request

Adds a new extremely high quality lobby button on which we spent all of
2025's coderbus budget. It shows up only for localhost users and starts
the round immediately.


![image](https://github.com/user-attachments/assets/fdabe880-465e-4e24-9e50-dd955585311b)

## Why It's Good For The Game

Ensures that maintainers don't accidentally commit a funni on live
servers.

## Changelog
:cl:
admin: Added a localhost-only "Start Now" lobby button
/:cl:

* Automatic changelog for PR #88973 [ci skip]

* Corpses with clients in them can no longer perform mech actions (#88959)

## About The Pull Request

Turns out most mech actions only cared about the person attempting to
use them being inside the mech, without checking for things such as the
mob being alive. This fixes that, but required a slight refactoring to
the `ui_status` proc of mechs to account for the three fundamentally
different types of mobs that can pilot a mech.

## Why It's Good For The Game

Fixes #88933

## Changelog

:cl:
fix: Corpses at the pilot seat of mechs can no longer toggle the lights,
safeties, cabin sealing, strafing, overclocking, or durand shields, nor
can they rename the mech or configure its equipment.
/:cl:

* Automatic changelog for PR #88959 [ci skip]

* Updates the same-tile-item ban map lint to clarify it means the same tile and not adjacent tiles (#88949)

this lint confused the hell out of me so I fixed it to be more clear

* Culture bottles now properly copy their cure from the inserted beaker (#88943)

## About The Pull Request

Fixes #46014 by having a newly created culture copy the cures list and
cure_text of the inserted beaker.

## Why It's Good For The Game
Fixes the (somewhat niche) case where a virologist would intentionally
remake a virus until a preferred cure was rolled, only to be surprised
that cultures created from this virus would revert to the first cure
rolled.

## Changelog
:cl:
fix: Culture bottles now properly copy their cure from the inserted
beaker
/:cl:

---------

Co-authored-by: SyncIt21 <[email protected]>

* Automatic changelog for PR #88943 [ci skip]

* machine board naming convention pass (#88888)

## About The Pull Request
Adjusts a bunch of machine board names to comply with the general
machine board naming patterns I see.

First pass just removed a bunch of errant (Machine Board)s that were
still on board names despite them being automatically appended on
initialization, second pass set some board designs to actually have
"Board" on the end to specify that it's a board and not a whole machine.
## Why It's Good For The Game
Machine board naming consistency is probably good, actually.

## Changelog

:cl:
spellcheck: A handful of machine boards should no longer have two
(Machine Board)s showing up in their name.
spellcheck: Boulder machinery boards are now labeled as boards from
autolathes/circuit imprinters.
/:cl:

---------

Co-authored-by: Hatterhat <[email protected]>

* Automatic changelog for PR #88888 [ci skip]

* Fix airlock authentication card not getting stored in containers (#88816)

## About The Pull Request
Trying to insert an airlock auth card into a bag or container would not
work due to a message saying the target must be an airlock. It's now
fixed and should insert into a container regardless if on help or harm
intent.

## Why It's Good For The Game
Consistency.

## Changelog
:cl:
fix: Fix airlock authentication card not getting stored in containers
/:cl:

* Automatic changelog for PR #88816 [ci skip]

* like 5 tiny deathmatch changes (#88812)

## About The Pull Request

you may no longer fish in deathmatch chasms
as a result that means doing literally anything with explosives wont
send 9000000 lobstrosities onto the map
fixed cuban pete loadout macrobomb
lobbies will close after 5 minutes of inactivity
changing map will now make a more accurate number of observers

also removed that useless eye button in the lobby list

## Why It's Good For The Game
6 billion lobstroties because of a firecracker sucks
bug bad
afk empty lobbies bad

## Changelog
:cl:
fix: deathmatch - chasms will no longer do anything when blown up, cuban
pete loadout macrobomb fixed, AFK lobbies will close after 5 minutes,
fixed changing maps incorrectly taking one more observer than it should
/:cl:

* Automatic changelog for PR #88812 [ci skip]

* Improves mind lockbox handling (#89027)

## About The Pull Request

Mind lockboxes have received a tooltip about their in-hand use, but also
can be unlocked by trying to open them normally (clicking on one while
holding it in your offhand). Should reduce the player confusion around
these significantly.

Closes #88999

## Why It's Good For The Game
More intuitive handling of objects is always nice

## Changelog
:cl:
qol: Improved mind lockbox handling
/:cl:

---------

Co-authored-by: Ghom <[email protected]>

* Automatic changelog for PR #89027 [ci skip]

* Changes mob height from getter -> updater (#88953)

## About The Pull Request

`get_mob_height()` is called a lot a lot, and frequently ended up
over-timing when it amounted to the same value 98% of the time.
Instead we can defer it to only update when we actually change height,
or when we pick up a trait or species that changes our height.

I also moved the monkey checks out. Made it into a species procs. I know
species procs are lame but it seems fine unless we wanna tie to the
monkey's chest or limbs or something.

* Automatic changelog compile [ci skip]

* Improves performance of `convert_reagent()` (#89053)

## About The Pull Request
It no longer uses procs like `remove_reagent()` or `has_reagent()`. It
does not even use a typecache & is just faster overall.

Plus bug fix i.e. it currently does not set `override_base_ph = TRUE`
meaning if the converted reagent already exists in the beaker it would
not take into account our new averaged ph & instead use the converted
reagents default ph causing our computed value to have no effect. That's
fixed now

It also now computes the averaged ph of all its converted reagents
rather than simply using our beakers ph giving more realistic results

## Changelog
:cl:
fix: converting reagents now yields more accurate ph values
code: code for converting reagents now performs better
/:cl:

* Fixes a runtime in requests console error logging (#89044)

## About The Pull Request
Target is null so we cannot work with its area, etc etc.

## Changelog
:cl:
fix: Fixed a runtime in requests console error logging
/:cl:

* Automatic changelog for PR #89053 [ci skip]

* show admins classified reports (#89035)

## About The Pull Request

Lets other admins see what you sent in a classified command report.

![image](https://github.com/user-attachments/assets/0029ed80-5a72-4f79-8374-0f00de3acac0)


## Why It's Good For The Game

Admins can see this anyway and I've previously wanted to look this up to
see what another admin is doing.

## Changelog
:cl:
admin: All admins will now see what is in a classified command report
:cl:

Co-authored-by: Josh Powell <[email protected]>

* Automatic changelog for PR #89044 [ci skip]

* Automatic changelog for PR #89035 [ci skip]

* [no gbp] some wawa fixes (#89055)

## About The Pull Request

the west doors of this room can be opened if you have sci access or
maint access
supposedly xenobiologists kept somehow getting stuck here


![image](https://github.com/user-attachments/assets/9aa805b2-de0f-44ab-bfc7-f2441f0fd035)

bci machine is accessible


![image](https://github.com/user-attachments/assets/4dc52513-d458-4845-b853-53ed6985becd)

robotics gets the ripley boards and has 150 iron (most maps) instead of
50


![image](https://github.com/user-attachments/assets/d97ffa58-2030-45e6-848f-b0ade7401111)

botany gets 4 more trays


![image](https://github.com/user-attachments/assets/833e64cd-588b-44d5-8d38-55a482493745)


## Why It's Good For The Game

getting stuck somehow is bad
robotics is now on par with the rest of the stations
botany is also now on par kinda

## Changelog
:cl:
fix: on wawastation, fixed the placement of the BCI machine, the maint
room south of sci break room can be opened by scientists, robotics gets
the ripley boards and 150 iron instead of 50 iron, botany gets 4 more
trays
/:cl:

* Automatic changelog for PR #89055 [ci skip]

* Adds a station_only subtype of Atmospherics/Station Alerts Consoles that only displays station (+mining station) alarms (#88343)

## About The Pull Request
A more proper way to be solving the alarm appearing in #88335 (That PR
still actually makes the alarm read the inside of the booth so its still
important)

As it turns out, Canary already does this - when creating a new
`/datum/station_alert/` to track the alarms, it passes the optional
areas filter included in the datum with a preset of all station areas
plus the mining station areas.

This PR (after a slight rework) adds a Subtype of the monitoring
consoles called `station_only`, which have checks that only display
alarms from the station and miningstation. These replace all pre-mapped
consoles in stations only.
This will mostly be notable on Icebox and other Multi-Z stations, where
ruins will stop polluting the alarm boards and alarms on all levels will
be displayed - and, on other stations, the fact that alarm boards will
now also display the mining station.
<details><summary>z-level vs station_only</summary>


![image](https://github.com/user-attachments/assets/625eeb1a-0dcf-4842-b02d-4d4dcf9fed51)


![image](https://github.com/user-attachments/assets/1627b062-11bd-4f1e-ac3d-f8824018460f)


</details>

Examining the console will display if it's in z-level or station-area
mode, and this can be changed by multitooling the circuitboard (for crew
rebuilding both damaged station consoles, or space ruins)

<details><summary>examines</summary>


![image](https://github.com/user-attachments/assets/3e9d863e-a7f8-4fdf-8545-cf5c2c4b3bf5)

![image](https://github.com/user-attachments/assets/7e06cdc0-8dce-4006-9d75-29f2fb291cab)


</details>

- [x] TO-DO: Fix Station Alerts Consoles not get set up correctly when
rebuilt ~~(the tracking is set up before the circuit can pass on
`station_only`)~~ (Done much cleaner now, thank you Lemon/Potato)
- [x] TO-DO: Test how this behaves with renamed or newly created
areas... (Renamed functions fine, Newly Created is probably better fixed
in the creation code so that it applies to other station area checks.)

## Why It's Good For The Game
Engineering shouldn't need to worry about ruins or otherwise non-station
alarms. Appearing in the station consoles is confusing and annoying to
those who like to see the board green all across.
Plus, they SHOULD be at least slightly worried about the mining station,
or at least able to tell somebody else about alerts there.
Also of course they should just be able to see all of icebox/tram/other
multi-z stations from alert consoles instead of needing to have one
per-zlevel
## Changelog
:cl:
qol: Atmospherics/Station Alerts Consoles can now be set to only display
station (+mining station) areas. Station-mapped ones are set to this by
default. Use a multitool on the circuitboard to toggle between z-level
or station-area tracking!
fix: In turn, Atmospherics Alert Consoles now actually show the whole of
multi-z stations instead of ignoring other z-levels
/:cl:

---------

Co-authored-by: LemonInTheDark <[email protected]>

* Automatic changelog for PR #88343 [ci skip]

* Apc controller in TS (#89067)

## About The Pull Request
1. Adventurebrowser didn't use its state, so this was removed
2. APC Controller console is refactored into typescript. This fixes some
bugs that it had like randomly adding spaces as you changed sorting
methods. It also has been given a new logout screen.

<details>
<summary>photos</summary

Basic screen just shifted around slightly, the tabs now slot onto the
sorting header
![Screenshot 2025-01-14
035545](https://github.com/user-attachments/assets/14fb5490-b9fe-41ba-8726-02a7e5012dcf)

Logout screen updated
![Screenshot 2025-01-14
033848](https://github.com/user-attachments/assets/359ac9fb-58c9-4452-952d-0badde6afd8d)

Logs are now colored
![Screenshot 2025-01-14
035550](https://github.com/user-attachments/assets/73114d90-6747-4827-abe9-7517700cd6fc)
</details>

## Why It's Good For The Game
Removes localstate (deprecated), ui improvements
## Changelog
:cl:
fix: Slight improvements and bug fixes to the APC controller console 
/:cl:

* Automatic changelog for PR #89067 [ci skip]

* You can no longer get stuck in stacked lockers (#89058)

## About The Pull Request

Stacking two lockers ontop of eachother and shoving someone into them
will result in them getting stuck in an open locker, with no way to get
out.

## Changelog
:cl:
fix: You can no longer get stuck in stacked lockers
/:cl:

* Automatic changelog for PR #89058 [ci skip]

* Change layer manifold and smart pipe volumes to be consistent with other pipes (#88976)

## About The Pull Request

Fixes #64109 and Fixes #73127, making the following changes:

- Added a define for the volume of a unary pipe and replaced mentions of
35.
- Added a check to /pipe/New() to allow pipes to specify their volume.
- Changed the specified volume of layer manifolds to 200, consistent
with the value stated on the wiki.
- Changed the volume of smart pipes from a fixed 140 (since they are
always considered quaternary) to be calculated based on the number of
connected nodes, same as before smart pipes were introduced. Volume is
calculated on creation or when the icon updates, and the associated
pipenet volume is updated accordingly.

## Why It's Good For The Game

Non-quaternary pipes were larger than intended and manifolds had zero
volume due to how volume was calculated based on device_type. These
changes improve the consistency of pipe volumes. Also closes #64109 and
#73127.

## Changelog
:cl:
fix: Layer manifold and pipe volumes are now consistent with other pipes
/:cl:

---------

Co-authored-by: Ghom <[email protected]>

* Automatic changelog for PR #88976 [ci skip]

* Fix kinetic accelerator cooldown mods becoming permanent (#88883)

## About The Pull Request

As described in issue #87019, the recharge time reduction given by
proto-kinetic accelerator cooldown modkits can become permanent,
resulting in a PKA with reduced cooldown without any mod capacity cost.
This PR ensures the recharge time is calculated based on the cooldown
kits actually installed, and recalculated whenever one is added or
removed.

## Why It's Good For The Game

Fixes #87019.

## Changelog
:cl:
fix: Fixed PKA cooldown mods becoming permanent
/:cl:

* Automatic changelog for PR #88883 [ci skip]

* Fixes runtime & code for anomaly effects (#89054)

## About The Pull Request
- Fixes #89046. Even though it set `anomaly_type = null` is still set
`drops_core = TRUE` leading to the runtime.
- We now remove `drops_core` var all together. If `anomaly_type = null`
it means we don't drop a core and that's inferred so we don't need this
var to tell us that again

## Changelog
:cl:
code: removes a redundant var from anomaly effects
fix: Fixes runtimes for some anomaly effects
/:cl:

* Automatic changelog for PR #89054 [ci skip]

* Plant Analyzer UI (#88998)

## About The Pull Request

<img alt="KvBypdgg5S"
src="https://github.com/user-attachments/assets/97fc809d-f8ae-48c3-b095-8909ff9f5222"
/>

<img alt="XIZEXhftqE"
src="https://github.com/user-attachments/assets/c769957e-94f9-41ae-9782-c685f3cf0e71"
/>

<img alt="mqOQUslfxP"
src="https://github.com/user-attachments/assets/66397673-d5c7-447e-b994-71643f8e7fe2"
/>

Made the plant analyzer output the scan data into UI instead of spamming
it into the chat.

## Why It's Good For The Game

There is too much data to show it properly in a text chat.

Botanists' chat is usually spammed with the scanning results, so it is
hard to find anything in the message history unless you filter the scan
data into a separate tab.

The new UI also has some explanation of plant stats useful for noobs.

## Changelog

:cl:
qol: Added UI for plant analyzer
del: Plant analyzer no longer spams scan data into the chat (except, it
still works for pod people as before)
/:cl:

* Automatic changelog for PR #88998 [ci skip]

* Admin pda in typescript (#89064)

## About The Pull Request
On a quest to remove uselocalstate while converting files to typescript
Admin PDA also had a bug where textarea was waiting on blur rather than
on input, therefore you couldnt message someone unless you clicked off
the text area, bad UX

It looks the same

![image](https://github.com/user-attachments/assets/5cb90a6f-e93f-421b-8afe-bc25785f3f4b)
## Why It's Good For The Game
Bug fix, typescript, less custom state
## Changelog
:cl:
admin: Fixed a bug with the Admin PDA incorrectly displaying that the
message text wasn't filled out yet.
/:cl:

* Automatic changelog for PR #89064 [ci skip]

* Herignis heats up reagents inside mobs again (#89070)

## About The Pull Request
- Fixes #89065

## Changelog
:cl:
fix: herignis heats up reagents inside mobs again
/:cl:

* Mawed crucible no longer tries to refill when it can't (#89069)

## About The Pull Request

It seems like mawed crucible was gaining charges above the allowed
maximum, and they were used fully when a potion is made, so it was
pointless.

This resulted in the crucible spamming the loud eating noise every 30
seconds even when it has 3/3 charges, and if you want it to shut up, you
could only break it down. And you couldn't use rusty grasp to do this
quickly.

## Why It's Good For The Game

Bug fixes are good.

## Changelog

:cl:
fix: Mawed crucible doesn't try to gain charges when they're at maximum
/:cl:

* Automatic changelog for PR #89069 [ci skip]

* Department orders credit reward and cooldown time now use a logarithmic scale (#88797)

## About The Pull Request

This PR makes the reward and cooldown for departmental orders scale with
crate cost using a logarithmic scaling, instead of comparing the price
to preset thresholds for time, or awarding the same amount as the
crate's cost.

Previously, to calculate the cooldown time, the code was calculated via
the following manner:

```
credits = clamp(credits, min, max)
time_y = 10 MINUTES * ((credits - min)/(max - min) + 1) 
```
Minimum was 320 credits, max was 3000, thus, all crates slid around
between 10 minutes to 20 minutes.

The reward for delivering the crates was the same as the crate's value.
This meant ordering egregiously expensive crates, far beyond 3000 was
way too desirable.

This PR changes both to use logarithmic scaling.

Cooldown time uses `60* log(price)^2.2`, and reward uses `140 *
log(price)^1.4`.

**Cooldown analysis**
At 320 it's 7.54 minutes, at 1400 it's 12.44 minutes, at 3000 (around
gun crates) it's 15.5 minutes, at 8000 (hat crate) 20 minutes, at 9000
(expensive atmos cans) it's 20.58 minutes, and at the 20k crate it's
24.76 minutes.

**Crate rewards analysis**
At 320 it's 475 credits, at 1400 it's 669 credits, at 3000 (around gun
crates) its 778, at 8000 (hat crate) it's 925 credits, at 9000
(expensive atmos cans) it's 943 credits, and at the 20k crate it's 1070
credits.

Up to 540 credits, you are actually getting a higher reward than what
the crate costs, but this is okay, as its a reward for delivering
simpler orders. A little surplus for you.

For the console UI, I have made items costing 3000 or more display
Moderate, and items costing 8000 or more, Long cooldowns.

## Why It's Good For The Game

Ordering really expensive crates should be a luxury, not a way to
generate money. The money is supposed to be a bonus, in addition to the
free crate to sell. Using a logarithmic scale, the credit bonus is
reigned in more evenly, making it more predictable for economy tweaking,
and avoids players double dipping credits in their free purchase.

Decreasing the rewards also give space for other new ways to generate
rewards in relation to departmental orders, such as stamping the
manifest with the correct head's stamp being worth more money and such.

<details>
  <summary>Old PR Text, which was using a price cap instead</summary>

## About The Pull Request

Departmental orders are a neat feature, but some of the available packs
had problems economywise. The cooldown of range from 10 to 20 minutes,
with 10 minutes being the base for anything costing less than 320
credits, and 20 minutes at 3000 credits. I have no problem with the
lower cap, but the upper cap has issues, as recently, a 20k crate was
added to cargo, which means it is possible to dump quite a large amount
of funds into cargo every 20 minutes.

Departmental orders probably need a bigger overhaul, and this solution
is imperfect, but I have talked with @ArcaneMusic about this as an
interim stop gap measure.

This PR also autodocs a proc, and moves some values to global defines,
for ease of balancing.

This PR affects the following crates, with the uncapped crate values in
brackets.

Armoury

- Combat Shotguns (3500 credits)
- Energy Guns (3600 credits)
- NT BR-38 Crate (20,000 credits)

Engineering

- BSA parts (6000 credits)
- DNA Vault Parts (4800 credits)

Engine Construction
- HFR Crate (4800)
- Supermatter Shard Crate (4000)

Materials

- BZ Crate (9000 credits)
- Nitrous Oxide (9000 credits)
- Water Vapor Crate (3010 credits)

Toys
- Collectible Hats Crate (8000 credits)

## Why It's Good For The Game

Instantly awarding 20k to cargo every 20 minute, in addition to 27k from
the other consoles (if both engineering and science orders BZ, service
orders collectible hats, and medical orders something around 1000), is a
bit too much. The money gained should be along a much more predictable
and expected value. With this chance, the most they can get is 13k every
20 minutes across all departments.
</details>

## Changelog

:cl:
balance: Rewards from departmental orders use a logarithmic scale,
resulting in less rewards for high tier crates. The cooldown time is
also logarithmic now, which has slightly decreased cooldown values on
cheaper crates.
/:cl:

* Automatic changelog for PR #88797 [ci skip]

* Nearsighted severity sources (with unit test) + status_effect/grouped minor rework (#88591)

# About The Pull Request
## Nearsighted Sources
Nearsighted now associates/tracks severity applied by each source.
Previously, nearsighted only used a single variable which had to be
shared by every source, which caused problems for things like scarred
eyes which needed independent behaviour.

This implementation allows sources with different severity levels to
coexist without needing workarounds

There are now two different severity types for nearsightedness:
* Correctable: Can be mitigated with vision correction (like glasses)
* Absolute: Cannot be mitigated from any source, used for scarred eyes

Which can allow nearsighted sources to not be affected by vision
correction.
Also, since there is no more technical conflict between the two quirks,
I've made it so that nearsighted and scarred eye can be selected
together (as a QOL change)

There is also a new unit test for this new behaviour
(nearsighted_effect) that checks application and removal
## status_effect/grouped minor rework
Grouped status effects now have `source_added()` and `source_removed()`
procs, which are called whenever a source is added or removed from the
effect

I did this because the previous implementation was somewhat unwieldy. 
Inherited status effects would recieve the _currently existing_ effect
through merge_with_existing, and require them to modify the existing
effect's properties, which is odd and not intuitive to work with (the
proc's `src` was not the existing effect)
It not being called for every source also made users repeat code in
`on_creation()` and `merge_with_existing()` for every source added.

This new interface should prevent repetition and be generally more
intuitive to work with.

# Changelog

:cl:
refactor: Nearsighted has been reworked to track severity applied from
each source, as well as allow "non-correctable" nearsightedness (for
things like scarred eyes).
qol: The above being possible now means that you can select the
Nearsighted and Scarred eye quirks together
fix: Any bug that would occur from becoming nearsighted with a scarred
eye should be fixed now
code: status_effect/grouped merging code has been improved (i hope)
/:cl:

* Automatic changelog for PR #88591 [ci skip]

* Moves and documents AI's definition (+ minor cleanup) (#88928)

## About The Pull Request

The AI's definition is big and unorganized, which makes figuring out
what does what really annoying, so I took the time to document and
organize the file

Some vars have been renamed to better communicate what they actually do
when reading code
Unused vars have been deleted:
* var/chnotify
* var/waypoint
* var/interfaceButton

### Misc changes:
The check to see if malf modules could be used was written incorrect…
  • Loading branch information
Show file tree
Hide file tree
Showing 257 changed files with 13,145 additions and 6,950 deletions.
1,945 changes: 1,390 additions & 555 deletions _maps/RandomRuins/SpaceRuins/turretedoutpost.dmm

Large diffs are not rendered by default.

1,890 changes: 1,697 additions & 193 deletions _maps/map_files/Birdshot/birdshot.dmm

Large diffs are not rendered by default.

24 changes: 12 additions & 12 deletions _maps/map_files/Deltastation/DeltaStation2.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -3705,7 +3705,7 @@
anchored = 1;
dir = 8
},
/obj/item/circuitboard/computer/stationalert,
/obj/item/circuitboard/computer/station_alert,
/obj/effect/turf_decal/bot/right,
/obj/effect/turf_decal/tile/neutral/half/contrasted{
dir = 4
Expand Down Expand Up @@ -7183,7 +7183,7 @@
/turf/open/floor/wood,
/area/station/service/theater)
"bKo" = (
/obj/machinery/computer/station_alert{
/obj/machinery/computer/station_alert/station_only{
dir = 1
},
/obj/machinery/firealarm/directional/south,
Expand Down Expand Up @@ -8831,7 +8831,7 @@
/area/station/ai_monitored/turret_protected/ai_upload)
"cfx" = (
/obj/structure/cable,
/obj/machinery/computer/station_alert{
/obj/machinery/computer/station_alert/station_only{
dir = 4
},
/obj/effect/turf_decal/bot,
Expand Down Expand Up @@ -19775,7 +19775,7 @@
/turf/open/floor/iron/dark,
/area/station/service/kitchen)
"eSU" = (
/obj/machinery/computer/atmos_alert,
/obj/machinery/computer/atmos_alert/station_only,
/obj/effect/turf_decal/bot,
/obj/structure/sign/warning/gas_mask/directional/north,
/obj/machinery/light/small/directional/north,
Expand Down Expand Up @@ -38494,7 +38494,7 @@
/turf/open/floor/iron,
/area/station/hallway/primary/fore)
"jAY" = (
/obj/machinery/computer/station_alert{
/obj/machinery/computer/station_alert/station_only{
dir = 4
},
/obj/effect/turf_decal/bot/left,
Expand Down Expand Up @@ -45376,7 +45376,7 @@
},
/obj/machinery/light/directional/south,
/obj/effect/turf_decal/bot,
/obj/machinery/computer/station_alert{
/obj/machinery/computer/station_alert/station_only{
dir = 1
},
/turf/open/floor/iron/dark/textured_large,
Expand Down Expand Up @@ -56646,7 +56646,7 @@
/turf/open/floor/iron/dark,
/area/station/security/detectives_office)
"oiO" = (
/obj/machinery/computer/station_alert{
/obj/machinery/computer/station_alert/station_only{
dir = 8
},
/obj/effect/turf_decal/bot,
Expand Down Expand Up @@ -76871,7 +76871,7 @@
/obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{
dir = 4
},
/obj/machinery/computer/atmos_alert{
/obj/machinery/computer/atmos_alert/station_only{
dir = 1
},
/obj/effect/turf_decal/bot,
Expand Down Expand Up @@ -88571,7 +88571,7 @@
/area/station/commons/dorms)
"wgF" = (
/obj/structure/cable,
/obj/machinery/computer/station_alert{
/obj/machinery/computer/station_alert/station_only{
dir = 1
},
/obj/machinery/status_display/ai/directional/south,
Expand Down Expand Up @@ -88891,7 +88891,7 @@
/turf/open/floor/plating,
/area/station/maintenance/port/fore)
"wkT" = (
/obj/machinery/computer/atmos_alert,
/obj/machinery/computer/atmos_alert/station_only,
/obj/effect/turf_decal/tile/yellow/half/contrasted{
dir = 1
},
Expand Down Expand Up @@ -90657,7 +90657,7 @@
/turf/open/floor/plating,
/area/station/science/research/abandoned)
"wEX" = (
/obj/machinery/computer/atmos_alert{
/obj/machinery/computer/atmos_alert/station_only{
dir = 8
},
/obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{
Expand Down Expand Up @@ -94421,7 +94421,7 @@
c_tag = "Engineering - Power Monitoring";
name = "engineering camera"
},
/obj/machinery/computer/atmos_alert{
/obj/machinery/computer/atmos_alert/station_only{
dir = 1
},
/obj/structure/cable,
Expand Down
Loading

0 comments on commit 3908b86

Please sign in to comment.