## About The Pull Request
A bundle of stormy weather-related fixes:
- ash storm visually replenishes dug basalt again; also updates refilled
basalt's light, if it rolled an eligible icon variant
- new proc refill_dug() for asteroid turfs, currently made use of in
weather but be my guest
- I THINK the lowest-light variants are so low they don't show up at all
but I didn't look into the lighting subsystem so /shrug
- `set_basalt_light()` is a global proc. the reason is because we have,
like, an unnecessary amount of basalt turfs that don't call back to each
other. `misc/basalt`, `floor/fakebasalt`, `holofloor/basalt`. bro come
on. should merge them where possible but that's for a separate PR; ALSO
MAKE IT USE THE `diggable` ELEMENT BRO COME ON!!!
- ash storm no longer loops `end()` sounds
- it was calling parent THEN removing the playlist's sounds, which
caused the playlist's ash storm weak sound to be picked again and play
with a hugelarge timer
- snow storm no longer affects mecha pilots
- I find it weird that ash storm immunity is just innate whether the
mech is "sealed" or not (Ripley mk I) but for now, I've made snow storm
immunity behave the same
- _jaunt spells provide weather immunity while the jaunt is active_
- _the caster is supposed to be untouchable by any practical means, it
don't make a lick'a sense to have weather affect them. I gave it a
general weather immunity however, and that also makes jaunts protect
from radiation. methinks it's fair, lmk if that's excessive_
## Why It's Good For The Game
- Fixes#76304
- Fixes#76400
- Refilled basalt tiles that should have light are consistent with
mapped in basalt tiles
- Consistency for mechs; the adjustment might be a balance thing, lmk
## Changelog
🆑
fix: fixed basalt turfs remaining visually dug up when refilled by an
ash storm
fix: fixed ash storm ending sounds looping after the storm is over
fix: mechs are now snow storm immune
fix: jaunt spells protect from weather when jaunting
/🆑
## About The Pull Request
Title.
Also, fixes https://github.com/tgstation/tgstation/issues/75568 at the
request of @TheVekter
## Why It's Good For The Game
This subtype only exists to append ore box behavior and is clearly a
relic of pre-2020 mechcode.
Keeping it around will only make it harder in the future to add new
mechs with ore box support.
## Changelog
🆑
fix: Clarke ore box now has a less confusing dump contents button.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
i should have adjusted these in my previous PR that was touching this
equipment lol thus the no gbp
also makes the `ui_act()` not use `usr`
if my calculations are correct the consumption rates per tick should be
the same — 5% of a sheet when active and 0.65% when idle
## Why It's Good For The Game
fixes#76132
## Changelog
🆑
fix: fixed mecha generators using way too much fuel due to using the old
values of material units per sheet
/🆑
Changed hardcoded matter bins values to use defined
`SHEET_MATERIAL_AMOUNT` for following stuff: autolathe, protolathe, mech
fabricator and component printer.
`Material Access Bar` and `MaterialIcon` used for protolathes, circuit
printers and etc. now also use defined `SHEET_MATERIAL_AMOUNT`, via
static ui data, to prevent same issues in future.
Also changed some notes in /// parts just because why not.
Remove welder fuel usage from all actions except attacking and leaving
it on
most welder tasks require a minimum of 1u of fuel, some longer tasks
require a minimum of 2 or 3u welders now drain 1u every 5 seconds
they're active
## About The Pull Request
Prior to this PR welder fuel usage was random, a lot of tasks didn't use
any welder fuel and welders were basically near infinite so long as you
didn't use them for combat, it took 26 seconds of activity to drain 1u
of fuel, that means an emergency welder alone could run for 5 minutes
straight before needing a refuel
After this PR all welders will drain 1u every 5 seconds instead of every
26 seconds, but welding objects won't require extra fuel anymore, making
the fuel usage much more consistent.
resolves#55018
## Why It's Good For The Game
Actually makes fuel tanks useful and relevant without making it
obnoxious to do repetitive quick tasks like turn rods into plates,
there's actually a reason to upgrade off the emergency welder now since
it lasts 50 seconds rather than 5 minutes
## Changelog
🆑
qol: Welders now have a more consistent fuel usage
/🆑
Cleans up the plasma generator to actually work & make more sense:
* was not accepting any fuel, made that work; will also accept subtypes
of fuel e.g. a mapped-in stack of 5 plasma
* was not displaying the amount of fuel left in mecha stats UI, was
broken in #75052
* plasma pollution was removed a long time ago in #42908, scrubs mention
of that
Also adds some fluff text to the internal damage tracker to the short
circuit entry, as it was lacking a "system nominal" one. Also added a
`to_chat` to fixing navigation internal damage, as it was the only one
with no message for some reason.
you must now be able to see what you're trying to build on
## About The Pull Request
MECH RCD now requires you to actually see the thing you're trying to
build on
## Why It's Good For The Game
It is very powerful to be able to build in places you cant see
## Changelog
🆑 oranges
balance: MECH RCD is no longer magic
/🆑
## About The Pull Request
Resprites stock parts to bring them up to date, changes manipulators to
servo motors as I couldn't make manipulators work well at this scale.

