10126 Commits
Author SHA1 Message Date
Phantastic-SwanandGitHub 07bebff6ac fixes runtime related to barber and lizard gas access (#6122)
## About The Pull Request

The define for barber, lizard gas and a few others was typed as a
number, rather than a string. This was causing list index out of bound
runtimes in certain places, like interacting with the ore silo (for
example, printing circuit boards). This PR fixes it by making the
defines strings, rather than numbers

## Why It's Good For The Game

Fixes runtimes. Also moves stuff from skyrat to bubbers files.

## Proof Of Testing

I used the circuit imprinter on runtime station with the jannie debug ID
and it stopped runtiming. The accesses I've changed are listed properly
now.

<details>
<summary>Screenshots</summary>

<img width="293" height="320" alt="image"
src="https://github.com/user-attachments/assets/0ca862ec-f260-4d0a-b27a-c385fc0e0ca7"
/>

Before, the lizard gas manager ID had its access set as NONE because
they were numbers.

<img width="285" height="319" alt="image"
src="https://github.com/user-attachments/assets/335548ce-9dac-4ac6-872b-3642e1ab7380"
/>

The gas lizard manager ID has access listed properly now.

</details>

## Changelog

🆑 Swan
fix: fixes runtimes related to lizard gas station and barber access.
/🆑
2026-08-20 16:42:23 +02:00
Maia 2c8e9ef580 Merge branch 'master' of github.com:Bubberstation/Bubberstation into upstream-sync-7-22-2026 2026-08-14 19:51:24 +02:00
Maia 8a01d69e7e Various upstream related fixes 2026-08-14 19:44:53 +02:00
4f74148dd3 Tarkon borgs (#6076)
## About The Pull Request

https://github.com/Bubberstation/Bubberstation/pull/3687 Reupload of
this PR. I finished it, it never got merged, i dont remember why. Lots
of my PRs just kinda timed out.

A new Borg subtype, for Tarkon specifically.
has access to lots of dodads, very versatile model with access to
multiple types on one shell.
Not obtainable outside of Tarkon.

## Why It's Good For The Game
Would be fitting thematically if they had their own borgs, plus giving
more utility to one borg on a usually very small crew is good, and them
being able to participate in the bulk of the fighting as more than a
backline medic is nice.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>

Minor reshuffle of the spawn area to acommodate the spawner.
<img width="906" height="871" alt="image"
src="https://github.com/user-attachments/assets/86fb438d-90a1-433b-a7fe-d9f2a82d83bf"
/>

Module choices
<img width="618" height="559" alt="image"
src="https://github.com/user-attachments/assets/28f868c6-e8fe-45a9-9a5f-e2252e84b83d"
/>

Laws and preamble on module selection
<img width="1503" height="253" alt="image"
src="https://github.com/user-attachments/assets/1775da72-fad2-4d47-bdc7-5c753fc10b98"
/>

Attemting to install more than 3 tarkon modules (the limit)
<img width="554" height="68" alt="image"
src="https://github.com/user-attachments/assets/b3b6d4df-72d2-4d3d-8cd2-59b62e4e1db4"
/>


</details>

## Changelog
🆑
add: New Tarkon borgs, jack of all trades
/🆑

---------

Co-authored-by: Odairu <39929315+Odairu@users.noreply.github.com>
Co-authored-by: Waterpig <49160555+Maia-J@users.noreply.github.com>
2026-08-14 19:44:52 +02:00
a4df0d143c limb grower shadekin limbs, design enhancements (#5967)
## About The Pull Request
- [x] Adds shadekin eyes and ears to the limb grower.
- [x] Makes the various species parts available upon research without
having to print 8 different design disks
- [x] Adjust pricing of some bodyparts to be similar to base human parts
- [x] Adds adaptable lungs as researchable expansion for limb grower

## Why It's Good For The Game

Quality of life. Having to print the design disks alongside the limb
grower is pointless, it costs next to nothing materials wise and takes a
bunch of inventory space to do it.

## Changelog

🆑 LT3
add: Added shadekin eyes and ears to limb grower
qol: Limb grower automatically includes species parts, no more species
disks required
add: Adaptive hot/oxy/tox lungs can now be printed from the limb grower
once researched
/🆑

---------

Co-authored-by: Alexis <catmc8565@gmail.com>
2026-08-14 19:43:54 +02:00
OdairuandMaia 7187319a7c Crafting CI, surely I won't have fucked everything up
more items (CI)

Food process CI

ammo CI + battery runtime

might be right, CI will tell me :)

:( borg items and fixing stuff I broke

rations_printer_designs

:(

Biogen Parent Type Additions Pt. 1

Biogen Parent Type Additions Pt. 2
2026-08-14 19:43:54 +02:00
WaterpigandMaia ab5034e97b Replaces waterbreathing with TG's NODROWN (#6069)
## About The Pull Request

TRAIT_NODROWN is basically the same thing, so there's no reason to keep
a weird snowflake check from skyrat.

closes #4623

## Why It's Good For The Game

Less bloated code, and fixes an issue

## Proof Of Testing

I ran around with my akula and it all worked, didn't drown in deep
tiles, and I didn't drown in turf liquids either

## Changelog

🆑
fix: Akulas and other waterbreathers no longer drown in deep water
refactor: TRAIT_NODROWN now fully replaces TRAIT_WATER_BREATHING in the
backend for better consistency for when TG changes stuff.
/🆑

Co-authored-by: Maia <maia@punches.cz>
2026-08-14 19:43:14 +02:00
AlexisandMaia 0b070c1cfa Upstream fixes 2
Linters (Again...)

This SHOULD be the last one needed.

Lewd part overlays now actually show up proper

penis not gone, tits not gone

KiloStation Automapper Stuff - Done by R0bwo

Revert "KiloStation Automapper Stuff - Done by R0bwo"

This reverts commit 14a5f4442d.

Misery

Put me out of my misery
2026-08-14 19:43:08 +02:00
Phantastic-SwanandMaia f215b7eb22 Storyteller config cleanup and finer config control (#6030)
## About The Pull Request

I was very annoyed at there being so many vars and configs on the
storyteller that do absolutely fucking nothing so I removed them. While
I was at it, I decided to fix some configs having wrong names, and add
config control over the storyteller types, so that they can be
controlled more finely via configs, rather than through code.

## Why It's Good For The Game

Removes unnecessary configs that literally do not affect anything, so
that admins don't get confused by tweaking values and not having
anything change. Also makes it easier to control the storytellers via
configs

## Proof Of Testing

It compiled. I checked if the configs properly multiply the thresholds
and they do.

## Changelog

🆑 Swan
config: Added configs for finer control over the various storytellers,
and renamed wrongly named configs. Removed configs which weren't tied to
anything.
/🆑
2026-08-14 19:42:37 +02:00
AlexisandMaia 96857252d9 Fixes Size Collar + Cleanup (#6060)
## About The Pull Request
Oops. Turns out I broke the size collar.
## Why It's Good For The Game
Bugs bad
## Proof Of Testing
See below.
<details>
<summary>Screenshots/Videos</summary>


https://github.com/user-attachments/assets/ab8bc0ee-bea1-41a9-ba80-bfecddd205c1

</details>

## Changelog
🆑
fix: Fixed the size collar.
/🆑
2026-08-14 19:42:37 +02:00
AlexisandMaia 9cec1c732f The Great dna.features["body_size"] Killing (#6042)
## About The Pull Request
Kills every instance of the body_size feature and changes everything to
use current_size, RESIZE_DEFAULT_SIZE, and update_transform.

Also cleans up oversized code big time. The only player-facing change
from this is that the oversized specific organs are now gone.
## Why It's Good For The Game
The oversized code was a mess and having snowflakey features when the
proc and such already exists caused me pain.
## Proof Of Testing
See below.
<details>
<summary>Screenshots/Videos</summary>


https://github.com/user-attachments/assets/017fb9e3-aef9-48ce-a64e-b24a99ae49eb



https://github.com/user-attachments/assets/4cdaa48c-0237-4447-a943-cabb222be25b



https://github.com/user-attachments/assets/3bab0b0c-5098-4d51-b77e-994e21bcf87e


</details>

## Changelog
🆑
del: Removed the oversized specific organs.
/🆑
2026-08-14 19:42:36 +02:00
91a15ba310 Turns the Hemophage Species into a Quirk (#5919)
## About The Pull Request
The goal of this PR is twofold:
1. Remove hemophages as a species.
2. Allow anyone to be a hemophage through the use of a quirk.

Currently, hemophages are somewhat limited in what they can look like
bodyshape wise due to being tied to a species, yet almost all of their
abilities and traits are tied to organs.

To-Do:

- [x] Properly implement the removal of the organs when the quirk gets
removed.
- [x] Test the quirk with the other hemophage specific quirks, possibly
work them into toggles with this quirk.
## Why It's Good For The Game
This helps shorten our list of playable species while keeping the core
aspects of hemophage gameplay able to be done. It also increases
customization potential, yippee.
## Proof Of Testing
See below.
<details>
<summary>Screenshots/Videos</summary>
<img width="1917" height="1004" alt="image"
src="https://github.com/user-attachments/assets/f2b6cb97-1425-4888-a9c4-4a7ed30d74bf"
/>

<img width="619" height="154" alt="image"
src="https://github.com/user-attachments/assets/de0c21f9-bca5-4171-8fc9-d6d28b7e3ea0"
/>

</details>

## Changelog
🆑
del: Removed the hemphage specific quirks Masquerade, Sol Weakness, and
Pseudo-Respiration. They are now toggles on the hemophage quirk.
refactor: Refactored the hemophage species into being a quirk:
Hemophagia.
/🆑

---------

Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com>
2026-08-14 19:42:35 +02:00
AlexisandMaia ae1cc71b34 Initial upstream fixes
Is this even working

Oooough

ok I'll crack at this

couple more fixes

Probably the worst of all my commits so far

Seriously, someone needs to check this.

It compiles

update atmos

stuff

update paths

snakes

linters 1

linters again

more CI

whoops

Update map_previews.dmi

Kills loose limbs

The component it used no longer exists.

podperson

CI Fixes(?)

Linters
2026-08-14 19:42:21 +02:00
cbd0195c22 adds a station trait that allows HOP/RD/CE/CMO/QM to be antags (#5927)
## About The Pull Request
Title + Still keeps Captain, Hos, NTR, Blueshield, and Bridge assistant
as antag restricted
## Why It's Good For The Game
These roles have some COOL items in the uplink exclusive to them + a lot
of times they get away with a lot of things that normal crew would not
because OOC we all know they can't be antag. "The CE is jaws-ing into
your department? well he can't be antag so he probably has a good
reason, better let him in."

It's locked to a station trait, so the possibility is now ALWAYS THERE,
hopefully this puts a little more scrutiny on these 5 roles and what
they're doing.
## Proof Of Testing
<img width="1244" height="977" alt="image"
src="https://github.com/user-attachments/assets/ed6c02e5-628f-4fc0-bd41-05b45aee1bc9"
/>
<img width="1221" height="975" alt="image"
src="https://github.com/user-attachments/assets/917c0f3f-a4e7-4a6d-8f4b-2267d2ae4c85"
/>

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

</details>

## Changelog
🆑
add: a station trait that allows heads of staff to be antags
/🆑

---------

Co-authored-by: Alexis <catmc8565@gmail.com>
2026-08-11 10:11:44 +02:00
9e638c4dd3 Tarkon borgs (#6076)
## About The Pull Request

https://github.com/Bubberstation/Bubberstation/pull/3687 Reupload of
this PR. I finished it, it never got merged, i dont remember why. Lots
of my PRs just kinda timed out.

A new Borg subtype, for Tarkon specifically.
has access to lots of dodads, very versatile model with access to
multiple types on one shell.
Not obtainable outside of Tarkon.

## Why It's Good For The Game
Would be fitting thematically if they had their own borgs, plus giving
more utility to one borg on a usually very small crew is good, and them
being able to participate in the bulk of the fighting as more than a
backline medic is nice.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>

Minor reshuffle of the spawn area to acommodate the spawner.
<img width="906" height="871" alt="image"
src="https://github.com/user-attachments/assets/86fb438d-90a1-433b-a7fe-d9f2a82d83bf"
/>

Module choices
<img width="618" height="559" alt="image"
src="https://github.com/user-attachments/assets/28f868c6-e8fe-45a9-9a5f-e2252e84b83d"
/>

Laws and preamble on module selection
<img width="1503" height="253" alt="image"
src="https://github.com/user-attachments/assets/1775da72-fad2-4d47-bdc7-5c753fc10b98"
/>

Attemting to install more than 3 tarkon modules (the limit)
<img width="554" height="68" alt="image"
src="https://github.com/user-attachments/assets/b3b6d4df-72d2-4d3d-8cd2-59b62e4e1db4"
/>


</details>

## Changelog
🆑
add: New Tarkon borgs, jack of all trades
/🆑

---------

Co-authored-by: Odairu <39929315+Odairu@users.noreply.github.com>
Co-authored-by: Waterpig <49160555+Maia-J@users.noreply.github.com>
2026-08-10 00:00:47 +02:00
332cca2dea limb grower shadekin limbs, design enhancements (#5967)
## About The Pull Request
- [x] Adds shadekin eyes and ears to the limb grower.
- [x] Makes the various species parts available upon research without
having to print 8 different design disks
- [x] Adjust pricing of some bodyparts to be similar to base human parts
- [x] Adds adaptable lungs as researchable expansion for limb grower

## Why It's Good For The Game

Quality of life. Having to print the design disks alongside the limb
grower is pointless, it costs next to nothing materials wise and takes a
bunch of inventory space to do it.

## Changelog

🆑 LT3
add: Added shadekin eyes and ears to limb grower
qol: Limb grower automatically includes species parts, no more species
disks required
add: Adaptive hot/oxy/tox lungs can now be printed from the limb grower
once researched
/🆑

---------

Co-authored-by: Alexis <catmc8565@gmail.com>
2026-08-09 21:14:04 +02:00
2e35a9c9e1 Replaces waterbreathing with TG's NODROWN (#6069)
## About The Pull Request

TRAIT_NODROWN is basically the same thing, so there's no reason to keep
a weird snowflake check from skyrat.

closes #4623

## Why It's Good For The Game

Less bloated code, and fixes an issue

## Proof Of Testing

I ran around with my akula and it all worked, didn't drown in deep
tiles, and I didn't drown in turf liquids either

## Changelog

🆑
fix: Akulas and other waterbreathers no longer drown in deep water
refactor: TRAIT_NODROWN now fully replaces TRAIT_WATER_BREATHING in the
backend for better consistency for when TG changes stuff.
/🆑

Co-authored-by: Maia <maia@punches.cz>
2026-08-07 08:02:31 -04:00
Phantastic-SwanandGitHub 8d7f91751c Storyteller config cleanup and finer config control (#6030)
## About The Pull Request

I was very annoyed at there being so many vars and configs on the
storyteller that do absolutely fucking nothing so I removed them. While
I was at it, I decided to fix some configs having wrong names, and add
config control over the storyteller types, so that they can be
controlled more finely via configs, rather than through code.

## Why It's Good For The Game

Removes unnecessary configs that literally do not affect anything, so
that admins don't get confused by tweaking values and not having
anything change. Also makes it easier to control the storytellers via
configs

## Proof Of Testing

It compiled. I checked if the configs properly multiply the thresholds
and they do.

## Changelog

🆑 Swan
config: Added configs for finer control over the various storytellers,
and renamed wrongly named configs. Removed configs which weren't tied to
anything.
/🆑
2026-08-06 14:19:13 +02:00
AlexisandGitHub 8cd86978fe Fixes Size Collar + Cleanup (#6060)
## About The Pull Request
Oops. Turns out I broke the size collar.
## Why It's Good For The Game
Bugs bad
## Proof Of Testing
See below.
<details>
<summary>Screenshots/Videos</summary>


https://github.com/user-attachments/assets/ab8bc0ee-bea1-41a9-ba80-bfecddd205c1

</details>

## Changelog
🆑
fix: Fixed the size collar.
/🆑
2026-08-05 12:56:07 -04:00
AlexisandGitHub c5a8e04a7e The Great dna.features["body_size"] Killing (#6042)
## About The Pull Request
Kills every instance of the body_size feature and changes everything to
use current_size, RESIZE_DEFAULT_SIZE, and update_transform.

Also cleans up oversized code big time. The only player-facing change
from this is that the oversized specific organs are now gone.
## Why It's Good For The Game
The oversized code was a mess and having snowflakey features when the
proc and such already exists caused me pain.
## Proof Of Testing
See below.
<details>
<summary>Screenshots/Videos</summary>


https://github.com/user-attachments/assets/017fb9e3-aef9-48ce-a64e-b24a99ae49eb



https://github.com/user-attachments/assets/4cdaa48c-0237-4447-a943-cabb222be25b



https://github.com/user-attachments/assets/3bab0b0c-5098-4d51-b77e-994e21bcf87e


</details>

## Changelog
🆑
del: Removed the oversized specific organs.
/🆑
2026-08-04 09:00:41 -07:00
96d60afb47 Turns the Hemophage Species into a Quirk (#5919)
## About The Pull Request
The goal of this PR is twofold:
1. Remove hemophages as a species.
2. Allow anyone to be a hemophage through the use of a quirk.

Currently, hemophages are somewhat limited in what they can look like
bodyshape wise due to being tied to a species, yet almost all of their
abilities and traits are tied to organs.

To-Do:

- [x] Properly implement the removal of the organs when the quirk gets
removed.
- [x] Test the quirk with the other hemophage specific quirks, possibly
work them into toggles with this quirk.
## Why It's Good For The Game
This helps shorten our list of playable species while keeping the core
aspects of hemophage gameplay able to be done. It also increases
customization potential, yippee.
## Proof Of Testing
See below.
<details>
<summary>Screenshots/Videos</summary>
<img width="1917" height="1004" alt="image"
src="https://github.com/user-attachments/assets/f2b6cb97-1425-4888-a9c4-4a7ed30d74bf"
/>

<img width="619" height="154" alt="image"
src="https://github.com/user-attachments/assets/de0c21f9-bca5-4171-8fc9-d6d28b7e3ea0"
/>

</details>

## Changelog
🆑
del: Removed the hemphage specific quirks Masquerade, Sol Weakness, and
Pseudo-Respiration. They are now toggles on the hemophage quirk.
refactor: Refactored the hemophage species into being a quirk:
Hemophagia.
/🆑

---------

Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com>
2026-07-31 12:50:53 -04:00
Alexis 88e84645b1 Merge commit '6b52b564a50e4f3091470529c683587e5de15d49' into upstream-sync-7-22-2026 2026-07-22 13:39:09 -04:00
6508994fdf Cabbage's Armory (#5757)
## Main Additions and Modifications
This PR adds in a quite a few new things.
### Overview
**WT-550 "Enhancements"** - made available via research. These
modifications retain the full-auto capability of the WT-550 to varying
degrees. Additionally a compressed WT550 magazine is available via
research. It contains 40 weaker bullets compared to the normal
magazine's 20. It is only allowed to contain compressed bullets to avoid
cheesing, and requires bluespace to fabricate. It is designed as a
sustained dps ammunition as opposed to a high dps ammunition
**WT-550-B** - Shoots in bursts with decent recoil and slightly higher
dps.
**WT-550-C** - Shoots slower but has a higher damage and projectile
velocity along with a scope.
**Sawn-off WT-550** - Is smaller but has egregious recoil and spread.
**.38 BR** - A simple but slightly less powerful alternative to the
NT-38 battle rifle. Craftable via a kit obtained from research.
**Stunstaff** - A weapon that is available via crafting and functions as
an alternative to a baton and riot shield. A heroic variant exists
within the code but the recipe can only be learned from a book that
sometimes spawns in the armory contraband closet.
**Advanced Energy SMG** - A hybrid of a disabler SMG, laser carbine, and
advanced energy gun. Does exactly what you think it does. Obtainable via
crafting.
**Stingballer** - A rifle that rapidly shoots stingballs. Direct damage
is lesser than a stingbang. Purchasable from cargo.
**Security Juggernaut Suit** - A heavily armoured suit that severely
cripples your mobility in exchange for very high protection. Crafting
kit is printable from a technode.
**Horizon Beam Rifle** - Damage is now 110 with 35 armor piercing, and a
demo mod of 2. Upon contact with walls, it destroys them like how a
pulse laser does.

### Crafting
WT-550 weapons can all be made with just the gun and the kit.
The sawn-off WT550 can be made by taking a saw to the WT550.
The .38 BR requires an NT-38 battle rifle along with a multitool and a
screwdriver.
The Advanced Energy SMG requires a disabler smg, laser carbine, and an
advanced energy gun.
The Stunstaff requires two security batons, some plasteel and some
cable, along with a welder and wrench.
The Heroic Stunstaff requires some other ingredients.
The Security Juggernaut suit requires a full toolbox of tools as well as
the armor plates, a full coil of cable, a pair of magboots, a swat
helmet, a swat suit, and two seclites.
Stingbangs can be prepared into stingball canisters with a screwdriver
and some wirecutters. Each contains 25 rounds are are used to fill the
stingballer.

### Cargo
**Stingballer** - Armory crate - Contains one stingballer. - 4500
credits.
**Grenade Launcher** - Armory crate - Contains one grenade launcher and
a box of flashbangs. - 15000 credits.
**Kiboko Grenade Launcher** - Armory crate - Contains one Kiboko grenade
launcher. - 7500 credits.

### R&D
The **"Ballisitic Research"** technode has been removed and dragon's
breath shells have been moved to the illegal technology node. The node
remains within the code though if more exotic ammunition is developed
and requires an additional research node for it.
New **"Advanced Ballistics"** technode contains the part kits for the
WT-550 modifications and NT-BR simplification kit and requires Exotic
Ammunition to research.
New **"Advanced Armor"** technode contains the Security Juggernaut
Plates and requires Riot Suppression and Gas Compression to research.

### Code
Adds to the buckling system where if something has TRAIT_NO_BUCKLE, it
cannot be buckled at all.
Adds to the vehicle system where if something has TRAIT_NO_VEHICLE, it
will be flung off the vehicle it attempts to move the vehicle
themselves.
Adds to the chair system where if something has TRAIT_NO_VEHICLE, it
will destroy the chair.
Adds to the movement system where if something has TRAIT_LARGE_CLOTHES,
TRAIT_BULKY_CLOTHES, or TRAIT_HUGE_CLOTHES, it will incur a 3, 4, and 5
move speed multiplier when pulling that thing. If anyone can help me do
this more modular, please reach out, I have no clue how.
Edits the equipment slowdown system to properly apply a special slowdown
that cannot be negated by anything. Requires the TRUE_IMMUTABLE_SLOW
bubber_obj_flag to be present. IMMUTABLE_SLOW is still required for red
potion immunity.

### Other Misc. Changes
The WT-551 has been effectively rendered impossible to get. This
decision stems from the fact that the WT-550 and the WT-551 were
functionally identical when used in-game. Instances of the 551 have been
replaced with the 550.
Skyrat's renaming of /tg/ bullets has been completely removed. Some
descriptions have been kept and altered because they were kinda neat.
.460 Ceres -> .45
.416 Stabilis -> .50 BMG
8mm Usurpator -> 4.6x30mm
.454 Trucidator -> .50 Action Express
.277 Aestus -> .223

## Statistics For New Additions
**Stunstaff**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/0e1c2a1a-20ba-47a9-91f1-e63ca11b5e43"
/>
- Two-handed, bulky. Fits on the back and an armor vest.
- 65 stamina damage
- 20 stun armour penetration
- 14 force
- 8 throw force
- 50 block chance
- 20 effective block vs tackles
- 10 effective block vs projectiles

**Heroic Stunstaff**
- 24 stamina damage
- 0.5 second stun
- 4 times the cell charge consumption
- No cooldown between stuns
- 35 stun armor penetration
- 15 force
- 10 throw force
- 75% throw stun chance
- Can be thrown like a boomerang
- 75 block chance
- 30 effective block vs tackles
- 50 effective block vs projectiles

**WT-550-B**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/56fea4dd-9b0c-4e06-93a7-b0389f3d32c9"
/>
- Bulky sized, small weapon weight, dual wielding.
- 2 round burst every 0.5 seconds
- 0.25 recoil
- 3 spread
- Can be suppressed

**WT-550-C**
<img width="48" height="32" alt="image"
src="https://github.com/user-attachments/assets/bd80570d-3e70-463d-8b6b-7cefcb1d54e6"
/>
- Bulky sized, heavy weapon weight, no dual wielding.
- Half fire rate of normal WT (0.6 compared to 0.3)
- 1.5x damage multiplier
- 1.5x projectile speed multiplier
- +5 projectile wound bonus
- Can be Suppressed
- Mediocre Scope

**Sawn-off WT-550**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/6d786022-2d93-42da-9dcc-fe6dfadbbce1"
/>
- Normal sized, light weapon weight, dual wielding
- 10 spread
- 20 dual wielded spread
- Sawn-off recoil (high)

**Compressed WT-550 magazine**
- 40 capacity
- 12 damage (20 for normal rounds)

**Stingballer**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/de30bda5-9e0b-44da-8097-ca9827d3d8c8"
/>
- Bulky sized, normal weapon weight, no dual wielding.
- 8 rounds per second
- 7.5 spread
- 50 round capacity
- 1.5 damage
- 4 stamina damage
- Embed chance at close range
- Bouncy projectile
- Low effective range

**.38 Battle Rifle**
<img width="48" height="32" alt="image"
src="https://github.com/user-attachments/assets/24a9a257-97fe-4313-ba39-93d17230f1b4"
/>
- Overall same statistics as the NT-38 Battle Rifle except for
- 1.0x damage multiplier (compared to 1.2x)
- 1.0x projectile speed multiplier (compared to 1.2x)
- 25.0% faster rate of fire (1.5 compared to 2)
- No degradation mechanics
- No scope

**Advanced Energy SMG**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/2671009a-a994-4054-92ff-4db2959501e8"
/>
- Bulky Size, no dual wielding.
- 0.8x damage multiplier (12 on kill, 12 on disable)
- 1.2x projectile speed multiplier
- 40 shots on kill, 40 shots on disable
- Charges about half as fast as the regular advanced energy gun.
- Same fire rate as the disabler SMG
- 2 spread

**Security Juggernaut Suit**
<img width="32" height="32" alt="image"
src="https://github.com/user-attachments/assets/5de0a084-4a07-4d8f-88a3-d9996de41010"
/>
- Built in helmet
- Helmet protects head from flashes, loud noises, impacts and
pepperspray
- Full temperature and pressure protection
- Helmet has powerful flashlight mounted
- Takes 12 seconds to put on, 15 to put on someone else
- Slows you down everywhere
- Slows you down when in-hand
- Slows down someone who's dragging you
- Prevents aggressive grabs against you when worn
- Prevents combat-mode pushing against you when worn
- Prevents shove knockdowns when worn
- Prevents gravity effects when worn
- Prevents buckling when worn
- Cannot be red potion'd.
- Does NOT protect against batons or knockdown.

Current Armor values:
- melee = 80
- bullet = 80
- laser = 70
- energy = 60
- bomb = 100
- bio = 100
- fire = 100
- acid = 100
- wound = 30

## Why It's Good For The Game

This PR adds in quite a few items that fill certain role archetypes
within security while allowing them to still use equipment that security
would already have.

## Proof Of Testing

Testing overall has been completed.

Testing left to do:
- [x] Cargo Orders

## Changelog
🆑
add: Added a bunch of alternative additional weapon and equipment
upgrade options to security, allowing a little bit of difference in the
late-game arsenal or general armament.
add: Adds the WT-550-B and WT-550-C, upgrades to the classic autorifle.
add: The WT550 can now also be sawn-off.
add: Adds the Stingballer, a close range weapon that rapidly shoots
stingballs.
add: Adds the Stunstaff, an aura-farming alternative to the classic
baton and shield.
add: Adds the Advanced Energy SMG, an a modified AEG that gains
rapid-fire capabilites.
add: Adds the Security Juggernaut suit, an impossibly slow suit that
hinders your movement but has some of the best armour you'll ever see.
add: Adds the .38 battle rifle, a simplified NT-38 Battle Rifle. Lacks
the combat improvements, but does not degrade.
balance: The Horizon Beam Rifle's performance has been tweaked. Damage
is now 110, with 35 armor penetration and a demolition mod of 2, as well
as the ability to destroy walls like pulse rifles.
add: The Kiboko and pneumatic grenade launcher can be bought from cargo
now.
del: The WT-551 has be completely removed and replaced with the WT-550
del: Any instances of Skyrat's ammunition naming system have been wiped.
Please report any inconsistencies you may find.
/🆑

---------

Co-authored-by: Cabbage <supredoode@gmail.com>
Co-authored-by: Mathilde <146444134+ibexgoetia@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2026-07-19 12:24:29 -07:00
bf98195fda Ghosts can see more info on health scan (#96792)
## About The Pull Request

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

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

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

## Why It's Good For The Game

Ghosts should be able to see everything, I think

## Changelog

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

---------

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2026-07-17 00:07:13 +02:00
ee6818f4df Replaces Immunosilence with sepsisillin, nerfs aggressive healing. (#96972)
## About The Pull Request

Attempts to balance aggressive healing by slightly cutting back on its
incredible constant healing (which is still doable because I don't have
the heart to kill virology uses) and removes immunosilence because we
already have a chem that does that. Sepsisillin pills are mapped into
virology to take its place.

## Why It's Good For The Game

With immunodeficiency, an aggressive healing virus with high severity
becomes incredibly powerful. The combination of chills and fever to buff
severity while they cancel each other out along with a second symptom
like nocturnal regen (because you have the stats for it) makes
aggressive healing too powerful in the right situation but too weak for
everyone else.

Aggressive healing was given high stats under the assumption that they
were necessary to resist natural recovery in hosts that aren't
immunodeficient. That was probably a mistake since it also makes it a
buffer symptom stronger than any other, so its stats are heavily tuned
down.

Immunosilence was removed (because it's just sepsisillin) and
sepsisillin pills were mapped into virology in order to let people
without immunodeficiency be able to better benefit from aggressive
healing. Immunosilence was rather ineffective at its job because it
still let viruses regress to their first stage, which disables your
healing. Sepsisillin can also be used for testing viruses on monkeys.
Pills were added to virology because sepsisillin is a pain to make and
you can also use it to test on monkeys. The whole bottle should last one
person 23 minutes and 20 seconds.

Also I removed the no_self_cure trait that is now unused (it was given
by immunosilence) and changed the description of the aggressive healing
severity threshold to clarify that it starts scaling with any amount of
positive severity, not just after the first point.

## Changelog

🆑
del: Removed ImmunoSilence and its trait
balance: Aggressive healing has much lower stats
fix: fixed a few things
map: Added sepsisillin pills to virology
spellcheck: Clarified the description of aggressive healing
/🆑

---------

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2026-07-17 00:05:06 +02:00
TimandGitHub 01534749dd Modular computers (PDAs) now shutdown when out of power (#96932)
## About The Pull Request

This PR refactors modular computers (PDAs) so that they actually respect
their power cells and shut down when they hit 0% charge.

Previously, PDA power mechanics were essentially non-functional. While
the flashlight would drain more power, it would never actually turn off
when the battery died. Additionally, there was broken code intended to
make the messenger program immune to power requirements. That immunity
code was so buggy that it made all the power mechanics get ignored.

To fix this, I gutted the broken immunity code. The marginal power draw
of the messenger program is so tiny that it doesn't need exceptions.
Now, when a modular computer runs out of power, everything, including
the flashlight, shuts off completely.

## Why It's Good For The Game

Right now, the power mechanics for modular computers are effectively
LARP that does nothing.

Players now have a tangible reason to conserve power and seek out
upgraded power cells if they plan on heavily utilizing their PDA's
features. It's balanced so that you'd have to be quite careless with the
flashlight to completely drain a standard battery. It adds consequence
without being overly punishing to the average crewmember.

## Changelog

🆑
balance: Modular computers (PDAs) now shutdown when out of power
fix: PDA flashlights now turn off when out of power
sound: Added a terminal off switch sound to PDAs when power runs out
/🆑
2026-07-16 16:04:44 +02:00
MrMelbertandGitHub 97cb4ae3b5 Maybe improves radio tts somewhat (hypothetically halves the cost but who really knows) (#96799)
## About The Pull Request

Right now for radio TTS we get hearers twice. 


https://github.com/tgstation/tgstation/blob/62eb74613a141f197cca1f274431b734bd064034/code/game/machinery/telecomms/broadcasting.dm#L165-L170

This is not ideal as it's quite an expensive part of radio handling

<img width="765" height="141" alt="image"
src="https://github.com/user-attachments/assets/8245183b-c810-46bf-b466-9879c33e766c"
/>

My thought is we can remove one of the calls by only calling one or the
other
- If TTS is enabled, call `get_hearers_in_radio_ranges_track_radios` and
combine the list of hearers from *that* list
- If TTS is disabled, just use `get_hearers_in_radio_ranges`

```dm
	// Flat list of mobs who can hear the message
	var/list/receive
	// Assoc list of weakref to a radio to list of weakrefs to mobs who can hear the message
	var/list/receive_radios

	if(tts_radio_id) // only do this if we have a TTS identifier to save on perf
		var/list/recieved_radios_raw = get_hearers_in_radio_ranges_track_radios(radios, frequency)
		receive = list()
		receive_radios = list()
		for(var/radio, radio_hearers in recieved_radios_raw)
			receive |= radio_hearers
			var/datum/weakref/radio_ref = WEAKREF(radio)
			for(var/mob/possible_hearer as anything in radio_hearers)
				if(!isnull(possible_hearer.client) && can_hear_radio_tts(possible_hearer, frequency))
					receive_radios[radio_ref] ||= list()
					receive_radios[radio_ref] += WEAKREF(possible_hearer)

	else
		receive = get_hearers_in_radio_ranges(radios)
```

I also went through and cleaned up TTS handling a bit to make it easier
to parse, mostly completing my reviews from
https://github.com/tgstation/tgstation/pull/95369

No I did not test it

## Changelog

🆑 Melbert
code: Cleaned up radio TTS handling a bit, maybe it'll perform better,
report anything weird
/🆑
2026-07-16 16:03:15 +02:00
966e8aa3ba Medical doctors and CMOs can get virologist bounties (#96971)
## About The Pull Request

Virologist bounties are currently unobtainable, probably from when
virologist was removed. This PR gives medical doctors and CMOs a 25%
chance to get a virologist bounty instead of a regular bounty.

## Why It's Good For The Game

Content

## Changelog

🆑
add: Medical doctors and CMOs can get old virologist bounties
spellcheck: Changed "transmissible" to "transmission" in virologist
bounties
/🆑

---------

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

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

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

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

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

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

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

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

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

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

## Why It's Good For The Game

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

---------

Co-authored-by: san7890 <the@san7890.com>
2026-07-14 20:34:31 -07:00
3cc7bd77a0 Removes the cargo teleporter's ability to delete the server + Cargo Teleporter QOL (#5942)
## About The Pull Request

The cargo teleporter is ye olde Skyrat shitcode and it shows. Its core
loop is this:

```
for(var/check_content in target_turf.contents)
	...
	do_teleport(movable_content, moving_turf, asoundout = 'sound/effects/magic/Disable_Tech.ogg')
```

It will teleport every movable on the tile, in one tick, each with its
own `do_teleport` call, its own spark effect, and its own sound. There
is no cap. I found this out the hard way when I aimed it at a disposals
pile of roughly 800 items and killed the server. There happened to be an
explosive reagent in the pile, which... well, it did not help. I'm
making this PR to attone for my sins of crashing the server at least two
times. Kat Blu says: ZA WURDO! (You have been disconnected, or the
server is restarting).

No seriously this thing was a biblical apocalypse and I'm shocked shit
like this hasn't happened more often.

<img width="343" height="37" alt="image"
src="https://github.com/user-attachments/assets/e387f8dd-05a8-491b-a066-1b86a31f13c9"
/>

https://cdn.discordapp.com/attachments/1063282949648302090/1526027678002446406/za_wurdo.mp4?ex=6a558786&is=6a543606&hm=73dc0f7acbab2ecea90964d5b577e5e6807e5939e711d4c709de2b8f10c29218&

It is also iterating `target_turf.contents` while `do_teleport` mutates
that exact list, so it silently skips some. That probably doesn't matter
as much but I don't think it's a good way to go about it.

Fixed by feeding objects through one at a time. First object goes
instantly, every object after it is done behind a recursive short
`do_after`. It keeps going until the tile is empty, you walk away, or
you put the teleporter away. You have to stand there for a little bit,
but it will no longer be "The inexplicable player facing server reboot
device". This also keeps us from having to reduce its utility for moving
large quantities of items.

While I was in here I fixed the rest of the file and did the QoL it
should have shipped with:

- Reflavored the beacons, they are now called telebeacons, can be
color-coded per department with alt-click, you can also pick a Custom
option for anything else), and can be relabelled with a pen. I also
upped the total number of beacons to four instead of three.
- Color option only paints the *next* beacon you stake out, so you can
mark up engineering in orange and security in red because I hated its
old color.
- The beam and the teleport effect take the color of whichever beacon
you fired at, so you can see where your stuff is going, it's the little
things.
- Added a 2 pixel charge indicator light on the handle, green when
ready, amber while recharging. It pings when it's back up. Examine even
lets you see the countdown.
- Objects being teleported have a wibbly wobbly effect thing. 

## Why It's Good For The Game

It is a tool that can crash the server by accident with relative ease.
You do not need to be griefing. You just need to point it at a big pile
of junk. That is the whole argument.

Everything else is because if I'm rewriting the file anyway, it may as
well come out the other side being a tool people actually want to use.
Colour-coded, labelled beacons make it more user friendly.

## Proof Of Testing

<img width="1912" height="993" alt="image"
src="https://github.com/user-attachments/assets/75361265-bbf2-461a-9a08-4239f916f660"
/>
<img width="568" height="543" alt="image"
src="https://github.com/user-attachments/assets/c92dfda9-72b3-4ff6-970b-fee66193d727"
/>


</details>

## Changelog

🆑 Aeri
fix: The cargo teleporter is no longer capable of casually rebooting the
server.
qol: Nanotrasen has upgraded the station's cargo teleporter device to
the latest model after several incidents of reality disruption.
qol: Cargo telebeacons can be color-coded and relabeled with a pen. Four
can be deployed at once, up from three.
/🆑

---------

Co-authored-by: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com>
2026-07-14 18:26:33 -06:00
GhomandGitHub 0f324120c6 Reorganize how wiremod designs are shown in the component printer UI (#96796) 2026-07-14 12:49:14 +02:00
san7890andGitHub cb535cdfa6 Refactor var/can_be_held to an element (#96917)
## About The Pull Request

We were doing a lot of mental gymnastics in a bunch of other places, so
let's change this wonky var to a streamlined element that will rely on
the same signals that a lot of stuff was already using/accounting for in
its own signal handling pathways, instead of being a weird coverage gap.
This patch should also make the whole "checking if someone is attempting
to pick a mob up" thing make a lot more sense and use a unified proc
instead of spot-checking whatever random things it wants to spot-check.
## Why It's Good For The Game

I didn't know this was a thing until I looked at #96873 and it made me
sad because literally everything else involving mob drag-and-drop is
already signal-based except this weird stinker that relied on proc
overrides. Never mind that now, let's use nice traits to avoid
typecasting and elements to avoid duplicating code. It should also be
much cleaner to add holdability to a mob isntead of having to do
`can_be_held = FALSE` as a weird behavior (at least one instance had
this non-necessarily). All this really is is just middleware on the
extant /mob/living code but still making it in proper lockstep with the
other signalling procs.

I did port over raptor code faithfully but I'm not 100% sure if it was
meant to be like this? Regardless, that's how it is.
## Changelog
🆑
refactor: Picking up mobs has been altered a bit, please report any bugs
or glitches.
/🆑
2026-07-13 16:57:47 +02:00
The Sharkening 4a5104e4a0 Turns janitor borgs into walking crew operated vacuum cleaners. (#96724)
## About The Pull Request
Allows people to detach a cleaner and vacuum (uses the trash bag) from
janitor borgs. This option uses zero water management and doesn't create
slip tiles.

The module can be locked with alt click.

<img width="342" height="681" alt="image"
src="https://github.com/user-attachments/assets/0fe53f8b-d850-4354-aa70-382ca40dcd37"
/>

<img width="590" height="581" alt="image"
src="https://github.com/user-attachments/assets/70fea653-ad20-479a-8986-fed0e15af4b1"
/>


https://github.com/user-attachments/assets/ff81a214-1bfb-4a33-a660-ccb563e310af

Sounds are from soundsnap and properly licenced.
https://soundsnap.zendesk.com/hc/en-us/articles/115003916431-Legal


## Why It's Good For The Game

I think co-op mechanics are fun. If you manage to get a friend, this is
an option with zero water management. I feel like janitor borgs don't
really have much the way to cooperate with their base mechanics. You can
walk into a department and clean it wordlessly. This gives the option
where you can clean with your friend (or the crime scene you're trying
to scrub)

## Changelog
🆑 StrangeWeirdKitten, Toriate (sprites)
add: Janitor borgs now have a crew operated end that allows their
squishy overlords to do some cleaning themselves.
/🆑
2026-07-12 10:50:41 -06:00
The SharkeningandGitHub 04ce8e1e07 Turns janitor borgs into walking crew operated vacuum cleaners. (#96724)
## About The Pull Request
Allows people to detach a cleaner and vacuum (uses the trash bag) from
janitor borgs. This option uses zero water management and doesn't create
slip tiles.

The module can be locked with alt click.

<img width="342" height="681" alt="image"
src="https://github.com/user-attachments/assets/0fe53f8b-d850-4354-aa70-382ca40dcd37"
/>

<img width="590" height="581" alt="image"
src="https://github.com/user-attachments/assets/70fea653-ad20-479a-8986-fed0e15af4b1"
/>


https://github.com/user-attachments/assets/ff81a214-1bfb-4a33-a660-ccb563e310af

Sounds are from soundsnap and properly licenced.
https://soundsnap.zendesk.com/hc/en-us/articles/115003916431-Legal


## Why It's Good For The Game

I think co-op mechanics are fun. If you manage to get a friend, this is
an option with zero water management. I feel like janitor borgs don't
really have much the way to cooperate with their base mechanics. You can
walk into a department and clean it wordlessly. This gives the option
where you can clean with your friend (or the crime scene you're trying
to scrub)

## Changelog
🆑 StrangeWeirdKitten, Toriate (sprites)
add: Janitor borgs now have a crew operated end that allows their
squishy overlords to do some cleaning themselves.
/🆑
2026-07-12 17:04:13 +02:00
MrMelbertandGitHub 4962a86b95 CSL / Mutual understanding changes (#96774)
## About The Pull Request

1. Redid the formula for calculating mutual language understanding 

Old: `base + (10 * (1 - (min(commonness, 1250) / 500)))`, or in other
words `base + 10% to -15%`
New: `base + max(20 - (commonness / 1000) * 20, -5)`, or in other words
`base + 20% to -5%`

2. CSL strength preference has been changed 

Old: `"90%", "75%", "50%", "33%", "25%", "10%"`
New: `"75%", "50%", "25%"`

3. If you understand a language partially, the icon in chat is
differentiated slightly

<img width="414" height="30" alt="image"
src="https://github.com/user-attachments/assets/16af293a-698e-4ab8-9638-580920a38543"
/>

(Icon subject to change, it's just a `?` spliced with the icon rn)

4. CSL can now be taken by humans, doing so grants you gal-uncommon

5. Fixed a bug where contractions, due to being encoded, would be
treated as lower frequency / rarer and thus be more likely to be
translated

## Why It's Good For The Game

1. The current formula was a bit too harsh and resulted in more words
being translated than you'd expect. The altered formula should make it
less persistent.

2. These values were tweaked according to the new formula. If I left the
90% value it'd mean like every word would get translated and that
defeats the point.

3. Makes things a bit clearer when it comes to partial understanding. 

4. Requested, sounds like fun so why not.

5. Bugfix.


## Changelog

🆑 Melbert
fix: Fixed a bug where contractions were treated as rarer words than
they should be for the sake of partial language understanding
balance: Tweaked the formula of partial language understanding: Less
common words are penalized less, more common words are rewarded more. In
other words more words will be understood on average.
balance: Common Second Language numbers were tweaked according to the
new formula. Now "75%", "50%", "25%".
balance: Humans can now take Common Second Language. Doing so also
grants Galactic Uncommon.
add: Partially understood sentences now get an altered language icon in
chat and runechat, indicating that only some of the words were
translated.
/🆑
2026-07-11 16:52:28 +01:00
MrMelbertandGitHub 25edacac7c Stops bioscrambler from selecting stumps oh fuck (#96907)
## About The Pull Request

Bioscrambler could select stumps as replacements, that's not good so
let's fix that

## Changelog

🆑 Melbert
fix: Bioscrambler can no longer decapitate you (or remove any of your
limbs for that matter)
/🆑
2026-07-10 22:39:09 -06:00
JacquerelandGitHub 2cf56ab1e1 Allows gorillas to kill themselves with items (#96736)
## About The Pull Request

This PR moves most of the code for using an item to commit suicide from
`human` to `living`, so that anything with hands can use what it is
holding to commit suicide.
This was surprisingly painless, as most `suicide_act` procs were already
written without the assumption that the person killing themselves was a
human even though they couldn't be anything else.

This might occasionally mean that in some cases (like drones) it may
reference anatomy that they don't have (like necks) but I think that's
not a big deal and don't worry about it.

## Why It's Good For The Game

It's funny.

## Changelog

🆑
balance: Anything with hands can now use the things it is holding to
commit suicide
/🆑
2026-07-09 16:55:53 +02:00
FalloutFalconandGitHub 13266d8c55 Job sorting using department order for Jobs (#96835)
## About The Pull Request
Reworks the code for job sorting so that job order is ADDED onto
department order, to create a sorted list that properly mimmics how its
acctually displayed in game (which is the only way its used anyway)
This means we can shift all the display orders to be inner-department,
meaning we can cut down the size of indecies you have to shift to update
a job(if any)

Also adds a unit test to ensure jobs and departments dont overlap orders
to prevent any odd sorting behavoirs
## Why It's Good For The Game
Prevents having to shift a ton of entires every time a job is sorted or
removed.
Creates a more sensible ordering so we dont have stuff like assistant
being 1, prisoner being 40, despite the fact that they are displayed
grouped.

The only playing facing change is the command roles now get sorted how
there departments appear in the order.
<img width="1012" height="658" alt="image"
src="https://github.com/user-attachments/assets/e641cdd1-a9b8-4f32-be19-f133b8c987dd"
/>
Old order for reference (putting the hos higher up makes alot of sense
here tbh)
<img width="268" height="200" alt="image"
src="https://github.com/user-attachments/assets/42737704-8527-4dee-bac2-a09279d3b64e"
/>
## Changelog
🆑
refactor: Job sorting is based on department
/🆑
2026-07-09 16:53:44 +02:00
PapaMichaelandGitHub 776e4d7009 Saves the AI's previous cam when tracking (#96846)
## About The Pull Request

The AI currently saves `cam_prev` whenever you jump to a cam with a
hotkey, so you can press 0 to instantly jump back to where you were
looking before.
This PR also sets `cam_prev` when tracking a mob.

## Why It's Good For The Game

Huge QOL for the role. Whenever a human asks you to open a door, you can
click their name, open their stupid door, press 0 and be right back
looking at what you were before.

## Changelog


🆑 PapaMichael
qol: AIs save their "previous camera" (accessed by pressing the '0' key)
when tracking a mob.
/🆑
2026-07-09 16:35:47 +02:00
MrMelbertandGitHub a6500ba33e Fix BSRPED potentially bricking reagent containers (#96870)
## About The Pull Request

Fixes #96867
Reverts part of #88909

The PR removed the signal in favor of flipping off reagent flags on
insert, and restoring flags on removal
This caused the linked issue: We didn't check if the thing we were
restoring was a cell, so we'd just flip off a bunch of flags, leaving
the cell's reagent container with `NONE` flags set

However in fixing this, I noticed a pretty core issue with the idea of
flipping off flags, and that's "well what happens if something else
messes with the reagent container's flags"? Sure enough, if you lid and
unlid a beaker in an RPED, you completely bypass the exploit check and
can bomb like days of old

So I reverted the flipping of flags back to a signal. It was the easiest
way to handle the "flags" conflict without adding a bunch of traits or
whatever.

## Changelog

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

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

TL;DR consistency and stuff

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

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

## Changelog

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

A big update that reworks the Lizard's Gas Station, that fixes existing
issues and makes the role overall more interesting.

A third spawner is added, which is the Manager, who will be held to a
higher standard, and is expected to be in charge of interactions between
Lizard's Gas and other factions, along with controlling the budget. The
manager spawns in with slightly more equipment that better allow them to
protect themselves, their workers, and the station itself from danger.
(A unique outfit for them is also planned, but it is still a WIP)

Lizard's Gas will now have their own unique budget, which is mostly for
fluff, but is also intended to be used for tracking the profits, paying
the workers, and for making orders through trade - as an express console
(like Tarkon or Persistence) would be counterproductive as the ghost
role is intended to interact with others.

Entirely new map layout, highly inspired by European service stations.
This reworked layout has the following features:

- A bigger shopfront, with shutters and direct connection to the
employee only areas.
- Store area itself made bigger, with a greater variety of goods on
sale, along with a pair of flatpacked quantum pads.
- The removal of the old shed outside of the gas station itself, which
held the majority of equipment.
- A garage, being the new dedicated workspace. Now holds most of the
equipment that was in the shed.
- A utility closet, containing the rest of the equipment, along with a
big air tank and an SMES that actually works.
- A CCTV system for the gas station, so you can view both what is
outside and inside from relative safety.
- A proper break room, for the employees, with privacy and access to the
CCTV.
- A nice fancy office, for the manager, with privacy and additional ways
to contact other factions (holopad and fax machine), and of course
access to the CCTV.
- Air conditioning, could you imagine having to work on lavaland or an
icemoon without it?


Three new biogenerator machines that are (currently) entirely unique to
Lizard's Gas, these combine some of the functionalities of other already
existing biogens, while adding much more to them to create additional
incentives to both play the roles and interact with them. These could
potentially be added to other ghost roles in the future, as they are
intended to cover for the lack of access to certain machinery or just
general lack of space or extra hands to achieve the desired outcome. The
medical biogenerator specifically is also meant to cover for negative
quirks that normally would result in a quick death due to the lack of
access to the quirk specific medicines, or to simply treat most common
injuries on lavaland - making the role accessible to way more player
characters.

Also currently _planned_:

- New power generators, fueled by wood and biomass.
- New outfit for the manager.
- Fixing the prefab shutters, as their animation is broken and their
sprite could use more work and additional frames.
## Why It's Good For The Game

The intention is to give the gas station the means to easily be
self-sufficient, along with the right tools to connect themselves to a
trading partner of their choosing without being intrusive - a cargo
teleporter and a pair of quantum pads. This will allow Lizard's Gas to
establish a direct link with others, allowing there to be much more
interactions between it and their partner of choosing with much more
ease, but still requiring the other side to assist by setting up their
own cargo teleporter and deploying the quantum pad on their end. Also,
being a neutral faction in a (literal) hotspot, they could act as an
interesting hub for interactions between other factions or themselves.

Here's a much more detailed breakdown of the issues being solved:

- Spawn reliance - A bad spawn entirely dictates who you can and will be
able to interact with, for a ghost role which is guaranteed to spawn,
the spawn location shouldn't play this much of a factor. As such,
Lizard's Gas now is provided a pair of flatpacked quantum pads and a
cargo teleporter to be able to cooperate with any other entity to
establish a quantum pad link (Communication being done by fax or PDA).
Using the Cargo Teleporter allows the Quantum Pads to be set up without
needing someone to actually manually to the Gas Station.
- Quirks - Certain quirks that rely on medicines completely screw you,
as getting more will require a full chemical setup, such as Phobia,
Brain Degeneration, or the worst offender: Asthma. This is solved by the
medical biogen added to Lizard Gas.
- Husked = Roundremoved - If you somehow managed to get husked, or
suffer a serious infection, you are pretty much dead dead. With your
only real options is being taken to the station, or praying the
Persistence players somehow stumble upon your dead body. To solve that
issue without giving Lizard Gas a full chem setup, they instead can just
make synthflesh patches with one of the biogens.
- Bad Piping & Cables - The original map had serious issues with the
piping, such as certain devices not being connected, being useless, or
just going through walls when it is unnecessary, the worst offender was
the oxygen recycler which is meant to suck in oxygen from lavaland not
even working. Cables wise, the SMES was only able to draw power, and not
output any of it.
- No Theft Prevention - Coming across Lizard Gas previously without
knowing about it could easily result in people accidentally stealing
from the Ghost Role, as most of their supplies were completely out in
the open and protected by two notes left on the floor. All of those
supplies are now moved inside.
- No Unique Access - Anyone could wander into the Gas Station if it was
unbolted, and then enter the back areas and snatch whatever they wanted,
which is even more of an issue when they are now provided with three
unique machines that are fairly powerful. Giving the doors special
access only provided to the Gas Station workers fixes that before it is
even an issue.

Along with fixing the aforementioned issues, there are quite a few
additions that are meant to provide the following benefits:

- Interaction Incentives - Now that it is more accessible, Lizard Gas
required a bit more of a unique 'stock' to provide to people visiting
it, and since none of them operate any plasma-fueled vehicles, the next
best thing is selling them items for convenience, at a store, a
convenience store if you will. With the three new machines, Lizard Gas
will have access to a lot of products they can mass produce on the spot
using only biomass. They can make you a burger on the spot! Sure, it
tastes very synthetic and not that high quality, but it is produced on
the spot. Most of the other products are already available in Company
Imports, but this will be an option to trade for it for cheaper, player
interaction is a good thing!
- Neutral Hub - Being able to link themselves up other locations using a
Cargo Teleporter and a pair of Quantum Pads allows the Lizard Gas
workers to link up with the Station, Tarkon, and the Persistence - as
long as there is someone else on the other end with a Cargo Teleporter
as well. This allows all three groups a Neutral ground to be in,
hopefully allowing for more interactions between players without having
to worry about antags, while also being able to return to their
workplace quickly and with ease.
- Third Spawn - Adding a Manager, which fits thematically, and is
expected to be held to higher standards. Now Lizard's Gas is a three
slot Ghost Role!
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>

Comparisons!
**Old Lizard Gas:**

<img width="799" height="799" alt="StrongDMM_VGH8uAiA9r"
src="https://github.com/user-attachments/assets/1f72c14c-b070-4871-9058-bb7a540768c0"
/>

**New Lizard Gas (Icebox):**
<img width="1356" height="1017" alt="dreamseeker_KLV97bjWii"
src="https://github.com/user-attachments/assets/8b09df34-a64b-42a3-8af0-70de6b74fcd1"
/>
<img width="1356" height="1017" alt="dreamseeker_OAcImdnaPf"
src="https://github.com/user-attachments/assets/86f6a343-3979-4ed6-a5eb-7e8db9ad4cc8"
/>

**New Lizard Gas (Lavaland):**
<img width="1360" height="1017" alt="dreamseeker_N0k7u5zD8i"
src="https://github.com/user-attachments/assets/3848a851-2213-44f2-bfac-eb2133f68526"
/>
<img width="1356" height="1017" alt="dreamseeker_dedS1dHqaB"
src="https://github.com/user-attachments/assets/d928713e-8bef-40eb-acfc-dbb3ba8d5cfd"
/>

**The new machines & Contents:**
<img width="275" height="138" alt="dreamseeker_NpTCSRoj6k"
src="https://github.com/user-attachments/assets/06579bbe-11eb-4972-9fba-b5df4b30c51b"
/>
<img width="1189" height="973" alt="yLPMyfBjkU"
src="https://github.com/user-attachments/assets/5174833f-bc91-43b6-a472-873e94c4e93b"
/>
<img width="1189" height="711" alt="lRgw4dVQux"
src="https://github.com/user-attachments/assets/8d6cf74e-5e3e-4110-b6b5-ae1800a8f97b"
/>
<img width="1189" height="679" alt="7myy2173s3"
src="https://github.com/user-attachments/assets/c949851c-f487-47a5-9bf5-4db6c2b62e7f"
/>

</details>

## Changelog
🆑 Moldb, Cerberushopeless, Dr.arielpro & Projectkepler-RU
add: Added 3 new unique biomass based machinery intended for ghost roles
only. They are functionally similar to cargo-orderable biogens (Organic
Ration Printer, Organic Material Printer, Colonial Supply Core, Wall
Med-Station) but are consolidated into much more specific roles, while
also adding additional items to their lists.
add: Added an additional spawner to Lizard's Gas, in the form of a
manager role.
add: Gave Lizard's Gas their own budget card, which can only be spent
through trading with others. Their card is actually capable of
withdrawals.
image: New sprites used by the new biogens, taking direct inspiration
from pre-existing machines to fit in nicely.
map: Near complete rework of the Lizard Gas station, making it much more
roomy and more akin to an European service station.
/🆑

---------

Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
2026-07-05 12:12:45 -04:00
GhomandGitHub 794e13ada5 Allow more than one station lobby button to be shown at any time. (#96734) 2026-07-04 20:07:16 +02:00
ff006aa4a5 verb macro system (pr 1/3) (#96720)
## About The Pull Request

just macro-izes all the usages of verbs in the codebase as a
pre-requisite to my follow up pr that serializes all the verbs arguments
so we can tgui-ify the command bar, so we can then put it on the
onscreen map.

this also basically does the same as #94487 so can easily be integrated
into the verb queueing stuff... but does not actually do any verb
queueing by itself. basically im just trying to be
https://github.com/tgstation/tgstation/labels/Atomic
## Why It's Good For The Game
it doesn't really do anything by itself but it does let us do more stuff

## Changelog
🆑
code: the backend to all verbs in the game has been played with, please
report any issues to github
/🆑

---------

Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
2026-07-04 02:45:07 -04:00
BitSynergyandGitHub 35ce72549b Skiff borgs from Troutstation (#5806)
## About The Pull Request
Reference and species by Giik.
<img width="1065" height="515" alt="1686261871
giik_08b93f0c-d2f3-45fd-b746-fccb955c3cad"
src="https://github.com/user-attachments/assets/f2cdd051-6289-44d4-bb15-54e4e54a8a43"
/>
<img width="892" height="612" alt="pool_screenshot"
src="https://github.com/user-attachments/assets/6fc32855-9f7c-40e5-8b1c-7dd7b291a041"
/>
I got permission to port the skiff sprites from Troutstaion.
Original sprite credit: Giik
<img width="1052" height="550" alt="image"
src="https://github.com/user-attachments/assets/210072eb-3bdd-4b67-aa48-2ac34ddc8178"
/>

Cargo, Science, Standard, Syndie, Lustwish, Ninja, resting states and
wrecked sprited by me.
<img width="1126" height="732" alt="image"
src="https://github.com/user-attachments/assets/796b9385-4f18-4fd5-adf7-73e294d100cd"
/>


## Why It's Good For The Game
Adds a new borg model to play as.

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


https://github.com/user-attachments/assets/70ef071e-bf75-4c50-820c-ae7797e02abc


https://github.com/user-attachments/assets/0aeb6038-de1e-48a0-8946-7a316a079206

<img width="540" height="304" alt="skiffs1"
src="https://github.com/user-attachments/assets/a54c726b-f742-42d6-8964-ebabec8c4491"
/>
<img width="540" height="271" alt="skiffs2"
src="https://github.com/user-attachments/assets/0d93ae46-756b-4e63-9396-dcf6f3350827"
/>
<img width="540" height="271" alt="skiffs3"
src="https://github.com/user-attachments/assets/ab4f60e7-5bfa-4135-a714-055bbafb24c8"
/>
<img width="540" height="305" alt="skiffs4"
src="https://github.com/user-attachments/assets/0bd9d203-306f-4e3c-9842-e01c3d7059b0"
/>
<img width="540" height="305" alt="skiffs5"
src="https://github.com/user-attachments/assets/5e2f207a-f046-4509-9bf0-934c20373285"
/>
<img width="540" height="271" alt="skiffs6"
src="https://github.com/user-attachments/assets/0279f009-a7d5-4320-a6b5-f2453f084624"
/>
</details>

## Changelog
🆑 BitSynergy, Giik
add: Ported Skiff cyborgs from Troutstation
image: Added Skiff sprites
image: Added extra resting states for Skiff
image: Added wrecked state for Skiff
image: Added new department sprites for Skiff
/🆑
2026-07-03 23:43:02 +02:00
e9061e8b19 Blacksmith Revamp (#5360)
## About The Pull Request

Makes a number of changes to blacksmithing to make the role more
appealing, convenient, and special:

<details>
<summary>New Additions</summary>

- [ ] Added a new blacksmith recipe that requires legendary skill and
the skillchip: parts for a classical single-action revolver. High
damage, but finnicky to use; no safety mechanism, can't accept speed
loaders, and the hammer has to be cocked before each shot. Cocking the
hammer is faster if both hands are free, allowing for fanning the
hammer.
- [ ] Smiths can now make new storage options: a cowboy holster that
stores a handgun and multiple ammo boxes, a charging belt that recharges
one energy gun, a botany bag with expanded storage, and multiple types
of scabbards.
- [ ] Added a new skillchip specific to blacksmithing; without the
skillchip, your options on what you can produce via smithing are
reduced. This is to make it so that the smithing job role (or at least,
whoever has been given the skillchip from the QM's locker) is more
special. Currently smithing is just sort of something anyone can do, the
only things unique about spawning in as the blacksmith is that you have
cargo access and smithing-specific bounties.
- [ ] Replaced the water barrel with a new structure: the reagent
quenching trough. This spawns in filled with a new reagent, quenching
oil. Quenching a smithing item in the trough with any reagent will imbue
it for zero reagent use, and heat the trough's reagent.
</details>

<details>
<summary>General direction changes</summary>

- [ ] Perfect hits are no longer probability-dependant; they're based on
the player's timing. Except if the player is max level at blacksmithing,
in which case all hits are perfects.
- [ ] Right-clicking with a hammer on the anvil will allow the player to
automatically forge the item they're working on, with a slower pace
compared to manual forging. This is mostly meant to allow talking to
someone while working on forges.
- [ ] Removed multi-anvil smithing; blacksmithing lacks a dedicated
space on most maps and so must occupy a hallway or something else
instead. "Playing optimally" with multi-anvil smithing means taking up
significantly more space, in addition to looking extremely silly and
bypassing part of the loop with blacksmithing (levelling up the smithing
skills to produce equipment faster); the smithing chip will reduce the
swings needed to finish a job to compensate.
- [ ] Reworked reagent imbued equipment; removed the bonus from leaving
a weapon unimbued. This bonus can now be regained specifically by
imbuing smithing oil (smithing oil is special; imbuing it doesn't
inflict it as a reagent for effects, but makes the armor/weapon/etc.
better by numbers). Also, reagent imbued equipment no longer has a big
damage multiplier but will merely stop applying reagents after a certain
integrity threshold is passed.
- [ ] Significantly reduced the income from smithing cargo bounties. It
honestly kind of sucks that blacksmiths' value to the station is that
they print money and not for the actual quality of their items.
- [ ] Blacksmiths now have weapon access by default. It's honestly kind
of weird that the guy whose whole schtick is making weapons, didn't have
weapon access to start.
- [ ] Moved the crusader belt from the general crafting menu to the
smithing crafting menu; it now requires lv7 smithing and the smithing
chip. This change is because it's highly contingent on blacksmithing
equipment for its main storage so it seems most sensible for a smith to
work it.
- [ ] The leather apron that blacksmiths roundstart with now has
dedicated storage for various smithing and glassblowing tools.
</details>
<details>
<summary>Interactivity changes</summary>

- [ ] Trying to pick up a heated blacksmith item will now burn your
hand.
- [ ] Various quenched smithing items now have associated force values
for dealing damage, but will also (usually) cut the user's hand for
doing so.
- [ ] You can now use water tiles or certain reagent containers (needs
at least 300 units) to quench smithing equipment.
- [ ] The forge now heats up it's surroundings and burns carbon dioxide
while doing so. The wall-mounted heater now auto charges it's cell to
compensate for this.
- [ ] You can now weapon-bash your blacksmithing shields, similar to how
you can slap your baton against your riot shields to intimidate.
</details>

<details>
<summary>Convenience and misc.</summary>

- [ ] Changed the Rapier sprites to match the other smithing weapon
sprites.
- [ ] Added more tutorial tooltips when inspecting blacksmith equipment.
- [ ] The blacksmithing noises are quieter, thank god.
- [ ] Using tongs on a stack now pulls only one item from the stack,
instead of pulling all items in the stack. You never actually want to
have more than one sheet in the tongs so there's no reason to include it
really.
- [ ] Completed blacksmith items can now be picked up with tongs and
placed into the crafting bench with them. This is meant to reduce the
tool-juggling for moving the item from the anvil to the basin, then
moving the item from the basin to the bench.
- [ ] The blacksmith ID trim now has an actual icon 
- [ ] Commented out the cortical borer cage recipe. We don't really need
this since we don't run cortical borers.
- [ ] Halved the number of necessary chains and plates for all recipes,
but doubled the time needed to hammer them; this is to reduce how much
item juggling is needed.
- [ ] Cargo guards and cargo secoffs now have blacksmithing access.
- [ ] Ensure that Ashwalkers, Primal Podpeople, and feral nekos have all
the same mechanics as a skillchipped crewie, except cannot make the
revolver
</details>

<details>
<summary>Code refactoring</summary>

- [ ] The reagent clothing and reagent weapon components now come from a
general reagent imbued parent component.
- [ ] Refactored how anvil smithing works; it now relies on an item
component that handles item heat, hammer strikes, and quenching, instead
of all the code being handled within the anvil itself.
- [ ] Removed the skyrat_obj_flags variable that only functioned for the
anvil_repair flag and nothing else. We have different ways to check for
the stuff it relied on so it's not really needed.
- [ ] Removed the in_use code from various forging objects. It's a
really cumbersome system and annoying to manage all the time. Doafters
with interaction_key stand as a replacement.
</details>

Overall, in the hands of blacksmiths, smithing-chipped characters, and
the tribal factions, this should feel like a general buff. For everyone
else, this should feel like a nerf, and they should go to the blacksmith
or get skillchipped so they can make smithing stuff. It should also feel
less 'shallow' and a bit more interactive with the rest of the game.

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

<img width="180" height="108" alt="image"
src="https://github.com/user-attachments/assets/fff5bf67-2f6b-42e6-b8a6-920b5ef8bf26"
/>

<img width="399" height="52" alt="image"
src="https://github.com/user-attachments/assets/f7a1f395-d060-49ad-848f-52d0e4303177"
/>

https://youtu.be/hcPZXzCOSIU

https://youtu.be/V7GeLetcRtk

https://youtu.be/YEyW9pKidTU

</details>

## Changelog
🆑
add: Way, way too many blacksmith job features & smithing system changes
to list. But here's the highlights:
balance: Forged blacksmith weapons can now be used nonlethally via
striking with pommels, spear shafts, etc. which knocks down victims and
stamina damages them like a weaker baton.
qol: Blacksmith tongs now only pull one item at a time, if used on a
stackable item.
qol: Blacksmiths can now auto-smith at an anvil by right clicking with a
hammer.
qol: Blacksmithing tools now have more tooltips to tutorialize their
usage.
qol: Blacksmithing crafting bench can now store item stacks, forging
plates, and forging chains. Right-click to view what's in it.
balance: Removed multi-anvil smithing. Individual smithing pieces can
now be made faster with the smithing chip and other means to compensate.
add: Blacksmiths can now build a single action revolver if they are
fully levelled.
add: Blacksmiths can build a variety of new equipment at the crafting
bench -- gun-charging holsters, knife belts, multiple types of
scabbards, and even a new expanded-storage botany bag.
add: Replaced the water barrel for smithing with a barrel of smithing
oil; smithing oil is now used to grant the bonuses that was previously
given by leaving the item unimbued. The new barrel can have its contents
changed for reagent imbuing.
add: A new reagent "smithing oil" which gives innate bonuses to any
blacksmith equipment imbued using it.
balance: Material types now affect the quality of resulting items and
how quickly they can be forged.
balance: The reagent smithing hammer now has increased toolspeed if
forged well.
balance: Reagent imbuing's durability penalty has been altered; it
reduces durability for each time an imbue effect procs, and then stops
functioning for such when below a certain durability percentage.
/🆑

---------

Co-authored-by: Mathilde <146444134+ibexgoetia@users.noreply.github.com>
Co-authored-by: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com>
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
2026-07-03 15:05:07 -04:00
70eef1f46f Returns Space Z Level Count To 7 (#5864)
## About The Pull Request

[The count was reduced all the way back in 2024 as a way to help server
performance ](https://github.com/Bubberstation/Bubberstation/pull/2510)
however I've been told it might be worth upping again.
## Why It's Good For The Game

People yearn for the space age. Tiding gets boring and there's often not
a lot in a given round, especially when you have stuff like Tarkon that
take up half a large portion of a given z-level.

## Proof Of Testing

The tests don't fail! Might need a test merge to judge the performance
impact at scale if there's still concern.

🆑 Robwo
code: Returned space Z-level count back to 7.
/🆑

---------

Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2026-07-02 10:22:08 -07:00
GhomandGitHub cad5a920a0 Implements foodtypes being inherited to cooked and processed food items as well (#96551) 2026-07-02 20:26:04 +10:00
6c30100e63 Adds a new cybernetic implant to the black market (#96744)
## About The Pull Request

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

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

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

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

## Why It's Good For The Game

I think it's funny.

## Changelog



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

---------

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

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

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

What does this mean?

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

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

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

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

## Changelog

🆑 Melbert
refactor: Surprise, a follow up refactor to species part rendering,
report any oddities with them (wings/snouts/tails/etc)
/🆑
2026-07-02 11:41:31 +02:00