## About The Pull Request
raptors werent meant to retaliate against each other or against their
owner. this was initially handled by their targeting strategy, however
some changes to it at some point broke this. raptors would now
over-escalate conflicts against troublemaker raptors, locking both into
a deathmatch. this fixes that
## Why It's Good For The Game
fixes raptor retaliate targetting
## Changelog
🆑
fix: fixes raptors retaliating against each other and their owners
/🆑
## About The Pull Request
123 changed files and multiple crashes after writing broken regex, I
replaced most remains of direct spans with macros. This cleans up the
code and makes it easier to work with in general, see justification for
the original PR. I also fixed a bunch of broken and/or unclosed spans
here too.
I intentionally avoided replacing spans with multiple classes (in most
cases) and spans in the middle of strings as it would impact readability
(in my opinion at least) and could be done later if required.
## Why It's Good For The Game
Cleaner code, actually using our macros, fixes borked HTML in some
places. See original PR.
## Changelog
Nothing player-facing
## About The Pull Request
This PR significantly enhances how zero-g movement works. Its no longer
locked to one of 8 directions, everything now has inertia and is
affected by weight. This means that throwing a piece of wire will no
longer completely reverse your movement direction, and that being thrown
out of mass driver no longer will slow you down to a halt at some point.
This leads to following gameplay changes:
* Guns now accelerate you. Ballistics have higher acceleration than
lasers, and higher calibers have higher acceleration than smaller ones.
This means that firing full-auto weapons in zero-g will make you drift
and accelerate significantly. While this can be a hilarious way to
travel in space, it makes using them trickier.
* Impacting a wall or an object while moving at high speeds will cause
you to violently crash into it as if you were thrown. Careful when
exploring!
* Jetpacks now have inertia. Changes introduced in #84712 have been
mostly reverted, although speed buff has been reduced to 0.3 instead of
0.5 (although this is compensated by new movement mechanics, so overall
speed should be roughly equal). All MODsuit jetpacks now possess the
speed boost. Advanced MODsuit jets (which has also been added back) and
captain's jetpack instead have higher acceleration and stabilization
power, providing much more precise control over your movement.
* Firing guns while moving on a jetpack will partially negate your
pack's acceleration, slowing you down. Non-advanced jetpacks'
stabilization is not enough to compensate for heavy caliber weaponry as
sniper rifles, shotguns or rocket launchers.
* You no longer instantly decelerate upon sliding along a wall. Instead,
it may take a few tiles if you are moving at extreme speeds. Passing
over lattices still allows you to grab onto them!
As space movement is angle-based instead of dir-based now, its much more
smooth than before due to using new movement logic.
Example of jetpack stabilization in action:
https://github.com/tgstation/tgstation/assets/44720187/6761a4fd-b7de-4523-97ea-38144b8aab41
And, of course, you can do this now.

**This pull request requires extensive gameplay testing before
merging**, as a large amount of numbers have been picked arbitrarily in
an attempt to keep consistency with previous behavior (guns and
normal-sized items applying 1 drift force, which is equal to what
everything applied before this PR). Jetpacks and impacts may also
require adjustments as to not be frustrating to use.
Closes#85165
## Why It's Good For The Game
Zero-G refactor - currently our zero-g movement is rather ugly and can
be uncomfortable to work with. A piece of cable being able to accelerate
you the same as a duffelbag full of items when thrown makes no sense,
and so does instantly changing directions. Inertia-based version is
smoother and more intuitive. This also makes being thrown into space
more of a hazard (possibly opening the door for explosive
decompressions?)
Jetpack inertia and gun changes - this is mostly a consequence of
inertia-based movement. However, zero-g combat being preferred during
modes like warops was an issue due to it negatively affecting everyone
without jetpacks which are in limited supply onboard. This reverts the
mobility changes which severely impacted space exploration, while making
zero-g combat more dangerous and having it require more skill to be a
viable option.
## What's left
- [x] Refactor moth wings to use jetpack code
- [x] Refactor functional wings to use jetpack code
- [x] Locate and fix a recursion runtime that sometimes occurs upon
splattering against a wall
- [x] Add craftable tethers and modify engineering MOD tethers to use
the same system
## Changelog
🆑
add: You can now craft tether anchors, which can be secured with a
wrench and attached to with right click. They won't let you drift into
space and you can adjust tether length/cut it via lmb/rmb/ctrl click on
the wire.
add: MOD tethers now remotely place and connect to tether anchors
instead of throwing you at where they landed.
balance: MOD tethers can now be used in gravity
balance: Jetpacks are now inertia-based.
balance: Guns can accelerate you significantly in zero-g.
balance: All jetpacks now give you equal speed buff, however advanced
MOD ion jets and captain's jetpack have higher acceleration/deceleration
values.
refactor: Refactored zero-g movement to be inertia-based and utilize
angles instead of directions.
/🆑
## About The Pull Request
Title; instead of using 200 brute damage as a point of "victim has been
digested enough", it now uses death. Should be about the same
mechanically, though consuming alive humans with burn damage will puke
them out sooner now, since they won't be able to accumulate as much
brute damage as before. But I think it's ?fine?, it feels kinda cheesy
to let the cube eat an already almost fried human patty after it expires
anyway.
EDIT: Consume action isn't allowing for more than one mob to be consumed
at a time, and the cube didn't have a way to dispose of the mob it's
consuming, so per request I changed it so the action now changes to
_Eject Mob_ when you consume a mob, letting you do just that. Also fixes
visible message of an attempt at consuming a mob not showing the
victim's name.
## Why It's Good For The Game
Fixes#53512
QoL for getting rid of the consumed victim
No more devouring blank space (in the visible message)
## Changelog
🆑
fix: gelatinous cubes now puke out their consume victim when said victim
dies, not when it accumulates 200 brute damage (not all mobs can get
damaged to that point)
qol: gelatinous cube's Consume action can now be used to eject the
currently consumed mob
fix: fixed gelatinous cube's consume attempt not showing the victim's
name properly (You start attempting to devour !)
/🆑
## About The Pull Request
<details>
- renamed ai folder to announcer
-- announcer --
- moved vox_fem to announcer
- moved approachingTG to announcer
- separated the ambience folder into ambience and instrumental
-- ambience --
- created holy folder moved all related sounds there
- created engineering folder and moved all related sounds there
- created security folder and moved ambidet there
- created general folder and moved ambigen there
- created icemoon folder and moved all icebox-related ambience there
- created medical folder and moved all medbay-related ambi there
- created ruin folder and moves all ruins ambi there
- created beach folder and moved seag and shore there
- created lavaland folder and moved related ambi there
- created aurora_caelus folder and placed its ambi there
- created misc folder and moved the rest of the files that don't have a
specific category into it
-- instrumental --
- moved traitor folder here
- created lobby_music folder and placed our songs there (title0 not used
anywhere? - server-side modification?)
-- items --
- moved secdeath to hailer
- moved surgery to handling
-- effects --
- moved chemistry into effects
- moved hallucinations into effects
- moved health into effects
- moved magic into effects
-- vehicles --
- moved mecha into vehicles
created mobs folder
-- mobs --
- moved creatures folder into mobs
- moved voice into mobs
renamed creatures to non-humanoids
renamed voice to humanoids
-- non-humanoids--
created cyborg folder
created hiss folder
moved harmalarm.ogg to cyborg
-- humanoids --
-- misc --
moved ghostwhisper to misc
moved insane_low_laugh to misc
I give up trying to document this.
</details>
- [X] ambience
- [x] announcer
- [x] effects
- [X] instrumental
- [x] items
- [x] machines
- [x] misc
- [X] mobs
- [X] runtime
- [X] vehicles
- [ ] attributions
## Why It's Good For The Game
This folder is so disorganized that it's vomit inducing, will make it
easier to find and add new sounds, providng a minor structure to the
sound folder.
## Changelog
🆑 grungussuss
refactor: the sound folder in the source code has been reorganized,
please report any oddities with sounds playing or not playing
server: lobby music has been repathed to sound/music/lobby_music
/🆑
## About The Pull Request
So, do you remember orbies, those cutesy virtual PDA pets from that PR
that Ben made roughly six months ago before moving on his next project,
leaving them to be probably forgotten in a near future/present/past?
Yeah, personally I never played around, however I recalled that they do
have customizable virtual hats, which can be selected from a dropdown in
the UI, and I thought that it would be a perfect target for some
achievement-related content, as they're totally cosmetic that provides
no gameplay advantage nor affects balance in no way whatsoever. I cannot
sit well with cheevos being purely an end to itself, that's the reason
this PR exists.
The new additions to orbies hats, and their respective required
achievements are:
- The fishing hat (Legendary Fisher)
- A huge-ass rollie (Unhealthy Snacks) (yeah, it isn't exactly a hat but
the code in no way assume that the item has to be a hat, beside vars
named like that for the sake of convenience)
- A tape wizard hat (Archmage)
- An energy cakehat (Very Important Piscis)
- A bounty hunter cowboy hat (Hot Damn!)
- A fancy crown (Outdebted)
The huge-ass rollie (called fat dart) in the game, is a new cigarette,
rarely found in hacked cigarette vending machines. It's obviously a
reference to that Ralsei meme from 3 years ago or so but I personally
don't care, I just wanted to give an excessively big cigarette to orbies
to symbolize the proposterous accomplishment of eating 500 cigarettes in
a single round without dying from nicotine OD less than halfway through,
but since orbie hats use actual items are references for their
appearance, I found myself obliged to add one to the code. Overall, the
fat dart comes from an old PR on Citadel, though I had to resprite it
myself.
Here's a lazy collage of the hats. For some reason unbeknownst to me,
the hats are horizontally squished. I need to ask Ben why he did them
this way when Orbies' heads are as wide as a rugby ball.

