## About The Pull Request
makes maintenance drones able to pick up RCD and RPEDs in order to use
for upgrading and repairing the station as per their laws state
you used to be unable to pick these up due to "using this item may break
your laws"
which made no sense since they could be used to repair and upgrade
station gear
this fixes that
## Why It's Good For The Game
drones can now easily repair and maintain station equipment like they
are programmed to do so
additionally with the use of RCD they no longer need to carry around
metal sheets and glass sheets all the time, making their job way easier
## Changelog
🆑
balance: Maintenance drones now can use RPED, RCD, Holosign, and Spray
bottles
/🆑
## About The Pull Request
Ok so tracking (from the datum) worked, but when used to follow someone
it had a noticable delay from the datum needing to wait for process to
fire to do its work
This would be an expensive proc to run constantly, but we don't really
have to (there are not that many ai eyes in the world). So rather then
only processing to keep step, let's track the target mob by its
movement, and then fall back on a process loop to handle rechecking in
case of camera memes.
This does technically mean you won't "break" the track if the cameras go
out until the tracked mob moves, but I think that's a reasonable price
to pay for more responsive movement. I think I could make our current
system work with it too, though it would be a bit more wasteful. John if
you have opinions just lay into me.
I've also renamed/pulled apart the helper procs for the trackable datum,
with the hope of making how they are used more understandable at a
glance
Oh and rather then holding a weakref since I needed MOVED anyway I just
use QDELETING to free the ref if the mob goes away
### Edit:
#### Glide size touchups
Implements glide size mirroring so we move at the same speed as our
target
Also moves the existing signal to send to the trackable datum itself, as
appears intended from the doc comment
#### AI behavior changes
Rewrites ai movement to be less dumb
OK so 2 things here. One is a behavior change, the other is a visual QOL
thing.
The way ai movement works is we move graduated "steps". Either moving 1,
2, or 3 steps per tick.
We do this by, so long as input is held down, incrementing a number
called "sprint"
Currently it'll go from 10 to 50 (formula effectively looks like steps =
(sprint / 20) + 1))
Anyway, this is... not fine but ok, but the way we handle deceleration
is ass IMO. It's literally just wait 0.5 seconds and sprint resets.
I think this feels crummy, so instead I've made it decay depending on
how long you go between inputs, at 7x greater rate then it increases.
That's the behavior change. Visual change is a lot easier.
Ais were not gliding properly. They assumed they had 4 ticks to move a
tile, rather then 1. This meant they'd jump around constantly, to catch
up to where we expect them to be.
I've fixed this by giving them 1 tick instead. Should feel a lot better
## Why It's Good For The Game
Snappier response times, cleaner code
## Changelog
🆑
add: AI's acceleration now smoothly decays, instead of just falling back
down to 0 after 0.5 seconds
fix: AI's standard movement (non accelerated) is smooth now, instead of
constantly jumping around
fix: AIs will now follow their targets more closely, shouldn't have any
issues with them lagging behind anymore
/🆑
## About The Pull Request
This adds a new trait, `TRAIT_ANALGESIA`, and makes various painkillers
(+ tenacity trauma) apply said trait.
This prevents various pain-related effects, such as screaming due to
pain, and also provides a speed bonus during surgery.
## Why It's Good For The Game
Gives more of an incentive to actually use reagents such as morphine or
miner's salve.
## Changelog
🆑
add: Painkillers (i.e morphine, miner's salve) now actually induce
analgesic effects, preventing various pain-related effects, such as
screaming due to pain, and also provides a speed bonus during surgery.
add: The tenacity trauma (traumatic neuropathy) also applies analgesic
effects.
refactor: Simplified code related to reagents adding traits.
/🆑
## About The Pull Request
Fixes#76900
I made it so bloodied hands use two separate overlays instead of jankily
swapping which icon is applied to the one overlay, because it was
literally never clearing the individual hand overlays, which is what
caused the linked issue
I also fixed your hands appearing bloodied when holding bloodied gloves,
this was caused by a _one character incorrect negation_
I remember this bug having been around for a long while I have no idea
how no one else has fixed this by now
Oh and also I think the overlays have never correctly updated when
removing or attaching limbs? Baffling, honestly.
## Why It's Good For The Game
Bugs are bad and these ones in particular were making me mad.
## Changelog
🆑
fix: Getting blood on your hand when you only have one no longer makes
your hands visually permanently bloody
fix: Holding bloodied gloves no longer makes your hands look bloody,
bloodied gloves now look bloody when worn, and damaged gloves now look
damaged when worn
fix: Gaining or losing an arm now correctly updates your hand overlays
/🆑
## About The Pull Request
[Fixes static lights not
moving](ffef43c05a)
Worked fine when the owner moved, but if the owner was inside something
else, it would try and trigger an update on the PARENT's lights, which
are obviously not us.
[Renames MOVABLE_LIGHT and STATIC_LIGHT to better describe what they
do](de73a63bd4)
People keep trying to change the lighting system of lamps and it makes
me mad.
I choose OVERLAY_LIGHT and COMPLEX_LIGHT here, I couldn't figure out a
better name for turf matrix lighting. Suggestions welcome
## Why It's Good For The Game
Closes#80005
Hopefully improves understanding of lighting at a glance
## Changelog
🆑
fix: Fixes fancy lights not updating their source location when picked
up and moved
/🆑
## About The Pull Request
It was dumb. LITERALLY just a proc.
So let's replace it with a proc then, as a helper at least. I'll take
this chance to disambiguate tail code to make it a bit less messy, and
hand back usable args in case we want to react to our change in tail
status
## Why It's Good For The Game
Code's less shit (slightly)
## About The Pull Request
adds a new gateway map, the Nanotrasen Museum it is filled with
""""Mannequins"""" and Common Core lore
im not putting the preview here because you really should explore it
yourself but if youre that curious i think the Checks tab in mapdiffbot
would have it
this gateway map contains no combat unless you count falling into chasms
because you did not carry a light
or going into the boarded room with no loot or any incentive with
obvious signs that there is the sole enemy on the map in there
the loot is the lore ok thanks
also makes mines detonate if theyre detonated by a non-mob im pretty
sure this couldnt have been intentional
trams stop chasms
and also the relevant items
<details>
<summary>on second thought if you want spoilers check this</summary>

</details>
## Why It's Good For The Game
more gateway maps = good
## Changelog
🆑
add: nanotrasen museum gateway map
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
- Fixes https://github.com/tgstation/tgstation/issues/81363
- Fixes unable to set MuleBOT home from control panel
- Fixes missing MuleBOT ID from Botkeeper PDA app
- Adds input validation for changing MuleBOT ID from control panel
- Removes hardcoding of MuleBOT IDs and home destinations
- MuleBOT will now automatically set its home to the navigation beacon
on its initialization turf
## Changelog
🆑 LT3
fix: MULEbot will correctly display its loaded cargo on BotKeeper
fix: MULEbot home beacon can be set from control panel
code: MULEbot home location is automatically set on init
/🆑
## About The Pull Request
Adds a signal when someone buys an item from the uplink and removes
single-letter vars from the ``spawn_item`` proc, and adds/standardizes
add/removing of telecrystals from uplinks (and admin setting how much TC
they have) to ensure the UI always has the right amount of telecrystals
displayed in it.
## Why It's Good For The Game
There are reasons why someone would want to hook up to a traitor's
uplink and listen to items they purchase to do any special effect
on-purchase, so this adds support to do anything in the future with it.
Also tells players how much TC they actually have without forcing them
to close/reopen the UI every time they insert some TC in it by hand.
## Changelog
🆑
fix: Uplinks now update their UI when you add telecrystals in them, so
you don't need to close and reopen it.
/🆑
## About The Pull Request
Maybe finally fixes#77701
A big reason why this kept happening is because fire uses standing
overlays. But fire isn't managed by mobs anymore. Meaning in some
situations, fire can cease to exist but the overlay can still be on the
mob. So it gets stuck.
So like, why use standing overlays anymore? We can just hook
`update_overlays` signal.
Isn't that neat.
## Changelog
🆑 Melbert
refactor: Fire effects get added to mobs in a different way now. Maybe
it will get stuck less. Report any oddities.
/🆑
## About The Pull Request
Fixes#81350#81321 wasn't done as tactfully as it should have, resulting in some
oddities like bolas in your pockets giving you slowdown. This PR cleans
up the code and makes it work as intended.
Thanks to Melbert for literally just giving me the code for this. I did
test it and added proc comments so I can guarantee everything works.
## Why It's Good For The Game
You shouldn't be slowed down from a bola in your pocket, and this logic
is much nicer than what we had before.
## Changelog
🆑
fix: Bolas in your pockets no longer slow you down.
/🆑
## About The Pull Request
What it says on the tin. I also replaced checks with it everywhere I
found appropriate, hopefully without accidentally breaking anything.
## Why It's Good For The Game
We have a helper for most other antags, and it makes code a lot cleaner
and easier to read. I'm surprised we didn't have this one already.
## Changelog
🆑
code: added an IS_CHANGELING() helper and used it where applicable
/🆑
## About The Pull Request
Health analyzer includes a blood alcohol content if the scanned target
is inebriated.
## Why It's Good For The Game
It's useful to know, sometimes their blood is filtered, stomach pumped,
but this effect will still be in action.
## Changelog
🆑 LT3
qol: Health analyzer will now display blood alcohol content
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Adds a new optional hotkey that targets only the head and does not cycle
to eyes or mouth.
Currently the way the numpad hotkeys work on /tg/ is every key targets
one body part... except 8. Numpad 8 Currently cycles through
head-eyes-mouth, despite _**numpad 7 already handling mouth and numpad 9
already handling eyes**_. There's no head-only key.
## About The Pull Request
Currently on live, when an alien hunter goes for a pounce, once the
pounce is completed the hunter will rise quite a distance slowly from
the floor as setting body_position_pixel_y_offset now is done with
animation as opposed to being instant. This looked extremely stupid, so
I went and fixed it. Initially, I was going to add some form of trait to
cancel out the smoothing effect from a shifting y offset, until I looked
at the sprite for alien pouncing and realized it was 96x96 for no
reason. For reference, 96x96 is the size of Bubblegum's sprites.
So, I just made the sprites 48x32, got rid of the unused sprites
(sentinel and drone both had pounce sprites but neither ever had that
ability iirc) and adjusted some of the pounce ability's internal offset
stuff to compensate and it looks perfectly fine now. Somehow made the
image file larger by 243 bytes according to Github but I guess it is
what it is.
## Why It's Good For The Game
The alien hunter ascending from 2 tiles below where it actually was
whenever it pounced was incredibly jarring. This fixes the problem.
## Changelog
🆑
fix: Alien Hunter's pounce ability no longer has any weird offset issues
once the pounce is completed.
/🆑
## About The Pull Request
Currently on live, if you throw a bola at a xenomorph or use a beartrap
on them, the legcuff will successfully attach itself to the xenomorph
but nothing will happen. It will not be present visually nor apply
slowdown to the xenomorph at all, and it also gives the xenomorph no
indication that it is attached to them or option to remove it. This PR
fixes that problem by moving some human-specific code downwards,
allowing xenomorphs to visually have legcuffs applied to them, be slowed
down by them and to take them off by themselves.
Note that as with all cuff-related items, xenomorphs will break the item
immediately upon attempting to resist it at all. Therefore, this PR
doesn't really do anything balance-related, although maybe you can buy
yourself a half-second while the xenomorph you just bola'd realizes they
need to take it off before chasing you down again.
Another thing to note is that queens and praetorians don't look right
with these overlays applied (they float to the left of their sprite),
but that's a bigger issue with a lot of the overlays in general (fire
being a big one), to be fixed in another PR.
## Why It's Good For The Game
This has bothered me for a while now, so its about time I do something
about it. Even if using bolas or beartraps on xenomorphs is practically
useless, if we're gonna let players do it then we're going to let them
do it right.
## Changelog
🆑
fix: Xenomorphs now have legcuffs applied to them properly.
/🆑
## About The Pull Request
fixes#80946
not sure why it borrowed the wrong commit msg
## Why It's Good For The Game
on the one hand it's funny but on the other hand it's dumb to be able to
buckle massive mobs to tiny-sprite objects they might not be able to get
out of without just destroying their own chair - assuming they can,
which in the case of some things you can buckle to, you can't (looking
at roller beds.)
## Changelog
🆑
fix: removed ability to buckle megafauna, constructs, blob minions,
dragons, and slimes.
/🆑
## About The Pull Request
- Large amount of storage datum cleanup.
- Documentation.
- Maybe more consistent use of parent vs real_location.
- Removes the weakrefs, replaces it with just references.
- These were already managed references anyways so why bother?
- Removes a bunch of arguments no one used and would ever used so only
the most useful args are left.
- Some bugfixes.
## Why It's Good For The Game
Aiming to make storage easier to work with. The whole intent of this was
to bugfix the whole "weight class" thing that keeps popping up but I had
to do this first.
## Changelog
🆑 Melbert
fix: When placing an item into storage (such as backpacks), all nearby
mobs now get a message, rather than just the first mob.
fix: TGC decks of cards should act a bit less odd when looking inside.
refactor: Refactored a bit of storage, cleaned up a fair bit of its
code. Let me know if you notice anything funky about storage (like
backpacks).
/🆑
## About The Pull Request
Tin.