(Power cells sold separately)
## Why It's Good For The Game
The old stock parts are dated, in some cased quite ugly, and in the case
of manipulators a ball of assorted pixels. Incidentally removed a couple
of single letter var names.
## Changelog
🆑
image: Stock parts have been resprited.
code: Manipulators have been renamed to servo motors, all related types
have been repathed to match.
/🆑
## About The Pull Request
Found a bug while working on another project, Kapu on the Discord told
me why it was broken. For most maps, this seems to be handled by the
fallback code by chance, where it checks within one more tile away, but
for Tram, that caused the following;

This is a webedit, but only because I didn't want to stop mid-project
and swap branches. It has been tested on local.
## Why It's Good For The Game
Bugfix.
## Changelog
🆑
fix: Mech chargers on Tram (and possibly elsewhere) no longer sync
oddly.
/🆑
Ladies, Gentlemen, Gamers. You're probably wondering why I've called you
all here (through the automatic reviewer request system). So, mineral
balance! Mineral balance is less a balance and more of a nervous white
dude juggling spinning plates on a high-wire on his first day. The fact
it hasn't failed after going on this long is a miracle in and of itself.
This PR does not change mineral balance. What this does is moves over
every individual cost, both in crafting recipes attached to an object
over to a define based system. We have 3 defines:
`sheet_material_amount=2000` . Stock standard mineral sheet. This being
our central mineral unit, this is used for all costs 2000+.
`half_sheet_material_amount=1000` . Same as above, but using iron rods
as our inbetween for costs of 1000-1999.
`small_material_amount=100` . This hits 1-999. This covers... a
startlingly large amount of the codebase. It's feast or famine out here
in terms of mineral costs as a result, items are either sheets upon
sheets, or some fraction of small mats.
Shout out to riot darts for being the worst material cost in the game. I
will not elaborate.
Regardless, this has no functional change, but it sets the groundwork
for making future changes to material costs much, MUCH easier, and moves
over to a single, standardized set of units to help enforce coding
standards on new items, and will bring up lots of uncomfortable balance
questions down the line.
For now though, this serves as some rough boundaries on how items costs
are related, and will make adjusting these values easier going forward.
Except for foam darts.
I did round up foam darts.
Adjusting mineral balance on the macro scale will be as simple as
changing the aforementioned mineral defines, where the alternative is a
rats nest of magic number defines. ~~No seriously, 11.25 iron for a foam
dart are you kidding me what is the POINT WHY NOT JUST MAKE IT 11~~
Items individual numbers have not been adjusted yet, but we can
standardize how the conversation can be held and actually GET SOMEWHERE
on material balance as opposed to throwing our hands up or ignoring it
for another 10 years.
## About The Pull Request
Was requested in #74592
- Properly type casts the target into `turf/open/space` for mecha rcd
plating action,
- Removes single variable names throughout
- uses datum/ui component to get user for to_chat() instead of usr
## Changelog
🆑
refactor: correctly type casts the turf into open type for the rcd mecha
plating action
refactor: removes single letter variable names
refactor: uses datum/ui component to get user for to_chat() instead of
usr
/🆑
This tracks the seconds per tick of a subsystem, however note that it is
not completely accurate, as subsystems can be delayed, however it's
useful to have this number as a multiplier or ratio, so that if in
future someone changes the subsystem wait time code correctly adjusts
how fast it applies effects
regexes used
git grep --files-with-matches --name-only 'DT_PROB' | xargs -l sed -i
's/DT_PROB/SPT_PROB/g'
git grep --files-with-matches --name-only 'delta_time' | xargs -l sed -i
's/delta_time/seconds_per_tick/g'
## About The Pull Request
Final closing act for #74527, some more bugs to squash.
1. Fixes broken sprite for rack in RCD UI

