Commit Graph
468 Commits
Author SHA1 Message Date
Roxy ce509e0ad5 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-23-10-2025 2025-10-25 15:49:52 -04:00
RoxyandGitHub ebc3271c59 Fix eye organ runtimes in on_mob_remove (#93599) 2025-10-25 11:41:12 +02:00
Roxy e28e9fbdba Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-23-10-2025 2025-10-23 17:38:23 -04:00
b6f901d7f8 Adds an option to have four eyes + Multitool changing Robotic Eye Color (#4005)
## About The Pull Request

Adds a new customization option via preferences, quad eyes!
> Gives the character four eyes with the option of setting the offset up
/ down.

Also gives the multitool the ability to change the eye color(s) (yes
both of them, separately)
## Why It's Good For The Game

Customization is good. Looks neat.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>

+0 offset


![image](https://github.com/user-attachments/assets/03125f56-db87-4d3c-9c9f-632b69d905a5)


![image](https://github.com/user-attachments/assets/fe4b2f6f-669e-4885-94c5-1767c207091b)


![image](https://github.com/user-attachments/assets/e626c52c-d804-4f63-9b88-90cdc0f78fa9)


![image](https://github.com/user-attachments/assets/b38026a0-dc7b-48c8-a508-2755048c7d12)


![image](https://github.com/user-attachments/assets/430f97b3-22f6-43f5-a0f1-5c228dbbdad2)


![image](https://github.com/user-attachments/assets/a87ff58c-f3b6-4ffd-959f-76fa04ffc17d)


![image](https://github.com/user-attachments/assets/5a834225-cef6-4a0b-ab59-f1984c6fb0f4)

</details>

## Changelog
🆑
add: Added new customization option to give a character four eyes.
add: Added the option to change robotic eye colors using a multitool.
/🆑

---------

Co-authored-by: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
Co-authored-by: xPokee <catmc8565@gmail.com>
2025-10-23 02:24:20 +03:00
ArceniuandGitHub 9d551cbcf0 Fix tier 3 stomach/cybernetic (#93567)
## About The Pull Request
fixes a one https://github.com/tgstation/tgstation/pull/89549 not found
or ignored mistake?
2025-10-22 15:40:53 -05:00
GhomandGitHub 07d1ea3771 [NO GBP] Fixes temporary deafness (#93580)
## About The Pull Request
Yeah, if we just use the `+=` operator, the temporary deafness will
never decrease since the addendum will never be below zero. This PR
fixes that.

## Why It's Good For The Game
This will fix #93579 

## Changelog

🆑
fix: Fixed temporary deafness never going away.
/🆑
2025-10-22 19:41:19 +00:00
MrMelbertandGitHub 21a945c299 Fix tongue subtypes (#93574) 2025-10-22 08:06:03 +02:00
GhomandGitHub ca2cc70322 Organ damage refactor/cleanup (#93436)
## About The Pull Request
So, my original goal was just a refactor for the emissive overlays of
eyes, as a way to implement the specular emissive introduced by smartkar
some time ago, but somehow I found myself dragged into a bigger refactor
or cleanup of organ damage, thresholds, failures. One of the main
problem was that there were no procs called when a organ suffered enough
damage to fail or when recovering from failure. It'd just enable or
disable a bitflag, leaving it up to subtypes to decide how to tackle
organ failure their own ways: diverse, funky and sometimes incompatible.
More often than not relying on their very own "update_thingamajig" kinda
procs that run whenever the organ takes damage, rather than just when
the threshold is reached (low, high, failure. There are however a couple
organs with their own quirky thresholds, I let those slide).

There's also a bit of old code, especially for ears, with the
`AdjustEarDamage` and temporary deafness both predating the framework
for organ damage as far as I know. It really needed a coat of fresh
paint.

Oh, there were also more than a handful of organs that still heavily
relied on some ORGAN_TRAIT source instead of the `organ_traits` list and
the two add/remove procs `add_organ_trait` or `remove_organ_trait`. This
include organs that lose or gain specific traits when failing et
viceversa.

~~Lastly, felinids (and the halloween ghost species) having reflective
eyes. It's just a nod to the tapetum lucidum that animals with night
vision often have (including cats), which is why their eyes are a bit
brighter in the dark. Felinids however, do not have night vision (nor do
ghosts). This is merely cosmetic.~~ Cut out for the time being due to
issues with the specular emissive...

## Why It's Good For The Game
Refactoring / cleaning up old organ code.

## Changelog

🆑
refactor: Refactored organ damage code a little. Hopefully there won't
be issues (otherwise report them).
/🆑
2025-10-21 16:52:28 -05:00
necromanceranneandGitHub cbbcd71d78 Cyberbrawlening 2: Electric Boogaloo: Strongarm implants now ACTUALLY improve arm strength (#93442)
## About The Pull Request

Strongarm implants now directly improve your arm's unarmed stats,
improving the upper damage (+2), accuracy (+10) and stamina damage
inflicted while a grabbed target fails to escape a grab (+10).

As a result, strongarm implants do not tack on an extra +5 to the damage
inflicted by its super slam attack. However, this attack now uses
similar math to your standard punches; improved by athletics and the
Strength mutation, [as explained in this
PR](https://github.com/tgstation/tgstation/pull/93125).

Strongarms do not get their damage bonus against Beast mob biotypes, but
retain Mining and Special biotype effectiveness.

Strongarms do not go on cooldown, nor consider the cooldown for the
super slam except when punching human targets. When not punching a human
target, strongarms will always use the super slam.

Adds support for limbs to alter grab states, grab escape chances and
grab punishment damage. This is only actually able to be used by arms as
of the moment. (Maybe one day we'll get tail constrictions if someone is
insane enough to add lamia-like creatures/limbs or something)

## Why It's Good For The Game

The strongarms worked like a pseudo-punch and this often threw players
for a loop as to what they actually do. Many people assumed they
improved the actual power of the arm itself, rather than just being a
vehicle for a special attack.

This basically affirms player assumptions about the implant. Yes, it
does improve the arm strength. Yes, most of the generic improvements to
unarmed attacks improve this one's special attack. They're now closer in
functionality.

This is also my less than thrilling workaround for enabling the borg
punching that [lucy has been
craving](https://github.com/Monkestation/Monkestation2.0/pull/6748) :U

## Changelog
🆑
balance: The strongarm implants now directly improves the unarmed power
of the arm it is implanted into.
balance: The strongarm implant's super slam now uses similar
calculations to normal unarmed attacks, including improvements from
mutations and athletics.
balance: The strongarm always uses the super slam against nonhuman
opponents. It will only go on cooldown, and care about that cooldown,
when used against humans.
/🆑
2025-10-21 14:25:53 +13:00
Roxy d14e538393 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-15-10-2025 2025-10-15 19:34:41 -04:00
EnterTheJakeandGitHub a2c7c8e57b Heretic Antagonist Full Overhaul. (#92119)
## About The Pull Request

Heretic has received a complete overhaul. This PR touches nearly every
aspect of the antagonist. For readability's sake, not every change is
going to be listed in this pull request.

For the full list of changes please refer to the design doc:
https://hackmd.io/@BiST8PJVRjiwVPY86U3bLQ/B11HyChz1g.

Code by Me, @Xander3359 and @Arturlang 

TGUI by @Arturlang 

Sprites by OrcaCora and GregorDM

Writing bits by @necromanceranne 

### Core changes

- Cross-pathing has been removed. Main knowledge spells are now
exclusive to their path (for the most part).

- For every main knowledge unlocked (save for the robes and the blade
upgrade), Heretics can choose one option from a draft of 3 random side
knowledges (this is a free point).

- Heretics can now purchase side knowledges from a new tab, the
"Knowledge Shop". Side-knowledges have been divided by tier (Stealth,
Defense, Summons, Combat and Main). Tiers are unlocked as you progress
toward your main path.

- Heretics now gain the grasp and mark upgrade immediately, but their
main knowledge choices cost twice as much (except for the first spell,
the robes and the blade upgrade).

- Path specific robes have been introduced! They come with their own set
of quirks.

- Each Path has received a passive ability. This passive is upgraded
when you first create your robes, and again when you complete the Ritual
of Knowledge.

- Paths have been rebalanced as a result of the removal of cross-path
progression. Cosmic and Moon paths have received soft reworks.

- Upon unlocking the path 2nd level or reaching a total of 8 points
worth of knowledge, Heretics will lose the ability to blade break (and
the limit on blades all together).

- Ascension now automatically calls the shuttle with no possibility of a
recall.

- Late join Heretic has been removed.

### New UI 
<img width="750" height="635" alt="moon path ui"
src="https://github.com/user-attachments/assets/184ef783-5c9c-48a1-a2f7-4807ca93e990"
/>


### Knowledge shop

<img width="787" height="669" alt="Knowledge shop"
src="https://github.com/user-attachments/assets/3dc89b84-8c70-4d47-b612-54396e3ea6e7"
/>




### Quality of life //General balance changes

- Heretics will now gain X-ray vision for a few seconds when nearby an
eldritch essence (this effect has a cooldown).

- Ritual of knowledge now requires 1 uncommon item instead of 2. You may
now use a stunprod instead of a baton to complete the ritual. Beartraps
have been removed from the list of possible reagents.

- The maximum number of possible sacrifices required to ascend has been
reduced from 6 to 5 while the minimum has been upped to 4.

- Codex Cicatrix no longer requires a special pen to be made.

### Passive abilities

- Heretics now start with a passive ability. You can find what it does
on the path info tab after a path has been selected, and what they gain
when upgraded.

- Crafting your first set of Eldritch robes will bump your passive to
level 2.

- Unlocking the 2nd level will subsequently unlock your "Ritual Of
Knowledge"

- Completing the ritual of knowledge or ascending will net you the final
level.

### Path Specific Robes

- Armorer's Ritual is no longer a side knowledge. Each path will have
their own unique version of the ritual. This is placed after the 2nd
spell in the tree.

- Robes can no longer be destroyed by fire and acid, grant t4 flash
protection (Moth Heretics stay winning) and protection against basic
syringes, to bring them on par with other antagonist's armor sets.

- The recipe to craft the robes is now a set of armor/vest, a mask (any
mask will do now, not just gas masks), plus the unique reagent required
for the blades (Plasma for Cosmic, Trash For Rust, match for Ash and so
on)

- Wearing the robes as a non-heretic may yield some unfortunate
side-effects.

### Moon Path Rework

Moon path  rework.

Moon Heretics gain immunity to brain traumas and slowly regenerate brain
health. Equipping the moon amulette channels its effects through the
moon blade; making it unblockable and cause sanity damage instead of
brute. Ring leader's Rise now summons an army of harmless clones that
explode when attacked; the explosion briefly stuns non-heretics and
cause sanity and brain damage to them. Moon blade can also now be used
when pacified and Moon spells are no longer blocked by regular anti
magic, only mind magic protection.


**Cosmic Path Rework**

Cosmic path has received the biggest batch of changes alongside Moon.
The path has been dead last in ascension and pickrate (less than 5%) for
almost 2 years. It did gain some popularity over the last few months,
reaching the highest ascension rate in the game (12%) while mantaining a
relatively low pickrate.

Cosmic sits in a weird spot, where pretty much every knowledge
surrounding the path is either mediocre or, in the case of the
ascension, dysfunctional. Yet it has maintained a smidge of relevancy
due to how quickly Cosmic heretics can capture and sacrifice targets
thanks to Star Touch.

As a result, the best course of action would be to rebalance the
entirety of the kit; granting the heretic more tools to manipulate space
and dictate the flow of a fight, while lessening their ability to end a
confrontation by instantly sleeping their opponents.

lastly The Star Gazer is now ghost controlled ; And they shoot lazers!

<img width="636" height="451" alt="gazer gag 3"
src="https://github.com/user-attachments/assets/601d6881-c042-4e42-8ce6-ac90cd27848b"
/>


## Why It's Good For The Game


### Ok...but why do we want this?

Again, if you want my full reasoning, please check my doc
https://hackmd.io/@BiST8PJVRjiwVPY86U3bLQ/B11HyChz1g.

To keep it short and concise; Heretic is too complex and unintuitive for
its own good. Too impenetrable for new players and too abusable for
experienced players. This can be chalked up to a lot of poor design
decisions. But ultimately, what I believe being the biggest contributor
to the current status of Heretic is the ability to move into different
paths, also known as "Cross-Pathing".

### Cross Pathing my beloathed.

Cross-pathing, while cool in theory, overcomplicates the antagonist and
overloads them with power. Players dealing with the heretic are
incapable of working out what a given heretic can do. This also leads to
late game heretics having 3 rows Worth of action buttons and virtually
no weakness.

Over the last year, I've often received the understandable but also kind
of unfair accusations of making Heretic too powerful without a clear aim
or purpose.

My goal with the paths I've reworked over the last year (Rust,Void and
Blade) wasn't necessarily to just make them stronger (although that was
also part of the goal, as they were paths that were underperforming),
but for them to have more interactions with the sandbox and to better
live up to the fantasy presented to the player.

If an harbringer of frost gets countered by a cup of coffee, we probably
messed something up.


Unfortunately, the current incarnation of Heretic doesn't really allow
for surgical balance changes to specific paths. Every time a knowledge
gets buffed, we make every path that can easily tap onto that knowledge
stronger by default. It doesn't take a genius to understand why this
system is ultimately unsustainable.

### Blade Breaking

I feel that after a heretic has reached the near peak of their power,
they no longer need the ability to instantly escape any encounter. Check
my doc for my full reasoning.

## Less versatile, more specialized paths.

By removing cross-pathing, we remove a huge maintainability burden from
the antagonist. Paths can now be designed around clearer strengths and
weaknesses. They become easier to balance and less of an headache to
understand for everyone.

It also means we can give paths some needed quality of life quirks
without having to worry how such a change might have a knock-on effect
for other paths.

Ash heretics can finally let loose without dying by their own flames.
Cosmic Heretic can go to space without having to carry a modsuit. Moon
Heretic can use their abilities without fear of one random trauma
ruining their day, and so on.

### What a horrible night to have a curse...., wait how do I curse
people again?

As of right now the heretic tree has quite a hefty amount of trinkets
that pretty much never see use.

Partly because the tree itself is a nightmare to navigate. And partly
because why would anyone set up an elaborate plan or scheme when they
can unleash 2 rows of spell in the span of bunch of seconds.

Heretics mostly gravitate towards powers that push them towards greater,
more potent combat strength. If it doesn't contribute to killing people
quicker, it isn't worth doing for most. And given the opportunity cost
associated for taking those powers, they will remain that way so long as
there are better choices to be poached.

The new draft system encourages Heretics to play more with the tools at
their disposal. If you want to go for a specific combo from the side
path options, you may now do so by tapping into the knowledge shop.

Yes, the shop does include a few knowledges from the other paths. But
these are limited to 1 per path, are very expensive and can only be
unlocked very late into the shift.

## Drip Of the Mansus

The iconic heretic robe is actually sequestered to a side path that is
most easily access by only two paths at a time. Since heretic paths are
being made to be much more specialized, the most obvious way in which
this can be showcased is through an easily
identifiable outfit.

By using the robes, we can both telegraph WHAT heretic you are looking
at, and just how much power they've accumulated and when it is
reasonable to take the kid gloves off and treat them as a genuine
threat. If a heretic is in their
robes, that heretic is now a significantly more prominent danger to the
station.

It also serves as a useful means for gating some of the more powerful
effects of a heretic's path behind the robes, AND enable options for
disarming them of that power should they be captured without making it
something endemic to their mob.

A major problem with heretics is a lack of certainty as to how powerful
they have become. A heretics robes is one of the milestones to help
players dealing with heretics identify that.

### Will this be 100% fair and balanced?

This is a massive overhaul to a pretty complex and bloated antagonist.
I've done my best to show the changes to several maintainers and other
members of the community for their feedback. But at some point we'll
have to see how this behave in the environment to get a feel if
something is over or undertuned. (that's my way of saying, yes this is
likely gonna require a testmerge or two).

What I will say is that I'm not trying to change the core identity of
Heretic.

Heretics should have the upperhand in single encounters early on, be
able to joust a small group of players after they unlock their final
spell, and end the round when they ascend. They're a progression
antagonist. They should retain their payoff as well as pose a danger as
they grow stronger.

But if more players feel like they are more reliably able to play the
antagonist in more varied and interesting ways, rather than the
antagonist largely existing as a measuring stick for 'robustness' due to
its elitist design philosophy, then the rework has been a success. There
should be something for
everyone in the antagonist, as is true for all of our antagonist roles.
2025-10-15 22:34:51 +00:00
ccf799133c Non-admin spawned atlas gravitronic spinal implants now use their intentional(?) sprite (#93428)
## About The Pull Request

so apparently there are two sprites for herculean gravitronics, one with
the core in and one without, but the code for adding a core to the
gravitronic doesn't actually change the sprite so it's unused unless an
admin spawns in an atlas with a core already in it which in that case
it'll have the sprite.

This single line of code makes the sprite change when a new core is put
in.

yes I tested it no it's not a web edit

## Why It's Good For The Game

bugfix

## Changelog

🆑
fix: Atlas gravitronic spinal implants now use their intended sprite
/🆑

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2025-10-14 00:11:18 +02:00
BloopandGitHub 145b70cafc Fixes backwards istype() check (#93420)
## About The Pull Request

Came across this randomly, looks weird, and I think it always just would
evaluate to FALSE which is definitely not the intention.

## Why It's Good For The Game

Fixes a bug

## Changelog

🆑
fix: integrated toolset and integrated paperwork implants can be emagged
for an integrated combat knife and chameleon stamp, respectively (fixed
a bug preventing that from working)
/🆑
2025-10-12 15:25:54 +03:00
Fghj240andGitHub dac24540ec A new type of cybernetic ear, volume-adjusting ears. Also changes the stats of the basic and regular cybernetic ears for consistency (#93362) 2025-10-11 09:10:53 +11:00
MrMelbertandGitHub 6ba755cb44 Felinid ears are randomized properly (#93297)
## About The Pull Request

When more Felinid ear styles were added, no one updated the jank old
randomization code

When Felinid ears were refactored, no one updated the jank old
randomization code

Sooo let's do that shall we? 

1. Species `get_mut_organs` -> `get_organs`, it gets gets all organs the
mob has anyways

2. Prefs `relevant_external_organ` -> `relevant_organ`, it applies to
any organ type

3. Del organ `preference`, the preference itself handles it via
`relevant_organ`

## Changelog

🆑 Melbert
fix: Felinids will randomize their ear type properly
/🆑
2025-10-05 16:21:42 -06:00
xPokee 5e629dff04 Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync 2025-10-03 07:05:54 -04:00
ReturnandGitHub 1277387c68 Reverts Ashtongue removal, Draconic understands it (#4726)
## About The Pull Request
This PR returns Ashtongue as it was before for ashwalkers, and gives
Draconic 30% mutual understanding with Ashtongue. The inverse is not
true.

## Why It's Good For The Game
Ashtongue adds a lot to Ashwalker RP by introducing a language barrier
that can be overcome in various ways.

## Proof Of Testing
Compiles

## Changelog

🆑 ReturnToZender
add: Ashtongue returns, with Draconic able to understand 30% of it. The
inverse is not true
add: Ashwalkers can now select Xenocommon, Sylvan, or Draconic as extra
languages
/🆑
2025-10-02 12:32:53 -07:00
MrMelbertandGitHub e350c50a5c Emp prot tags are more specific, also no longer leak stealthy emp protection (#93211)
## About The Pull Request

Fixes #93199

EMP protection now specifies what it protects

Adds an EMP flag for things which should definitely not indicate they
are EMP proof

## Changelog

🆑 Melbert
fix: EMP proof objects now specify what they protect rather than only
implying it's 100% emp proof
fix: Some objects meant to stealthily be emp proof no longer broadcast
they are emp proof on examine
/🆑
2025-10-02 05:05:57 +02:00
SmArtKarandGitHub 7b3a31b1db Fixes appendicitis not curing on aheal (#93204)
## About The Pull Request

Closes #93161

## Changelog
🆑
fix: Aheals now cure appendicitis
/🆑
2025-10-01 21:13:08 +02:00
Xander3359andGitHub 793018ced1 [NO GBP] Fix the pre-built voltaic heart not having shock immunity (#93201)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request
Fix the pre-built voltaic heart not having shock immunity
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

## Why It's Good For The Game
This is admin-spawn only (I hope?)
But it's still a bug
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
fix: Fixed the pre-built (admin spawn) voltaic combat heart not having
shock immunity
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
2025-10-01 21:10:56 +02:00
71b4dbf7ad Removes Ashtongue; Ashwalkers speak Draconic Again (#4710)
## About The Pull Request

Removes Ashtongue, the language. Ashwalkers speak Draconic again, as TG
design has it.
## Why It's Good For The Game

I beleive TG's design is better than the Skyrat one we inherited. 

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

</details>

## Changelog
🆑
del: removed ashtongue
/🆑

---------

Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2025-09-21 13:23:47 -07:00
xPokee 9b282a850e Merge branch 'master' of https://github.com/tgstation/tgstation into upstream-sync 2025-09-17 11:45:44 -04:00
MrMelbertandGitHub 8a4613b980 Things that iterate cells avoid grabbing abstract cells (like Ethereal stomachs) (#92987)
## About The Pull Request

Anything that iterates contents for all cells now use a new helper,
`get_all_cells`, which only checks equipped items and storage contents
for cells, rather than... everything

This means we avoid grabbing abstract cells, and thus avoid this

<img width="676" height="113" alt="image"
src="https://github.com/user-attachments/assets/955f38e5-7428-477d-ab6a-dcc338960c99"
/>

Note: 

This means these random recharge-all objects (like Xenobio stuff) no
longer recharges Ethereals
If we want these objects recharging Ethereals, we should *probably* add
a bespoke interaction

## Changelog

🆑 Melbert
fix: Things that recharge "all cells on your person" now avoid
recharging Ethereal stomachs, and thus, will no longer cause spontaneous
overcharge or weird chat messages
/🆑
2025-09-15 16:38:54 -07:00
FalloutFalconandGitHub d2f34e33be moves abstract_type up to datum, spawners wont spawn them (#92909)
## About The Pull Request
moves all implementations (im aware of) for "Im a parent type dont spawn
me please" to the datum layer to standardized behavior
adds a standerized proc for filtering out "bad" items that we dont want
spawning. applies to it the subtype vendor, gifts, and a new spawner and
mystery box for a random gun (neither playerfacing)
"port" of https://github.com/shiptest-ss13/Shiptest/pull/4621



https://github.com/user-attachments/assets/22f6f0b2-b44e-411a-b3dc-6b97dc0287aa

small warning: I dont have EVERY abstract type defined right now but,
ive done a good enough job for now. Im tired of data entry rn
## Why It's Good For The Game
standardizing behavior. Might be a micro hit to performance however

having this lets us not rely on icon state to determine whether
something is a parent type and makes it much easier to tell something is
a parent type (could be applied further to things like admin spawning
menus and things like that).

need feedback on if this is actually good for the game.
## Changelog
🆑
add: Soda cans show up in the silver slime drink table.
add: Examine tag for items that are not mean to show up ingame.
refactor: Standardizes how gifts rule out abstract types.
fix: gifts no longer check if something has an inhand, massively
expanding the list of potential items.
/🆑
2025-09-13 00:36:15 +02:00
a8d1925a8b Updates formatting of the paper printed by Autopsies, adds some missing info (#92689)
## About The Pull Request
<details><summary>Updates the paper printed by an Autopsy</summary>

<h5>(It's actually not much longer than the old autopsies could get. It
has only a few new lines, most notably the missing organs it already
should have been listing and Temperature)
(Also it actually has fewer characters than the healthscan still because
of having no color.)</h5>

<h6>I genuinely don't know how to get the Overall to stop stacking like
that. It was suggested it looks better at the bottom as a summary-type
thing, and I think that's true and it does work, but it's hard to format
right with paper width like it is.</h6>

<img width="261" height="680" alt="image"
src="https://github.com/user-attachments/assets/76190f1b-073a-4a61-a2fe-8002aaeb9187"
/>

</details>

<details><summary>
COMPARISONS
</summary>

<details><summary>
New vs Old
</summary>
<h6>Obviously not the same info. I'm not gonna recreate two identical
deaths in seperate code. I'm not crazy!!!
Also I know I missed the virus scan, fwiw the formatting is about the
same as the chemical. About. Ish.</h6>

<img width="523" height="679" alt="image"
src="https://github.com/user-attachments/assets/59057056-5964-4902-bb32-b678333152ab"
/>

</details>

<details><summary>
New vs healthscan
</summary>
<h6>Similar, yes, not identical though. See the PR body.</h6>

<img width="528" height="677" alt="image"
src="https://github.com/user-attachments/assets/e409deee-f327-4bab-a8b3-335999677e08"
/>

</details>
</details>

Now, it's largely comparable to a printed Health Scan. 

It has all its unique features unchanged:
- Colorless advanced health scan (exact numbers of damages)
- Lists all organs/limbs present (even undamaged organs, and with exact
names)
- Shows wound sources
- Lists Chemicals/Diseases in detail

Adds some missing info/QoL to the autopsies:
- Lists Missing Organs (why weren't these listed???)
- Sorts organ/limb lists the same as healthscan
- Shows temperature, genetic stability, and blood alcohol (can inform
how someone died)
- Shows how long they've been dead in realtime (ingame time is neat, but
not at all helpful)
- Ends with a 'Coroner's Notes' section (so the coroner can write info
such as how they think they died)

Still has notable differences, of course: 
- No color (so sad)
- Doesn't list quirks (they are dead their Heirloom is irrelevant)
- No tooltips (it's paper)
- Only possible while dead
- Requires a surgery to get the printout

Hopefully this will give it more usecase outside only boosting surgery
speed. Detectives will appreciate a good coroner's autopsy now.

<h5>(It feels really copy-pastey, but with it mostly just being paper
formatting, I don't know how much CAN be made into unique procs.
Suggestions on how to improve that are welcome.)</h5>

---
Additionally:

**Creates `/mob/living/carbon/human/proc/get_missing_organs()`.** 
Just takes some code from healthscan() and makes it useable elsewhere.
Does what you'd guess. Returns a list of empty organ slots that should
have organs, where key is the ORGAN_SLOT and value is the "name".
**Adds a 'colored' variable to /obj/item/organ/proc/get_status_text()**
Decides if it returns it with color. Autopsies call this with colored
false.
<h6>(See above note about copy-paste. These were two things I could see
that I could minimize copy-paste with)</h6>

## Why It's Good For The Game
These are so fun to do, but are missing **just** enough information to
be kind of irritating without also doing a healthscan.
You shouldn't need to print a healthscan alongside the autopsy, the
autopsy is already the healthscan. _An unhealth-scan, perhaps?_

Hopefully this will make them nicer to use.
_(An autopsy? Not showing missing organs? Crazy.)_

## Changelog

🆑
qol: made Autopsy Reports follow similar formatting to Health Scans, and
adds some information previously missing such as Missing Organs.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-09-10 23:10:08 +02:00
xPokee 939f2fc9ac Merge branch 'master' of https://github.com/tgstation/tgstation into xpokee-test-upstream-sync 2025-09-10 14:12:16 -04:00
nikothedudeandnevimer ee99d0e5b0 Asthma quirk, inhalers - Electric Boogaloo (#92747)
## About The Pull Request

Revival of https://github.com/tgstation/tgstation/pull/79691

A while back, I made this PR, but lost motivation after diving too deep
into the code soup of can_breathe and related procs. Now, I have removed
those parts, and have simplified that part of the code to the point I
think it's ready for review.

Many reviews from the previous PR have been addressed in this PR.

<hr>

<details>
  <summary>Details</summary>

Asthma is a 4 point negative quirk that emulates real life asthma. It
works by slowly decreasing the amount of pressure each breath you take
receives, until your lungs completely seal, ensuring death if you dont
get oxyloss meds/windpipe surgery.

Inflammation (the tracker for intensity) increases whenever you breathe
smoke, use a cigarette, metabolize histimine, or suffer an asthma
attack.

Asthma attacks have a low chance of happening every second, starting 10
minutes after you spawn and with a 20-30 grace period between attacks.
They are "diseases" that cant be outright cured by albuterol, only put
into remission. They increase inflammation at varying rates depending on
their severity, with extreme asthma attacks being a immediate threat to
your life while mild ones might not even cause inflammation. The
response to these is always the same - use your inhaler before you start
choking.

Asthmatics start with a rescue inhaler, a low-capacity inhaler loaded
with albuterol, which I will get to later.

Albuterol is a new medicine thats a little tricky to make but still
doable. It can be efficiently created with inverse convermol, or
transmutated from salbutamol and convermol. The opposite is true, with
albuterol able to be turned into salbutamol. Two canisters are available
in chemvends.

Upon use, it increases the virtual pressure of all breaths taken by 40%.
This allows for you to breathe in lower pressure environments, as well
as enhancing the effects of things like healium.

It's OD causes your diaphram to spasm, causing sporadic losebreath and
forced breathing.

Inhalers are a fancy new reagent application apparatus that uses the
INHALE reagent bitflag.

Inhalers themselves are rather unremarkable, they are merely the method
of using inhaler canisters (they also have a rotary display
approximating the uses left in a canister - just like real life
inhalers).

Inhaler canisters are the reagent containers, and are generally low
capacity. They can only be used in a inhaler, and contain aerosolized
chemicals.

Inhaler canisters and inhalers are unlocked from chemical synthesis, and
are printable for cheap from a medlathe.

In order to use a inhaler, one must uncover the mouth of a carbon and
wait a few seconds (its faster if its a self-application) before a small
amount of the reagents are delivered via the INHALE bitflag. This only
works on things currently breathing - if theyre dead, have no lungs, or
just, arent breathing - it will fail. This includes asthmatics with 100%
inflammation.

</details>

<img width="181" height="74"
alt="282863233-77a7cd6b-44d2-458e-9966-06d485df1521"
src="https://github.com/user-attachments/assets/293b6659-0834-4e9a-b033-cc3b0cfde18e"
/>

<img width="1465" height="202"
alt="282863346-2a247736-0c3a-43b0-a60b-7cff10ce4963"
src="https://github.com/user-attachments/assets/5d9a13dc-b7b2-4de2-adda-8fbc8276e667"
/>

Sprites are not mine; they are from swanni and I can NOT sprite for the
life of me
## Why It's Good For The Game

1. Asthma is just cool. One of my favorite features on bay was the fact
lung damage required you to turn up the pressure on your O2 tank to
survive, and this does precisely that.
2. Its always fun to add new ways to interact with atmos as a player
that arent grossly broken, and I fail to see how a 40% increase of gas
intake will really affect balance too badly.
3. Inhalers are badass.
## Changelog
🆑
add: Asthma quirk, based on IRL asthma
add: Inhalers, a new reagent administering method that uses INHALE
add: Albuterol, a new reagent that increases the amount of gas you
inhale by 40%
balance: Inverse convermol now forms once the reaction is done, not on
metabolize
/🆑

---------

Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
# Conflicts:
#	code/datums/quirks/negative_quirks/allergic.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
2025-09-09 23:24:54 -04:00
fadbf16e1b Asthma quirk, inhalers - Electric Boogaloo (#92747)
## About The Pull Request

Revival of https://github.com/tgstation/tgstation/pull/79691

A while back, I made this PR, but lost motivation after diving too deep
into the code soup of can_breathe and related procs. Now, I have removed
those parts, and have simplified that part of the code to the point I
think it's ready for review.

Many reviews from the previous PR have been addressed in this PR.

<hr>

<details>
  <summary>Details</summary>
  
Asthma is a 4 point negative quirk that emulates real life asthma. It
works by slowly decreasing the amount of pressure each breath you take
receives, until your lungs completely seal, ensuring death if you dont
get oxyloss meds/windpipe surgery.

Inflammation (the tracker for intensity) increases whenever you breathe
smoke, use a cigarette, metabolize histimine, or suffer an asthma
attack.

Asthma attacks have a low chance of happening every second, starting 10
minutes after you spawn and with a 20-30 grace period between attacks.
They are "diseases" that cant be outright cured by albuterol, only put
into remission. They increase inflammation at varying rates depending on
their severity, with extreme asthma attacks being a immediate threat to
your life while mild ones might not even cause inflammation. The
response to these is always the same - use your inhaler before you start
choking.

Asthmatics start with a rescue inhaler, a low-capacity inhaler loaded
with albuterol, which I will get to later.

Albuterol is a new medicine thats a little tricky to make but still
doable. It can be efficiently created with inverse convermol, or
transmutated from salbutamol and convermol. The opposite is true, with
albuterol able to be turned into salbutamol. Two canisters are available
in chemvends.

Upon use, it increases the virtual pressure of all breaths taken by 40%.
This allows for you to breathe in lower pressure environments, as well
as enhancing the effects of things like healium.

It's OD causes your diaphram to spasm, causing sporadic losebreath and
forced breathing.

Inhalers are a fancy new reagent application apparatus that uses the
INHALE reagent bitflag.

Inhalers themselves are rather unremarkable, they are merely the method
of using inhaler canisters (they also have a rotary display
approximating the uses left in a canister - just like real life
inhalers).

Inhaler canisters are the reagent containers, and are generally low
capacity. They can only be used in a inhaler, and contain aerosolized
chemicals.

Inhaler canisters and inhalers are unlocked from chemical synthesis, and
are printable for cheap from a medlathe.

In order to use a inhaler, one must uncover the mouth of a carbon and
wait a few seconds (its faster if its a self-application) before a small
amount of the reagents are delivered via the INHALE bitflag. This only
works on things currently breathing - if theyre dead, have no lungs, or
just, arent breathing - it will fail. This includes asthmatics with 100%
inflammation.
  
</details>

<img width="181" height="74"
alt="282863233-77a7cd6b-44d2-458e-9966-06d485df1521"
src="https://github.com/user-attachments/assets/293b6659-0834-4e9a-b033-cc3b0cfde18e"
/>

<img width="1465" height="202"
alt="282863346-2a247736-0c3a-43b0-a60b-7cff10ce4963"
src="https://github.com/user-attachments/assets/5d9a13dc-b7b2-4de2-adda-8fbc8276e667"
/>


Sprites are not mine; they are from swanni and I can NOT sprite for the
life of me
## Why It's Good For The Game

1. Asthma is just cool. One of my favorite features on bay was the fact
lung damage required you to turn up the pressure on your O2 tank to
survive, and this does precisely that.
2. Its always fun to add new ways to interact with atmos as a player
that arent grossly broken, and I fail to see how a 40% increase of gas
intake will really affect balance too badly.
3. Inhalers are badass.
## Changelog
🆑
add: Asthma quirk, based on IRL asthma
add: Inhalers, a new reagent administering method that uses INHALE
add: Albuterol, a new reagent that increases the amount of gas you
inhale by 40%
balance: Inverse convermol now forms once the reaction is done, not on
metabolize
/🆑

---------

Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2025-09-08 13:31:21 +12:00
BloopandGitHub 5d2102d909 Stops eyelidless corpses from trying (and failing) to blink (#92874)
## About The Pull Request

<img width="1348" height="569" alt="91YPV6s2tG"
src="https://github.com/user-attachments/assets/4c86243e-ac0d-4d39-8646-f55c314bb9d3"
/>

Saw this amusing runtime-dead bodies spawned in the morgue with
randomized injuries have a chance to spawn with eyes that were damaged
so much as to be qdeleted.

The `check_damage_threshold()` proc occurs before the actual damage gets
dealt, so it is possible to enter the blinking procs with eyelids that
have become null. This just adds a safety check for that.

## Why It's Good For The Game

silly bugfix

## Changelog

🆑
fix: dead bodies in the morgue will no longer try to blink
/🆑
2025-09-07 09:39:53 +02:00
MrMelbertandGitHub 135a09182b Refactors obscured (#92779)
## About The Pull Request

Fixes #85028

Obscured flags and covered flags are tracked on carbons, updated as
items are equipped and unequipped. It's that shrimple.

Closes #92760

Just removes the species exception checks for not making sense

Also refactors handcuffs / legcuffs removal. In all of these situations
they were hardcoded when they could easily just use an inventory proc to
work.

## Why It's Good For The Game

Stops a million excessive calls to `check_obscured_slots`

Makes obscured behavior more consistent

Makes obscured behavior easier to use

Cleans up human rendering (There was some cursed stuff before with
render item -> updated obscured -> update body -> cause side effects)

## Changelog

🆑 Melbert
del: Golems which somehow manage to grow wings and somehow manage to
equip something that covers their jumpsuit can no longer fly.
(Seriously, this will not affect anyone)
refactor: Refactored clothing obscurity entirely. Items should be a
loooot more consistent and what covers what, and should update a lot
snappier. As always, report any oddities, like mysteriously disappearing
articles of clothing, hair, or species parts
refactored: Refactored handcuffs and legcuffs a bit, report any odd
situations with cuffs like getting stuck restrained
/🆑
2025-09-07 09:24:34 +02:00
nevimer c9956892db Merge remote-tracking branch 'origin/master' into pupstream-08-19-keepsha
# Conflicts:
#	_maps/map_files/BoxStation/BoxStation.dmm
#	code/_globalvars/lists/flavor_misc.dm
2025-09-03 21:03:51 -04:00
ReturnandGitHub c05c74734e Merges Spinwarder+Interslavic, Chitinclick+Buzzwords (#4527)
## About The Pull Request
Merges Chitinclick and Buzzwords into one language, as well as
Interslavic and Spinwarder, as they overlap with each other.

## Why It's Good For The Game
These languages are effectively the same, and we want players taking
these languages to be able to communicate with each other, to form
comraderie amongst themselves

## Proof Of Testing

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

</details>

## Changelog

🆑 ReturnToZender
qol: Merges Interslavic and Spinwarder into one language
qol: Merges Chitinclick and Buzzwords into one bug language
/🆑
2025-09-03 12:28:50 -07:00
2c23b627fd Gravity sickness no longer causes stuttering (#4579)
## About The Pull Request

This is a salt PR.

Makes gravity sickness, the status effect given by spacer (and to my
knowledge nothing else), cause the holder to be immune to level 1
nausea's stuttering effect.
## Why It's Good For The Game

Spacer is a good quirk. I like it. Adds nice flavor to my character. But
oh my god, the stuttering. The only thing stuttering does it be annoying
and make it hard to talk, which is generally not a very good thing for
"roleplay". Theres a reason very few people take social anxiety and
instead opt to just stutter and stammer with their own fleshy fingers.

This is especially bad on bubber where we have three whole planet maps,
and it seems they're voted very often.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>

<img width="529" height="106" alt="image"
src="https://github.com/user-attachments/assets/645a6382-f750-4642-8857-ab4e272d8e16"
/>


</details>

## Changelog
🆑
balance: Spacer no longer causes disgust stuttering
/🆑

---------

Co-authored-by: Shadow-Quill <44811257+Shadow-Quill@users.noreply.github.com>
2025-09-03 12:22:42 -07:00
Time-Greenandnevimer 147df9ec59 Organ Growing Kit | Coroner Cytology Cargo Content (1/2) (#92108)
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>

# Conflicts:
#	code/modules/clothing/head/tinfoilhat.dm
2025-08-19 22:29:26 -04:00
nevimer 81313b27a5 Merge remote-tracking branch 'origin/pupstream-25-08-08' 2025-08-15 17:36:16 -04:00
aa624df43b Apply suggestions from code review
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2025-08-12 18:09:12 -04:00
WaterpigandRoxy 55504da79d Datumizes DNA blocks, makes DNA cleaner in general (#92061)
Moves all the dna block handling onto singleton datums initialized
inside global lists, to make the handling dna less of a copy-paste mess
and make adding new blocks significantly easier. There is still some
work to be done in the copypaste department but ultimately that falls
under its own PR scope after the core refactor goes through. (Ill
probably do those but it will also be easier for everyone else as the
code is now significantly less of an eyesore)

Both features and identities have been tested through and through, and
seem to be working fine.

Also removed the reliance on weird hardcoded lookup tables for length,
and other similar things that just didn't make sense when I was passing
through DNA code. There's a lot more that fall out of scope for this
exact PR's goal however

I've been told the maintainers will love me for doing this

🆑
code: feature keys are no longer magical strings floating around the
codebase and use proper defines
refactor: DNA blocks are now handled with singleton datums.
/🆑
2025-08-12 13:48:00 -04:00
43fc75facb Organ Growing Kit | Coroner Cytology Cargo Content (1/2) (#92108)
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2025-08-11 18:36:50 +02:00
SmArtKarandnevimer 1ddbd873ef Makes Fluoride Stare less of a meme, fixes lizard blinking (#92426)
## About The Pull Request

Buffs fluoride stare to not be completely unplayable, increasing warning
delay from 30 seconds to 3 minutes, and post-warning grace to 30 seconds
from 10, as well as halving damage per second.
Also fixes lizard blinking being horribly broken, made brain damage
properly update eye blinking instead of you having to wait until an
update_body call to get your brain-damaged blinks.
Additionally, fixes a bug where only roundstart eyes would blink, as
#88300's removal of update_body in eye insertion prevents them from
properly updating their overlays when inserted, thus not granting their
owner passive blinking until forced by another source.

- Closes #90269

## Why It's Good For The Game

Fluoride stare was somewhat of a joke quirk, but people liked the
concept, so it should probably not make you blind in the first five
minutes of the round. Original numbers are extremely detrimental and
require constant micromanaging to the point where you can't do any job
whatsoever.

(cherry picked from commit 3fdc42ba23)

# Conflicts:
#	code/modules/surgery/organs/internal/eyes/_eyes.dm
2025-08-08 15:33:36 -04:00
SmArtKarandGitHub 3fdc42ba23 Makes Fluoride Stare less of a meme, fixes lizard blinking (#92426)
## About The Pull Request

Buffs fluoride stare to not be completely unplayable, increasing warning
delay from 30 seconds to 3 minutes, and post-warning grace to 30 seconds
from 10, as well as halving damage per second.
Also fixes lizard blinking being horribly broken, made brain damage
properly update eye blinking instead of you having to wait until an
update_body call to get your brain-damaged blinks.
Additionally, fixes a bug where only roundstart eyes would blink, as
#88300's removal of update_body in eye insertion prevents them from
properly updating their overlays when inserted, thus not granting their
owner passive blinking until forced by another source.

- Closes #90269

## Why It's Good For The Game

Fluoride stare was somewhat of a joke quirk, but people liked the
concept, so it should probably not make you blind in the first five
minutes of the round. Original numbers are extremely detrimental and
require constant micromanaging to the point where you can't do any job
whatsoever.
2025-08-07 12:46:54 -05:00
Aliceee2chandRoxy fee46ac4ad Fixes tier 3 heart doesnt prevent bleeding (#92352) 2025-08-04 20:53:30 -04:00
SmArtKarandRoxy 064826e87b Fixes fly infusion deleting the last infused organ upon activation (#92267)
## About The Pull Request

Closes #92234

## Changelog
🆑
fix: Fixed fly infusion deleting the last infused organ upon activation
/🆑
2025-08-04 20:53:28 -04:00
Roxy da9b8ba7cb Fixes for #92154 2025-07-30 17:38:34 -04:00
SmArtKarandRoxy 290f326015 Refactors abyssmal eye overlay offseting code (#92154)
Our facial offsets currently regenerate all body icons every time a mob
with a facial offset rotates. This includes eyes and... all underwear,
but is mostly problematic because of former - it means that every time a
mob with eyes and offsets rotates they re-animate their eyelids, which
could cause immense lag when done en-masse (see #90387). We don't have
any human heads that have both facial offsets ***and*** eyes, so this is
mostly futureproofing + could help downstreams.
I fixed it by separating eyes from body into their own layer, and just
readjusting all offsets without recreating them when our mob rotates.

🆑
refactor: Refactored how facial offsets interact with eye rendering,
potentially optimizing future species that use this feature.
/🆑
2025-07-30 17:37:30 -04:00
Aliceee2chandGitHub ee07b0ec86 Fixes tier 3 heart doesnt prevent bleeding (#92352) 2025-07-30 13:11:06 +02:00
SmArtKarandGitHub efd8b7200a Fixes fly infusion deleting the last infused organ upon activation (#92267)
## About The Pull Request

Closes #92234

## Changelog
🆑
fix: Fixed fly infusion deleting the last infused organ upon activation
/🆑
2025-07-30 09:22:32 +02:00
SmArtKarandGitHub 8057cdaad6 Refactors abyssmal eye overlay offseting code (#92154)
## About The Pull Request

Our facial offsets currently regenerate all body icons every time a mob
with a facial offset rotates. This includes eyes and... all underwear,
but is mostly problematic because of former - it means that every time a
mob with eyes and offsets rotates they re-animate their eyelids, which
could cause immense lag when done en-masse (see #90387). We don't have
any human heads that have both facial offsets ***and*** eyes, so this is
mostly futureproofing + could help downstreams.
I fixed it by separating eyes from body into their own layer, and just
readjusting all offsets without recreating them when our mob rotates.

## Changelog
🆑
refactor: Refactored how facial offsets interact with eye rendering,
potentially optimizing future species that use this feature.
/🆑
2025-07-23 22:00:34 -06:00
SmArtKarandRoxy be00ee0e1a Fixes flashlight eyes trying to add nonexistent irises to themselves (#92167)
## About The Pull Request

This adds a FUCK texture to them, which probably should not be
happening.

## Changelog
🆑
fix: Fixed flashlight eyes trying to add nonexistent irises to
themselves
/🆑
2025-07-19 20:29:30 -04:00
SmArtKarandGitHub decee021eb Fixes flashlight eyes trying to add nonexistent irises to themselves (#92167)
## About The Pull Request

This adds a FUCK texture to them, which probably should not be
happening.

## Changelog
🆑
fix: Fixed flashlight eyes trying to add nonexistent irises to
themselves
/🆑
2025-07-18 22:06:53 +02:00
WaterpigandGitHub b01756b97c Datumizes DNA blocks, makes DNA cleaner in general (#92061)
## About The Pull Request

Moves all the dna block handling onto singleton datums initialized
inside global lists, to make the handling dna less of a copy-paste mess
and make adding new blocks significantly easier. There is still some
work to be done in the copypaste department but ultimately that falls
under its own PR scope after the core refactor goes through. (Ill
probably do those but it will also be easier for everyone else as the
code is now significantly less of an eyesore)

Both features and identities have been tested through and through, and
seem to be working fine.

Also removed the reliance on weird hardcoded lookup tables for length,
and other similar things that just didn't make sense when I was passing
through DNA code. There's a lot more that fall out of scope for this
exact PR's goal however

## Why It's Good For The Game

I've been told the maintainers will love me for doing this

## Changelog

🆑
code: feature keys are no longer magical strings floating around the
codebase and use proper defines
refactor: DNA blocks are now handled with singleton datums.
/🆑
2025-07-14 16:51:45 -06:00