No more of this. It's been annoying downstream for the past few days, so
here's the fix. `find_this_thing()` should not be getting called when
`controller.pawn` is qdeleted so I just moved that check up a couple
lines.
## Why It's Good For The Game
Makes CI functional again. Tested downstream with 5 CI runs, the runtime
did not occur in any of them where it was happening just about every run
previously.
## Changelog
🆑
fix: fixes a runtime in AI search_tactic
/🆑
## About The Pull Request
- Kicks Martial Arts out of the attack chain.
- All Martial Arts attacks are now handled via unarmed attack or grab
signals
- This means all martial arts are now technically on the living level,
allowing any mob that can unarmed attack to martial arts. Sort of. YMMV.
- All martial arts block checking is now handled by the arts themselves,
meaning you can selectively decide for a martial arts strike to not be
blocked. Maybe good for the future.
- A comprehensive cleanup of all existing martial arts. Improving var
names, code, adding some missing animation calls, etc.
Fixes#74829
## Why It's Good For The Game
Untangles the mess that is martial arts, making it a lot easier to work
with the attack chain and making it overall a ton more consistent.
## Changelog
🆑 Melbert
refactor: Big martial arts refactor, they should now overall act a ton
more consistent. Also technically any mob can do martial arts. Let me
know if something is funky.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
[Converts all manual extraction of rbg with rgb2num. It's just
better](ae798eabd5)
[Yanks out old HSV management, replaces it with list
stuff](4997e86051)
There's this old lummy era clunky code that passed HSV as text
We can now cleanly replace it with passing hsv as lists from a rgb2hsv
proc
So let's just do that.
Also, cleans up spraytan code (and ethereal lighting)
## Why It's Good For The Game
Code better
## About The Pull Request
Using feed while feeding on someone will now unbuckle you rather than
prompt you to buckle to someone else like it's supposed to
The list of people to buckle to no longer includes dead people (which is
beneficial for the last fix)
If there's only one person to buckle to then it will skip the UI and eat
that person.
## Why It's Good For The Game
Fixes to slime.
## Changelog
🆑
fix: Slimes using Feed while buckled now stops feeding.
fix: Slimes are no longer prompted to feed off of dead people.
fix: Slimes that can only feed onto one person now immediately feeds off
of them.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
When I wrote #81113, I foolishly set the flags on the nukie medbot by
typing out all the parent flags and removing the one I did not want.
This PR changes that to use the `parent_type::` operator and get the
actual parent flags, then removing the one we do not want. Not player
facing.
## Why It's Good For The Game
Looks cleaner in the code and probably helps maintainability.
## About The Pull Request
Added an update call to looping ambient sounds to `/mob/Login()`. And
removed ship ambience from the lobby area.
Doesn't fix the issue of ambient sounds not updating for ghosts since
they cannot enter areas. Should all dead mobs get updates to ambience at
all? Who knows
## Why It's Good For The Game
silence when starting the game is noticeably annoying.
## Changelog
🆑
fix: Ambient loops will now refresh when entering a mob.
/🆑
## About The Pull Request
fixes the flaky error that would happen in cleanbot controllers. i
discovered thru the profiler that a proc i was using to stop tracking
unreachable targets and caching them to a blacklist in selectbehavior
had a bit of a high real time cost, so if the mob got deleted midway
through for any reason would cause a runtime error. ive moved this proc
off selectbehavior and im instead letting the move loop cache this
target into the blacklist if it reaches the max pathing attempts
## Why It's Good For The Game
fixes a runtime that sometimes happens in ai controllers
## Changelog
🆑
fix: fixes a runtime that sometimes happens in ai controllers
/🆑
## About The Pull Request
Husk icons are now generated dynamically by greyscaling the limbs and
applying the husk blood overlay
rather than everything using the same husk sprite
## Why It's Good For The Game
Less sprites needed, also good for nonhuman races especially those with
non-humanoid shapes
All that is needed for a husk icon now is a blood overlay instead of an
entire limb set
Human, Lizard, Moth, Monkey husks
PIC IS A BIT OUTDATED, THE BLOOD IN PIC IS DARKER THAN HUSK BLOOD
(fixed) AND IT DOESNT "FIT" TO LIMB SPRITE (fixed)