## Why It's Good For The Game
Simple, extra cosmetic stuff for a simple feature that's as relevant as
playing around with plushes.
## Changelog
🆑
add: Added more customizable options to PDA virtual pets, which can be
unlocked by completing achievements.
add: Added a fat dart that can be rarely found in hacked cigarette
vending machines.
/🆑
Removed the only instance of `only_forced_audio = TRUE` in /tg/,
replaced with `cooldown = (5 SECONDS)`.
The variable is still there in case someone needs it.
## About The Pull Request
The variable was introduced in
https://github.com/tgstation/tgstation/pull/42216
to prevent it from getting annoying.
I discussed this change on the forums, previously assuming it was server
config
https://tgstation13.org/phpBB/viewtopic.php?f=9&t=37131
and people seemed receptive to the idea, spam being the only concern.
## Why It's Good For The Game
There are better ways to prevent spam.
Extending the cooldown is more favorable than being blocked completely
(this is the treatment cyborg *deathgasp received, which is a longer,
more jarring sound).
Audible emotes help you grab the attention of others (for better or
worse).
I genuinely find them amusing at times & they remind me of the person on
the other side.
There is some limit to play-pretend. These emotes enabled some
interactions with players I would not have had otherwise.
As long as we stop the spam, it breathes some life into a game full of
clicking, pointing at people and typing indicators.
## Changelog
🆑
del: Intentional screaming has been unmuted. Now has a 5s cooldown
instead.
/🆑
## About The Pull Request
bot modes werent correctly reflecting the bot's AI states. this pr fixes
that. also fixes some issues where the bot's AI might get stuck
inbetween switching modes
## Why It's Good For The Game
closes#86771
## Changelog
🆑
fix: botkeeper now displays bot's correct states!
/🆑
Fixes#86784
## About The Pull Request
Although some of the issues found were a direct result from #86692
(c698196766), there was still 40% of
length-related issues that wouldn't be covered anyways that are fixed in
this PR. I.E.:
* Name inputs without `MAX_NAME_LEN`
* Desc inputs without `MAX_DESC_LEN`
* Plaque inputs without `MAX_PLAQUE_LEN`
* Some people just screwed up the arguments so it would prefill
something like "40" in the `default` var because they didn't name their
vars.
To help me audit I added a lot of `max_length` named arguments to help
people understand it better. I think it might be kinder to have a
wrapper that handles adding `MAX_MESSAGE_LEN` in a lot of these cases
but I think there is some reason for a coder to be cognitive about input
texts? Let me know what you think. I didn't update anything
admin-related from what I can recall, let me know if anything needs to
be unlimited again.
## Why It's Good For The Game
The change to `INFINITY` notwithstanding, there were still an abundance
of issues that we needed to check up on. A lot of these are filtered on
down the line but it is clear that there needs to be something to catch
these issues. Maybe we could lint to make `max_length` a mandatory
argument? I don't know if that's necessary at all but I think that the
limit should be set by the invoker due to the wide arrangement of cases
that this proc could be used in.
This could all be a big nothingburger if the aforementioned PR is
reverted but a big chunk of cases fixed in this PR need to be fixed
regardless of that since people could put in 1024 character names for
stuff like guardians (or more now with the change). Consider this
"revert agnostic".
## Changelog
🆑
fix: A lot of instances where you could fill in 1024-character names
(normal limit is 42) have been patched out, along with too-long plaque
names, too-long descriptions, and more.
/🆑
## About The Pull Request
Legions borne from mimes can no longer talk
## Why It's Good For The Game
Immersion breaking oversight. Just as dwarves make tiny legions mimes
make mute legions
## Changelog
🆑
fix: Legions borne from mimes can no longer talk
/🆑
## About The Pull Request

