## About The Pull Request
Attempting to fix this hard del here:

I think the cause is from the turf changing, which
`/datum/elements/connect_loc` does not seem to take into consideration.
Now it should.
Also cleans up the signals in `/datum/component/infective/` which may be
another potential cause of issues.
## Why It's Good For The Game
Code that cleans up after itself is nice.
## Changelog
🆑
fix: fixes a hard del with decals
/🆑
## About The Pull Request
For a moment, I had forgot about saying I'd take a look into it, but it
seems the new fix to hard dels is causing some runtimes with empty
weakrefs. Beside, WEAKREF() doesn't work well with qdeleting atoms (so
you'd have to access the weak_reference var directly).
How immersion works is quite confusing even for me who coded it, trying
to work around some of the hefty limitations of the engine truly blows.
I could even ask MrMelbert to make a proc-chain chart for it.
But yeah, long story short, I only have a bare idea where the uncleared
refs would be. I suspect it could be `immersed_movables`. It's totally
possible since the proc can early return in a few cases, thus skipping
the ref removal, hence the title.
## Why It's Good For The Game
I didn't like the PR that implemented weakref usage into the element,
but I let it pass because "hard dels = bad". However, the runtimes
aren't that much more pleasant either.
## Changelog
N/A
## 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
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
Got this from reading #80915
The actual name of the element is not reported anywhere in the stack
trace, and while you might be able to figure it out from context clues
based on the procs invoked in the stack trace... this isn't guaranteed
and just makes it harder to diagnose these weird sporadic runtimes.
## Why It's Good For The Game
easier to figure out a problem when you have as much useful information
as possible
## Changelog
irrelevant
I've been coding a PR these couple days, and I've noticed a few
oversights, all related to food, while working on it.
This PR removes an unused, 12 years old datum, and some redundant text
macros in a text string, for processable items, that already uses the
bold spans. It also makes it so food made with a drying rack gets the
chef made trait, similarly to other methods (though not as foolproof).
## About The Pull Request
While failing to reproduce #80675, given no amount of slamming this poor
little moth creature through glass tables in any order and then
rebuilding it under them seemed to be doing anything, I found that it
_does_ cause a negative offset if the moth-to-be-slammed in question was
already on a table before being slammed into a glass table. (Don't worry
they have health insurance.)
After some debugging, this seemed to be because `Detach()` is called for
the new turf with the smashed table _before_ `on_exited()` is called for
the previous turf, causing it to first reduce one's offset by 12, and
then reduce it by 12 _again_ upon calling `on_exited()`. This seemed to
be true for whichever method was used, whether walking, dragging, or
being smashed.

So I introduced the same check for `TRAIT_ON_ELEVATED_SURFACE` that
`Detach()` has to `on_exited()`, making it only attempt to shift down
the movable if it still has the trait, and this seems to fix it fine!
It doesn't seem to cause issues with moving from beds onto tables or
tables onto beds, or smashing through glass tables from tables or beds.
So this should fix#80675, or at least I can't find what they would've
meant if not this.
And yes I did test this on Tramstation just in case.

## Why It's Good For The Game
Fixes#80675.
## Changelog
🆑
fix: slamming through a glass table while previously on a table no
longer gives you a negative offset.
/🆑
## About The Pull Request
Fixes#80686.
Somehow, these statics were not being initialized after the GLOBs. I
don't know how that changed. Makes them local references because they're
still used 3 times in the hot path.
🆑
fix: Fixed footstep sounds.
/🆑