## Changelog
🆑
refactor: Husk icons are now dynamically generated. See if you can
identify what species it was!
/🆑
## About The Pull Request
Alternative title: "Resolve Jerry Tramstation's impotence."
While cats had all the other requirements for breeding, the ai subtree
for it returns early as no `BB_BABIES_PARTNER_TYPES` had been set for
the cat ai and thus it would never actually try to breed.
This pr just adds a `BB_BABIES_PARTNER_TYPES` value to
`code/modules/mob/living/basic/pets/cat/cat_ai.dm`, so they can actually
have kittens again.
## Why It's Good For The Game
Fixes cat breeding bug.
And c'mooooon, look at theeeeem:

## Changelog
🆑
fix: Jerry Tramstation can get laid again! (Fixed cat breeding.)
/🆑
## About The Pull Request
### Alternative title: "Remove kitten omniscience."
>If you were to ever have the hubris of entering a kitten's line of
sight while holding a food they like, like a dead mouse, they would
start pointing and meowing at you. It's their food, after all. You
should give it to them.
However, if you were to drop the item, they would continue pointing.
If you were to leave the area, they would continue pointing.
Even if you were to run, to hide, to break down and cry.
They would continue pointing. Meowing
Forever.
And Ever.
You can't run. You can't hide. You can't fool them.
That ever sweet scent stays with you, lingering. It marks you.
Wherever you are, whenever you are, the wretched beasts will know.
Even in death your corpse will be theirs to torment.
For you, oh marked one, this is now a fact of life.
_And you better bring your masters their food._
Putting aside how funny the kitten-based triangulation device is, this
feels like an oversight.
`/.../beacon_for_food/finish_action(...)` even tries to clear the
begging target from the blackboard, but
`/.../beacon_for_food/perform(...)` never actually passes in the key.
## Why It's Good For The Game
Kittens no longer beg at you forever wherever you are, even after
dropping the food they were begging for.