## Why It's Good For The Game
A little bit of added immersion, mainly.
Also doesn't mess with people faking death (not ling fake death,
*deathgasp shenanigans) because you can literally just wear glasses or
turn your body over and people can't see your eyes
Also doesn't necessarily *hide* the eyes, so if you examine a dead
cultist you'll still see `They have glowing red eyes`.
Also yes fakedeath (ling fake death) counts as deceased so your eyes
close
## Changelog
🆑 Melbert
qol: Deceased and asleep humanoids will now close their eyes
/🆑
## About The Pull Request
https://github.com/tgstation/tgstation/pull/86523 added the yellow
border for broken suit sensors on the medical HUD, but I forgot to put
the actual text back in the appropriate examine proc after the recent
examine box refactor.

## Why It's Good For The Game
Less asking 'what does this mean?' because there's a new HUD status but
no accompanying information about it.
## Changelog
🆑 LT3
fix: Fixed missing examine text for the yellow medical HUD border
regarding suit sensors
/🆑
## About The Pull Request
Adds a new var called `wound_clothing` to `apply_damage` and
`receive_damage` which will be checked in `check_woundings_mods` if it
should also apply the damage to the jumpsuit. It's `TRUE` by default.
Changes `irradiated` and `body_temperature_damage` to not wound
clothing. This also removes the `10 >= damage` check for burns for
clothing damage as it was there to prevent freezing from harming clothes
which is no longer a problem.
## Why It's Good For The Game
Not all brute/burn should also the damage the clothes. This allows for
damage to specify if it should damage clothes or not. Radiation burns
should not shred my clothes. Code that prevents all damage equal or
below ten burn from damaging clothes is BAD, my clothes should BURN.
`TRUE` by default so everything else should work normally.
fix: #84046
## Changelog
🆑 Goat
balance: burn damage equal or under to ten will now damage your jumpsuit
(does not apply to internal temp damage)
fix: radiation burns no longer damage your jumpsuit.
code: added a new var to applying damage to set if it should apply
damage to clothes.
/🆑
## About The Pull Request
Adds an upgrade disk that gives the ability to remotely charge an APC
with the AIs backup power (the one that runs down when there is no power
in an APC). This tech disk is under advanced AI tech
Also added the ability to make new disks with the new object type
/obj/item/aiupgrade, and made it so not every AI module is malf, now
only subtypes of /datum/ai_module/malf show up on malf upgrade screens
## Why It's Good For The Game
Adds the ability for an AI to assist crewmembers who do not have power,
which is a pretty interesting interaction. Does chem not have power and
is trying to make some healing chems? you can provide power for them for
a bit, but they better hurry!
## Changelog
🆑
add: Added the remote power AI disk
code: made it possible to easily add new AI upgrade disks
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Xenos can apparently use shenanigans such as
https://github.com/tgstation/tgstation/issues/86703 to put some items in
their hand, and there are likely methods like this dotted around the
codebase. However, the signal to put something in their hand is called
consistently across any process that would cause them to pick up or
otherwise have something to put in their hand, so instead I added
/datum/component/itempicky to xenos.
While I was in there, I expanded the functionality of itempicky; it can
run a callback to determine a condition that needs to be met now.
## Why It's Good For The Game
Fixes https://github.com/tgstation/tgstation/issues/86703
Expands a component's usefulness
## Changelog
🆑 Bisar
fix: Xenomorph restrictions on items they can pick up have had their
determining logic made more _robust_.
code: The itempicky component (restricts what can be picked up via a
whitelist) can now, optionally, have a callback fed to it to determine
cases of bypassing that whitelist.
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## About The Pull Request
Description states they eat uninsulated cable. This has been changed to
say they love eating *insulated* electrical cables.
## Why It's Good For The Game
All cables in the game are insulated, so this keeps things consistant.
It's also more realistic, mice don't bite into electrical cables to get
at the wires inside - they do it because gnawing the soft rubber or
plastic insulation sharpens and maintains their teeth.
## Changelog
🆑
spellcheck: Mice now love the taste of insulated electrical cables, not
uninsulated ones.
/🆑
## About The Pull Request
Partially handles #86685
Moving all organs/contents is a pretty bad idea and I'm not sure if
there's a cleaner way to do it for the first point in the issue.
## Changelog
🆑
fix: Vore victims no longer get digested instantly when you evolve
/🆑
## About The Pull Request
Adds some flags that went missing after #86596Closes#86709
## Changelog
🆑
fix: Snow bears are no longer impervious to all sources of damage
fix: Cameras, living floors and ghost of poly no longer can be pushed
around
/🆑
## About The Pull Request
Yeah, as I suspected, lab gorillas from the Self-Gorillafication Nerf
weren't the only mobs to be resized without the `current_size` var or
the `update_transform` proc. The other one that does this (at least on
init) is, drum roll, yet another gorilla subtype. Wow, the apple doesn't
fall far from the tree. EDIT: I was wrong... there's another mob who
does this too.
## Why It's Good For The Game
For those of you who care but don't know what the difference is: the
transform matrix of an object works around the center of the icon, which
means that if you multiply the transform matrix a 32x32 icon by 0.5, the
icon will then appear roughly 8 px above the lower edge of the turf. For
most objects, we don't care about it, but for mobs, this is a small
visual issue because the lower end of the icon should be aligned with
the floor (or the shadow in the case of the wallening for non-floating
mobs). This where the `update_transform` comes handy, since it offsets
the icon by that amount to compensate for the scaled transform matrix.
Alas, the transform matrix is used for a lot of things and it's perhaps
impossible to have the CI look into it.
## Changelog
It's a very subtle nit, people won't notice.
## About The Pull Request
Contractor abductions no longer recursively dump all of your items on
the ground, instead only doing a single depth loop. Also fixed storage
UI getting broken after being kidnapped due to using a wrong proc
## Why It's Good For The Game
There's zero reason as for why it should behave like that other than
just making recovery far more annoying.
## Changelog
🆑
fix: Your UI no longer breaks after being kidnapped by a contractor
qol: Being kidnapped by a contractor no longer dumps all of your boxes
and belts
/🆑
## About The Pull Request
Another batch of changes to examine, ideas being courtesy of Melbert and
Swanni. When examining an item you will now see tags with tooltips
elaborating on their meaning instead of having each property displayed
in a separate line. Additionally, examines now use fieldsets, saving a
line previously spent on displaying an item's name and instead putting
it directly into the top outline. Embedding and slapcrafting also
display their properties as tags, and combat info now displays item's
sharpness.
Here are some examples, each tag previously taking up its own line.



