Commit Graph

18369 Commits

Author SHA1 Message Date
nikothedude 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
NiklasNeighbor 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
Roxy 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
nikothedude 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
SmArtKar 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
san7890 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
FalloutFalcon 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
Geoengi 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
krookodilehunter 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
SmArtKar 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
archbtw 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 Kemble 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
Nick 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
Roxy dfadf725d9 Fix MULEbot speeds being swapped (#94401) 2025-12-10 11:36:46 +01:00
Tim 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
Fghj240 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
Fghj240 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
MrMelbert 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
archbtw 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
Roxy 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-Quill 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
Fghj240 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
Ghom 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-0 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
Bloop 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
Ghom 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
tonty 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
Jordan Dominion 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
Fghj240 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
Fghj240 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
FalloutFalcon 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
Bloop 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
Roxy 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
Cirrial 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 Kidder 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-GG 9de644f2ec New BSOD and Download AI emote (#94163) 2025-11-27 15:44:58 -05:00
FalloutFalcon cee8aae62d More /living/ abstract_types (#94092) 2025-11-27 06:24:16 -07:00
Cirrial 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 Winters 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
Hatterhat 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
san7890 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 Willard 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 Willard 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
Bloop 183c5af2e4 Adds flag for virtual areas, fixes being able to send funds from virtualspace to real accounts (#94071)
## About The Pull Request

Fixes https://github.com/tgstation/tgstation/issues/90641
Fixes https://github.com/tgstation/tgstation/issues/88366

Eliminates worries over virtualspace currency being sent to real
accounts.

When I was looking into why there were no flags for bitrunning areas.
Then I saw this mess:

<img width="929" height="889" alt="Code_2we2QjDyFp"
src="https://github.com/user-attachments/assets/8a807bfe-b566-4057-a8ea-2b306325687d"
/>

Not having enough space / being too lazy to refactor this is a silly
reason to not include flags for something like these virtual areas where
it can be quite helpful. Fortunately I am not too lazy ~~in this
moment~~ so here we go:

It was fairly logical to move over some of these to a separate flag,
which I've called `area_flags_mapping` since they pertain to maploading
things and terrain generation mostly. `area_flags` stays reserved for
general properties and now has more room than it did before for you
people to fill it with.

In doing this it's also neatened up the code quit a bit, as UNIQUE_AREA
was kind of everywhere and now that it's implied by default less areas
need to have it defined (or explicitly un-defined).

<details> <summary> Working as intended </summary>

<img width="787" height="448" alt="dreamseeker_p0Qts36tG1"
src="https://github.com/user-attachments/assets/25056f34-8d43-4be2-a293-e53df7a7d1db"
/>

<img width="383" height="59" alt="dreamseeker_Ek7TXCcpbA"
src="https://github.com/user-attachments/assets/89622974-9467-4cdb-8345-d684f7c9004b"
/>

</details>

## Why It's Good For The Game

Fixes an exploit, improves the area flags situation slightly.

## Changelog

🆑
fix: you can no longer send money from virtualspace to a real account
code: adds a flag for virtual areas so they can easily be checked, as
well as an easy helper proc, 'is_area_virtual(your_area)'
/🆑
2025-11-22 12:24:41 -07:00
FalloutFalcon 2f8e182546 boss music fetching length programitcly (#94054)
## About The Pull Request
Sound len for boss music is fetched with rustg so we dont have to
hardcode length
## Why It's Good For The Game
I love code
2025-11-22 17:33:57 +01:00
necromanceranne d76d2f5438 Laser Gun Update: Deep Lore, Gun Variety, Pew Pew (#93520)
## About The Pull Request

Updates the laser gun into four proper subtypes: Standard, Pistol, Rifle
and Carbine.

<img width="229" height="210" alt="image"
src="https://github.com/user-attachments/assets/12c03076-8ebf-4d87-8c98-6a8cce6821db"
/>

Current sprites are pending a palette change.

**Standard:** Functions as you would expect. Same as ever.

**Pistol**: Lower charge, 20 force, normal sized, recharges faster.

**Carbine**: 15 force, 26 mag, two round burst. Projectiles flight
slightly faster. Cannot dual-wield.

**Rifle**: 20 force. 40 mag. Two round burst. EMP resistant (not
immune). Projectiles fly slightly faster. Cannot dual-wield (not that
you need to).

All but the rifle can be sourced from cargo. You can also buy the sovl
version of the laser gun if you're especially nostalgic.

### Armory Changes

The Armory now can potentially spawn either pistols, carbines or
standard. The weighting leans closer to spawning carbines and standard
as opposed to pistols.

### Lore Dump

The laser line of weapons now all have lore. That rich, deep lore that
every game needs and is totally not important at all to the meat and
potatoes of the game. I'm paid by the hour ($0.00)

### Code Tidying

Lasers are old and a total mess code-wise so we've tidied up while we're
here.

## Why It's Good For The Game

Variety is the spice of life and also some of these weapons could have
used a face lift. Especially the laser carbine. Both functionaltiy wise
and appearance wise.

A bit of randomness in the armory means some rounds might have unique
outcomes compared to others. Sometimes, items in cargo don't see
particularly much use, so peppering in a few random potential deviations
can maybe nudge people to utilize variant gear on future rounds.

I'm obsessed with writing too much information. I blame Hatterhat.

## Changelog
🆑
add: Three variants of the laser gun; Carbine (replacing the existing
one), Pistol and Rifle! Find it (possibly) in your armory today!
balance: The armory laser guns might be different variants of the laser
gun, rather than always being the standard. The standard is the same as
ever, even if it looks different.
add: If you care, the sovl version is available as a goodie. And in the
hands of pirates...
spellcheck: Lore! LORE FOR LASER GUNS! LOOOORE! Examine laser guns
closely and you might learn more about them.
balance: The new set of laser guns come with brand new sprites.
/🆑

---------

Co-authored-by: StaringGasMask <62149527+Exester509@users.noreply.github.com>
2025-11-20 22:21:16 -05:00