5017 Commits

Author SHA1 Message Date
Alexis 88d7efe291 Fleshmind - Attempt 3 (#4914)
## About This Pull Request
Brought back based off of
https://github.com/Bubberstation/Bubberstation/pull/2007, made
functional again by myself.
Original Code: https://github.com/Skyrat-SS13/Skyrat-tg/pull/14023

Fleshmind is a PVE event that incorporates some PVP elements in the
later stages of its growth. You defeat it by destroying all its
processors. It has six stages of growth with each stage expanding on its
abilities and the structures and mobs it can deploy. It will announce to
the entire station each time it gains a level or loses a level. Each
level means it has a new processor.

- **Level 1:** The start when it spawns in. It will spawn some basic
structures.
- **Level 2:** It will begin to spawn screamers and whisperers
- **Level 3:** The wireweed is much more situated, and this is the point
where it spawns a very dangerous mech. This is the point where it
becomes very critical. It also starts to spawn Babblers (structures that
spew propaganda into comms) and Modulators. (Gives you hallucinations)
- **Level 4** No new special abilities.
- **Level 5** No new special abilities
- **Level 6** It automatically calls the emergency shuttle to hijack and
spawns a deathsquad on Centcomm. This ends the round.

**Counters:**
- Fight in groups. Carry a melee weapon. (You can still melee the
mechivers and try to kill them before they convert you)
- Wirecutters cut wireweed.
- Ion Weaponry is extremely useful. It also stuns all the mobs.
- Target the processors. If you can pick them off in space, it has
practically zero EVA abilities.
- If someone gets assimilated, should get them to medical if you kill
them.

To run it requires 35 active players and a minimum of an hour to have
passed.
## Why It's Good For The Game
With mold being disabled, there is a missing PVE element in the game,
this fills that niche while also playing around with the idea of
temporary conversion antags in a way that I think works really well.

Wireweed/fleshmind also distracts the crew and security enough to
provide clever antagonists with an opening to commit crimes and get away
with them while the crew has their hands full.

## Proof of Testing
It's been test merged for two months now, it works.
## Changelog
🆑 xPokee, StrangeWeirdKitten, Gandalf2k15
add: New midround event: Fleshmind
/🆑

---------

Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Artur Lang <24881678+Arturlang@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
2026-02-17 15:38:34 +01:00
Roxy 15332a183e Prevents light step/walk intent/bots from knocking down micros (#5216)
## About The Pull Request
Light step already prevented the damaging squash that happened, but
still did the knockdown. I think it's thematically appropriate for
people who watch their step to not accidentally throw people to the
side. ESPECIALLY BEEPSKY AND MEDIBOTS AND JANIBOTS. THAT IS JUST HORRID.

## Why It's Good For The Game
I take the quirk because of me not wanting to hurt them over by
accidentally walking into them. The knockdown is still annoying as hell
even when I do play my micro and someone walks into me. Everything
functions as normal when not having light step. Bots doing it is extra
un-fun.

## Proof Of Testing
I tested it and it works

<details>
<summary>Screenshots/Videos</summary>

</details>

## Changelog

🆑
balance: Light step now prevents you from knocking down micros.
balance: Walking intent now prevents you from knocking down micros
balance: small bots (janibots, medibots, etc.) can no longer knock down
micros.
/🆑
2026-02-07 20:16:13 +02:00
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
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
nevimer a33fd49968 Upstream 12 15 25 unique reskins fixes (#5019)
This branch needs help, tons of datums to make for the customizable
items.

---------

Co-authored-by: Alexis <catmc8565@gmail.com>
2026-01-10 13:14:26 -05:00
Boviro 70e16d7114 Adds a Quirk: "Loose Limbs" That Causes Your Limbs To Fall Off On Death! (#5030)
## About The Pull Request
Full disclosure: This is a PR commissioned by CodeRedAlert on the
discord for 20 USD.

Adds a quirk which causes your limbs (arms and legs) to fall off on
death. This is a feature from the "Cursed" quirk that the commissioner
wanted to see isolated. We agreed that -2 seems like a fair point value
to give it, but this can be open to change, either making it worth more
or less points if the maintainers agree on it.
Tested locally, as far as I know, there are no bugs with it, and it
should not inherit any other of the Cursed quirk.
## Why It's Good For The Game
Adds extra flavor to players who want characters with weak limbs, such
as a piñata character, or a doll.

## Proof Of Testing
<img width="158" height="161" alt="image"
src="https://github.com/user-attachments/assets/f768ffe5-acd0-4861-99ed-d2dab83173fa"
/>

Those limbs sure do come off! Tested locally in a variety of
circumstances to ensure it functions as expected.

## Changelog
🆑
add: New quirk- Loose Limbs!
/🆑
2025-12-25 00:55:18 +01:00
nevimer 1a21687143 Revert "Refactors unique_reskin, deletes retool kit (#93775)"
This reverts commit 6ebfbccebb.

# Conflicts:
#	code/modules/loadout/loadout_items.dm
#	code/modules/paperwork/clipboard.dm
2025-12-15 18:17:06 -05:00
nevimer 684d4d12e6 Revert "Wardens can alt-click-reskin their gloves to match their formal attire (#94382)"
This reverts commit c423d938d3.
2025-12-15 18:16:03 -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
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
LT3 b4f73194d8 Clausophobia mind check (#94433) 2025-12-13 10:44:01 +01:00
SyncIt21 f640a0e972 Enhances algorithm for finding an atom mount (#94076)
## About The Pull Request
Depends on #94064 for the unit test but offers a better method for
finding an atom to mount on
- Finding a mount now takes into consideration the objects pixel x & y
offsets meaning diagonal mounting is now supported. Gives great
flexibility for mappers
- If you don't want to use pixel offsets but default back to using the
objects direction that behaviour is still preserved. Useful if your
object uses directional icon states(lights & cameras for now) AND don't
use offsets
- If no direction could be specified then as the last resort it defaults
back to the objects local turf for mounting

## Changelog
🆑
fix: all mounted objects on tables, fences, windows & walls should fall
of correctly when the atom it is placed on is destroyed
fix: security telescreen now falls off when their mounted wall is
destroyed
fix: defib wall mount falls off when their mounted wall is destroyed
fix: floor lights are mounted to the ground/catwalk/tram floor they are
sitting on meaning destroying it will destroy the light
fix: wall mounted plaques now fall off when their mounted wall is
destroyed
/🆑
2025-12-12 12:23:22 -05:00
Fghj240 29c00e597f Hearing protection has a tag and is built in to modsuits (#94262)
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2025-12-11 16:43:38 +00:00
MrMelbert c423d938d3 Wardens can alt-click-reskin their gloves to match their formal attire (#94382)
## About The Pull Request

Adds an alt-click skin to the Kaza Ruk gloves which match their formal
attire

<img width="113" height="231" alt="image"
src="https://github.com/user-attachments/assets/5f64d09e-a294-423e-b723-bb094ad49fef"
/>

No new sprites, all it does is apply a color matrix

## Why It's Good For The Game

The only thing that keeps me from taking the formal attire for a spin is
that the gloves don't match.
This is already theoretically possibly by just getting a spray can, but
I figured it could just be an alt-click thing. Seems appropriate.

## Changelog

🆑 Melbert
add: Wardens can alt-click-reskin their Kaza Ruk gloves to match their
formal attire
/🆑
2025-12-09 13:51:07 -07:00
Bloop a9925b2d39 Dev QoL improvements for the materials unit test (#94338)
## About The Pull Request

Just improves the new material unit test, making it more copy-paste
friendly when dealing with large amounts of things to change.

It now also calculates the appropriate sheet material value for you too
so you quite literally just have to copy paste the line and you're done,
no more having to do math yourself.

<img width="2104" height="155" alt="image"
src="https://github.com/user-attachments/assets/b605e423-0418-46b7-b40c-c65fac920af9"
/>


## Why It's Good For The Game

Developer qol.

## Changelog

Nothing player-facing

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-12-09 21:48:31 +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
SyncIt21 a51daf610d Correctly clears hanging_support_atom from atom mounted components (#94295) 2025-12-06 16:13:21 -07:00
SomeRandomOwl eed95f2a22 Fixes an oversight with the forked tongue (#94303)
## About The Pull Request

It was discovered that if a forked tongue is in an inventory slot, be it
your hands or pocket it gave you lizard speech. This is likely an
oversight that was missed for a long while. It seems likely it is
unintended behavior. This PR just adds a check to in the speechmod to
check if the items is a organ or not.
<details>
<summary>Screenshots</summary>

<img width="734" height="757" alt="image"
src="https://github.com/user-attachments/assets/f42d7993-0fad-4716-a18e-2db168253c98"
/>

<img width="470" height="631" alt="image"
src="https://github.com/user-attachments/assets/c0a4fe07-0e09-4aba-94e5-a62d5c1312ab"
/>

</details>

## Why It's Good For The Game

Less bugs and no silly behavior with a tongue not being inside of your
body.
2025-12-04 17:41:24 -06: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
LT3 f24d464abc Updates silent jaws of recovery (#94082) 2025-12-03 11:25:11 +01: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
necromanceranne ac6c47f601 Several file changes just to make high frequency blade null rods block mechs, mech melee blocking finally implemented (#94089)
## About The Pull Request

High frequency blades, both null rod variant and admeme variant, can
block mech melee attacks. For the former, that is the only thing it can
block. Great if you're fighting a lot of mechs as a chaplain I guess.
And you're also really committed to the bit.

Weapons that were vibro subtypes are now claymore subtypes. The only
difference here is that they now have 30% block instead of 35% AP.

Null rod high frequency blades are now two-handed. This mostly
determines force changes (10 unwielded, 18 wielded), and mech attack
block chances.

Mech melee attacks respect block...assuming the blocking source can even
block the attack in the first place. Currently, the few sources that can
block/avoid mech attacks are;
- high frequency blades
- energy katanas
- Those staff nullrods (its a holy force field, iunno)
- wizard modsuit shield (and it will eat literally every single charge
it has to do that)
- Sleeping Carp evasion (and only at half the possible chance)
- CQC defense mode (themed as dodging the attack, and also halved)
- probably something I overlooked when I implemented OVERWHELMING_ATTACK
originally and have overlooked here as well.
 
Just think 'could this help avoid being hit by a road roller being
dropped on you' and go with your gut as to whether or not it is
appropriate if you spot something in the wild that seemingly can block a
mech.

## Why It's Good For The Game

> High Frequency Blade

I wanted to elevate the meme and that is as deep as this goes. Also I
wanted to make this two-handed, much like the true version.
The only thing it is lacking is the cool attack functionality, but I'll
be damned if I can get that to work in a sensible fashion for a crew
weapon...

> Vibro subtype

A lot less of these than I thought. And most of them seemed more
appropriate as claymore types anyway.

> Mech Block

I seeded this previously by making mech clamps respect block. I've now
come back to fully implement it in order to facilitate MGR memes.

For the most part, mechs should still enjoy being largely unblocked by
most sources, even from things like operative suit shields, and
certainly not from actual shields (which I've stripped the ability to
block the attack from entirely) and melee weapons.

The sources that can block them do so poorly. Or, in the case of the
high frequency blade, very well and that's pretty much the only thing it
IS good at blocking.

## Changelog
🆑
balance: High frequency blades (both null rod and admin versions) are
able to block melee attacks from mechs.
balance: High frequency blade null rods are now two-handed weapons.
balance: Mech melee attacks can be blocked or avoided by a few rare
sources.
/🆑
2025-12-02 01:13:58 -05:00
MrMelbert 6ebfbccebb Refactors unique_reskin, deletes retool kit (#93775)
## About The Pull Request

Closes #93635

`unique_reskin` is no longer a list on `/item`, now `/datum/atom_skin`

The actual reskinning behavior has been moved out to
`/datum/component/reskinable_item`

PKC reskinning is now handled via alt-click reskin, rather than via the
retooling kit. The retooling kit has been removed.
There's no limit on how many times you can reskin your PKC (though
perhaps we limit it to one reskin and keep the retooling kit as a way to
allow a miner to reskin it a second time?)

The Ashen Skull unique reskin is still a trophy, and instead unlocks its
unique reskin option in the alt-click radial.

## Why It's Good For The Game

I'm unsure why the retooling kit exists on its own, when it's relatively
cheap and just performs the behavior of alt-click reskinning.

So to keep it consistent with all other forms of reskinning I've just
made it baseline. To accomplish that I refactored reskinning.

The new form of reskinning allows for greater potential in adding
reskins, allowing far more than just an icon state change. Also we can
put it on turfs and mobs and structures now which is cool I guess

There's also the added benefit of being able to see an item's reskins
without needing to instantiate it, which the loadout menu uses to great
effect.

## Changelog

🆑 Melbert
refactor: Refactored item reskinning (the alt-click way), report any
oddities with that
del: Deleted the crusher retool kit, now you can just reskin your
crusher with alt-click. The Skull skin is still locked behind having the
Ashen Skull trophy applied.
fix: Stunswords no longer have an incorrect lore blurb
fix: Fixed loadout item reskinning's UI
/🆑
2025-11-30 19:31:29 -07:00
SyncIt21 39a196824a Enhances algorithm for finding an atom mount (#94076)
## About The Pull Request
Depends on #94064 for the unit test but offers a better method for
finding an atom to mount on
- Finding a mount now takes into consideration the objects pixel x & y
offsets meaning diagonal mounting is now supported. Gives great
flexibility for mappers
- If you don't want to use pixel offsets but default back to using the
objects direction that behaviour is still preserved. Useful if your
object uses directional icon states(lights & cameras for now) AND don't
use offsets
- If no direction could be specified then as the last resort it defaults
back to the objects local turf for mounting

## Changelog
🆑
fix: all mounted objects on tables, fences, windows & walls should fall
of correctly when the atom it is placed on is destroyed
fix: security telescreen now falls off when their mounted wall is
destroyed
fix: defib wall mount falls off when their mounted wall is destroyed
fix: floor lights are mounted to the ground/catwalk/tram floor they are
sitting on meaning destroying it will destroy the light
fix: wall mounted plaques now fall off when their mounted wall is
destroyed
/🆑
2025-12-01 00:50:16 +01:00
John Willard 2ec99420a3 Adds a mapping log to plumbing destroying ducts (#94159)
## About The Pull Request

<img width="1321" height="91" alt="image"
src="https://github.com/user-attachments/assets/a50510da-5489-46d3-a56f-b47128f72431"
/>

This will trigger if you create a plumbing machine on top of a duct, but
we're only caring for roundstart here?
I can't use banned neighbors because I don't want to add a list that
must be constantly maintained for every machine that uses the component.

## Why It's Good For The Game

Prior to this PR, this is the only error you'd get about this occuring
<img width="944" height="60" alt="image"
src="https://github.com/user-attachments/assets/849d86e9-5ea4-4748-aa2a-7cf86386b7f3"
/>

Very undescriptive and I had to go through every single duct on a map to
figure out what was being deleted, turns out it was a single duct being
mapped on top of a toilet.
2025-11-30 13:37:34 -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
Alien 3a54507ee7 Gives the automated IV an output pipe and lets you rotate it (#94058)
## About The Pull Request

Plumbing IV drip now has an input and an output, the input only works
when it's injecting and the output only works when it's draining.
You can rotate with it alt click like all other plumbing things now, IV
drip hotkeys removed

## Why It's Good For The Game

It's an *automated* IV drip, the whole point is you can connect it to
plumbing and having half it's functionality just not work is bad.
As for the rotation it's waaaaaay more useful than the IV hotkeys for
plumbing.

## Changelog
🆑 Cat
qol: The plumbing IV drip can be rotate with alt click now
add: The plumbing IV drip can now output chemicals into plumbing
factories
/🆑

fixes #93586

---------

Co-authored-by: John Doe <markkavalerov87@gmail.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
2025-11-29 20:02:00 +01:00
Y0SH1M4S73R 6979f2b374 Fixes interactions between shuttles and trapdoors (#93970)
## About The Pull Request

This PR makes several changes to trapdoors to remove wrong interactions
that occur should one be built on a shuttle:
- Trapdoors built on a shuttle will be carried along with the shuttle
when it moves. Even when they are open.
- If a shuttle lands on a trapdoor without breaking it, the trapdoor
will not function while the shuttle's floor lies on top of it.
- Shuttles with open trapdoors inside of them will not magically bring
open space into transit.
- A trapdoor moved on top of a non-openspace tile using a shuttle will
open to the turf that was originally under the shuttle.

## Why It's Good For The Game

Fixes #93924, and also adds a new feature to what is possible with
custom shuttles on multi-z maps.

## Changelog

🆑
add: Trapdoors built inside of a shuttle will move along with the
shuttle.
fix: Open trapdoors will not cause shuttles containing them to bring
open space into transit.
/🆑
2025-11-28 16:15:18 +13: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
FalloutFalcon cee8aae62d More /living/ abstract_types (#94092) 2025-11-27 06:24:16 -07:00
Leland Kemble ff20c39815 Stops ghosts from (trying to) admire aquariums (#94116)
## About The Pull Request

Admiring aquariums gives mood events, and nothing is checking for
/living before it gets to giving the mood event. No reason for ghosts to
be able to do this at all, because it does nothing but mood change.

## Why It's Good For The Game

fixes #94098

## Changelog
🆑

fix: Ghosts can no longer try and fail to admire aquariums.

/🆑
2025-11-24 19:10:58 -07:00
FalloutFalcon cd8deef686 Admin Jukebox Moderation and Sound File code improvments (#93610)
## About The Pull Request
The primary feature of this pr is two admin verbs:
Both locked behind `R_SERVER` at present. Also both can be removed from
this pr if we arent interested in giving admins easy control over this.
Changes will not take effect untill the next round unless someone has
yet to touch/spawn a jukebox.
please ignore the "#. " in the titles, thats just how my spotify scraper
formats the titles and I am lazy.
### Jukebox Upload Music
Allows for the upload of any music to the jukebox (currently restricted
to `.ogg` file types for being the better format but I can release that
restriction). Adding Beats is optional but not required as it does not
do a ton tbh.


https://github.com/user-attachments/assets/859cdba8-c1dd-4ce4-bfce-40727a0a30b8

### Jukebox Browse Music
Allows you to delete any of them, this noticeably catches ANY sound
format stored within the list.
Also play and download


https://github.com/user-attachments/assets/cffca3dc-d7f2-4926-bda9-2bf3fef80adb


### Refactors
In order to add both of these verbs seemisly i made a bunch of
improvments,
Sound length for music is now gotten via the rust_g call instead of
being baked into the title, this means you only need two args for
jukebox titles. (This will mess up the bpm of old music tracks
unfortunately.)

Standerized the behavoir for validating the file type of a file, this is
not full proof from what im aware and there is no checks for if the file
ACCTALLY exists.
## Why It's Good For The Game
Atleast on a downstream, R_SERVER is alot more commonly handed out then
direct access to the tgs configs. And TGS kinda blows bubbles for doing
large scale file managment.
## Changelog
🆑
code: generic helpers and defines for validating file extenstion
refactor: the jukebox has had some improvements in how it validates the
sound file. hopefully none of your funny songs disappear.
admin: command_report_menu will let you set ANY sound file type for the
sound it plays.
admin: Admins can now manage jukebox songs in game
server: Jukebox songs length are now set automatically, update your
jukebox configs!
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2025-11-24 13:57:46 -07:00
MrMelbert 4984b25cec Fixes wall mounts prioritizing TABLES (#94064)
## About The Pull Request

It checks its own turf before the turf behind it

## Changelog

🆑 Melbert
fix: Wall mounts no longer stick to tables instead of the wall behind it
/🆑
2025-11-22 17:36:07 +01: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
Ghom 7f2c1af3ae [NO GBP] fixing a few issues with fishing and aquariums (#93964)
## About The Pull Request
Played around with fishing and aquariums the other day. While it has
come a long way, aquariums are still a pain in the ass in many ways and
there are still things that don't work as intended as well as some pet
peeves. This PR:
- removes code that didn't work to begin with (rotating the fish when
mounted on for fish trophy wallmounts)
- fixes the predator and necrophage traits triggering when the fish is
NOT hungry and on fishes that are bigger than the not-so-hungry fish,
rather than smaller.
- Add an examine line to fish tanks when full.
- Fixes evolution probability for self-reproducing fishes (purple
sludgefish should be 1 in 20, not 1 in 40)
- Fixes fish analyzers not being usable on equipped/held items.
- Nit with examine lines for fishing rods.
- Experiments handler devices won't announce when an experiment that
they cannot perform is completed. The big exception is the generic
experi-scanner. This means fish analyzers and operating computers will
no longer bug you about material scan experiments being completed.
- the ping sound from using lures should be a smidge louder and can be
heard from more than 1 tile away.

## Why It's Good For The Game
Issues with fishing and aquariums mainly, also a smidge of a code
improvement for experiment handlers.

## Changelog

🆑
fix: Fixed some fishes trying to eat other (bigger) fish while not
hungry. Also a nit with purple sludgefish being a bit too rare.
fix: Fixes fish analyzers not working with held or equipped fish or
aquariums (not in your backpack).
balance: Fish analyzers and operating computers no longer announce
completed experiments that they aren't compatible with.
balance: the ping sound from using fishing lures should be a smidge
louder and can be heard from more than 1 tile away.
qol: Examining fish tanks (the item) when they're almost full will warn
you about it.
/🆑
2025-11-20 22:36:51 +01:00
SmArtKar 430f4303c8 Echolocation no longer displays pipes and other invisible objects (#94025)
## About The Pull Request

Range does not check for invisibility unlike dview 

## Changelog
🆑
fix: Echolocation no longer displays pipes and other invisible objects
/🆑
2025-11-20 10:35:04 -05:00
SyncIt21 81427cd5cf Unit tests, refactor & realignment for map loaded wall mounts (#93662)
## About The Pull Request
This 1st has to be PR'd so the integration tests can point out all
wallmounts that could not find a support structure to mount on. I then
will do many map edits to align them onto the closest atom

Yes we no longer use wall mount but atom mounted component. All objects
that are mounted on windows/tables & fences now also fall off when
destroyed

It'll probably be a WHILE before I can fix all wall mounts. Long day.
Expect me to misalign many stuff to fix failing CI so make sure to
provide suggestions when possible

Improved wallmount code overall
- Fixes #93793


## Changelog
🆑
fix: fixes all incorrectly maploded wall mounts that aren't actually
hanging on any support structure
fix: objects mounted on tables, windows & fences also fall off now when
destoryed
qol: lights can be mounted on windows
qol: cameras can be mounted on windows
qol: buttons can be mounted on tables
refactor: improved how wall mounts interact with objects as a whole
report bugs on github
/🆑
2025-11-18 22:37:12 -07:00
MrMelbert c3b29b8823 Monkeys will avoid glass tables (#93997)
## About The Pull Request

Ai pathing will avoid turfs that have glass tables on them.

## Why It's Good For The Game

Monkeys loooove glass tables

## Changelog

🆑 Melbert
qol: Monkeys will avoid stepping over glass tables
/🆑
2025-11-18 17:24:53 -07:00
FalloutFalcon c2dfa647a0 kills Debug and Debug2 all hail debugging_enabled (#94002)
## About The Pull Request
renames Debug2 and kills Debug as its last use (atleast the one
described in its comment) was removed
added it to the check to print to print stack traces to chat in the
instance your debugging without a debugger attached for some reason (if
this var is enabled on live it already causes random to_world messages,
kinda fuck it we ball at that point)
## Why It's Good For The Game
The first one was ENTIRELY unused now
this name makes more sense
## Changelog
N/A
2025-11-18 17:24:36 -07:00
Bloop 7d9ef1bccb Fix a flaky ci runtime (#93958)
## About The Pull Request

<img width="2026" height="403" alt="firefox_F5RtIpll8a"
src="https://github.com/user-attachments/assets/75615f48-f6de-4ca5-8eac-8b6812335e42"
/>

Enter signals are always a little iffy when it comes to things being
deleted. Adds a guard against this race condition.

## Why It's Good For The Game

less CI failures

## Changelog

Not player-facing
2025-11-16 10:48:28 -07:00
Sarah C c6dccf266b Fixes circuit airlock shells being unusable (#93929)
## About The Pull Request

The shell component now listens for `COMSIG_ATOM_ITEM_INTERACTION`
instead of `COMSIG_ATOM_ATTACKBY`, allowing it to take precedence over
opening airlocks when trying to insert or modify a circuit. The wires
and maintenance panel can still be interacted with by right-clicking if
a circuit is installed.

## Why It's Good For The Game

Makes a feature actually work for the first time since it was added four
years ago.

## Changelog
🆑
fix: Integrated circuits can now correctly be inserted into
circuit-compatible airlocks.
qol: Airlock maintenance panels can now be opened/closed with right
click as well, to avoid removing an integrated circuit instead.
/🆑
2025-11-15 18:29:50 +01:00
RikuTheKiller c7cb0674cc Preliminary blood refactor (#93854)
## About The Pull Request

Moves all blood handling into procs and adds ways to easily hook into
basically every basic blood behavior.

This PR is not meant to fix every single case of janky blood logic in
the game. The main point and motivation of this PR is to add hooks for
blood behaviors. This allows for way more flexibility with blood code.

I am not going to fix our 3000 instances of single-letter vars, wacky
blood transfers, etc. This is just the groundwork for future PRs to
build off of, and by itself, should do very little to change blood
behavior.

I also added a rigorous set of unit tests for verifying that all of the
basic blood volume procs work correctly.

## Why It's Good For The Game

Previously, blood was handled via directly reading/writing
[var/blood_volume]. This was INCREDIBLY inconsistent and there was no
way to hook into it. This PR makes blood handling way more consistent,
which is great for all sorts of features.
2025-11-13 11:45:36 -06:00
Ghom 8c89b371af [NO GBP] Fixes ear protection equipment doing nothing. Flashbangs don't work well in vacuums (#93866)
## About The Pull Request
Turns out ear protection was subtracting the values rather than adding
them to the protection, and I didn't notice that much until later (now).
Also flashbangs don't have much of a bang (flashbangs without the bang
basically) when there's no air.

## Why It's Good For The Game
Also everyone should know that IRL sounds don't work well in vacuums cuz
there are no molecules to carry sound waves around. Unfortunately we are
not so refined about it in game, which is a fucking shame. This is a
very simplistic implementation than anything. The fact that I'm adding
it to this PR as well is because being in a vacuum gives you plenty of
sound protection now. It's about *some* consistency.

## Changelog

🆑
fix: Fixes ear protection equipment doing nothing. 
balance: Detonating a flashbang in space or any environment with little
to no air no longer stuns anyone NOT on the same tile as the flashbang
with loud bangs. Flashing still works as intended though.
/🆑
2025-11-13 22:22:39 +11:00
tonty 416dea02aa [MDB IGNORE] isolates signpost teleporting into new component /datum/component/houlihan_teleport (#93810)
## About The Pull Request

Isolates signpost teleport code into a component
`/datum/component/houlihan_teleport`, which takes a question argument
and a list of zlevels.
Removes `/obj/structure/no_effect_signpost` and turns existing mapped-in
instances into `/obj/structure/signpost`s
Adds/documents/fixes some attack signals that were added to the element

## Jebediah
<img width="100%" alt="image"
src="https://github.com/user-attachments/assets/b227e5bd-1c93-41b3-b87f-1a559cf81112"
/>


## Changelog

🆑
refactor: Signposts have had their code improved internally. Please make
an issue if a signpost that should teleport you no longer can.
/🆑
2025-11-12 23:09:49 -07:00
Rhials 43785d12dd Blob minion mobs spawned from a non-blob source can no longer traverse blob tiles (#93893)
## About The Pull Request

See title.
## Why It's Good For The Game

Closes #84270. Blob minions can no longer attack blob tiles, but this
takes care of them getting free healing from the blob while fighting its
minions.
## Changelog
🆑 Rhials
fix: Non-blob-spawned blob minion mobs can no longer traverse blob
tiles.
/🆑
2025-11-13 00:59:18 +01:00
Roxy 9240e8846d Fixes for 6b2409065a 2025-11-12 17:01:17 -05:00
Roxy 71faa643bf Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-2025-11-12 2025-11-12 16:44:13 -05:00
Cursor 5bce2d79c5 Hopefully fixes the recurring GAGS annoyance. (#4895)
## About The Pull Request

Stops the annoying gags bug we get once in a while. Non modular, I
woulda submitted it to TG but they don't have any GAGS items that use
transformations so it'd be pointless.

Code entirely stolen from
https://github.com/MrMelbert/MapleStationCode/pull/827 .

## Why It's Good For The Game

Things work good.

## Proof Of Testing

it work

</details>

## Changelog
🆑
add: Added a previously unobtainable Parasol to the Clothesmate.
code: PRs should hopefully stop chinwagging about map icons now.
/🆑
2025-11-11 18:02:44 +02:00
FalloutFalcon b0ddbf2fb1 Refactors sound file checking (#93734) 2025-11-10 08:58:26 -07:00