2027 Commits
Author SHA1 Message Date
Maia 8a01d69e7e Various upstream related fixes 2026-08-14 19:44:53 +02:00
Alexis 88e84645b1 Merge commit '6b52b564a50e4f3091470529c683587e5de15d49' into upstream-sync-7-22-2026 2026-07-22 13:39:09 -04:00
bf98195fda Ghosts can see more info on health scan (#96792)
## About The Pull Request

I have no idea how to word this so here's a list instead. 

1. Fixes #96445 by making it so that instead of healthscan code coming
up with cure text on the spot for viruses, advanced diseases have a
function that can generate cure text so you can use it in things other
than healthscanning.
2. Rewords a single letter var in medical kiosk code
3. As a result of 1, the code for disease state analyzers healthscanning
has been shortened because the cure text generating function only has to
be written once and not twice.
4. Health scans now have a power level instead of just being advanced or
basic. There is a new power level called super, and it's only available
to ghosts. Super scans can see all virus symptoms instead of just 3, and
the current stage of an alien embryo.
5. For some reason a bunch of healthscan code (like stuff from the eye
of god and health scanner mod module) were using 1 instead of
SCANMODE_VERBOSE (a define that equals 1 but is more readable) for the
scanmode. That's no longer the case.
6. A new health scanner, the super health scanner, that replaces the
advanced one in the box of debug tools.

<img width="620" height="223" alt="image"
src="https://github.com/user-attachments/assets/a0c5e56e-cf19-4db2-a2df-b72456123c50"
/>
<img width="73" height="65" alt="image"
src="https://github.com/user-attachments/assets/27f8c81b-4f89-455b-82fa-a0ecf94656cf"
/>

## Why It's Good For The Game

Ghosts should be able to see everything, I think

## Changelog

🆑
qol: Ghosts can see alien embryo stage and all virus symptoms when
health scanning
code: Health scanners now support multiple scan levels
fix: Fixes medical kiosks not being able to identify advanced disease
cures.
/🆑

---------

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2026-07-17 00:07:13 +02:00
6f362c7a03 Cyberhearts now use blood regeneration multiplier (#96970)
## About The Pull Request

#96129 forgot to change cyberhearts, probably since they're in a
different file. This makes them use the same code as everything else.

## Why It's Good For The Game

bugfix

## Changelog

🆑
fix: cyberheart blood regeneration properly scales with heart damage
/🆑

---------

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2026-07-15 23:37:25 +02:00
0716e3fff4 Atmos refactor & speedup by utilizing BYOND 516 vector functions (#96448)
## About The Pull Request

### Summary
This PR changes internal structure of `/datum/gas_mixture`:
`gases[gas_id][MOLES]` refactored into `moles[gas_id]`,
`gases[gas_id][ARCHIVE]` into `moles_archive[gas_id]` and
`gases[gas_id][GAS_META]` into `gas_meta` static variable. This allows
us to use BYOND 516 vector functions for calculating total moles and
heat capacity. Also it simplifies some parts of the code, allowing us to
get rid of macros `ADD_GAS` and `ASSERT_GAS`. According to the profiler
`/turf/open/process_cell` time is reduced by ~20%.

### Details
`gas_mixture.gases` was a nested 2d-list with MOLES, ARCHIVE and
GAS_META for each gas_id. For example, to get gas moles you had to do
`gases[gas_id][MOLES]`. I've changed this structure to be as follows:
`moles[gas_id]` - moles for the gas, `moles_archive[gas_id]` - archived
version of moles, `gas_meta[KEY][gas_id]` - static var with meta
information for the gas.

Since I removed key GAS_META from the gases, `gas_meta` was moved to the
static variable and the order of keys in the array was changed from
`gas_meta[gas_id][META_KEY]' to 'gas_meta[META_KEY][gas_id]`. This was
done to allow using it in vector calculations (for example heat capacity
or fusion power). Static variable access is very fast and it is
considered as accessing a global in the bytecode.

Byond 516 introduced new vector functions: `values_sum`, `values_dot`
and others. These functions are very fast, but operate only on
associative lists. This allows us to change the way we calculate
total_moles and heat_capacity - very hot and heavily used functions.
`total_moles()` became just `values_sum(moles)`, and `heat_capacity` is
just a dot product: `values_dot(moles,
gas_meta[META_GAS_SPECIFIC_HEAT])`.

As a side bonus, since `moles` is just an associative list, you don't
really need old macros `ADD_GAS` and `ASSERT_GAS` - all they did was to
make a copy of a list[3] with default value [0, 0, gas_meta] for
specific gas. Now when you're adding gas you can just use `moles[gas_id]
+= amount` and when you query amount of gas you can just query the key
(for example `moles[/datum/gas/oxygen]`) if the key does not exist, it
returns null and works as 0 for all arithmetic and logic operations. For
example, old code would be `if (!air.gases[/datum/gas/oxygen] ||
air.gases[/datum/gas/oxygen][MOLES] < 1)` and now it is `if
(moles[/datum/gas/oxygen] < 1)`. This simplifies some parts of the code
and also speeds things up.

For the performance comparison I used Tracy profiler. I've done many
different tests, and they all show slightly different numbers, but
overall speedup for `process_cell` is about 20%. (-20% to average time
per call from ). My testing setup was as follows:
Load Icebox, drop 30/60/90 radius bomb in the middle of the bridge, set
code to blue, wait 10 minutes until the round ends.
Also I fixed random seed in the master controller and in the planetary
gas randomization so generated maps are the same between tests.
Althought it's not very realistic, it generates a lot of samples for the
`process_cell` (around ~3.5M per 10 minutes).
Another test I did was a plasmafire in an 8x8 space, on runtime station,
it showed (-24% time on process_cell).
Another test was a emagged holodeck burn test, it showed (-13% time)
As for other functions of gas_mixture: `total_moles`: -50%(2x speedup),
`heat_capacity`: -65%(3x speedup), `share`: -30%, `react`: -20%. Timings
of all those functions is in microseconds range and they are very hot
(call count is in the same order as process_cell)

<details><summary>Some pictures from profiler</summary>
<img width="569" height="642" alt="process_cell"
src="https://github.com/user-attachments/assets/76fa0c27-719d-485d-9bfc-859fef788999"
/>
<img width="572" height="315" alt="image"
src="https://github.com/user-attachments/assets/f68497e9-4db8-4a9c-b43f-ad04e6dc5cac"
/>
<img width="569" height="317" alt="image"
src="https://github.com/user-attachments/assets/d7249e7b-f344-47a6-8b39-1bab0521182d"
/>
<img width="541" height="316" alt="image"
src="https://github.com/user-attachments/assets/1bef71fd-533d-40fa-a85e-7a803ad322f7"
/>
<img width="519" height="409" alt="image"
src="https://github.com/user-attachments/assets/51165289-174e-403d-a09c-787dd9af136a"
/>
<img width="523" height="318" alt="image"
src="https://github.com/user-attachments/assets/fe4b1db0-17d8-47f9-8fd0-e2ecef2ee66a"
/>
</details>

<details><summary>Setting up a profiler</summary>
If you wanna to reproduce my results here is a list of steps

1. download: https://github.com/goonstation/byond-tracy-writer (this one
has offsets for my version 1677)
2. build the dll, drop in the tgstation/ folder
3. download rtracy https://github.com/Dimach/rtracy
4. download Tracy profiler (0.13.1) https://github.com/wolfpld/tracy
5. uncomment `#define USE_BYOND_TRACY` in `_compile_options.dm`
6. build tgstation
7. open dream daemon, run the desired test, after round end dream daemon
closes
8. navigate to tgstation/data/profiler, find the `123412341234.utracy`
file
9. run `rtracty 123412341234.utracy`
10. open tracy-profiler.exe, press Connect, save the profiler data
11. repeat steps 5-10 with another branch, save another profiler data
12. open tracy-profiler, open first data, press compare, open second
data
</details>

## Why It's Good For The Game

## Changelog
🆑
refactor: Atmos refactor & speedup by utilizing BYOND 516 vector
functions
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2026-07-14 20:34:31 -07:00
QuiteLiterallyAnythingandGitHub 9459c2d9d6 Adds charge checking interactions to ethereals (#96904)
## About The Pull Request
This PR adjusts the ethereal stomach equivalent (biological batteries)
such that they provide their charge whenever either they or their mob
owner get hit by a multitool. This is formatted in the exact same way as
seen when multitooling a cable. A tip of the round indicates that this
is possible.

Additionally, health analyzers will show stomach charge as well. While
coding this I made a couple of slight adjustments to the nearby blood
level formatting for spelling and a (sometimes) stray comma. In effect
this makes it go from displaying "Blood level: 100%, 560 cl, <ins>type:
O+</ins>" to "Blood level: 100%, 560 cl <ins>O+</ins>" (with the
underlining being a tooltip).
## Why It's Good For The Game
To my knowledge, there is currently no way to get the exact and
quantified charge of an ethereal. This makes it difficult for anyone
healing an ethereal to definitively tell whether toxins damage is from a
lack/excess of charge or some other source.

Aside from that, it's also just mildly comedic to be able to check the
charge of a living entity in the exact same way as a piece of insulated
copper.
## Changelog
🆑
add: Health analyzers now display ethereal charge.
add: It is also possible to check the charge of an ethereal (or their
stomach equivalent) with a multitool.
/🆑
2026-07-13 20:56:18 -06:00
GhomandGitHub 54df8cab2d Moved a few monkeys features out of species code (+ updated a couple infusion organs) (#96735)
## About The Pull Request
Title. I'm moving a few monkey features away from the species and into
its bodyparts and organs. I plan on following up with another PR for the
various `ismonkey()` in the code, as these are necessary changes for a
niche thing I'm ultimately working on.

Also one carp organ and one stoat organ both had bits of code made
redundant by available traits. This takes care of them.
Also removed the passwindow_on/off and passtable_on/off procs. We can
just register the associated trait signals on init for living mobs (plus
they were being misused on non-mobs).

## Why It's Good For The Game
Less code associated directly to the species and more to its body parts
and organs, which is basically something we've been doing for a few
years ~~(also I need it for skeletonized monkeys)~~.

## Changelog
N/A
2026-07-11 21:51:39 +01:00
BurgerLUAandGitHub 9d924f93ba Temp TM only fix for lizard blinking issues. (#5792)
Upstream broke lizard blinking again and turned every lizard into a
pirate.

This PR just disables async blinking for lizards.
2026-07-11 11:13:30 -07:00
MrMelbertandGitHub 9b4a2e4493 Fix strong arm removal (#96891)
## About The Pull Request

Oops no subtraction

## Changelog

🆑 Melbert
fix: Fix strong arm removal 
/🆑
2026-07-09 20:55:41 -06:00
GhomandGitHub 6eb2d1674a Implementing materials checks for techweb designs. (#96257)
## About The Pull Request
In similar fashion to what was done with crafting recipes last year,
this year it's time for techweb designs and printed items to be audited.
This is mostly just about consistency, we've a lot of items that can be
printed by protolathes, autolathes, circuit printers and techfab etc.
However they almost all (except most stacks, mainly) have custom
materials that do not match in one way or another with the materials
used by the design, which is what this PR is for.

"But items printed from lathes etc. already get the mats used to make
them." Yes, they do, however that isn't the case for items of the same
type that were spawned in some other way (cargo shuttle, space/maints
loot, mapped, admins), this create a subtle discrepancy. It isn't a huge
deal (in spite of the size of this PR, ton of designs), but given that I
have done something similar with crafting recipes before, I may as well
give it a second arc of some sort and bring things to completion. And
fix a few possible oversights.

TL;DR consistency and stuff

## Why It's Good For The Game
Consistency, unit test checks to make it harder not to be consistent in
the future. Still has a few TODOs like:

- [x] Fixed newly printed, fully charged RCDs costing less than the RCD
cartridges required to fully charge one. EDIT: I had to tweak the newly
added RDD as well because it suffered from the same fundamental issue.
- [x] Fixed plates being made of iron and yet shattering like ceramic
ones. A new subtype for metallic ones has been made.

## Changelog

🆑
refactor: Refactored a few things with techweb designs (the ones for
autolathes, protolathes, circuit printers, mechfabs etc.) to make sure
that the materials of items that can be made from these designs more
closely match the materials used to make them.
fix: Lizard fries no longer need a plate to be made, like all other
treats that used to require plates in a distant past.
balance: Tweaked the materials cost of RCD, RDD and RCD cartridges.
image: Oven trays now have a more metallic hue.
balance: Plates printed printed from lathes won't shatter like ceramic
ones, in virtue of them being made out of iron instead.
/🆑
2026-07-06 00:13:02 -07:00
RoxyandGitHub 8483e18877 Fix flaky hard delete on hearts (#96797)
## About The Pull Request

#96409 correctly identified the source of the problem, but failed to
resolve it because the timer is actually added during qdel, as part of
Destroy related organ movement. That means it's already past the point
where a delete_me timer would get removed.

## Why It's Good For The Game

Fixes #96458

## Changelog

N/A
2026-07-04 20:02:56 +02:00
RoxyandGitHub e2cf25470d Fix horns getting hidden in modsuits (#5891)
## About The Pull Request

Couple things going on here but basically boils down to the
`/datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart` proc in
`_visual_organs.dm` blocking horns if outfit has `HIDEHAIR` flagged
which mods do, this is all fine and dandy but we have a specific
carve-out for mods because of the hardlight overlays they add, problem
is that the latter check was taking precedence over the carve-out
(`is_deely_bopper_hidden`). I commented out this check because
`is_deely_bopper_hidden` does everything it does and more, so we don't
need it. Also deleted a redundant skyrat override on
`/datum/bodypart_overlay/mutant/horns/can_draw_on_bodypart` because the
parent `/datum/bodypart_overlay/mutant/can_draw_on_bodypart` override
does the same thing.
## Why It's Good For The Game

Fixes #5631 

## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>

<img width="75" height="100" alt="image"
src="https://github.com/user-attachments/assets/e2939c50-39de-48de-8ffa-da648fa9df85"
/>

</details>

## Changelog
🆑
fix: fixed modsuits hiding horns
/🆑
2026-07-03 14:12:07 -04:00
6c30100e63 Adds a new cybernetic implant to the black market (#96744)
## About The Pull Request

Adds a new cybernetic implant, the nutriment pump implant plus plus
plus! Basically, it just makes you really fat.
<img width="410" height="404" alt="Screenshot 2026-07-01 013026"
src="https://github.com/user-attachments/assets/772c5cb6-d897-4a35-9492-3306ec43d526"
/>

It's a fairly common spawn on the black market. Also I fixed a small
typo I found related to spies scanning drones.

Nutrient pumps (in general) also have a new message instead of "you feel
less hungry" if the person they are feeding isn't currently hungry, but
that won't affect any other pump currently in the game. The black market
pump has the unique ability to bump someone's overeat duration by 40
seconds each time it ticks, which means once you reach completely
stuffed you'll become fat in around 10 seconds instead of 200.

Oh also I added a define for the overeat limit since I kinda needed one
to do the thing

## Why It's Good For The Game

I think it's funny.

## Changelog



🆑
add: Added a new cybernetic implant to the black market, the nutrient
implant pump plus plus plus
spellcheck: fixed a single typo in logs
/🆑

---------

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2026-07-02 11:52:20 +02:00
MrMelbertandGitHub 62ad8d3520 Allows arbitrary/custom/"unlimited" bodypart overlay layers (#96684)
## About The Pull Request

`EXTERNAL_FRONT`, `EXTERNAL_ADJACENT`, and `EXTERNAL_BEHIND` are no
longer bitflags
Instead they are strings, that correspond to the sprite's icon state's
postfix ie `wings_FRONT` / `wings_ADJ`

Bodypart overlays now define their layers in terms of `postfix` to
`rendering layer`
For example wings are defined as:
```dm
	layers = list(
		EXTERNAL_FRONT = BODY_FRONT_LAYER,
		EXTERNAL_ADJACENT = BODY_ADJ_LAYER,
		EXTERNAL_BEHIND = BODY_BEHIND_LAYER,
	)
```
Which translates to
```dm
	layers = list(
		"FRONT" = 2.5,
		"ADJ" = 22.9,
		"BEHIND" = 32.2,
	)
```
## Why It's Good For The Game

What does this mean?

One, you are no longer constricted to the three existing layers when
adding a bodypart overlay. You can decide to put it on whatever layer
you need...
```dm
	layers = list(
		"FRONT" = 2.4, // I specifically need this to render above other front overlays!
	)
```

Two, you can easily add a new layer without needing to mess with core
bodypart code at all
```dm
	layers = list(
		"FRONT_HIGHER" = 2.4, // I need a special layer
		"FRONT" = 2.3, 
	)
```

Three, you don't have to use the `EXTERNAL_FRONT` `EXTERNAL_ADJACENT`
etc. at all if you don't want to. You can organize your layers however
you want...
```dm
	layers = list(
		// I can make my icon states `wings_top` and `wings_bottom` instead of `wings_FRONT` and `wings_BEHIND` to make it easier to parse
		"top" = BODY_ADJ_LAYER, 
		"bottom" = BODY_BEHIND_LAYER, 
	)
```

Ultimately, this makes it a ton easier to work with bodypart overlays,
as you no longer need to learn what FRONT/ADJ/BEHIND means. You can just
add your sprites and define your layers and you're done

## Changelog

🆑 Melbert
refactor: Surprise, a follow up refactor to species part rendering,
report any oddities with them (wings/snouts/tails/etc)
/🆑
2026-07-02 11:41:31 +02:00
a555903ef6 Adds defines for standard lung temperature limits (#96742)
## About The Pull Request

Lung temperature limits now have #defines and the two lungs that have
varying temperature limits now have them written as offsets of the
default. Nothing changes in terms of gameplay.

## Why It's Good For The Game

It's easier to read and consistent with how the rest of the code is,
like with max health of organs being written as regular max hp * 1.5
instead of 150.

Yes, I could've just done away with the whole level 1 2 and 3 thing and
made it so that lungs just had a heat limit multiplier or something to
make it even simpler but that would be a balance change.

## Changelog

🆑
code: added defines for lung temperature limits
/🆑

---------

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2026-07-02 07:10:00 +02:00
cb87e54d93 Lung cleanup ft. minor suffocation tweak (#96659)
## About The Pull Request

### Notable changes

Before: When taking suffocation damage, 3 oxyloss damage is dealt, or
0.66 damage if below 0 health (soft crit threshold). If below 0 hp, and
you have `NOCRITDAMAGE`, gets nullified.
After: When taking suffocation damage, 3 oxyloss damage is dealt,
reduced if you had a partially successful breath (i.e. 75% of a breath =
0.25x damage) or are in soft crit or hard crit (0.22x less damage). If
in crit, and you have `NOCRITDAMAGE`, gets nullified.

Before: You skip 1 in every 4 breaths when your health is below 0 (soft
crit threshold), and skip every breath when your health is below -30
(hard crit threshold)
After: You skip 1 in every 4 breaths when in soft crit, and skip every
breath when in hard crit

Before: You don't heal from successful breaths when below 0 health (soft
crit threshold)
After: You don't heal from successful breaths when in soft or hard crit

### Other changes

- Removed `gasp` from losebreath processing, ie removed chance to gasp
twice in one tick when choking.
- Deletes `respiration_type`s
- Deletes `crit_stabilizing_reagent`
- Deletes species `breathid`, replaces it with `get_breath_type` that
checks the species' lungs

## Why It's Good For The Game

- There was a strange inconsistency where being in crit would
drastically reduce the amount of suffocation damage you were dealt, but
only if you were not breathing. If you were somehow breathing, you took
the full damage. I thought this was a little obtuse, so I wanted to
change it to be consistent: Being in crit is just a multiplier.

- Making them check for `stat` instead of `health` means they affect
people with `NO_SOFTCRIT` or `NO_HARDCRIT` nicer.

- See above.

- Really just to be cleaner, handle gasping in one place.

- I'm not sure why we have `respiration_type`. The only time they're
(practically) referred to is in reagent handling, but there are no
reagents that set it anything but `ALL`. All it does is make our oxyloss
handling made more complicated and harder to read for no purpose. So I
decided to axe it - I think anything special handing that should arise
should just have some bespoke checks instead.

- Nothing set this value to anything else. And guess what, if you
changed it, epinephrine still worked because it applies `NO_CRITDAMAGE`.

- Species de-hardcoding. Makes it easier to add new breath types. 


## Changelog

🆑 Melbert
balance: Suffocation damage is slightly more consistent now: You take 3
oxyloss per suffocation tick, reduced for partially successful breaths
and or if you are in crit. Alternatively, if you are in crit and you
have epinephrine/atropine in your system, it gets nullified entirely.
code: Cleaned up lungs a bit, particularly relating to abnormal lungs
like plasmamen or fish, report any oddities with them.
del: You no longer have a chance to gasp twice in one suffocation tick.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
Co-authored-by: san7890 <the@san7890.com>
2026-07-02 01:59:27 +00:00
Roxy a80c339b26 dont add this timer 2026-06-27 13:06:26 -04:00
MrMelbertandGitHub 21ea64aec5 Height and minor bodypart overlay refactor (#96570)
## About The Pull Request

### Main changes

Height is no longer applied in `apply_overlay`

There is now a proc titled `apply_height()` which is passed an
appearance and a body area, and handles either applying a filter or
adjusting the offset of the appearance up or down

`apply_height` is now called directly when applying item appearances
(ie, `update_worn_x`)
`apply_height` is also called directly in `get_limb_icon` (as height is
included in limb render keys).

### Other changes

Bodypart overlays were cleaned up a bit. You can now apply and remove
bodypart overlays directly with just the typepath, which is a bit more
convenient.

Bodypart textures were split into a separate type. Previously, textures
relied on insertion order to be "correctly" added (any bodypart overlays
added later would not be modified by the bodypart texture). Now

Fixed a bug with cybernetics while I was there. They reskin by changing
DMI so they needed to have their DMI included in their render keys.

## Why It's Good For The Game

This allows us to be more specific and less wasteful about applying
height filters and whatnot - We can now specify whether certain overlays
are offset or given a filter.

For example: In the past, horns and frills were filtered solely because
they were attached to the head and the head was filtered.
We couldn't independently say "Offsets the horns and frills, they don't
need filters".
But now, not only are we able to say "rather than filter the head, just
apply an offset", we can also say "horns and frills should be offset
rather than filtered".

TL;DR fixes the issue where horns or cat ears are cut off by height
filters, yippee.

## Changelog

🆑 Melbert
fix: Cybernetic reskinning should break less. 
fix: Horns and cat ears should be cut off less by height.
fix: Bodypart textures should apply more consistently. 
refactor: Mutant parts like moth wings, lizard tails, cat eats, etc.
have been refactored a tiny bit, report any oddities.
refactor: Bodypart textures were refactored a tiny bit, report any
oddities.
refactor: Refactored the way height works, report anything weird looking
things involving that.
/🆑
2026-06-27 10:28:43 +02:00
SmArtKarandGitHub ad36ae6a68 Fixes eye color overrides not working (#96624)
## About The Pull Request
#95781 broke eye color overrides by defaulting to eyes' own color, which
should instead be a fallback as eyes add their own color as a lowest
priority override to the mob.

Closes #96567 

## Changelog
🆑
fix: Fixed eye color effects not working
/🆑
2026-06-25 18:02:13 +02:00
Roxy de4c3b255d Merge branch 'master' of github.com:tgstation/tgstation into upstream-2026-06-23 2026-06-23 15:51:55 -04:00
mrmanlikesbtandGitHub 21c0b0ce97 Fixes flaky heart create & destroy run (#96409)
## About The Pull Request

The timer's callback was holding onto a reference

closes #96408

## Changelog

No user facing changes
2026-06-11 03:13:18 +02:00
nevimer bb8b9aaaaf another code regression 2026-06-03 18:26:54 -04:00
shayoki f601a6ddaf Merge remote-tracking branch 'tgstation/master' into upstream-6-2-2026 2026-06-03 01:23:54 -05:00
69eaccdbb2 Cybernetic cat ears can no longer be restyled with flesh reshapers (#96263)
Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2026-06-02 17:43:07 +02:00
e68c1edad1 Streamlines Life() a little (#96215)
## About The Pull Request

Main changes

- `handle_mutations` is gone, DNA Injectors are now managed via a status
effect
- `handle_diseases` is gone, disease stages are just handled via life
signal
- `handle_bodyparts` is gone, it was unused and in the future any
implementations should use a life signal
- `spec_life` is gone, the main content of it is now in `human/Life`,
most children implementations now use life signal, zombie tongues now
handle zombie groans
- Life signal was split in two (pre and active)

Other changes

- DNA injector code was cleaned up considerably
- HARS now alerts admins when you inject someone else with it like
Monkey
- `COPY_DNA_SE` is no longer mistakenly unused (meaning stuff like
transformation sting no longer copies "active mutations")

## Why It's Good For The Game

Across the course of a full round we spend the same amount of time doing
literally nothing in life as we spend on handling human breathing.

Now in the context of a full round this is 8 seconds. Which in the grand
scheme of things, not a whole lot, but if we can get a tiny performance
gain from... not doing literally nothing (especially when we can do
these things cleaner with signals) that's a win in my book

## Changelog

🆑 Melbert
refactor: Refactored dna injectors (both the ones that change appearance
and activate mutations), report any oddities with them like failing to
revert your appearance or mutations not applying correctly
code: Ever so slightly changed how diseases tick, report any oddities
code: Ever so slightly changed how some species mechanics tick, like
golems and slimes, report any oddities
code: The code behind printing appearance modifying dna injectors from
genetics has changed, report any oddities
code: Some backend transformation sting code changed slightly, report
any oddities
code: Zombie "idle" groaning is now tied to the tongue rather than the
species itself
admin: Force-injecting someone with HARS give an admin alert, the same
as force-injecting someone with Monkey
fix: Several methods of copying DNA (including transformation sting)
mistakenly copied "active mutations", this has been fixed
/🆑

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2026-05-29 22:48:16 -06:00
TimandGitHub 6c14e428f9 Hearts now regenerate blood (#96129) 2026-05-29 08:31:18 +10:00
BloopandGitHub 34c8730069 Fixes runtime/ race condition with cyberimps (#96225) 2026-05-27 19:47:06 -04:00
FlufflesTheDogandGitHub e83d0cc4c6 Bugsquashing (#96204) 2026-05-26 09:08:36 -04:00
BloopandGitHub e85ebd7fdb Stops internal organs from triggering updates in prefs (#96203) 2026-05-25 20:57:38 -04:00
+37 21b4095dfd [MDB IGNORE] [IDB IGNORE] Upstream Sync - 04/17/2026 (#5453)
Upstream 04/17/2026

fixes https://github.com/Bubberstation/Bubberstation/issues/5549

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: tgstation-ci[bot] <179393467+tgstation-ci[bot]@users.noreply.github.com>
Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com>
Co-authored-by: rageguy505 <54517726+rageguy505@users.noreply.github.com>
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
Co-authored-by: Aliceee2ch <160794176+Aliceee2ch@users.noreply.github.com>
Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
Co-authored-by: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
Co-authored-by: Maxipat <108554989+Maxipat112@users.noreply.github.com>
Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com>
Co-authored-by: SimplyLogan <47579821+loganuk@users.noreply.github.com>
Co-authored-by: loganuk <fakeemail123@aol.com>
Co-authored-by: Leland Kemble <70413276+lelandkemble@users.noreply.github.com>
Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
Co-authored-by: Lucy <lucy@absolucy.moe>
Co-authored-by: siliconOpossum <138069572+siliconOpossum@users.noreply.github.com>
Co-authored-by: Isratosh <Isratosh@hotmail.com>
Co-authored-by: TheRyeGuyWhoWillNowDie <70169560+TheRyeGuyWhoWillNowDie@users.noreply.github.com>
Co-authored-by: Neocloudy <88008002+Neocloudy@users.noreply.github.com>
Co-authored-by: Alexander V. <volas@ya.ru>
Co-authored-by: ElGitificador <168473461+ElGitificador@users.noreply.github.com>
Co-authored-by: Twaticus <46540570+Twaticus@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
Co-authored-by: Cameron Lennox <killer65311@gmail.com>
Co-authored-by: Tim <timothymtorres@gmail.com>
Co-authored-by: Iamgoofball <iamgoofball@gmail.com>
Co-authored-by: Layzu666 <121319428+Layzu666@users.noreply.github.com>
Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com>
Co-authored-by: _0Steven <42909981+00-Steven@users.noreply.github.com>
Co-authored-by: mrmanlikesbt <99309552+mrmanlikesbt@users.noreply.github.com>
Co-authored-by: Ben10Omintrix <138636438+Ben10Omintrix@users.noreply.github.com>
Co-authored-by: John F. Kennedy <54908920+MacaroniCritter@users.noreply.github.com>
Co-authored-by: Cursor <102828457+theselfish@users.noreply.github.com>
Co-authored-by: Josh <josh.adam.powell@gmail.com>
Co-authored-by: Josh Powell <josh.powell@softwire.com>
Co-authored-by: Yobrocharlie <Charliemiller5617@gmail.com>
Co-authored-by: Hardly3D <66234359+Hardly3D@users.noreply.github.com>
Co-authored-by: shayoki <96078776+shayoki@users.noreply.github.com>
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2026-05-16 00:56:00 +02:00
MrMelbertandGitHub 0be65a8a5b Changes how tongues apply TRAIT_SPEAKS_CLEARLY (#96027)
## About The Pull Request

Adds a separate var that tells the tongue it should have
`TRAIT_SPEAKS_CLEARLY` rather than necessitate it being in the
`organ_traits` list

## Why It's Good For The Game

This has caused issues with tongue subtypes twice, so let's not make it
a third time

## Changelog

🆑 Melbert
code: Changes the way tongues allow you to speak correctly to make them
less prone to fault
/🆑
2026-05-11 19:54:18 +02:00
MrMelbertandGitHub 3450f8ba1e Lizard frills are hidden by HIDEHAIR rather than HIDEEARS / Lizard frills are masked like hair by hats (#95986) 2026-05-09 13:23:48 +02:00
MrMelbertandGitHub cee225fecb Moves hair and eyes into standing overlays (#95781) 2026-05-04 22:50:36 +02:00
BloopandGitHub 50c2a2e6eb Fixes blue/green cat ears being switched (#95905)
## About The Pull Request

<img width="502" height="159" alt="Code_uPth7LpFwF"
src="https://github.com/user-attachments/assets/6e0c5f19-d115-4023-a9a3-8847ff4bec07"
/>

## Why It's Good For The Game

Helps the cats name the colors they obviously aren't able to see very
well!

## Changelog

🆑
fix: fixes blue and green cybernetic cat ears being switched
/🆑
2026-04-28 13:07:46 +02:00
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
FinancialGooseandGitHub e98cb75c57 Refactor gasmix mole change into a proc (#95327)
## About The Pull Request
Refactor the majority of the current gasmix mole change use cases into a
proc called adjust_gas which simply adds the designated mole count of
the species into the gas mix while also handling asserting the gas and
garbage_collect()
I also added adjust_multiple_gases and convert_gas() for modifying
multiple gases and within a gasmix

## Why It's Good For The Game
Lemon wanted this to be done as part of the air group refactor 

## Changelog

🆑
refactor: refactored majority of gas_mix mole change into adjust_gas()
proc
/🆑
2026-04-21 13:43:47 -07:00
Y0SH1M4S73RandGitHub a54141bed8 [I **NOT** ded] Heart Eater only works with sentient beings' hearts (+heart ripping). (#95677)
## About The Pull Request

You now only gain the benefits of the heart eater perk by eating a heart
taken from a mob with a mind. In order to make this not completely
useless for any wizard without the Smite spell, the heart eater perk now
grants the user the ability to tear the heart out of incapacitated or
dead carbons by targeting their chest with an empty hand in combat mode.
This can be done on one person at a time per hand, so subtle synergy
with the four arms perk.

## Why It's Good For The Game

Getting 80% damage resistance, stacking linearly with armor to
potentially grant total immunity to conventional sources of damage,
should require a lot of effort and putting yourself into significant
risk of getting killed.

## Changelog

🆑
balance: Wizards with the Heart Eater perk are only invigorated by the
hearts of sentient beings.
add: To facilitate the taking of hearts from sentient beings, the Heart
Eater perk lets you tear the heart out of the chest of an incapacitated
or dead being by targeting their chest with an empty hand in combat
mode.
/🆑
2026-04-20 18:20:59 +01: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
SmArtKarandGitHub 3103f9c413 Adds a Tactical IFF Visor and slightly refactors eye rendering (#95547)
## About The Pull Request

A new cybernetic eye implant, the tactical IFF visor, has been added to
the game, available in the combat implants research node. Its main
features are a cool LED display, dynamic color correction to make
distinguishing important objects easier, and inbuilt IFF systems capable
of distinguishing and highlighting allies and potential threats. They
also give flash/welding protection and mild night-vision capabilities.

However, this comes at a downside of making the user completely unable
to distinguish appearances or voices, or even examine others. Everyone
will simply show up as Unknown and be completely covered in static, bar
the threat assessment outline. Examining will only display their threat
status according to threat settings in the visor.

The parameters for threat assessment (both ID access and security
flag-based), as well as the visor display, can be configured by the user
at any time.

When emagged, the visor will instead completely hide and mute all mobs
except the user themselves, leaving them completely "alone" on the
station.

Deathsquads get an unmodifiable version, configured to treat anyone but
CentCom personnel as hostiles.
Settings can also be adjusted before installation with a multitool, and
locked using a screwdriver, preventing users from accessing them when
installed.

---

Eye rendering has been slightly refactored in order to support the
monovisor, as well as to get rid of duplicate code (and missing
features) on dismembered heads. Also moth eyes once again should block
emissives properly.

## Why It's Good For The Game

New content for both gameplay and roleplay, and fits deathsquad's
purpose very well.
2026-04-13 20:58:40 -05:00
MrMelbertandGitHub 442ad835bc Reverts inertia based space movement (#95536)
## About The Pull Request

Reverts space movement being affected by inertia 

What is kept:

- Items have a varying force on your drift speed, ie heavier items will
move you faster through space, and smaller items, slower.
- Jetpacks can have varying force of impulse - the effect is applied
directly to the mob's `inertia_move_multiplier`
- Tethers are unreverted - they still stop you from drifting too far
from the tether point, however you can no longer 'swing' with them.

What is removed:

- Multiple impulses in the same angle/direction no longer speeds you up.
Only the fastest impulse in 1 direction is accounted for.
- An impulse in a different angle/direction will completely override any
existing impulses, even if they are faster.
- Jetpack stabilizers are once again perfectly capable of immediately
stopping any active impulses.

TL;DR

If you point yourself in a direction you will now go that direction

## Why It's Good For The Game

The concept was fun and had potential but the fight between impulses vs
tiles was very, very clunky and janky.
Multiple fixes were attempted to reduce the jank but it ultimately
nograv still acts very cumbersome and jetpacks are still very
unappealing to use.
Smartkar gave the go-ahead to revert this a while back so, o7. 

## Changelog

🆑 Melbert
del: Zero-gravity drifting is no longer affected by inertia, ie it has
been reverted to what it once was.
/🆑
2026-04-03 15:06:38 +01:00
16aef3a2fd Completely refactors HUD element management and datumizes inventory HUDs (#95119)
## About The Pull Request

This is a port/revival of Kapu's
https://github.com/DaedalusDock/daedalusdock/pull/883
By god, please TM this for a while, as HUDs are rather volatile and I
might've missed something (also the original PR had harddel issues, so
we should probably be on the lookout for those)

Instead of being stored in a metric ton of separate variables, all HUD
elements are now kept in a ``key -> element`` assoc list, and separate
category lists have been turned into a single ``group_key -> list of
elements`` assoc list for easier management.
This massively simplifies HUD creation and management, and allows us to
sanely dynamically modify HUDs without having to keep track of our
elements ourselves (harddel fuel)

I've also noticed that plasma vessels had... interesting, to say the
least, way of managing their HUD and in humans were unable to display
it, which I've changed (the element itself is displayed below stamina in
non-aliens, as latter occupies the spot where you'd normally see it)
Also fixes a bunch of minor unlikely to occur issues with HUD not
updating when it should've sometimes.

## Why It's Good For The Game

The two most important results of this is that A) we can fix the issue
with items larger than 32x32 not displaying properly in inventories (in
a separate PR) and B) this paves the way for datumized inventory slots,
although that is a separate nightmare
Some of this code is also actually over a decade old, and is an absolute
nightmare to work with.

## Changelog
🆑
qol: Non-aliens with an implanted plasma vessel now see their plasma
level in their HUD instead of just the stat panel
refactor: Refactored the entirety of HUD management code, report if
anything breaks!
/🆑

---------

Co-authored-by: John Willard <53777086+JohnFulpWillard@users.noreply.github.com>
2026-04-02 15:20:55 -04:00
Time-GreenandGitHub 25a3a07121 Fixes ethereal revive and species change (#95546)
closes #95542 

Old pipeline:
in crystal > species changes > heart being deleted and owner set to null
> tells crystal to dump the owner > who the fuck is null????????

new pipeline: 
in crystal > species changes > heart being deleted and owner set to null
> tells crystal to just dump whatever is inside > okay no problem

<img width="633" height="144" alt="image"
src="https://github.com/user-attachments/assets/f39ccf34-0be1-4a69-a6bf-c2b35f0670ac"
/>

🆑
fix: Ethereal crystal revive no longer breaks if you change species
midway through
/🆑
2026-03-29 18:00:54 +02:00
RoxyandGitHub 4e2b76ef80 Fix some signal registration issues with arm implants (#95510)
## About The Pull Request

- `COMSIG_CARBON_POST_ATTACH_LIMB` and `COMSIG_KB_MOB_DROPITEM_DOWN`
were not being unregistered on limb removal, leading to duplicate
registration runtimes if the same limb was amputated and then reattached
- `/obj/item/organ/cyberimp/arm/on_limb_attached` early returns if the
attached limb isn't in the implant's body zone i.e. it's unrelated, the
child override `/obj/item/organ/cyberimp/arm/toolkit/on_limb_attached`
calls the parent but doesn't early return if the parent did, leading to
erroneous signal registration on unrelated limbs
2026-03-26 18:23:30 -05:00
MrMelbertandGitHub 599375828e Moves lung scanning code out of healthscan (#95509) 2026-03-26 19:46:30 +01:00
RusselNotSCPandGitHub 4ceac8f297 Classic Cocktails 2: The liqueurening (#95392)
## About The Pull Request
TL;DR: "What do you mean we didn't have a negroni in the game before?"

This adds three new very commonly used liqueurs to the game: A bitter
red aperitivo, an herbal liqueur, and maraschino liqueur. Additionally,
it adds 15 new classic cocktails that use these new liqueurs.
Mechanically relevant drinks include:

- The Poet's Dream, which can grant non-heretics the ability to dream
like them
- The Garibaldi, which grants revolutionaries the determination to shrug
off their wounds
- The Jungle Bird, which soothes the supermatter when ingested by those
around it
- The Thermonuclear Daiquiri, which causes you to glow (and very rarely
emit high-energy nuclear particles)
- and more!

Full list here: https://hackmd.io/@0lHAWBNkSXixU4v6xxYS_w/SkYjyDofbg

![Sequence
01](https://github.com/user-attachments/assets/23066f45-4ab9-4f2c-a16b-1d53bfb09ffb)

On the non-player facing side of things, this also refactors the heretic
dream code a bit and adds a trait that enables non-heretics to have
heretic dreams, which could easily be used by other things (ie if anyone
wanted to make a perk or something that does this)

Also, special thanks to MrMelbert and ChipPotato for helping me out with
coding stuff in the discord!
## Why It's Good For The Game

This is good for the game for more or less the same reasons as my first
classic cocktail PR #92955 is good for the game: More variety gives
bartenders more to do and a greater range of drinks to base gimmicks off
of, and adding more cocktails to the game which are commonly served in
IRL bars decreases awkward, RP breaking moments where someone orders a
cocktail that's a staple you can find just about anywhere but which
isn't in the game. Additionally, the new liqueurs are commonly used in
many other classic and modern cocktails, which people can use to make
cocktails in future projects.
## Changelog
🆑
add: Added three new liqueurs, with bottles available in the
booze-o-mat.
add: Added 15 new cocktails that use the aforementioned liqueurs.
/🆑
2026-03-26 16:12:33 +11:00
SmArtKarandGitHub 8a2b6f937b Converts autosurgeons/robot bodyparts/dissection notes to item_interaction (#95401)
## About The Pull Request

I'm just going by categories and bundling up whichever ones are
relevant, more attackby()s gone

## Changelog
🆑
refactor: Converted autosurgeons/robot bodyparts/dissection notes to
item_interaction
/🆑
2026-03-16 21:34:28 +00:00
SmArtKarandGitHub cd002246ab Fixes ghost poll alerts missing backgrounds (#95363) 2026-03-11 16:00:11 -04:00
BloopandGitHub 38a086093e create_and_destroy will no longer spawn abstract types (#95071)
## About The Pull Request

What it says on the tin-- with having a nice abstract types system now,
we can utilize that in create_and_destroy.

## Why It's Good For The Game

Removes a lot of the need for snowflake item exclusions, and makes this
test likely a lot more stable (and a little faster even).

## Changelog

Not player-facing
2026-03-08 00:34:47 -08: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