1980 Commits
Author SHA1 Message Date
explosivekittyandGitHub 1024048095 Quad eyes and triple eyes for your characters (#5461)
## About The Pull Request
Adds triple eyeballs to markings/organs under the eyes tab. (They don't
show in the editor BUT they work in game)

Makes quad eyes work again! also fixes them because they had issue where
you could see your eyes under any headgear so they are layered correctly
now. Additionally you further customize how far away they are from your
real eyes
## Why It's Good For The Game
They aren't working, and before that they were working but the layering
was bugged. now you can have multiple eyeballs
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
<img width="356" height="89" alt="image"
src="https://github.com/user-attachments/assets/6f96b5a4-91e5-491a-b0a2-dcdf82d866ba"
/>
<img width="218" height="120" alt="image2"
src="https://github.com/user-attachments/assets/7ea0ad67-9214-440c-9c02-df4aab62153f"
/>
<img width="118" height="63" alt="trieyes"
src="https://github.com/user-attachments/assets/b2e26af2-8378-464d-8846-a0c711c02736"
/>

</details>

## Changelog
🆑
add: Slime triple eyes are now selectable in markings/organs under eyes
tab
add: Width customization for quad eyes
fix: fixes quad eyes to work
fix: quad eyes are now layered correctly
/🆑
2026-04-25 02:27:58 +02:00
MrGloopyandGitHub afb8768493 Preference toggle for eyes visibility (#5449)
## About The Pull Request
Ye Olde title. Adds a preference to modify the opacity of your
character's eyeballs. Mostly made this for my yet-unmerged port of
cybernetics from Eris, some of which are not intended to have eyes
visible and instead use the head sprite to represent them.

Thank you to Statykyr and Artur for helping a lot love you mwah
## Why It's Good For The Game

Not having two very obvious pixels blocking a cool animated robot head
is nice. Also Astrum wants it.
## Proof Of Testing

<img width="943" height="523" alt="image"
src="https://github.com/user-attachments/assets/f1099599-9841-4e44-9095-2badde842d0c"
/>
<details>
<summary>Screenshots/Videos</summary>

</details>

## Changelog
🆑
add: Preference toggle for eyes opacity. Have no eyes (visually) or
anywhere in between.
/🆑
2026-04-18 17:01:48 -04:00
Alexis 5c5a636485 Merge branch 'master' into upstream-feb12-2026 2026-03-02 07:42:16 -05:00
DanielanceandGitHub eaf6ecbb77 fixes emissive eyes (#5264)
## About The Pull Request

This fixes emissive eyes not being emissive by re-adding some skyrat
code that went missing after the upstream.

<img width="354" height="356" alt="Screenshot_229"
src="https://github.com/user-attachments/assets/2ddf3dc2-8ed1-434d-8104-6b11d7976207"
/>


Note that there is a new(?) bug where the eyes are still emissive during
blinking.
If this is not an issue it could probably be merged anyway.

How blinking should look:
<img width="110" height="142" alt="Screenshot_231"
src="https://github.com/user-attachments/assets/be3c0ad8-751b-451c-8262-b635e309c502"
/>
How blinking currently looks:
<img width="141" height="136" alt="Screenshot_232"
src="https://github.com/user-attachments/assets/4d6a3c80-9d1f-41f9-a98a-124476b49e38"
/>
## Why It's Good For The Game

Bugfix good
Fixes #5247

## Proof Of Testing

Runs of my machine.
<details>
<summary>Screenshots/Videos</summary>

<img width="631" height="348" alt="image"
src="https://github.com/user-attachments/assets/4194d8a9-788a-446f-b658-895f1ba91328"
/>

</details>

## Changelog
🆑
fix: emissive eyes are now emissive again
/🆑
2026-02-28 10:45:42 -05: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
3f00e8d37a Fixes delta damage calculation for organs (and brain getting traumas not from damage, but from mannitol healing) (#95103)
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2026-02-11 08:00:36 +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
BurgerLUAandGitHub f8576f3669 Forcibly removes Asynchronous Blinking in a semi-modular way because I became a lizard pirate once. (#5197)
## About The Pull Request

Forcibly removes Asynchronous Blinking in a semi-modular way because I
became a lizard pirate once.

## Why It's Good For The Game

There is a weird byond, or /tg/ (I suspect byond) issue where if your
blinking is asynchronous, blinking breaks. This PR just forcibly
disabled the code that runs it so it's just hard disabled.

## Proof Of Testing

It just works.

## Changelog

🆑 BurgerBB
del: Forcibly removes Asynchronous Blinking in a semi-modular way
because I became a lizard pirate once.
/🆑
2026-02-04 01:10:39 -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
GeoengiandGitHub 437e95142f Assorted X-ray Eyes/Goggles Changes + Penlight Message Fix (#94860)
## About The Pull Request

X-ray eyes now possess the FLASH_PROTECTION_SENSITIVE define, meaning
you need at least an equipped welding mask to protect from flashes.
Syndicate x-ray goggles get a relatively unused sprite (it also belongs
to material goggles, which are only mapped in twice in the entire
codebase), aligning with the color of the x-ray eyes. Moth thermal eyes
are raised a step up to being hyper-sensitive to flashes. Fixed a couple
of penlight messages that I noticed while browsing the _eyes.dm file, as
well, to display properly.

## Why It's Good For The Game

The decision to either choose thermal eyes or x-ray eyes, when
**unlocked by the same techweb node**, is heavily one-sided if you know
anything about either. Thermal eyes allow you to see only mobs through
walls and give you pseudo-night vision, while also making you sensitive
to flashes, in opposition to x-ray eyes that allow you to see everything
without any added flash sensitivity, albeit with no night vision. Even
the changeling ability makes you hyper-sensitive to flashes while X-ray
mode is active, which is something restricted to only them. With this
change, not only does which eye implant type you choose matter, but it
also gives more use to the thermal sight genetics mutation, as that does
not affect flash sensitivity at the cost of only having a temporary
duration per activation. Given flash vulnerability for their regular
eyes, thermal moth eyes are made hyper-sensitive to preserve this
consistency between both moths and the x-ray/thermal pairing. And for
the Syndicate goggles, it also brings consistency with the technology,
as the crew's eyes already establish a color for x-ray technology and
lack of night vision. The bug fixes are just good for the 0.01% of
doctors who would use the penlight.

## Changelog
🆑
balance: X-ray eyes now possess flash sensitivity, requiring additional
flash protection to negate bright lights.
balance: X-ray goggles also no longer have pseudo night vision, putting
them more in line with the eyes.
balance: Moth thermal eyes are hyper-sensitive to flashes, like their
x-ray brothers.
fix: Penlight messages for examining zombie and x-ray eyes work as they
should, with maintenance eyes losing a superfluous period.
image: X-ray goggles now have a relatively unique, blue tint and glasses
color to represent their capabilities.
/🆑
2026-01-28 20:29:06 +00:00
Leland KembleandGitHub 92f1a3cd60 Corrects mispelled "sheering" pain in spine implant emp text (#95006)
## About The Pull Request

sheering -> shearing

## Why It's Good For The Game

I assume they meant shearing & not searing, cause it's the body being
smushed. They definitely didn't mean sheering.

## Changelog
🆑

spellcheck: spine implant emp damaging text spells "shearing" correctly

/🆑
2026-01-27 19:02:03 -05:00
DanielanceandGitHub d261477e21 podperson eye color fix (again (again)) (#5175)
## About The Pull Request

Fixes #5167 upstream bug.
Does the same thing that #3447 did to fix the bug.
## Why It's Good For The Game

Bug fix good!
## Proof Of Testing

Works on my machine.
<details>
<summary>Screenshots/Videos</summary>

<img width="646" height="438" alt="image"
src="https://github.com/user-attachments/assets/d15415e0-fea1-49e4-980b-381c3c068f90"
/>


</details>

## Changelog
🆑
fix: podperson eye color can be changed again
/🆑
2026-01-26 04:51:30 +01:00
John WillardandGitHub ff009b8c10 Snouts push masks out a bit (#94640)
## About The Pull Request

If you have a snout (and it isn't already handled elsewhere by your
species), masks will now be pushed 1 whole pixel up and away from you
when facing left or right.

Examples (TOP IS OLD, BOTTOM IS NEW)

(did you know the welding visor has the lizard's snout sticking out the
front)?

<img width="441" height="357" alt="image"
src="https://github.com/user-attachments/assets/5d703afc-2541-4789-956c-f27dc3fdcf31"
/>

I also tried moving it up one tile too, but it didn't look as nice. (To
be clear, these are not the ones being used, the above screenshot is)
(once again top row is old, bottom row is new)

<img width="1443" height="493" alt="image"
src="https://github.com/user-attachments/assets/c7193237-39fb-466b-9dcd-f5db2a646628"
/>
<img width="1138" height="490" alt="image"
src="https://github.com/user-attachments/assets/398154df-3e56-4f59-b350-24a9c9ea04a1"
/>


## Why It's Good For The Game

I think this makes masks fit snouted faces a little bit better?
Currently they sorta clip into the face which is a little bad imo.

## Changelog

🆑
add: Masks now fit snouted species a little bit better, maybe.
/🆑
2026-01-23 18:03:27 -05:00
5ed2539038 Advanced disease cures are symptom based (#94352)
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2026-01-20 09:52:46 +01:00
55279df884 voltaic cyberheart: stoppable overlay timer, losing overdrive on heart loss (#94817)
Co-authored-by: Hatterhat <Hatterhat@users.noreply.github.com>
2026-01-18 17:24:51 +11:00
Tad HardestyandGitHub e5e06aff43 Fix corner-case runtimes for removed jobs, other minor fixes (#94822)
* Fix runtimes in `/datum/id_trim` and when equipping corpses if a map's
.json file fully removes a job
* Remove unused `/datum/powernet/var/number`
* Fix ctrl+clicking a telescreen to mute it also activating it normally
* Unmark `_liver.dm` as executable
2026-01-12 17:51:24 -05:00
san7890andGitHub 265ceb3eb2 Fixes Flakey Ashwalker Lung Unit Test Failures on gateway_test (#94821)
## About The Pull Request

Closes #94794

Both of these unit tests were using the outdated way of changing the gas
mix on a turf, probably because they were more than a few years old
apiece. The modern way is using the `/datum/gas_mixture` and
`parse_gas_string()` to either retrieve the gas mix from cache or
generate it on-demand. Neither of these tests were doing that, and they
worked well enough until they got mutated in #94771
(01c7ef7de1).

I am uncertain of the specifics that are behind either one
spontaneously/always failing but I do know that they weren't doing it
the "right way". I suspect the flakiness in the Breath Ashwalker Sanity
(that loads a full ashwalker carbon instead of just the lungs) is
because it was initiating a gas mix with no volume within it, and that
volume would get filled up as the other turfs in the loc would update it
somewhere in the atmos chain? We only checked for the "low oxygen"
status effect on the mob and that could easily have been filled up to
normal depending on how much happened. Regardless the best way to fix
this is to just have all the turfs in the unit test room get changed to
prevent any schenanigans with that.

Another explanation for the flakiness is that the ashwalker lungs
themselves use the same "old" way of getting the gas mix instead of the
modern way (such that the lung breath values can adapt to changes)... I
think...
## Why It's Good For The Game

Less developer frustration at spontaneously failing unit tests through
no fault of their own.
## Changelog
Irrelevant
2026-01-11 15:02:01 -05:00
d5102b2030 Void stamp integration - the stampening (#94359)
## About The Pull Request

Void stamp added to bureaucracy loot spawners, a new box that contains a
granted, denied, and void stamp found in the lawdrobe, hop locker,
bureaucracy crate, mod stamper module, and the paperwork implant gets a
stamp that can cycle between 3 different ones like the mod stamp.

## Why It's Good For The Game

Finally the void stamp is obtainable

## Changelog

🆑
add: The void stamp is now obtainable
add: The lawdrobe now sells a box of stamps
add: The head of personnel's locker now contains a box of stamps
fix: The mod stamper module is now visible
/🆑

---------

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2026-01-08 18:31:15 +00:00
FalloutFalconandGitHub dd2902914b Enforces organs calling on_life parent (#94749)
## About The Pull Request
on_life handled failing and healing, this makes it so ALL organs call
its parent proc for it.
Was originally spurred on by the fact this is not enforced causing
stomachs to not call it by mistake.
## Why It's Good For The Game
all organs now heal and fail as intended?
two that MIGHT be intentional are brains and glands. Let me know if so
## Changelog
🆑
fix: Brains, a few implants, glands, and all other organs now heal and
fail as intended
/🆑
2026-01-07 08:43:19 +01:00
SyncIt21andGitHub f35684b41e Fixes non functional code in emp brain (#94687)
## About The Pull Request
- Fixes #94554

## Changelog
🆑
fix: removing implant in cybernetic brain works again
/🆑
2026-01-07 00:16:39 -05: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
MrMelbertandGitHub 5ef61fde05 Being drunk makes you a worse surgeon unless you land in the Balmer Peak (also Balmer Peak tweak) (#94674)
## About The Pull Request

1. Balmer Peak voicelines can only trigger if you are of a whimsical
personality
2. If you are drunk, you get worse at surgery (up to 12x worse at 100
drunkness). However if you are within the Balmer peak you are BETTER at
surgery (0.8x).

## Why It's Good For The Game

1. Balmer voicelines are super annoying so I figure it should be
restricted to characters that would say it ICly
2. Being drunk obviously means you're bound to screw up surgery, right?

## Changelog

🆑 Melbert
add: Scientists only say Balmer voicelines if they are whimsical
add: Surgery gets slower if the surgeon is drunk, UNLESS you land in the
Balmer Peak, then it's actually faster.
/🆑
2026-01-04 20:38:22 -07:00
SmArtKarandGitHub a4f0dcb76f Adds flaying, human butchering and limb surgeries (#94612)
## About The Pull Request

Merry Christmas!

This PR expands on the more gruesome areas of chef content, such as
cannibalism.
Human limbs can now be individually butchered for their meat and skin
with a knife or another butchering implement once the skin has been cut
and retracted (forks now can be used as bootleg retractors). If the limb
contains organs, those will need to be removed first, which also can be
quickly performed with a butchering tool at the cost of damaging the
inhards (head and chest will require the bone to be cut first, which can
be done with a butcher's cleaver if you don't have a saw)
You can also butcher humans whole by right clicking them with a
butchering implement on combat mode, which will attempt to gut/cut apart
the selected limb. Obviously this requires the limb to be prepped first,
so meat hooks/kitchenspikes now allow mobs strung on them to be operated
on without needing drapes. Its a pretty bad spot to be performing
surgeries at though, so beware! Torsos can only be butchered after all
other limbs have been. The gutting/butchering delay is based off the
owner's stat, halving if the limb is detached and doubling if the owner
is still alive and kicking.

<img width="392" height="265" alt="dreamseeker_D7QWbWKStd"
src="https://github.com/user-attachments/assets/050d7c25-3572-4b02-ae93-d8efefe54885"
/>

(The video is too large for github)
https://streamable.com/459a0y

After being butchered, most limbs will leave behind a nonfunctional
skeletal limb (with exceptions like jelly limbs with no skeleton inside)
which is always disabled. Skeleton chests husk their owner, so you'll
need to replace it first.
Gibbers now source their meat from the victim's limbs (and not their
species) at an RNG-based percentage based on the matter bin's tier.

As to allow individual limbs to be butchered, you can now perform (some)
surgeries on individual limbs. There are some obvious restrictions like
zombification or bioware surgeries, but most of the ones that make sense
can be performed on someone's chopped off head as long as you've got the
tools.
Wounds also contribute to surgeries now, major slash wounds count as
cut/open skin (and sealing the vessels would reduce their bleed rate),
and critical blunt wounds count as sawed bones.

I've refactored gibbers, butchering and meat spike code as well as fixed
some backend bugs while I was at it.

## Why It's Good For The Game

While rather gruesome, I feel like the freedom which these mechanics
provide fits us pretty well. We already have plenty of nasty stuff and
this doesn't really go that much further, and a chef serving their own
leg in their dish is pretty funny. (Also you can scrape plasma off
plasmamen bones)
2025-12-31 12:55:39 -06: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
John WillardandGitHub 41f34c2a86 Adds tgui color picker (#94313)
## About The Pull Request

Ports https://github.com/Monkestation/Monkestation2.0/pull/1231 which is
a port of https://github.com/BeeStation/BeeStation-Hornet/pull/9417
which is a port of https://github.com/omgovich/react-colorful/
Also a port of
https://github.com/effigy-se/effigy/blob/main/tgui/packages/tgui/interfaces/effigy/ColorPickerModal.tsx
for hex color presets

Admin stuff got excluded (pref-like picker, filterrific, get-variables)



https://github.com/user-attachments/assets/7069bef9-81cd-4636-bf68-cbad227ef09e


## Why It's Good For The Game

It's one of the only input areas that still doesn't use TGUI, leaving
darkmode players flashbanged every single time a color selection UI is
opened. This is also just visually great and I think a big upgrade from
byond's.

## Changelog

🆑 omgovich, itsmeow, Absolucy, JohnFulpWillard, jlsnow301, TealSeer,
lessthnthree
add: Color selection panels now use TGUI (If you have TGUI enabled in
settings).
/🆑
2025-12-21 16:18:34 -08:00
MrMelbertandGitHub acd881147f Adds cybernetic surgical processor implant (#94555) 2025-12-21 14:16:51 +01:00
MrMelbertandGitHub bfdb237612 Spooky Scary Supreme Surgery (Rework) (#93697) 2025-12-19 18:42:58 +01:00
ab31a5ea4d regenerate_organs now removes emp-derived failure from organs (#94534)
## About The Pull Request

regenerate_organs is a carbon proc that heals all of your organs and
replaces missing ones. It's called when you use a regenerative extract
or an implanted legion core or get ahealed or whatever. This PR makes it
remove emp-derived failure from your cybernetic organs, because it's
supposed to fullheal them and that feels like it should be a part of
fullhealing.

## Why It's Good For The Game

bugfix

## Changelog

🆑
fix:full healing effects now remove emp-derived failure from cybernetic
organs
/🆑

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2025-12-19 10:12:19 -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
shayoki 3af5f76792 edit 2025-12-13 11:51:07 -06:00
levels0andGitHub 6dba5aa316 Make evolved lungs resistant to co2 (#94368) 2025-12-09 09:05:22 +00:00
FalloutFalconandGitHub 54c67546ad NV eyes is an abstract type (#94238) 2025-12-09 09:49:19 +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
BloopandGitHub 7754938c72 Makes a bunch of lists lazy (#94239)
## About The Pull Request

Empy lists. There are a lot of 'em.

<img width="981" height="512" alt="image"
src="https://github.com/user-attachments/assets/b94b041a-2904-466b-ab89-54bd1de11b4e"
/>

Going through ways to reduce memory I found a few easy ones here. Wires,
the edible component, the seethrough component. None of these are really
a concern when it comes to needing lists in memory for performance
reasons. Wires aren't going to be cut most of the time for each door. A
lot of food does not have any junkiness. Seethrough component lies
dormant most of the round. Etc.

Making lists lazy in these cases should be a no brainer.

Everything I tested still seems to work exactly the same.

## Why It's Good For The Game

Frees memory that is just taking up space a lot of the time.

## Changelog

Not player-facing, this is all under-the-hood stuff.
2025-12-03 13:42:16 -07:00
RoxyandGitHub 9f7dc7c970 [MDB IGNORE] Make /obj/item/stamp abstract, create proper granted stamp subtype (#94139)
## About The Pull Request

There is technically an `/obj/item/stamp/granted` in that one traitor
objective refers to it and tries to override a proc on it thus making it
a valid type, but not really. This changes the base `/obj/item/stamp`
from being the granted stamp to being an abstract type, and creates a
proper subtype for the granted stamp.

## Why It's Good For The Game

Base types being concrete outside of scenarios where its intuitive are
very annoying

## Changelog
🆑
code: makes /obj/item/stamp abstract, creates /obj/item/stamp/granted
/🆑
2025-12-02 16:53:07 -07:00
GhomandGitHub 0b0c5ea91e Unit test material checks are now performed on all crafting recipes by default. All stack recipes now transfer mats to the results (#92620)
## About The Pull Request
Extends the part of the crafting unit test that ensures consistency
between the total mats of the components of a recipe (or rather, the
result of said recipe) and a generic instance of the same type as its
result, previously only implemented on food recipes.

## Why It's Good For The Game
This ensures a degree of consistency with the material composition of
various objects in the game. I couldn't do it in the original PR as that
one was too big already and it took months to get it merged, and have
the relative bugs fixed.

Currently a WIP as I slowly deal with the unit test reports.

## Changelog

🆑
refactor: Follow-up to the crafting/material refactor from months ago.
All objects crafted with stacks now inherit their mat composition (not
necessarily the effects and color) by default, while previously only a
few things like chair, sinks and toilets did. Report any object looking
or behaving weirdly as a result.
fix: The material composition of ammo boxes is no longer a 1/10 of what
it's supposed to be. It was a shitty hack to make it harder to recycle
empty ammo boxes. Instead, they lose materials as they're emptied now.
/🆑
2025-12-02 18:29:01 -05:00
FalloutFalconandGitHub 2d8c0a777b Eye icon folder is less hardcoded (#94242)
## About The Pull Request
Moves eyes to there own folder and makes it so they state there icon
folder rather then it being hard coded
## Why It's Good For The Game
It felt weird that these are lumped into a file that's mostly hair and
that its hard-coded like this. This makes it easier to sort out icons.
(Thinly veiled downstream support)
## Changelog
N/A
2025-12-01 18:26:58 -05:00
LucyandGitHub 2b1bc04dfd Fix voltaic combat cyberhearts killing toxlovers (#94041)
## About The Pull Request

Partial port of
https://github.com/Monkestation/Monkestation2.0/pull/9549

this makes it so the voltaic overdrive status effect from the combat
cyberheart won't try to heal toxins for toxin lovers

also moved the voltaic overdrive status effect to
`STATUS_EFFECT_PRIORITY` as it's something where skipping ticks can fuck
you over, as it's likely to be active during a fight, and also made it
so `updatehealth` is only called once.

## Why It's Good For The Game

dying to something that's supposed to give you a second chance kinda
sucks, and there's not really any indicator that it would do this until
you keel over from blood loss mid-fight.
2025-11-30 13:06:27 -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
Joshua KidderandGitHub 7a3ad79506 All camelCase (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use snake_case. UNDERSCORES RULE! (#94111)
## About The Pull Request
It's just a partial cleanup of
anti-[STYLE](https://github.com/tgstation/tgstation/blob/master/.github/guides/STYLE.md)
code from /tg/'s ancient history. I compiled & tested with my helpful
assistant and damage is still working.

<img width="1920" height="1040" alt="image"
src="https://github.com/user-attachments/assets/26dabc17-088f-4008-b299-3ff4c27142c3"
/>


I'll upload the .cs script I used to do it shortly.

## Why It's Good For The Game
Just minor code cleanup.

Script used is located at https://metek.tech/camelTo-Snake.7z

EDIT 11/23/25: Updated the script to use multithreading and sequential
scan so it works a hell of a lot faster
```
/*
//
Copyright 2025 Joshua 'Joan Metekillot' Kidder

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
//
*/
using System.Text.RegularExpressions;
class Program
{
    static async Task Main(string[] args)
    {
        var readFile = new FileStreamOptions
        {
            Access = FileAccess.Read,
            Share = FileShare.ReadWrite,
            Options = FileOptions.Asynchronous | FileOptions.SequentialScan
        };
        FileStreamOptions writeFile = new FileStreamOptions
        {
            Share = FileShare.ReadWrite,
            Access = FileAccess.ReadWrite,
            Mode = FileMode.Truncate,
            Options = FileOptions.Asynchronous
        };
        RegexOptions regexOptions = RegexOptions.Multiline | RegexOptions.Compiled;
        Dictionary<string, int> changedProcs = new();
        string regexPattern = @"(?<=\P{L})([a-z]+)([A-Z]{1,2}[a-z]+)*(Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss)([A-Z]{1,2}[a-z]+)*";
        Regex camelCaseProcRegex = new(regexPattern, regexOptions);

        string snakeify(Match matchingRegex)
        {
            var vals =
            matchingRegex.Groups.Cast<Group>().SelectMany(_ => _.Captures).Select(_ => _.Value).ToArray();
            var newVal = string.Join("_", vals.Skip(1).ToArray()).ToLower();
            string logString = $"{vals[0]} => {newVal}";
            if (changedProcs.TryGetValue(logString, out int value))
            {
                changedProcs[logString] = value + 1;
            }
            else
            {
                changedProcs.Add(logString, 1);
            }
            return newVal;
        }
        var dmFiles = Directory.EnumerateFiles(".", "*.dm", SearchOption.AllDirectories).ToAsyncEnumerable<string>();

        // uses default ParallelOptions
        // https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions?view=net-10.0#main
        await Parallel.ForEachAsync(dmFiles, async (filePath, UnusedCancellationToken) =>
        {
            var reader = new StreamReader(filePath, readFile);
            string oldContent = await reader.ReadToEndAsync();
            string newContent = camelCaseProcRegex.Replace(oldContent, new MatchEvaluator((Func<Match, string>)snakeify));
            if (oldContent != newContent)
            {
                var writer = new StreamWriter(filePath, writeFile);
                await writer.WriteAsync(newContent);
                await writer.DisposeAsync();
            }
            reader.Dispose();
        });
        var logToList = changedProcs.Cast<KeyValuePair<string, int>>().ToList();
        foreach (var pair in logToList)
        {
            Console.WriteLine($"{pair.Key}: {pair.Value} locations");
        }
    }
}

```

## Changelog
🆑 Bisar
code: All (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use
snake_case, in-line with the STYLE guide. Underscores rule!
/🆑
2025-11-27 15:50:23 -05:00
SmArtKarandGitHub 6811f64c73 Gives cybernetic cat ears unique sprites and emissives (#94099) 2025-11-23 19:21:02 -05:00
zeckleandGitHub 547ca74edf Chaplain's Maintenance Adapted eyes no longer burn if you have active welding protection. (#93975)
## About The Pull Request

Chaplain's Maintenance Adapted eyes no longer burn if you have active
welding protection. You can also get these eyes from a bioscrambler,
it's very annoying. This makes having the eyes slightly less annoying -
you'll only be able to walk around in the light while you've got a
welding mask on, dimming your vision significantly. But it's better than
being intermittently blind.

You'll still eat shit to flashes though; you still need two sets of
protection. Eyes are still hypersensitive.

## Why It's Good For The Game

Chaplain sects are already really, really bad - and chaplain's
maintenance adapted eyes cost a lot for having an extremely annoying
drawback. Rat-infusion eyes in basically every way, too. Though I don't
expect anyone to take the maint sect, this should make the downside more
bearable. Also makes getting it from a bioscrambler less awful. Now you
can walk to medical to get your eyes pulled out.

## Changelog

🆑
qol: Welding protection now prevents Maintenance Adapted eyes from
burning in the light.
/🆑
2025-11-17 22:44:32 +01:00
RikuTheKillerandGitHub 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
Roxy 71faa643bf Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-2025-11-12 2025-11-12 16:44:13 -05:00
MrMelbertandGitHub c080b83c41 Monkey eating glowup (#93759)
## About The Pull Request

1. Monkeys will only seek out food to eat if they are actually hungry,
rather than on an arbitrary cooldown.
2. Monkeys will no longer teleport-yoink food out of your hands.
Instead, they may get angry at you for stealing their food, and fight
you over it. The hungrier the monkey, the more likely they are to fight.
3. Monkeys will discard trash and empty glasses (on the floor) after
eating or drinking them.
4. Monkeys can target soup to eat
5. PunPun will no longer seek out drinks if they are hungry.
6. PunPun will now, if the bartender is absent and there are multiple
patrons around, attempt to find filled glasses or food to hand out to
patrons.
7. Several places that sought edible items no longer include drinking
glasses as edible items

<img width="656" height="185" alt="image"
src="https://github.com/user-attachments/assets/8b3a6ac1-ae2c-41a0-919f-b471ad93bb0f"
/>

## Why It's Good For The Game

PunPun shouldn't be yoinking glasses out of patron's hands - their
intended behavior is to serve drinks not steal them

Otherwise, monkey eating was a bit jank due to it being some of our
oldest ai code. I largely just brought it up to more modern ai
standards.

## Changelog

🆑 Melbert
add: If the bartender is absent, PunPun will serve filled drink glasses
to patrons that don't have one.
add: PunPun will now ignore filled drinks and items being held when
looking for stuff to eat.
add: Monkeys can eat soup.
add: Monkeys will no longer seek out food if they are not hungry.
add: Hungry monkeys might fight you over the food you are holding. The
hungrier the monkey, the angrier the monkey.
fix: Monkeys can no longer teleport items out of your hands to eat. 
/🆑
2025-11-08 01:32:46 +01:00
Roxy eb6d02fdb0 Fixes for 585b02c325 2025-11-06 00:18:59 -05:00
Roxy d0ca474789 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-2025-11-05 2025-11-05 19:43:07 -05:00
Yaroslav NurkovandGitHub a17d0d238c Charger items fix (#93754)
## About The Pull Request
Items(i.e yellow stabilized/regenerative extract, glowshroom cap,
voltaic cybernetic heart) now recharges cells of mob equipment as they
are supposed.

## Why It's Good For The Game
After [(this)](https://github.com/tgstation/tgstation/pull/92987) PR was
merged items, that were supposed to recharge cells in items, stopped
functioning due to change in code of how batteries inside items
recharge. This PR supposed to fix the issue.
2025-11-05 15:13:38 -06:00
GhomandGitHub 922bd0cb92 Refactor get_ear_protection() and soundbang_act() to be less bs (#93472)
so, the current `COMSIG_CARBON_SOUNDBANG` signal is kinda lame because:
1) it's relegated to carbon mobs
2) it means ear protection equipment actually has no effect when
`get_ear_protection` is called instead.
3) It's sent in more than one place in the code

So I replaced it with another signal, this one properly sent in
`get_ear_protection`, and therefore `soundbang_act` as well.

What's also lame is that the code for both `get_ear_protection` and
`soundbang_act` can be easily moved to the living type, and it wouldn't
make a huge impact aside causing simple mobs to be stunned very briefly
by flashbangs since they cannot be knocked down anyway. The less the
code is specific to a subtype, the easier it's to work with, the fewer
the paradigms etc.

Another lame thing is some of the code being kinda old. Also I wanted to
fix an issue with the shriek ling ability detailed in #93401. I wanted
to make the ability more consistent with how other sound-related
abilities work by making it use `soundbang_act`, but with an intensity
higher than any other feature so far, beside point-blank flashbangs
(holding on standing on one). I've also buffed the "ear protection"
offered by vacuums from 1 to 3, meaning nothing but point-blank
flashbangs will go through. Yes, this means shrieks are not good in a
vacuum because sound generally propagate in absence of molecules that
can transmit the vibration... at least IRL. The game's an approximation
anyway, but it's still inconsistent, like a fuckton of other things that
are even more outside of the scope of this PR. Well, at least it affects
simple/basic mobs too now.

## Why It's Good For The Game
This will fix #93401 and make some code less old and bad.

## Changelog

🆑
refactor: refactored code for ear/soundbang protection. Flashbangs and
other things can now affect simple/basic mobs as well, not just carbon
and occasionally silicons.
balance: Aliens are no longer impervious to soundbang_act. Still very
resistant to it due to their hardcoded ear protection
balance: How the resonant shriek changeling ability works is now
slightly more consistent with the ear/soundbang protection, meaning it
won't work well in a vacuum, but at least it works on simple mobs now.
fix: Everyone can now hear a changeling shriek, unless they're already
deafened or in a vacuum.
/🆑
2025-11-04 15:22:33 -05:00