## About The Pull Request
Fixes#79008
This is the same method bots use (though a bit more extravagant)- the
component is meant to delete itself when a user assumes control but it
had no cases for deleting itself on the user's death. This component
already has so many args that I don't particularly feel like adding
another one for `qdel_ourselves_on_mob_death` or whatever so let's just
repeat the pattern we already have going on for the time being.
## Why It's Good For The Game
Fixes bug.
## Changelog
🆑
fix: Gorillas and Regal Rats will no longer show up in the ghost-control
menu if they died without anyone ever taking control of them.
/🆑
## About The Pull Request
By removing a conditional statement which prevented signers from sending
a `COMSIG_MOB_SAY` signal (for some reason), this PR fixes a few things
in one go:
- Sign language once again prints a notice that the signer raises or
lowers their eyebrows for exclamations and questions respectively.
- Tonal indicators (sign/typing icons that depict eyebrows raising or
lowering) are also working again.
- RuneChat is now punctuated the same as the chat box for Signers.
This PR is now atomic thanks to @MrMelbert.
## About The Pull Request
Lesser version of https://github.com/tgstation/tgstation/pull/75226
Changes a few things with bumping which could lead to cheesing a charged
shot if the shooter has an ally to bump the target. Also adds examine
text to know what's happening.
Also shoving now can be used to break gunpoint, since having immovable
mobs can be troublesome in some situations
## Why It's Good For The Game
Grabs from the target no longer counter gunpoint;
Accidental or cheesy bumps are removed;
Shoves and pulls can be used in a teamplay to break gunpoint
## Changelog
🆑
qol: Gunpoint: Examining the target will show who is holding them at
gunpoint
qol: Gunpoint: Examining the shooter will show who they are holding at
gunpoint
balance: Gunpoint: If the target tries to grab, they will trigger the
shot
balance: Gunpoint: If the target or the shooter are shoved, it will
cancel the gunpoint
balance: Gunpoint: If the target is pulled, it will cancel the gunpoint
balance: Both the target and the shooter can't be bumped anymore to
avoid cheesing charged shot or removing the gunpoint by just moving
around
fix: Clicking the alert button of the shooter will now correctly remove
gunpoint
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.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
This one is a little bit complicated, and needs some background on how
silicon laws work for synced borgs. Generally speaking, a synced borg's
laws should always be equivalent to the laws of the AI they're synced
to. Unsyncing a borg does not in and of itself change a borgs laws. If
an AI has the reporter lawsuit + 3 freeform laws, and you unsync a borg
from that AI, the borg will still have reporter + 3 freeform laws for
its own laws.
This applies even to the zeroth law that borgs get due to being synced
to a malf AI. Currently, a borg will retain this law even if it is
unsynced from the malf AI. However, there's an issue with this. Per a
[recent policy
thread](https://tgstation13.org/phpBB/viewtopic.php?f=33&t=35128), borgs
that have been unsynced from a malf AI are no longer antagonists, even
though the malf law 0 currently remains. This is very confusing and
likely to lead to bans due to players mistakenly believing themselves to
still be antagonists. To rectify this, this PR just makes the zeroth law
get automatically removed when a borg is unsynced from a malf AI. I
tested this extensively to ensure that it should not affect the emag law
0 or the onehuman law board.
I also improved and fixed the feedback when attempting and failing to
apply a law board directly to a cyborg. Previously, the feedback was
both broken (it attempted to play an emote that doesn't exist) and the
feedback was the same for both emagged borgs and borgs that were already
synced to an AI. Based on the comments, this was intended to prevent
"metagaming." However, this was pretty much unnecessary. Simply
unlocking a borg's panel will already tell you if it's been emagged or
not, and if you have a borg's panel open to apply law boards directly,
then you can easily just check the wires and see for yourself whether
the borg is actually synced or not. Now the feedback actually works and
is different for synced and emagged borgs.
## Why It's Good For The Game
For the zeroth law fix, players should not be at risk of being misled by
their own laws. If borgs unsynced from a malf AI are not supposed to be
antagonists, then they should not have a law 0 that only antagonists
have.
Regarding the law board tweak, the old code was nonfunctional in every
way. The code didn't give feedback properly, and obfuscating the
feedback was totally unnecessary, as there are far easier ways to tell
if a borg has been emagged than by trying to upload laws to it. I
checked blame out of curiosity, and the old code is literally 9 years
old.
## Changelog
🆑
qol: Fixed/improved feedback when failing to apply a direct law change
to a cyborg.
fix: Borgs who are unsynced from a malf AI now lose the zeroth law as
intended.
/🆑
## About The Pull Request
Sets up moveloops to better catch issues with duplicated loops
Letting people modify the timer var AND have it track what bucket we're
in was a bad idea.
So instead let's store the queued time separate. Also makes
allowed_to_move return true/false instead of flags
This fixed? the null loop issue locally, I honestly have no damn idea
why. I'm gonna be working on the rest of ci here, left trackers so if it
pops up between now and merge I'll know what the issue is.
---------
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Emmett Gaines <ninjanomnom@gmail.com>
## About The Pull Request
The max potential miss chance is 80%, rather than 20%. (Yes, I know I
put it to 75% in the pr but actually I wanted an even number and my
fucking adhd brain forgot that this was meant to be changed)
## Why It's Good For The Game
I only got shown this was wrong literally the moment after my pr got
merged AAAAAH
Helpies!
## 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>
This adds a component you can slap onto mobs with ranged attacks which
lets them fire repeatedly with the mouse held down.
I applied it to a couple of existing mobs, to be honest we don't
currently have any which _need_ this but I will add it to the Ranged
Holoparasite (which really does need it) depending on which PR gets
merged first.
## About The Pull Request
- Adds a new combat mech, Paddy. Paddy is a modified Ripley MK-I,
intended for use by the station's security force. Like the MK-I, the
Paddy features an open-air cockpit design (and thus does not protect
from ranged weapons), but maintains the speed of the base unit.
Constructing a Paddy is similar to constructing a MK-II, though the kit
requires combat-mech level research. Sprites by
[DrDiasyl](https://github.com/DrDiasyl)
-- The paddy has an internal cargo bay capable of holding up to four
individuals (loaded with a hydraulic claw). If the pilot exits the
Paddy, any loaded individuals are likewise ejected. Individuals can
attempt to resist their way out of the mech, but it requires the mech to
be stationary for 45 seconds. If they do this, all individuals in the
holding cell are ejected.
- Adds a new mech equipment piece, the hydraulic claw. Similar to a
clamp, this Paddy-exclusive item can load mobs into the Paddy's cargo
bay. Humanoid mobs are handcuffed upon loading. The hydraulic claw is
unlocked on the same tech node as the Paddy.
- Adds a round-start Paddy, carrying one peacekeeper disabler and one
hydraulic claw, to each security area on all maps. Round-start Paddys
are also pre-locked with security access. Security now has access to a
mech charger, and a small bay for it all. Map edits were done by
[Maurukas](https://github.com/Maurukas).
- Also did some minor cleanup of various mech-related code. Ripley mech
cargo is no longer stored in the mech, but within the "ejector" object.
This doesn't have any player-facing changes, but it is easier to
organize behind the scenes. additionally, if Ripleys are destroyed now,
they drop their stored objects rather than deleting them.
## Why It's Good For The Game
Playing lone security is probably one of the least fun aspects of the
game. Arresting any assistant is inevitably setting yourself up against
the tide as a whole; You try to stun any one person and they crawl out
of the woodworks to get in your way, drag off the arrestee, and probably
try to steal your gear.
The Paddy is set up to be functional against low-threat targets, but not
particularly good against anything with purpose. The round-start Paddy
carries the disabler equipment, as well as the law claw, to detain
individuals in a *somewhat* safe manner. Being that you're inside an
exosuit, you're immune to shovespam that plagues the halls, and you
don't risk dropping important gear quite as easily.
However, The open canopy gives you no protection at all from ranged
attacks, nor from atmos hazards. Being that you're in an exosuit, you
cannot use other items or equipment. The AI will have trouble finding
you to open a door, due to your name not jumping their camera to your
location.
## Changelog
🆑 Zxaber, DrDiasyl, Maurukas
add: A new security-focused combat mech, the Paddy, has been added,
intended to be particularly helpful for lone sec officers. You will find
one in the Security main office, and a replacement can be built with
late-game mech research.
fix: Ripley MK-I and MK-II mechs no longer qdel their stored items when
destroyed.
/🆑

---------
Co-authored-by: Vire <66576896+Maurukas@users.noreply.github.com>
## About The Pull Request
I've tweaked some elements of unarmed fighting to give it additional
interactions between the various components, bridging them into a more
coherent system and focusing more strongly as tool for disabling
opponents nonlethally.
### Shoving
Shoving guarantees that unarmed attacks will land while knocked
off-balance (AKA when slowed by a shove).
Being off-balance means that you can be knocked down from a punch if you
have taken enough brute and stamina damage combined (at least above 40).
Being off-balance makes you vulnerable to grabs while you have a
moderate amount of stamina damage (30 damage), forcing you to have to
resist even passive grabs. This pairs _exceptionally_ well with
tackling.
### Grappling
Grappling someone makes your unarmed attacks penetrate armor based on a
new limb value called ``unarmed_effectiveness``. This is something
shared by kicking.
### Unarmed Attacks in General
``unarmed_effectiveness`` has also taken over the functionality of
``unarmed_stun_threshold``, as well as accuracy calculations. Human
equivalent limbs (pretty much all of them except mushrooms and golems)
have a value of 10.
Now, ``unarmed_effectiveness`` determines how accurately a given limb
makes unarmed attacks. Unarmed attacks have a base inaccuracy of 20%,
with effectiveness acting as a reduction to this value. (so for humans,
that's 20% - 10% before any value changes from brute and stamina
damage). It is also capped at 75% miss chance, just to avoid those weird
instances of two brawling fighters being incapable of finishing each
other off at a certain amount of damage and it being real awkward, like
it does currently.
It also determines the base probability of landing a knockdown punch.
For humans, this is 10%.
For the most part, these two particular changes are roughly equivalent
to the current values, just handled in a way that is more
straightforward to understand from a code perspective.
In addition to the above, human equivalent limbs have higher damage
floors for unarmed attacks. Arms deal 5-10 damage, while legs deal 7-15
damage. In addition, kicks also deal stamina damage, like punches do.
### Minor Mentions
Golems and Mushroom People (who don't even use their limbs for their
unarmed strikes because mushroom people start with a martial art) have
very accurate punches, and their punches penetrate quite a bit of armor
when they are entitled to that. They also have a high knockdown
probability. This is partially because they previously already _had_
these features due to the wonky math at play, but also because this is
their big thing they are good at.
Carp mutation also got a big win out of this as well. If and when you
actually manage to get that to work and matter.
## Why It's Good For The Game
My favorite thing in this game is the robustness of unarmed fighting.
It's the part of the game that actually acknowledges the sandbox and
environmental interaction in a big way. The only problem with the
unarmed combat is that it is a bit disjointed, and often much weaker
than using even the most pathetic weapon you can get your hands on
unless you're using the stun loops available. Those loops get a bit
boring, even if they're mostly all environmental (except for the lucky
neckgrab finish). Giving more options generally means that even when not
in an ideal position, you still have _some_ options.
It also has some internal inconsistencies in design even in the same
proc, like accuracy calculations and knockdowns, as well as weird splits
in damage. So I decided to resolve that.
Now, every part of unarmed fighting has some relevance in the other
parts. Predominantly, it is heavily favoured towards dealing stamina
damage, making unarmed combat very favourable as a nonlethal method of
taking someone down, which is something we currently lack considerably.
While people may still opt to simply beat someone into actual crit
rather than stop at stamina crit, the possibility is actually entirely
available and supported now. No just banking on a lucky neckgrab after a
shove.
Paying attention to damage dealt and thinking intelligently about how
you apply combinations of effects allows even someone on the significant
back foot an opportunity for a comeback if they know what they're doing
against even armed opponents.
Separating accuracy and knockdown effectiveness from damage allows for
more consistent design and readability, but also preventing weirdness
ike tighter damage spreads increasing knockdown probabilities as well as
increasing accuracy without the coder knowing why. This also lets us
make unarmed attacks just that little bit stronger. Since unarmed
attacks require more complicated combinations to work, I think this
won't make them stronger than weapons necessarily, but it will make for
more interesting swung fights.
## Changelog
🆑
add: With the flood of Chi within the Spinward Sector receding, various
masters of The Tunnel Arts, colloquially known as 'Maint-fu Masters',
have started to refine the basics of their martial techniques. New forms
have started to develop within Spacestation 13's hidden maintenance
dojos.
add: Someone shoved off-balance makes them vulnerable to more guaranteed
unarmed strikes, knockdowns from a successful punch, and more difficult
to escape grabs.
add: Grabbing someone (as well as kicking them while they're on the
floor) makes them more vulnerable to taking unarmed attack damage, even
if they have armor.
balance: Unarmed strikes made with human-equivalent limbs have higher
damage floors, meaning you overall do more damage on average while not
increasing the overall damage potential. It's more consistent!
refactor: Significantly changed how punching accuracy and knockdowns are
calculated.
balance: Golem and mushroom limbs are a lot more effective at punching
as a result of these various changes. As they should be.
/🆑
## About The Pull Request
A few months ago during the conversion to a Basic mob the shotgun range
was changed to 1 instead of staying at what it was prior, meaning the
mob itself would get in your face and unload instantly.
## Why It's Good For The Game
Fighting an npc mob that is as fast or faster than you, with 250 health
and basically 1 shots you isnt very fun, this returns their range some
even though they dont really act like they did prior still. I thought
about making it match the SMG range as well? But 3 leaves it as below

## Changelog
:cl:zergspower
balance: NPC Syndicate Shotgunners range requirement returned
/🆑
## About The Pull Request
Exactly what it says on the tin, 20 damage -> 12.5 damage.
## Why It's Good For The Game
At first glance, 20 damage per second seems pretty harsh. but
reasonable, considering your job is to protect the kudzu. but a 5 second
time limit sounds _extremely_ unfairly punishing on multi-z maps where
you can fall off your kudzu, especially considering the kudzu can block
your view of open spaces.
I figured 12.5 damage per second would work since it adds up to a flat 8
seconds until you reach 100, and it should give the player a few more
precious to process how fast they're dying, since its easy to
underestimate how fast 5 seconds goes by in the heat of combat.
## Changelog
🆑
balance: Venus human traps now take 12.5 damage per second instead of 20
while off kudzu.
/🆑
## About The Pull Request
i forgot to set these in my last pr
## Why It's Good For The Game
they are large heavy monsters they shouldnt be able to be pulled so
easily
## Changelog
🆑
balance: sets the leaper move and pull forces to strong
/🆑
## About The Pull Request
During the notify ghosts refactor I was unsure why we were creating a
custom overlay for each ghost alert when new_master did the same. Turns
out - it resets icons, which is useful here. This also caused #79415.
The original notify ghosts was performing this transformation operation
O(n), which I've made O(1)
## Why It's Good For The Game
Fixes#79415

## Changelog
🆑
fix: The screen alert should no longer break ghost UI when it's huge
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Fixes#79296
This code was a bit wack since we used `drop_location()` instead of
checking if we even had a valid turf to jump to, so slimes would spawn
directly on a turf above the pipe. This has been changed to see our
`loc` is actually a valid turf before we continue on in the verb.
Also this code was really fuckin' old so I just did a bunch of early
returns in the area to make it just a little bit easier to bear when
some poor sod has to refactor all of this into the basic framework.
## Why It's Good For The Game
Bug: Fixed ✅
Code: Improved ✅
Issue Tracker: One Less Thing ✅
## Changelog
🆑
fix: Slimes now need to be on an open turf to reproduce and split into
more slimy slimes, instead of getting away with using phasing powers in
pipes.
/🆑
## About The Pull Request
Fixes#79155
Also cleans up the code in plasma river "lava" a bit
The plasma river code was a little crusty and confusing and made some
interesting decisions.
To start with it would do _two_ burn damage per tick to people entering
it.
Then _15 toxic and 25 more burn damage_ to specifically humans?
This seems... unintended? So now it does the same amount of damage
equally to anyone regardless of if they are human or not.
In terms of the "turning dead people into dead plasmamen" behaviour we
will now:
- Not attempt to transform any limbs which cannot be dismembered, with
the assumption that those aren't meant to be replaceable.
- Not attempt to transform anyone with the undismemberable trait, with
the assumption that their body is supposed to be immutable.
- Not attempt to transform anyone with the new "don't transform me,
plasma river" trait which replaces an explicit species check for being
an android or plasmaman (already).
I also simply made golems immune to the plasma river _anyway_, because
people expect them to be able to wade into lava and the fact that this
is "cold lava" probably shouldn't impede that.
I also made golems unable to become husks because... none of the three
occasions where this could happen really apply and also if they get
husked they turn into gross-looking humans instead of golems until
fixed, which is weird.
Finally I did some more fucking around with husking because it's
visually weird.
I added a new flag to bodyparts (applied to robotic and skeletal parts)
which means that they will never be replaced with a husk icon. It might
be preferable to instead make custom husk sprites for these limbs? But
half of them are on species which cannot be husked in the first place so
this would only appear when they are transplanted onto a species which
can.
## Changelog
🆑
fix: The plasma river is about as deadly for animals as it is for
humans.
fix: Golems can now wade in the plasma river unscathed.
fix: Undismemberable limbs will no longer be dismembered by the plasma
river.
balance: Golems and plasmamen cannot become husked.
image: Robotic and Skeletal parts will remain distinct while the rest of
the body is husked.
/🆑
## About The Pull Request
refactors leapers into basic mobs and adds a new ability for wizards.
for 2 points wizards can buy their own leaper pet. they will get a
contract which lets them pick their pet's name and color

after they sign the contract they will get a frog statue which is used
to contain the leaper. players can use this statue to release or recall
the leaper into the statue. when its in the statue it will slowly regain
health or even revive from the dead, but if it gets gibbed then the
statue will be useless.
also adds a new ai behavior for leapers which lets them go swim in water
(and splash around) for a period of time. i gave this behavior to frogs
and crabs too
when riding the leaper, the players will get access to all its
abilities, it now has new abilities, it can create frog minions that
suicide bomb the enemies and it can also create a shower of poisonous
structures.
https://github.com/tgstation/tgstation/assets/138636438/931aa7b4-09f0-493f-bdb6-f3bdd0915b22
also when riding the leaper, players can point at walls near it so it
will destroy it. alternatively players can give commands to their
leapers to use abilities and to follow them if they are not riding it.
wizards cant be force dismounted from their frogs, and only wizards can
ride the frogs.
this also removes leapers from cytology as they now are much more
dangerous and have a new home
## Why It's Good For The Game
refactors leapers into basic mobs, and gives more gameplay opportunities
for wizards
## Changelog
🆑
refactor: leapers have been refactored into basic mobs please report any
bugs
add: wizards can now summon a leaper pet
removal: removes leapers from cytology
/🆑
## About The Pull Request
This helps clean up my favorite helper proc in the whole codebase,
`notify_ghosts()`.
The notify_suiciders, ignore_mapload, and flashwindow args are GONE.
They have been replaced with the notify_flags bitflag argument. This was
intended to make deadchat announcements a bitflag argument too, but
those got reverted right before I originally wanted to submit this PR.
The on-screen popup now shows the notification body when you hover it
with your mouse again. The format is now `[notify_ghosts message] --
[click action (orbit/jump/play)]`
Every single `notify_ghosts()` call has been changed to multiline format
and has been given trailing commas. Pretty!
## Why It's Good For The Game
Cleans up a proc that is very popular and going through a lot of changes
at the time.
Allows for further flexibility when this proc inevitably gets tweaked or
improved. 12 -> 10 args is an improvement, and it doesn't impact the
helper's flexibility at all.
## Changelog
🆑 Rhials
code: The notify_ghosts proc has been cleaned up. Please report any
abnormal changes in deadchat notification behavior.
qol: The on-screen deadchat popups now contain the notification blurb
when hovered with your mouse again.
/🆑
## About The Pull Request
Mafia should now start without the need of admin intervention.
I made a unit test that should always have a PDA and a ghost spawning in
a game of Mafia and having it run through basic setup to confirm they
both successfully sign up and the game starts.
I had to change a lot of things in order to get this working, such as
giving unique ckeys to mock clients, fixing harddels in Mafia, and
plenty of minor fixes. This is the first time any of this code is put in
CI, so a lot of uncaught errors are now showing their faces.
Because loading maps mid-round runtimes due to smoothing, I have mafia
their own unit test-only map that doesn't use smoothing.
I also split the mafia ui code into its own file, and moved a single
helper that was sitting around in mafia's file into a helpers file.
I also added some comments to explain why certain things are the way
they are, because I wrote some undocumented code previously and forgot a
few things, leading to self-inflicted wasted time.
## Why It's Good For The Game
^
## Changelog
🆑
fix: Mafia games can now start properly.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Makes NPC wizard mobs into basic mobs. These aren't actually used
anywhere, since their away mission was removed, so I figured I'd have
some fun with them.

Noteworthy changes are as follows:
- Wizard mobs can now wear any of the four basic colors of wizard robe
and hat. Rarely, they will wear the witch ("Marisa") outfit instead.
There was going to be a rare Tape Wizard spawn too, but the outfit
doesn't work correctly for some reason (see comments below).
- Wizard mobs no longer have a set spell loadout. Instead, they always
receive a random **targeted, primary spell**, a random **untargeted,
secondary spell**, and the spell **Blink**.
- Wizard subtypes (or var-edited wizards) can have any of the above
specified rather than random.
- Wizard AI will try to avoid ever being in melee, and will fire off
spells whenever possible with the priority order of primary > secondary
> blink. There is a mandatory 1-second waiting period between casts.
- Wizard mobs use "lesser" versions of Fireball and Blink. Lesser
Fireball does a little less damage and has a smaller explosion, though
it is still extremely dangerous. Lesser Blink simply has a smaller blink
radius so that wizard mobs don't just decide to leave.
Depending on their spell loadout, wizards can be _incredibly_ dangerous
mobs - stunning you with tesla blasts, shooting you with fireballs, and
more. Even weakened, fireball is the nastiest of these by far, able to
set you on fire or remove your limbs if you aren't properly protected.
Watch out!
The random lists have been kept pretty small, since I only wanted to use
spells that I know for sure work. Spell cards is pretty weak in AI
hands, since they don't take advantage of the fact that a human player
can spam it, but I wanted there to be a little variety in primary
attacks.
I included an UpdatePaths script here in case a downstream is using
these, but I doubt it was necessary.
## Why It's Good For The Game
Removes another simplemob.
The actual impact of this change is negligible, since this is an unused
mob, but it's possible that this lays the groundwork for these actually
being used - particularly since mappers can make them as powerful or
weak as they want by specifying a spell loadout. Wizards may make for a
tough boss challenge for a ruin or away mission, or a very mean surprise
for an admin to drop on an unsuspecting station.
## Changelog
As this is an unused mob, there are no player-facing changes.
## About The Pull Request
This adds a crisp sound to the salute emote that is from the Colonial
Marines server.
## Why It's Good For The Game
Mah Immersion!
## Changelog
🆑 timothymtorres, Rahlzel
sound: Port salute emote sound from Colonial Marines SS13 attributed to
Rahlzel
/🆑
## About The Pull Request
Makes shades into basic mobs. As they are solely player-controller and
have no AI, this was a very simple conversion.
Things of note:
- I've made shades use the same "theme" system as constructs, to
determine their drops and coloration - as opposed to these things being
manually set by the type of soulstone they're held in.
- I've reorganized files slightly, putting both constructs and shades in
a new "cult" basic mob folder.
That's more or less it. As I said, shades are simple.
## Why It's Good For The Game
Basic-izes another mob and cleans up the code a little. Removes the last
cult-related simplemob, too.
## Changelog
🆑
refactor: Shades now use the basic mob framework. Please report any
bugs.
/🆑
Fixes https://github.com/Skyrat-SS13/Skyrat-tg/issues/24715
## About The Pull Request
Just makes the softspoken quirk match its description that it should be
for spoken languages. You should still be able to have people view your
signs from a distance.
## Why It's Good For The Game
You can still 'subtly sign' using *whisper with that quirk, but you are
no longer restricted to only doing that. It didn't really make sense
that you were previously.
## Changelog
🆑
fix: Softspoken quirk will no longer be applied to sign language
/🆑
## About The Pull Request
The way we add multiple actions has been very unstandardized, with
several implementations of this code doing certain things wrongly (i.e.
not nullchecking `ai_controller`), so let's do something in the vein of
#74037 and just make one nice big ol' proc that catches a lot of these
cases. There are still a few things that simply can't be done here, but
this gets the most generic "give my mob some actions and also maybe tell
the AI about it" stuff done.
This is only useful in cases where we don't ever need to reference the
ability ever again when it's added. In an ideal world we would never
need to reference the ability again and it would all be self-contained,
but this is not an ideal world. However, a lot of the latticework has
been built around certain implementations of this behavior making
refactoring it just a bit easier.
I also did a lot of auditing on `Destroy()` stuff, because
`/datum/action`s listen to signals when their parent is `qdel`ing, so we
don't need to neither hold nor clear references on our mob's
`Destroy()`. This was all cleaned up now because even if we couldn't use
`grant_multiple_actions()` (the new proc I add in this PR), it's just
not useful at all and will further hinder efforts to implement this new
proc.
Also also, I noticed in some places (such as megafauna) that we were
initializing a lot of datum actions _in nullspace_. We didn't pass the
`src` argument to `New()`. I quickly fixed that, as well as got rid of
the useless types we had going on.
Also also also, I added a define macro to handle some of the cases that
melbert was speaking about in his review down below. All you need to do
is invoke the define on the typepath, and you should be good to go from
there. There's probably a better way to do it, lmk though. we do the
whole `do while` thing in order to prevent code leakages.
## Why It's Good For The Game
* Very easy to change the implementation. In case we need to do
something different in how we add actions or anything like that, we can
simply just edit instances where this proc is located.
* Standardizes addition behavior. There's a lot of cases like the
aforementioned not-null-checking `ai_controller` that we really need to
look out for, so having it all in one accessible proc ensures standard
behavior.
* Reduces copy-pasta. A lot of mobs had their own individual
implementation of this, so let's just clean up all those lines of code.
## Changelog
🆑
refactor: The way mobs get specialized actions (like revenants shocking
lights or regal rats summoning rats to their side when you slap them)
have been modified, please report any bugs.
/🆑
This doesn't touch the following case FTR:
* Instances where we need to do work on the `/datum/action` after we
`Grant()` it, like if we were to edit some variable on the action or if
we need to call procs on said action. I don't like how the current code
is so reliant on storing a variable to it, but that's a windmill to
attack another time.
## 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
adjust_damage sucks
## Why It's Good For The Game
oops
## Changelog
🆑
fix: venus human traps heal in kudzu again
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
## About The Pull Request
Another atomization of the content patch-
Let's not subtype everything into virtual variants
This also fixes some bugs that were present with vdom boss maps
- Made the bubblegum map larger so he wouldn't teleport out
- Legion is just far too annoying to have to fix code wise, given that
few if anyone tries it with the base virtual equipment
<details>
<summary>what do you mean too annoying?</summary>
Legion doesn't handle dying like the standard megafauna - each time it
"dies" it looks to see if there's another legion in the entire game
world. Given the real one very likely exists, this basically means it
won't drop anything. I'd have to modify legion's death proc specifically
for the virtual domain. No other megafauna has this level of weirdness
(nor splitting behavior) and coupled with the fact I think no one tries
the domain, I'm just removing it.
</details>
## Why It's Good For The Game
Cleans up megafauna subtypes that were specific for the virtual domain.
Now, we won't need to keep adding to the list if there's ever a new one
Fixes#79203Fixes#79200
## Changelog
🆑
fix: Bubblegum should no longer teleport out of the simulation when
threatened
del: Chamber of Echoes map removed as it conflicts with the actual
Legion
/🆑
## About The Pull Request
#75607 Intended to strip space carp of their ability to avoid combat and
sabotage the station and instead made them serve as body guards meant to
help the space dragon defend the portal by gutting their movement speed
and object damage but with compensation to health and raw damage they
can deal should they somehow get in melee with their now slow and bulky
speed.
Except their health increase was only to their initial health value and
didnt bump up their max health which meant as soon as something updated
their health they would go back down to pre-reworked health.
This just gives the new "bulky" carps a max health value to match
## Why It's Good For The Game
Its not fun to be slow and immobile when your health value is still
balanced as if you are fast and nimble.
I mean just look at the changelog at a glance you can tell something was
wrong
That being said I`m open to similar behavior in the future where carp
come in, they get a one time health boost, possibly in the form of a
bubble that the rift blew them out in, and that bubble is like a
temporary health pool that gets used up and cant be recovered......but
the current iteration im 99% sure is a bug.
## Changelog
🆑
fix: Space carp that arrive via rifts are no longer stricken with rift
travel related sickness that causes them to become weaker.
/🆑
## About The Pull Request
So basic mobs have variables which can change what message is displayed
when they are shoved. But right now these are only used if they are
shoved by aliens. This PR changes it so that they're also used when
they're shoved by humans.

## Why It's Good For The Game
It seems a bit weird for these to only show up when aliens are involved.
It seems more appropriate to shoo a tiny creature away compared to
shoving it.
## Changelog
🆑
spellcheck: basic mobs getting shoved by humans now display the mob's
disarm response
/🆑
## About The Pull Request
Last one! Makes proteons into a basic mob, and completely removes the
simple_animal construct supertype.
Proteons aren't really designed to be played by a player, instead being
a nuisance mapped into various ruins and traps. As such, they don't
really have any special abilities. Instead, the hostile variant has a
somewhat unique behavior. They'll viciously attack anyone who comes
close, but, being frail little cowards, if a proteon takes damage it
will immediately flee. After a random period between 2 and 4 seconds, it
will stop fleeing and come back for more.
In addition to this, a few other things have been done, some only
related because they're in files I touched.
- Moved proteons from the file for the Cleric's Den to their own file in
the basic constructs folder. Given that they're used in several
different ruins, they might as well not just be in the file for one.
- Simple constructs have been cut, and with them the procs for
healing/repairing on shades and cult structures, as those are no longer
needed.
- Because I was touching it anyway, I touched up the file for trap
structures. They no longer use any one-letter variable names, and time
is now universally listed in seconds rather than deciseconds in that
file.
- I removed a completely unused blackboard key from ice demons. This is
something I noticed due to a change I ended up not making while working
on proteon AI, but I figured I might as well leave it gone.
## Why It's Good For The Game
Kills the last three simple construct typepaths, bringing us to the
destined 19 removed. Huzzah!
The proteon AI routine should inject a little spice into fighting
proteons, especially for the unprepared - unlike many mobs, they won't
stand there and take it if you decide to fight back, but you can never
safely ignore them when they run away. They still aren't particularly
dangerous.
## Changelog
🆑
refactor: Proteon constructs now use the basic mob framework. The ones
encountered in ruins are a bit flightier now, and will briefly flee
combat if attacked - only so that they can return and menace you again
soon after. Please report any bugs.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Flightpotion wings have for a long time been on the species datum,
rather than being tied to a specific bodypart. This means that, for
example, a lizard who had all of their bodyparts turned human due to a
freak bioscrambler accident would still get lizard flightpotion wings,
not the human ones. Now its based solely on what chest bodypart you
have. A human chest means angel wings, a lizard chest means dragon
wings, a skeletal chest means skeletal wings, etcetera.
All flightpotion wings can now be ground up to get the flightpotion
back. If a lizard (or rather, someone with a lizard chest) mugs a human
and surgically steals their angel wings, then the lizard can now
actually get cool dragon wings instead of being stuck with lame angel
wings.
## Why It's Good For The Game
Moving species-level behavior to bodypart/organ level has been a general
design goal for some time now, and it just makes sense to tie the
flightpotion to the chest.
Being able to grind wings up to get the flight potion back is nice for
allowing people to get different wing variants and can lead to
interesting IC interactions in much the same way that lizard wine can.
## Changelog
🆑
refactor: The wings you get from a flight potion (if any) are now
determined by your chest bodypart, not your species.
qol: Functional wings can now be ground up to get the flight potion
back, if you want to get a different wing variant.
/🆑
<!-- 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
There was a bug where the fire visual effect would remain even after the
fire status effect was removed. It happened most often with lava, but
apparently happened in some other circumstances too. I believe I have
tracked down and fixed all sources of the bug. The culprit was
`/mob/living/proc/update_fire`. It was searching for a base
`/datum/status_effect/fire_handler` status effect, when it should have
been looking for `/datum/status_effect/fire_handler/fire_stacks`. I
tested it with lava, and it fixed the bug. If anyone knows of a reliable
way to cause the bug without lava, I would be happy to test it there as
well. Closes#73283.
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
## 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. -->
🆑
fix: The fire visual on mobs should no longer persist after the fire has
been extinguished.
/🆑
<!-- 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
Balances
1. Spiders now slow down equivalent to their health
2. Tarantulas can no longer put web passages or solid webs and destroy
walls outside of charge attack
3. Young spiders now cant pull objects do to being too weak and become
slower outside of webs as they should be
4. Makes pneumatic airlock seal unable to be destroyed by spiders
5. All Broodmother eggs now have a cooldown timer
Normal Eggs: 20 seconds
Abnormal Eggs: 180 Seconds
Enriched Eggs: 60 seconds
Expansions
1. Added a new abnormal egg category
2. Broodmothers can now lay abnormal eggs
3. 2 new spiders added
6. A new web type: Reflective silk screen
# Breacher



- Low damaging with High wound bonuses meant to debilitate enemies to
take ground for the nest
- Has the ability to breach areas by destroying walls with menson vision
to map out strategic breachings
- Immune to harsh environments with the ability to lay solid webs to
protect the nest environment
- Can send in warnings for the entire nest to hear
Will Help the nest get out of being closed off by small construction
attempts and fix some space breaches plus some back up by making enemies
slower and scarring them off with some bloodloss
# Tank


- Extremely low damaging build to absorb damage to hold ground for the
nest
- With the ability to lay down silk screen reflectors to protect the
nest from missile attacks
- Can heal itself at a slow rate
Will provide great support to keep the nest at bay from range attacks at
some extent and act as a damage absorber in dier situations
# Abnormal Eggs


- They can only be made once every 180 Seconds
- Hold the two new spider types
## Why It's Good For The Game
New spiders to contribute to the general spider antag team dynamic,
balances for spiders are always good making them funner to play against
and bringing up challenges on their gameplay making them act less like
murdering simple mobs and more like an actual nest trying to survive in
the station.
How?
1. **Cooldown egg laying:** broodmothers now have to be more strategic
on where they place their eggs with an average of 3 eggs per minute per
broodmother
2. **Spider slowdown on damage:** Spiders now will become slower the
longer they stay out of the nest in battle making them have to retreat
back to the nest shortening their time out murdering giving incentives
to expand the nest
3. **Spider More Brute Damage:** Gives a reason to use melee against
spiders although more dangerous it gives more reward due to the higher
damage outputs since spiders are pretty much big bugs with delicate
bodies no bones no good structural consistency equal more damage to
blunt attacks
4. **Tarantula Nerfs:** Tarantulas shouldnt be able to destroy this many
walls at this rate and be able to lay so many defensive webs I don't
know why they had this abilities but their strong enough as is
## Changelog
🆑
add: Added Abnormal Eggs
add: Added Two new spiders
del: Some Tarantula abilities
balance: Spiders speed are now connected to health
balance: Spiders now take more brute damage
balance: All egg laying now has a cooldown
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
Title
## Why It's Good For The Game
Less headache in the future for a macro thats not really obvious in what
it does
## Changelog
🆑
fix: signals in circuits now actually function
/🆑
## 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

adds this ruin to space ruin pool
this is a shady (as NT always is) bioresearch outpost that got fucked up
by an experiment
this has like some puzzle aspect to it since you gotta find keycards and
shit and press buttons to unlock shield gates
this ends with you fighting a heart which if you defeat, destroys the
blockade that prevents you from entering the outpost vault
also you can no longer literally just cut indestructible grilles or
unanchor indestructible windows
### new puzzle elements or something idk
variant of pressure plate that you cannot remove and it sends a puzzle
signal
cooler red puzzle doors that look very foreboding or something idk
theyre for this ruin
also puzzle blockades, which are indestructible dense objects that are
destroyed if they receive a puzzle signal
and also buttons and keycard pads for puzzles
https://github.com/tgstation/tgstation/assets/70376633/c98807ec-1e7b-49c4-a757-cdbb76a1b566https://github.com/tgstation/tgstation/assets/70376633/9d5d9dd1-5868-44e6-a978-5ea57b30c298
stuff that throws electric shocks in a pattern, ignores insuls and only
knocks down, and no you cannot just run past
https://github.com/tgstation/tgstation/assets/70376633/5772917c-a963-48a4-a743-b0f610801d25
### enemies
living floor, it can only attack stuff on top of it and it attacks until
the victim is dead
it is invincible to all but a crowbar, and it cannot move, and it
remains hidden until a victim is in range
https://github.com/tgstation/tgstation/assets/70376633/aa1d54f6-b259-4e58-9d44-e393d2131acf
living flesh, it can replace your limbs with itself
the conditions for that are; the limb must have 20 or more brute, victim
must be alive and dismemberable, the limb may not be torso or head, or
the limb may not be living flesh
alternatively it can replace a missing limb
these are all checked with every attack
they have 20 hp
the limbs in question will sometimes act up, while passively draining
nutrition, arms will randomly start pulling nearby stuff, legs may step
randomly
limbs when detached, turn into mobs and reactivate AI 2 seconds later.
if the host is shocked, all living flesh limbs will detach, or if the
host dies they will also do that
https://github.com/tgstation/tgstation/assets/70376633/765cc99e-c800-4efb-aabe-d68817bbd7ae
## Why It's Good For The Game
ruin variety is cool i think
also the other things i added should be useful for other mappers for
bitrunning or whatever
also bug bad for that one fix
## Changelog
🆑
add: living floor, living flesh, and other stuff for the bioresearch
outpost ruin
add: bioresearch outpost ruin
fix: you may not defeat indestructible grilles and windows with mere
tools
/🆑
---------
Co-authored-by: Jacquerel <hnevard@gmail.com>
## About The Pull Request
Converts wraith constructs to basic mobs. The last of the "mainline"
constructs, though there's still one to go after this.
Wraiths are pretty much the same as they've always been - speedy
constructs that pack a bit of a punch, built around doing hit-and-run
tactics with their ability to ethereal jaunt. Notably, I've converted
their ability to recharge their jaunts with attacks into a new
component, `recharging_attacks`. This can be placed on any basic mob to
let them recharge a cooldown action by landing hits, which could
possibly be useful in the future.
NPC wraiths are pretty straightforward, with a twist - they will always
chase down and beat to death the lowest-hp mob they can see. Happening
upon one of these while wounded will end very badly! While I originally
wanted them to be more flighty and use hit-and-run tactics, I couldn't
figure out a way to do this that didn't look kind of silly and make them
less effective overall.
In addition to the wraiths, I've done some much-needed cleanup to basic
constructs as a whole, improving some things and covering some things I
missed along the way.
- Ectoplasm drop types from constructs is now properly based on their
theme. I _believe_ I've done this in a way that will pass unit tests
this time, but we'll see if my local tests were being honest with me.
- Player-controlled constructs now attack faster. I didn't realize that
being basic mobs capped them to attacking once every 2 seconds, which is
a gigantic nerf over the simple animal version. I cut this to just 1
second, which should be much closer to how it originally was.
- Artificers actually seek out and heal the most damaged ally they can
find, instead of the least damaged. Turns out the sort was doing the
exact opposite order from what I thought, which became much more obvious
when using the same targeting behavior on wraiths.
- I put the PR number in the juggernaut update script, which I somehow
missed on that one.
- Removed the extraneous "noncult" construct subtypes that didn't do
anything. The Artificer one, which does something, is still around.
## Why It's Good For The Game
For the same reasons as the previous three. 5 more simple animals gone,
and only one construct to go until I can nuke simple constructs from the
codebase entirely. Other than that, the new component could possibly
come in handy in future designs, and the NPC behavior should hopefully
be a little scary - even if just a little.
## Changelog
🆑
refactor: Wraith constructs have been converted to the basic mob
framework. NPC wraiths are now extra cruel and will attack the
lowest-health mob they can see at any given time. Make sure this isn't
you! Please report any bugs.
fix: Artificers and juggernauts no longer attack significantly more
slowly than intended.
/🆑
## About The Pull Request
Converts hostile pirate NPCs to basic mobs - specifically, a subtype of
trooper. As their behavior is not meaningfully distinct from other
troopers, this conversion mostly just sticks them on the existing AI
behavior while keeping the rest the same.
Pirates do have one new thing going for them, though, to differentiate
them from other troopers. They use the new **plundering attacks**
component, which means that every time they land a melee attack, they
steal money from the bank account of whoever they hit. This requires the
target to be wearing an ID with a linked bank account, so it's not the
hardest thing in the world to hide your money from them - but it's still
something to be wary of! If killed, any mob with this component will
drop everything they've stolen in a convenient holochip.
## Why It's Good For The Game
Takes down 5 more simplemobs, and (I think) converts the last remaining
trooper-type enemy to be a basic trooper. (It's possible there's more
I've forgotten that could use the same AI, though.)
The money-stealing behavior is mostly good because I think it's funny,
but it also makes the pirates something a little distinct from "yet
another mob that runs at you and punches you until you die". They still
do that, but now there's a little twist! This can be placed on other
mobs too, if we want to make any other sorts of thieves or brigands.
## Changelog
🆑
refactor: Pirate NPCs now use the basic mob framework. They'll be a
little smarter in combat, and if you're wearing your ID they'll siphon
your bank account with every melee attack! Beware! Please report any
bugs.
/🆑
## About The Pull Request
If you die with a SecHailer on, a unique sound effect will play (created
entirely by me using in-game files):
https://github.com/tgstation/tgstation/assets/42353186/042e4159-57f3-4cc1-8d96-4dc7289f194b
(Please note that the pitch is randomized)
You can give any mask's unique death sound effects now.
## Why It's Good For The Game
SecHailers can change people's voices. Why not make them sound different
when they die? It could be a humorous reference with a unique sound.
SecHailers' voice changer function is a reference, which I expanded by
also making a unique death sound effect.
Also now you can make more masks with unique death sound effects if you
want to.
## Changelog
🆑
sound: Dying with a SecHailer on your face will make a unique death
sound
/🆑
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Currently, not being in combat mode when making an unarmed attack allows
you to bypass ALL BLOCKING. All of it. Every single kind of shielding.
This is now fixed.
As a consequence, hugging is now blocked, but that's fine, hugging puts
you into click cooldown and _might actually be an attack now_. [Like the
Hugs of the Gondola martial
art](ab058330b4/code/datums/martial/hugs_of_the_gondola.dm)
Fixes https://github.com/tgstation/tgstation/issues/72812
## Why It's Good For The Game
This was broken with COMBAT MODE AAAAAAAAAAAH
### AAAAAAAAAAAH
## Changelog
🆑
fix: Every person on the station now no longer has the Tranquility
Evades the Shield Pinky Finger Shovegrab unarmed combat technique, an
ancient and forbidden strike that allows anyone (literally anyone) to
bypass all forms of blocking defense by simply not being in combat mode
when they shove or grab their target. As a direct result, the chakra
energy of the Spinward Sector has become severely misaligned. Oh well.
/🆑
## About The Pull Request
- `apply_damage` is now uniform, handled, in a single place. At the
living level.
- Fixes people being held at gunpoint from being unable to flinch from
taking damage.
- Fixes a few signals (explodable, glass jaw) of apply damage maybe
potentially not having effects if the passed hit zone was a bodypart and
not a def zone.
- Fixes regenerator component always halting regeneration no matter what
damage taken.
- Fixes pressure damage being unaffected by `brute_mod` despite what
documentation claims.
- Signalizes the `check_species_weakness` proc on species.
## Why It's Good For The Game
The copy+paste of this proc made it awful, awful to maintain or add
features to. And also made it very bug prone.
This just takes a step forward in making sustaining damage a lot more
consistent, not only across all mobs, but across all methods of...
taking damage. Unarmed attacks, hulk, item attacks, etc.
## Changelog
🆑 Melbert
fix: People held at gunpoint can now flinch when being hit.
fix: Regenerating mobs no longer stop regenerating no matter hit with
what.
fix: Pressure damage is now properly modified by a mob's brute damage
modifier.
fix: Fixes some occasions which some effects (glass jaw, explodable worn
items) won't respond to hits.
refactor: Refactored core code related to mobs sustaining damage.
/🆑
## About The Pull Request
Fixes#79147.
Prevents the Demonic Frost-Miner from shooting at corpses by returning
early from `OpenFire()`. Also adds the "gutted" status effect to the
corpses in its arena so it won't try to gut them.
## Why It's Good For The Game
#78826 introduced an unfortunate bug by placing corpses in the Frost
Miner's arena. There were a combination of three factors at play here:
that the Miner attacks corpses, that it happens to use colossus bolts in
its attacks, which dust corpses, and that some unfortunate quirk of life
code causes runtimes if, as far as I can tell, a life tick goes off when
a mob is at the wrong point in the dusting process. The time this
process takes happened to perfectly coincide with the Monkey Business
unit test (being the first test that takes a significant period of
time), causing it to randomly fail.
So, this fixes a flaky test that has been a pain in the ass for the last
five days, is the big thing.
Also, it can't possibly have been intended for the Miner to run around
obliterating the aesthetic corpses in its arena within the first 15
seconds of any given round. Completely ruining the mood!
I'll point out that this particular boss may have been forgotten in
#77731, which set out to make only the colossus still gib/dust you, but
even were that not the case I think it would be a bit silly for the
Miner to be busy shooting lifeless corpses when a player shows up to
challenge it, rather than standing in its scary ritual circle.
## Changelog
🆑
fix: The Demonic Frost-Miner will no longer run around destroying the
corpses in its arena the moment the round begins.
/🆑
## About The Pull Request
#79276 has caused the monkey business test to start failing a lot, for a
few different reasons.
This was a pretty bad one, where the proc specifically used for a monkey
attacking a parrot was broken. It would not actually pass along a
reference to the monkey with the attack, causing no less than three
runtimes per attack. In unit tests this was causing literally thousands
of lines of stack traces as an angry monkey keeps trying to beat the
ghost of Poly to death.
That should not happen anymore.
## Why It's Good For The Game
Hopefully lets PRs start passing checks more consistently again. Also
lets Pun-Pun fight Poly to the death without breaking everything.
## Changelog
🆑
fix: Monkeys can now properly attack parrots.
/🆑