## About The Pull Request
Picking up the work from
https://github.com/Bubberstation/Bubberstation/pull/4672 that has since
gone stale and unadded to the game. PR description will be the same as
previously.
Partial Port of https://github.com/NovaSector/NovaSector/pull/465
reworked to use right clicking on self similar the ghouls rather than a
spell.
Coded as a bounty for Dinklemyr
## Why It's Good For The Game
Similar to Nova's explanation, suitable for a lot of character ideas
who's mechanical limbs can be popped off.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
Unfortunately I don't have the images from the initial PR, but I can
confirm this works as intended.
</details>
## Changelog
🆑SpaceCatSS13, YakiAttaki
add: The cybernetic limb mount quirk has been added, synths and people
with synthetic limbs can now take this quirk to remove their limbs at
their discretion.
/🆑
---------
Co-authored-by: Alexis <catmc8565@gmail.com>
## About The Pull Request
Adds a dirty quirk, as requested in a bounty in
https://discord.com/channels/1059199070016655462/1415440129362886727/1415440129362886727.
This quirk does a few things.
1. Walking around, you have a small chance to spread dirt to the floor.
2. If you are barefoot, you track colored footprints that fade out over
7 seconds.
3. If you are attacked, you have a puff of colored, opaque smoke fly off
you. **This cannot be spammed and must be refreshed by digging in
trash.**
4. People around you get a small mood debuff.
5. You get a small examine blurb telling people that you're dirty.
Both the dirt color and flavor text can be customized in the quirk.
If you are cleaned with soap...
1. You scream, flail, and get a -6 mood debuff.
2. **All above effects are disabled.**
3. You can refresh your filth by rummaging in trash
Hygeinebots also always try to clean dirty people.
## Why It's Good For The Game
We have filth goblins on station, and this lets them reflect who they
are mechanically. Its also a small, but minor, way to give janitors just
a bit more things to do - and a small source of conflict where you may
have people running around trying to clean you because god you just
smell so bad.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
https://github.com/user-attachments/assets/6c627e3f-0874-4609-84e8-d7137628ecf1
</details>
## Changelog
🆑
add: Dirty quirk - spreads dirt, makes everyone annoyed at you, defeated
by soap.
/🆑
---------
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
## About The Pull Request
Adds a free ability to the revenant, which allows them to write messages
and draw runes as if they had a crayon. clicking the ability button
opens the crayon menu, and clicking around allows the revenant to draw
what was selected
## Why It's Good For The Game
Encourages roleplay with revenants and gives them something to do if
they can't get their hands on enough corpses
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
<img width="1848" height="1354" alt="image"
src="https://github.com/user-attachments/assets/379d1bfa-3c18-4574-b51c-6359168e9f3c"
/>
</details>
## Changelog
🆑
add: Added a bloodwriting ability to the revenant that works like a
built-in crayon
/🆑
---------
Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>
Co-authored-by: Alexis <catmc8565@gmail.com>
## About The Pull Request
- null all GAGS vars for brass wirecutters as it doesn't use GAGS
- Repath `mothbomb.dmi` so it actually gets deployed with the server
- Generate map icons
- Fix 150+ crafting material parity failures
- Fix airlock lights not working
- Fix certain species missing eyes
## Why It's Good For The Game
Don't like red X
## Proof Of Testing
If this PR is green check then you Know
## About The Pull Request
They did not have the fleeing targeting behavior assigned, hence they
failed to do anything and runtimed in place
## Changelog
🆑
fix: Fixed illusions not fleeing their targets and runtiming in place
/🆑
## About The Pull Request
On production, I sign up for rounds (and I know I pushed the button
because the auto-deadmin message comes up) but it doesn't inject me in
the game and fails without a warning. I have no idea why it's doing this
but I shifted some stuff around and added a few logs to hopefully stop
this strange consistent failure for me to start a shift.
I just cleaned up a lot of the code and turned the ready defines into
strings instead of a boolean (so I could log it more efficiently with
little overhead, as well as standardize it to a define without people
doing wacky shit everywhere). I don't think this will fix the issue but
it will definitely make some things more clear as to why I'm not joining
rounds without warning despite clicking ready.
## Why It's Good For The Game
Cleans the code up while trying to resolve a really puzzling bug I've
been having.
## Changelog
🆑
server: The ready/not ready states of new players are logged when a
shift starts.
/🆑
Fixes https://github.com/tgstation/tgstation/issues/88502
## About The Pull Request
The issue with the current code is that it was returning
`INITIALIZE_HINT_QDEL` without going through the whole carbon initialize
chain, making it such that we were trying to qdel() the typepath of the
`ai_controller` or the `bodypart`s instead of actual datums since those
variables pull double duty. I don't think pun pun code should be
lackadaisical when it comes to the carbon initialize chain, so I just
shifted around a bunch of stuff to retain the same functionality while
also making it that we do a full intialize. The tech debt of one monkey
shall be infinite.
## Why It's Good For The Game
Less errors on monkey day = ideal.
## Changelog
I don't think this affected the holiday itself so not really
player-facing
## About The Pull Request
A first, small change so that robot customers and mech wreckages produce
robot debris upon being killed/destroyed, rather than simply deleting
themselves. Customers, in specific, will undergo a similar gibbing
process as real borgs: sparking and scattering robot debris without the
animation. Wreckages, instead, will make a large noise, shake the camera
of close people, and collapse into a single robot debris (as it was
already mostly destroyed by this point).
## Why It's Good For The Game
The destruction of these two entities is otherwise underwhelming when
they disappear into the aether with little fanfare. Also provides the
chef and janitor with another thing to get mad about when John Assistant
throws sharp sticks at the kitchen's customers.
## Changelog
🆑
add: Robot customers and mech wreckage destruction are messier. Bring a
mop!
/🆑
---------
Co-authored-by: san7890 <the@san7890.com>
## About The Pull Request
Wirecutters already had the GAGS to be recolorable; this just enables
players to actually recolor them before purchasing, just like
screwdrivers. This doesn't affect printing them from any of the lathes.
(Big thanks to MrMelb for walking me through this)
## Why It's Good For The Game
Screwdrivers are recolorable, why not wirecutters too?
## Changelog
🆑
qol: Wirecutters are now recolorable when purchasing from a vendor
/🆑
## About The Pull Request
The action used the black square sprite as the background was not set.
## Changelog
🆑
fix: Fixed purple raptors' wings action background
/🆑
## About The Pull Request
Since simplemobs can be dealt stamina damage
(https://github.com/tgstation/tgstation/pull/90675)
gives simplemobs who take stamina damage a stamina bar - Since it's
missing
Simplemobs who can't take stamina damage still wont be able to see the
hud - so don't worry about clutter/miss information
## Why It's Good For The Game
Simplemobs have a missing stamina hud
## Changelog
🆑 ArchBTW
fix: Gives eligible sentient simplemobs a stamina hud
/🆑
Co-authored-by: glue0000 <230859540+glue0000@users.noreply.github.com>
## About The Pull Request
This provides a work around for issue: #92706
Which prevents user from using uplink.
YES -> A new verb called "Reset UI Positions". It puts them all to the
0,0 location which is top left of screen.
YES, too! -> Holding ALT and clicking the background of the window will
allow you to move it.
## Why It's Good For The Game
This provides ADMINs two ways to help antags that get their uplink page
stuck.
## About The Pull Request
Prevents the two specifically-targeted revenant objectives, "Make the
[captain/clown] as miserable as possible", from being chosen unless
someone holds one of those titles. Acting captains are also allowed.
## Why It's Good For The Game
Your one objective being some guy who may or may not ever be hired is
lame.
## Changelog
🆑
fix: Revenant objectives can only target people that are actually
present
/🆑
Makes mjor the boss of the paperwizard spaceproof and his underlings
## Why It's Good For The Game
Mjor is a very hard fight to begin with. but never fought in its
intended way and always end in the following two scenarios.
1 leading him out to space/let atmos drain out to kill him
2 your a changeling or have some other cheesy revive tactic to kill it.
Realisticly since this is being in space and your alone you are probaly
not gonna kill it unless you have somebody back you up and even then it
gives a run for your money
## Changelog
🆑 Ezel
balance:Mjor the Creative saw trough your crafty tactics and he and his
creations no longer takes damage from space
/🆑
## About The Pull Request
This adds several new hand emotes for human mobs:
| Emote | Message |
| ------------- | ------------- |
| slit | "drags a finger across their neck." |
| scratch_h | "scratches their head." |
| thumb_u | "gives a thumbs up." |
| thumb_d | "gives a thumbs down." |
| time | "checks the time." |
| tap | "taps their foot impatiently." |
| halt | "holds up their palm, signaling to stop." |
| shush | "holds a finger to their lips." |
| listen | "cups a hand to their ear." |
| think | "taps their head, thinking." |
| beckon | "waves a hand for someone to come closer." |
| airquote | "makes air quotes." |
| crazy | "twirls a finger next to their head." |
| squint | "squints." |
| rub | "rubs their chin." |
## Why It's Good For The Game
More emote content.
## Changelog
🆑
add: Add new emotes "slit", "scratch_h", "thumb_u", "thumb_d", "time",
"tap", "halt", "shush", "listen", "think", "beckon", "airquote",
"crazy", "squint", "rub".
/🆑
## About The Pull Request
- Across the board, bleeding wounds cause ~0.85x slower blood loss.
- Wound clot rate while bandaged has also seen a ~0.85x reduction.
- And slashing wounds have also had their natural clotting rate reduced
by ~0.85x.
- All in all, blood wounds are expected to last marginally longer while
keeping the same level of deadliness.
- Sutures blood flow reduction has been reduced by ~0.85x as well.
Medicated suture is unaffected.
- Blood Mary now scales blood regeneration based on drunkness.
- Old: Flat 3 blood/tick.
- 0 drunkness = 0 blood/tick. 40 drunkness = 2 blood/tick. 80 drunkness
= 4 blood/tick.
- Epoetin Alfa saw drastic changes.
- No longer heals liver damage.
- No longer adds Sanguirite to the system.
- Now directly clots 0.1 flow of bloodiest wound (almost effectively
quadrupling clot rate, but 3x less effective than sanguirite)
- Blood/tick reduced from 3 blood/tick to 1 blood/tick.
- Now causes minor heart damage (0.2 damage/tick).
## Why It's Good For The Game
- A while back we were talking about how volatile blood wounds were.
Blood wounds are super scary, which is good, but just how scary they
were meant that the extent to which you interacted with this was a bit
stifled. My thoughts are slowing their pace a bit should open up more
opportunities for interaction while keeping them as scary.
- See above.
- Bloody Mary was ridiculously good at healing blood loss, better than
any chemical. The tweak to the effect aims to keep it as a pocket option
for aspiring bartender-alchemists without overpowering other chemicals
in medical contexts.
- Epoetin Alfa is effectively a producible form of Sanguirite which is
something that I believe is not mass producible for a reason (it's
really strong). The changes to it aim to make it a bit less potent that
sanguirite itself while keeping it as a viable blood healing option.
- I understand the liver healing is kinda a real world analog but in the
context of our chemical system, liver damage is something intentionally
not very common. It allows for complete negation of several other chem's
downsides. While I like this form of emergent chem mixing (mannitol and
bath salts, for example), this one earns a "particularly problematic"
badge due to negating 100% of the downsides of many chems.
## Changelog
🆑 Melbert
balance: Blood flow and clotting has universally been slashed by about
0.85x. This means blood wounds kill you slightly slower, but heal
slightly slower.
balance: Sutures now heal 0.85x less blood flow and gauze's clotting
bonus is also 0.85x lower. Medicated sutures are unaffected.
balance: Bloody Mary's blood healing effect now scales with how drunk
you are. Worse in low amounts, better in high amounts.
balance: Epoetin Alfa no longer generates Sangurite. It now directly
clots bleeding wounds (at a rate ~3x worse than sangurite, but still ~4x
better than the natural clotting rate)
balance: Epoetin Alfa no longer heals liver damage.
balance: Epoetin Alfa regenerates 3x less blood. It's still 4x effective
than Saline Glucose or Iron.
balance: Epoetin Alfa now causes minor heart damage (0.2 damage per
tick).
code: All "coagulating" effects now use a shared function.
/🆑
## About The Pull Request
Port of https://github.com/shiptest-ss13/Shiptest/pull/3330
Partial port of https://github.com/shiptest-ss13/Shiptest/pull/1601
Makes two changes to how guns handle recoil.
- Changes recoil from an erratic shaking to a kicking of your screen
relative to your firing angle
- Adds a small cosmetic recoil to all ballistics (with an accompanying
pref option to tweak or disable it)
Primary recoil still is only used as a balance lever for a very small
handful of guns (and sawoff)
## Why It's Good For The Game
Cosmetic recoil makes guns feel a lot more punchier. People who think
its a competitive disadvantage (nerds/loosers) or people with a
legitimate sickness to screen shake or similar can just turn it off.
Old recoil was just reused explosion, while new recoil feels like its
actually recoil
## About The Pull Request
Previous PR - https://github.com/tgstation/tgstation/pull/94300
100 -> 35
## Why It's Good For The Game
100 hp is inconsistently tanky compared to other bots
going off a cleanbot's hp (25) - add 10 extra hp for leeway due to
repairbots working in work hazards
## Changelog
🆑 ArchBTW
balance: repairbot hp 100 -> 35
/🆑
---------
Co-authored-by: glue0000 <230859540+glue0000@users.noreply.github.com>
## About The Pull Request
Early return in `/mob/living/carbon/human/update_underwear()` if mob has
`TRAIT_NO_UNDERWEAR`
## Why It's Good For The Game
Fixes#94321Fixes#93922Fixes#93702
## About The Pull Request
@Metekillot
Continues https://github.com/tgstation/tgstation/pull/92053https://github.com/tgstation/tgstation/pull/92442https://github.com/tgstation/tgstation/pull/92911
Biodegrade destroys all restraints instead of one single restraint.
Biodegrade will now dissolve all* restraints (fixes niche use-cases such
as strait jackets, cuffed prisoner shoes, etc).
Biodegrade includes grabs (unless it's another ling): The manhandler
gets splashed acid, dealing some damage (this damage is not that bad);
the damage dealt depends on BIO protection (for reference - the default
security uniform halves the damage). They will also be stunned briefly
to give the ling a short chance to leg it.
## Why It's Good For The Game
Same reasons as Metek's
This change is meant to bring changelings in line with their categorized
"uncontainable" valid salad demarcation.
Biodegrade kinda sucks, and this makes it not-suck.
Makes biodegrade a more attractive ability for changeling by
significantly increasing its use as a method to escape confinement of
any sort. Hopefully it has the gumption to close up cheesy edge cases as
well.
## Changelog
🆑 ArchBTW, Bisar
balance: Changeling's Biodegrade works against grabs.
balance: Changeling's Biodegrade destroys all restraints instead of one
single restraint.
fix: Changeling's Biodegrade shows the effect when used inside lockers.
fix: Changeling's Biodegrade properly covers restraint types (cuffed
prisoner shoes, strait jackets, etc).
/🆑
---------
Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>
Co-authored-by: ArchBTW <230859540+glue0000@users.noreply.github.com>
Co-authored-by: Aki Ito <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com>
## About The Pull Request
slowclap should now function for all mobs
may fuck with keybinding, IDK
## Why It's Good For The Game
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
</details>
## Changelog
🆑
qol: Slowclap can now be used by all living mobs.
/🆑
## About The Pull Request
Instead of "chassis cover lock toggled" it'll actually tell you what you
did. No effect if the cyborg is emagged. Also I changed a 1 to a TRUE
somewhere because it annoyed me.
## Why It's Good For The Game
Sometimes you and the borg both try to touch their lock at the same time
and then it gets awkward and you gotta swipe your id a second time and
that gets pretty annoying.
## Changelog
🆑
qol: You can see whether you just locked or unlocked a cyborg
/🆑
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
## About The Pull Request
Another one of those things that I've noticed when playing around with
fish tanks; The slowdown lingered even when the fish tank (which depends
on the total weight of fish inside it) was no longer held and was only
updated another item is equipped or held.
This is because `attempt_insert` doesn't end up calling `DoUnEquip`,
which along with `equip_to_slot`, is one of the cornerstones of the
whole inventory system that we have had for over a decade. Luckily, this
doesn't break things entirely because `item/doMove` seems to have a
fallback, but it only covers held items and only does half of what
`DoUnEquip` does, because it's its own copypaste code, disconnected from
the standard unequip call stack.
I've done some changes to make sure `DoUnEquip` is always called on
`doMove` if we find that the item still has the IN_INVENTORY flag. I've
also updated the code comment for it as well, to emphasize that the
measure is a fallback and not an excuse to call forceMove or Move if we
know that the object is held or equipped on a mob.
If something doesn't work, it'll be likely caught by the CI (it's a core
feature of the game after all) or stack traces.
Also, despite equipment slowdown supporting all mob types, when
equipping/unequipping items it's only applied to carbon mobs. This is
not _strictly_ a contributing factor to the titled issue but it still
limits a balance feature that ought to affect all mobs with hands and/or
equipment slots.
## Why It's Good For The Game
Fixing issues with inventory and storages. Hopefully improving and
modernizing years old code a little.
## About The Pull Request
So this one is gonna be a pain for everyone involved, have fun
discussing it maints
Basically 3 years ago https://github.com/tgstation/tgstation/pull/69091
changed the wabbajack robot `pick()` to be a list instead of passing the
5 arguments raw into `pick()`
The same PR also accidentally changed the weights on syndicate borgs to
be 1, from 100 (gotta love default byond syntax)
However that PR also didn't make it actually do `pick_weight()`, so it
was broken and everything was equal for those 3 years
This PR changes the weights of syndi borgs back to what they were
intended to be, fixed the weighted pick and sorted the list from most to
least likelly
(and as a consequence of fixing weights, the netguardian chances went
from 1 in 16 to 1 in 976, who made these weights?)
## Why It's Good For The Game
Makes the code do what coders expect it to do.
## Changelog
🆑
balance: wabbajack robot transformations are now weighted like 3 years
ago
/🆑
## About The Pull Request
Empy lists. There are a lot of 'em.
<img width="981" height="512" alt="image"
src="https://github.com/user-attachments/assets/b94b041a-2904-466b-ab89-54bd1de11b4e"
/>
Going through ways to reduce memory I found a few easy ones here. Wires,
the edible component, the seethrough component. None of these are really
a concern when it comes to needing lists in memory for performance
reasons. Wires aren't going to be cut most of the time for each door. A
lot of food does not have any junkiness. Seethrough component lies
dormant most of the round. Etc.
Making lists lazy in these cases should be a no brainer.
Everything I tested still seems to work exactly the same.
## Why It's Good For The Game
Frees memory that is just taking up space a lot of the time.
## Changelog
Not player-facing, this is all under-the-hood stuff.
## About The Pull Request
Extends the part of the crafting unit test that ensures consistency
between the total mats of the components of a recipe (or rather, the
result of said recipe) and a generic instance of the same type as its
result, previously only implemented on food recipes.
## Why It's Good For The Game
This ensures a degree of consistency with the material composition of
various objects in the game. I couldn't do it in the original PR as that
one was too big already and it took months to get it merged, and have
the relative bugs fixed.
Currently a WIP as I slowly deal with the unit test reports.
## Changelog
🆑
refactor: Follow-up to the crafting/material refactor from months ago.
All objects crafted with stacks now inherit their mat composition (not
necessarily the effects and color) by default, while previously only a
few things like chair, sinks and toilets did. Report any object looking
or behaving weirdly as a result.
fix: The material composition of ammo boxes is no longer a 1/10 of what
it's supposed to be. It was a shitty hack to make it harder to recycle
empty ammo boxes. Instead, they lose materials as they're emptied now.
/🆑
## About The Pull Request
The AI core structure now fully integrates item/tool interactions and no
longer uses attackby/take_damage overrides. Construction behaviour has
been isolated into its own file.
All handling relating to the AI core's status when shunted has been
turned into signals. For this reason, helper procs for managing core
link state have been made and integrated into the relevant users (APC
shunting, mech takeover). The AI core no longer references the remote AI
mob.
/obj/structure/ai_core/deactivated has been removed from code since it
had no function after refactoring. There was only a single instance of
it being used in a map, which has been replaced with a var edit.
There may be more things I changed, but I'm h
## About The Pull Request
Hygiene bots now extinguish mobs when they wash them.
## Why It's Good For The Game
You're being doused with a liquid, how is your cigarette still burning?
## Changelog
🆑
add: Hygiene bots now extinguish when cleaning.
/🆑
Co-authored-by: Jordan Dominion <Cyberboss@users.noreply.github.com>
## About The Pull Request
A new trait, TRAIT_NO_OXYLOSS_PASSOUT, that prevents you from passing
out due to having over 50 oxyloss. Applied by taking nooart and being a
super hulk.
I couldn't replicate it, but if it's still a bug this definitely closes
#92771. Also I didn't remove the line in nooart that constantly removes
the knockedout trait from oxyloss for redundacy reasons. I mean if it's
going to keep removing the knockedout trait from hardcrit every turn
despite having nohardcrit that's probably intentional.
## Why It's Good For The Game
Bugfix I think. Also super hulks are supposed to be immune to everything
stun related and fight on no matter how much damage they've taken, so
yeah.
## Changelog
🆑
fix: Nooartrium patients and super hulks can no longer pass out from
oxygen damage
/🆑
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
## About The Pull Request
If you shove someone into a wall and they're immune to knockdowns, it
won't say that you knocked them down. If you shovestun someone but
they're immune to paralysis, it won't say you kicked them onto their
side.
## Why It's Good For The Game
bugfix
## Changelog
🆑
fix: Getting shoved into a wall while stun immune no longer sends a
message saying you were knocked down
/🆑
---------
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
## About The Pull Request
Passes a standardized define into some of the tgui to parody behavior
with vending machines.
Adds a few defines for money symbols to make it easier to rework types
of money.
If yall are for this I can also go through and find and replace a ton of
strings and other tgui with these, but dont want to sink 2 much time
into it if not.
<img width="966" height="646" alt="image"
src="https://github.com/user-attachments/assets/2d4753be-7e5d-4733-acf8-05f354127a6a"
/>
Proof of concept if Nanotrasen was not an evil conglomerate and the
dollar never went out of style
<img width="1009" height="661" alt="image"
src="https://github.com/user-attachments/assets/e68bfcd3-4053-4641-9b28-f384f2cb049b"
/>
some broken shit here but 99% thats cause minimal runtime station does
not support the supply console
<img width="795" height="767" alt="image"
src="https://github.com/user-attachments/assets/30dbd625-5338-4dc3-80db-922ff045f0f0"
/>
## About The Pull Request
So this nice way of explicitly override an emote type exists, but for
some reason it is not properly used and mostly nonfunctional.
Custom emotes, a perfect use case for these, was just... mutating the
singleton and then resetting it back, instead of actually making use of
args.
Sinful. Just sinful.
<details><summary> It does work, note the type override from the prompt
making its way where needed. </summary>
<img width="209" height="206" alt="dreamseeker_DRS9nFqoQP"
src="https://github.com/user-attachments/assets/35cbac9b-600f-4060-938e-519e110f330d"
/>
<img width="308" height="493" alt="Code_ZQfaj3GGSu"
src="https://github.com/user-attachments/assets/6847e070-d11f-4a32-90fa-edbb5e869e13"
/>
</details>
## Why It's Good For The Game
Fixes a likely oversight/coding skill issue. Improves code modularity.
## Changelog
Nothing anyone would notice, if this is working correctly.
## About The Pull Request
MULEbots and MULEbot beacons are set up so that the bot knows what
direction to push the crate in after delivery, so it can go into the
little delivery area and be seen by people. Unfortunately when it calls
`load.forceMove(loc)` in `unload()` that triggers `Exited()` which has a
condition for if the thing that Exited is `load` which calls `unload(0)`
and fucks it all up, dropping the crate on the tile with the plastic
flaps where nobody can see it. Changes the if branch to null `load`
earlier (we still have a reference as `cached_load`) so `Exited` won't
interfere
## Why It's Good For The Game
MULEbots are already a struggle and it doesn't help that nobody can see
the cargo it delivers cause it's on the wrong tile
## Changelog
🆑
fix: fixed MULEbots unloading deliveries onto the wrong tile
/🆑
## About The Pull Request
Two main things.
Multiple instances of use of a proc in AI controllers seemingly assuming
the default behaviour will work for them, but what ends up happening is
`search_tactic` gets redefined and redefined with no defaut search range
parameter, so nothing ends up passed to the `search_tactic` child procs,
so they all call `oview` with `null` and this... somehow doesn't
runtime? Has behaviour that works some of the time??? I hate this
fucking language. Anyway.
Stoat steal items behaviour was completely broken and apparently was not
tested once since it was merged in. I've made the corrections I can, but
I haven't figured out why stoat AI never enters idle, so we have a
behaviour that leads to the stoat running up to an item, grabbing it,
and then just staying there, unmoving. I've sunk too many hours into
this, I'm just going to call it fixed and let someone else figure out
what exciting additions there need to be to a behaviour that was never
functional in the first place.
## Why It's Good For The Game
i don't know man i just want the pain to stop
okay, generally speaking, when people write AI behaviours, they want
those AI behaviours to do something and not just silently fail for six
months or longer
## Changelog
🆑
fix: Stoats have a chance to try and grab items like they always should
have.
/🆑
## About The Pull Request
It's just a partial cleanup of
anti-[STYLE](https://github.com/tgstation/tgstation/blob/master/.github/guides/STYLE.md)
code from /tg/'s ancient history. I compiled & tested with my helpful
assistant and damage is still working.
<img width="1920" height="1040" alt="image"
src="https://github.com/user-attachments/assets/26dabc17-088f-4008-b299-3ff4c27142c3"
/>
I'll upload the .cs script I used to do it shortly.
## Why It's Good For The Game
Just minor code cleanup.
Script used is located at https://metek.tech/camelTo-Snake.7z
EDIT 11/23/25: Updated the script to use multithreading and sequential
scan so it works a hell of a lot faster
```
/*
//
Copyright 2025 Joshua 'Joan Metekillot' Kidder
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
//
*/
using System.Text.RegularExpressions;
class Program
{
static async Task Main(string[] args)
{
var readFile = new FileStreamOptions
{
Access = FileAccess.Read,
Share = FileShare.ReadWrite,
Options = FileOptions.Asynchronous | FileOptions.SequentialScan
};
FileStreamOptions writeFile = new FileStreamOptions
{
Share = FileShare.ReadWrite,
Access = FileAccess.ReadWrite,
Mode = FileMode.Truncate,
Options = FileOptions.Asynchronous
};
RegexOptions regexOptions = RegexOptions.Multiline | RegexOptions.Compiled;
Dictionary<string, int> changedProcs = new();
string regexPattern = @"(?<=\P{L})([a-z]+)([A-Z]{1,2}[a-z]+)*(Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss)([A-Z]{1,2}[a-z]+)*";
Regex camelCaseProcRegex = new(regexPattern, regexOptions);
string snakeify(Match matchingRegex)
{
var vals =
matchingRegex.Groups.Cast<Group>().SelectMany(_ => _.Captures).Select(_ => _.Value).ToArray();
var newVal = string.Join("_", vals.Skip(1).ToArray()).ToLower();
string logString = $"{vals[0]} => {newVal}";
if (changedProcs.TryGetValue(logString, out int value))
{
changedProcs[logString] = value + 1;
}
else
{
changedProcs.Add(logString, 1);
}
return newVal;
}
var dmFiles = Directory.EnumerateFiles(".", "*.dm", SearchOption.AllDirectories).ToAsyncEnumerable<string>();
// uses default ParallelOptions
// https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions?view=net-10.0#main
await Parallel.ForEachAsync(dmFiles, async (filePath, UnusedCancellationToken) =>
{
var reader = new StreamReader(filePath, readFile);
string oldContent = await reader.ReadToEndAsync();
string newContent = camelCaseProcRegex.Replace(oldContent, new MatchEvaluator((Func<Match, string>)snakeify));
if (oldContent != newContent)
{
var writer = new StreamWriter(filePath, writeFile);
await writer.WriteAsync(newContent);
await writer.DisposeAsync();
}
reader.Dispose();
});
var logToList = changedProcs.Cast<KeyValuePair<string, int>>().ToList();
foreach (var pair in logToList)
{
Console.WriteLine($"{pair.Key}: {pair.Value} locations");
}
}
}
```
## Changelog
🆑 Bisar
code: All (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use
snake_case, in-line with the STYLE guide. Underscores rule!
/🆑
## About The Pull Request
Changes it so health analysers do not care about blood level in species
that have no blood.
## Why It's Good For The Game
I've already had anecdotes of new medical doctors trying to pump
plasmamen full of blood packs saline in an effort to fix the problem, to
no avail, so I figure this would be appreciated by MDs as one less red
herring to ignore.
## Changelog
🆑
fix: Health analysers will no longer erroneously show a blood level for
things that don't have blood.
/🆑
## About The Pull Request
- Gives Janiborgs the Experimental Broom round-start.
- Comments out the wirebrush upgrade. (It's already there round-start
already?)
- Gives Janiborgs Cable, RLD, RTD, and Decal Painter upgrades.
## Why It's Good For The Game
Allows janiborgs to fix lights and maint-mice wires later in the round.
Upgrades them from their shitty-tiles to modern-tiles so they can
actually make the kitchen look classy after someone blows it up. Gives
them the ability to touch up areas with decals as well, because most
engineers are just gonna slap down the pipes/wires and call it a day.
## Proof Of Testing
<img width="461" height="398" alt="image"
src="https://github.com/user-attachments/assets/75ffe907-f4ec-4d81-aefa-f43d458f17a3"
/>
<img width="599" height="160" alt="image"
src="https://github.com/user-attachments/assets/d8307015-6980-4138-8556-bc8a72f1264c"
/>
<img width="563" height="203" alt="image"
src="https://github.com/user-attachments/assets/d5c0b210-3826-4f28-8555-1c19a57a9ee1"
/>
</details>
## Changelog
🆑
add: RLD, RTD, Decal Painter, and Cable upgrades for janiborgs.
del: wirebrush upgrade, because it's already roundstart.
qol: added brooms to janiborgs roundstart
/🆑