* Fixes a runtime with AI targeting code, refactors faction checking to be at the atom/movable level (#78803)
## About The Pull Request
Saw this in CI.

~~Quick fix for it--because turrets are not mobs trying to call this
proc on them will runtime. So let's give them their own implementation
of the proc.~~ Just kidding, let's refactor faction checking entirely
## Why It's Good For The Game
Fixes an issue with basic mob AI targeting and turrets.
## Changelog
🆑
fix: basic mobs will no longer runtime when trying to check the faction
of a porta turret
refactor: faction checking is now done at the atom/movable level
/🆑
---------
Co-authored-by: san7890 <the@ san7890.com>
* Fixes a runtime with AI targeting code, refactors faction checking to be at the atom/movable level
* Modular updates
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: san7890 <the@ san7890.com>
* Corrects tile offsetting for TGC Mana and Health bars. (#79002)
## About The Pull Request
Fixes: #78466
Health and Mana bars are supposed to be offset a number of tiles based
on mapper preference but #75189 changed the code to use pixel offsets
rather than tile offsets without changing the map variables to account
for this. I've changed it back to tile offsets since pixel offsets are
going to look super weird if someone maps these in with super high
offsets, it already looks rather weird even with a 1 tile offset.
I've also changed them to effects rather than decals since they're
holograms and can be stuck to walls and stuff if the mapper chooses to
without triggering the unit test.
## Why It's Good For The Game
Restores some intended functionality for mappers and fixes the incorrect
offsets on the TGC holodeck map.
## Changelog
🆑
fix: TGC Mana and Health bars are correctly offset on the holodeck.
/🆑
* Corrects tile offsetting for TGC Mana and Health bars.
---------
Co-authored-by: NamelessFairy <40036527+NamelessFairy@users.noreply.github.com>
* Summoning affix fixes (#78983)
## About The Pull Request
The fantasy "summon x" affix blacklist doesn't work, and probably hasn't
worked for a significant amount of time.
This is because it generated a typecache with true/false values
representing whether we should be able to spawn a mob... and then
performed a `pick` on it. Pick doesn't care if the value is true or
false, so everything in the blacklist was explicitly whitelisted.
For some reason the list was also containing subtypes of a datum? Then
passing this to a component which expected typepaths of mobs it could
spawn? That doesn't work either.
We _also_ never added basic mobs to this list, so it would never spawn
those and they're an increasing number of our mobs total.
While I was there I also just did some general code tidying. I moved the
list of "specific subtypes to remove" to a global list because I suspect
something else either will need it in the future or already does.
## Changelog
🆑
fix: Megafauna, lavaland elites, and abstract mobs now correctly cannot
be spawned by a toolbox of ash drake summoning
/🆑
* Summoning affix fixes
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* Gives broken canisters a description (#79005)
## About The Pull Request
A torn apart canister. It looks like some metal can be salvaged with a
wrench.
## Why It's Good For The Game
It fixes a part of #79003, the rest seems like balance or qol changes.
## Changelog
🆑
spellcheck: Broken canisters now have a description
/🆑
* Gives broken canisters a description
---------
Co-authored-by: BlueMemesauce <47338680+BlueMemesauce@users.noreply.github.com>
* You can now give people a slap on the wrist (#78793)
## About The Pull Request
Slapping people on the wrist now has a unique message.
## Why It's Good For The Game
New interactions between players, allows security to literally "give
people a slap on the wrist" instead of brigging someone.
## Changelog
🆑
add: targetting someone's arm with *slap now has a unique message
/🆑
* You can now give people a slap on the wrist
---------
Co-authored-by: bun235 <99276929+bun235@users.noreply.github.com>
* Remove tiered canister construction (#78909)
## About The Pull Request
In https://github.com/tgstation/tgstation/pull/66210 we removed canister
tiers, but didn't change the construction code. Currently you still have
to build an unfinished frame with 5 iron, 'upgrade' it to tier 1 with
another 5 iron, then complete it.
This combines it all into a single 10 iron recipe.
## Why It's Good For The Game
Eliminates the extra steps in canister construction, since you can't
upgrade above tier 1 any more anyways.
## Changelog
🆑 LT3
qol: Canisters can now be built in one step, no upgrading required
/🆑
* Remove tiered canister construction
* Modular paths
---------
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Basic Mob Gorillas (#78918)
## About The Pull Request
Now we can make basic mobs with hands easily so I did, they don't
actually use their hands for anything with AI.
In the future we can come back and share the monkey AI where they pick
up items to hit people with, but frankly few weapons are more deadly
than a gorilla's fists.
IIRC I didn't really change their behaviour much, this is mostly just a
straight conversion. Main difference is that they will prioritise eating
nearby bananas and fruit salads over punching people.
When I make these conversions nowadays I need to decide between "does
this attack at the speed that it did as an NPC mob or the speed it did
as a player?"
I am arbitrarily deciding that gorillas are usually not players and
electing for the former, but tell me if you disagree.
I also made "show basic inhand sprites" into a component shared by
Gorillas, Drones, and Dextrous Guardians (all also now available to
become basic, once I get around to it),
And I added an AI behaviour to run a basic emote. This is similar but
different to "random speech", which kind of sucks and needs rewriting
anyway.
Gorillas don't speak, only ooga.
## Why It's Good For The Game
https://www.youtube.com/watch?v=npuuTBlEb1U
## Changelog
🆑
refactor: Gorillas now use the basic mob framework. Please report any
unusual side effects.
/🆑
* Basic Mob Gorillas
* Modular paths
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
* Watcher Nest Lavaland Ruin (#78790)
## About The Pull Request
Adds a small new lavaland ruin, the Watchers' Grave.


You will need to figure out yourself how to find a way through the walls
surrounding it (it's not very hard).
This is mostly just atmospheric but also serves as a delivery vehicle
for a unique item; an orphaned Watcher egg.
(That's kind of it in terms of loot, unless you count a handful of
lavaland mob corpses and mushrooms).
You can either eat this (it's an egg), throw it at someone to spawn an
angry watcher, or keep hold of it for a while and see what happens.
<details>

That's right it's your very own baby watcher.
It orbits your head and shoots at lavaland creatures for unimpressive
damage. It won't ever intentionally shoot a player but they might walk
in front of it, as it doesn't hurt very much they will probably forgive
you.
If you die it will continue circling your corpse to guard it against
predation.
</details>
In creating this ruin I also added a new component called "corpse
description".
It provides some extra examine text to a corpse which is removed
permanently if the mob is revived.
There's a field you can varedit on corpse spawners (or make a subtype)
which will automatically apply it to spawned corpses.
You can use it for environmental storytelling. Or admins can use it to
make fun of how you died.
Also I fixed basic mobs runtiming when examined by ghosts.
## Why It's Good For The Game
More variety in map generation. It's cute.
Adds a tool that mappers might like.
## Changelog
🆑
add: Adds a new lavaland ruin where you can find a unique egg.
/🆑
* Watcher Nest Lavaland Ruin
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* Flesh Spiders Regenerate + QoL (#78704)
## About The Pull Request
Replaces the Healing Touch component on Changeling-spawned Flesh Spiders
with the Regenerator component, as the comment helpfully suggests.
Flesh Spiders can no longer touch themselves to heal, instead they
automatically begin regenerating their health if they go four seconds
without taking damage. It takes 6 seconds to fully regenerate, so 10
seconds to fully heal from the edge of death (less if you're not that
injured).

Also I changed the sprite for flesh spider eggs to a different one we
already had rather than regular spider eggs tinted red, just because I
felt like it.
Would be cool to give the spiders their own sprite some time, but that's
for another PR.

_Additionally_ the flavour text for flesh spiders was kind of messed up
by being shoved into the objectives box and claiming that it was a
directive from a spider queen you don't have, so I gave them their own
slightly different antag datum to compensate.
It also actually mentions how you heal yourself, which previously was
down to trial and error or codediving.
In the course of doing this I decided to just... move flesh spiders to
their own type path. It _sort of_ made sense for them to be part of the
giant spider typepath, but they keep being modified by changes targetted
at "balancing the Giant Spiders antagonist" which this mob isn't related
to and doesn't have any reason to follow. The fact that a mob has
similar stats to another one isn't automatically a reason to share a
typepath, and now that I have looked a little at this mob I'm sort of
interested in branching it further away from "it's a spider mob but
spawned a different way" in the future.
Finally, this spider egg cluster and the midwife one would prompt ghosts
with a radial menu with a single option on it... that's a bit pointless,
so we'll bypass that menu if there is only one possible outcome.
## Why It's Good For The Game
Currently Flesh Spiders heal by clicking on themselves and standing
still for two seconds, restoring 50% of their HP. This means they can
fully regenerate over 4 seconds unless you stun them, and with 90 HP
you're not _that_ likely to kill one during the channel time.
This just feels like an odd way for the creature to operate,
regenerating instead gives it a hit-and-run strategy and adds more use
to their webs (maybe we should give them meatier or bloody webs at some
point? Might be cool).
Also clicking yourself to heal is just unintuitive and I suspect several
players just didn't realise they could do it in the first place.
## Changelog
🆑
balance: Flesh Spiders heal automatically over time if they go a short
time without taking damage, instead of healing large chunks by clicking
themselves and waiting two seconds.
qol: Spider egg clusters which only hatch into one kind of spider don't
ask you to select that one type from a radial menu with one option on
it.
qol: As a Flesh Spider, the game now tells you how you can heal
yourself.
/🆑
* Flesh Spiders Regenerate + QoL
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* Fixes some issues with mirrors not updating mob appearance after making a selection
* Update mirror.dm
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Add burning sound loop to bonfires and fireplaces (#78834)
## About The Pull Request
This adds a ignition sound whenever a fireplace or bonfire is initially
lit on fire. Afterwards a continuous burning loop is played. Also added
some documentation and optimized fireplaces to only `process()` when
lit.
## Why It's Good For The Game
Better consistency.
## Changelog
🆑
sound: Add burning sound loop to bonfires and fireplaces
code: Improved fireplaces to only process when lit
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>
* Add burning sound loop to bonfires and fireplaces
---------
Co-authored-by: Tim <timothymtorres@gmail.com>
Co-authored-by: Ghom <42542238+Ghommie@ users.noreply.github.com>
* Adds a cowboy bundle to the nuclear ops uplink (#78874)
## About The Pull Request
Tin
The bundle includes revolver, holster, armored cowboy outfit, horse,
apples to tame said horse, and a complimentary lighter.
It costs 18tc, so it's a little more expensive than getting the revolver
& holster on their own, but you also get a horse so it's worth it.
## Why It's Good For The Game
This was intended as a lone-ops bundle so we can finally have some lone
rangers but I think having a crew of cowboy outlaws doing a "train
heist" for a nuke is really funny.
## Changelog
🆑 Wallem
add: Nuclear Operatives now have ready access to ancient cowboy
technology in the form of the Outlaw Bundle. Now you too can roll into
town on your horse.
/🆑
* Adds a cowboy bundle to the nuclear ops uplink
---------
Co-authored-by: Wallem <66052067+Wallemations@users.noreply.github.com>
* Autopsy scanners fit in surgery trays (#78835)
## About The Pull Request
This enables surgery trays to hold autopsy scanners
<details>
<summary>
Screenshot
</summary>

(Scanner not included)
</details>
## Why It's Good For The Game
Since it is a tool used in a surgery's step, I feel it makes sense that
the autopsy tray (and surgery trays as a whole) should be able to hold
this item and it potentially means less switching between containers.
## Changelog
🆑
qol: The autopsy tray (and surgery trays) can now hold the autopsy
scanner
/🆑
* Autopsy scanners fit in surgery trays
---------
Co-authored-by: YehnBeep <86855173+YehnBeep@users.noreply.github.com>
* General code maintenance for Reagents (#78637)
## About The Pull Request
1. Moved global procs inside of
`code/modules/reagents/chemistry/holder.dm` that are not tied to
`datum/reagent` to it's own dedicated global list file
`code/_globalvars/lists/reagents.dm` these procs initialized global
lists so it makes sense to move them here and also reduces the size of
this file a.k.a code organization
2. Moved global lists inside `code/_globalvars/lists/objects.dm` that
are related to reagents also to `code/_globalvars/lists/reagents.dm`.
Now all global reagent lists are located in this 1 file a.k.a code
organization
3. Other code improvements for reagent code & its holder include
- removed a ton of unused procs
- removed unused vars and local defines
- replaces `!` with `QDELETED()` in place of some target objects
- throws stack trace if you pass an invalid reagent path to some procs
- Heavy auto doc for a lot of procs
4. Adds a lot of sanity checks on numbers related to reagents i.e.
whenever a reagent is added/removed/transferred etc 3 sanity checks are
done on those numbers
- We first check is the number valid via the `ISFINITE()` macro. This
macro wasn't used as much as it needs to be so it is added in some
missing places. If not a stack trace is thrown
- The number if it relates to reagents volumes must be greater than
`CHEMICAL_QUANTISATION_LEVEL` define so we don't deal with 0 or very
small/negative numbers
- The number is then quantized i.e. we do `round(amount,
CHEMICAL_QUANTISATION_LEVEL)` so we don't deal with numbers having 10
decimal places or something like that
- Replaced `CHEMICAL_VOLUME_MINIMUM` with `CHEMICAL_QUANTISATION_LEVEL`
so we can use the same constant everywhere
5. Addresses one of the issues presented in #31206. One way this
occurred was when multiple reagents was put in a beaker and then a
dropper was used to transfer them. Because multiple reagents were to be
equally divided by their volumes when sucked up by the dropper some
rounding was done causing fractional errors. That has been improved
although not completely fixed cause there is a chance for it to occur
when for example an odd number of reagents are transferred between the
beaker and dropper. Another instance where it can occur is when very
small volumes are being transferred. When this happens `update_total()`
removes these reagents before they can be transferred causing missing
amounts.
6. Numbers were being rounded in inconsistent ways for e.g. in some
places it was rounded with the correct quantization constant
30782f817d/code/modules/reagents/chemistry/holder.dm (L264)
But in other places it gets rounded with a different constant
30782f817d/code/modules/reagents/chemistry/holder.dm (L653)
We should be using the 1 constant `CHEMICAL_QUANTISATION_LEVEL` for all
these places so we don't get different values. so the rounding was added
in multiple places but we use `FLOOR()` instead so we don't get values
greater than the volume of reagent available.
## Changelog
🆑
code: moved some global procs and vars related to reagents to its own
dedicated file. removed some unused procs and macros
code: heavy auto docs for a lot of procs
refactor: adds reagent sanity and bound check code
refactor: multiple reagents are more uniformly distributed when
transferring them between beakers or dropper & in every other reagent
dependent operation
/🆑
---------
Co-authored-by: Jacquerel <hnevard@ gmail.com>
* General code maintenance for Reagents
---------
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@ gmail.com>
* [NO GBP] you can hit tendrils in melee again (#78856)
## About The Pull Request
adds an `else . = ..()` to spawner's attackby check so you can just
break them with your crusher in case you need to be rid of it
## Why It's Good For The Game
sometimes you just need to melee a spawner
## Changelog
🆑
fix: Necropolis tendrils and other mining mob spawners can be hit in
melee again.
/🆑
---------
Co-authored-by: Hatterhat <Hatterhat@ users.noreply.github.com>
* [NO GBP] you can hit tendrils in melee again
---------
Co-authored-by: Hatterhat <31829017+Hatterhat@users.noreply.github.com>
Co-authored-by: Hatterhat <Hatterhat@ users.noreply.github.com>
* changes COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED into a more versatile signal (#78832)
## About The Pull Request
COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED is now
COMSIG_GLOB_PUZZLE_COMPLETED
the light puzzle thingamajig now uses that
puzzle doors on init register this signal, which means if the signal is
sent all doors with the ID passed with the signal would open
## Why It's Good For The Game
this means we can use the signal for more pieces such as cool buttons or
pressure plates that open doors or whatever else that registers the
signal
or you could like make a component that does puzzle stuff like making a
mob send it on death
and mappers can change puzzle_id to link stuff together
## Changelog
🆑
code: COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED is now
COMSIG_GLOB_PUZZLE_COMPLETED
/🆑
* changes COMSIG_GLOB_LIGHT_MECHANISM_COMPLETED into a more versatile signal
---------
Co-authored-by: jimmyl <70376633+mc-oofert@users.noreply.github.com>
* Spider Type Check Fix (#78817)
## About The Pull Request
Fixes bug, I am running out of gbp plz merge
## Why It's Good For The Game
Fixes#78802
## Changelog
🆑
fix: Spider types get properly checked again.
/🆑
* Spider Type Check Fix
---------
Co-authored-by: Comxy <tijntensen@gmail.com>
* Tendril Tagging - scanning necropolis tendrils with a mining analyzer updates its GPS tag (#78738)
## About The Pull Request
Makes it so that if you wave a mining analyzer over a necropolis tendril
(kinda like a geyser), its GPS tag is updated with a code for what it
spawns and a numerical designation. Unlike geyser scanning, this awards
no points, and is solely for figuring out what tendril spawns what
fauna.
<details>
<summary>Screenshots in the dropdown:</summary>



Updated: now on the `structure/spawner` level, allowing it to cover
icemoon spawners.

Updated again: now it has an associated examine thing.

</details>
Also removes the redundant `gps` variable because it got
componentalized.
## Why It's Good For The Game
I think being able to know what one of fifteen eerie signals is spawning
without having to memorize which one is spawning which thing at what
coordinate, or just vaguely going "oh so that's where the legion tendril
was today".
## Changelog
🆑
qol: Miners can now tag monster spawners (necropolis tendrils, animal
dens, demonic portals, and netherworld links) by using their mining
scanner on it, which updates their GPS tag (and/or gives them one) to
give it a numerical designation and a short identifier for what it's
spawning.
/🆑
---------
Co-authored-by: Hatterhat <Hatterhat@ users.noreply.github.com>
* Tendril Tagging - scanning necropolis tendrils with a mining analyzer updates its GPS tag
---------
Co-authored-by: Hatterhat <31829017+Hatterhat@users.noreply.github.com>
Co-authored-by: Hatterhat <Hatterhat@ users.noreply.github.com>
* adds directional helpers for empty fire axe and mech removal crowbar cabinets (#78722)
## About The Pull Request
title. it's mostly so they can be used conveniently in areas you don't
want to put fireaxes, but do want an empty cabinet for reasons.
## Why It's Good For The Game
more flexible options for mappers, more convenient than making
directional variants yourself. it's what the helper is for
## Changelog
🆑
qol: gives empty fireaxe and mech removal crowbars cabinets directional
helpers
/🆑
* adds directional helpers for empty fire axe and mech removal crowbar cabinets
---------
Co-authored-by: Lamb <110322848+CoiledLamb@users.noreply.github.com>
* Renames prison intercoms (#78781)
## About The Pull Request
This renames prison intercoms to "receive-only intercom"
## Why It's Good For The Game
It's rare a day goes by that I don't see someone confused about why
these intercoms "aren't working.", and if it comes up in conversation,
most sec players don't seem to be aware either. There's already a note
about the intercoms being receive-only in the examine text, but
apparently it largely goes unnoticed.
This change should make it very clear, at a glance, that players should
not expect to be able to transmit using these intercoms.
It'd probably also be a good to grey out or hide the transmit button but
this is what I can do and makes it obvious to everyone.
## Changelog
🆑
qol: "prison" intercoms have been renamed to "receive-only" intercoms to
make it clearer they cannot transmit.
/🆑
* Renames prison intercoms
---------
Co-authored-by: YehnBeep <86855173+YehnBeep@users.noreply.github.com>
* offical to official (#78762)
## About The Pull Request
Fixes "offical" to "official" in several locations - admin fax panel,
admin newscaster, art patron text, a photocopier template, and a corgi
tail pin item description. Adds this common misspelling to the
check_grep.sh ci tool.
## Why It's Good For The Game
I have corrected the typo manually every single time I have sent a fax
from Central Command.
## Changelog
🆑
spellcheck: "offical" has been officially corrected to "official" in
several official locations.
/🆑
* offical to official
---------
Co-authored-by: Isratosh <Isratosh@hotmail.com>
* Fix ID card examine runtime (#78785)
## About The Pull Request
This always expects to return a list, even if empty.
But this early returned before the parent call, meaning it didn't return
the empty list (from parent) as expected.
## Changelog
🆑 Melbert
fix: Fixed an error from reading an ID card closely when you can't read
/🆑
* Fix ID card examine runtime
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
* allows janitor keys to be stored in janitor wintercoats and janibets (#78724)
## About The Pull Request
the janitor access key could not be stored on their belt, or their
wintercoat slot, which felt off to me. so i added it to both of them,
and added the janicart key to the coat slot as well. i figure if one can
fit, the other probably can too.
## Why It's Good For The Game
convenient, less cumbersome storage for items that you want to keep both
close to your person, and accessible for easy use.
## Changelog
🆑
qol: allows janitor keys to be stored in janitor wintercoats and
janibets
/🆑
* allows janitor keys to be stored in janitor wintercoats and janibets
---------
Co-authored-by: Lamb <110322848+CoiledLamb@users.noreply.github.com>
* Basic Mob Flesh Worm (#78744)
## About The Pull Request
Fixes#68614
Converts the Flesh Worm (Armsy) into a Basic Mob.
Most of its behaviour has been moved into a component which we can use
to make arbitrary mobs into linked lists of mobs.
To accomplish this I added a signal which is sent when you call any
`adjustXLoss` proc, let me know if my implementation is "calling the
same signal from several places" by a backdoor, I wanted to avoid
registering to 6 signals but I'll change it if I must.
While I was here I killed the unused "lesser" variant because we stopped
using it. Resultingly, Ascended Armsy doesn't need to distinguish itself
by inflating the sprite, so it doesn't. This means that now flesh worms
are using their sprites as intended to be displayed, but if people
really miss all of its segments being poorly scaled by the byond engine
then I guess I can restore it.
## Why It's Good For The Game

## Changelog
🆑
refactor: Flesh Worms are now basic mobs. Please report any unexpected
behaviour.
sprite: Flesh Worms are a little bit slimmer.
/🆑
* Basic Mob Flesh Worm
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* Engineering Borgs can no longer grab their own iron module (#78773)
## About The Pull Request
Borgs apparatus modules can no longer pick up items located inside
themselves (or another borg, technically). I can't think of any
situation where a borg would legitimately need to do this, and it can
cause bugs. Closes#76699. Closes#77659.
## Why It's Good For The Game
This is a major borg that can result in humans having un-droppable borg
modules in their hands.
## Changelog
🆑
fix: Engineering borgs can no longer grab and drop their own iron/glass
sheet module.
/🆑
* Engineering Borgs can no longer grab their own iron module
---------
Co-authored-by: GPeckman <21979502+GPeckman@users.noreply.github.com>
* Adds a passive scan to the Active Sonar module (#78734)
## About The Pull Request
Adds a passive, radial scan to the Active Sonar module.
This will scan a 1/8th slice around the player for any creatures, and
place a much smaller marker over them for the player to see.
These small markers do not update their location when the scanned
creature moves, unlike the normal markers.
Activating the module initiates the normal full scan, which scans the
entire radius at once rather than just a slice. Doing so will put _both_
scans in cooldown.
https://github.com/tgstation/tgstation/assets/66052067/96226090-fa32-42d5-99f4-a8dbdc36cf98
## Why It's Good For The Game
Honestly I still felt the Active Sonar was a little weak even after I
tried to buff it a little.
I wanted to initially find a way to make the large scan effects smoothly
move with whoever you're following, but since I couldn't manage to
figure that out instead I went with a recommendation from ninjanomnom to
make a radial scan.
I think this is far more interesting either way
## Changelog
🆑 Wallem
add: Buffs the Active Sonar module with a radial scan, and makes the
power costs more in-line with other modules.
/🆑
* Adds a passive scan to the Active Sonar module
---------
Co-authored-by: Wallem <66052067+Wallemations@users.noreply.github.com>
* Adds The Hand of Midas, an ancient Egyptian gun. (#78699)
## About The Pull Request
Adds the Hand of Midas (HoM), a weapon for pirate captains.
This matchlock pistol is powered by gold rather than gunpowder.
If you hit someone with it, they will be afflicted with Midas Blight for
a duration of time that scales with how much gold is in your gun.
Midas Blight will slowly turn their blood into gold, and slow them down
depending on how much blood is in their system.
If you right-click on someone with the HoM, it will siphon all gold from
their bloodstream and recharge the gun, curing them of Midas Blight in
the process if they still have it.
The amount of gold you can get from people is meant to be ~1.5x as much
as you fired into them in the first place, if you get your timing right.
This way you can exponentially scale the power of your weapon if you can
hit your shots, with a limit of 30 Seconds on the Blight timer.
The siphon has a range of 2 meters, and if you miss a shot you can input
a gold coin into the gun to refill it with the same weak shot you
started with.
It's a little hard to explain in text so here's some video examples:
https://github.com/tgstation/tgstation/assets/66052067/d49238fc-beb2-4ba9-be0c-83e8a701c995https://github.com/tgstation/tgstation/assets/66052067/34dc23e7-2b88-4ee9-bb1e-c8067a491975https://github.com/tgstation/tgstation/assets/66052067/68a07426-ba6c-43a7-8228-132fc4b02b83
## Why It's Good For The Game
Honestly I just had the idea for the gun and thought it would be really
cool lmao.
Also because Barrel Behind the Door is one of the funniest YuGiOh cards,
the censored design is TOO GOOD.

## Changelog
🆑 Wallem
add: Adds The Hand of Midas, an ancient Egyptian matchlock pistol.
/🆑
* Adds The Hand of Midas, an ancient Egyptian gun.
---------
Co-authored-by: Wallem <66052067+Wallemations@users.noreply.github.com>
* Adds tongs (#78698)
## About The Pull Request
.
Adds tongs, as requested on the [Official TGStation13
Forums](https://tgstation13.org/phpBB/viewtopic.php?f=9&t=33026)
Tongs can be used to pick up food from two tiles away, and feed it to
people who are two tiles away.
You can also use them while in your hand to snap them together like a
crab, or use them to harmlessly pinch people who are up to two tiles
away.
Tongs are available from the kitchen's dinnerware vendor, the autolathe,
and the service lathe.
## Why It's Good For The Game
You can feed people from across a counter, without touching the food and
spreading your germs to them.
## Changelog
🆑 Coded by Jacquerel, Sprited by Dalmationer
add: Added tongs to the kitchen, which you can use to manipulate food
from further away
/🆑
* Adds tongs
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
* oh yeah oh woag
* maybe we can make uncommon into that
* gunnenshooter
* hard work work
* just now realised i forgot inhands
* inhands and worn
* soundsmith tf2
* does the rifles
* puts some of the pistol suppressor images in
* awawawa
* shotgun override apparently
* pistola
* grendae launcher
* dont forget the evil one too
* yeah lets fix that
* oops
* now lets see what kind of errors compiling gives us
* should hopefully be all the compile errors
* i understand morbius now
* surely it will work now
* fixes shrapnel grenades runtiming
* also fixed grenade rangefinding
* how'd I mess thta up
* fixes various issues
* granata!!!
* haha surely this will gow ell
* should fix the grendades for real
* opening this pr then dropping dead
* uhhh fixes some stuff i think?
* armory stuff
* random mapping things pt 2
* blehh :3
* fixes it forever and ever
* whar??
* turns out that needs a tweak
* curious
* that'll work 4 sure now
* fixes vr
* come on over wont you sway with me
* mhm yup
* should hopefully be all that's it?
* missing icons
* makes the rifle more expensive
* makes the smg a little less awful feeling
* dollar store suppressors, just a week away
* mmsmrmmrsgg
* lets the shotguns actually be sawn off
* the propaganda
* hey thats important
* sprite error (comical)
* gives the casings custom materials for printing
* i love code ordering
* 'lets just be safe' ifies the weight classes of mags and ammo boxes
* reworks the sol defense selection a bit
* Update modular_skyrat/modules/ammo_workbench/code/design_disks.dm
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
* act three
* defines
* undefine
* restores the clothing
* some stuff part 3
* fixes the outfit guns not existing
* adjusts firerates and grenade launcher sprites
* fixes .35 sol revolvers??
* slightly un-nerfs the rifle firing rates
* makes the revolver jus tuse the normal sound
* makes the pistol case the right path
* its a machinegun!
* slight little tiny tweaks
* british weather service
* puts the blueshield gun box in their locker
* makes rifle less lethals a bit more normal
* slightly changes the smg burst and firerate
* the pepperball had raygun
* pepperball caliber
* forgot to push the include
* i love testmerges
* revolver sillies
* makes the kiboko's examine_more not just the rifle's
* smallens the eland and enlargens the cost of the kiboko
* lets change the machinegun a bit too why not
* gfl larp (real)
* fixes modular armory templates
* lets cases be ordered dont worry about the other stuff
* makes the takbok say its from the right company
* makes sawn off shotgun suppressors visibile
* those aren't used at all
* tweaks some of the rifle sprites
* shortens the shotgun a bit
* puts the pixel shifting out of initialize to make certain things work b
* granata!!!1!!!
* large number of weapon and ammo tweaks
* windup autofire seems broken somehow?
* fixes the inhands
* outfit sanity
* .40 armor piercing ammo box name correction
* removes var that doesnt exist anymore
* .40 armor piercing rework
---------
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
Co-authored-by: GoldenAlpharex <jerego1234@hotmail.com>
* A thorough audit of damage procs and specifically their use in on_mob_life() (with unit tests!)
* Modular changes--bonus, removes a bunch of completely unused code signals code that was taking up resources needlessly
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Tweaks railings to stand and look taller (#78598)
## About The Pull Request

This Pull request updates the sprites used by railings, including both
directional, corner, outer corner, and rail ending sprites.
Additionally, I've placed railings on the GAME_PLANE_UPPER plane, so
that visually it looks like railings in front of a player can physically
stand in front of the player.
## Why It's Good For The Game
This ports the railing sprites I did for The Wallening (tm) onto live,
providing a 3/4ths perspective sprite, in addition to the fact that
it'll help sell the height of objects by layering in a more satisfying
way.
Not to mention, I just think they're way better than current railings,
where are both ancient and super flat sprites.
## Changelog
🆑
image: Railings have had a visual update.
/🆑
* Tweaks railings to stand and look taller
---------
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
* adds boxes of bandages, and bandages to go in them (#78406)
## About The Pull Request
have you ever walked into medbay, picked up a suture, and asked yourself
"how do i know how to stitch myself up?"
do you long for the simplicity of a bandage that can be popped on, no
thought required?
well, look no further! now introducing, the DeForest First Aid Bandage!

each box of bandages holds five each, which are all one time use items.
using one heals up to 25 brute damage from a single part of the body.
boxes of bandages will drain much faster than sutures, and are much less
precise for healing specific increments of damage, but heal more in
exchange. they are also worse at stopping blood loss, but not completely
useless for it.
they can be found in a handful of places:
(some) high value medkits
in paramedic's pockets
some medbay lobbies
some cargo holds
all sec infirmaries
in goodies on the cargo console
maint loot
and nanomeds!
i considered making these replace brute kits, but those are used in a
lot of old references, so it felt a bit passe. so i made a new item that
is a bit more balanced, so they can be mapped in and added to vendors
without much worry.
## Why It's Good For The Game
cute item, heals the people who wouldn't really be going into medbay
anyways, and is fairly flavorful. if it's a bit too strong as is i can
tweak the number, but the goal is to not be powerful enough to outshine
sutures, while still offering somewhat effective healing for rough
housing assistants and antags
## Changelog
🆑
add: adds boxes of bandages, a quick healing item
/🆑
* adds boxes of bandages, and bandages to go in them
* Update medical_boxes.dm
* Update VoidRaptor.dmm
---------
Co-authored-by: Lamb <110322848+CoiledLamb@users.noreply.github.com>
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
* The fishing portal generator expansion (plus skill-chip) (#78203)
## About The Pull Request
This is a PR I worked on last month, but had to put on hold while
dealing with some pressing issues with fishing feature, minigame and
other stuff, and because I had to atomize out some of the stuff
previously present here.
I've expanded on the fishing portal generator to do something other than
dispense guppies and goldfishes. It now has multiple settings,
unlockable by performing scanning experiments for fish types, available
from the get go, which also reward a meager amount of techweb points
upon completion. The generator can now be built too. No longer it has to
be ordered from cargo.
It can also be emagged for the syndicate setting, tho right now it only
dispenses donkfish and emulsijack, both otherwise impossible to get
outside of... exodrone adventures.
The advanced fishing rod now comes with an experiment handler component,
specific to the fish scanning experiment, that automatically scans
fished content. The node to get it now requires 2000 points and the
first fish scanning exp to be unock.
A new skillchip has been added, which adds a trait that changes the icon
of the fish shown in the minigame UI, giving some clues on what the
reward will be. The same trait is also gained by reaching the master
(penultimate) level of the fishing skill.
A new fish type has been added, with its own quirks. One of these quirks
included temporarily switching movement direction of the bait.
Currently, it can only be fished in the hyperspace and randomizer
setting of the fishing portal.
Screenshots:


## Why It's Good For The Game
The fishing portal generator is but a stale and underdeveloped prototype
of the fishing feature right now, so much I was thinking of removing it
at first. However, we also have a lot of fishes which are pretty much
unfishable, so I came up with the idea of adding new portal settings
that allow people to actually get them.
As for the skillchip and trait, it's but an extra to both the vending
machine in the library and the fishing skill itself, which has an
overall humble impact on the minigame.
## Changelog
🆑
add: Expanded the fishing portal generator. It now comes with several
portal options that can be unlocked by performing fish scanning
experiments, which also award a modest amount of techweb points.
balance: The fishing portal generator is now buildable and no longer
orderable. The board can be printed from cargo, service and science
lathes.
balance: Advanced fishing tech is no longer a BEPIS design. It now
requires the base fish scanning experiment and 2000 points to be
unlocked.
add: The advanced fishing rod now comes with an incorporated
experiscanner specific for fish scanning.
add: Added a new skillchip that may change the icon of the "fish" shown
in the minigame UI to less generic ones. Reaching master level in
fishing also does that.
qol: The experiment handler UI no longer shows unselectable experiments.
/🆑
* The fishing portal generator expansion (plus skill-chip)
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
* ArCargo: Adds the Galactic Materials Stock Market V1.2 (Free Market Edition) (#78500)
## About The Pull Request
**This PR is a rerelease of #78164, with some bells and whistles.** As
such, most of the core functionality is the same, but with some tweaks
to balance the gameplay and prevent bike levels of profit. I've tried to
bold the new additions to make it easier to read for those coming back
for the second pass.

This PR adds a new machine that can be bought called the **Galactic
Mineral Market** (GMM). The Galactic Mineral Market (GMM) allows you to
buy and sell minerals wholesale from the market machine. It goes
something like this:
### 1. Getting the Machine:
The GMM can be bought as an un-assembled machine for 600 credits from
cargo. It's a low cost, but its not mapped in standard, so if you're
confident in your miners, you shouldn't necessarily need one for the
department. Otherwise, it's available for other crewmembers to buy for
cost.
The cargo pack comes will all supplies necessary to finish the machine.
Tools not included.
### 2. Buying Low
Using the machine's UI, you can see all traded minerals and their
associated prices. Buy prices are played straight, and can be bought for
material price, times the quantity. The order is then instantly placed
on the cargo shuttle, and will be deducted from the buyer's account on
shuttle send. **A single order can only have 10 different stacks of
materials in it. So, that can be 100 sheets of iron and 1 of everything
else, or 500 sheets of iron. After that you're blocked from buying more
sheets until you've sent the order.**
Cargo staff with standard cargo access may toggle the machine to order
directly from the cargo budget. Otherwise, materials are only purchased
from private accounts.
All purchases are treated as private and must be opened by the recipient
like private orders.
### 3. Selling High
It's stocks time. To sell minerals on the market, simply insert any
relevant metal stock into the machine. This produces a totally original
and not-a-bounty-cube stock block, which can be sold on the cargo
shuttle for cargo funds. Stock blocks can also be price-tagged as well
following their standard process.
**Stock blocks start out a bright pink and are worth the value of that
material at that time, but over time their color will degrade. After a
full 5 minutes, stock blocks will switch over to a purple hue, and their
value will once again become liquid, subject to the current market
value. This encourages players to be a bit more fast on their feet than
before instead of just waiting forever for all of their investments to
arrive at the perfect value, before the inevitable "rest of the game"
tries to upend your investing.**
Sold cargo stocks are subject at a 20% processing fee as part of the
galactic mineral market.
### 4. Outside Factors
**In-game events like the Crab-17 or the Market crash event will cause
stocks to bottom out completely, and for the market to become
unavailable until the market stabilizes. Thankfully, once the market has
crashed, typically stocks will recovery and gain back some value,
allowing for fast acting market movers to capitalize on rough markets.**
**Additionally, low value materials like iron and glass have an extra
stipulation, as their value goes all the way down to 0 credits. In that
case, you are unable to buy them at that value as a market protection.
Be careful that you don't see a reset or crash when you're planning on
selling your horde of iron and glass stocks!**
Additionally, market events can occur during the round that can more
sharply adjust a single stock's price and completely rebound it's
trajectory. These events are always mentioned in the station
announcement's economics report.
### Other notes:
The market does not cover all minerals, partially for consistency
purposes as well as for balance reasons. Plasma, being a unique material
that only Nanotrasen has their hands on, is the sole exporter of plasma
in the system, so it stands to reason that it's not on the market, and
remains a solo export. Bananium, as it has a rare and expensive
conversion rate, works the opposite way, and as such isn't listed on the
market either, with the sole source being single cargo sales. All others
just don't make much sense to include into the market at this second, so
I left them out for now.
**Alright now below I'm going to cover the math and shit so if that's
not what you care about then please scroll past.**
<details>
<summary>Warning: Arcane is about to talk about the math</summary>
Alright.
So this adds a new stock_market subsystem, which fires once every 20
seconds. I'm still fairly new to subsystem design so I'm probably going
to need some feedback on cleaning this up to make it look nicer and run
smoother.
So we have 4 associated lists, each attached to the relevant traded
datum; this tracks prices, market trends, how long that trend is going
to last in SS fires, and market quantity.
Prices fluctuate between 0.5x and 3x the material's single sheet value.
This could be tweaked even farther in the future, but for now I'm
keeping it at this nice clean margin. Prices fluctuate based on a
gaussian normal distribution that is centered on different points based
on their **trend**. Upward trending materials are centered in such a way
that they'll almost certainly go upwards, but being that it's based on a
random chance, not always. Vis versa, downward trends should tend to
lose value at about the same rate. We also change our rounding based on
this trend data, in order to prevent low price values like iron and
glass from getting stuck in the same value or freefall drop over time
just because of rounding down. Similarly, neutral trending materials
will not change nearly as much, and will generally stay at around the
same amount.
When buying or selling a material, the quantity of that material will
change on the market. The magnitude of that change depends on how much
of that material currently exists on the market. Buying a low quantity
material like diamond for example will tangibly increase that material's
cost, while buying stacks and stacks of iron and glass won't do much
damage to the price of iron as there's usually around 500 full stacks on
the market to start with. It's applied at a relative percentage of
(qty_changed / new_total_on_market) * price of goods bought/sold at.
In addition to that, there are random "market events" that can occur
randomly, which you might miss if you don't follow the newscaster
economy news. These three events are fairly barebones now, but in
general they have a 1% chance of happening per material, and can more
dramatically increase, decrease, or fully reset the value of a material
on the market back to it's standard value. This opens up for doing more
with it in the future, but that's a later problem.
</details>
## Why It's Good For The Game
This independently resolves some issues related to #78040, that being
that lowpop stations, or shifts with few miners would have a new way to
be able to still get some access to minerals in a given round. This also
provides a unique minigame and alternative way to acquire money in a
given shift, using minerals.
**"But Arcane,** I hear you ask. **"Isn't this just the same thing you
tried doing way back when and then reverted in #50537?**
Well, fuck man, how you doing I haven't see you around in forever also
no you're completely wrong and here's why
**This PR is no longer contingent on the rest of ArcMining in it's
current iteration.** I have introduced some extra factors into the
gameplay as well to try and curb the creation of bikes within gameplay.
This also provides a massive benefit to round progression and gives the
QM and the cargo members the ability to prevent round progress from
stalling by buying round-critical resources.
Not to mention, as the GMM is not cargo required, more cargo integrated,
it also functions as economy content for the rest of the crew.
## Changelog
🆑
add: A new export has arrived in the imports section, the Galactic
Materials Market! You can use this to buy and sell minerals for profit
or cost, as well as stock your station when you don't have any miners.
add: Insert sheets of minerals into the Galactic Materials Market to
convert them into a stock block, allowing you to lock in your price for
5 minutes. Wait too long and it'll be subject to market value again!
add: Minerals can be bought on the market either using the station's
cargo budget by cargo crew, or privately by everyone else.
del: Any material stacks that can be bought and sold on the market
before have been removed from the cargo catalog.
/🆑
---------
Co-authored-by: Jeremiah <42397676+jlsnow301@ users.noreply.github.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@ users.noreply.github.com>
* ArCargo: Adds the Galactic Materials Stock Market V1.2 (Free Market Edition)
---------
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@ users.noreply.github.com>
Co-authored-by: Zephyr <12817816+ZephyrTFA@ users.noreply.github.com>