## 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>
Fixes#80926, fixes#80372
The tongue, eyes, ears and brain vars were also being updated and
cleared elsewhere, runtiming whenever a regular head got dismembered and
then emptied, which would eventually cause a harddel due to improper
clean-up
I've fixed the errant proc and just removed those vars because I don't
like having duplicate references for no reason (they should always
already be in contents)
Not player facing
## About The Pull Request
bileworms will no longer infintely try to eat what they already ate
## Why It's Good For The Game
fixes#80948
## Changelog
🆑
fix: fix bileworm ai going insane after eating someone
/🆑
## About The Pull Request
Adds few (3) log registers and (2) visible messages for interactions
like; mob hits solid turf (wall for instance), mob gets hit by
obj/machinery and log register for mob gets hit by item without "living
thrower"
Edit: adds additional logregister and chat message when mob hit by non
carbon mob
## Why It's Good For The Game
Fixes#76085
And on top of that, PR is supposed to make situations where players are
being hurt or moved by objects without direct interactions with the
second player (if he does exist) a bit more trackable for player and log
divers.
## Changelog
🆑
qol: Players are now able to see in chat when they are being hit by
obj/machinery, got crushed into dense turf or get hit by thrown non
carbon mob.
admin: Scenarios like mob hits dense turf, obj/machinery hits mob, item
without "living thrower" hitting mob, mob gets hit by thrown non carbon
mob now appear in logs.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
In a previous PR (https://github.com/tgstation/tgstation/pull/79661), I
noted that a lot of moodlets tended to have their timeouts break because
it was passing their names and whatnot as a parameter, that gets fed
into the timeout modifier parameter, causing the timeout multiplier to
break, because BYOND type-agnosticism means that it can multiply a
number (timeout_mod) by text (a name or some other object), resulting in
0 - which makes a moodlet permanent. This is probably not intended.
This fixes that in two ways:
- Adding a `1` to potentially applicable moodlets (searched for with a
regex of `.add_mood_event(.*, .*,)`) just to make sure the timeout
doesn't get multiplied out weirdly.
- Making the add_mood_event thing CRASH() if the timeout_mod is bad.
If someone else wants to come up with a solution better than this,
please do.
## Why It's Good For The Game
Maybe having your arm permanently fall asleep after getting it
reattached sucks, moodlet-wise. (Being stuck with permanent
positive/negative moodlets is probably not intended.)
## Changelog
🆑
fix: Moodlets with parameters/effects e.g. limb reattachment moodlets
should probably disappear more appropriately.
/🆑
---------
Co-authored-by: Hatterhat <Hatterhat@users.noreply.github.com>
## About The Pull Request
Title.
## Why It's Good For The Game
This way the mob will still look aligned with the tile it's standing on.
## Changelog
🆑
fix: Animals enlargened by the fugu gland are now visually aligned with
the turf they're standing on.
/🆑
## About The Pull Request
This PR fixes Rat King's abilities to no longer require clicking twice
(once on the ability button, once somewhere in the world space), instead
bringing them back to their original behavior of just needing to click
once on the ability button to activate them.
## Why It's Good For The Game
Fixes the abilities to return to their original activation behavior.
Pretty sure it was a mistake to not have click_to_activate set to FALSE
when the abilities got ported over to mob_cooldown actions, especially
since these abilities don't have any sort of aiming component to them.
## Changelog
🆑
fix: Rat King's abilities no longer require the user to click twice in
order to activate them.
/🆑
## About The Pull Request
This PR makes changeling eggs work again. Apparently at some point, they
stopped working entirely, as they never properly got added as an organ
to the victim's body (ironically because we were doing TOO MUCH work,
not too little). This PR also changes how changeling eggs keep track of
time until they hatch in order to make it more consistent.
## Why It's Good For The Game
Changeling eggs should work, right? Also, making the egg timer not
completely reliant on a passed in magic number and the whimsies of
Life() being proc'd when it should be consistently for 4 minutes should
make the egg feel more reliable to use.
## Changelog
🆑
fix: Changeling eggs laid by headslugs work again
fix: Changeling egg incubation times should feel much more consistent,
hatching after 4 minutes
/🆑
## About The Pull Request
See #80673
I took a nap and got an idea how to make it better, so here we are
Less snowflake code, very robust, very good
Technically runs way more checks so it is slower but eh I believe it's
worth it in this case
Fully tested, it works as it should
## Changelog
🆑
code: The check that prevents your stuff from dropping when you have
robotic parts is now more robust
/🆑
## About The Pull Request
`Trigger` has two args for CD actions, first is trigger flags and second
is target of the action (for AI). In this case it forgot the first.
## Changelog
🆑 Melbert
fix: Blood Drunk Miner (Hunter version) should dash a bit more.
/🆑