Like forever, wherever.


## Changelog
🆑
fix: Removed kitten omniscience. (They stop pointing at you now.)
/🆑
## About The Pull Request
The nuclear operative medbot, Oppenheimer, now starts with airplane mode
enabled (aka, remote control disabled), so the presence of operatives on
the station Z-level is not immediately given away to AIs.

Fixes#81105
## Why It's Good For The Game
It'd be pretty lame to have your stealth ops operation ruined because
you forgot to turn on airplane mode, no? I don't think this was
intentional by any means, seems like an oversight.
## Changelog
🆑
fix: Oppenheimer, the nukie medbot, has been reprogrammed to use
Airplane Mode as a factory default. The station AI is no longer
immediately aware of his presence!
/🆑
## About The Pull Request
Converts legions hardcoded abilities to the cooldown action / mob
abilities system.
I also took the liberty of converting the hacky 360 second cooldowns in
a lot of the mob actions into simply disabling other abilities while the
ability is active, this will make it easier to have bosses without
everything on a shared cooldown and also not allow abilities to be used
simultaneously.
## Why It's Good For The Game
Paving the way for basic megafauna.
## Changelog
🆑
refactor: Legions abilities have been changed into actions that can be
added to any mob.
/🆑
---------
Co-authored-by: Changelogs <action@github.com>
## About The Pull Request
When cats were turned into basic mobs it seems a few things were lost in
translation, being footsteps and cytology cell swabbing. All this pr
does is basically re-add the lines that did such, though _slightly
barely_ differently due to now being basic pets.
## Why It's Good For The Game
Lets you get feliform cells again. Also cats not having footstep sounds
feels eerie.
## Changelog
🆑
fix: Cats can be swabbed for feliform cells again.
sound: Cats have had their mastery of silent walking revoked, and have
their pitter-pattering footsteps back again.
/🆑
## About The Pull Request
Newspapers work as a static newscaster that is not affected by things
like D-notices and changing wanted issues after its been printed. It
doesn't store comments or get any updates after its been printed.
You can also scribble on the paper to leave notes on a specific page,
which is a feature I have never seen in my life but it is still here I
guess.
Minor things I've added:
- Sound effect when printing the newspaper in the first place
- 2 second do-after when scribbling just for some player feedback and
consistency
- Balloon alerts
- Context tips for scribbling and burning
I also fixed an issue with wanted issues on newscasters when there isn't
an image.
As a minor note, I replaced the instances of ``content`` in Buttons I
saw in newscaster's UI because it's marked as deprecated.
Too lazy to take a video sorry



