5964 Commits
Author SHA1 Message Date
RoxyandThe Sharkening 26d7f00a76 Roxy Comments 2026-04-11 08:57:59 -06:00
nevimer 00ccf0c6b5 Merge remote-tracking branch 'tgstation/master' into upstream-feb12-2026
# Conflicts:
#	.github/CODEOWNERS
#	.github/workflows/compile_changelogs.yml
#	.github/workflows/stale.yml
#	SQL/database_changelog.md
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/__DEFINES/atom_hud.dm
#	code/__DEFINES/inventory.dm
#	code/__DEFINES/mobs.dm
#	code/__DEFINES/species_clothing_paths.dm
#	code/__DEFINES/subsystems.dm
#	code/__DEFINES/surgery.dm
#	code/__HELPERS/global_lists.dm
#	code/_globalvars/lists/maintenance_loot.dm
#	code/_globalvars/traits/_traits.dm
#	code/controllers/subsystem/minor_mapping.dm
#	code/controllers/subsystem/processing/quirks.dm
#	code/controllers/subsystem/shuttle.dm
#	code/datums/components/palette.dm
#	code/datums/components/surgery_initiator.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/hud.dm
#	code/datums/mood.dm
#	code/datums/mutations/chameleon.dm
#	code/datums/quirks/negative_quirks/nyctophobia.dm
#	code/datums/status_effects/debuffs/debuffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/slime/slime_leech.dm
#	code/datums/weather/weather.dm
#	code/game/data_huds.dm
#	code/game/objects/items.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/frog_statue.dm
#	code/game/objects/items/rcd/RLD.dm
#	code/game/objects/items/robot/items/hypo.dm
#	code/game/objects/items/stacks/medical.dm
#	code/game/objects/items/stacks/wrap.dm
#	code/game/objects/items/storage/garment.dm
#	code/game/objects/items/tools/medical/defib.dm
#	code/game/objects/items/weaponry.dm
#	code/game/objects/items/weaponry/melee/misc.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/game/objects/structures/curtains.dm
#	code/game/objects/structures/dresser.dm
#	code/game/objects/structures/girders.dm
#	code/game/objects/structures/maintenance.dm
#	code/game/objects/structures/mirror.dm
#	code/modules/admin/greyscale_modify_menu.dm
#	code/modules/admin/verbs/light_debug.dm
#	code/modules/antagonists/ashwalker/ashwalker.dm
#	code/modules/antagonists/heretic/knowledge/starting_lore.dm
#	code/modules/antagonists/ninja/ninjaDrainAct.dm
#	code/modules/art/paintings.dm
#	code/modules/client/preferences.dm
#	code/modules/client/verbs/ooc.dm
#	code/modules/clothing/head/wig.dm
#	code/modules/events/disease_outbreak.dm
#	code/modules/holodeck/holo_effect.dm
#	code/modules/jobs/job_types/head_of_security.dm
#	code/modules/jobs/job_types/security_officer.dm
#	code/modules/library/skill_learning/generic_skillchips/point.dm
#	code/modules/mining/lavaland/ash_flora.dm
#	code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/basic/guardian/guardian.dm
#	code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
#	code/modules/mob/living/carbon/carbon.dm
#	code/modules/mob/living/carbon/human/human.dm
#	code/modules/mob/living/carbon/human/human_defines.dm
#	code/modules/mob/living/carbon/life.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob/living/living_defines.dm
#	code/modules/mob/mob.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mod/mod_control.dm
#	code/modules/mod/modules/modules_general.dm
#	code/modules/modular_computers/computers/item/computer_ui.dm
#	code/modules/paperwork/paper.dm
#	code/modules/paperwork/paperbin.dm
#	code/modules/power/lighting/light.dm
#	code/modules/projectiles/guns/energy/kinetic_accelerator.dm
#	code/modules/projectiles/projectile.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/food_reagents.dm
#	code/modules/reagents/chemistry/reagents/other_reagents.dm
#	code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
#	code/modules/research/xenobiology/crossbreeding/_clothing.dm
#	code/modules/research/xenobiology/crossbreeding/prismatic.dm
#	code/modules/surgery/advanced/brainwashing.dm
#	code/modules/surgery/advanced/lobotomy.dm
#	code/modules/surgery/amputation.dm
#	code/modules/surgery/blood_filter.dm
#	code/modules/surgery/bodyparts/_bodyparts.dm
#	code/modules/surgery/brain_surgery.dm
#	code/modules/surgery/cavity_implant.dm
#	code/modules/surgery/coronary_bypass.dm
#	code/modules/surgery/gastrectomy.dm
#	code/modules/surgery/healing.dm
#	code/modules/surgery/limb_augmentation.dm
#	code/modules/surgery/organ_manipulation.dm
#	code/modules/surgery/revival.dm
#	code/modules/surgery/sleeper_protocol.dm
#	code/modules/surgery/surgery_helpers.dm
#	code/modules/surgery/surgery_step.dm
#	code/modules/unit_tests/_unit_tests.dm
#	code/modules/unit_tests/designs.dm
#	code/modules/unit_tests/icon_state_worn.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png
#	icons/map_icons/clothing/head/_head.dmi
#	icons/map_icons/clothing/shoes.dmi
#	icons/map_icons/items/_item.dmi
#	icons/mob/huds/hud.dmi
#	icons/mob/inhands/64x64_lefthand.dmi
#	icons/mob/inhands/64x64_righthand.dmi
#	icons/obj/machines/computer.dmi
#	tgui/packages/tgui/interfaces/OperatingComputer.jsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
#	tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
#	tools/icon_cutter/check.py
2026-02-12 23:50:09 -05:00
e032193c21 Fix HTML special characters in recorded chem dispenser recipes (#95108)
## About The Pull Request

Fix this <img width="687" height="486" alt="image"
src="https://github.com/user-attachments/assets/cf1ba1a6-e3fa-4a5a-810a-66e5a1e75237"
/>

## Why It's Good For The Game

Text encoding bug bad. Less bad = good.

## Changelog

🆑
fix: Fixed encoding of special characters in chem dispenser recorded
recipe names.
/🆑

Co-authored-by: Jordan Dominion <Cyberboss@users.noreply.github.com>
2026-02-08 08:16:12 +01:00
MrMelbertandGitHub e4f533111f Deafness is now solely tracked by trait (#95029)
## About The Pull Request

Deletes `can_hear`, replaces it with trait-checking deafness.

The only two non-trait sources of deafness (hardcrit and lacking ears)
were refactored into using the trait.

## Why It's Good For The Game

Many places inconsistently check for the deaf trait rather than use
can_hear which meant behavior was not consistent.
Some code would treat "do we lack ears?" as being deaf, some would not. 

This unifies all the behavior so being deaf means you're deaf
everywhere.

It also means we can now easily react to gaining and losing deafness via
signal, where before we could not react to it without hooking the trait,
organ remove, AND stat change. Which no one did, of course, because who
would ever think to do that?

## Changelog

🆑 Melbert
refactor: Refactored how deafness is tracked. Please report any weird
interactions with sounds, like messages or sfx being missing.
fix: Lacking ears and being in hard crit now consistently treats you as
"being deaf". This affects a few minor interactions like empath, the
jukebox, and sleeping.
/🆑
2026-02-05 20:19:56 -05:00
SmArtKarandGitHub f58b8511f0 Refactors effect_system (#94999)
## About The Pull Request

This PR refactors ``effect_system``s to be a bit easier to use by
getting rid of ``set_up``, allowing ``attach()`` to be chained into
``start()`` and refactoring most direct system usages in our code to use
helper procs.

``set_up`` was unnecessary and only existed to allow ``New``'s behavior
to be fully overriden, which is not required if we split
sparks/lightning/steam into a new ``/datum/effect_system/basic`` subtype
which houses the effect spreading behavior. This allows us to roll all
logic from ``set_up`` into ``New`` and cut down on code complexity.
Chaining setup as ``system.attach(src).start()`` also helps a bit in
case no helper method exists

I've added ``do_chem_smoke`` and ``do_foam`` helpers, which respectively
allow chemical smoke or foam to be spawned easily without having to
manually create effect datums and reagent holders.

Also turns out we've had some nonfunctional effect systems which either
never set themselves up, or never started, so I fixed those while I was
at it (mostly by moving them to aforementioned helper procs)

## Why It's Good For The Game

Cleaner code, makes it significantly easier for users to work with. Also
most of our effect system usage was copypasta which was passing booleans
as numbers, while perfectly fine helper procs existed in our code.

## Changelog
🆑
refactor: Refactored sparks, foam, smoke, and other miscellaneous effect
systems.
refactor: Vapes now have consistent rigging with cigs using the new
system.
fix: Fixed some effects never working.
/🆑
2026-02-03 22:23:09 -05:00
JusticeandGitHub f4faf53519 Adds lemon juice box :D (#95060)
## About The Pull Request
Adds lemon juice box to the game
## Why It's Good For The Game
Lemon juice box joins the orange juice box and lime juice box gang
<img width="320" height="320" alt="lemonboxdisplay"
src="https://github.com/user-attachments/assets/daae0355-10c5-43bf-ae3c-08855d80e0f1"
/>
## Changelog
🆑
add: Added lemon juice box
/🆑
2026-02-01 18:55:33 -05:00
SmArtKarandGitHub 8e63bdd337 Moves disfiguration to be handled by the head instead of the mob itself (#94948)
## About The Pull Request
TRAIT_DISFIGURED and physical disfiguration are now handled by the head
bodypart rather than being on the mob itself. This is mostly for
internal purposes, but it does mean that:
- Players can now perform plastic surgery on torn off heads.
- Disfigured mobs' heads keep their face hidden, and when attached to a
different body won't magically get repaired and vice versa, attaching a
new head to a disfigured corpse no longer disfigures it.
- Robotic (and other non-huskable) heads no longer become disfigured
from husking
- Also in the rare case of grafting a head torn off from a husk onto
another body, they no longer permanently turn into an Unknown. (lol)

## Why It's Good For The Game

Saner code, we generally want limb-specific behaviors to be on limbs
themselves and not on the mob. Also yeah that one weird edge case.
~~Husks are next on the chopping block~~

## Changelog
🆑
qol: Plastic surgery can now be done on detached heads.
refactor: Refactored how disfiguration is handled to be stored on head's
side
fix: Robotic (and other non-huskable) heads no longer become disfigured
from husking
fix: Attaching a head from a husk to a different body no longer
permanently turns them into an Unknown.
/🆑
2026-01-28 20:25:25 +00:00
SmArtKarandGitHub 6c87e32461 Gets rid of remaining rogue REMs in reagent metabolism code (#94946)
## About The Pull Request

#94621 missed a few REMs in life code, and a few outside which just...
made zero sense outright. This cleans it up and makes sure everything is
up to modern code.

## Changelog
🆑
fix: Fixed some reagents still using old (and now, incorrect) math for
their metabolization values
/🆑
2026-01-27 19:08:22 -05:00
MrMelbertandGitHub 75cf80baed Epinephrine and Inexorable interacts better, also gives NOCRITDAMAGE to Atropine (#94851) 2026-01-27 21:23:46 +01:00
SmArtKarandGitHub dbadf01a35 Readds sovlful IEDs and adds assembly beakerbombs (#94965)
## About The Pull Request

This PR sort-of brings back old IEDs, albeit much more freeform compared
to their previous iteration. Using #94861's ``spark_act`` interactions
they can now be made by filling up a soda can with a variety of
chemicals (welding fuel being the easiest to obtain), dunking in a piece
of wire, taping it up (optional, required if using welding fuel or
plasma) and lighting it on fire with a lighter or welding tool (anything
that's hot enough works, really)
They have a random delay of 2-4 seconds, and can be disarmed by snipping
the fuse with wirecutters in time before they detonate (or don't,
depending on the mixture)

There's also a new, more "professional" improvised chemical explosive in
the form of beakerbombs. These can be assembled by putting a lid on a
beaker (alt-click, prevents the beaker from spilling its contents when
thrown) and attaching an assembly with an igniter or a condenser to it.

<img width="150" height="90" alt="dreamseeker_2OKpZeN7ay"
src="https://github.com/user-attachments/assets/599e75ea-9653-4db9-a915-b2ca6307635f"
/>

When triggered, igniters will heat the reagents up by a bit while
condensers will cool them down. However, you can also attach and wire up
a power cell, which will cause it to dump all of its power into the
beaker when the igniter fires off, triggering ``spark_act`` interactions
potentially causing a larger explosion.

<img width="534" height="447" alt="dreamseeker_k9Uzf18Eoa"
src="https://github.com/user-attachments/assets/4cfed5b4-3875-4522-9bfa-5f6a3c8e0864"
/>

Decently sized boom from The Contraption.

Plasma and welding fuel's potency inside of beakerbombs/soda cans is
significantly reduced compared to other riggable objects (strengthdiv is
3 times higher) as they're very easy to obtain and would make for very
powerful explosives, considering their very strong strengthdiv as most
rigging interactions use very little fuel/plasma to cause a large
explosion, which was carried over to the new system. (Don't worry, this
still leaves them at sensible values with welding fuel being about as
strong as old IEDs on average)

Closes #94990 via having plasma's electrical power modifier have a
decline past a certain point based on its volume

## Why It's Good For The Game

#81529 didn't justify IED removal whatsoever and I think with new
mechanics these can be used as easier (but weaker) to make improvised
bombs, being much less clunky to make and use than pipebombs.
Beakerbombs are essentially a somewhat weaker (even with metamat
beakers, you're still 20u short of a normal large beaker grenade at
200u) form of grenades, but have access to new interactions involving
charged up explosions, which could make for some variety among chemists'
weaponry.

## Changelog
🆑
add: Added back IEDs made by attaching some wire and tape to a soda can
filled with fuel, plasma, or any other explosive of your choice. They
need to be lit on fire with a lighter or a welding tool.
add: You can now attach a lid to beakers with alt-click, preventing them
from being spilled when thrown.
add: Added beakerbombs, made by attaching an assembly (with optional
power cell and wiring) to a lidded beaker.
balance: Rigged explosions now create flames.
balance: Plasma explosions now limit their explosion potency past a
certain point based on their volume
/🆑
2026-01-28 09:11:50 +13:00
EEASASandGitHub 76813c0f8e Mustard (#94974)
## About The Pull Request
Mustard
<img width="230" height="219" alt="image"
src="https://github.com/user-attachments/assets/a433587a-fe8e-4f4e-ae2c-20b15e000152"
/>
<img width="123" height="115" alt="Captura de tela 2026-01-23 122145"
src="https://github.com/user-attachments/assets/fe0de423-2a8e-48cd-abe2-67eed4c9d394"
/>
I don't know how to sprite this is just a resprite of the other
condiment bottles so it may look off and also i can't actually sprite a
mustard plant or anything
Also makes it so chefs can get mustard bottles in the mail
Mustard

Adds ketchup and mustard to the chef ordering console
fuck ketchup
## Why It's Good For The Game
It's been 10 years without mustard please give me mustard
More variety of condiments. more flavor

I think it's an oversight that the mayo bottle is in the chef ordering
console but not ketchup. come on man
## Changelog
🆑
add: Mustard. find it in the produce ordering computer or receive it in
the mail
fix: Adds ketchup to the produce ordering computer
/🆑
2026-01-24 17:57:45 -05:00
MrMelbertandGitHub 74983781a7 Buffs mutagen hydroponics application, adds some plant traits to interact with it (#94783)
## About The Pull Request

Unstable Mutagen

1. Now consistently adds 0.1 instability per unit per tick (the same as
L4Z)
2. No longer applies toxin damage directly
3. RNG roll now scales strength based on volume - 10u of mutagen = 1x
effect modifier.
4. RNG instability roll now grants 2(*modifier) instability (down from
5)
5. RNG instability roll now also adds 1.5(*modifier) toxins 
6. RNG instability roll now applies even if the tray is set to auto-grow
7. RNG health penalty now deals 5(*modifier) damage (down from 10)


Uranium

1. Now consistently adds 0.05 instability per unit per tick (half as
powerful as L4Z)
2. Now adds `0.5 * volume * toxpower` toxins, rather than `volume /
toxpower`
3. No longer damages plant health directly
4. Has the same changes as Unstable Mutagen wrt RNG rolls

New genes

- Adds `Toxin Resistance`, which grants the plant immunity to health
damage from high toxins in the tray.
   - Available in Death Berries, for which it is now their graft gene.
- Adds `Toxin Adaptation`, which not only grants the plant immunity to
health damage
- Not available naturally (yet?), must be mutated (or found in strange
seeds)

Other

Cleaned up a smidge of botany code while working in the area

## Why It's Good For The Game

Unstable Mutagen is... ok. 
It's perfectly usable, but it requires a lot of work for something that
you don't have easy access to.
Best case it's only slightly (1.25x) better than L4Z alone. Gurus will
make a mixture of L4Z, mutagen, and cryoxadone or multiver for maximum
mutation speed, which is cool, but a little cheesy.

As a consequence, Mutagen is USUALLY only used 1. as a noob trap and 2.
to get Kudzu or spiders

This makes me sad considering how it used to have legendary status for
botany. So I kinda wanted to bring it back.

The flat scaling makes it worst case AS GOOD AS L4Z. You are rewarded
for getting something besides vendor chems.
The RNG roll changes give it a bit of a boost, so it becomes "L4Z+ but
with a minor downside". It also removes the cheese aspect, which I admit
is kinda sad.

Green = Mutagen
Purple = l4z 
p = probability of RNG instability 
v = volume
y = instability
x = ticks

<img width="1505" height="721" alt="image"
src="https://github.com/user-attachments/assets/ea67d198-ea4f-44a7-9798-7d1bf0f3ef8b"
/>

20u mutagen = 17 ticks for 100 instability + 25 toxins
20u l4z = 25ticks for 100 instability + 0 toxins

Speed scales faster (1.25x faster at 10u, 1.5x faster at 20u, 1.75x
faster at 30u) - but so does toxin accumulation

TL;DR more mutagen = more mutation = more toxin

Now you're wondering "Okay where does the gene changes come into play" 
Well I'm a big fan of fertilizers that require you use *botany*
knowledge, not chem knowledge, *botany* knowledge to maximize their
potential. For example, using Weed Adaptation for consequence-free
Liquid Earthquake.

I wanted do to that here, so I added these two genes that allow you to
get no penalties for tray toxins, allowing "unchecked" use of mutagen
(and such) for a clever botanist.

## Changelog

🆑 Melbert
balance: Rebalanced Unstable Mutagen's / Uranium's botany use. It now
always increases instability (on par with L4Z), and occasionally
increases instability even more at the costs of some toxins. It also
scales with volume
add: Adds "Toxin Resistance" gene to botany which makes the plant immune
to toxin damage. Given (and graftable from) Death Berries.
add: Adds "Toxin Adaptation" gene to botany which makes the plant heal
from toxin damage. Only in strange seeds (for now).
code: Cleaned up a smidge of botany code 
/🆑
2026-01-22 17:09:15 +13:00
VigilDLXandGitHub 9cf3fe9478 Fixes Medipen Refiller with Volume Changes (#94890)
## About The Pull Request

So, the Medipen Refiller machine takes the volume of the Medipen and
refills it based on the volume, but a lot of Hyposprays just don't have
a volume, so, when they get refilled by the Medipen Refiller, so it
reverts back to the parent of the Hypospray [which is 15], often
resulting in an extra 5 medicine being refilled. Whilst it's a small
bug, it's still a bug and an easy fix for my first PR.
## Why It's Good For The Game

Fixing bug is good for game
## Changelog
🆑
fix: Fixed Medipen Refiller taking more than it refilled
/🆑
2026-01-21 18:57:29 -05:00
SmArtKarandGitHub c74f104c89 Rewrites plasma rigging code to be much more flexible and dynamic, and cover more cases (#94861)
## About The Pull Request
Instead of being snowflake interactions on objects themselves, rigging
things with plasma or welding fuel is now handled on reagents' side via
``on_spark_act``, allowing each reagent to decide how they want to
handle exposure to electric currents or violent heating.
- Obviously plasma and welding fuel cause explosions, but former gains
additional power from electric current being passed through it (same
math as powercells), while latter doesn't explode unless in an enclosed
space, or a high enough current/temperature has been reached, and merely
creates a hotspot instead.
- Napalm and phlogiston create hotspots, or (try to) damage the holder
if they're enclosed
- Sorium, liquid dark matter, TATP, nitroglycerin and flash/smoke/sonic
powders trigger their usual detonation effects, albeit slightly weaker.
- Teslium creates a ZAP, with additional power for a BIG ZAP if it has
been triggered by electric current.
- RDX becomes spicier with temperature and current, similarly to how it
becomes more dangerous when mixed with LE or teslium.
- Gunpowder produces a delayed explosion effect (unless its hot or the
current is high enough, in which case its instant) and causes sparks as
the message claims it does (normal gunpowder explosions also do that)

Plasma and gunpowder rigged items can now be controlled using
stabilizing agent - in its presence, plasma will not explode unless the
used charge is higher than 0.2% of a standard cell's per unit of agent,
while gunpowder will instead spend 0.1 + (charge / 10% of a standard
cell's charge) units of agent to delay its detonation.

Smoke (powder) now produces a visible message and slightly damages lungs
of whoever it reacted inside of, if the container was a mob.
The numbers on plasma/welding fuel rigs should be ***roughly*** the
same. Also lighters can now be rigged in a fashion similar to welding
tools.

Also it turns out we broke light rigging at some point, so now it works
again.

## Why It's Good For The Game

This makes the system much more flexible and allows players to make more
creative IEDs, expanding upon the sandbox aspect of the game. Also I
have an upcoming project bringing IEDs (kind of, in a new form) back,
which is why I wrote this in the first place (but decided to atomize the
PRs).
As for smoke damage, it feels weird to not have any tells when someone
suddenly starts hacking up volumetric amounts of smoke, it makes sense
that they'd struggle a bit after coughing a few dozen cubic meters of
thick vape clouds.

## Changelog
🆑
add: Multiple new reagents such as napalm, sorium, TATP,
smoke/sonic/flash powders and other explosives can now be used to rig
cells or tools.
add: Plasma and gunpowder rigged items can now have controlled current
requirement/delay by adding some stabilizing agent alongside the main
reagent.
balance: Creating chemical smoke inside of a mob now makes them
violently cough it up, damaging their lungs a bit.
fix: Chemically-rigged lightbulbs now once again explode.
refactor: Refactored how power cells, welding tools, lightbulbs,
cigarettes (and now, lighters) handle being rigged with chemicals.
/🆑
2026-01-21 19:21:06 +00:00
5ed2539038 Advanced disease cures are symptom based (#94352)
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2026-01-20 09:52:46 +01:00
BloopandGitHub 68153c2333 Refactors faction lists to use getters and setters and be cached (#94490) 2026-01-19 04:12:35 +01:00
JacquerelandGitHub faf2000100 Rust doesn't apply effects to people who aren't touching it (#94733)
## About The Pull Request

Heretic rusted tiles do not apply any effects to things which are
jaunting or inside vents.
They also don't apply any _negative_ effects to things that are flying
(but they do apply positive ones, just because flight is a cool thing to
have earned and it would be sad to lose your bonuses because you have
wings).

I also renamed the element so that it isn't named after the rust passive
(in fact, the rust heretics with that passive don't use the element) and
simply describes what it does, and removed a subtype in favour of just
passing in some arguments.

I also added a trait which bypasses the negative effects of standing in
rust, in case an admin creates a non-heretic creature and gives it rust
healing. They shouldn't have _both_ healing _and_ gain disgust and minor
damage from starting in rust (possibly the heretical harvester was being
effected by this?)

Finally I adjusted the `rust_heretic_act` and `rust_turf` procs to
remove a footgun I saw a developer fall into recently where they didn't
realise that the generically named "rust turf" proc actually assumes a
wizard did it, now if we add anything else that wants to non-magically
rust a turf then it will work the way you expect.
As a side effect this changes the two item sources of rust that heretics
get to actually use rust resistance rather than rusting every turf, I
set them to effect all inorganic turfs as a default.
And finally I noticed that rust heretic ascension was passing
"RUST_RESISTANCE_ABSOLUTE" as a value into its proc which reads `Should
not be rustable. EVER.` in its comment, which smelled like a bug. So I
changed it to just "things which should be rustable ever".

## Why It's Good For The Game

It is the logical way you would expect these things to work;
Heretics crawling in vents or (for instance) using space crawl should
not be healed for touching rust that they aren't touching, as they are
not readily accessible to other players. The idea of the rust healing is
that it's a tradeoff for exposing yourself in a visible "territory", so
you shouldn't be able to avoid it by being in that territory but
untouchable and invisible.
Similarly, players who have gained the ability to fly would not expect
to get sick from flying over rusty flooring. They're out of range.

## Changelog

🆑
balance: Eldritch rusted tiles don't apply their effects to anyone who
is jaunted or in vents, and don't apply negative effects to people who
are flying.
balance: Heretic items which apply rust (grenades and eldritch reagent)
check the rust resistance level of the turf rather than always rusting
it.
fix: Rust Heretics ascending don't rust unrustable turfs, like space
tiles.
/🆑
2026-01-15 12:43:39 +00:00
RikuTheKillerandGitHub c7e4e90004 Adds a new antag, the Blood Worm (#93787)
## LTS Document

Check this document before making any significant future changes to
blood worms, please.

https://hackmd.io/@RikuTheKiller/H1AHQSKNZx

## About The Pull Request

THIS PR SHOULD ABSOLUTELY BE TM'D FIRST

Blood worms are a new progression antag. When the event runs, 2
candidates are picked from ghosts and spawned in as blood worm
hatchlings, which then have to grow up, do a couple objectives and take
over the station.

Hatchlings are weak outside of a host, while juveniles can stand their
own reasonably well. Adults have high offensive power and can only be
dealt with using the right gear or a lot of luck and robustness. They're
meant to be a moment of glory for achieving maximum progression and they
can bootstrap the next hatchlings by gathering corpses before cocooning.

Each growth stage requires 30 seconds in a cocoon, which can only be
created after consuming a lot of blood. There's a falloff curve on a
per-blood-type basis, meaning you can't drain the same person over and
over again to reach adulthood. The medbay freezer is a priority target
for the blood worms and can get one of them to the juvenile stage if
fully ransacked.

It takes 500 blood to mature from hatchling to juvenile, and 1500 blood
to mature from juvenile to adult. You can only get up to 1000 blood from
synthetic sources like monkeys, and consuming synthetic blood is 30%
less efficient. Blood worms can also examine living targets to see how
much blood a target has, and how much growth the blood worm would gain
for consuming that blood.

Blood worms spawn in vents and have night vision for maneuvering in
maintenance. Hatchlings can ventcrawl, while juveniles can move around
by breaking things. Optionally, you can take over a host with a lot of
access like the Captain to go basically anywhere, especially if nobody
knows you killed the captain.

Behind the scenes, host-taking kicks the host's original mind to a
backseat mob. This needs the most testing in practice, but it's
confirmed that it returns the host's mind back to their body, at least
in testing.

All mob, ability and action sprites are made by INFRARED_BARON. Legal
rights were transferred to me after I paid for the commission.

Note, I've been working on this massive PR for quite a while, so
documenting every small change is really hard! Apologies for anything
I've missed. There's a lot.

Final note, admins can spawn these by either:
A. Trigger the midround event via the dynamic-panel verb, under the
Rulesets tab.
B. Giving someone the Blood Worm antag datum via the Traitor Panel in
the Player Panel for the target player. This will transform their mob
into a valid Blood Worm, with all of the associated objectives and such.

### Active Abilities
1. Leech Blood (No Host) - Lets the blood worm drain blood from living
targets and reagent containers. Uses an aggressive grab to restrain
living targets until leeching is over, which takes around a second to
initiate. Causes oxyloss during the leeching. NPC monkeys can't escape
from this and it floors targets as well.
2. Spit Blood (Both) - Multi-function ability, lets the blood worm fire
ranged corrosive blood spit at targets, melt restraints on their hosts
by right-clicking, and as an adult, shoot a burst of blood spit at a
target by right-clicking. Note of the right-click abilities, shooting
bursts can't be done while in a host. (to avoid unfair stealth kills)
Shooting a burst has a much longer cooldown than shooting normally. All
spit types cost blood to use.
3. Invade Corpse (No Host) - Lets the blood worm take a host for
themselves, consuming all of the host's blood and in essence, "becoming"
the host. Any bloodloss inflicted on the host is taken as damage to the
blood worm, and the blood worm retains its weakness to fire even in this
state. Burn damage itself no longer has any extra damage, though.
4. Leave Host (Host) - Title, literally just leaves the host after a
delay. Notably works even while the host is moving, dead, incapacitated
or otherwise fucked up in any way, shape or form.
5. Inject Blood (Host) - Lets the blood worm heal its host. The potency
of this increases as the worm grows up, but so does the cooldown and
blood consumption. This works on organ damage, injuries, etc.
6. Mature (No Host) - Makes the blood worm enter a cocoon for 30
seconds, emerging as the next growth stage. Requires an increasing
amount of consumed blood / growth as the blood worm uses it.
7. Reproduce (No Host, Adult Only) - Makes the blood worm enter a cocoon
for 30 seconds, with 4 hatchlings emerging out of it, including the
original blood worm, now reverted back into a hatchling as well.
8. Revive Host (Host) - If the host is in a viable state to be revived,
revives them after an animation sequence plays out.

### Passive Abilities
1. Space Immunity - Blood worms are immune to the cold, low pressures
and a lack of oxygen. Only the immunity to a lack of oxygen carries on
to hosts from this.
2. Organ Insertion - Blood worms can insert organs into their hosts by
right-clicking on them with the organ in-hand. This mainly exists to
deal with hosts that lack organs, and avoids the gotcha where an adult
blood worm ends up gutting their host by hitting them too hard, as they
can simply fix it on the spot.
3. Life Support - Blood worm hosts don't need a heart, lungs or a liver
to survive. Lungs are useful for speaking, and a liver is necessary to
process reagents.
4. Regeneration - Blood worms slowly heal over time. This is nowhere
near enough to overcome bleeding or heat damage, since it's 0.3 hp/s for
a hatchling, 0.4 hp/s for a juvenile and 0.5 hp/s for an adult.
5. Night Vision - Blood worms can see in the dark. This doesn't extend
to hosts.
6. Ventcrawling - Hatchling blood worms can ventcrawl.
7. Doorcrawling - Hatchling and juvenile blood worms can slide under
doors. Doing so takes 3 seconds for a hatchling and 5 seconds for a
juvenile.
8. HUD - Blood worms can tell how much blood targets have at a glance,
via a blood HUD bar exclusive to them. They can also tell apart other
blood worm hosts from normal people via an antag HUD. There's also an
examine message they can use on living targets for even more info.

### Weaknesses
1. Heat and Fire - Blood worms quickly die to heat, their bodies are
flammable and their blood will burn up if their host's core temperature
is too high. The main counter to this is getting a host with
flame-resistant gear.
2. Bleeding - While in a host, bleeding wounds will directly damage the
blood worm itself. How much a host needs to bleed before the worm dies
depends on their growth stage. Blood worm hosts keep bleeding even while
dead, so just keep hitting them and they'll die. Blood worms
automatically leave their hosts when they hit 10% health or lower, and
their hosts bleed 50% faster than normal people.
3. Stuns - Blood worms have no way of dealing with a stunned host other
than getting out. They can deal with any restraints by melting them,
though.
4. Testing - Security can order a blood worm testing crate from cargo,
either for a 20 minute cooldown via the security cargo interface
console, or for 10000 credits via the supply console. It contains 4
single-use testers that hurt a bit when applied, but are instant to use
and 100% accurate. The stopgap is that they're really fucking expensive
and only work once per item.

### Screenshot
<img width="280" height="132" alt="image"
src="https://github.com/user-attachments/assets/00d22361-997e-4347-a0bf-aa240de40727"
/>

## Why It's Good For The Game

Antagonist variety, mainly. This is basically Cortical Borers 2:
Electric Boogaloo.

Currently, we lack any antagonists with mind control abilities. That
really sucks!

I've also gotten a lot of positive feedback about the antagonist while
working on it.

This antagonist also has great potential for roleplay, as they can take
over hosts, surprise attack people by getting out of a dead corpse, talk
to each other using Wormspeak, etc.

I think we're also itching for variety on "pest" antagonists. Right now
we just have spiders and xenos. Everybody knows these two, so why not
mix it up a bit?

And as for balance? Blood worms are relatively easy to dispatch when you
know their weaknesses, which are extremely clear. Bleeding for hosts,
fire for either one, lasers for the worms themselves. As long as you get
the host in crit and keep hitting, you've pretty much won, and they
can't keep spamming Inject Blood forever since they'll quickly run out
of blood to use.
## Changelog
🆑
add: Added a new heavy roundstart/midround antagonist, the Blood Worm.
Credit to INFRARED_BARON for the sprites!
fix: Removing traits based on a source no longer causes issues with
trait signals.
fix: High-priority effects no longer double-trigger due to subsystem
issues.
fix: Weighted averaging in reagent merging code has been band-aid fixed.
It's not the best, but it works.
/🆑
2026-01-14 23:30:35 -06: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
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
MrMelbertandGitHub 45b23412f8 [MDB Ignore] Medical larp: Adds the SDSM-35 (an in game brain trauma reference) (#94761)
## About The Pull Request

Medbay, the CMO, the Psychologist, (possibly) the Library, and some
maint rooms across all maps now have multiple copies of the SDSM-35

This exists as an in game ability to reference what brain traumas do. No
special bells or whistles, not even a search bar - it's a book after
all.

<img width="819" height="589" alt="image"
src="https://github.com/user-attachments/assets/ace867b9-a0f0-4302-99f9-46ed4d6fe377"
/>

<img width="802" height="546" alt="image"
src="https://github.com/user-attachments/assets/c96941d3-8da8-48f7-859b-93953fe01473"
/>

## Why It's Good For The Game

De-wikification: Rather than needing to pull up the wiki to figure out
what the brain trauma is doing, you can refer to the in game book and
cross reference the patient's behavior.

Medial larp: It's a reference to the DSM-5. If that wasn't obvious. 

## Changelog

🆑 Melbert
add: You can now find the SDMS-35 in Medbay, the CMO's office, the
Psychologist's office, and possibly the Library. Quite simply, it's a
reference book for all the brain trauma's you may experience.
/🆑
2026-01-08 19:47:04 -07:00
SyncIt21andGitHub 2618cffef3 Replaces micro dosing with volumetric dosing (#94621)
## About The Pull Request
To understand the PR we should first define what is micro dosing &
volumetric dosing

- **Micro dosing:** The reagent effects are **independent** of the
volume of reagent metabolized and are constant every tick, so the effect
you get from metabolizing 0.01u of a reagent is the same as metabolizing
1u of a reagent
- **Volumetric dosing:** The reagent effects are **dependent** on the
volume of reagent metabolized per tick, so the effect you get from
metabolizing 0.01u is much lower compared to metabolizing 1u of a
reagent which is much higher

This PR replaces **micro dosing** with **volumetric dosing** so if you
increase metabolization rates and absorb more reagents you get higher
effects from that reagent & vice versa for lower metabolization rates.

With that lets ask the core questions

**How does this affect present reagent values?**

_This PR scales all reagent effects such that even if it has a lower
metabolization rate the value is the same as before but will still scale
with reagent volumes & mob metabolization levels_

Under normal circumstances most reagents metabolize at 0.4u of reagent
per tick so as long as this value isn't changed by cybernetic body parts
or other reagents you will get the same values as before and won't
notice anything different in normal gameplay.

However, if you do get enhanced body parts like a cybernetic
liver/stomach or use reagents with metabolization rates different from
0.4u you will now get more/less affects depending on how much reagent is
consumed. Here is an example

Consider Syriniver this is how the formulae look like.

```dm
adjust_tox_loss(-1 * metabolization_ratio * seconds_per_tick, updating_health = FALSE, required_biotype = affected_biotype)
``` 

as long as 0.4u of it is metabolized every tick you get 2 tox loss
healing which is the same as before. However, this time if you
metabolize 0.01u of the reagent you get only 0.1 tox loss healing. If
you metabolize 1u reagent per tick, then you get 5 tox loss healing

**What about cigarettes?**
Unaffected. The amount of reagents injected into a mob per tick **does
not** affect the rate at which it is metabolized. Even if you have like
10u of cigarette reagents within you, if you are metabolizing just 0.4u
of it every tick then nothing changes

## Why It's Good For The Game
- Volumetric dosing is realistic. If you metabolize more reagent you
should be getting more benefits and lesser volumes should yield lesser
affects
- Microdosing is an exploit that should have been patched a long of time
ago because it encourages people to put in minimal effort to produce
just 0.01u of reagent to get maximum affects. This coupled with slower
metabolization rates leads to unbalanced higher reagent effects for
longer periods of time.
- This PR address the core issue in #93991 which is heal all patches.
Plumbing was gutted in an unnatural way by making the plumbing iv
drip/output gate/pill press behave essentially as mini reaction chambers
by filtering just 5 reagents. With this heal all patches are nerfed
based on the number & now volume of reagents you can put in a patch, so
its concern is addressed. If this does get merged, we can hopefully
revert it and make plumbing great and behave like large factories again
<img width="914" height="230" alt="Screenshot (532)"
src="https://github.com/user-attachments/assets/96467fad-b32f-409a-a1e8-2a92b8ff6565"
/>


## Changelog
🆑
fix: probability reagent affects scale correctly
balance: reagent affects now scale with the volume of reagent
metabolized meaning lower metabolization rates (from like cybernetic
organs) yield lower effects & higher rates yield higher effects
/🆑
2026-01-07 00:14:54 -05:00
83cd43da91 Extends atom_reskin to be more modular/adds support for greyscale reskins in the loadout menu (#94466)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2026-01-05 09:02:23 +00:00
Tad HardestyandGitHub 4d7b9be4a2 Fix a variety of grammar errors (#94707)
* Fix uncapitalized sentences, lack of "the", and singular/plural mixup
when inserting items into lathes
* Conform some job descriptions to the pattern used by the majority:
bitrunner, chemist, coroner, janitor, RD, shaft miner
* Remove extra colon from "Open Special Role Information" action buttons
* Uncapitalize "no alerts" / "systems nominal" messages in atmos and
station alert consoles
* Fix incorrect feedback when wrenching down a freezer/heater with its
panel open
* Fix "Thank you for restocking the station!" appearing in the wrong
place in the cargo export summary
* Fix "pizza boxs" on cargo manifests
* Fix mid-sentence capital "The" when:
  * Examining walls with mounted items
  * Inserting parts into machine frames
* Fix "Pete's the udder"
* Fix double-"the" and stringified datum typepath when scooping reagents
* Fix missing spaces in door remote descriptions
* Fix uncapitalized "Nanotrasen" in emergency respone drone ghost role
poll
* Fix double-space in canister opening admin log
* Fix missing "the" when casting bear-form spell
* Fix "auxiliry" in NebulaStation airlocks
* Add `check_grep.sh` rules against "maintainance", "maintainence", and
"maintenence"
* Fix "maintainance" in NebulaStation airlocks, TCG cards, and in
examines of netpod, byteforge, quantum server
* Fix "maintainence" in examines of autolathe, flatpacker, cryo cell,
ore silo, floodlight, power storage unit, turbine, chromatography
machine, ChemMaster, all-in-one grinder, smoke machine, R&D machines,
vending machines
  * Fix "maintenence" in Sulaco ruin terminal
* Add missing periods to:
  * "That's X." examine block header
  * steal objective explanation text
  * atmospheric shield generator examine
  * autolathe examine
  * telescreen examine
  * accidentally stepping on a mousetrap
  * netpod examine
  * byteforge examine
  * hat/mask visor toggling
  * bizza box stack examine
  * ChemMaster 3000 examine
  * floodlight examine
  * power storage unit examine
  * ChemMaster interact messages
  * disposal bin animal eject message
  * techfab examine
  * vending machine examine
  * flatpacker examine
* Fix name capitalization/propriety of:
  * big manipulator
  * DeForest first aid station
  * Christmas tree
  * Thunderdome plaque
  * commission plaque
  * chalkboard coffee menu
  * experimental destructive scanner
  * scanner array
  * prison cube
  * RaptorDex
  * atmospheric shield generator
  * high-performance liquid chromatography machine
  * all-in-one grinder
  * keycard authentication device
* Fix plurality of:
  * fake stairs
  * HUDs
  * restaurant and bar seating
* Fix misc grammar/typos in:
  * recharging station description
  * worm description
  * surgery tray description
  * access failure message of restaurant portal
  * mysterious pillar description
  * Pennywise painting description
  * floodlight examine
  * power storage unit examine
  * flatpacker examine
* Remove extra newline from "Debug Z-Levels" verb
2026-01-03 21:34:59 -07:00
MrMelbertandGitHub 75f7d66157 Alt Eigenstasium change pr (#94682)
## About The Pull Request

Alt to #94421

1. Eigen teleporting now has a precision of 3, rather than 0
2. If you fail to teleport back due to stabilizing agent, your
eigenstate remains there for up to 5 minutes, reduced based on how much
eigenstate you were exposed to

## Why It's Good For The Game

1. This seeks to tackle the "teleport onto a recycler, gg, no re"
problem of eigenstasium without tackling the "escape" use or the
"teleport into a saw room" use. Rather than being able to teleport
someone to the exact place with 100% pinpoint accuracy, you're now
teleported into an area around the place.

2. This seeks to tackle the "0.1u teleport + 4.9u stabilizing without a
trace, gg, no re" problem of eigenstasium. The echo it leaves behind
will stay longer the less reagent you use, but the more reagent you use
- the longer the echo stays in the first place.

## Changelog

🆑 Melbert
balance: Eigenstasium teleportation now has a precision of 3, up from 0
- meaning the teleport now picks a random tile up to 3 tiles away from
the creation spot
balance: If Eigenstasium return teleportation fails - due to
stabillizing agent - it leaves an echo behind. The echo lasts for 5
minutes, but is reduced the longer the Eigenstasium metabolized in your
body.
/🆑
2026-01-04 08:47:48 +13:00
MrMelbertandGitHub 8259c2fc1e Eigenstasium can no longer create Eigenlockers, but adds rare maint Eigenlockers as a replacement (#94683)
## About The Pull Request

1. Eigenstasium can no longer be splashed onto lockers to link them
2. Maintenance lockers can rarely be linked to another locker on the
station - any locker, including head of staff lockers. This has a 0.1%
chance, which amounts to a ~5% chance to spawn on a map with 50 lockers.
3. Teleporting via an eigenlocker no longer opens up the opposite side,
allowing you to jumpscare people

## Why It's Good For The Game

1a. Eigenstasium's lockers are both significantly easier to produce and
significantly easier to use than our "intended" method of spot-to-spot
teleportation, the Quantum Pad.

There is an argument to be made in that the Quantum Pad needs to be
brought up to this level, and I may do that, because honestly, it's a
valid point. But in the meanwhile, it doesn't really make sense that
Chemistry can make better teleportation... than the teleportation
department.

1b. Eigenstasium wears too many hats. It really is a wonder chem. It
intrudes on other mechanics of other jobs and frankly doesn't need the
extra sauce, it's already interesting enough.

If your wikibox has a *collapsible*, it might be doing too much.... 

<img width="1567" height="397" alt="image"
src="https://github.com/user-attachments/assets/969b6d32-5e85-42a1-8d3b-7769b6968b95"
/>

2. However, teleporting lockers are funny. We have the station trait,
but it announces itself and affects (potentially) every closet, which
ruins some of the mystique. So I wanted to add that effect as something
you can stumble upon in the wild accidentally - Imagine hopping into a
locker in maint to dodge sec and you end up in the Captain's office.

3. Builds off of 2. Finding a locker that teleports you into the middle
of security so you can jump out and surprise them the next time they
show up sounds really funny.

## Changelog

🆑 Melbert
del: Eigenstasium can no longer create Eigenlockers
add: Rarely, maintenance lockers will spawn as Eigenlockers, potentially
linked to any other locker on the station - yes, even the Captain's.
add: Teleporting via an Eigenlocker doesn't auto-open the destination
locker, allowing you to hide in them.
/🆑
2026-01-04 08:47:34 +13:00
3c5749f862 General maintenance for plumbing (#94427)
## About The Pull Request
The overall behaviour of everything should stay the same but the memory
& speed of these components has been slightly improved and when you
scale that across large plumbing factories you get a substantial
improvement. Here's a list of the most noticeable changes along with
many others that aren't worth mentioning

- Removed vars `use_overlays`, `turn_connects`,
`recipient_reagents_holder`
- `active` var is now replaced with a proc which simply returns is the
machine wrenched or not
- `turn_connects` has been removed because all machines have their pipes
rotate when the machine is rotated. This also removed all the static
icon states ending with `-s` from the `dmi` file thus reducing that file
size as well
- `extend_pipe_to_edge` var is directly integrated into `cut_overlays()`
because it's use cases were limited such for showers & sinks
- Simplified `Initialize()` a lot. Removed params `start`,
`turn_connects`, `custom_receiver`, `extend_pipe_to_edge`. We now only
pass `bolt_layer` making that proc faster & less convoluted
- Replaced `set_recipient_reagents_holder()` proc with
`recipient_reagents_holder()` which returns the reagent holder for
holding reagents instead of storing it in the component. This removes
the need to hook a qdel signal on the holder & we don't need to keep
track of it
- Merged a ton of procs to reduce overhead & reduce file size
- Plumbing ducts creating the network at mapload is faster without using
recursion and the timer subsystem
- Deconstructing plumbing ducts is faster in reconstructing the network
without using recursion and the timer subsystem

This makes managing plumbing code less convoluted & overall better for
the foreseeable future. See the lines of code removed vs added and still
preserves behaviour

## Changelog
🆑
qol: added examines & screentips for ducts & stack of ducts
qol: you can wrench a stack of ducts on the ground to create a pipe
refactor: plumbing code has been improved overall. Report bugs on github
sprite: removed unused static(does not rotate with machine) icon states
for plumbing connections
/🆑

---------

Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
2025-12-31 13:03:42 +01:00
ElGitificadorandGitHub 5e8884af77 Fixes typo in syndol desc (#94647)
## About The Pull Request
fixes
https://github.com/tgstation/tgstation/issues/94437#issue-3721943429

## Why It's Good For The Game

typo bad me fix

## Changelog

🆑
spellcheck: fixed typo in syndol description.

/🆑
2025-12-30 22:00:46 +01:00
SmArtKarandGitHub 225cf0d400 Changes Coveroli in Albuterol's recipe to standard Convermol (#94578)
## About The Pull Request

Replaces Coveroli (Convermol's inverse) in Albuterol's recipe, and the
reversal recipe, to its base form.
Closes #94574

## Why It's Good For The Game

Despite it not being a bug, LT3 brought up a good point in #94574 about
the requirements being overly harsh. It doesn't make much sense for a
somewhat mediocre drug whose only purpose outside of niche interactions
with nitrium and alike is to cure asthma to require inverse chemicals.
We already have a design document to retire fermichem as-is, and forcing
obscure mechanics onto players as a requirement for rather basic
medicines is not a good idea, especially considering none of our in-game
guides (nor the wiki) explain inverse recipes either.

## Changelog
🆑
balance: Changed Coveroli in Albuterol's recipe to standard Convermol
/🆑
2025-12-30 14:30:51 +01:00
BloopandGitHub cf14dcfc1a Converts 3 components into elements (#94589)
## About The Pull Request

`adjust_fishing_difficulty` is a good one to make into a bespoke element
since a number of the same clothing item are created in the wardrobe
system.

climb_walkable is also good due to how prevalent it is, and it is a bit
of a two for one since it also removes the need for the
`/component/connect_loc_behalf`

Also stops adding the on_climbable trait to literally everything in the
turf, it now only applies it to atoms with density. So no more pipes and
stuff getting trait lists created for no reason.

<details><summary> Tested + things still work as before </summary>

<img width="422" height="122" alt="image"
src="https://github.com/user-attachments/assets/b23696f5-cd16-4150-aeb3-14ea6bd256fc"
/>

</details>

## Why It's Good For The Game

Lessens overhead, fixes a bug as well.

## Changelog

🆑
fix: fixes a pushed crate not removing on_climbable trait properly off
the mob standing atop it
/🆑
2025-12-30 01:05:50 +01:00
53ed83bb9d Makes some more lists lazy (#94388)
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2025-12-28 19:57:42 +01:00
SyncIt21andGitHub 7c5ef1cfb8 Removes unused parameter times_fired from mob procs (#94590)
## About The Pull Request
What it says on the tin. `times_fired` is the most unused parameter in
all mob procs. I say most because there were just 2 cases where it was
used
- handling breathing
- handling heartbeat

Besides these 2 cases this parameter did nothing in every proc. Removing
it does 2 things
- Makes those procs more readable as it now has 1 less parameter that
was documented poorly and did nothing
- Makes those procs slightly faster as we are passing 1 less variable to
its parameter call stack

It can easily be substituted with `SSmobs.times_fired` which was its
original value anyways

## Changelog
🆑
code: removes an unused parameter `times_fired` from mob life procs.
Making them function slightly faster
/🆑
2025-12-26 09:51:33 -05:00
SyncIt21andGitHub 468b351b86 Axes grind & juice vars into procs (#94592)
## About The Pull Request
Inspired by #94233. `grind_results`(list) & `juice_typepath`(typepath)
are only used when grinding & juicing after which the atom is deleted.
This means if that object is not processed these vars occupy memory &
don't do anything.

Now these values are only generated on demand by calling their
respective procs. Considering how these vars are on the obj level the
memory savings are quite significant

## Changelog
🆑
refactor: grinding & juicing have been refactored to occupy low memory.
Report bugs on github
code: improved grinding & juicing code
/🆑
2025-12-25 20:40:35 +01:00
BloopandGitHub 0190e64654 Converts simple rotation into a bespoke element (#94582)
## About The Pull Request

<img width="579" height="67" alt="image"
src="https://github.com/user-attachments/assets/d7a4427e-2a6e-44d3-94ba-c90a2d474984"
/>

Simple rotation components number in the 8-9k range per round, and each
contains a needless callback datum as well.

These do not need to hold any state and can be bespoke elements, and the
proc to do things post_rotation can just be a normal atom proc.

<details><summary>Still works as you'd expect, including items that have
flag requirements like the wrench</summary>


![dreamseeker_UhvaohsIYK](https://github.com/user-attachments/assets/a4bd6b3f-d502-4a11-852f-0b96472d688d)


![dreamseeker_fEwUfNQben](https://github.com/user-attachments/assets/62dca771-4622-4cb2-9105-7f3a7c73e15a)

</details>

## Why It's Good For The Game

Makes a heavily used element much more lightweight, saves a few mb of
memory.

## Changelog

🆑
refactor: simple rotation component has been refactored into an element
Please report any bugs to github.
/🆑
2025-12-25 10:32:41 +01:00
5ea9817729 Obsolete pepperspray code (#94548)
## About The Pull Request

Just removes a piece of obsolete pepperspray code that never worked
It's supposed to prevent clicking on your sprite with pepperspray

The code doesn't work, and I don't think it makes sense to keep/fix it,
see WIGFTG

If a maintainer thinks it should be fixed, I'll reopen the other PR
(https://github.com/tgstation/tgstation/pull/94393)

## Why It's Good For The Game

We can already baton ourselves, or spray ourselves with all other spray
bottles (besides pepperspray, if this code worked)
It's an inconsistency with how other spray bottles work
Spraying/batoning yourself is sometimes stupid and funny

## Changelog

Not player facing, code never worked

Co-authored-by: glue0000 <230859540+glue0000@users.noreply.github.com>
2025-12-25 01:22:43 +01:00
LT3andGitHub b629046cd5 Fixes cake dough recipe on sugar sack (#94577)
## About The Pull Request

Fixes the cake dough recipe printed on the sugar sack, egg white is also
required. Also clarifies the amount of soy milk required, if used.

## Why It's Good For The Game

Less sad chef trying to bake a cake

## Changelog

🆑 LT3
fix: Sugar sack now has the correct recipe for cake batter
/🆑
2025-12-25 00:15:18 +01:00
SmArtKarandGitHub 5b02ec7255 Fixes runtimes from running mixing on an empty reagent grinder (#94479)
## About The Pull Request

``convert_reagent`` shouldn't be called when there are no reagents to
convert

## Changelog
🆑
fix: Fixed runtimes from running mixing on an empty reagent grinder
/🆑
2025-12-21 18:51:05 +01:00
MrMelbertandGitHub dc357ab2f7 Limits the amount of distinct chems that can be held in chemistry factory outputs (#93991) 2025-12-21 14:19:22 +01:00
LT3andGitHub 71be0797b1 Fix drinks dispenser tier 2 upgrade (#5042)
## About The Pull Request

Fixes tier 2 upgrade of the drinks dispenser

## Why It's Good For The Game

I just want a Duplex! Is that so much to ask? God damn!

## Changelog

🆑 LT3
fix: Restored missing tier 2 reagents in drinks dispenser
/🆑
2025-12-20 17:34:23 -08:00
LT3andGitHub 83029b36b6 Fix missing dispenser chems (#5038)
## About The Pull Request

Restores the Bubber edits that made chem dispensers multi-tier
upgradeable.

## Why It's Good For The Game

The bartender can make my drink again.

## Changelog

🆑 LT3
fix: Restored missing tier 2/3 reagents in chemical and booze dispensers
/🆑
2025-12-19 14:15:13 -08:00
MrMelbertandGitHub bfdb237612 Spooky Scary Supreme Surgery (Rework) (#93697) 2025-12-19 18:42:58 +01:00
BloopandGitHub 4d8b1ff5af Stops hauntium from trying to haunt objects it is incapable of haunting (#94528)
## About The Pull Request

<img width="578" height="377" alt="dreamseeker_Gg1rgahTpr"
src="https://github.com/user-attachments/assets/051571f5-5671-40e1-ad94-1607a70f2e71"
/>

This proc should only work on items since that's the only thing the
haunted element works on.

## Why It's Good For The Game

Fixes runtime log spam

## Changelog

Not player-facing
2025-12-19 10:21:33 -05:00
SmArtKarandGitHub 601c8d9f70 Fixes damp rags not removing reagents other than space cleaner from themselves (#94478)
## About The Pull Request

``remove_reagent`` requires a type, not an instance

## Changelog
🆑
fix: Fixed damp rags not removing reagents other than space cleaner from
themselves
/🆑
2025-12-16 22:04:28 -05: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 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
SyncIt21andnevimer 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
MrMelbertandGitHub f1137a4520 Reverts RNG Romerol Nerf (#94407)
## About The Pull Request

#90241 added touch protection to `TOUCH|VAPOR` reactions of pretty much
every chemical, including Romerol

This change also gave Romerol application with `TOUCH|VAPOR` a chance
based on the volume applied

Because Romerol is only ever applied in very low volumes, like 1u, this
meant it basically never applied with those methods

I reverted that. Now, Romerol will always apply via
`PATCH|INGEST|INJECT|INHALE` and will otherwise always apply if >=1u is
applied

## Why It's Good For The Game

I don't see why Romerol, an already difficult chemical to acquire and
spread, should have a ~1% chance to actually work, it kind of ruins the
fun of the chem.

It's not even lethal when applied by chem, it does literally nothing
until people die.

## Changelog

🆑 Melbert
balance: Romerol, when applied via touch or vapor, is now guaranteed to
infect when using >=1u. (Prior, it had a % chance of infecting equal to
the amount of chemicals use - so 1u meant 1% chance to infect.) Other
methods of applying Romerol are unaffected (ingesting or injecting any
amount is still a guaranteed infection).
/🆑
2025-12-10 20:31:35 +00:00
BloopandGitHub 2ab2be0f37 Guards against qdeletion in afterattack (#94211) 2025-12-10 11:33:06 +01:00
MrMelbertandGitHub 296f3a7cbd Minor rebalance of blood loss effects / blood regeneration chemicals (#93993)
## About The Pull Request

- Across the board, bleeding wounds cause ~0.85x slower blood loss.
   - Wound clot rate while bandaged has also seen a ~0.85x reduction.
- And slashing wounds have also had their natural clotting rate reduced
by ~0.85x.
- All in all, blood wounds are expected to last marginally longer while
keeping the same level of deadliness.

- Sutures blood flow reduction has been reduced by ~0.85x as well.
Medicated suture is unaffected.

- Blood Mary now scales blood regeneration based on drunkness. 
   - Old: Flat 3 blood/tick.
- 0 drunkness = 0 blood/tick. 40 drunkness = 2 blood/tick. 80 drunkness
= 4 blood/tick.

- Epoetin Alfa saw drastic changes.
   - No longer heals liver damage.
   - No longer adds Sanguirite to the system. 
- Now directly clots 0.1 flow of bloodiest wound (almost effectively
quadrupling clot rate, but 3x less effective than sanguirite)
   - Blood/tick reduced from 3 blood/tick to 1 blood/tick.
   - Now causes minor heart damage (0.2 damage/tick).

## Why It's Good For The Game

- A while back we were talking about how volatile blood wounds were.
Blood wounds are super scary, which is good, but just how scary they
were meant that the extent to which you interacted with this was a bit
stifled. My thoughts are slowing their pace a bit should open up more
opportunities for interaction while keeping them as scary.

- See above.

- Bloody Mary was ridiculously good at healing blood loss, better than
any chemical. The tweak to the effect aims to keep it as a pocket option
for aspiring bartender-alchemists without overpowering other chemicals
in medical contexts.

- Epoetin Alfa is effectively a producible form of Sanguirite which is
something that I believe is not mass producible for a reason (it's
really strong). The changes to it aim to make it a bit less potent that
sanguirite itself while keeping it as a viable blood healing option.
- I understand the liver healing is kinda a real world analog but in the
context of our chemical system, liver damage is something intentionally
not very common. It allows for complete negation of several other chem's
downsides. While I like this form of emergent chem mixing (mannitol and
bath salts, for example), this one earns a "particularly problematic"
badge due to negating 100% of the downsides of many chems.

## Changelog

🆑 Melbert
balance: Blood flow and clotting has universally been slashed by about
0.85x. This means blood wounds kill you slightly slower, but heal
slightly slower.
balance: Sutures now heal 0.85x less blood flow and gauze's clotting
bonus is also 0.85x lower. Medicated sutures are unaffected.
balance: Bloody Mary's blood healing effect now scales with how drunk
you are. Worse in low amounts, better in high amounts.
balance: Epoetin Alfa no longer generates Sangurite. It now directly
clots bleeding wounds (at a rate ~3x worse than sangurite, but still ~4x
better than the natural clotting rate)
balance: Epoetin Alfa no longer heals liver damage.
balance: Epoetin Alfa regenerates 3x less blood. It's still 4x effective
than Saline Glucose or Iron.
balance: Epoetin Alfa now causes minor heart damage (0.2 damage per
tick).
code: All "coagulating" effects now use a shared function. 
/🆑
2025-12-07 22:09:44 -05:00
38776037d5 No more bluespace inhalers (#94306)
## About The Pull Request

Fixes #94284

When someone walks away from you after you try to put an inhaler to
their mouth, it'll cancel the do_after. Currently the do_after is based
on the item in your hand and not the mob you're targeting, which leads
to that issue. If you're just targeting yourself the effect is the same,
so if the bar appearing on the item was a design intention I can revert
it if you're only targeting yourself.

Also, the function for using the inhaler returns ITEM_INTERACT_ stuff
when it should so you stop whacking yourself and others with the inhaler
after using it.

## Why It's Good For The Game

bugfix

## Changelog

🆑
fix: inhalers no longer have infinite reach
fix: using an inhaler no longer results in whacking the target with it
afterwards
/🆑

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2025-12-04 21:02:55 -05:00