Additionally, protection classes now better elaborate on items'
temperature protection properties and tell you the exact temperatures
that an item can withstand

## Why It's Good For The Game
Tags are a very intuitive system used in many games and we could benefit
from it too. Compressing seven lines of text into one while retaining
readability and all information within by using tooltips will majorly
cut down on chat space used by examines.
## Changelog
🆑
refactor: Refactored how examines display item properties. A lot of them
are now displayed as tags that you can hover over to receive details
about, like item size, resistances and materials an object is made of.
qol: Protection classes now better elaborate on thermal resistances of
items, displaying the exact temperatures they can protect you from.
/🆑
## About The Pull Request
Fixes#86622
Plasmamen relevant_external_organ is null, and it then checks if
relevant_external_organ is in a list containing nulls
I cleared the nulls from get_mut_organs to fix it
🆑
fix: Fixes plasmamen having all external organ species preferences
/🆑
## About The Pull Request
GODMODE has a lot of sources that toggle it. From admin-stuff to status
effects, components, actions and mobs which are supposed to be
invincible. It's better off as a trait than a flag, so we can manage
these sources.
## Why It's Good For The Game
See above.
## Changelog
🆑
admin: godmode is now a datum trait instead of a bitflag. This means the
process for toggling it is a little different now.
/🆑
## About The Pull Request
Fish (the item that you catch with a fishing rod) now has an edible
component attached to it, making it possible to eat them if you really
have to, at the cost of eventually killing and deleting the fish,
however, you normally shouldn't.
Along with the seafood and meat foodtypes flags, it possess the gore and
raw foodtypes too, making them pretty awful to eat unless you're a
(non-vegan) lizard, felinid, or wearing the strange bandana*, which can
only be found in the cqc kit case. Furthermore, it carry diseases like
the ones from food left on the floors for too long, so a strong stomach
is required to safely eat it even if you actually like it, dummy...
UNLESS you fry or grill it, thus killing the diseases (as well as the
fish) and removing both the gore and raw food types, then it becomes an
actually ok meal... UNLESS you're dumb enough to eat a pufferfish, a
donkfish or a slimefish.
That is more or less the general rule. A few fish stray for it. For
example, lavaloops are never raw (still gorey). The skeleton fish are
never edibles, and holodeck fish is, well, holographic and thus
disappears if you try to eat it.
*the strange bandana is a reference to MSG, and this is a reference to
the MGS3 fish eating animation.
This is WIP btw, I'll have to test it and add some then polish it.
## Why It's Good For The Game
Whole unprocessed fish should be technically edible, even if not safe to
eat nine times out of ten. Also I kinda need this if I want to add a
tasty fishing spot to the kitchen deepfriers.
## Changelog
🆑
add: Whole, unprocessed fish is now edible. However it's pretty much
reccomended to grill or fry it for over 30 spess seconds before
attempting to eat it.
fix: germ-covered, dirty food no longer tries to infect you through
contact.
/🆑
## About The Pull Request
So, I buffed gorillas a while back for traitors to get more mileage out
of them, and outside of needing to adjust that one wizard spell I've
been overall pleased with the results. However, while I knew that
Geneticists were capable of turning themselves into gorillas without the
magilitis injector, I thought it came with great difficulty but hoo boy
I was wrong. Turns out, its quite easy to turn yourself into a gorilla
with the three roundstart genetics setups you start with, and all you
need a little bit of toxin-healing chems (which don't really have a
downside and can stack!) or a medibot to pull it off. People have been
using this to validhunt as the newly buffed gorillas as early as 7
minutes or less into the round, which I think sucks! So I'm here to
change it.
If you become a gorilla from genetics, you become a new subtype with
nerfed stats. The stats are as follows:
180 health (from 220)
Melee damage 15-18 (from 25-30)
Obj Damage 25 (from 40)
Speed 0.1 (from -0.1)
Paralyze chance 0 (from 20)
No limb ripping
## Why It's Good For The Game
It's very easy to become a gorilla right now with little to no effort
and to great effect, seeing as gorillas are pretty strong now. This
brings crew gorillas back in line to before gorillas got buffed for
traitor usage, which should ideally make this more balanced overall.
## Changelog
🆑
balance: Gorillas made from giving monkeys genetic damage are weaker
than their normal counterparts.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Lighters now have welding fuel which can be filled/extracted by hand,
giving a small but consistent source of welding fuel for non-chemists.
Welding fuel is now required for these lighters to work, they'll close
automatically once they're out of fuel.
They last for a minute, zippo lasts 2 minutes, before they need to be
refuelled. It can have other reagents put into it but it only checks for
welding fuel, so it won't work at all unless its got some.
They can be used as welding tools in minor cases, mostly fixing things
and welding doors shut, but can't do big things like deconstruction,
except the xenobio one because it's a lot hotter than the normal
lighter.
Also added a baseline support to check for heat to perform certain
welds, before heat is just this binary "has or doesnt have heat", which
made its value useless.
## Why It's Good For The Game
Adds a ghetto way of getting welding fuel, hiding reagents, and a ghetto
welding tool without being something that prisoners could break out of
prison with. They could weld the doors shut which is a little funny,
security still has proper welding tools to counter it.
It also currently is kinda lame that lighters could just be open 24/7,
unlike matches which has a lifespan of 10 seconds each or something.
## Changelog
🆑
add: Lighters now use and require welding fuel to work, but can be used
as a welding tool for tasks that don't require much heat.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
converts certain donk outpost objects to use SSqueuelinks instead of
globals
## Why It's Good For The Game
i dont think every cool ruin should have its own global vars + this
allows multiple of the ruin to be spawned without breaking if someone
wants to do that for some reason
its better to just do it like this
## Changelog
🆑
code: that one cool haunted donk outpost ruins tripwires and such use a
subsystem instead of globals. no real gameplay effect
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Previous Pull Request
#85308 reverted by #85929