## Why It's Good For The Game
Fixes an issue with newscasters and makes newspapers use a nice TGUI
that feels more responsive than before.
Helps further https://hackmd.io/XLt5MoRvRxuhFbwtk4VAUA even more.
## Changelog
🆑
refactor: Newspapers now use TGUI.
fix: Fixed the newscaster's wanted section showing a non-existent photo.
/🆑
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->
## About The Pull Request
I moved the bit that says:
ADMIN: guy started hardcore random with cancer, for a score of 2
into game.log
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
## Why It's Good For The Game
I don't see why this wound up in Admin.log. Doesn't contain any admin
info, relate to actions done by admins, etc.
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
## About The Pull Request
`///Checks if the user is incapacitated or on cooldown.`.
Adds the "or on cooldown" part of the proc into the proc.
## Changelog
🆑 Melbert
fix: Click CD applies to looking up and down correctly.
/🆑
## About The Pull Request
See #81041.
## Why It's Good For The Game
Fix#81041
## Changelog
🆑
fix: Goldgrubs should no longer spit out things that aren't ore (e.g.
stasised mobs from the polymorph belt).
/🆑
This one's not like the last one, so much so that I'm not even going to
outsource the PR description to a robot this time!
Basically, **You should read the PR body before assuming that everything
is the same as last time. It's not.**
## Video Summary
Click the link below to see a video summary of the main features of this
pull request.
https://youtu.be/Aho2omR0mjY?feature=shared
## About The Pull Request
This pull request serves as a large rework of minerals produced by
mining, and by extension mining itself. I'll try and list each change
and it's associated nuance here.
### Ore Vents
The biggest addition to the game with ArcMining is **Ore Vents**. Ore
vents spawn as a ruin on the map, placing a randomized ore vent onto map
generation. Ore vents spawn in 3 different sizes, **Small, Medium, and
Large**. These vents will pick from a pool of materials they can
generate, and will hang out across the map. A player can use a mining
scanner to discover an ore vent, granting a small quantity of **mining
points** to begin with. Once scanned, ore vents will show what minerals
that ore vent will generate after they're fully tapped.
Scanning the vent again will trigger the extraction process. A small
drone will fly down, called the NODE drone, and buckle onto the vent.
Your job during wave defense is to protect the drone and to defeat waves
of randomly spawning mobs (dependent on if you're on lavaland or on
icebox). The quantity, duration, and time between waves is scaled to the
size of the vent you're protecting. Starting by scanning and protecting
lower tier vents earlier in the shift is a safer bet than doing a large
vent in the first few minutes. The drone has 500 health, and can take a
good few hits, but leaving it alone will cause it to meet an unfortunate
end quite quickly.
Cooperation can be your best asset, as mining with allies can greatly
help with wave defense, and mineral points are granted to anyone who
helps with defending the ore vent equally (So 500 * size tier,
regardless of how much help you receive). Once complete, the ore vent
will have a mining machine constructed on top of it, and will start to
dredge up **Boulders** from the earth automatically. More on boulders
later.
Ore vents can be located based on your mining scanner, and will provide
an appropriate audio cue based on if the ore vent has been discovered or
not, and once processed will no longer alert you to it's presence.
**Each station comes with a free vent that produces exclusively iron and
glass, free of charge.** This is to help with shifts where the station
may not have shaft miners to produce minerals, and to provide the
station with a baseline amount of minerals where none may exist
otherwise.
### Mineral Generation
Mineral generation has been completely reworked. Previously, Mineral
Generation had a flat 13% spawn rate in-game. Once minerals spawned,
they would also have a chance to propagate their minerals to nearby
tiles, resulting in a rather massive pool of minerals that could spawn
throughout lavaland on the whole.
This tweaks that, by making minerals in walls spawn based on their
proximity to ore vents on maps that use cave generation. Both the
probability, and quantity of ores spawning in walls is scaled based on
distance, with ore vents looking like large caches of ores found in
walls. This makes following ores found in walls and checking their
quantity of minerals spawned a good indicator of how close you are to a
nearby vent in-round.
This means you can collect some points form both discovering ore vents
first, as well as collecting their surrounding ores, turn those in for
mining points, and then trading them in for gear upgrades to more
effectively take on ore vents. As a result of tweaking the balance of
this, the total amount of ores spawned in walls overall has been
decreased. However, by making more of the process time based, we still
result in a mostly balanced finished product.
### Boulder Processing
On station, there are now three new machines. These are the BRM, the
Refinery, and the Smelter.
- The BRM acts as a teleporter. Instead of needing to carry boulders
back to the station, you can activate the BRM, and it will automatically
pick boulders to teleport back to itself. You can use this to teleport
boulders dredged up from lavaland onto the station for processing. **The
BRM will only lock on to boulders that are resting on an ore vent.**
Moving boulders back by hand will mean you'll have to haul it back by
hand.
- The refinery processes the non-metallic materials out of boulders.
This process sends the materials straight to the ORM, and collects
mining points from the ores smelted in the machine. Swiping with an ID
card lets you withdraw those points for your own personal account, but
remember that these points are for your whole team to share from. The
**Mining points obtained from this process is only 75% of the amount an
equivalent amount of ores would provide.**
- The smelter works nearly identically, however the smelter produces
metallic materials out of boulders instead.
- Once a boulder has had all of it's materials extracted, it's broken
down and deleted from the line. Otherwise, the boulder is spat out for
the next machine to process it (either the refinery or smelter).
- Once there's no minerals left in a boulder of any type, the refinery
or smelter will break the boulder down.
- Boulders **do not stack onto tiles with each other**, so they'll block
each other when pulled or when moving on a conveyor belt.
Boulders can also be processed by hand. Using a mining tool on a boulder
with right click will allow you to break down a boulder into it's
composite ores, but limits you to a maximum of 10 ore per boulder, where
the full amount can be extracted using the proper processing machines.
Also, processing by hand does deal small amounts of stamina damage over
time, do breaking a full large boulder can be particularly taxing.
Additional Boulder Processing Machines can be built, with the BRM board
being obtained from the Protolathe, while the Smelter and Refinery
boards being obtainable from the Autolathe instead. A _boulder
processing beacon_ can also be obtained from the mining points vendor as
a reward to assist with boulder processing. Boulder processing beacons
can be used to spawn in a new BRM, refinery, and smelter on the tile the
user is standing on, however **you'll still need to link them to the
ORM**!
All three machines can be upgraded with Stock Parts, allowing for **more
boulders to be processed at a time**. It does not, however, increase the
amount of minerals received from boulders, or points earned.
### Mining Borg Tweaks
Mining borgs have been given some minor adjustments to compensate for
the changes to mining. Their mineral scanner, which now has an active
component to gameplay, is now a module as opposed to built into the mob.
This module allows for the same ability to discover and start waves of
monsters to fight.
Mining modules will find that their PKA now has a total of 90% mod
capacity as compared to the 80% they had before, to allow for more
robust defense of ore vents.
In addition, all borgs and AIs can interact with the BRM for boulder
collection.
### Mining Mech Tweaks
Mining Mechs have had their utility tweaked as a result of these changes
as well. Mineral scanners to be used on mining mechs now have a larger
radius by comparison to their handheld cousins. Similarly, it now has an
active scanning button, which will actively discovery nearby ore vents.
To begin wave defense, you will need to hop out and scan a second time
however, so that you can properly accept the risks of drawing a horde of
bloodthirsty wildlife towards you and your companions.
Mechs can also manually process boulders, similar to mining tools using
their drill.
### Golem Tweaks
Golems, being more gentle and less aggressive than humans, while being
made out of LITERAL ROCKS, have a greater need to secure access to ores
and minerals to eat. As such, they have adapted to be able to do two new
things:
- Golems may now right click ore vents to be able to manually haul a
boulder out of the vent. This costs a hefty amount of stamina, but it
allows for golems to avoid combat during regular gameplay.
- Golems may now left click a boulder with an open hand in order to
manually process a boulder like a pickaxe. While not faster, it is
consistent and prevents golems from starving if they have access to a
vent, but no ores, somehow.
### Gulag Tweaks
The labor camp, being a camp for rehabilitation and ~~excessive manual
labor~~ has been tweaked. Boulders now replace the random minerals
located on their island, and to acquire their prizes inside, much be
excavated and then broken out of the rock. Now YOU TOO can excavate
minerals and become a true mineral hero by working your way to freedom.
### Mining Point Changes
As a result of fewer mining points being available across the map due to
the new ore spawning mechanics, and the shift in how and when ores will
be coming in, almost every progress based mining point cost has been
reduced by around 10-20%. Many numbers are still subject to change at
present, but the idea is that core progress unlocks should be made a bit
more available earlier in the round before players can start to solo or
duo larger or more difficult ore vents, after which they'll be rolling
in ores.
### Rarities
Every once in awhile, an unusual boulder will get hauled up from the
mineral rich depths of lavaland. These **Artifact boulders** can
occasionally produce rare items, but for now they've mostly just been
pulling up **Strange objects** for science. Nanotrasen Natural Sciences
department will reward you extra points to be collected by boulder
processing machines for successfully extracting one. In the future, this
opens up a passive reward space that mining can reward to the station,
like providing cytology DNA samples, ancient seeds, or other artifacts.
### Misc notes
- Boulders can be stored in all varieties of ore boxes (ground, mech)
should you choose, however as mentioned it's best to leave them where
they spawn and teleport them to the station for convenience.
- Maps that are not subject to cave generation will find that they are
largely untouched in terms of mineral balance.
- Future or existing ruins can now be tweaked to have a mineral balance
cost, as the ore vent ruin does. This will allow us to spawn in more
interesting ruins for pre-made combat challenges.
- There are unique ore vents that spawn across the map, that will summon
a boss mob relevant to that map. If the boss mob is defeated, that vent
will spawn large boulders pulling from every possible ore type that can
spawn. Not for the faint of heart!
- Similarly, the number of ore vents and mineral budget is now
adjustable in the cave generation procs, so maps may spawn with more or
less ore vents as desired for balance.
- Artifact boulders opens up a LOT of room for possible future content
like archaeology, xenoarch, artisci, and other design spaces!
- Megafauna STILL SPAWN ON THE MAP. They just happen to spawn in
addition to boss ore vents.
- **I'll add more to this as I get asked questions and remember things,
this is a huge PR and I'm confident I've missed at least something**
## Why It's Good For The Game
I outlined a lot of this in #78040, so I'll try and keep this relatively
snappy this time, while noting that I've made some concessions to make
the whole system a lot more playable while not trying to break out
design decisions that are at the end of the day, better for the game and
the overall resource balance in round.
Minerals are a very poorly balanced system, and have been since their
inception many years ago. We heavily rely on mineral balance in round,
and yet we've really only balanced it by introducing so much supply that
there's no equivalent exchange for materials that doesn't just heavily
flood the exchanged material. For example, items printed from materials
that are otherwise considered "rare" on master exist in such quantities
and they'll never practically run out in our allotted 90 minute time
slot design. This PR adjusts how ores spawn to a point where we can
minimize the amount of ores that need to exist on the map for mining to
be able to progress, while still providing enough resources for the
station that it covers the needs of the station adequately.
Miners will need to be more strategic about what resources they've
collected, and be able to make decisions about which vents are worth the
risk of attempting to fight, how to prepare for a wave defense, and when
to head back up for upgrades, while finally giving them at least some
kind of incentive to work together and use different equipment.
Resonators make cleaning up the caves around vent easy, sandbags set up
easy defenses for your vent, mechs can serve as a wider range radar
while mining, all while still providing a new gameplay loop to mining.
By limiting the amount of ores that can enter the round from the
massive, massive amounts that were coming into the round beforehand (see
#78346 ), we can make ore processing more meaningful by adding more
gameplay to the processing of minerals. I have some plans for that,
however this PR already got bloated really REALLY badly due to scope
creep and the number of intersecting systems that rammed into each other
to make this PR possible. So that'll be next. Plus, as I've mentioned,
we open up places for ore processing to find fossils, relics, and other
things that can implemented down the line.
Overall, I don't expect this PR to save or kill ore balance, but we gain
a LOT more control over it through the use of our mining defines
attached to this PR, and at the end of the day, that's a great place to
start off of.
## Changelog
🆑
add: Added ore vents. Scanning them with mining scanners shows what
minerals they contain. Scan again to fight off a horde of beasts as your
drone assistant excavates the vent, so the ore vent will produce mineral
boulders!
bal: Ores that spawn in walls now spawn based on their proximity to ore
vents, with their chance to spawn and their minerals contained scaling
from low to high.
add: Added the BRM, Refinery, and Smelter. These pieces of equipment are
used to process ore boulders into minerals for the station. Stock Part
upgrades allow more boulders to be processed at one time. They collect
mining points as well, to be redeemed with an ID card swipe.
add: Boulders are teleported to the station via the BRM if left
untouched. Boulders can also be cracked open for a reduced amount of ore
using pickaxes or golems hands.
add: All stations come equipt with a pre-excavated ore vent, which
produces a basic supply of iron and glass only. Scan other vents for
your critical resources!
add: Look there's a shit ton of changes on mining, for more detail check
out the Pull Request: https://github.com/tgstation/tgstation/pull/78524.
sound: New sounds and noises for your high octane factorio-like
gameplay!
image: All new boulder sprites for the new minerals and rocks added to
the mining gameplay loop, as well as mining machines!
image: Overlays appear over vents when scanned to let you know their
contents at a glance when actively scanned with any mining scanners.
/🆑
---------
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Pass `dismembered = TRUE` when calling `drop_limb` from `dismember`.
At a glance I don't think anything actually checked `dismembered`,
making this do (practically) nothing,
however I was writing some code that actually relied on checking this
only to find it was always passed as `null`.
I also audited some signal usages of dismember / drop limb to make sure
they're correct.
## Changelog
I don't think this will affect anything at current.
## About The Pull Request
fixes megafauna AI getting stuck attacking legion corpses
## Why It's Good For The Game
fixes#79757
## Changelog
🆑
fix: fixes megafauna AI getting stuck attacking some corpses
/🆑
## About The Pull Request
fixes a runtime when trying to unregister the move signal from the ghost
## Why It's Good For The Game
fix a runtime when loading ghosts to a mulebot
## Changelog
🆑
fix: fix a runtime when loading ghosts to a mulebot
/🆑
## About The Pull Request
Situation: areas have a list of all turfs in their area.
Problem: `/area/space` is an area and has a 6 to 7 digit count of turfs
that has to be traversed for every turf we need to remove from it. This
can take multiple byond ticks just to preform this action for a single
space rune
Solution: split the list by zlevel, and only search the right zlevel
list when removing turfs from areas.
replaces `area.get_contained_turfs()` with a few new procs:
* `get_highest_zlevel()` - returns the highest zlevel the area contains
turfs in. useful for use with `get_turfs_by_zlevel`
* `get_turfs_by_zlevel(zlevel)` - returns a list of turfs in the area in
a given zlevel. Useful for code that only cares about a specific zlevel
or changes behavior based on zlevel like lighting init.
* `get_turfs_from_all_zlevels()` - the replacement for
`get_contained_turfs()`, renamed as such so anybody copying/cargo
culting code gets a hint that a zlevel specific version might exist.
Still used in for loops that type checked so byond would do that all at
once
* `get_zlevel_turf_lists()` - returns the area's zlevel lists of lists
but only for non-empty zlevels. very useful for for loops.
The area contents unit test has been rewritten to ensure any improper
data triggers failures or runtimes by not having it use the helpers
above (some of which ensure a list is always returned) and access the
lists directly.
## About The Pull Request
I wanted to add the ability to shove people with shields by
right-clicking your target, just like how it works barehanded.
This also required a solid refactor of disarm code, effectively bringing
down the core of it to `mob/living` from `mob/living/carbon` or
`mob/living/carbon/human`. This also means you can shove simple mobs
inside closets, bins and on tables.
Xenos and borgs are pretty much immune to regular disarms, but using a
shield will work (borgs and royal xenos are immune to the knockdown).
The riot shield armor has been balanced. It now tanks melee attacks
pretty well, but will break against bullets in just about 2 to 4 hits
depending on the bullet damage. I've always found the lack of sturdiness
of the riot shields for what they're supposed to be good for a bit
detrimental.
Because I've refactored an item flag into a trait, I've had to add a new
MOD module that grants protection from shove knockdown and staggering;
found pre-installed in the administrative MODsuit, but I've also added
it to the black market to make it cooler.
You can bash people with the strobe shield on combat mode.
## Why It's Good For The Game
Currently, shields are simply items that take a held slot in return of
some block chance without being anything special, save for the strobe
shield's integrated flash I guess, but are also a botherance as most
crumple under the duress of less than half a dozen attacks. Meanwhile
swords and other weapons with blok chance just don't care.
TL;DR, I want them a bit more remarkable, and flexible as a tool.
Of course, this ended up in a larger refactor because the right-click /
disarm code was inconsistent.
## Changelog
🆑
add: Shields (and pillows) can be used to shove people around the same
way barehanded right-clicking does. Xenos and borgs can actually be
moved this way.
add: Added a new MODsuit module, the bulwark module, which prevents
knockdown and staggering from shoving, and getting pushed away by thrown
objects. Inbuilt for the safeguard MODsuit, but one might also it in the
black market.
refactor: Disarming has been refactored. You can now shove simple
critters onto tables and into bins and closets
balance: Shields now take their own armor values and the armor
penetration of the attack they blocked when damaged. This means shields
are a bit sturdier now.
balance: Riot shields can tank a lot more damage against melee weapons,
but less against bullets.
qol: strobe shields can now be used to bash people while combat mode is
on.
/🆑
## About The Pull Request
Partial Revert of https://github.com/tgstation/tgstation/pull/80800
Assuming every num passed in the parameters of `add_mood_effect` is a
`timeout_mod` is incorrect, because there can be mood events that take a
numeric arg which is not meant to be multiplied against the timeout.
This leads to the same issue as multiplying it with strings essentially
(in one case, shown below, this results in a negative duration of a
timer).


Plus having a keyword arg that may or may not actually be what the
keyword arg claims to be is really confusing and bad.
Instead here's what I propose: passing in an instantiated mood datum
itself, which has been modified, and copying the timeout from it before
discarding it.
It is not as clean as I'd prefer either, but at least it's logically
sound and the intent is clear, and it's the best I can think of short of
a major refactor of the entire system for this one small thing which is
only being used by food quality.

## Why It's Good For The Game
Clearer, less smelly code.
## Changelog
🆑
code: removed the timeout_mod arg from add_mood_event, which was only
used for one thing and causes more issues than it's worth
/🆑
## About The Pull Request
Emptying the access list of an ID is a totally legit thing to do, so
let's stop throwing errors because vibebots have no access at all.
## Why It's Good For The Game
Fewer runtimes.
## Changelog
Nothing changes.
Pretty self explanatory. I suppose this isn't a 100% fix or refactor,
since it adds a UI for their features and makes it removable, but also
these never happen
🆑
code: The mushroom cap is now an external organ (jungle station will
never happen)
fix: Mushpeople caps are no longer solid black
/🆑
## About The Pull Request
Alternative title: "Baby's third pr: surprise say code refactor"
While testing sign language I worked out that if the first message sent
after toggling sign language involves speaking directly into a radio, it
proceeds to use the wrong verb. After several hours of digging through
say and telecomms code, I worked out the cause:
the `verb_say` on humans is primarily updated to match tongue data
during the verb _selection_ method `say_mod()` in `human_say.dm`, and as
a consequence this meant the verb wasn't updated to the correct one
until far after it had been copied to a virtualspeaker, leading to the
incorrect verb being used for the radio message.
This pr fixes this by refactoring this verb updating behaviour to be in
a new method `update_verbs()`, which we then call _before_ attempting to
call `radio()` to avoid wrongful copying and thus fixing the bug.
There's theoretically also cases where the previous behaviour would use
the wrong verb if one lost or gained a tongue between radio messages, or
the wrong verb from those picked from a list for some simple/basic
animals, but those are significantly less common.
To note, I gave the new `update_verbs()` method the same arguments as
the `say_mod()` method it got split out of, but having gone through all
instances of it being used for this I don't feel it actually *needs*
those arguments. So I'm unsure whether it should keep them or not.
Opened as a draft for now for sanity's sake, and also cause, y'know, it
touches say code.
## Why It's Good For The Game
It was _really_ annoying.
## Changelog
🆑
fix: Signers no longer use the wrong verb when speaking directly into a
radio for the first message after toggling sign language.
refactor: Moved the updating of verb variables into a new method which
is called earlier in living's say, which should avoid this happening for
other things which updated their verbs the same way.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>