## About The Pull Request
Completely removes individual inventory UI handling from mob and HUD
code and moves it to slot datums.
``/datum/inventory_slot`` now is responsible for displaying items on the
player UI and does so through vis_contests as opposed to screen_loc -
which ensures that wide items will display properly rather than be
offset to the right.
Centralized, slot_id based handling allows us to significantly simplify
inventory and HUD code (see how many lines were removed) as you no
longer need to individually track all items for both the HUD owner and
the observer, and makes it easier for us to fully datumize inventory
handling in the future.
Also fixes a bug where observers would see players' storage UI and have
the items linger on-screen after its closed.
## Why It's Good For The Game
Makes working with inventories and HUDs easier, fixes visual issues with
wide items, I need this for human rendering refactors.
## Changelog
🆑
refactor: Refactors inventory UI to be completely datum and
vis_contents-based
fix: Observers should no longer see doubled up inventory UIs
/🆑
---------
Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
## 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>
## About The Pull Request
Digi and snout bodyshape are added and removed if digi or snout is
hidden
There now also exists a digitigrade bodytype which is not removed if the
bodyshape his
Bodyshape is solely used for determining how the body is shaped for
rendering
Bodytype is used for checking stuff like "can digis wear shoes"
This lets us clean up rendering code a bit, allowing us to pass around
bodyshape rather than needing to check our wearer for digi and whatnot
Digi itself is now a component for legs that tracks - on item equip or
unequip - if said items squish the legs.
## Why It's Good For The Game
Right now we do some super jank stuff like updating body every time we
update our jumpsuit which is obviously a bit wasteful
This should make things easier to manage and work with (and maybe more
performant?)
## Changelog
🆑 Melbert
refactor: Refactored how digitigrade and snouts render, report any
oddities with that
/🆑
## About The Pull Request
Stumps inherit the biological state of the bodypart it is spawned from
## Why It's Good For The Game
Right now, since they have a biostate of "nothing", they have all
surgical states, which means you don't have to do any surgery on them to
re-attach them. Which is obviously not intended.
Now they're just inherit (most) biostates from their parent, meaning
re-attaching limbs requires incise -> retract again. Unless the limb had
no bones like skeleton limbs.
## Changelog
🆑 Melbert
fix: Re-adding limbs surgically requires you do surgery again (ie,
incise -> retract -> clamp).
/🆑
## About The Pull Request