~~Causes the round to not start when a player isn't eligible for any
jobs at a specific priority level due to runtimes trying to `pick()`
from an empty list aborting the entire job assignment stack.~~
(Fixed???? by
e0e9f2f430)
Maybe we should test merge this for a mo just to make sure no more
cheeky runtimes pop up before merging.
## About The Pull Request
This PR does a couple of minor things:
Makes the job debug logging a bit easier to follow.
Minorly brings some SSjob code up to code standards, converting proc
names to snake_case and doing some otherm is cleanup.
Refactored some stuff into different procs, updated some comments.
And some major things:
Changes the job assignment logic.
Old behaviour
> Assign dynamic priority roles
> Force one Head of Staff (if possible)
> Assign all AIs
> Assign overflow roles (bugged in 2 ways)
> Shuffle the available jobs list once, at the start of the random job
assignment loop
> Pick and assign random jobs for random players from High prefs down,
with a priority on Head of Staff roles
> Handle everyone that couldn't be assigned a random job
New behaviour
> Assign dynamic priority roles
> Assign all Head of Staff roles to players with High prefs
> If no Head of Staff was made in the above way, force one Head of Staff
(if possible)
> Assign all AIs
> Assign overflow roles (fixed)
> Prioritise and fill unfilled head roles at each job priority pref
level, from High prefs down.
> Build a list of all jobs that each unassigned player could be eligible
for at the above pref level.
> Pick a job from that list at random and assign it to the player.
> Handle everyone that couldn't be assigned a random job.
In reality there should be little impact on overall job assignment, the
code changes read more as semantics. For example, the priority check for
filling Head slots will have the same candidate pool in both old and new
versions, but in the new version we're more clearly saying that Heads
are important and we want to prioritise filling them for the sake of
round progression even though the outcome in new and old is the same.
A key change will lead to an increase in assistants - Overflow fixes.
Currently the code block to do early assignments to the Overflow role
doesn't work - or works but not as you'd expect. The idea was is that
because enabling the Overflow role in the prefs menu is an On/Off toggle
that sets the job to High priority when enabled and prevents any other
High priority pref, players that have the Overflow role enabled will
**always** get it. It's their highest priority job with infinite slots.
So we do a pass right at the start to give everyone with the Overflow
role enabled that role and save us wasting time later on in random job
code giving them that same role but with more work.
The problem is the code for this only assigns the Overflow role to
people with it set to Low priority in their prefs, resulting in log
readouts like:
```
[2024-07-27 09:49:43.469] DEBUG-JOB: DO, Running Overflow Check 1
[2024-07-27 09:49:43.469] DEBUG-JOB: Running FOC, Job: /datum/job/assistant, Level: Low Priority
[2024-07-27 09:49:43.472] DEBUG-JOB: FOC player job enabled at wrong level, Player: Radioprague, TheirLevel: Medium Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.472] DEBUG-JOB: FOC player job enabled at wrong level, Player: Caluan, TheirLevel: High Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.473] DEBUG-JOB: FOC player job enabled at wrong level, Player: Caractaser, TheirLevel: High Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.473] DEBUG-JOB: FOC player job enabled at wrong level, Player: Apsua, TheirLevel: High Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.475] DEBUG-JOB: FOC player job enabled at wrong level, Player: Bebrus2, TheirLevel: Medium Priority, ReqLevel: Low Priority
[2024-07-27 09:49:43.475] DEBUG-JOB: AC1, Candidates: 0
```
Where nobody gets pre-assigned the overflow role because their prefs are
all set to the High priority from being toggled... Except wait a second,
some people have it at Medium priority when it should just be a No
Role/High Priority Role toggle?
And herein we meet a problem. My hypothesis is that traits and stuff
that change the overflow have allowed players to set the "ordinary"
overflow role of Assistant to Medium and/or Low priority.
This still shows as enabled in the prefs menu, but leads to an outcome
where a player with assistant enabled is assigned Cook instead.
```
[2024-07-27 09:49:47.775] DEBUG-JOB: DO, Running Overflow Check 1
[2024-07-27 09:49:47.775] DEBUG-JOB: Running FOC, Job: /datum/job/assistant, Level: Low Priority
...
[2024-07-27 09:49:43.475] DEBUG-JOB: FOC player job enabled at wrong level, Player: Bebrus2, TheirLevel: Medium Priority, ReqLevel: Low Priority
...
[2024-07-27 09:49:47.987] DEBUG-JOB: Running AR, Player: Bebrus2, Job: /datum/job/cook, LateJoin: 0
```
So players with the Overflow job pref set to Low (an unexpected state,
should be disabled or High) would be guaranteed to get that role if none
of the higher priority Head of Staff/AI/Dynamic roles took over via the
bugged "force overflow for people with the pref enabled" proc.
Players with the Overflow job pref set to High would be guaranteed to
get that role if none of the higher priority Head of Staff/AI/Dynamic
roles took over via the random job assignment code giving them their
Highest priority role thanks to the infinite job slots of the Overflow.
And players with the Overflow job pref set to Medium (an unexpected
state, should be disabled or High) would get Assistant if the shuffle
step of the available jobs list put Assisstant before any of the other
jobs they had prefs enabled for at Medium that weren't already filled,
otherwise they'd get another random job.
This code is now changed to ignore the priority the player has set when
looking for people to fill the overflow role. As long as it **is**
enabled, the player will get it unless they're forced into a dynamic
ruleset role (AI when malf rolls) or a Head of Staff role due to their
other prefs (they have RD set to med or low, and no other player has a
Head of Staff at high so they get randomly picked and miss the overflow
role).
This will increase the number of assistants in shifts where their pref
state has Assisstant in the bugged Medium priority, but doesn't change
it for bugged Low and not-bugged High/On priority.
On the other side of the coin, we have how the random jobs are picked.
They're kinda not random, and I noticed this reading the logs then
reading the code.
The list of available jobs to pick from is randomly shuffled - but only
**once**. All players pull from a list of jobs in the same order. So you
end up with a log block like this:
```
[2024-07-27 09:49:47.985] DEBUG-JOB: DO pass, Player: Pierow, Level:3, Job:Botanist
[2024-07-27 09:49:47.985] DEBUG-JOB: Running AR, Player: Pierow, Job: /datum/job/botanist, LateJoin: 0
[2024-07-27 09:49:47.985] DEBUG-JOB: Player: Pierow is now Rank: Botanist, JCP:0, JPL:2
[2024-07-27 09:49:47.986] DEBUG-JOB: DO pass, Player: Daddos, Level:3, Job:Botanist
[2024-07-27 09:49:47.986] DEBUG-JOB: Running AR, Player: Daddos, Job: /datum/job/botanist, LateJoin: 0
[2024-07-27 09:49:47.986] DEBUG-JOB: Player: Daddos is now Rank: Botanist, JCP:1, JPL:2
[2024-07-27 09:49:47.986] DEBUG-JOB: FOC job filled and not overflow, Player: Bebrus2, Job: /datum/job/botanist, Current: 2, Limit: 2
[2024-07-27 09:49:47.987] DEBUG-JOB: FOC player job not enabled, Player: Bebrus2
[2024-07-27 09:49:47.987] DEBUG-JOB: DO pass, Player: Bebrus2, Level:3, Job:Cook
[2024-07-27 09:49:47.987] DEBUG-JOB: Running AR, Player: Bebrus2, Job: /datum/job/cook, LateJoin: 0
[2024-07-27 09:49:47.988] DEBUG-JOB: Player: Bebrus2 is now Rank: Cook, JCP:0, JPL:1
[2024-07-27 09:49:47.988] DEBUG-JOB: FOC player job not enabled, Player: Redwizz
[2024-07-27 09:49:47.988] DEBUG-JOB: FOC job filled and not overflow, Player: Redwizz, Job: /datum/job/cook, Current: 1, Limit: 1
```
The list is shuffled into an order of something like `list("Scientist",
"Botanist", "Cook", "Sec Officer", ...)` then iterated over for each
player. So every random job selection goes:
> "Does Player1 have Scientist enabled and at the right priority? No?
Okay, Botanist? Yes? You get botanist."
> "Does Player2 have Scientist enabled and at the right priority? No?
Okay, Botanist? Yes? You get botanist."
> "Does Player3 have Scientist enabled and at the right priority? No?
Okay, Botanist has no slots left so we'll remove it from the list. Okay,
Cook? Yes? You get cook."
> "Does Player4 have Scientist enabled and at the right priority? No?
Okay, Cook has no slots left so we'll remove it from the list. Okay, Sec
Officer? ..."
This can lead to stacked individual departments if it gets randomly
rolled to the start of the list in the shuffle, and completely empty
departments if they end up at the end.
On high pop shifts this is probably less of an issue. Player prefs add
noise to this and as departments at the front fill up, those at the back
pick up some of the lower pref players.
But have you ever had a shift where there's just like... No fucking sec
even though there's tons of players? The logging (before I made changes
in this PR) was a bit ass, but my hypothesis there is that sec officer
was shuffled right at the end of the random job list, so every other
department was filled up before sec officers were picked.
To mitigate this, I made the list shuffle every single time the game
picks a random available job for the player. This should lead to a more
balanced selection of available jobs by avoiding situations where the
code is biased towards packing some departments by accident.
## Why It's Good For The Game
Overflow fixes mean people who go to their prefs and see the Overflow
Role is On will all have the same experience - They will be the Overflow
role.
More random random job selection should prevent individual departments
having a jobs be stacked when it would have otherwise been possible for
a more balanced selection but the code unintentially biased random
departments to be overstaffed and understaffed each shift.
## Changelog
🆑
fix: Having the Overflow Role set to On will properly ensure you get
that role at a High priority as intended by the game code.
fix: Job selection is now a little bit more random. Fixes an
unintentional bias in random job assignment that could lead to
feast-or-famine for roles where everyone is assigned one job and nobody
is assigned another job.
/🆑
Because the wings were in fact made of wax
## About The Pull Request
Storage goes to the very bottom of the interaction chain, hardcoded in
on `/atom`.
This is not preferred, obviously, but it ends up being a lot less
snowflaking overall.
Tables also go at the very bottom by extending `base_item_interaction`.
Fixes#83742Fixes#84434Fixes#83982Fixes#85516Fixes#84990Fixes#84890Closes#85036Closes#84025 (RMB places it on the table.)
Closes#86616
Other changes:
Refactored pod storage to be less jank. Patches some exploits around it.
## Why It's Good For The Game
Should make a lot more interactions a lot more reliable... hopefully
## Changelog
🆑 Melbert
refactor: Storage and Tables are now a lower priority action, meaning
some uses of items on storage should work... better, now. Here's hoping
at least, report any oddities.
refactor: Note: For an overwhelming majority of items, **combat mode**
will attempt to attack/insert into the target, while **non-combat-mode**
will attempt to use on a target. This means screwdrivering or emagging a
MODsuit must be done on non-combat-mode, as combat mode will simply put
the screwdriver or emag into its storage. Same applies to tables, though
when in doubt, RMB may help (for things which are also weapons, like
mops).
refactor: Refactored escape pod storage, now they actually properly show
as unlocked on red alert and above.
/🆑
## About The Pull Request
Introduces a new MODule in the uplink, makes the user transperent and
grants the ability to siphon light sources to recharge your suit.
Ingame demonstration: https://www.youtube.com/watch?v=bhXNOAMDy4U
## Why It's Good For The Game
I've been playing a ton of Splinter Cell and Intravenous recently and
this random idea popped in my head.
"Wouldn't it be cool if traitors could blend in the darkness to get a
jump on their opponents?"
Also unrelated
"Wouldn't it be cool if tots had a tool to recharge their suit that
didn't involve sitting in a pod for 10 minutes?"
This PR introduces a new module to the uplink, the Wraith.
It comes with a passive and active component.
Passively it works exactly like the crew version of the cloaking module
with just a couple of differences.
1) Doesn't need to be manually activated, if you lose the cloak it's
regained after 5 seconds.
2) Lower stealth alpha value( how trasperent you are basically),
slightly less visible than the crew version, not as good the ninja
module however , I tuned it just enough so that you are more or less
undetectable in the dark.
The active component of the module lets you destroy stationary lights to
recharge your suit power, if used on handheld or borg lights it turns
them off for a minute.
**Why do we need this module when we already have the stealth implant
and the chameleon projector?**
I can think of a few reasons.
1) MODsuits were designed to be customizible, traitor suits range
between 6 to 16 TC, having to invest in a 7-8 TC item after you already
bought a suit is fairly expensive.
2) This MODule would be a better fit for ambushes, as it doesn't have
the *uncloaking* delay of its counterparts.
It is however considerably worse if you get caught, as the cloak is
disrupted on bump or damage.
3) It has better interactions with the sandbox.
Lights can go out for many reasons, maybe it’s just a power outage, or
some assistant broke it, or maybe it was anightmare.
It leaves room for plausible deniability, adding to the paranoia.
It's also not complete invisibility, if you want to stay undetected you
need to lurk in the darkness, you might expand your domain, at the cost
of the crew eventually wising up to your shaeneningans.
Lastly, since the active component of the module uses the same proc of
the saboteur handgun, I've updated the code to be a generic proc rather
than a signal, to make it easier to reuse in the future.
Item desc provided by NecromancerAnne.
Module sprite made by Orcacora.
## Changelog
🆑
add: The Wraith Cloaking Module is now available in the uplink, costs 3
TC.
code: the saboteur handgun now uses a generic proc rather than a signal
/🆑
---------
Co-authored-by: Xander3359 <66163761+Xander3359@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
This is a remake of https://github.com/tgstation/tgstation/pull/84501
with a few small changes to avoid mapping issues. This time it's
restricted to a once-in-a-year event, mainly because neither Jacq and
Lemon were ok with the possibility of Pun Pun being posibly playable all
year, however Jacq said he's fine with it being available on the
holiday, while Lemon isn't around on Discord atm so I don't know what
he's to say.
The trait makes pun pun playable and gives them the job of being a
busser (waiter) in the cafeteria. They're clever and can use tools most
other monkeys can't, but cannot be humanized, while also being unable to
speak Galactic Common. Should they roll traitor, they'll be able to buy
syndicate monkey reinforcements and equipment, which it can also use,
being a monkey itself.
## Why It's Good For The Game
This is a fairly unique job, like the Cargo Gorilla, due to the fact
it's not a conventional humanoid crew member nor the AI or a cyborg. I
thought this was a fun idea, though I met some obstacles and the
original PR was DNM'ed and then closed. However, the trait perfectly
fits the theme of the holiday, making a good compromise since Pun Pun
will stay AI-controlled the rest of the year, as Jacquarel and Lemon
want it to be. It can also be added by an admin through VV, whether
they're planning some shenanigean or just want to add something more to
the round.
## Changelog
🆑
add: Pun Pun is a playable crewmember during Monkey Day (14 December).
/🆑
## About The Pull Request
Life should not be intentionally sleeping that is dumb
Most of these are trivial, hierophant needed a bit of jigging but it was
fine
Also adds SHOULD_NOT_SLEEP(TRUE) to life after talkin with the other
maints
## Why It's Good For The Game
No excuses for feature coders
## About The Pull Request
Adds suit sensor repair to the cable coil attack chain, allowing you to
fix your suit sensors by hitting yourself with cable coil. (Previously
you'd have to use it on the uniform)
Broken suit sensor is visible when examining the mob.
## Why It's Good For The Game
Makes repairing your suit sensors more intuitive by responding similarly
as applying mesh, sutures and other products.
## Changelog
🆑 LT3
qol: Quick repair suit sensors by hitting yourself with cable coil
qol: Improved feedback for broken suit sensors
/🆑
## About The Pull Request
I tested these in every single iteration but the final one.
So it was doing `string + list()` and runtiming because it lost a `. =
list()`
## Changelog
🆑 Melbert
fix: Med/sec hud examine
/🆑
## About The Pull Request
Reworks most of the Void Heretic kit.
All Void spells now apply a stacking debuff that makes you gradually
colder.
Void Blast has been replaced with a new spell "Void Conduit" and a new
Side knowledge spell, "Void Prison" has been introduced.
Waltz At The End Of Time has been completely overhauled.
Lastly Void Blade has been resprited along with the overlay of Void
Chill, check any of the linked videos to see the new look.
All new sprites have been kindly made by OrcaCora.
## Why It's Good For The Game
Void path is *Supposedly* themed around the cold of space but doesn't
have any tools to live up to the fantasy of being an harbringer of the
Void whose main goal is to freeze the station to an icicle.
Then there's also the issue of Void being utterly underwhelming compared
to his neighbors, Cold is way too easy to treat as a status effect, so
much so, a simple cup of coffee can utterly shutdown the void storm,
which is just unacceptable.
# **Changes**
- **Void Chill**: Is now a stacking debuff, each stack slows movement
speed by a percentage while lowering body temperature, upon reaching the
cap, which is 5 stacks, the victim cannot heat up anymore, all void
Spells apply 1 stack of the debuff, with the exception of the grasp
applying 5 (2 for the mark and 3 for the detonation) and the blade
upgrade applying 2.
**Reasoning**: Void chill currently suffers from being completely
shutdown by sipping tea, coffee or having the COLD_RESIST trait,with
this change you can still negate the damage and the slowdown you get
from being cold but not the slowdown from the debuff itself.
- **Aristocrat's Way**: Now grants no slip on ice and water tiles on
cold or depressurized turfs
**Reasoning:** Since the rework revolves around making Void heretic more
involved in freezing the station, they should be able to move in their
domain without getting punished for it.
- **Void Cloak:** Can now be toggled on and off to make the cloak
visible or invisible; when the cloak is visible it grants low pressure
immunity trait.
**Reasoning:** Not having pressure resistance as a Void Heretic just
sucks, as you are clearly intended to somewhat go into space at some
point; giving it to the cloak is a good compromise since you sacrifice
better protection (***the armor values of the cloak are pitiful***) for
utility.
- **Replaces "Void Blast" with a new spell, "Void Conduit"**.
**Void Conduit:** Opens a gate to the Void; it releases an intermittent
pulse that damages windows and airlocks and applies a stack of void
chill to non heretics, Heretics are granted the low pressure resistance
trait.
**Reasoning**: I like the idea behind Void Blast; unfortunately, the
spell has limited uses if an area isn't already spaced, which is hard to
do considering the current kit of Void Heretic doesn't provide anything
to help in that regard.
I wanted to give Void Heretic a tool to turn any area of their choosing
into their ideal habitat. Not amazing for quick assassinations, good if
you are anticipating a fight or want to simply expand your domain, the
added Trait might seem redundant, but let's not forget that the void
cloak is still a side knowledge, I don't want newbie heretics to space
an area and accidentally killing themselves because of it.
Video Demonstration: https://www.youtube.com/watch?v=nhPdj1hIgSI
- **New side knowledge: "Void Prison."**
**Void Prison:** It makes the target invulnerable and unable to do
anything for 10 seconds , when the spell ends, it applies a few stacks
of void chill, cannot be self-cast.
It occupies the same slot of Blood Siphon (inbetween Raw Ritual and Void
Phase.)
Video Demonstration: https://www.youtube.com/watch?v=nKZd8aEcZFw
**Reasoning**: Void is technically meant to be an assassination path and
not really apt at tackling multiple opponents, this spell might come
into clutch if you are outnumbered, or simply want some breathing room
from your pursuers.
- **Void Jaunt and Void Pull**
Cooldown respectively reduced to 25 and 30 seconds, down from 30 and 40.
**Reasoning:** I felt that the cooldown on these was a bit too high
overall; as it stands, Void Phase cooldown is twice as long as Ashen
passage, one of the best and arguably most sidepathed spells in the
game.
Granted phase is faster and has more range but I don't think it
justifies its cooldown being this long.
Void pull could also use slightly less cooldown, being the very last
spell you unlock and offering a simple melee knockdown.
- **Seeking Blade:** Now applies 2 stacks of void chill per hit.
**Reasoning:** Seeking blade is a bit underwhelming for being the final
blade upgrade, teleporting to a target you just stunned at melee range
is incredibly niche, now that Void chill is a stacking debuff we can
probably just slap it on the blade itself.
- **Waltz At The End Of Time:** The Heretic becomes weightless and able
to levitate around, (carp movement essentialy).
The heavy storm is no longer bound to the room the heretic is in but is
now an aura around them, this does a few things.
1) Releases a pulse that depressurizes areas, shatters windows, airlocks
and firelocks, and applies a stack of void chill to non heretics, the
passive burn and oxy damage effect has been removed.
2) Grants to the Heretic projectile deflection.
**Reasoning:** Void Has the reputation of having the weakest ascension
in the game, which it's hard to disagree on considering you can
completely neutralize the effects of the storm by simply sipping tea and
how generally little it does overall.
It's also kind of strange that you have this massive Eldritch storm
ravaging the station and for it to have no effects on its atmosphere,
infrastructure, or projectiles whatsoever.
Video Demonstration: https://www.youtube.com/watch?v=1_blr20-hgA
## Changelog
🆑
add: New Heretic Side Knowledge, Void Prison.
add: New Void Spell Void Conduit has now replaced Void Blast.
balance: Void Chill is now a stacking debuff, upon reaching the cap,
makes the target unable to heat up.
balance: Aristocrat's way now grants immunity to ice and water slips on
cold turfs.
balance: Void Cloak now grants low pressure resistance when visible.
balance: Void Phase and Void pull have received a minor CD reduction.
balance: Seeking Blade now applies a couple of stacks of void chill.
balance: Void Heretic Ascension has been overhauled, it's now protects
the heretic from projectiles, destroys windows and airlocks and applies
void chills to non heretics.
image: Void Blade and Void Chill have received some new sprites.
/🆑
---------
Co-authored-by: Xander3359 <66163761+Xander3359@users.noreply.github.com>
Co-authored-by: necromanceranne <40847847+necromanceranne@users.noreply.github.com>
## About The Pull Request
This fixes a couple of bugs that are still lurking for malf AI,
primarily, and reverts an unintentional balance change I did by making
mech domination cancel the delta activation.
There's a balance change instead; previously mech domination death
killed you (seemingly because of badly formed callstacks assuming you
never had a core or APCs available); I replaced this by causing the AI
to produce a massive EMP centered at their location if their mech gets
destroyed while they're piloting it.
## Why It's Good For The Game
Fixes https://github.com/tgstation/tgstation/issues/86107
Fixes https://github.com/tgstation/tgstation/issues/83753
Undoes unintentional balance change and adds with something that is
still quite debilitating, especially if you're currently under attack as
a malf AI.
## Changelog
🆑 Bisar
balance: AIs piloting mechs no longer die if they hit the supermatter,
nor do they harmlessly snap back to their core. The shock now causes
them to produce a massive EMP.
balance: Undid a balance change I did during the malf AI refactor. The
doomsday countdown will no longer stop if a malf AI dominates a mech.
fix: Fixed a few bugs with AI shunting and AI mech death.
/🆑
## About The Pull Request
We're calling spiral turfs which (the thing it does) is returns turfs in
a spiral pattern order, and then RANDOMLY PICKING FROM THAT LIST
So this is just a waste
Also cleaned up the proc some
## About The Pull Request
An if statement without parenthetis slipped through the cracks after
optimumtact resolved the conflicts in his latest PR, discarding the
previous reviews. I'm not sure if functionally it works the same, but it
sure doesn't fit the coding style either way.
This also changes the condition from `ishuman(user)` to
`isliving(user)`, there's no reason to restrict the sound to human mobs,
we only need to exclude observers from playing it.
## Why It's Good For The Game
See above.
## Changelog
N/A ?
## About The Pull Request
Borg upgrades would vanish upon deconstruction via lockdown-wrench
pipeline, which is inconsistent with them being dropped upon a module
change, and it's also kinda scummy.
Exoskeletons were not being dropped upon such deconstruction because
some melbert guy codered too hard i think haha whoops (#76583)
also made borg exoskeleton's part removal process use head and chest's
`drop_organs()` to handle flash/cell/wiring removal. it seems to be
neater but i could be wrong
## Why It's Good For The Game
Fixes#59647
Makes the exoskeleton (the most expensive and vital borg shell piece)
drop upon deconstruction again which is nice and cool
## Changelog
🆑
fix: fixed borg exoskeletons not dropping when a borg is manually
deconstructed
fix: borg upgrade modules are now dropped when a borg is deconstructed
/🆑
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
We can already stop the floating anim by adding the no floating trait,
COMSIG_PAUSE_FLOATING_ANIM and the relative paused_floating_anim_atoms
list are redundant as we can just use the `TRAIT_CALLBACK_REMOVE` macro
and timers.
## Why It's Good For The Game
Less crap in the way of a one big bespoke element that manages the
movetypes of every living mob in the game.
## Changelog
N/A
## About The Pull Request
Basic bots were clearing the active hud image list before calling the
hud handler functions, this meant client images would stack slowly over
itme as you viewed bots, and lead to poor client performance
Shoutout to kyler for spotting the code
Shoutout to melbert and mso for helping me debug the issue on sybil live
## Why It's Good For The Game
Fixes#86498
## About The Pull Request
Title. Adds two new maps:
- Grasslands Hunt (peaceful)
- Meta Central (easy)
These maps add a new basic revolutionary mob and significantly upgrades
the ai of basic deer.
This fixes an issue where modular maps were not correctly spawning mobs
or adding them to the "mutable candidates" for antagonists.
There's also some balance changes to bitrunning vendor prices, which are
generally now lower. This change is unrelated to the PR as a whole so
I'm okay with removing it if there's concern
### photos
<details>
<summary>expand</summary>


</details>
### todo
- [x] Fix the revolutionary death anim
- [x] Make deer run when injured
## Why It's Good For The Game
New maps as a general positive for bitrunning
Bug fixes
Makes vendor choices for bitrunning-exclusive items generally less of a
chore to get
## Changelog
jlsnow301, MMMiracles, KikoWen0, Ben10Omintrix
🆑
add: Added two new bitrunning maps: Grasslands Hunt and Meta Central.
add: Deer are now more complex animals, granting them enhanced ability
to run amok and chew your favorite plants.
balance: Reduced the cost of most BR vendor items.
fix: Fixes an issue where modular virtual domains spawned less mobs than
intended.
fix: These modular spawns are now valid mutation targets to become an
antagonist.
/🆑
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
## About The Pull Request
Changes the message on the brimdemon horn from "It has a brimdemon's
fang attached, which causes mark detonation creates visual and
audiosensory effects on the target." to "It has a brimdemon's fang
attached, which causes mark detonation to create visual and audiosensory
effects at the target.
## Why It's Good For The Game
Closes#86460
Makes the trophy read better
## Changelog
🆑
spellcheck: made the grammar on the brimdemon horn crusher trophy nicer
/🆑