`find_potential_targets/perform` currently has a pretty bad self cost in
part due to it running a second "loop over everything in range" check to
find turrets and mechs. This doesn't drop it down by as much as I'd like
because it still needs `hearers`, it still shows up pretty high, but
this at least cuts out some unnecessary work.
Best case is likely to minimize work AIs need to do when there are no
players on their z-level, as there are a lot of calls from Lavaland.
## About The Pull Request
Immerse was causing harddels due to it having references to mobs. Makes
it use weakrefs for mobs instead.
## Why It's Good For The Game
Immerse would cause harddels if a mob was deleted while it was in it's
list. It could probably also happen if a turf was deleted too, but doing
that here would be much harder.
no CL since nothing playerfacing
## About The Pull Request
Throwing a bee at someone injects that bee's reagents.
This has a larger code footprint than you might expect because venom
injection is done via an element which in turn gives a callback to a
component.
While I was touching that I also separated `COMSIG_MOVABLE_IMPACT` into
`COMSIG_MOVABLE_PRE_IMPACT` because a lot of effects trigger from
`COMSIG_MOVABLE_IMPACT` despite the fact that the throw impact can be
cancelled after the signal is sent.
I also added an inject check onto the venomous element for mob attacks,
so thick clothing can now protect you from venom injection.
I elected that Giant Spiders have big enough fangs to ignore this such
that this isn't a major balance change, as do moonicorns (that horn is
massive), Fire Sharks, and Clowns (no idea how they are applying chems
at all to be honest).
## Why It's Good For The Game
I thought about someone throwing a bee at someone like a little dart and
thought "hee hee"
## Changelog
🆑
add: If you throw a bee at someone it will hit them sting-first and
inject that bee's reagent
balance: Thick clothing can now protect you from the venom of bees,
snakes, frogs, and (small) spiders
/🆑
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
## About The Pull Request
FOV as it is currently implemented is incompatible* with wallening.
I'm doin wallening, so we gotta redo things here.
The issue is the masking of mobs. Wallening relies on sidemap (layering
based off physical position), which only works on things on the same
plane (because planes are basically sheets we render down onto)
So rather then masking mobs, let's reuse the masking idea from old fov,
and use it to cut out a bit of the game render plane, and
blur/over-saturate the bit that's masked out.
My hope is this makes things visible in light, but not as much in
darkness, alongside making more vivid shit more easily seen (just like
real life)
Here's some videos, what follows after is the commits I care about
(since I had to rip a bunch of planes to nothing, so the files changed
tab might be a bit of a mess)
Oh also I had to remove the darkness pref since the darkness is doing a
lot of the heavy lifting now. I'm sorry.
Edit:
NEW FOV SPRITES! Thanks dongle your aviator glasses will guide us to a
better future.
https://github.com/tgstation/tgstation/assets/58055496/afa9eeb8-8b7b-4364-b0c0-7ac8070b5609https://github.com/tgstation/tgstation/assets/58055496/0eff040c-8bf1-47e4-a4f3-dac56fb2ccc8
## Commits I Care About
[Implements something like fov, but without the planes as layers
hell](a604c7b1c8)
Rather then masking out mobs standing behind us, we use a combo color
matrix and blur filter to make the stuff covered by fov harder to see.
We achive this by splitting the game plane into two, masking both by fov
(one normally and one inversely), and then applying effects to one of
the two.
I want to make the fov fullscreens more gradient, but as an effect this
is a good start
[Removes WALL_PLANE_UPPER by adding a WALL_PLANE overlay to material
walls (init cost comes
here)](2548933739)
@Mothblocks see this. comment in commit explains further but uh, we need
to draw material walls to the light mask plane so things actually can be
seen on them, but we can't do that and also have them be big, so they
get an overlay. Sorry, slight init time bump, about 0.5 seconds. I can
kill it with wallening.
[Moves SEETHROUGH_PLANE above
ABOVE_GAME_PLANE](beec4c00e0)
I don't think it actually wants to draw here
@Time-Green I think this was you so pinging for opinion
[Resprites FOV masks to be clean (and more
consistent)](f02ad13696)
[f02ad13](f02ad13696)
This is 100% donglesplonge's work, he's spent a week or so going back
and forth with me sharpening these to a mirror shine, real chill
## Why It's Good For The Game
Walls are closing in
## Changelog
🆑 LemonInTheDark, Donglesplonge
image: Redoes fov "mask" sprites. They're clean, have a very pleasant
dithering effect, and look real fuckin good!
del: Changed FOV, it no longer hides mobs, instead it blurs the hidden
area, and makes it a bit darker/oversaturated
/🆑
###### * It's technically possible if we start using render targets to
create 2 sets of sources but that's insane and we aren't doing it
## About The Pull Request
Objects can be destroyed during a movement loop before the abstract
entered signal can be sent, so we need to make sure only mobs that have
been elevated are dropped down.
## Why It's Good For The Game
Fixes#80169
## Changelog
🆑
fix: climbing or being shoved into a glass table won't cause elevation
issues.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Implements half of this (with some minor changes):