This PR adds 16 more wands to the game, try and guess what they all do!
I finished coding this PR 6 weeks ago but it turns out I had to sprite
16 wands after that before I could PR it.
<details>
**Wand of Animation**- It's like the Staff of Animation but doesn't
recharge itself, obviously.
**Rod of Babel**- Grants victims a new random spoken language and then
removes all of their other languages.
**Shearing Rod**- It renders you bald. If you are covering your hair
with a helmet, it pops the helmet off (possibly its most useful effect).
If you're already bald, your bald head will shine brightly and blind
nearby people.
**Party Wand**- Fires projectiles that are incredibly alcoholic. Two of
them will destroy the livers of most targets and kill them (although it
gives them a good leadup time to get that fixed before dying of alcohol
toxicity), so try one at a time if you're just there to have fun.
**Wand of Ice**- Freezes people temporarily, making them really cold and
unable to move. It also spawns slippery ice on impacted tiles.
**Wand of Chaos**- Forces targets to hallucinate from a curated list of
hallucinations. It looks and is named sort of like the Staff of Chaos
just in the hopes that people are more likely to believe that the wizard
did actually just instantly kill them, set them on fire, or turn them
into a demon. Even if it doesn't, a lot of these cause you to stop
moving or be temporarily knocked down or in some other way disoriented.
**Lifting Rod**- Removes gravity from a target for two minutes, which
funcionally immobilises them if they're in the middle of a room or you
can use on yourself to cross big pits.
**Rod of Compassion**- Heals you and your target a little bit, and also
gives you both Pacifism for 30 seconds. This gives you time to talk out
your problems, or deliver a monologue.
**Wand of Snacking**- Turns things into pizza. If fired at a mob, will
put some pizza in their hands and force them to start eating it.
Unlikely to be deadly, but it might spawn mouldy pizza, a food they are
allergic to, ethereal battery acid pizza, or pizza which dismembers you.
**Pestilent Wand**- Confers a transmissible plague which causes you to
periodically cough out vermin of various degrees of danger and hostility
depending on disease level, treated via traditional methods of exorcism.
**Wand of Pratfalls**- Slips and pies the target as well as creating
small amounts of lube foam.
**Wand of Rebellion**- Removes a limb from the target, then animates
that limb. Stop hitting yourself.
**Rod of Repulsion**- Throws things you shoot away from you.
**Switching Rod**- Swap places with the hit atom, as with the spell
Swap.
**Restraining Rod**- Summons a tentacle from the ground to grasp the
target, immobilising them for 20 seconds or until someone helps them.
**Wand of Zapping**- Briefly locks up the target's nerves with lightning
(it's secretly a classic ss13 taser).
</details>
They are available to wizards via the new option "Wand Assortment
(Bargain Bin)" which only costs a single spellbook point, but gives you
an assortment of 6 wands picked at random from this list of new wands
and some of the existing ones.
If you buy two or more sets of wands (and are wearing the wand belt from
the first one) then instead of spawning wands in a belt it will spawn
them in a bandolier, which fits into your backpack or can be worn on a
suit slot.
Wand bandoliers in a suit slot will automatically replace an empty wand
you try to fire with a wand that still has ammo in it.
Several of these wands' projectiles are now also possibilities from
firing the Staff of Chaos (making it more chaotic) and some of them also
have their own Magicarp types.
Also I made it so that if you animate an animating weapon then it
focuses on animating more things instead of shooting its animating bolts
at mobs that are already animate. I could do this for more specialty
wands too at some point (door wand projectiles don't exactly hurt
anyone) but if I do that it'll probably be in a different PR.
## Why It's Good For The Game
A good number of these wands come from a downstream antagonist that's
essentially a lower-threat wizard. I thought these were all fun or funny
effects to have in the game upstream but also not ones that people would
typically want to buy as a dedicated spell (or alternately, that would
be pretty good as a dedicated spell but quite boring), so instead
they're limited use spells that you get in bulk for cheap.
I didn't think we'd really want to bulk up the spellbook with several
different kinds of themed bundle though (and frankly, they don't share
themes), so it's a blind box instead.
The bandolier was added to compensate people for buying random wands
multiple times, so they can have more of a wand-based playstyle.
Now you can spend all of your points on 60 wands (maybe more if you take
the gambling trait...) and be a sort of wizard cowboy, or split them
among your apprentices, or just leave them everywhere like candy and see
whether the crew fuck things up for themselves with their new power I
guess.
## Changelog
🆑
add: Adds 16 more wizard wands to the game, which wizards can buy
cheaply but randomly, or are available via Summon Magic.
add: If a wizard buys more than one set of wands they will receive a
"Wand Bandolier" holster which fits in the backpack or, if worn in the
suit slot, will automatically exchange an expended wand for a full one.
balance: Staffs (and wands) of animation that are animated will try to
animate other objects instead of firing at living mobs, which are
already animated.
balance: Animating a wand of nothing will turn it into a wand of
animation (and animate it).
balance: The staff of chaos can now do more things.
balance: Magicarp now additionally come in Babbling, Frigid, Quantum,
and Weightless varieties. Collect them all!
/🆑
## 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.
## About The Pull Request
- Surgical states applied by wounds don't appear in examine unless the
mob is prepared for surgery
- Surgical state examine text is now slightly smaller
- "Fix bones" surgery operation no longer appears if the patient is
suffering a bone fracture
## Why It's Good For The Game
- QoL: these can really fill up the examine block in contexts which you
really don't care about it.
- QoL: same as above, surgical states aren't that important that they
need to be in big red text.
- QoL: prevent people from thinking that "fix bones" fixes the fracture,
when in reality you're just reversing the "bone sawed" state that the
fracture applies.
## Changelog
🆑 Melbert
qol: Surgical states applied by wounds don't appear in examine unless
the mob is prepared for surgery
qol: Surgical state examine text is now slightly smaller
qol: "Fix bones" surgery operation no longer appears if the patient is
suffering a bone fracture - you will need to "repair fracture" instead.
/🆑
## 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>
## About The Pull Request
If you manually inserted organs into a head (or manually removed it for
that matter) nothing would update the sprite unless you did it manually.
So I put in code to do that for you. This fixes gibbed heads looking
debrained.
## Changelog
🆑 Melbert
fix: Gibbed heads don't look debrained despite having a brain
/🆑
## About The Pull Request
1. Underclothes have all been repathed as
`/datum/sprite_accessory/clothing`
2. Underclothes now have support for GAGS. Currently it ONLY supports
static GAGS colors, ie only preset colors, however prefs support could
easily be added in the future
3. Uses the GAGS support to implement the existing digitigrade
templating system for some undergarmants - lizards will use a generic
template for their underclothings when applicable
Example
<img width="169" height="124" alt="image"
src="https://github.com/user-attachments/assets/30b6689b-13a4-4cf9-811c-0d5d0bd5da59"
/>
## Why It's Good For The Game
Existing undergarmants look really jank on lizards
<img width="170" height="140" alt="image"
src="https://github.com/user-attachments/assets/de0704e0-d403-4bdb-a4c5-432d704b9c99"
/>
<img width="118" height="102" alt="image"
src="https://github.com/user-attachments/assets/7ec47327-c2a9-4a90-aab5-fb57105d5111"
/>
I would like to solve this, and well... the two solutions are "we force
lizards to run around naked" or "we use the cool templating system". The
latter seemed preferable
<img width="165" height="125" alt="image"
src="https://github.com/user-attachments/assets/6a8e4225-10a4-4044-9a12-c220713cd613"
/>
I did yoink the template from the jumpsuit template so it might look too
similar, might need to tweak it
## Changelog
🆑 Melbert
add: Some undergarmants will now use a generic replacement on lizard
body shapes that fit more appropriately
refactor: Refactored how undergarmants generate their icons, report any
oddities with that
/🆑
## About The Pull Request
- The `prosthetic replacement` surgical operation has been reverted to
be closer to how it used to work: The operation is done targeting the
limb that's missing
The change was made out of necessity, as surgical state was tied to
limbs - you had to operate on the chest to re-attach limbs because there
was no limb to operate on.
To circumvent that, I have done the unthinkable of adding stumps when
you are dismembered.
- Missing limbs are now represented as an invisible, un-removable,
un-interactable limb.
Making this change was not as difficult as originally anticipated, and
(at least surface level) seems to have broken very little.
Surprisingly little had to change to make this work.
Direct accesses to `mob.bodyparts` was changed to `mob.get_bodyparts()`
with an optional `include_stumps` argument.
Similarly, `get_bodypart()` had an optional `include_stumps` added.
This means we ultimately barely needed to change anything, and in fact,
some loops/checks were able to be streamlined.
## Why It's Good For The Game
- As mentioned, this change was out of necessity and was easily the
least intuitive part of the broader changes. Reverting it back to how it
used to work should make it far easier for people to pick up on, and
means we can cut out a bunch of bespoke instruction sets that I had to
include.
- The addition of stumps also adds a ton of future potential - code wise
it allows for stuff like better damage tracking (we can transfer damage
between limb <-> stump rather than limb <-> chest), and feature we can
do "fun" stuff like have stumps bleed on dismemberment that you can
bandage.
## Changelog
🆑 Melbert
del: "Add prosthetic limb" surgical operation has been reverted to be a
bit closer to how it used to work - you operate on the missing limb /
limb stump, rather than on the chest.
refactor: Missing limbs are now represented as limb stumps. In practice
this should change nothing (for now), as no features were rewritten to
make use of these besides surgery. Please report any oddities with
missing limbs, however.
/🆑
## 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
/🆑
## About The Pull Request
(Some) tails, snouts, horns and other "solid" bodypart overlays are now
preserved on husked mobs, meaning that lizards or fishpeople will no
longer suddenly lose a chunk of their body when husked. Cybernetic
implants, being inorganic, are not colored and preserver their visuals
in full.
<img width="70" height="97" alt="dreamseeker_8CYayvB8ck"
src="https://github.com/user-attachments/assets/32df4ef4-4d20-4d46-8bf8-ccf043cab3ec"
/>
<img width="95" height="104" alt="image"
src="https://github.com/user-attachments/assets/47171a11-2228-4ef8-9d60-e169794fa6fd"
/>
## Why It's Good For The Game
Husking hasn't been an effective method of anonymizing corpses for a
very long while, and I think that visual consistency here doesn't hurt
it much more while making the game feel more immersive and cohesive.
## Changelog
🆑
balance: Husked mobs now keep some of their bodypart overlays, such as
snouts, tails and horns
/🆑
## About The Pull Request
1. Refactors gauze
Removes gauze var from `/stack`, adds a shared parent between tape and
gauze.
Behavior of "sticking thing on limb" is now a bit more generic, with
there being a component to facilitate it and a framework on `/bodypart`
Closes#92990
2. Adds Tourniquets
A first aid item, when attached to a limb it reduces blood loss from
that limb by 90%.
However while attached you walk slower (if on a leg), interact slower
(if on a arm), and yes, you rapidly die if you put it on your head
Paramedic belts have their starting equipment changed again for the
500th time.
Surgical tape -> Tourniquet
Bone gel -> Bonesetter
<img width="604" height="224" alt="image"
src="https://github.com/user-attachments/assets/443dd5c0-44a3-4ccb-9f6a-c561bbf2fba9"
/>
## Why It's Good For The Game
Adds some more variety for field treatment of bleeding wounds, and in
the future we can add things like "improvised tourniquets" or
"improvised splints" with wooden planks.
## Changelog
🆑 Melbert
add: Adds Tourniquets. While attached to a limb, reduces blood loss from
that limb by 90%, but makes you walk / interact slower. (Or if you put
it on your head, you die.)
add: You can purchase Tourniquets from the premium section of the
medical vendor
add: Paramedic belt setup has changed yet again: Surgical tape replaced
with Tourniquet, Bone gel replaced with Bonesetter.
add: You can use all forms of tape as splint - like Gauze. Will secure a
fracture but won't stop your blood from exiting.
refactor: Refactored gauze entirely, report any strangeness with it (or
tape, or tourniquets)
/🆑
## About The Pull Request
Picking up the work from
https://github.com/Bubberstation/Bubberstation/pull/4672 that has since
gone stale and unadded to the game. PR description will be the same as
previously.
Partial Port of https://github.com/NovaSector/NovaSector/pull/465
reworked to use right clicking on self similar the ghouls rather than a
spell.
Coded as a bounty for Dinklemyr
## Why It's Good For The Game
Similar to Nova's explanation, suitable for a lot of character ideas
who's mechanical limbs can be popped off.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
Unfortunately I don't have the images from the initial PR, but I can
confirm this works as intended.
</details>
## Changelog
🆑SpaceCatSS13, YakiAttaki
add: The cybernetic limb mount quirk has been added, synths and people
with synthetic limbs can now take this quirk to remove their limbs at
their discretion.
/🆑
---------
Co-authored-by: Alexis <catmc8565@gmail.com>
## About The Pull Request
Makes lizard husks swampy green and ethereal husks bright neon green
<img width="187" height="99" alt="image"
src="https://github.com/user-attachments/assets/a9182969-8dc7-4fb5-a55b-8bf30acac730"
/>
Also futureproofed the blood-colored limb overlay element that skeleton
limbs use to work fine if the limb didn't get assigned blood dna (while
its still attached to the owner without being added by butchering)
## Why It's Good For The Game
Preserves visual consistency
## Changelog
🆑
image: Husk visuals now inherit their mob's blood color
/🆑
## About The Pull Request
Blushing's color is generated from blood color, so lizards have green
blushing and whatnot.
<img width="102" height="90" alt="image"
src="https://github.com/user-attachments/assets/b206b29c-f8a8-4dc4-b091-8d7e8f080fc3"
/>
## Why It's Good For The Game
Blushing is when you get more blood in yo face so it wouldn't make sense
to be red(pink) for people without red blood.
## Changelog
🆑 Melbert
qol: Blushing matches blood color, so lizards blush greeeen.
/🆑
## About The Pull Request
TRAIT_DISFIGURED and physical disfiguration are now handled by the head
bodypart rather than being on the mob itself. This is mostly for
internal purposes, but it does mean that:
- Players can now perform plastic surgery on torn off heads.
- Disfigured mobs' heads keep their face hidden, and when attached to a
different body won't magically get repaired and vice versa, attaching a
new head to a disfigured corpse no longer disfigures it.
- Robotic (and other non-huskable) heads no longer become disfigured
from husking
- Also in the rare case of grafting a head torn off from a husk onto
another body, they no longer permanently turn into an Unknown. (lol)
## Why It's Good For The Game
Saner code, we generally want limb-specific behaviors to be on limbs
themselves and not on the mob. Also yeah that one weird edge case.
~~Husks are next on the chopping block~~
## Changelog
🆑
qol: Plastic surgery can now be done on detached heads.
refactor: Refactored how disfiguration is handled to be stored on head's
side
fix: Robotic (and other non-huskable) heads no longer become disfigured
from husking
fix: Attaching a head from a husk to a different body no longer
permanently turns them into an Unknown.
/🆑
## About The Pull Request
If you have a snout (and it isn't already handled elsewhere by your
species), masks will now be pushed 1 whole pixel up and away from you
when facing left or right.
Examples (TOP IS OLD, BOTTOM IS NEW)
(did you know the welding visor has the lizard's snout sticking out the
front)?
<img width="441" height="357" alt="image"
src="https://github.com/user-attachments/assets/5d703afc-2541-4789-956c-f27dc3fdcf31"
/>
I also tried moving it up one tile too, but it didn't look as nice. (To
be clear, these are not the ones being used, the above screenshot is)
(once again top row is old, bottom row is new)
<img width="1443" height="493" alt="image"
src="https://github.com/user-attachments/assets/c7193237-39fb-466b-9dcd-f5db2a646628"
/>
<img width="1138" height="490" alt="image"
src="https://github.com/user-attachments/assets/398154df-3e56-4f59-b350-24a9c9ea04a1"
/>
## Why It's Good For The Game
I think this makes masks fit snouted faces a little bit better?
Currently they sorta clip into the face which is a little bad imo.
## Changelog
🆑
add: Masks now fit snouted species a little bit better, maybe.
/🆑
## About The Pull Request
As limbs rely on ``limb_id`` to fetch their meat info, digi limbs would
fail to do so and be unbutcherable since they use a unique digi ID from
a separate spritesheet. I've separated biological limb effects into a
separate var (or rather made one that acts an override for ``limb_id``),
so now they should be butcherable.
Butchered limbs now respect bodytypes of the original, and have unique
sprites to match that (currently this only matters for digi legs, plus
monkey creampie face sprites)
<img width="85" height="122" alt="image"
src="https://github.com/user-attachments/assets/a8766a62-e3f5-4265-964f-c48164f1bf6c"
/>
While at it I've also made some non-species limbs have butcher results -
living meat now drops a chunk of synthmeat, while psyker heads drop
their owner's original species' meat.
## About The Pull Request
As title says, bones now get a colored overlay corresponding to their
limb's blood color instead of constantly having pink sinew.
<img width="76" height="77" alt="image"
src="https://github.com/user-attachments/assets/e6f8ffb8-fffa-49a8-93ed-77db618ff347"
/>
## Why It's Good For The Game
Doesn't make sense that lizards would still have pink sinew despite
their blood being green
## Changelog
🆑
image: Sinew on bones from butchered limbs now inherits its owner's
blood color
/🆑
## About The Pull Request
Fixes#94117
The "I'm in shadow" indicator alert was dependent on a status effect
being reapplied by `Life()` every 2 seconds. Since we made status
effects tick faster, it now quite realiably ends before it is reapplied
such that players can see the alert animate out and back in.
I fixed this pretty trivially by just adding one status effect subsystem
tick worth of time to the duration so it shouldn't do that any more.
Additionally, there was some code there intended to not display the
indicator to Nightmares (they have their own similar one) but it
expected the Nightmare status effect to always be present first, which
didn't happen. I just made it check specifically for Species instead, as
the only item which applies the Nightmare status effect also changes
your species anyway.
Finally, while I was testing this I noticed that whenever Shadowpeople
or Nightmares examined themselves it would say "You feel like you're
about to pass out!"
This is because it was noticing that they had an unusually low amount of
blood (none), on account of how they don't have blood.
I changed the code so that bloodless mobs will no longer start getting
dizzy at the thought of how they don't have any blood.
## Changelog
🆑
fix: Species that aren't supposed to have blood will no longer report
feeling dizzy from bloodloss on account of how they have no blood.
fix: The "I am stood in the dark" indicator for Shadows and Nightmares
will no longer flicker on and off.
/🆑
## About The Pull Request
Removing one line of code lets ethereals wear underwear. God bless!
## Why It's Good For The Game
This is intended. In the ethereal species module, NO_UNDERWEAR is
already commented out, but coders forgot to remove the same trait
assignment in the surgery module. Also, I need to put my ethereal in the
neko bikini.
## Proof Of Testing
Works locally, compiles and runs fine. Ethereals can wear underclothes.
<details>
<summary>Screenshots/Videos</summary>
<img width="212" height="324" alt="image"
src="https://github.com/user-attachments/assets/3189bb3d-5377-4885-bbc1-9eedaa32a8aa"
/>
</details>
## Changelog
🆑
fix: Lets ethereals wear underwear again.
/🆑
## About The Pull Request
Merry Christmas!
This PR expands on the more gruesome areas of chef content, such as
cannibalism.
Human limbs can now be individually butchered for their meat and skin
with a knife or another butchering implement once the skin has been cut
and retracted (forks now can be used as bootleg retractors). If the limb
contains organs, those will need to be removed first, which also can be
quickly performed with a butchering tool at the cost of damaging the
inhards (head and chest will require the bone to be cut first, which can
be done with a butcher's cleaver if you don't have a saw)
You can also butcher humans whole by right clicking them with a
butchering implement on combat mode, which will attempt to gut/cut apart
the selected limb. Obviously this requires the limb to be prepped first,
so meat hooks/kitchenspikes now allow mobs strung on them to be operated
on without needing drapes. Its a pretty bad spot to be performing
surgeries at though, so beware! Torsos can only be butchered after all
other limbs have been. The gutting/butchering delay is based off the
owner's stat, halving if the limb is detached and doubling if the owner
is still alive and kicking.
<img width="392" height="265" alt="dreamseeker_D7QWbWKStd"
src="https://github.com/user-attachments/assets/050d7c25-3572-4b02-ae93-d8efefe54885"
/>
(The video is too large for github)
https://streamable.com/459a0y
After being butchered, most limbs will leave behind a nonfunctional
skeletal limb (with exceptions like jelly limbs with no skeleton inside)
which is always disabled. Skeleton chests husk their owner, so you'll
need to replace it first.
Gibbers now source their meat from the victim's limbs (and not their
species) at an RNG-based percentage based on the matter bin's tier.
As to allow individual limbs to be butchered, you can now perform (some)
surgeries on individual limbs. There are some obvious restrictions like
zombification or bioware surgeries, but most of the ones that make sense
can be performed on someone's chopped off head as long as you've got the
tools.
Wounds also contribute to surgeries now, major slash wounds count as
cut/open skin (and sealing the vessels would reduce their bleed rate),
and critical blunt wounds count as sawed bones.
I've refactored gibbers, butchering and meat spike code as well as fixed
some backend bugs while I was at it.
## Why It's Good For The Game
While rather gruesome, I feel like the freedom which these mechanics
provide fits us pretty well. We already have plenty of nasty stuff and
this doesn't really go that much further, and a chef serving their own
leg in their dish is pretty funny. (Also you can scrape plasma off
plasmamen bones)
## About The Pull Request
What it says on the tin. `times_fired` is the most unused parameter in
all mob procs. I say most because there were just 2 cases where it was
used
- handling breathing
- handling heartbeat
Besides these 2 cases this parameter did nothing in every proc. Removing
it does 2 things
- Makes those procs more readable as it now has 1 less parameter that
was documented poorly and did nothing
- Makes those procs slightly faster as we are passing 1 less variable to
its parameter call stack
It can easily be substituted with `SSmobs.times_fired` which was its
original value anyways
## Changelog
🆑
code: removes an unused parameter `times_fired` from mob life procs.
Making them function slightly faster
/🆑
## About The Pull Request
Inspired by #94233. `grind_results`(list) & `juice_typepath`(typepath)
are only used when grinding & juicing after which the atom is deleted.
This means if that object is not processed these vars occupy memory &
don't do anything.
Now these values are only generated on demand by calling their
respective procs. Considering how these vars are on the obj level the
memory savings are quite significant
## Changelog
🆑
refactor: grinding & juicing have been refactored to occupy low memory.
Report bugs on github
code: improved grinding & juicing code
/🆑
## About The Pull Request
Splinter of #94324
Plasmamen no longer take 1.5x brute and burn damgae
Plasmamen are now affected by demolition modifier, meaning they take
less damage from sharp objects and more damage from blunt objects
Skeletons and golems are also affected by demolition modifier
## Why It's Good For The Game
As a part of #94324 I was making `MINERAL` mobs affected by demo mod
But I realized this would absolutely murder the heck out of Plasmamen!
1.5x brute + another 1.25x brute from blunt objects!
But then I realized "wait that kinda makes sense... a lot *more* sense
than the arbitrary damage modifier"
So here we are
Plasmemes are as vulnerable to being smashed to bits as before, but can
now boast a minor resistance to being stabbed due to their lack of
fleshy bits
This feels a bit more appropriate to their skeletal nature without
completely removing that aspect of their character. It also gives them a
very minor upside (they need it)
## Changelog
🆑 Melbert
balance: Plasmamen no longer take flat 1.5x brute and burn damage
balance: Plasmamen are now affected by weapon demolition modifier,
meaning blunt attacks deal more damage but slashing or piercing deal
less damage
balance: Skeletons and Golems are also affected by weapon demolition
modifier, as well as any mineral type mobs (of which none currently
exist)
/🆑
## About The Pull Request
1. Golems have a whopping 0.5x modifier to brute and burn damage, but no
longer have a 0.9x modifier to tox / oxy damage.
2. Golems have a new 0.6x modifier to stamina damage and stun duration,
but a new 1.2x modifier to knockdown times.
3. Golems can no longer be defibrillated.
4. Golems can no longer fall into soft crit. They can still hard crit
and die when taking sufficient damage though.
5. When a golem is attacked with brute or burn damage, they sustain
direct nutrition drain. based on how much damage dealt. This is applied
after damage reduction.
6. When a golem's nutrition falls to a low enough threshold, their
nutrition begins to drain faster, until eventually they are forced
unconscious. When a golem's nutrition hits 0, they die.
7. Additionally, golem nutrition drains faster when they pass the normal
soft crit threshold.
8. Golems can be revived by applying materials to their corpse. Each
sheet restores some brute and burn damage, as well as some nutrition.
When sufficient brute, burn, and nutrition are restored, they are
revived.
Also
1. Reduces golem titanium brute reduction slightly (0.7x -> 0.8x)
2. Golems have their own bodyshape
3. Iron no longer heals tox or oxy
Closes#94287
## Why It's Good For The Game
This arose from #94287
I think defibbing golems is a major flavor fail, they're like magical or
some shit and their existence is based around how much material they
have.
This got me thinking. What if nutrition was their "material meter" and
thus their "health bar"?
So here we are:
- Golems are now significantly tankier to physical damage, which I think
fits their flavor a lot more. However, they have to manage their
nutrition to stay upright.
- Golems are now also significantly resistant to stuns, as they are
rocks. However if they are knocked over, getting up is a bit tougher.
This also feels very flavor appropriate.
- Rather than using a defib on a rock to "revive it", you now have to
re-assemble the rock with materials. This makes more sense and is a fair
bit easier for free golems to accomplish.
## Changelog
🆑 Melbert
balance: Golems have a whopping 0.5x modifier to brute and burn damage,
but no longer have a 0.9 modifier to tox / oxy damage.
balance: Golems have a new 0.6x modifier to stamina damage and stun
duration, but also a new 1.2x modifier to knockdown duration.
balance: Golems can no longer be defibrillated. Revival surgery is...
untouched, I guess.
balance: Golems can be revived by applying materials to their body. Each
sheet restores some brute and burn damage, as well as some nutrition.
When sufficient brute, burn, and nutrition are restored, they are
revived!
balance: Golems can no longer fall into soft crit. They can still enter
hard crit and die when taking sufficient damage, though.
balance: When a golem is attacked with brute or burn damage, they
sustain direct nutrition drain based on how much damage dealt.
balance: Golems drain nutrition faster if near starving or below the
normal soft crit threshold.
balance: Golems fall unconscious if starving.
balance: When a golem's nutrition hits 0, they die!
balance: Golems cannot get overweight, but are capped on the amount of
nutrition they can have
balance: The strength of titanium's reduction to brute damage when
consumed by a golem or rock eater has been reduced (0.7x -> 0.8x)
balance: Eating iron no longer heals tox or oxy for golems or rock
eaters (still heals brute and burn)
balance: Golems now have a unique bodytype, making them ineligible for
some surgeries
/🆑
## About The Pull Request
Wounds tried to update their limb's wounds upon said limb being
destroyed during owner's species change, which caused a runtime. We can
optimize wound/limb deletion by preventing update_wounds calls entirely
when the wound is deleted during the limb's own deletion process, as its
bleed stacks or visuals no longer matter at that point. This should save
us plenty of time otherwise spent updating wound and icon data on limbs.
## Changelog
🆑
fix: Fixed runtimes caused by species changes with pre-existing wounds
code: Optimized deletion code for limbs with wounds
/🆑
## About The Pull Request
Empy lists. There are a lot of 'em.
<img width="981" height="512" alt="image"
src="https://github.com/user-attachments/assets/b94b041a-2904-466b-ab89-54bd1de11b4e"
/>
Going through ways to reduce memory I found a few easy ones here. Wires,
the edible component, the seethrough component. None of these are really
a concern when it comes to needing lists in memory for performance
reasons. Wires aren't going to be cut most of the time for each door. A
lot of food does not have any junkiness. Seethrough component lies
dormant most of the round. Etc.
Making lists lazy in these cases should be a no brainer.
Everything I tested still seems to work exactly the same.
## Why It's Good For The Game
Frees memory that is just taking up space a lot of the time.
## Changelog
Not player-facing, this is all under-the-hood stuff.
## About The Pull Request
Extends the part of the crafting unit test that ensures consistency
between the total mats of the components of a recipe (or rather, the
result of said recipe) and a generic instance of the same type as its
result, previously only implemented on food recipes.
## Why It's Good For The Game
This ensures a degree of consistency with the material composition of
various objects in the game. I couldn't do it in the original PR as that
one was too big already and it took months to get it merged, and have
the relative bugs fixed.
Currently a WIP as I slowly deal with the unit test reports.
## Changelog
🆑
refactor: Follow-up to the crafting/material refactor from months ago.
All objects crafted with stacks now inherit their mat composition (not
necessarily the effects and color) by default, while previously only a
few things like chair, sinks and toilets did. Report any object looking
or behaving weirdly as a result.
fix: The material composition of ammo boxes is no longer a 1/10 of what
it's supposed to be. It was a shitty hack to make it harder to recycle
empty ammo boxes. Instead, they lose materials as they're emptied now.
/🆑
## About The Pull Request
Moves eyes to there own folder and makes it so they state there icon
folder rather then it being hard coded
## Why It's Good For The Game
It felt weird that these are lumped into a file that's mostly hair and
that its hard-coded like this. This makes it easier to sort out icons.
(Thinly veiled downstream support)
## Changelog
N/A
## About The Pull Request
It's just a partial cleanup of
anti-[STYLE](https://github.com/tgstation/tgstation/blob/master/.github/guides/STYLE.md)
code from /tg/'s ancient history. I compiled & tested with my helpful
assistant and damage is still working.
<img width="1920" height="1040" alt="image"
src="https://github.com/user-attachments/assets/26dabc17-088f-4008-b299-3ff4c27142c3"
/>
I'll upload the .cs script I used to do it shortly.
## Why It's Good For The Game
Just minor code cleanup.
Script used is located at https://metek.tech/camelTo-Snake.7z
EDIT 11/23/25: Updated the script to use multithreading and sequential
scan so it works a hell of a lot faster
```
/*
//
Copyright 2025 Joshua 'Joan Metekillot' Kidder
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
//
*/
using System.Text.RegularExpressions;
class Program
{
static async Task Main(string[] args)
{
var readFile = new FileStreamOptions
{
Access = FileAccess.Read,
Share = FileShare.ReadWrite,
Options = FileOptions.Asynchronous | FileOptions.SequentialScan
};
FileStreamOptions writeFile = new FileStreamOptions
{
Share = FileShare.ReadWrite,
Access = FileAccess.ReadWrite,
Mode = FileMode.Truncate,
Options = FileOptions.Asynchronous
};
RegexOptions regexOptions = RegexOptions.Multiline | RegexOptions.Compiled;
Dictionary<string, int> changedProcs = new();
string regexPattern = @"(?<=\P{L})([a-z]+)([A-Z]{1,2}[a-z]+)*(Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss)([A-Z]{1,2}[a-z]+)*";
Regex camelCaseProcRegex = new(regexPattern, regexOptions);
string snakeify(Match matchingRegex)
{
var vals =
matchingRegex.Groups.Cast<Group>().SelectMany(_ => _.Captures).Select(_ => _.Value).ToArray();
var newVal = string.Join("_", vals.Skip(1).ToArray()).ToLower();
string logString = $"{vals[0]} => {newVal}";
if (changedProcs.TryGetValue(logString, out int value))
{
changedProcs[logString] = value + 1;
}
else
{
changedProcs.Add(logString, 1);
}
return newVal;
}
var dmFiles = Directory.EnumerateFiles(".", "*.dm", SearchOption.AllDirectories).ToAsyncEnumerable<string>();
// uses default ParallelOptions
// https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.paralleloptions?view=net-10.0#main
await Parallel.ForEachAsync(dmFiles, async (filePath, UnusedCancellationToken) =>
{
var reader = new StreamReader(filePath, readFile);
string oldContent = await reader.ReadToEndAsync();
string newContent = camelCaseProcRegex.Replace(oldContent, new MatchEvaluator((Func<Match, string>)snakeify));
if (oldContent != newContent)
{
var writer = new StreamWriter(filePath, writeFile);
await writer.WriteAsync(newContent);
await writer.DisposeAsync();
}
reader.Dispose();
});
var logToList = changedProcs.Cast<KeyValuePair<string, int>>().ToList();
foreach (var pair in logToList)
{
Console.WriteLine($"{pair.Key}: {pair.Value} locations");
}
}
}
```
## Changelog
🆑 Bisar
code: All (Brute|Burn|Fire|Tox|Oxy|Organ|Stamina)(Loss) procs now use
snake_case, in-line with the STYLE guide. Underscores rule!
/🆑