Commit Graph
18372 Commits
Author SHA1 Message Date
aKromatopziaandGitHub a544355b7a Cybernetic brain update + Some Vox touchups (#5088)
## About The Pull Request
Cybernetic/Cortical brain touch-up. Discuss.

Also because vox use cortical brains, we touched their code a little.
Tangent: I wish there was a way to make the brain restore surgery
capable of taking a multitool without being a separate op :\

# But why?
It's been noticed that people are using cortical brains to shoot up some
meth without consequences. This was a) not originally intended b)
genuine power creep, as previously the only way to be able to process
chems without the brain damage was to be a vox, who do start with
robotic-only brains. So, this PR is to address it. Sure you get an EMP
weakness, but this server has a soft-stigmatization against using EMPs
so that's leery on the social contract.

Fret not! You'll still have the option of a roundstart brain which
doesn't take meth damage. It just also takes slightly more EMP damage,
has less health than an ordinary brain, and if it ever gets removed, it
explodes as the other prosthetics do (but doesn't qdel). So really,
there's not much of a consequence.

## Proof Of Testing


https://github.com/user-attachments/assets/f48efc8b-9f4b-4fd1-b71f-145a1d4b63c5

<img width="255" height="167" alt="Screenshot_10"
src="https://github.com/user-attachments/assets/0334b931-0593-4721-9de2-a02211253e28"
/>

yeah i flipped it on the below one. it's correct now though
<img width="661" height="171" alt="Screenshot_11"
src="https://github.com/user-attachments/assets/554eaf09-8ee4-4a1a-a95b-c7332a078610"
/>


## Changelog
🆑
add: Previously-unobtainable surplus-cybernetic brain added to
Prosthetic Organ quirk
add: Cybernetic brains given the ORGAN_PROMINENT trait, following normal
brains.
add: Vox Primalis unique cybernetic brain has been finally added to
their species descriptions. (Bet you didn't know they had one)
balance: (Roundstart) Cortical brains given ORGAN_ORGANIC, so they can
be fixed with both mannitol and a multitool. Vox brains are excluded
balance: Brain options in character prefs have been given a 1
quirkiness-point cost.
fix: Cybernetic/Cortical brains have their repair hints updated to
reflect what they can actually be repaired by
code: Prosthetic Organ quirk moved to modular_zubbers
code: 'Vox Primalis' now considered a collective noun
code: dangerous_organ_removal has a new variable to toggle between organ
qdel or having its damage set to max health.
/🆑
2026-03-10 02:11:24 -04:00
RoxyandGitHub e76af744d9 Fixes the weird taur bug that makes clothing be weird sometimes (#5273)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request
Sometimes, taur clothing didn't display the actually work sprite. This
was most prominent with things like gear harnesses and the like. This
should fix it.
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

<!-- Please make sure to actually test your PRs. If you have not tested
your PR mention it. -->

## Why It's Good For The Game
Bug Bad Fix Good
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Proof Of Testing

this is with the gear harness on and it's not displaying what i wore
prior so??? i think it works?? I can't repro it anymore if anything.
<img width="201" height="170" alt="afbeelding"
src="https://github.com/user-attachments/assets/b8b4349e-1fac-4a20-8116-590851823ec9"
/>

<!-- Compile and run your code locally. Make sure it works. This is the
place to show off your changes! We are not responsible for testing your
features. -->
<details>
<summary>Screenshots/Videos</summary>

</details>

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
fix: Taur legs no longer messes with your clothing's rendering.
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->

<!-- By opening a pull request. You have read and understood the
repository rules located on the main README.md on this project. -->
2026-02-22 15:02:21 -05:00
15c707de3b [Bounty] Ports and reworks the Cybernetic limb mounts quirk from Nova (#5136)
## 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>
2026-02-12 11:30:14 -05:00
5786289821 [BOUNTY] Dirty quirk (#5186)
## 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>
2026-02-02 00:51:17 -05:00
NiklasNeighborGitHubtgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>Alexis
2dfa70ea48 Adds a bloodwriting ability to the revenant, that functions like an innate red crayon (#5116)
## 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>
2026-01-21 23:34:28 +02:00
RoxyandGitHub 0d4938228f Fix CI Failures [IDB IGNORE] [MDB IGNORE] (#5126)
## 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
2026-01-15 00:59:34 -05:00
nevimer a9a59ed3f9 Merge remote-tracking branch 'origin/upsteam-12-15-25-revert-unique-reskins'
# Conflicts:
#	_maps/bubber/automapper/templates/centcom/interlink_adminoffice.dmm
#	_maps/map_files/BoxStation/BoxStation.dmm
#	_maps/map_files/generic/CentCom_skyrat_z2.dmm
#	_maps/map_files/moonstation/moonstation.dmm
#	code/modules/holiday/holidays.dm
2026-01-12 22:09:10 -05:00
1b20ac6697 Gives big legs its own bespoke taur mode (#4944)
## About The Pull Request

Title.
## Why It's Good For The Game

They have paw, which is the COMPLETELY wrong bodytype. This triggers all
sorts of bugs.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>

<img width="659" height="173" alt="image"
src="https://github.com/user-attachments/assets/73bb7457-9e4d-4bdd-9270-246fa03207c4"
/>

</details>

## Changelog
🆑
fix: Big leg taurs no longer use taur sprites
/🆑

---------

Co-authored-by: Alexis <catmc8565@gmail.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
2026-01-07 23:24:17 -05:00
nevimer 6e9f2ccfc0 Merge remote-tracking branch 'tgstation/master' into upstream-12-15
# Conflicts:
#	.github/workflows/compile_all_maps.yml
#	.github/workflows/run_integration_tests.yml
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/_onclick/hud/credits.dm
#	code/controllers/subsystem/networks/id_access.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/game/machinery/doors/door.dm
#	code/game/objects/structures/crates_lockers/closets/secure/medical.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/modules/antagonists/malf_ai/malf_ai_modules.dm
#	code/modules/jobs/job_types/_job.dm
#	code/modules/loadout/categories/accessories.dm
#	code/modules/loadout/loadout_helpers.dm
#	code/modules/loadout/loadout_items.dm
#	code/modules/loadout/loadout_preference.dm
#	code/modules/mob/living/silicon/robot/robot_defense.dm
#	code/modules/mod/mod_theme.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/reagents/reagent_containers/cups/drinks.dm
#	code/modules/shuttle/mobile_port/variants/supply.dm
#	code/modules/surgery/organs/internal/eyes/_eyes.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_heretic.png
#	icons/hud/screen_full.dmi
2025-12-15 18:12:29 -05:00
SmArtKarandGitHub 4bf8fac8e3 Fixes illusions not fleeing their targets and runtiming in place (#94476)
## 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
/🆑
2025-12-15 10:11:21 -07:00
san7890andGitHub 0614518371 Fixes Pun Pun qdel on Monkey Day (#94463)
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
2025-12-14 15:55:40 -05:00
shayoki 739a897e5f merging with current 2025-12-14 03:25:39 -06:00
FalloutFalconandGitHub d25c6201f4 Standerdizing currency symbols Part 2 (#94259)
## About The Pull Request
Converts almost all non-constant, non-tgui usages of all variantions of
"credit" and "cr"

Everything seems in order, tested most the currencies.
<img width="905" height="119" alt="image"
src="https://github.com/user-attachments/assets/3fa005a7-a114-426c-9646-b81f68bc2dec"
/>
<img width="255" height="128" alt="image"
src="https://github.com/user-attachments/assets/14c83b54-4fd9-4bee-838f-5b1c03939d9a"
/>


## Why It's Good For The Game
Same justification as https://github.com/tgstation/tgstation/pull/94128
Just easier to mantain/adjust the grammer/names of our money
## Changelog
🆑
spellcheck: minor cleanup on some usecases of "credits"
/🆑
2025-12-13 21:00:19 -05:00
1561203950 Adds Effects to the Death of Customer Robots and Mech Wreckages (#94391)
## 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>
2025-12-12 19:07:45 -07:00
krookodilehunterandGitHub 692e292a5f Enables wirecutters to be recolored before buying (#94425)
## 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
/🆑
2025-12-12 18:46:53 -07:00
SmArtKarandGitHub 606842cee3 Fixes purple raptors' wings action background (#94426)
## 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
/🆑
2025-12-12 18:45:46 -07:00
ffec786117 Fix simplemob missing stamina hud (#94420)
## 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>
2025-12-12 18:44:33 -07:00
Leland KembleandGitHub 7568318a2f Prevents revenant objectives being targeted at jobs that are not there (#94398)
## 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

/🆑
2025-12-10 20:33:23 +00:00
NickandGitHub b6b15f1b91 Makes Mjor The Creative and his underlings are Spaceproof. (#94317)
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
/🆑
2025-12-10 20:27:54 +00:00
RoxyandGitHub dfadf725d9 Fix MULEbot speeds being swapped (#94401) 2025-12-10 11:36:46 +01:00
TimandGitHub 4af95b0f27 Mime Emote DLC - The Sound of Silence (#94149)
## 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".
/🆑
2025-12-09 23:41:41 +01:00
e1f5b9edf5 Covering your face stops people from seeing your expression when you're using sign language (#94374)
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2025-12-09 09:53:34 +01:00
ca2e8dd8b2 You can put defib paddles back into defibs using hotkeys (#94375)
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2025-12-09 09:45:44 +01:00
MrMelbertandGitHub 296f3a7cbd Minor rebalance of blood loss effects / blood regeneration chemicals (#93993)
## 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. 
/🆑
2025-12-07 22:09:44 -05:00
1b00ade33f (2) Reduce repair bot health (#94360)
## 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>
2025-12-07 19:50:49 +00:00
RoxyandGitHub 03da9c4c86 Fix no underwear trait not being checked (#94345)
## 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 #94321
Fixes #93922
Fixes #93702
2025-12-06 16:43:08 -06:00
Shadow-QuillandGitHub c577f8fdac Makes slowclap work for all living mobs (#4983)
## 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.
/🆑
2025-12-04 22:36:58 -08:00
53522a39be You can see if you just locked or unlocked a cyborg (#94305)
## 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>
2025-12-04 21:06:49 -05:00
GhomandGitHub 043677c6f6 Storing objects with slowdown in a backpack or belt (or any such storage) now properly updates your speed (#93967)
## 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.
2025-12-04 17:40:16 -06:00
Gboster-0andGitHub c47400dafb Fixes the robot wabbajack weights being broken for 3 years (#94272)
## 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
/🆑
2025-12-04 17:29:03 -05:00
BloopandGitHub 7754938c72 Makes a bunch of lists lazy (#94239)
## 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.
2025-12-03 13:42:16 -07:00
GhomandGitHub 0b0c5ea91e Unit test material checks are now performed on all crafting recipes by default. All stack recipes now transfer mats to the results (#92620)
## 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.
/🆑
2025-12-02 18:29:01 -05:00
tontyandGitHub 8c45d4466c [MDB IGNORE] Cleans up AI core structure, un-spaghettis some AI code (#93873)
## 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
2025-12-02 12:38:51 -06:00
2da74f95c0 Hygienebot extinguishes you (#94253)
## 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>
2025-12-02 01:00:19 -05:00
37daf7cf6c A new trait that prevents passing out from oxygen damage (#94240)
## 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>
2025-12-01 16:36:20 -07:00
feee8a2fb3 Shoving someone into a wall doesn't say you knocked them down if you didn't (#94241)
## 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>
2025-12-01 18:27:48 -05:00
FalloutFalconandGitHub c04168e81f Standerdizing currency symbols (Part 1?) (#94128)
## 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"
/>
2025-11-30 13:50:20 -06:00
BloopandGitHub a4f053f0d9 Fixes emote singletons being mutated, and actually makes use of the type_override arg (#94178)
## 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.
2025-11-30 13:38:51 -06:00
nevimer baf3837ae8 Merge remote-tracking branch 'tgstation/master' into upstream-2025-11-29
# Conflicts:
#	_maps/RandomRuins/SpaceRuins/derelict_sulaco.dmm
#	_maps/RandomRuins/SpaceRuins/garbagetruck2.dmm
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	_maps/map_files/tramstation/tramstation.dmm
#	code/_onclick/hud/new_player.dm
#	code/datums/components/squashable.dm
#	code/datums/diseases/advance/symptoms/heal.dm
#	code/datums/diseases/chronic_illness.dm
#	code/datums/status_effects/buffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/stamcrit.dm
#	code/game/machinery/computer/crew.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/wall_mounted.dm
#	code/game/turfs/closed/indestructible.dm
#	code/modules/admin/view_variables/filterrific.dm
#	code/modules/antagonists/heretic/influences.dm
#	code/modules/cargo/orderconsole.dm
#	code/modules/client/preferences.dm
#	code/modules/events/space_vines/vine_mutations.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/carbon/human/death.dm
#	code/modules/mob/living/carbon/human/species_types/jellypeople.dm
#	code/modules/mob/living/damage_procs.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mob_spawn/mob_spawn.dm
#	code/modules/projectiles/ammunition/energy/laser.dm
#	code/modules/projectiles/guns/ballistic/launchers.dm
#	code/modules/projectiles/guns/energy/laser.dm
#	code/modules/reagents/chemistry/machinery/chem_dispenser.dm
#	code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/medicine_reagents.dm
#	code/modules/surgery/healing.dm
#	code/modules/unit_tests/designs.dm
#	icons/mob/inhands/items_lefthand.dmi
#	icons/mob/inhands/items_righthand.dmi
#	tgui/packages/tgui/interfaces/ChemDispenser.tsx
2025-11-29 22:49:21 -05:00
RoxyandGitHub ddca22ae60 Fix MULEbots not unloading cargo in the right direction (#94127)
## 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
/🆑
2025-11-29 13:57:49 -08:00
CirrialandGitHub 31d4eb04f1 Fix Stoat Steal Behaviour (and some other AI stuff hopefully) (#94153)
## 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.
/🆑
2025-11-28 13:35:53 +02:00
Joshua KidderandGitHub 7a3ad79506 All camelCase (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use snake_case. UNDERSCORES RULE! (#94111)
## 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!
/🆑
2025-11-27 15:50:23 -05:00
Co0kie-GGandGitHub 9de644f2ec New BSOD and Download AI emote (#94163) 2025-11-27 15:44:58 -05:00
FalloutFalconandGitHub cee8aae62d More /living/ abstract_types (#94092) 2025-11-27 06:24:16 -07:00
CirrialandGitHub 43703b447c Fix Health Analyzers Freaking Out About Skeletons Not Having Blood (#94154)
## 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.
/🆑
2025-11-26 17:24:29 -07:00
Sir WintersandGitHub b0ca137649 Janiborg Modifications (#4912)
## 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
/🆑
2025-11-26 04:35:05 +01:00
88b51910ab blood-drunk miner's corpse fades away again (#94028)
## About The Pull Request

exactly what it says on the tin (moves the blood-drunk miner's
death-fade effect to `drop_loot()` instead of `death()`)

## Why It's Good For The Game

restoring lost functionality (watching the blood-drunk miner fade away)

## Changelog

🆑
fix: The blood-drunk miner's corpse now properly appears and fades away
again.
/🆑

---------

Co-authored-by: Hatterhat <Hatterhat@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2025-11-26 13:39:23 +11:00
san7890andGitHub 8400284868 Illusion Basic Mob Refactor (#93860)
## About The Pull Request

Another relatively simple simple_mob to basic mob refactor. I wish more
people were doing these since I was saving these for people to get their
feet wet, but I think it's better to pivot away from that and just have
only the gargantuan ones outstanding (since those ones are pretty much
their own framework).

I also delayed this one because we didn't actually have the AI framework
available 1-2 years ago for this to be seamless and easy, but now we
have easy fleeing functionality so that's an easy plug and play.

This rework contains the following:

* General code readability changes and standardization (i.e. removing
single letter vars, `SECONDS` defines)
* Moves more stuff to subtypes instead of having it be on parent
* Removes the necessity for define "attack modes", that's on subtypes
now
* Fixed instances where args weren't defined. I think cult apparitions
via the mirror shield have been much weaker than what they were
originally intended to, so I changed it to what I thought was correct. I
can change the health to be down but it really doesn't make sense as a
lot of the args were not standardized (ideally we would have more
subtypes). I can change this back to the original arg order, let me
know.
* Clones now replicate on damage taken as well as when they attack. I
wanted to tweak this around more but this was originally added since I
confused myself, but it gave a more realistic mitotic effect I liked
more for the replicating clones.
## Why It's Good For The Game

If we want more flamboyant mirage escapes or sneaky clone AI behavior,
it is now far easier to implement. It's very simplistic at the moment
but is pretty much fully featured and representative of the simple mob
version of illusions. They were already laden to the item/mob that was
spawning them in anyways, so this is really the most simple stuff we got
going on.

I tested this with the mirage grenade, reactive stealth armor, and the
mirror shield. I have no clue how the heretic stuff works but it appears
to be a really simple framework plug-and-play so no real worries there I
think.
## Changelog
🆑
refactor: The Cult of Nar'Sie realized that they were installing the
mirrors on their mirror shields the wrong way around, thus altering the
makeup of their mirror clones health, damage, and re-replicability.
refactor: In response to the recent updates in clone magic, Nanotrasen's
Stealth Reactive Armor should now generate more convincing clones.
/🆑
2025-11-26 13:02:00 +11:00
John WillardandGitHub ca092ce7d8 Headslugs are now small (#94088)
## About The Pull Request

Headslugs now go under mobs and tables, and mobs walk through them. They
were also made small sized, so they can now enter da vim.

I assume this is fix because they are clearly small mobs, but I can see
how this might be balance if a maint wants to switch tags.

## Why It's Good For The Game

Like alien larva these are small mobs and I think they should reflect
this in not treating them like a full dense mob. Also da vim.

## Changelog

🆑
fix: Headslugs are now small.
/🆑
2025-11-24 19:13:57 -07:00
John WillardandGitHub 7b7340f9ff The horrific necktie can now be sentient (#94026)
## About The Pull Request

The horrific necktie can now be used in-hand to give it sentience, if
someone chooses to become it they will inhabit the tie, being able to
only speak with the person that gave them sentience and other people
inhabiting the tie, and can't use radios.

It can also be forcefully entered into from the ghost spawners menu as
long as someone's wearing the tie (or if there's already a tie in it,
that it's being worn by the same person that created the original host).

The tie can theoretically have infinite ghosts inhabiting it, you can
'ghost' verb out of it at any time to leave.

<img width="695" height="171" alt="image"
src="https://github.com/user-attachments/assets/512645aa-610e-488a-b0a2-dca74a91d7e6"
/>

Much of the player-facing texts are taken from
https://github.com/TheSwain/Fulpstation/pull/306 - The parts that were
left out in the port, https://github.com/tgstation/tgstation/pull/62113

Can rename itself at will, but the name of the item itself will never
change, so it is limited to being in the head of the person wearing it.

<img width="295" height="60" alt="image"
src="https://github.com/user-attachments/assets/c67445d4-daa2-4edc-a065-04be11617548"
/>

## Why It's Good For The Game

A harmless reference and improves Detective gameplay by allowing a
backseater able to commentate on the person's gameplay, guide, or
encourage different behaviors. Hearing people bicker in your head is
also really funny which I have seen to some limited degree with split
personalities.

## Changelog

🆑
add: The horrific necktie can now become sentient.
/🆑
2025-11-22 23:32:00 -07:00