The ultimate goal of this is to split our attack chain in two:
- One for non-combat item interactions
- Health analyzer scanning
- using tools on stuff
- surgery
- Niche other interactions
- One for combat attacking
- Item hit thing, item deal damage.
- Special effects on attack would go here.
This PR begins this by broadining tool act into item interact.
Item interact is a catch-all proc ran at the beginning of attack chain,
before `pre_attack` and such, that handles the first part of the chain.
This allows us to easily catch item interaction and cancel the attack
part of the chain by using deliberate bitflag return values, rather than
`TRUE` / `FALSE`*.
*Because right now, `TRUE` = `cancel attack`, no matter what, which is
unclear to people.
Instead of moving as much as possible to the new proc in this PR, I
started by doing some easy, obvious things. More things can be moved in
the future, or technically they don't even need to move in a lot of
cases.
## Changelog
🆑 Melbert
refactor: Refactored some methods of items interacting with other
objects or mobs, such as surgery and health analzyers. Report if
anything seems wrong
/🆑
This flag only worked on the `/obj/structure` and `/obj/machinery`
level, so let's rescope it from `flags_1` and put it where it belongs -
`obj_flags`.
Bitflag operators should be scoped to their subtype specific bitfield,
not really useful to have this take up a spot on the `/atom` level if
absolutely nothing other than `/obj`s use it.
## About The Pull Request
Fixes#69423
Cult halo and eyes were appearing on deconverted cultists due to a delay
when the element gets attatched. This lead to a small window of
oppurtunity where someone could get converted, then deconverted, and
still have the cult icons appear on them later.
## Why It's Good For The Game
The Antichrist is dead.
## Changelog
🆑
fix: Fix cult halo and eyes affecting deconverted cultists
/🆑
## About The Pull Request
medbots now drop hats when tipped closes#80134
medbots now drop their items when they explode
player controlled bots now have their normal speed back
## Why It's Good For The Game
they will now correctly drop their hats when tipped
## Changelog
🆑
fix: medbots now drop hats when tipped and drop their items when they
explode
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
fixes#80059fixes#80085.
The tram transportation doesn't use `forceMove()`, instead it just
changes the location of the objects directly. What's more, it doesn't
call `oldloc.Exited()` or `loc.Entered()` but only for areas. The
abstract exited/entered signals are from `Moved()` though, which is
called.
df4bc6d948/code/modules/transport/transport_module.dm (L519-L527)
About beds, well, I just happened to put a minus symbol where it
shouldn't be.
## Why It's Good For The Game
Truly one of the fuckups of the year. Now tested. I'll make a unit test
later.
## Changelog
🆑
fix: Fixed some oopsie whoopsie with elevation, trams and beds causing
people to visually ascend or descend to heaven or hell.
/🆑
## About The Pull Request
refactors bots into basic bots. i decided to do medibots first because
they were the most complex bots and wanted to get them out of the way
first. if this pr gets merged then i will be rolling out the rest of the
bot refactors over the next months
medibots can now wear any type of hats! some of these hats can trigger
unique new recorded voicelines and interactions!


## Why It's Good For The Game
converts medbots into basic medbots. they are now a bit more responsive
than before but overall they should act similarly to how they did. also
adds the basic bot ai framework which has all the generic bot behaviors
that the next bots may or may not need to have in their ai. i tried my
best to improve their code and turned some of their bitflags into define
bitfields. this pr may need a careful review because i did it from
scratch as the old bot project branch was too outdated for me to use
## Changelog
🆑
refactor: medbots are now basic bots. please report any bugs
add: medbots can wear hats!
/🆑
## About The Pull Request
Fixes#80027. My bad.
EDIT: Also fixes#80050.
## Why It's Good For The Game
See the issues above.
## Changelog
🆑
fix: Fixed an issue with the offsets of ridden vehicles on tables, and
another when buckled to a bed.
/🆑
## About The Pull Request
Or, how I tried to kill `/datum/forced_movement` but got absolutely
clonged.
Actually, I did kill `/datum/forced_movement`. It was only used in one
spot so I just went ahead and cooked it into a special utility datum
that should only be used in one spot. We can optimize the code later or
something, but I like the way it is right now (pretty much status quo
without the potential of someone using a depreciated framework).
Alright, there were also like 3 `TODO`s (4 if you count the move loop
comment (which is ehhhh)). I naively tried to tackle them a very hard
way, but then I just realized I could use the fancy new datum I cooked
up and wow they're all solved now. The hook looks so fucking good now.
* The code is overall more streamlined, with all of the post-projectile
work being handled by a special datum (I wanted it to be handled by the
hook but the timings were all based on SSFastprocess so datum it is).
Forced movement is killed but we just salvaged whatever we needed from
it.
* More traits to ensure we don't cheese in a way we're not supposed to
* A very sexy chain will spawn when you drag your kill in (this wasn't
there before but I fixeded it :3)
* The firer will actually get grounded when they try and shoot the chain
out. They get grounded for 0.25 seconds unless they hit something. I
don't know how the timing is but I think it's fair.
* We also add a unique suicide act, because I noticed we did the
"magical" one previously, which big-league sucked.
* More traits to ensure less cheese! I like how nice it is now.
## Why It's Good For The Game
The meat hook really makes you _feel_ like Roadhog from Overwatch.
Resolves a bunch of old TODOs while getting rid of a completely obsolete
framework in a really neat way. I don't typically like mixing balances
and refactors but these TODOs were getting crusty man i just wanted to
get them out of the way
## Changelog
🆑
balance: The Meat Hook will now "ground" you whenever you fire it out at
someone. You get a very small immobilization every time you fire, which
"upgrades" to a full immobilization whenever you actually hit an atom
and start to drag it in.
fix: A chain should now show up as you drag in something with the meat
hooks.
fix: Meat hooks should no longer play the "magical gun" suicide if you
were to use it, but instead do their own unique thing.
/🆑
## About The Pull Request
this pr transforms cats into basic pets! cats now have some new
behavior. they can carry fish and hunted mice in their mouths to deliver
it to kittens, and kittens will eat them.


if a kitten sees you holding food, it will point at you and meow loudly
until u give it the food.
becareful when putting male cats near each other, there is a small
chance they get into a heated argument and meow loudly at each other
until one of them flees.
also added a new small cat house for cats. cats will use these homes if
u build one near them (using 5 wood planks)

