## About The Pull Request

Tin. Just more uncovering of some of these image harddels.
`blueprint_data` is a list of images.
I also went through the code and looked for any more instances of images
being qdeleted that I could find.
## Why It's Good For The Game
Hard dels begone
## Changelog
🆑
fix: fixes an /image harddel in station blueprints
code: cleaned up some more /image qdels
/🆑
I've done some changes to the scope component so that it can be applied
to items other than guns.
Binoculars now use it instead of changing the player view size, and lets
them move around while the zoom is on at the cost of a moderate
slowdown. This is both more comfortable, cooler and less laggier than
the previous method. Take in mind it still takes both hands to use
binoculars, so there's no much room for exploitation anyway.
This PR also makes the mothic softcap from the curator kit special: it
too has the scope component, albeit of a much shorter range, because
it's probably the least interesting kit of them all right now and has
nothing that the curator cannot get by walking in the aux base
construction room, except for a pair of pockets in the mothic coat,
though that's superseeded by the Trailwarden kit's saddlepack. It's
pretty fitting if you ask since the softcap has some goofy-looking
googles drawn on it.
Oh, items that aren't guns also have a different mouse tracker icon of
two circles joined together, instead of a reticle.
## About The Pull Request
turns hygenic bots into basic bots. also now PAIs and people can play as
hygeinebots. and they can wear hats
## Why It's Good For The Game
transforms hyginebots into basic bots. their old AI used to handle all
the logic. i moved some of the logic to the mob itself so players can
also clean (or burn) things. also this pr will add pathing limits to
bots, in the case the jps movement thinks it can reach something, but
actually cant, in which case the bot will give up the chase
## Changelog
🆑
refactor: hygeinebots are now basic bots. please report all the bugs
fix: fixes hygenebots not being able to patrol
add: hygeinebots can now be controlled by Players
/🆑
Productionizes #80615.
The core optimization is this:
```patch
- var/hint = to_delete.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up.
+ var/hint = to_delete.Destroy(force) // Let our friend know they're about to get fucked up.
```
We avoid a heap allocation in the form of copying the args over to a new
list. A/B testing shows this results in 33% better overtime, and in a
real round shaving off a full second of self time and 0.4 seconds of
overtime--both of these would be doubled in the event this is merged as
the new proc was only being run 50% of the time.
## About The Pull Request
- Fixes#80559
1) The ORM now hooks onto the local container only if off station. The
ui act if statement was also messed up but that's fixed now too.
2) Creates a dedicated signal for items inserted into the silo for
clarity & uses the helper proc defined inside remote materials for
inserting items so we don't have to specify the `context` manually.
3) Properly updates the auto Doc for the container signal defines
## Changelog
🆑
fix: Off station ORM's can redeem points again.
/🆑
## About The Pull Request
Being able to move around lights when using the light debugger is
important
Can't just be qdeling em whenever you try
Closes https://github.com/tgstation/tgstation/issues/78662
## Changelog
🆑
fix: Dear mappers, the light debugger tool no longer deletes dragged
wall lights
/🆑
## About The Pull Request
Thanks goodness they've done the signal already for the deadchat control
component.
## Why It's Good For The Game
This will fix#78640.
## Changelog
🆑
fix: Regal rats (and others), won't be punished by the automute system
for repeating the same command several times.
/🆑
## About The Pull Request
1. Removes material breakdown flags i.e. all flags with the format
`BREAKDOWN_XXX`. These flags do nothing, there are no special checks to
transform materials based on these flags, they are passed around just
because certain procs require them for syntax purposes only.
Apparently there were plans to make these flags do something special
from the comment
302247c0d1/code/__DEFINES/construction/material.dm (L43)
But nobody got any ideas for years now. The only special thing we can do
with them now is remove them and reduce code clutter, so let's do that
The only flag that ever did something was the
`BREAKDOWN_INCLUDE_ALCHEMY` flag. This only worked when coupled together
with `TRAIT_MAT_TRANSMUTED` trait(which is only used by the reagent
metalgen) and when both this trait & flag are combined together... they
still do nothing
302247c0d1/code/game/atom/atom_materials.dm (L41-L42)
Yup they cancel out each other to prevent returning an empty list, the
traits only job was to prevent materials from being recycled (like why?
what's the benefit of that? nothing) and the flag was meant to bypass
this restriction so both the trait & the flag cancel out each other
therefore doing nothing meaningful. Best remove them both and call it a
day.
2. Fixes an error in displaying number of sheets inserted into a mat
container when that sheet is made up of alloy materials. it would count
as 2 or more because it would take the sum of total material amount
inserted and not the actual sheets. That's fixed now.
3. Remote materials now properly respect the `MATCONTAINER_NO_INSERT`
flag
4. Adds helper proc to insert materials via the remote material
component with proper context
## Changelog
🆑
fix: mat container displays correct number of sheets inserted for alloy
materials.
fix: remote materials now properly respect the `MATCONTAINER_NO_INSERT`
flag.
code: removes material breakdown flags and related traits.
code: adds helper proc to insert materials via the remote material
component with proper context.
/🆑
## About The Pull Request
Revived my old PR https://github.com/tgstation/tgstation/pull/68901
Replaces the annoying tgui alert popup "Do you want to be X? | Yes | No
| Never for this round" that is hard to read and steals window focus,
with a nice clean alert in the top right that counts down. If it's the
same event/mob they stack with 2x, 3x, etc. It also shows how many
candidates/ghosts are signed up.
The poll alerts have screentips too, they countdown and show if you're
signed up, how many people are signed up, if you chose "never for this
round" (which is cancelable)
## Why It's Good For The Game

Way easier to see what role is available, you get a nice pic of the role
and get it's name in big text, you can cancel "never for this round",
and you can cancel signing up for a role before the timer is up
## Changelog
🆑
refactor: Ghost roles now offer ghosts a clickable poll button. Ghosts
can select a role, deselect it, alt-click it for "Never For This Round",
can cancel "Never", can see the countdown, and can see how many other
people are signed up for the role poll.
/🆑
## About The Pull Request
- Fixes#80143
- Fixes#80381
Based on the ingredients required reagents of the final product can
differ. It now transfers the olive oil from the bottle to the toasted
seeds & the orange juice and grenadine reagent from the ingredients into
the kasei dango.
Snow cones are now also edible
## Changelog
🆑
fix: crafting now transfers reagents from ingredients to final product
making previously inedible foods (toasted seeds, kasei dango & snow
cones) edible. Other crafted food products/items now differ in reagents
based on the ingredients required.
/🆑
## About The Pull Request
adds a station trait which adds a new role, the bridge assistant
he is designed to help commandeer the bridge and help out other heads
when needed. he is armed with the mini energy gun (the one heads used to
have on kilostation), a flash, a toolbelt (with an inducer), some cool
shades and a swanky scarf.
as he is a nerd he is weak and unable to twohand weapons, preventing him
from wielding the fire axe.
currently he does not have a mindshield but he cannot roll antag
he currently has access to the bridge, announcement console, eva,
teleporter, gateway, maint, and a weapon permit (somewhat (not really
other than for nerds) interestingly this is the first job that isnt
assistant that doesnt have access to any lathes, so he doesnt have orm
access unlike all the other jobs (except assistant))
the trait also makes a coffee machine spawn on the bridge
here is some useful art of your role

and ingame screenshots



## Why It's Good For The Game
Adds upon the station trait job system with a straight forward role that
IS just a human (unlike the cargorilla), and is pretty basic with no
custom assets or whatever other than hud icons
Having the bridge assistant in some rounds seems like a neat way to
protect it since it gets fucked up in like half the time, while also not
having enough mechanical depth or gameplay as to warrant it as a
permanent role
## Changelog
🆑
add: Bridge Assistant job accessible from a station trait.
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## 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
Makes the ED-209 crafting recipe only take security helmets, just as the
Beepsky one does.
## Why It's Good For The Game
As it stands right now, any helmet can be used to assemble an ED-209.
This includes anything from your standard security helmet, to a hardhat,
an envirohelm, or even a cheap toy roman helmet. This makes it so you
need an actual security helmet, just like the Beepsky recipe does.
## Changelog
🆑
fix: ED-209s can no longer be crafted with most instances of helmet, you
need security ones just like Beepsky.
/🆑
## About The Pull Request
This PR improves motorized wheelchairs in the following ways:
- On initialize, motorized wheelchairs will have the most basic possible
stock parts inserted. This resolves a bug where motorized wheelchairs
spawned by admins or other means (mail, mapping) were completely
worthless, as they had no stock parts in them and you could not insert
better ones. When crafted, these basic parts are deleted and replaced
with the correct ones.
- Power cells are now part of the motorized wheelchair recipe, instead
of being inserted after.
- When deconstructed or destroyed, motorized wheelchairs now drop their
power cell on the floor with everything else instead of deleting it from
existence.
- Miscellaneous old code has been tidied up, removing one-letter var
names, pointless code duplication, and the like.
## Why It's Good For The Game
I've been talking to Dalm about this, and wheelchairs are in dire need
of some improvements. Tidying up the mess that is the motorized
wheelchair seemed like a good place to start.
Firstly, it's good for motorized wheelchairs to function as expected
when not specifically crafted by hand. This is helpful to admins,
mappers, and anyone else who might have reason to make one of these
appear. It's also good that all the parts in the wheelchair drop on the
ground when destroyed, as there's no particular reason power cells
should be lost.
As for power cells being included in the recipe - it's not obvious at a
glance that you _need_ to insert a power cell after crafting, until you
try to drive your new wheelchair around. This extra step of annoyance is
now avoided by making it required to stick one in when you build the
thing.
## Changelog
🆑
fix: Motorized wheelchairs will no longer spawn in a bugged state where
they have no parts and can't be upgraded.
fix: Motorized wheelchairs will drop their power cell when destroyed or
deconstructed.
qol: Power cells are now inserted into motorized wheelchairs as part of
the crafting recipe, instead of as an extra step afterwards.
/🆑
---------
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
## About The Pull Request
Forgot to format the chat in the right format when items are rejected by
the mat container. Rather than displaying the item is rejected it would
simply runtime & not display anything. That's fixed now
## Changelog
🆑
fix: items that are rejected by the mat container will display the chat
message saying that.
/🆑
## About The Pull Request
**1. Mat container `user_insert()` tweaks**
- Mat container will now skip over an item & its contents if that item
cannot be processed (not suitable for redemption or not an allowed type)
this is not only realistic(if an item has an tough outer shell you can't
crush it to access its contents) but also saves us computation time as
we can skip over contents quickly
- Mat container now properly respects the `MATCONTAINER_SILENT` flag
- You can now hit machines like autolathe, protolathe etc with iron
sheets (or any other material item type those machines accept) when in
combat mode rather than inserting them because it makes sense
- Mat container now has much reduced chat spam as it will sum up all the
items inserted, and the material collected rather than displaying them
individually.

Much improved readability and overall faster as we do much less
`to_chat()` calls
**2. ORM Tweaks**
- Fixes https://github.com/Skyrat-SS13/Skyrat-tg/issues/25329 .
ORM now generates points correctly always, regardless of how the ore is
inserted be it
- Via hand
- Thrown at the ORM
- Ore Box
- Some other bag containing ore
Points will always be generated at a common proc so no more checking
every inlet on how the ore enters the machine. Once the silo receives
the material it will inform the ORM about it, so it does not have to
check itself therefore reducing code bloat.
## Changelog
🆑
fix: ORM will generate points regardless of how the ore enters it.
fix: Machines like autolathe, techfab etc can now be hit with iron
sheets (or any other material item type those machines accept) when in
combat mode rather than inserting them because it makes sense.
fix: Mat container won't display chats fully if the
`MATCONTAINER_SILENT` flag is passed.
refactor: Machines like autolathe, techfab etc now display summed up
material inserts to chats rather than each item individually. Also, will
skip items & its contents if it cannot be processed thus saving time
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Light Footed now makes stepping on glass Knockdown instead of Paralyze
Fixes some single letter variable usage in caltrop.dm
## Why It's Good For The Game
1. hard stuns bad
2. quirk's description implies it makes stepping on glass suck less, but
the primary effect of stepping on glass was previously untouched
3. this splits the difference between making it not stun and keeping it
dangerous to be barefoot because you are incredibly vulnerable when
knocked down
## Changelog
🆑
balance: Light Footed now makes stepping on glass Knockdown instead of
Paralyze
code: Fixes some single letter variable usage in caltrop.dm
/🆑
## 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
If the station rolls the "Cargo Gorilla" trait, a button will now be
visible on the lobby.
Clicking on this button before the round has started will add you to a
list of participants, one of whom will be selected to become a gorilla
when the round begins.
If nobody signs up (because they're really boring I guess) the job will
instead appear on the latejoin menu.
Once someone has become the gorilla the button will disappear.

While implementing this I noticed that an inverted check means we were
never populating the "GLOB.cargo_sloth" field which means the station
trait wasn't even working.
BEHIND THE SCENES
This also adds a generic "job station trait" which can be expanded in
the future.
Future developers can extend this to add other "rare jobs" with relative
ease.
By default I have made it so all subtypes of this trait are mutually
exclusive, only one can roll at a time.
This also means that I have converted "cargo gorilla" into a job, which
applies most of the code previously located in the mob's typepath or in
the station trait.
The fact that it is a job means that **admins** can enable any number of
gorillas to be present on the latejoin menu (but not the roundstart one,
as it is not possible to add Cargo Gorilla to your occupation
preferences) if they so desire.
The random beurocratic station trait, event, and traitor item (and the
job console) are not able to add gorilla slots.
Because I changed "Cargo Gorilla" to a job it now no longer exists on
the map until a player gains the role, and there wasn't a non-hacky way
to copy the name of this round's cargo sloth. Instead I just added a
small cargo gorilla name list.
## Why It's Good For The Game
Makes the presence of a fun trait more visible to players.
Means that people who aren't observing get a chance to be a monkey.
This is a framework several other people have wanted to exist for their
own features.
## Changelog
🆑 Jacquerel and Fikou
qol: If the station rolls the "Cargo Gorilla" station trait. you will be
able to sign up for the role from the game lobby.
qol: If nobody signs up to be the Cargo Gorilla then you can select it
from the Late Join menu and arrive on the arrival shuttle.
fix: The Cargo Gorilla will actually spawn.
/🆑
## About The Pull Request

Adds a fetching red pin which you can wear to visibly align yourself
with the enemies of Nanotrasen, purchaseable from the Black Market
Uplink.
This pin's contained RFID chip will automatically cause you to appear on
Sec HUDs as a wanted criminal and will aggro securitrons, to prove your
dedication to your ideals.
If your convictions are a little less firm, you can also silently pin
this onto _other_ people's clothing if they stand still next to you for
five seconds... though they might notice that they're suddenly wearing a
red badge.
I didn't want this to be a subtype of medal so I made the "you can put
this accessory onto someone else" behaviour into a component to sidestep
object inheritance.
This has been applied to the detective's spy camera, because it makes it
much easier to turn someone into a mole.
This also adds a trait which makes security hate you which I guess
someone could use in a novelty bar drink at some point or something.
## Why It's Good For The Game
It's funny
I think we need more neat things in the black market to make it
sometimes worth using
## Changelog
🆑
add: Added subversive pins to the black market uplink which make
security hate you
add: The detective's spy cam can now be conveniently pinned onto people
in the same manner as medals
/🆑
## About The Pull Request
We have two verbs that allow any given mob to take control of an object
and move it ephemerally, `/proc/possess()` and `/proc/release()`. These
ones leveraged two vars present on every `/mob`: `name_archive` and
`control_object`. I don't like having vars clog up my VV and this just
injected snowflake behavior in a lot of spots - let's just make it a
component that'll clean everything else up.
This also opens up the ability to have more objects be under mob control
without giving someone verbs that spit out to the blackbox as an admin
verb + logs + message admins but that's a later thing. This just subs in
the behavior in a nice way.
Also, since it's a component, I added a small QoL that we can support
now: A screen alert that allows you to get out of the possession early
without navigating the stat panel for the specific verb. I think it's
neat. You can also trigger the aghost keybind if that's something you
want as well.
Also also, nothing actually ever cleaned up `control_object` by setting
it to null. This means that in the old framework, if a mob got qdelled
during a possession, that would have triggered a hung ref harddel. That
won't happen anymore.
## Why It's Good For The Game
Two less variables taking up crud space in the VSC debugger + view
variables panel. Better behavior injection that is far more reusable.
Component handling this behavior allows for better extensibility of this
function in the future.

## Changelog
🆑
admin: Object Possession has been reworked, please report any potential
bugs.
qol: Object Possession should now throw a screen alert for you to
unpossess the object instead of you having to search the stat-panel for
the "release obj" verb. You can still use the verb but it's a lot nicer
now. Aghosting will also work now.
/🆑
<!-- 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. -->
closes#53931, #70916, #53931
## About The Pull Request
Organs were previously stored in nullspace. Now they are stored in their
prospective bodyparts. Bodyparts are now stored in the mob.
I've also had to refactor a lot of code concerning organ movement.
Previously, organs were only moved into bodyparts once the bodyparts
were removed. To accomodate this change, two major distinctions have
been made:
**Bodypart removal/insertion**
Called only when an organ is taken out of a bodypart. Bodypart overlays,
damage modifiers or other changes that should affect a bodypart itself
goes here.
**Mob insertion/removal**
Called when an organ is removed from a mob. This can either be directly,
by taking the organ out of a mob, or by removing the bodypart that
contains the organ. This lets you add and remove organ effects safely
without having to worry about the bodypart.
Now that we controle the movement of bodyparts and organs, we can fuck
around with them more. Summoning someones head or chest or heart will
actually kill them now (and quite violently I must say (chest summoning
gibs lol)).
https://github.com/tgstation/tgstation/assets/7501474/5efc9dd3-cfd5-4ce4-b70f-d0d74894626e
I´ve also added a unit test that violently tears apart and reconstructs
a person in different ways to see if they get put toghether the right
way
This will definitely need a testmerge. I've done a lot of testing to
make sure interactions work, but more niche stuff or my own incompetence
can always slip through.
## Why It's Good For The Game
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->
A lot of organ work is quite restricted. You can't C4 someones heart,
you cant summon their organs and a lot of exceptions have to be made to
keep organs in nullspace. This lets organs (and bodyparts) play more
nicely with the rest of the game. This also makes it a lot easier to
move away from extorgans since a lot of their unique movement code has
been removed and or generalized.
I don't like making PRs of this size (I'm so sorry reviewers), but I was
in a unique position to replace the entire system in a way I couldn't
have done conveniently in multiple PRs
## 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. -->
🆑
refactor: Your organs are now inside your body. Please report any issues
with bodypart and organ movement, including exotic organ, on github and
scream at me
fix: Cases of unexpected organ movement, such as teleporting bodyparts
and organs with spells, now invokes a proper reaction (usually violent
death)
runtime: Fixes HARS runtiming on activation/deactivation
fix: Fixes lag when species swapping
/🆑
<!-- 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
I woke up today and thought 'what would be easy thing to do today so I
can say I've done something?'. Then I remembered I saw several gangtool
usages the time I split radio up, and I could remedy those. 7 hours
later, device.dmi is split in a folder of its own, and I've also given
unique sprites to door remotes and landing desginators.
## Why It's Good For The Game
The device.dmi was kind of a mess.
## Changelog
🆑
/🆑
## About The Pull Request
This is an update that touches many more things all at once (compared to
my other PRs) meant to make PDAs in general feel more consistent and not
take away from one of the experiences we want to encourage: interaction
between players.
1. Replaced all checks of a 'pda' with a 'modular pc'. This means
technically (though not done in-game currently) other modpcs can hold an
uplink, and microwaves can charge laptops.
2. Speaking of microwave, they now don't break and require
deconstruction if the cell is removed mid-charge.
3. When a Mod PC is out of power, it will now allow the Messenger to
work (which now also doesn't consume any additional power), if the app
exists on the PC. Here's a video demonstration
https://github.com/tgstation/tgstation/assets/53777086/7ae12f81-a271-49b8-95fa-2ba54d2e2d1f
4. Flashlights can't be turned on while the cell is dead
5. I replaced a bunch of program vars with ``program_flags`` and renamed
``usage_flags`` to ``can_run_on_flags``.
6. Added a debug modPC that has every app installed by default. Mafia
had some issues in the past that were unknown because Mafia wasn't
preinstalled with any tablet so was never in create & destroy nor in any
other unit test. This was just an easy solution I had, but PDAs should
get more in-depth unit tests in the future for running apps n stuff- I
just wanted to make sure no other apps were broken/harddeling.
## Why It's Good For The Game
Currently when a PDA dies, its only use is to reply to PDA messages sent
to you, since you can still reply to them. Instead of just fixing it and
telling players to cope, I thought it would be nice to allow PDA
Messenger to still work, as it is a vital app.
You can call it some emergency power mode or whatever, I don't really
mind the reason behind why it is this way.
When I made cells used more on PDAs, my main goal was to encourage
upgrading your PDA and/or limiting how many apps you use at once, I did
not want this to hit on players who use it as a form of interaction.
This is the best of both worlds, I think.
The rest of the changes is just for modularity, if some downstream wants
to add tablets, phone computers, or whatever the hell else, they can
still get just as far as PDAs should be able to get to, hopefully.
## Changelog
🆑
add: PDAs with a dead power cell are now limited to using their
Messenger app.
fix: Microwaves now stop charging PDAs if the cell was removed
mid-charge.
fix: Microwaves can now charge laptops.
fix: PDA Flashlights can't be turned on while the PDA is dead.
fix: You can now hold a laptop up to a camera (if it has a notekeeper
app installed) like PDAs already could.
/🆑
---------
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.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
/🆑
## About The Pull Request
this pr refacotrs cleanbots into basic bots. also adds a new skillchip
for janitrs. this skillchip will allow janitors to communicate with
cleanbots and order them around, like pointing at something and telling
them to clean it. also now the cleanbot has an inbuilt mop which it will
use to smack mice and cockroaches
## Why It's Good For The Game
refactors cleanbots into basic bots and fixes them getting stuck
sometimes while patrolling. also janitors being able to order them
around can make them a bit more useful as tools for the janitor
## Changelog
🆑
refactor: cleanbots are refactored into basic bots. please report all
bugs
fix: fixes cleanbots getting stuck sometimes while patrolling
add: janitors get a new skillchip which allow them to communicate with
cleanbots
/🆑
## 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
Chasms prevent teleportation
Fixes#80101
## Why It's Good For The Game
Being able to teleport people into chasms using beacons as an anchor is
bad. It has very little counterplay besides fishing out the beacon,
changing the teleport target (assuming it's not hidden), or killing
someone holding a handtele.
The alternate idea for this PR was to see if the chasm added some sort
of trait to the things falling in it and make it so the teleporter would
ignore things with that trait, but it seems like chasms don't do that.
## Changelog
🆑 Tattle
balance: you can no longer teleport into chasms
/🆑
---------
Co-authored-by: tattle <article.disaster@gmail.com>
<!-- 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
Renames
- `/mob/proc/notify_ghost_cloning` to `/mob/proc/notify_revival`
- `/mob/dead/observer/proc/notify_cloning` to
`/mob/dead/observer/proc/send_revival_notification`
- `/atom/movable/screen/alert/notify_cloning` to
`/atom/movable/screen/alert/revival`.
I could have found a way to merge both procs together but default
parameters keep me up at night.
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
## Why It's Good For The Game
Conciseness, code that is named after a removed feature is silly.
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
nothing playerfacing
<!-- 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. -->
<!-- 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
Does what it says on the tin. We don't have any "special" sources of
clone damage left in the game, most of them are rather trivial so I
bunched them together into this PR.
Notable things removed:
- Clonexadone, because its entire thing was centered around clone damage
- Decloner gun, it's also centered around cloning damage, I couldn't
think of a replacement mechanic and nobody uses it anyways
- Everything else already dealt clone damage as a side (rainbow knife
deals a random damage type for example), so these sources were removed
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->
## Why It's Good For The Game
Consider the four sources of normal damage that you can get: Brute,
Burn, Toxins and Oxygen. These four horsemen of the apocalypse are very
well put together and it's no surprise that they are in the game, as you
can fit any way of damaging a mob into them. Getting beaten to death by
a security officer? Brute damage. Running around on fire? Burn damage.
Poisoned or irradiated? Toxin damage. Suffocating in space? Brute, burn
and oxygen damage. Technically there's also stamina damage but that's
its own ballpark and it also makes sense why we have a damage number for
it.
Picture this now: We have this cool mechanic called "clone pods" where
you can magically revive dead people with absolute ease. We don't want
it to be for free though, it comes at a cost. This cost is clone damage,
and it serves to restrain people from abusing cloning.
Fast forward time a bit and cloning is now removed from the game. What
stays with us is a damage number that is intrinsically tied to the
context of a removed feature. It was a good idea that we had it for that
feature at the time, but now it just sits there. It's the odd one out
from all the other damage types. You can easily explain why your blade
dealt brute damage, but how are you going to fit clone damage into any
context without also becoming extremely specific?
My point is: **clone damage is conceptually a flawed mechanic because it
is too specific**. That is the major issue why no one uses it, and why
that makes it unworthy of being a damage stat.
Don't take my word for it though, because a while ago we only had a
handful of sources for this damage type in the game. And in most of the
rounds where you saw this damage, it came from only one department. It's
not worthwhile to keep it around as a damage number. People also didn't
know what to do with this damage type, so we currently have two ways of
healing clone damage: Cryotubes as a roundstart way of healing clone
damage and Rezadone, which instantly sets your clone damage to 0 on the
first tick. As a medical doctor, when was the last time you saw someone
come in with clone damage and thought to yourself, "Oh, this person has
clone damage, I cannot wait to heal them!" ?
Now we have replacements for these clone damage sources. Slimes? Slime
status effect that deals brute instead of clone. Cosmic heretics? Random
organ damage, because their mechanics are already pretty fleshed out.
Decloning virus? The virus operated as a "ticking timebomb" which used
cloning damage as the timer, so it has been reworked to not use clone
damage. What remains after all this is now a basically unused damage
type. Every specific situation that used clone damage is now relying on
another damage type. Now it's time to put clone damage to rest once and
for all.
Sure, you can technically add some form of cellular degradation in the
future, but it shouldn't be a damage number. The idea of your cells
being degraded is a cool concept, don't get me wrong, but make it a
status effect or maybe even a wound for that matter.
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->
## Changelog
<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and it's effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->
🆑
del: Removed clone damage.
del: Removed the decloner gun.
del: Removed clonexadone.
/🆑
<!-- 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
### Cogitandi Fidis
Creates a holy violin that gives an analysis of songs played on it. This
lets you check how long the song is for final effects, to make sure they
trigger without the hassle of trying a rite with a song until you get
one that works. 20 Favor, looks neat too!
### Portable Song Tuning
Rite to empower an instrument with the ability to invoke specifically
song tuning rites, 5 charges before you need to go back to a proper
altar. Helps a chaplain stay on the move, since songs are interruptable
and sometimes an altar can be incredibly far. 10 Favor for 5 charges.
### Illuminating Solo

New free invocation that lets you light up the way with your music! The
finishing effect applies a weaker glow to all listeners for a minute.
### Other Misc Changes
The threshold for getting a final effect on a song is now lower, 220 ->
170. As a reminder, this threshold is lines * tempo. I think the
threshold was simply too high
## Why It's Good For The Game
Changes were made from
https://tgstation13.org/phpBB/viewtopic.php?f=10&t=35381 statistics and
feedback about sects. I think, overall, Festival Sect is in a very good
place and doesn't need a whole lot but a few rites that help with a
quality of life would really cut down on the amount of time a chappy is
spending doing nothing but running allllll the way back to the chapel to
load up some new songs
## Changelog
🆑
add: Festival Sect has 3 new rites: Cogitandi Fidis, Portable Song
Tuning, and Illuminating Solo.
balance: lowers threshold for triggering a final effect. Consult your
Cogitandi Fidis for more information
/🆑
## About The Pull Request
Fixes https://github.com/tgstation/tgstation/issues/80047
## Why It's Good For The Game
This shouldn't be happen and it's my fault, oops.
## Changelog
🆑
fix: Blocking a tackler no longer causes things to go haywire and stun
the tackler/the tackle victim.
/🆑
## About The Pull Request
I've stumbled across this enough to finally go through the entire
codebase and fix it. I left out changelogs simply because rewriting
history logs is bad.
## Why It's Good For The Game
I find it pretty annoying because I stumble across words that are
misspelled for a few seconds, and I'm likely not the only one who feels
like this. Less spelling mistakes in code are better.
## Changelog
🆑
spellcheck: Occurrences of "recieve" has been changed to "receive".
/🆑
## 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#79931
The way crafting menu handles reagents is an abomination. It manually
updates its volume, rather than calling the correct procs for it and
also "clones" reagents like... it does some weird stuff that can leave
the beaker in an inconsistent state let's just leave it at that.
Now we properly consume the reagent via `remove_reagent()` proc and
don't do stuff manually so it works now. Also added some sanity checks
such as `>=` and not simply `>` when checking for reagent volumes and
also checks if we actually found a container in our surroundings which
could runtime if none was available
Also for my sanity please don't tell me to change any single letter var
names here. This whole file is crawling with them so let someone else
get their GBP from that
## Changelog
🆑
fix: crafting food or any other items that require reagents will not
leave behind blank reagents. That and properly updates the holder those
reagents are stored in
/🆑
## About The Pull Request
psyker echolocation cooldown time has been reduced from 2 to 1.8 seconds
psyker heads no longer render an overlay of not having eyes
psyker echolocation rendering has been reworked to hopefully not crash
the game anymore when theres many psykers
## Why It's Good For The Game
these changes make psyker better
## Changelog
🆑
qol: psyker echolocation cooldown time has been reduced from 2 to 1.8
seconds
fix: psyker heads no longer render an overlay of not having eyes
/🆑
## About The Pull Request
A prior refactor of how ID cards worked removed (without commentary?)
the long-previously-existing behaviour that Agent IDs cause a
subtraction from the level of suspicion that security bots see from you.
I have not only restored this behaviour, but applied it to a handful of
other ID cards (based on trim).
When Beepsky looks at you he will make an assessment based on various
factors controlled by his bot settings:
- If Beepsky is set to check ID and your identity is concealed (you
appear as "Unknown") add 4 points.
- If Beepsky is set to check Weapons and you are holding a restricted
weapon without a permit, add 4 points.
- If Beepsky is set to check Weapons and you are wearing a restricted
weapon on your belt or back without a permit, add 2 points.
- If Beepsky is set to check records and you are set to Arrest, add 5
points.
- If Beepsky is set to check records and you have some other
non-innocent status, add 2 points.
- If you are wearing a wizard's hat, add 2 points.
- If you are not human, add 1 point (police are racist).
- If you are loyalty implanted, subtract 1 point.
Factors added or restored in this PR based on your ID now are:
- If you are wearing an Agent ID, subtract 5 points.
- If you are wearing a Cybercop ID, subtract 1 point.
- If you are wearing a Centcomm ID, subtract 10 points.
- If you are wearing an Admin ID, subtract infinite points.
- If you are wearing a prisoner ID, add 1 point.
- If you are wearing a Syndicate or Battlecruiser ID, add 5 or 10
points.
If Beepsky is _emagged_ then he will view all targets as having 10
threat, regardless of their ID card.
If you complete this process with >4 points he will attempt to arrest
you.
The upshot of my changes are:
Wearing an Agent ID card will cause Beepsky to overlook the fact that
you are carrying a gun in your hands without a permit, unless you are
also set to arrest.
Wearing an Agent ID card will cause Beepsky to overlook the fact that
you are set to arrest, unless you are carrying a gun in your hands.
Wearing a prisoner ID while not human will cause Beepsky to try and
arrest you if you have a weapon on your belt or back (if he is set to
care about weapons permits or unless you have one).
Wearing a centcomm ID card will cause Beepsky to treat you as above the
law in basically all circumstances, up to and including when you try and
beat him to death. He will simply sit there and take it.
In addition to this, this information forwarded to AI is now also
available to player secbots upon examine.
Players can't become secbots very easily because you can't upload PAIs
into them or enable their sentience in the panel, but it sometimes
happens via random event or admin intervention.
## Why It's Good For The Game
I think this was removed by mistake? It wasn't included in the changelog
and everyone I talked to thought it was still true.
It's a fun feature which makes agent IDs marginally more useful.
I think Beepsky and pals judging you based on your job makes sense, even
if it is mostly applied to fluff roles.
## Changelog
🆑
add: Agent IDs once more trick Beepsky into treating you more leniently.
add: Prisoner IDs make Beepsky treat you somewhat more suspiciously, as
do Syndicate IDs. Wearing a Centcomm ID means that Beepsky is aware that
you are above the law.
add: Player-controlled security bots can view someone's assessed threat
level by examining them.
/🆑
## About The Pull Request
On the tin, this lived on the `/obj` level and polluted a lot of stuff
even though only a very small fraction of stuff actually leveraged it.
Let's make it a trait for that boolean-like behavior so I can be happier
scrolling through view-variables with less non-necessary things.
I wish we could tie it to unique sources but that whole drinking glass
thing makes me suspicious of weirder things so I think the way we do it
(source being a `REF()` to the thing itself) is probably fine enough for
the time being.
## Why It's Good For The Game
Same behavior one can expect but just a bit cleaner on the backend.
## Changelog
Nothing that particularly concerns players.
## About The Pull Request
Instead of choosing 2-3 brothers, *one* person will be selected and
given a flash which can convert one other person over. In accordance to
the existing 10% chance for 3 members, there is a 10% chance that the
first person converted will receive a flash of their own.
Expectation is people will flash a friend or a robust guy or whatever.
My intent is primarily to see if this kind of blood brothers is more
enjoyable to play with/against, and if their inclusion in a round
increases the general chaos of it. My theory is that since most likely
blood brothers will be people who know each other, that it can become
more consistently interesting to the rest of the crew. That or they just
murderbone together idk
Fikou and head admins said they wanted this to replace rather than add
which I agree with.
## Why It's Good For The Game
Keeps the sandboxy aspect of blood brothers (no uplink) while likely
making it more enjoyable to play. Conversion is equally as simple as
revs for the user, and is just as intuitive to the one being converted
since there are no new mechanics thrown in your face.
Blood brothers is currently disabled everywhere on the main servers
except for MRP. I think this form will be more appealing to all
rulesets. If left enabled, Dynamic now has more antagonists to make
rounds diverse with and I want that
## Changelog
🆑
add: Instead of teaming up random people together, blood brothers will
now start out with one player and let them convert a single other person
over to blood brother using a flash.
/🆑
## 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
Fixes#79921
Otherwise, on the tin. Attack mode is for attacking, scouting mode is
for scouting. We were listening for clicking and stuff like that but it
was still failing somehow so this is le fix
## Why It's Good For The Game
You aren't supposed to shoot in this mode, only scout.
## Changelog
🆑
fix: Ranged Guardians (Holoparasites/Power Miners/etc.) can no longer
use ranged attacks in scouting (incorporeal) mode.
/🆑
## About The Pull Request
Screwup in #79762 (b251b9dbb0)
This definitely worked two months ago I have no clue when this check got
swapped around.
## Changelog
🆑
fix: Poly should now remember phrases between shifts.
/🆑
## About The Pull Request
Adds a new skillchip, it lets you taste food by examining it.

This has all of the effects of tasting food (various moodlets based on
quality and food type) and can also trigger food allergies if you have
them, however it does not consume the food nor give you any nutritional
benefit.
You can buy it from a vendor or sometimes it spawns in maintenance.
## Why It's Good For The Game
The players are constantly clamouring for more additions to our most
loved and useful feature, skill chips.
<details>

</details>
## Changelog
🆑
add: A new skill chip can be found in maintenance or purchased from the
vendor, allowing you to experience food in new and exciting ways.
add: Abductors also have access to this incredible power, simply using
their genius level brains.
/🆑
## About The Pull Request
Yup this is the last time I'll lay hands on `holder.dm` after 2 rounds
of code compression the file was still over 2000 lines long so now the
next best thing to reduce it is organizing procs into logical files,
that and even more proc removals. As you can see we are still able to
reduce code size even further
**1. Removes & merges `expose_multiple()` proc into `expose()`**
Th only difference between these 2 procs is that `expose()` uses all
reagents inside the holder whereas `expose_multiple()` uses a select few
reagents. We can just add a 4th parameter to `expose()` that will accept
a list of reagents thus achieving the same results and that was done
reducing overall code
**2. Removes `conditonal_update()` proc & `on_update()` proc**
The proc `on_update()` definition is empty and no reagent was overriding
it and as a result `conditonal_update()` that calls this proc is also
functionally useless therefore both of these procs were removed reducing
overall code
**3. Finally splits `holder.dm` into logical files under the folder
`code/modules/reagents/holder`**
- `holder.dm`: this is the still the file for core functionality it's
just now moved into this new folder. Added comments to group procs under
separate categories for easy readability.
- `mob_life.dm`: contains reagent code for metabolizing reagents and for
handling stasis
- `reactions.dm`: all code for reagents reacting inside the holder
- `properties.dm`: procs for editing/reading the volume, temperature,
ph, purity properties of reagents inside the holder, also for reading
its taste description
- `ui_data.dm`: all code for displaying & interacting with reagent data
via UI
## Changelog
🆑
code: removes & merges `expose_multiple()` proc into `expose()` proc
inside reagent holder
code: removes `conditonal_update()` proc & `on_update()` proc inside
reagent holder and reagent
refactor: Reagent code has been trimmed and split into multiple files.
report bugs on github
/🆑
## About The Pull Request
Ninja told me that I shouldn't use a signal to get the variable
modifiers that a dart insert applies to its projectile. When I asked if
using a callback passed as an initialization param was okay, Potato told
me it was better.
## Why It's Good For The Game
Less code smells.
## Changelog
No player-facing changes.
## About The Pull Request
When the ranching PR came out (we love it downstream), there seemed to
be an issue-- the gutlunches would produce milk instead of the miner's
salve that the code said it would. I looked into it and realized that
some of the code would not take into consideration if the udder already
had a preset reagent to create.
I've changed some of the arguments for the procs to be called override
instead, which will be empty. If you want something that functions
similarly to the udder but want it to produce something else and not
care about creating a new udder, you can just use the override when
attaching the component; otherwise, leave it blank for milk (or whatever
kind of reagent the udder you want will produce).
Additionally, gutlunches not only did not produce miner's salve, but
with the special ores, it did not produce any of the additional
reagents. This was fixed by just adding a return TRUE at the end of the
normal udder.


Perhaps it is out of scope (if it is too extreme, please let me know),
but I have changed the probability 95 to not produce milk to a var
instead, which means you can have udders that are more prone to
producing their milk reagent. 95 is still technically the default, but I
have made it 5 in a more readable manner (as in you have a 5 percent
chance to get milk every 2 seconds if the udder has it's required food
type, if any).
## Why It's Good For The Game
Some of this PR is fixes-- we wanted certain behaviors that were not
happening and so I fixed that. Other parts of the PR are for, in the
future, if we want udders that have higher/lower chances to produce its
milk reagent.
## Changelog
🆑
fix: gutlunches now produce miner salve instead of milk, as well as the
other reagents if fed the correct ore
/🆑
## About The Pull Request
### Tackling Outcomes
Tackling now determines success based on outcome categories. These are
derived from the typical attacker/defender roll that would have
previously determined the outcome on its own. A negative roll results in
a negative outcome, a positive roll a positive outcome, and a result of
exactly 0 resulting in a neutral outcome.
The result of your roll are then passed along to the relevant proc to
determine severity. The derived roll is multiplied by 10 (or -10 for the
negative roll to get a positive value to roll with). Then we see if our
final roll fits a severity bracket. Negative outcomes will roll to
determine their outcome, and potentially could roll a less severe
outcome than what our first roll would suggest.
For positive outcomes, the defender's melee armor reduces the severity
of the outcome.
For negative outcomes, the attacker's melee armor improves the potential
outcome and at least prevents more severe backlash. It'll still be
negative, you can't move from a negative outcome to a positive outcome
just from good armor.
Most of the outcomes are fairly similar to the current outcomes, but
with the inclusion of staggering one or both parties to make the
subsequent potential grabs _stickier_, if that makes sense.
Neutral is now a mutual stagger, but also the tackler being left
upright. It's effectively net zero.
### Blocking
Blocking is checked on impact, and results in a neutral outcome if the
defender successfully blocks. This means our tackler isn't too severely
impacted from an unsuccessful tackle
### Additional Changes
Your arms ``unarmed_effectiveness`` now contributes to the attack mod
and defense mod of tackles. For humans tackling humans, this often
results in a net neutral result. But if you have a better arm, or the
tackle target has worse arms, this can alter the outcome significantly.
Any tackler with the trait TRAIT_NOGUNS (like bezerkers, Sleeping Carp
users or the very unlikely chance ninjas are tackling while wearing
their armor) gains a bonus to their tackles.
Any suit that prevents shove knockdowns grants an attack bonus, and not
just riot armor. This now includes Mk.1 Swat suits, the ones from the
SWAT crate in cargo.
Settlers are vulnerable to tackles, much like their dwarf cousins.
They're also just as bad at tackles.
Security lockers come with gripper gloves, and the sec vendor has 5 sets
of gripper gloves as standard items. They also have a +1 skill bonus.
This should encourage people to use tackling a bit more without having
to always seek out the best gear to accomplish the task. (particularly
since security is inherently pretty good at tackling with the outcome
changes).
The HoS gets a pair of gorilla gloves in his garment bag. If he wants
them.
The shove slowdown is now a new status effect, Staggered. This is just
better functionality overall. Any instance of adding the shove slowdown
now makes our target staggered.
## Why It's Good For The Game
Tackling is a bit outdated, to say the least. Not much content has been
added for a while that isn't strictly meme content. With these changes,
tackling should be slightly more nuanced, considering elements such as
unarmed effectiveness, the presence of martial arts, and actually
properly checking block rather than notionally checking block. There is
also more opportunity to protect yourself from tackle outcomes, both
positive and negative.
It also should be a little fairer to be on the receiving end of tackles
if you have taken the time to layer up defenses against it. Attackers
often overwhelmed defenders due to numbers favoring attackers more than
defenders.
Closes some really outdated design that was resulting in some really
bizarre behaviour with regards to layered defenses against attack not
having the same meaning against tackles, if only because it was looking
for the wrong things and not even the correct parts of what it was
looking for. Namely, blocking and shielding.
The inclusion of more gripper gloves and a good outcome from using them
will hopefully incentivize people to consider tacking as a useful tool,
if a bit risky still due to the splat mechanics.
## Changelog
🆑
balance: Judo Joe, archnemesis of Maint Khan, has begun re-airing his
midnight infomercials shilling his extremely expensive Tackle Supreme
Judo Karate Training video tapes. Unable to pass up a 'bargain',
Nanotrasen has purchased these tapes en masse. Tackling techniques have
started to improve, as well as Nanotrasen's tackling instructional
algorithms within tackle gloves.
balance: The outcomes for tackling are more equalized. It isn't as feast
or famine, and should be somewhat more controllable without becoming too
severe.
add: Blocking successfully against a tackle will force the tackle to be
a neutral outcome.
add: Unarmed effectiveness from arms now contributes to attacking with
and defending from tackles.
add: Those who refuse to use firearms (like Sleeping Carp users and
insane unholy berzerkers) are better at tackling others.
add: Riot specialized armor, and not just riot armor, now contributes
meaningfully to tackling effectiveness.
balance: MK.1 Swat Suits, the ones that come in SWAT crates, now
functions similarly to riot armor.
add: Settlers from the outer rims have noticed they aren't very good at
protecting themselves against Judo Joe's clearly discriminatory tackling
techniques.
add: Security lockers come with gripper gloves, security vendors now
sell them as standard items, and the HoS' garment bag now has a pair of
gorilla gloves. Gripper gloves have a positive skill bonus to tackling.
add: Being insane also makes you INSANELY good at tackling but also
INSANELY likely to eat shit on a whiff. DO OR DIE, BITCH.
refactor: Shoving slowdown and all its implementations now use a status
effect, Staggered.
/🆑