2. Fixes#41114 mounted RCD can lay plating on chasm/ any open turf
again
3. Removes unused turf argument inside `try_clean()`, `try_wallmount()`,
& `try_decon()` procs because well it was unused
## Changelog
🆑
refactor: remove unused turf var inside wallmount procs
fix: broken rack sprite inside RCD UI
fix: mounted RCD now lays plating over chasms and open turfs
/🆑
## About The Pull Request
This sprite file had been a dumping ground for miscellaneous sprites for
the past decade. It's bloated and full of random kinds of icons and even
has a few unused ones. It's time to reorganize them into their own
separate dmi's based on theme.
## Why It's Good For The Game
Better organization and easier access when looking for stuff.
## Changelog
🆑
imageadd: Split all icons in weapons_and_items.dmi to their own
categories
imagedel: Removed some unused icons
/🆑
## About The Pull Request
Kinda resusticates #72442 cause the whole conflict was stupid.
Adds t4 parts for dark gygax, mauler and reticence (for the sake of
shitspawn) and t3 for dark honker.
Formulas of better parts to understand the difference:
https://github.com/tgstation/tgstation/blob/aff9cf1b434c7a95d156ea20108d8b2bc015083d/code/modules/vehicles/mecha/_mecha.dm#L427-L439
Made examine text into span_notices so it's not just plane text.
Also added tooltips for maintenance. Screens to compare:


Dark gygax will now spawn without access adding regime.
Tool interactions with mech will now have sounds. (wrench and crowbar)
Removing parts from mech will now put them in your hands, and not just
under the mech.
When inserting parts in mech they won't make some noisy noise, already
forgot which noise it was, but i changed it for some reason, so meh.
Also fixed that you can remove capacitors and scanning mods from mech
without proper maintenance as it works with cell. Closes
https://github.com/tgstation/tgstation/issues/71577
## Why It's Good For The Game
Syndie mechs are still week. Didn't see them in half a year.
## Changelog
🆑
qol: changed mech description to span_notices and just slightly comfier
to use.
qol: added tooltips for mech's maintenance mode.
balance: added t4 parts for mauler and dark gygax. And t3 parts for dark
honker.
fix: fixed that you can remove capacitor and scanmod from mech without
proper maintenance steps. Now you can't
/🆑
## About The Pull Request
Refactors regenerate organs to be slightly more intelligent in handling
organ changes and replacements.
Noteably:
- We don't remove organs that were modified by the owner; such as
changing out your heart for a cybernetic
- We early break out of the for loop if they aren't supposed to have an
organ there and remove it
- We check for the organ already being correct, and just healing it and
continuing if it is
Also changes the names of some of the organ helpers into snake_case
### Mapping March
Ckey to receive rewards: N/A
## Why It's Good For The Game
## Changelog
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
Adds and action button for toggling mech equipment safeties. Also
clarifies the message about safeties that the AIs get when possessing a
mech to account for the new button.
## Why It's Good For The Game
Closes#38178 - the only way to toggle safeties without middle-click
right now is through the mech stats UI, which is quite cumbersome.
Adding an action button seems to be an alright solution, as it's always
available and much easier to access.
## Changelog
🆑
qol: mechs have an action button on the HUD for toggling equipment
safeties
/🆑
## About The Pull Request
This is quite literally the same behavior but faster, and also catches
improper arguments better than the old macro/proc approach.
Credit to Lohikar for writing the macro.
Port of https://github.com/DaedalusDock/daedalusdock/pull/196
Also, `world.ImmediateInvokeAsync()` never set a return value, so
expecting one was never valid behavior.
At MSO's request, the documentation of `spawn(-1)`:
As per the reference, calling `spawn()` with a negative value will
execute the spawned code until a blocking action (such as `sleep()`) is
encountered. Then, it will step outside of the spawned code, and
continue the proc. This is the same behavior as calling a `waitfor =
FALSE` proc. Specifically, under the hood, `spawn(-1)` creates a copy of
the callstack like `sleep()`, incase the spawned code is blocked and
needs to be rescheduled.
As an added bonus, `spawn(-1)` silences SHOULD_NOT_SLEEP errors, whereas
`waitfor = FALSE` does not.
## Why It's Good For The Game
ITS FREE FUCKING CPU TIME
---------
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
Co-authored-by: Kyle Spier-Swenson <kyleshome@gmail.com>
## About The Pull Request
brain mobs dont get slept on destruction
## Why It's Good For The Game
Fixes#72869Fixes#73624Fixes#57217
## Changelog
🆑
fix: MMIs/Positrons dont get slept forever when the mech theyre in gets
destroyed
/🆑
## About The Pull Request
Mecha speech indicators mistakenly passed ALL hearers in view to
`flick_overlay_global`, rather than just mobs with clients, so it
runtimed when it meant to disappear.
I also added some client sanity to the associated procs... I'm not sure
if they're needed but it seems like they'd be valuable there?
## Changelog
🆑 Melbert
fix: Mecha speech indicators actually go away
/🆑
## About The Pull Request
Fixes#72321Fixes#70388
The shake proc didn't work and hasn't for ages.
I remember it having worked at some point, but it was quite a long time
ago.
I cannot guarantee that the end result here is the same as it was, the
reason here being that I have no idea how this proc ever worked in the
first place. My limited understanding of the `animate` proc implies that
the previous implementation as written would never have acted as you
would expect it to, but clearly at some time in the past it did work. A
mystery.
As a result of the previous, possibly because the proc never _did_ work
as expected and just did something which looked vaguely correct most of
the time, both the default values and the values people were passing
into this proc were completely ridiculous.
Why would anyone ever want to pixel shift an object with a range of _15_
pixels in all directions? That's half a full tile! And why would you
want it to do this for 25 seconds?
So I also changed the values being passed in, because you really want
pretty small numbers passed into here most of the time.
Here's a video of everything that vibrates:
https://www.youtube.com/watch?v=Q0hoqmaXkKA
The exception is the v8 engine. I left this alone because it seems to
try and start shaking while in your hands, which doesn't work, and I
don't know how to fix that. This has potentially _also_ never worked.
## Why It's Good For The Game
Now you can see intended visual indicators for:
- Lobstrosities charging.
- Beepsky being EMPed.
- The Savannah Ivanov preparing to jump.
- The DNA infuser putting someone through the spin cycle.
- The mystery box admin item I had no previous idea even existed (fun
animations on this one).
- Anything else which wants to use this proc to create vibrating objects
in the future.
## Changelog
🆑
fix: Lobstrosities and Tarantulas will once more vibrate to let you know
they're about to charge at you.
fix: The Savannah Ivanov will once more vibrate to let you know it's
about to jump into the air.
fix: The DNA infuser will now vibrate to let people know that it's busy
blending someone with a dead animal.
/🆑
This builds on what #69790 did and improved the code even further.
Notable things:
- `Topic()` is a deprecated proc in our codebase (replaced with
Javascript tgui) so it makes sense to rename `canUseTopic` to
`can_perform_action` which is more straightforward in what it does.
- Positional and named arguments have been converted into a easier to
use `action_bitflag`
- The bitflags adds some new checks you can use like: `NEED_GRAVITY |
NEED_LITERACY | NEED_LIGHT` when you want to perform an action.
- Redundant, duplicate, or dead code has been removed.
- Fixes several runtimes where `canUseTopic` was being called without a
proper target (IV drips, gibber, food processor)
- Better documentation for the proc and bitflags with examples
## About The Pull Request
The Durand shield overlay would not be placed on top when facing south
due to the planes not being set properly. My changes update the planes
whenever the dir gets updated.
There was also a lighting runtime due to using the wrong lighting proc
call that would throw this error:
```
/atom/proc/update_light()
SHOULD_NOT_SLEEP(TRUE)
if(light_system != STATIC_LIGHT)
CRASH("update_light() for [src] with following light_system value: [light_system]")
```
Someone mixed up the lighting code since `set_light()` is meant to be
used by `STATIC_LIGHT` sources. The durand shield lighting source is
`MOVABLE_LIGHT`.
All I needed to do was remove the extra procs since we already have
`set_light_on(chassis.defense_mode)` that controls the `MOVABLE_LIGHT`.
Basically, someone added two different lighting systems to the same
object, so big oof.
## Why It's Good For The Game
Better mech visuals and one less runtime.
<details>
<summary>Before:</summary>