Chefs can craft the cake cat and breadcat. these are useful cats because
they can help the chef around in the kitchen. they will turn stoves and
grills off when food is ready, so they dont burn. and the cake cat will
help the chef decorate his donuts
## Why It's Good For The Game
refactors cats into basic mobs and gives them a deeper ai
## Changelog
🆑
refactor: cats are now basic pets. please report any bugs.
add: the cake cat and bread cat can now help the chef around in the
kitchen
/🆑
## About The Pull Request
From the creator of 'cosmetic' elements such as footstep_override and
immerse...
I've made an element called elevation that nudges mobs a few pixels up
while standing on things like tables, crates and beds.
Screenshots of many clones of the same character standing on different
objects:

## Why It's Good For The Game
It makes it look like the mob is actually standing on an elevated
surface.
## Changelog
🆑
add: Standing on structures such as crates, tables and bed will now look
like it.
/🆑
## About The Pull Request
https://github.com/tgstation/tgstation/pull/79903 Fixed the most common
one, but there are still more of these runtimes it seems.

This should take care of all the rest. It turns out that any one of the
step types keys in the list returned by `prepare_step()` can have `null`
values—not just the barefoot one—so we have to check for that in every
instance where we read from it.
(Shown here: the list that gets returned. Note that any one of these
turf vars can be `null`, aka these are the values that we need to
nullcheck for)
4a6d2b9297/code/datums/elements/footstep.dm (L96)
## Why It's Good For The Game
Bugfix
## Changelog
🆑
fix: fixed remaining footstep runtimes
/🆑
## About The Pull Request
This PR makes the following changes:
- Refactors inserting items into foam darts into a component on items
that can be inserted into darts
- Adds the aforementioned component to pens
- Provides an inspection tip for how to modify a foam dart
- Gives different pen types specific behavior when used in a foam dart
Pens typically give a foam dart 5 brute and 50% embed chance (affected
by falloff). The following types of pens give the specified properties
(usually directly derived from the pen's stats and additional
functions):
- Red pen (and four-color pen set to red): Slightly faster dart
- Captain's fountain pen: Slightly faster dart, and 75% base embed
chance
- Sleepypen: Tries to inject its reagents into the hit mob, but doesn't
penetrate thick clothing like syringe guns do
- Energy Dagger: 35 brute, 100% base embed chance, and slightly faster
dart
- Survival Pen: Mines rocks on impact
- Fine Tip Pen (if someone somehow manages to get one): 100 bare wound
bonus and 9000 demolition modifier
## Why It's Good For The Game
Expands the emergent gameplay possibilities of using pens in foam darts.
While there are balance risks involved with traitors being able to buy
the equivalent of reusable 45u syringe shots and 35 brute bullets, you
are not likely to get your pen back once it hits its target, unless you
somehow have the recall spell and have bound the pen to it. There are
probably more TC-efficient ways to achieve comparable projectile
weaponry, but foam dart guns have an air of subtlety to them... at least
until your skin is pierced by a pointy writing implement that may also
be something more deadly. If maintainers still have balance concerns,
please let me know.
## Changelog
🆑
add: Certain types of pens now function like you expect they would when
inserted into a foam dart
qol: Examining a foam dart closely will show you how to modify it, or
what it is modified with
/🆑
## About The Pull Request
Fixes#79764
I was going to tackle this issue by slamming `TRAIT_NO_SLIP_ALL` on
Atrocinator users and calling it a day, but like, that didn't feel
proper.
So I thought hey, we could just give them the flying movetype, even
though they technically aren't flying it means they're unaffected by
things that flying would make you unaffected by.
Nope, this means the mob technically "negates gravity", so no falling
and no feetsteps.
Let's try floating - this give us feetsteps but no falling upwards.
So instead of going back to square one, with `TRAIT_NO_SLIP_ALL`, I
decided to go for the more complex route of just adding a movetype.
Hence, move type `UPSIDE_DOWN`. This covers situations where a mob would
be "floating" above the ground, but still walking. ...Negative gravity.
This means overall the Atrociator acts more as you'd expect - you don't
slip on ice, you don't trigger bear traps or mouse traps, you can walk
over railings, unaffected by conveyor belts, etc.
## Why It's Good For The Game
Makes the Atrocinator a lot more consistent with how you'd expect for it
to work.
Admittedly it is a bit niche use of movetypes, but it can possibly be
expanded to more things in the future, who knows? I applied it to mobs
on meat spikes (even though they don't move), just for proof of concept.
## Changelog
🆑 Melbert
fix: Atrocinating mobs will now behave more as you'd expect. Meaning
they don't slip on wet patches, can't trigger bear traps / landmines /
mouse traps, ignore conveyors, and can walk over tables and railings.
fix: Floating mobs are unaffected by conveyor belts, acid (on the
ground), glass tables
fix: Floating mobs won't squish stuff like roaches anymore
fix: Fixes bear traps triggering on floating / flying mobs
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
I find the proc hard to read honestly. There's no reason we can't split
this into two functions - the secondary functionality is used only once,
in reader.dmm.
## Why It's Good For The Game
Code improvement
Glorious snake case
## Changelog
N/A nothing player facing
---------
Co-authored-by: san7890 <34697715+san7890@users.noreply.github.com>
## About The Pull Request
I would've been content to leave these, but you guys just haaaad to
overdo it
- Plates now respect weight class of items on top
- Fried food now respect volume of existing items
## Why It's Good For The Game
These exploits are not intended and have potential and, if abused, can
severely detract from rounds.
## Changelog
🆑 Melbert
fix: Plates now respect the weight class of items on top.
fix: Fried items now respect existing volume cap.
fix: Smartfridges now don't accept bulky food items, good thing we have
none of those right guys?
/🆑
## About The Pull Request
- Deletes `spec_attacked_by`
- Elements simple/basic mob attack threshold
- There was a skeleton mob that "mimics armor" but didn't use the actual
mimicing armor thing we have, so I changed that.
- Moves `check_shields` down to the living level, renames it to
`check_block`
- Martial art blocking is now signalized (only CQC uses it anyways)
- Cleaned up a bit of `attack_x` procs, but not a lot. Should have an
entire PR dedicated to this .... mess.
- Deprecates `/obj/item/melee`
## Why It's Good For The Game
Second verse, same as the first.
- Less bad species related procs.
- Largely brings a lot of code in line, making combat more consistent
across types.
- Makes it a lot easier to add new code relating to blocking or taking
damage.
## Changelog
🆑 Melbert
refactor: Refactored another large chuck of attack code, primarily
involving melee item attacks and non-human mob attacks. Report if you
see anything weird
fix: Pacifists clicking on simple robots or silicons no longer causes
sparks
fix: Blocked thrown batons are now properly... blocked
/🆑
## About The Pull Request
More code improvements for reagent holder. As you can see it removes a
lot more code than it adds so code savings are significant. This does
not touch on any floating point arithmetic, all that is behind us, this
focuses on removing redundant procs and merging existing procs to
achieve the same functionality so if you do see any changes in reagent
related behaviour it's not intentional and should be reported as a bug
here.
The following code changes can be summarized into points.
**1. Removes procs `get_master_reagent_id()` &
`get_master_reagent_name()`**
Both of these procs have the exact same functionality as
`get_master_reagent()` with the only exception of returning a different
value. Instead we can just call `get_master_reagent()` directly and
infer the name & type of it ourselves rather than creating a wrapper
proc to do it for us, therefore reducing overall code
**2. Removes & Merges `remove_all_type()` proc into `remove_reagent()`**
The proc `remove_all_type()` is highly inefficient, it first uses a for
loop to look for the reagent to remove & then it again calls
`remove_reagent()` on the reagent once it has found it. We can just
embed this functionality directly into `remove_reagent()` by simply
adding an additional parameter `include_subtypes`. This way the
operation is faster, and we reduce the code to get the job done. Also
now `remove_reagent()` will return the total volume of reagents removed
rather that a simple TRUE/FALSE
**3. Removes & Merges `trans_id_to()` proc into `trans_to()`**
Both these procs have the same job of transferring either a single
reagent or all reagents. `trans_id_to()` is a scaled down version of
`trans_to()` because
- It does not have any `method` var. This means if you want to transfer
a single reagent to a mob/organ or any other object it does not have the
functionality to expose the target to that transferred reagent.
- It does not have a `multiplier` var to scale reagent volumes
- It does not have code to deal with organs or stop reactions i.e. it
does not have the `no_react` var.
We can overcome all these short comings by simply adding an extra var
`target_id` to specify what specific reagent to transfer therefore
attaining the same functionality while keeping the benefits of
`trans_to()` proc therefore reducing overall code
**4. Lowers plumbing reaction chamber tick usage for balancing ph.**
Rather than invoking a while loop to balance ph it's much easier for the
player to simply make the reaction chamber wait for e.g. add a reagent
that will never come. This will make the chamber wait therefore giving
the reaction chamber ample time to correctly balance the ph and then
remove that reagent from the list therefore getting correct ph levels.
No need to create code hacks when the player can do it themselves so
the while loop has been removed
## Changelog
🆑
code: removed redundant procs `get_master_reagent_id()` &
`get_master_reagent_name()`
code: merged `remove_all_type()` proc with `remove_reagent()` now this
proc can perform both functions. `remove_reagent()` now returns the
total volume of reagents removed rather than a simple TRUE/FALSE.
code: merged `trans_id_to()` proc with `trans_to()` now this proc can
perform both functions
refactor: plumbing reaction chamber will now use only a single tick to
balance ph of a solution making it less efficient but more faster. Just
make the reaction chamber wait for longer periods of time to accurately
balance ph
refactor: reagent holder code has been condensed. Report any bugs on
GitHub
/🆑
## About The Pull Request
Fixes#76079
Basically we were both not getting all of the args that we recieve from
`COMSIG_ITEM_AFTERATTACK` which included the very important
`proximity_flag` which tells us if the person was in range to actually
hurt us or not. This means that clicking a mob with this element with a
stack of metal from across the room would cause them to aggro, which
makes no sense whatsoever. Let's actually use that proximity check.
We listen for projectiles hitting us separately, don't worry.
## Why It's Good For The Game
It just makes no damn sense, fixes some weird ass behavior.
## Changelog
🆑
fix: Bar Bots (and several other mobs) will no longer aggro on you if
you click on them with a "forceful" item from halfway across the room.
/🆑
## About The Pull Request
See the title.
## Why It's Good For The Game
Actually fixing #78646.
## Changelog
🆑
fix: Fixed catwalks over open space not making a sound when walked over.
/🆑
## About The Pull Request
makes the looms `loom_me` proc loop for stackable items (such as
cotton).
## Why It's Good For The Game
its a looping do_after, which is satisfying (and you don't need to click
as much).
## Changelog
🆑
qol: looms will now attempt to loop through stackable items (cotton as
an example)
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
this pr transforms gutlunchers into basic mobs and gives them a small
ranch that ashwalkers can manage. gutlunches come in various colors and
sizes! female gutlunches will come in different shades of red and males
will come in shades of blue. the child born will have a mix of his
parent's colors.

female gutlunches can make various healing milk and medicine from its
udder. but it will need to consume ores before it can start making milk,
u can either feed it by hand or u can put ores in the wooden trough and
they will go eat from it whenever they get hungry. feeding it gold or
bluespace ore will improve the healing quality of the milk for a short
while

the male gutlunchers are obedient pets. their stats vary from one
another in speed, attack and health. a male gutlunchers stats will
depend on the stats of his parents, the higher his parent's stats are
the better chances he has at rolling higher stats. so u can selectively
breed them to make sure they have the best stats possible. they will
listen to all ur commands and can mine walls or attack enemies if given
the command. also i wanted the farm to have wood fences so i added them
to the game, they cost 5 wood planks to make
## Why It's Good For The Game
refactors gutlunches into basic mobs. also i turned breeding into a
component so it can be applied to all animals and created a breed
command, pets that have this command and the component will go breed
with a partner u point at.
## Changelog
🆑
refactor: gutlunches have been refactored into basic mobs. please report
any bugs
add: ashwalkers have a small ranch they can manage
fix: wall tearer compnent wont runtime when interacting with mineral
walls
/🆑
## About The Pull Request
Finishing what https://github.com/tgstation/tgstation/pull/79513/
started, removes 'targetted' typo from code. Also updates the basic mob
guide with the new updated var names.
## Why It's Good For The Game
Typos bad. Accurate guides good.
## Changelog
🆑
code: gets rid of the rest of the instances of 'targetted' typo from
code
/🆑
## About The Pull Request
Fixes#79485Fixes#77552
Converts Guardians (aka Holoparasites) into Basic Mobs.
Changes a bunch of their behaviours into actions or components which we
can reuse.
Replaces some verbs it would give to you and hide in the status panel
with action buttons that you may be able to find more quickly.
They _**should**_ work basically like they did before but a bit
smoother. It is not unlikely that I made some changes by accident or
just by changing framework though.
My one creative touch was adding random name suggestions.
The Wizard federation have a convention of naming their arcane spirit
guardians by combining a colour and a major arcana of the tarot. The
Syndicate of course won't truck with any of that mystical claptrap and
for their codenames use the much more sensible construction of a colour
and a gamepiece.
This lets you be randomly assigned such creative names as "Sparkling
Hermit", "Bloody Queen", "Blue World", or "Purple Diamond".
You can of course still ignore this entirely and type "The Brapmaster"
into the box if so desired.
I made _one_ other intentional change, which is to swap to Mothblocks'
nice leash component instead of instantly teleporting guardians back to
you when they are pulled out of the edge of their range. They should now
be "dragged" along behind you until they can't path, at which point they
will teleport. This should make the experience a bit less disorienting,
you have the recall button if you _want_ to instantly catch up.
This is unfortunately a bumper-sized PR because it did not seem
plausible to not do all of it at once, but I can make a project branch
for atomisation if people think this is too much of a pain in the ass to
review.
Other changes:
- Some refactoring to how the charge action works so I could
individually override "what you can hit" and "what happens when you hit"
instead of those being the same proc
- Lightning Guardian damage chain is now a component
- Explosive Guardian explosive trap is now a component
- Added even more arguments to the Healing Touch component to allow it
to heal tox/oxy damage and require a specific click modifier
- Life Link component which implements the Guardian behaviour of using
another mob as your health bar
- Moved some stuff about deciding what guardians look and are described
like into a theming datum
- Added a generic proc which can return whether your mob is meant to
apply some kind of damage multiplier to a certain damage type. It's not
perfect because I couldn't figure out how ot cram limb modifiers in
there, which is where most of it is on carbons. Oh well.
- Riders of vehicles now inherit all movement traits of those vehicles,
so riding a charging holoparasite will let you cross chasms. Also works
if you piggyback someone with wings, probably.
## Changelog
🆑
refactor: Guardians/Powerminers/Holoparasites now use the basic mob
framework. Please report any unexpected changes or behaviour.
qol: The verbs used to communicate with, recall, or banish your Guardian
are now action buttons.
balance: If (as a Guardian) your host moves slightly out of range you
will now be dragged back into range if possible, rather than being
instantly teleported to them.
balance: Protectors now have a shorter leash range rather than a longer
one, in order to more easily take advantage of their ability to drag
their charge out of danger.
balance: Ranged Guardians can now hold down the mouse button to fire
automatically.
balance: People riding vehicles or other mobs now inherit all of their
movement traits, so riding a flying mob (or vehicle, if we have any of
those) will allow you to cross chasms and lava safely.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
[Implements the backend required to make targeting datums
global](6901ead12e)
It's inconsistent with the rest of basic ai for these to have a high
degree of state, plus like, such a waste yaknow?
[Implements
GET_TARGETING_STRATEGY](d79c29134d)
Regexes used:
new.*(/datum/targetting_datum[^,(]*)\(*\)* -> GET_TARGETING_STRATEGY($1)
Renamed all instances of targetting to targeting (also targetting datum
-> targeting strategy)
I've used GET_TARGETING_STRATEGY at the source where the keys are
actually used, rather then in the listing. This works out just fine.
## Why It's Good For The Game
Not a misspelled name through the whole codebase, very slightly less
memory load for basically no downside (slight cpu cost maybe but not a
significant one.
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
## About The Pull Request
Fixes#79388
Light eater element can no longer affect lava, space (starlight),
openspace, or any turf with transparency.
## Why It's Good For The Game
Better consistency.
## Changelog
🆑
fix: Fix light eater affecting lava, space, openspace, and transparent
turfs
/🆑
## About The Pull Request
This PR replaces a bunch of instances of mobs being able to smash walls
by clicking them once to being able to tear walls by standing next to
them for a few seconds while an animation occurs. Wall tearing is a
three-part animation and can be cancelled and resumed at any point from
the most recently completed step so it isn't _exactly_ a single two
second interaction, and is resultingly harder to interrupt.

Some mobs still destroy walls in a single click, such as Flesh Worms and
Star Gazers. Really whether I replaced this or not was largely down to
vibes.
It also deletes the `tear_walls` element because it was the same as
`wall_tearer` but without the fun visuals.
## Why It's Good For The Game
Deleting walls instantly with a single click is pretty obnoxious. This
method slows it down a _little_ bit but also looks visually cooler and
gives people on the _other_ side of the wall a warning that something is
about to bust through kool-aid man style.
## Changelog
🆑
balance: Gorillas, Seedlings, Gold Grubs, Mooks, Constructs, Ascended
Knock Heretics, Fugu and mobs subject to a Fugu Gland now rip up walls
in a slightly slower but more cinematic way.
/🆑
## About The Pull Request
Fixes a bug that the gorilla and dexterity holoparasite cannot get
things out of the backpack while holding it in his hand.
## Why It's Good For The Game
Fixes#79090
## Changelog
🆑
fix: Gorilla and dexterity holoparasite can now take things out of the
backpack while holding it in his hand.
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
This PR converts the two trader mobs into basic mobs, these being the
basic debug trader that buys ectoplasm and sells ghost burgers, and Mr
Bones, who buys empty milk cartons and bones, and sells bone relate
paraphernalia.
Traders now use dynamic appearance generation. The old sprites still
exist as hallucinations, and as shop signs.
Trader UI is now summoned via `COMSIG_ATOM_ATTACK_HAND`, which properly
cancels the attack chain, so there is no longer need to put it on
Interact.
I kept most of the original behaviour, but moved them off into a
component. I have also cached all the images generated for the radials,
I hope I have not overengineered it. I have also created a new datum,
which stores the trader's wares, needs, and speech patterns.
Admins can put the component along with the trader data on any living
mobs with an AI controller, turning them into traders. Keep in mind that
most AI has random idle movement, meaning they have a chance to walk
off, closing your trader radial.

The trader AI consists of the following, first, when a trader sees
someone, they will deploy their shop, if one does not already exists.
The shop consists of a chair, and a holographic sign. If you attack
them, they will chase you with their weapons, and then return to their
chair when victorious. If the chair is somehow destroyed, they will
create a new shop when they see a new potential customer.

Mr Bones uses a variant of the AI, where they will run at you, and
deploy their shop when they reach you. I call this the jumpscare
variant. Below you can see me getting actually jumpscared because Mr
Bones has stepped on a yelling frog when I opened the maintenance door.

I have also made an element that toggles an ai controlled combat mode
when it gains a target, and when it loses it. I am using it to make
Traders unable to trade while they are trying to kill a robber. To aid
this, I a have made
`/datum/ai_controller/proc/sig_remove_from_blackboard` send the
`COMSIG_AI_BLACKBOARD_KEY_CLEARED` signal, in case the trader kills a
mob that deletes itself on death. This means I could remove a signup
`/datum/component/appearance_on_aggro` was doing towards Qdeleting.
Below you can see Mr Bones shooting me with candy corn.


Traders actually only shoot you until you are conscious, so I survived
here in crit. Most mobs don't have crit state, so they just die, so I am
sticking by this voice line.
Thank you @CoiledLamb for help with the sale sign!
## Why It's Good For The Game
Two more mobs off the list. The AI and Componentized behaviours allows
us to set up new kind of traders.
## Changelog
🆑
refactor: Traders are basic mobs now. Please alert us of any strange
behaviours!
code: If there is only one option, radial lists will autopick it. This
behaviour can be turned off via a new argument.
/🆑
## About The Pull Request
#67676 described a bug where PDAs can apparently emit a small amount of
light after being affected by the light eater. As it turns out, the bug
is even worse than that. It doesn't work for just PDAs, it works for
basically any light source that can be turned off and on. Even
flashlights. In the following pictures, a flashlight has been
light-eaten and then turned off and on again:

Observe how the nightmare jaunt is available, as it should be. However,
one step closer to the flashlight:

The nightmare jaunt can no longer be used, because the flashlight is
still emitting light.
This PR just fixes that behavior. Light-eaten objects will now be
totally dark again, even after being power cycled. Closes#67676.
## Why It's Good For The Game
Bugs bad.
## Changelog
🆑
fix: Light-Eaten objects can no longer emit light after being turned off
and then back on.
code: Flashlights now use light_on instead of defining their own
variable. Please report buggy behavior.
/🆑
## About The Pull Request
Fixes#78721
This PR does a handful of things behind the scenes to increase the
consistency of shapechange health tracking.
First of all we adjust the order of operations taken when you restore
the original body. The implementation as-was would remove the status
effect midway through and null a bunch of variables we tried to continue
using. This would result in several runtimes and code failing to run,
with the upshot that untransforming upon death would leave the caster
completely alive, with the corpse of its transformed shape at its feet.
Oops.
Additionally while testing this I realised that transferring the damagew
as also kind of fucked.
We wouldn't bother to do it at _all_ if you died, which is a shame, so I
made it simply heal you instead of reviving you so we can always do it.
Then as noted in the linked issue, we were applying all transferred
damage to a single limb, which could exceed the health of the limb and
remove damage. Now we spread it around the body.
Finally, applying damage to a human using the "force" flag would often
actually apply less damage to their _health_ than expected. This is
because arms and legs contribute only 75% of their damage taken to a
mob's overall health.
Now instead of reading `health` we read `total damage` which ignores the
limb damage modifier.
The end result of this is that if you transform into a corgi, take 50%
of your health, and transform back then you will have 50% of your health
as a human.
Previously the result would be that you'd have ~63%, then transforming
into a corgi would leave you with ~63% of a corgi's health, then
transforming back into a human would leave you at about 71%... and so on
and so forth. Now it doesn't do that.
## Changelog
🆑
fix: Dying when using (most) shapeshift spells will now kill you rather
than having you pop out of the corpse of your previous form.
fix: Damage will now be accurately carried between forms rather than
being slightly reduced upon each transformation.
/🆑
## About The Pull Request
Turns skeletons (the simple animal version) into basic mobs. This was
another incredibly simple conversion, since skeletons don't really do
anything but walk at you and beat you to death.
Because I thought it was funny, though, skeletons will now seek out
cartons of milk and drink them. Real milk will heal them for a
significant amount, but soymilk, being false milk, will deal them
grievous injury instead! Skeletons beware... I didn't add any other
sorts of milk due to limited ability with existing AI behaviors to
identify milk containers (they actually only look for the carton items).
Other than that, I've done some flavor adjustment for skeletons' attacks
- their effects and sounds will now suit the weapon they're actually
holding - for example, skeleton templars now actually use their swords
instead of slashing you with their horrible fingers. Along with this I
gave the basic skeletons a normal slashing sound, instead of the weird,
impactless hallucination sound they used to use for some reason. I never
liked that sound.
Finally, I've reflavored the spear-wielding skeleton mobs to "undead
settlers", following the naming of the corpses dropped by snow legions
as of #76898, rather than being named after an offensive term for Inuit
people. These skeletons do, after all, appear in settlements on alien
worlds.
To enable the flavor of milk drinking, I expanded the `basic_eating`
component to allow drinking rather than eating flavor, with a different
sound and its own set of verbs. This deletes whatever they drink from,
but c'est la vie.
## Why It's Good For The Game
Ticks 6 more entries off the simple animal freeze. While skeletons are
still extremely simple, being largely-identical mobs that only exist to
beat you to death, being basic mobs should make them slightly better at
this job. Also, again, I think it's really funny that you can distract
skeleton mobs with milk, or even hurt them.
## Changelog
🆑
refactor: Hostile skeleton NPCs now use the basic mob framework. They're
a little smarter, and they also have a slightly improved set of attack
effects and sounds. They love to drink milk, but will be harmed greatly
if any heartless spaceman tricks them into drinking soymilk instead.
Please report any bugs.
/🆑