</details>
<details>
<summary>After:</summary>

</details>
## Changelog
🆑
fix: Fix durand shield overlay to appear above the mech when facing
south. Also fixed a lighting runtime when shield would turn on/off.
/🆑
## About The Pull Request
Mech disabler now is works like a shotgun, shooting 5 weak disabler
beams(15 damage, the normal disabler beam has 30). The energy drain is
increased to 100 from 30. Has a cooldown of 1.5 seconds.
The exact numbers(weapon scatter, damage, amount of projectiles) can be
discussed.
## Why It's Good For The Game
When you are trying to nonlethally deal with someone, a normal security
officer with their roundstart available equipment is more effective then
an expensive lategame mech, due to that fact that it is really slow,
cant use stunbattons and even if you manage somehow to stamcrit a person
with a mech disabler you still need some time to get out in order to
handcuff them. So mech disablers are useless, especially compared with
other mech weapons, like rocket launchers and ballistic guns. This PR
makes the mech disabler not trash, so roboticists would have a wider
choice of useful weapons when making a mech.
## Changelog
🆑
balance: Mech disabler now works as a shotgun, shooting 5 weak disabler
beams at one time.
balance: Mech disabler now uses 100 energy instead of 30, and it's
attack cooldown increased to 1.5 seconds instead of 0.8
/🆑
## About The Pull Request
See title
## Why It's Good For The Game
Messed up one of the armor procs; it changed the given values but never
carried over existing values.
So you would end up with an armor of that one specific value and nothing
else.
This wasn't actually used anywhere other than mecha, lava burning, and
sentient viruses, so the issue isn't that bad.
It's still an issue however.
## Changelog
🆑
fix: Mechs no longer have zero armor when built.
/🆑
## About The Pull Request
Currently all machines, if the config to not have a techweb link is on,
will set their node to science even if they were meant to be connected
to another (like through subtypes). This fixes that by checking to
ensure they don't have a techweb connected already before giving them a
new one.
Also as a minor fix, RD consoles will now properly add themselves to the
list of accessing RD consoles if they aren't linking to the default.
This list currently does nothing but I can see good uses of it in the
future.
## Why It's Good For The Game
Fixes an error that was found on a downstream, it's a worthwhile fix
that thankfully was caught this early.
## Changelog
Nothing player-facing.
## About The Pull Request
Mechs had the ability to short circuit, but lacked the logic to display
and repair that.
Resolves#72835
## Why It's Good For The Game
## Changelog
🆑
fix: NanoTrasen Engineering has identified and resolved an issue with
MechOS that prevented diagnostics for internal shorting
/🆑
Signed-off-by: GitHub <noreply@github.com>
## About The Pull Request
Part of a prior PR that was closed (#72562). This version does not add
the check in CI.
## Why It's Good For The Game
The work is already done, so I figured why not.
## Changelog
N/A Nothing player facing
Co-authored-by: Jeremiah Snow <jlsnow301@pm.me>
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
So i accidently reverted all my commits in #72511 when resolving a merge
conflict So ummm yeah fuck my bad anyway
## About The Pull Request
Finishes what was started in #71693 and completes the
[initiative](https://github.com/tgstation/dev-cycles-initiative/issues/1)
Except for `obj/item/stock_parts/cell` and its subtypes. All machines
now use `datum/stock_part` for its requested components & component
parts
Not sure if i caught every machine & stuff in the game so merge with
caution
## Changelog
🆑
code: datum stock part for every obj stock part
refactor: all machines & dependent experiments to use datum stock parts
/🆑
## About The Pull Request
closes#72348
Title
## Why It's Good For The Game
My bad
## Changelog
Heres the script I used this time if you want to
```cs
var baseDir = Environment.CurrentDirectory;
var allFiles = Directory.EnumerateFiles($@"{baseDir}\code", "*.dm", SearchOption.AllDirectories).ToList();
var known = new Dictionary<string, List<KeyValuePair<string, int>>>();
foreach (var file in allFiles)
{
var fileLines = File.ReadAllLines(file);
for (var i = 0; i < fileLines.Length; i++)
{
var line = fileLines[i];
if (line.StartsWith("/datum/armor/"))
{
var armorName = line.Replace("/datum/armor/", "").Trim();
if (!known.ContainsKey(armorName))
known[armorName] = new List<KeyValuePair<string, int>>();
var knownList = known[armorName];
knownList.Add(new KeyValuePair<string, int>(file, i));
}
}
}
Console.WriteLine($"There are {known.Sum(d => d.Value.Count)} duplicate armor datums.");
var duplicates = new Dictionary<string, List<int>>();
foreach (var (_, entries) in known)
{
var actuals = entries.Skip(1).ToList();
foreach (var actual in actuals)
{
if (!duplicates.ContainsKey(actual.Key))
duplicates[actual.Key] = new List<int>();
duplicates[actual.Key].Add(actual.Value);
}
}
Console.WriteLine($"There are {duplicates.Count} files to update.");
foreach (var (file, idxes) in duplicates)
{
var fileContents = File.ReadAllLines(file).ToList();
foreach (var idx in idxes.OrderByDescending(i => i))
{
string line;
do
{
line = fileContents[idx];
fileContents.RemoveAt(idx);
}
while (!String.IsNullOrWhiteSpace(line));
}
File.WriteAllLines(file, fileContents);
}
```
windows didnt use return values for attack_generic, so they never made
sounds
objects that broke also didnt play sounds because it tried to play the
sound in nullspace i think cuz its broken so its deleted
might also have happened with durand using shield
fixes those
This PR is just made to fix duplication of examination texts when you
looked on a mecha, for example if something met a certain threshold, it
would say "It's heavily damaged" twice when you examined it.
This PR just makes a new proc called on examine that's overridden by
subtypes. I did it this way because mechas seemed to have their own
logic/tiering system to determine how busted it was, and I didn't want
to toy with the balance of the calculations should that matter.
## About The Pull Request
All investigate logs start with [src], which can be any atom. So
sometimes names and items get printed twice. Adds ckeys to the
investigate_logs of living mobs.

## Why It's Good For The Game
Better logging, includes the ckey for living mobs in investigate logs,
and fixes some investigate_death logs that weren't properly attributed
to mobs.
## Changelog
🆑 Tattle
admin: investigate logs include ckey of source (if applicable)
/🆑
Co-authored-by: tattle <article.disaster@gmail.com>
## About The Pull Request
Adds an Element and AI behaviour intended to replicate the "retaliate"
behaviour which made up an entire widely-populated subtype of simple
mobs.
The behaviour is pretty simply "If you fuck with me I fuck with you".
Mobs with the component will "remember" being attacked and will try to
attack people who attacked them, until they lose sight of those people.
They don't have very long memories so breaking line of sight is enough
to remove you from their grudge list.
The implementation unfortunately requires registering to 600 different
"I have been attacked by X" signals but c'est la vie.
It will still be cleaner than
`/mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus`
and `mob/living/simple_animal/hostile/retaliate/bat/sgt_araneus`.
I attached it to the pig for testing and left it there because out of
all the farm animals we have right now, a pig would probably get pissed
off if you tried to kill it. Unfortunately it's got a sausage's chance
in hell of ever killing anyone.
## Why It's Good For The Game
It doesn't have much purpose yet but as we make more basic mobs this is
going to see a **lot** of use.
## Changelog
🆑
add: Basic mobs have the capability of being upset that you kicked and
punched them.
add: Pigs destined for slaughter will now ineffectually attempt to
resist their fate, at least until they lose sight of you.
balance: Bar bots are better at noticing that you're trying to kill
them.
/🆑
## About The Pull Request
The only thing mech combat has is the reload helper that should be on
mech proper anyway and the medical subtype isnt even defined outside of
ody code
Co-authored-by: TiviPlus <572233640+TiviPlus@users.noreply.com>
## About The Pull Request
- Rewrites how action button icons are generated.
- Prior, generated an action button icon was fairly simplistic and
didn't allow for many changes. Someone recently added the option for
overlays to be generated over action buttons, but the framework was very
weak.
- Now, action button icon generation is split across multiple procs,
like atom icon updates.
- The background of action buttons are underlays
- The actual icon of the action button is the icon and icon state of the
action button movable
- The rim / border of the button is an overlay, layered overtop the
button.
- Allows observers to see what action buttons a mob has. They even
update in real time! And no, the observers cannot click on them.
## Why It's Good For The Game
- Runechat text of action buttons are no longer hidden behind the actual
icon. This was very ugly with cooldown actions, as the cooldown text was
hidden behind a lot of spell icons.
- Cuts down on a lot of icon duplication.
- Gives much finer control over action button icons
- Saves a bit of processing from generating full action button icons
when not necessary. Not implemented in many places, but is in some.


## Changelog
🆑 Melbert
add: Observers can now see what action buttons an observed mob has. No,
you can't click them. And no it doesn't show EVERY action.
refactor: Refactored how action button icons are generated. Some actions
will now use a colored border when active instead of just turning green.
Cooldown text will also appear on the top layer of actions too. If you
see any funky lookin' icons (namely their borders), let me know.
refactor: Bluespace Golem's teleport action is now a cooldown action.
fix: Construct actions go to the middle of the screen like expected.
/🆑
## About The Pull Request
This PR implements a new add-on for mechs that functions as a
~~EMP-proof~~ borg security camera. Unlocked in Basic Robotics Research
node.
Mechs with a camera installed will have a unique diagnostic HUD blip.

Getting EMPd temporarily sets the camera's view range to 1.

## Why It's Good For The Game
Bodycam footage of the mech in action; AIs piloting a mech with this
add-on can actually see what's happening around the mech, much like
following a borg.
## Changelog
🆑
add: robotics now has access to a mech camera add-on, which installs a
security camera into the mech. bodycam footage from the big leagues!
qol: cyborg cameras should be more active with updating static when
moving (ideally down from 2.5 seconds to 0.5 between updates), make sure
to report any jank if you happen on some
/🆑
Co-authored-by: Time-Green <timkoster1@hotmail.com>
## About The Pull Request
You don't cut with a crowbar (very well, anyway).
which fixes https://github.com/tgstation/tgstation/issues/71564
For some reason, despite the fact that mech salvage could be redefined,
none of the subtypes of the wreckage actually redefined it at all. This
lead to salvaging plasteel from mechs that didn't actually use plasteel
in its construction (or at least used plasma + iron, which presumably
made plasteel).
Therefore, any mech that was made from a different material now allows
you to salvage that material from the wreckage. Since the maximum amount
of sheets you can get from a wreckage is 5, and is entirely random, I am
fairly confident this is not a means for material duping (it is
technically currently a means of producing plasma from iron and glass,
just for reference).
I gave the admeme/nukie mechs some favourable material salvages.
## Why It's Good For The Game
Consistency is good, and also I hate the idea of producing plasteel from
seemingly nowhere on mechs that are only made from iron and glass
(ripley MK.I).
## Changelog
🆑
fix: You no longer cut into mechs with wreckages with crowbars, you pry
parts from them. Duh.
fix: Mech material salvage matches their construction materials.
/🆑
## About The Pull Request
Fixes#71484 - Adds a check to the down verb to make sure a z level
exists below before trying to move.
Changes some step() in relay_move procs to use zMove instead if they
have a direction of up/down, as this was causing you to be able to phase
through floors if you were in a cardboard box/mech/etc
## Why It's Good For The Game

## Changelog
🆑
fix: Fixed being able to move through floors and get to centcomm when
moving up/down while inside mechs and similar movable objects.
/🆑
So i left over some basic `/whatever/proc/format` uses in the original
PR this fixes it.
Notable exceptions to the rule:
- Paths in add_verb/remove_verb, we need full path instead of a name
there to access verb metadata so we can't use proc ref macros there.
- regex.Replace, found out that it does not accept call by name. Instead
i added new REGEX_REPLACE_HANDLER so we can at least try to mark these.
There's still leftover global procs that do not use GLOBAL_PROC_REF but
they functionally equivalent so that's for later.
I don't see any reasonable way to grep for this. But if you got any
ideas please share.
- Makes QDELETED use isnull(x) instead of !x, giving about 0.2 to 0.25s
of speed.
- Make disposal constructs only update icon state rather than go through
expensive overlay code. Unfortunately did not have much effect, but is
something they should've been doing nonetheless.
- Makes RegisterSignal only take signals directly as opposed to
allocating a fresh list of signals. Very few consumers actually used
this and it costs about 0.4s. Also I think this is just a bad API anyway
and that separate procs are important
`\bRegisterSignal\((.*)list\(` replaced with `RegisterSignals($1list(`
## About The Pull Request
During mech construction, the balloon alerts were based on a hardcoded
set of messages, each identified by a define in order. Whenever you
finished a step, the current construction step counter got increased by
one, and a separate message step counter got increased by various
amounts, based on a set of vars like "does this mech has treads?".
This meant you that to add new mech construction steps, you would had to
add new vars that tells every single other mech constructions to skip
it.
Another issue caused by this solution is that the HONK mech wanted to
use completely different messages, and it did not call the parent proc
to avoid the generic message system. This also caused parts applied to
it to not be deleted (mask, shoes), or moved inside it (cells, scanners,
capacitors).
So I have decided to add a forward_message to all steps, and a
backwards_message to ones that had back_key's, and display them
appropriately. The steps that don't have backwards_message are the first
steps (can't go back to the unordered mech construction), and the HONK
mech steps (can't stop the horror that you have begun).
Future improvement to truly make mech construction fully modular, so you
can easily add a new step without having to look up what the previous
step was, is to split the examine messages into a last_step_description,
and description. However, this is out of the scope of this PR.
I built every single mech in a row to test this, it was so tiring...
## Why It's Good For The Game
Fixes#67975
Its also nice to clean up mech construction a bit.
## Changelog
🆑
refactor: mech construction balloon messages are now actually stored in
the construction steps, instead of being tracked separately.
fix: Items used in the honk mech construction are now properly
deleted/moved inside the mech
/🆑
Similar vein to #37116
This is supposed to be standard, yet here we are.
SHOULDN'T change anything, but there's likely something out there that's
bound to behave different because of it.
These were done manually, regex to find things that MIGHT need to be
corrected;
`^#define.+\+((?!\)).)*$`
`^#define.+-((?!\)).)*$`
`^#define.+\*((?!\)).)*$`
`^#define.+\/((?!\)).)*$` (yeah that's a lot of stuff.)
`^#define.+%((?!\)).)*$`
`^#define.+SECONDS((?!\)).)*$`
`^#define.+MINUTES((?!\)).)*$`
## About The Pull Request
This is an expanding of
https://github.com/tgstation/tgstation/pull/69708
Adds a config to not connect machines to a techweb at the start of a
round
Adds the ability to multitool a server to get its techweb in its buffer,
which can then be used on machines to sync them.
Adds support for some machines to not cry when they don't have a techweb
linked to it, in case they actually don't.
If the config to not have machines connected to the science server is
enabled, research servers will make their own techwebs instead. This is
barebones though and would need more work if this option is used.
For misc stuff:
- I replaced checking ``GLOB.machines`` for research servers, to instead
check ``SSresearch.servers``, where we can use ``as anything``.
- Removed unused vars on the RD server control
- I renamed the operating computer's .dm file to remove the capitalized
letter from it. It's now operating_computer instead of Operations.
## Why It's Good For The Game
This is adding support for 2 different cases that can be used in the
future:
1. Off-station roles, we can make roles like Oldstation have their own
techweb so they don't ruin science's efforts, or use their advanced
research to get things we don't want, or even possibly have some
blacklist webs for ghost roles (like teleporters) so that way we don't
need to have this dance where we have to give them a very specific
amount of materials for them to do things while not being able to get a
teleporter and leaving. I heard discussions that people wanted this a
while back, and one of the main things preventing this from happening is
the lack of support. Hopefully this is encouragement to make it a
reality, because I think it would be a really cool expansion of ghost
roles and a good way to prevent them from messing with the round in
progress.
2. Downstreams who want to do different things with Science. Personally
I made this PR with voidcrew(shiptest) in mind and think this would make
their lives easier. I didn't expand too much on this because I'm leaving
up mostly to the downstreams to figure out what they want to do with
these systems.
## Changelog
This generally isn't really player facing, since most of the changes
would only come into effect if the config is enabled??
🆑
fix: Research servers now only show servers connected to their techweb.
/🆑
## About The Pull Request
https://user-images.githubusercontent.com/82386923/199180691-6605c8cc-e8aa-490e-ab65-909d45d12ca0.mp4
Do note that the damage in this video is extremely exaggerated compared
to what the normal value is.
## Why It's Good For The Game
All these signs about engineers needing to wear their hardhat, and for
what? For the assistant dropping toolboxes onto them from above, that's
what! Also allows people to do as god intended by allowing them to drop
pianos on people.
## Changelog
🆑
add: A variety of items, mainly tools, around the station might hurt if
they fall on your head, remember to wear your hardhat and to avoid
standing under large red X marks on the ground with a piano hanging
above them.
/🆑
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>