Commit Graph
2221 Commits
Author SHA1 Message Date
Alexis 88e84645b1 Merge commit '6b52b564a50e4f3091470529c683587e5de15d49' into upstream-sync-7-22-2026 2026-07-22 13:39:09 -04:00
b9bf4207d2 Improves the performance of static cargo ui data significantly [EARLY PULL] (#5981)
Potential culprit for time dilation.

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2026-07-20 18:27:39 -04: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
84199cea9d Strongarm crate says "humanoid arms" instead of "human arms" (#96964)
## About The Pull Request

Adds a single "oid" to the crate description

## Why It's Good For The Game

When I was a new player I thought they only worked in human arms, and
not any other race nor robotic arms.

## Changelog

🆑
spellcheck: Strongarms crate decription now mentions "humanoid" instead
of "human" arms.
/🆑

Co-authored-by: Fghj240 <fakeemail@notrealemail.com>
2026-07-16 14:54:57 +02:00
Leland KembleandGitHub d6f14fe29d Moves an amount up to interpretation of things from attackby() to item_interaction() (#96757)
## About The Pull Request

Thirty files changed, one's not really changed, one's actually just a
copy of a change from a different pr, because for the sake of pipe
cleaners I decided to change the base turf. Probably wasn't a good idea.
This one contains the full set of `/turf/` `attackby()`s(besides those
meant for attacks), converted all at once because the tree of turf
subtypes looks a lot more like a spire than a bush.

Changes beyond conversion:
I added messaging for when you're crowbarring transit tube pods out of
the tubes because I genuinely wasted half an hour trying to figure out
what I'd done wrong in conversion because they don't look any different
so I thought it wasn't working.

If you're reinforcing plating and the plating is reinforced
mid-reinforcement you will no longer waste your plasteel reinforcing the
reinforced plating.


## Why It's Good For The Game

what are we at, ~120? I was expecting this to be a lot more drawn out,
but most of them are really small. I'm gonna have to do a final pass of
calls to `attackby()` once the dust settles, but the end of non-attack
`attackby()`s is just a week away.
2026-07-15 17:37:00 -05:00
Aliceee2chandGitHub c7408ce841 Mapping previews tool for mapper's mapping needs (#96872)
## About The Pull Request

Makes more machinery using MAP_SWITCHes so their fancy preview icons
could be displayed in SDMM. MAP_SWITCH takes original icon+icon_state of
machinery as first argument and icon+icon_state (basically a machinery
part because the naming system, like `MAP_SWITCH("computer",
"/obj/machinery/computer/slot_machine")` ) from
icons/obj/fluff/map_previews.dmi

Adds a tool (subsystem) for that need that generates preview icons for
stuff that has overlays. To include them in preview generating you have
to set specific variable to TRUE.


## Why It's Good For The Game

Lets us do this instead of black boring consoles: 
(before)
<img width="641" height="575" alt="image"
src="https://github.com/user-attachments/assets/35fc5a19-bc24-4c02-957a-43ddef86e684"
/>
(after)
<img width="641" height="575" alt="image"
src="https://github.com/user-attachments/assets/99310823-747f-4e0a-acf8-60abcc8f2ed1"
/>


## Changelog

🆑
qol: Made machinery with overlays actually be properly displayed in SDMM
editor.
/🆑
2026-07-15 12:48:22 +00:00
2e9e371610 Removes a no good bad reference from a bounty description (#96974)
## About The Pull Request

Station 88 in a description about sending gas is pretty close to actual
nazism. Let's not.

## Why It's Good For The Game
Nazis are...bad!

## Changelog
🆑
spellcheck: Dogwhistle has been removed from a bounty description.
/🆑

---------

Co-authored-by: mcbalaam <104003807+mcbalaam@users.noreply.github.com>
2026-07-15 22:30:15 +10: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
Leland KembleandGitHub f29fccfc2c Not as scary as it looks attackby() to item_interaction() (#96795) 2026-07-12 13:45:35 +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
SmArtKarandGitHub cb10c13541 Anchors nutraslop trays (#96745)
## About The Pull Request

Closes #96695

## Changelog
🆑
fix: Anchored nutraslop trays
/🆑
2026-07-04 20:03:39 +02: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
LemonInTheDarkandGitHub ef2595ade7 Improves the performance of static cargo ui data significantly (#96711)
## About The Pull Request

We were iterating all cargo packs once per cargo pack, and for each
subgroup we were regenerating all their ui data info.

This wastes a catastrophic amount of time.

Instead, let's just build a list of group -> list(pack data 1, 2, ...)
and send over that, since that's what the ui is ultimately asking for.

Should reduce a semi prominent source of overtime on live.
2026-07-01 02:10:01 +02:00
GhomandGitHub adf838c32a Holidays content: Kitchen has more ingredients on some holidays, more mail items, special bar kegs on St Patrick Day, Beer Day and Talk-Like-a-Pirate Day. (#96509)
## About The Pull Request
This PR adds a simple holiday spawner type that can be used for objects
that are only spawned if the holiday they're associated with is being
celebrated. Right now it has three subtypes, all related to the kitchen
(liquid ingredient, powdered ingredient, meat ingredient).

The involved holidays are the fictional tiziran and mothic festivities
Atrakor's Might and Fleet Day. Extra stuff is also spawned on Bee Day
and Beer Day. On Vegan Day, the monkey meat slabs in the meat fridges
are replaced with plant-based meat slabs (killer tomato slices and pod
people meat, plus veggies) and the fridge is renamed from "meat fridge"
to "vegan fridge".

This PR also adds a few more holiday-specific mail objects such as
Speak-Like-a-Pirate Day, Fleet Day, Atrakor's Might, Chernobyl's
Disaster Anniversary (it's just a geiger counter), Monkey Day and
Draconic Language Day.

EDIT: I've decided to make the bar backroom beer keg into a spawner that
will spawn special kegs on specific days (otherwise it's a 1 in 25
chance). These kegs can contain drinks a little more refined than the
average beer keg. Also it comes with a resprite of kegs because the old
one was starting to look a little ass compared to other reagent
dispensers.

## Why It's Good For The Game
For being fictional festivities revolving around food and culture, and
despite the lot of recipes for moths and lizard people, we aren't
offering anything to chef players to let them cook said recipes beside
what's given on any bog-generic round. This is a step toward a slightly
less lackluster implementation of those festivities and recipes into the
game. Also chance for cooler kegs for the bartender.

## Changelog

🆑
add: The kitchen fridges may have additional ingredients on certain
holidays, in particular Atrakor's Might (lizardpeople) and Fleet Day
(mothpeople), and Vegan Day.
add: Added a few more holyday-specific mail items.
add: Replaces the beer keg in the bar backroom with special kegs on St.
Patrick's Day, Beer Day and Speak-Like-a-Pirate day. On any other day,
there's a chance that the beer keg will be replaced with one containing
whiskey or rum, or in rare cases, one of those special kegs.
imageadd: resprited the keg as well.
/🆑
2026-07-01 10:26:56 +12:00
ArcaneMusicandGitHub b14f1aaa4b Adds Jet Boots, a very expensive new toy for cargo. (#96299)
## About The Pull Request
This PR adds Jet Boots, a new pair of footwear that can be purchased
from cargo as an import item.
Jet boots share behavior with their parent, the rocket boots, featuring
the long range jet dash that already comes with rocket boots, though
this differs from the jump boot's dash due to being a shorter distance
as well as being far less safe as a result.

The main draw for this item is that it has a toggle action to enable
sustained jet flight. That sustained flight behaves the same as a flight
potions, offering the ability to fly over tables, as well as a passive
movement when applied. One issue with these boots, matching flight with
wings, is that you need to be in suitable atmosphere in order to be able
to propel yourself. An additional restriction is that due to your
propulsion being based on your shoes, being leg-cuffed (such as from
bolas or bear-traps) will prevent you from being able to fly.

One pair of Jet Boots requires **40,000 credits**.

### Minor things
In adding this, most of the code was applied from the existing logic
already used for mob flight and the flight organs. Considering this is
like, the 3rd thing that has consistent flight behavior(?) I'm tempted
to try and refactor it into a component, but in the interest of being
somewhat lazy I held off for this moment. I could be easily convinced to
do so, however.

These boots arrive via a gold crate. They sell for the same amount, but
the only way to let us do that was to tweak the gold crate code so that
they're not hardcoded to always arrive with gold bars and the champion's
belt. As such, there's an update map's script attached to this PR to
move existing gold crate subtypes to a "stocked" variant.

<img width="336" height="224" alt="image"
src="https://github.com/user-attachments/assets/1209e6d8-0ccb-411f-b5f6-56a808709911"
/>

## Why It's Good For The Game

The last few weeks I've kinda challenged myself with the following
question and began working backwards: "What should cargo be able to buy
for 40,000 credits?". I mulled over a few ideas, including being able to
drop in map templates onto the station, additional cargo shuttle
upgrades (In the vein of the atmos refill upgrade from my last PR), etc.
I decided on trying and making something that is inherently a selfish
purchase. Not quite to the level of buying a cargo shuttle that kills
the entire crew, but the kind that makes you think "Oh my god, cargo
just blew their entire budget on a pair of shoes".

That said, offering players flight is a rare, and expensive upgrade,
based on the fact that flight potions and the like are similarly a rare
upgrade. The alternative, training and breeding a raptor capable of
flight, is also already in cargo's domain, but typically reserved for
shaft mining use. The main give here is that in exchange for flight,
it's still bound to an item. Someone can still murder you for your
shoes, or stun you and take them off your body, especially with the
increased stun multiplier while in propelled flight.

## Changelog

🆑
add: Cargo may now purchase jet boots, boots that enable sustained
flight, for 40,000 credits via the imports section.
/🆑
2026-06-30 21:51:15 +02:00
Roxy de4c3b255d Merge branch 'master' of github.com:tgstation/tgstation into upstream-2026-06-23 2026-06-23 15:51:55 -04:00
GhomandGitHub 79fa0b8ecd Categories with no items are no longer shown on black market uplink and cargo console UIs (#96585) 2026-06-22 22:34:49 -04:00
Leland KembleandGitHub 243b82b8ee Fixes runtime when firing off a supply pod via admin tools (#96580)
## About The Pull Request

A new pod born without a loc moves to the pod lane already, better to
simply make it explicitly spawn there

## Why It's Good For The Game

<img width="984" height="92" alt="image"
src="https://github.com/user-attachments/assets/b92e41cb-da83-4237-a95e-aaa8c59a1ec1"
/>

## Changelog
🆑

fix: fixed runtime when firing a supply pod via admin tools

/🆑
2026-06-19 15:53:20 -06:00
Leland KembleandGitHub 5c4296392a Fixes runtime when an exodrone rolls the shrubbery crate from the abandoned cargo ship (#96583)
## About The Pull Request

Shrubbery crate by virtue of manually filling itself for an
indiscernible reason wasn't added to `SSshuttle.supply_packs`, runtimed
when attempted to be found from there by the exodrone loot thing

## Why It's Good For The Game

cant find a round it happened in but the runtime is `cannot read
null.order_flags`
[here](https://github.com/lelandkemble/tgstation/blob/479d1b1828f882c5662fb9de10784c4b0800fae0/code/modules/explorer_drone/loot.dm#L46-L49)

## Changelog
🆑

fix: fixed a runtime when an exodrone rolls the shrubbery crate cargo
crate chip from the abandoned cargo ship
/🆑
2026-06-19 20:29:49 +02:00
308853cee3 Stasis crates (#96505)
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2026-06-18 17:54:04 +02:00
MrMelbertandGitHub 5b9ae7636b First aid station circuitboard in cargo + updates medical crate larp (#96453)
## About The Pull Request

1. DeForest first aid stations can now be constructed and deconstructed

Deconstruction is a simple screwdriver + crowbar. 

Construction involves the following: 
```
1x wound analyzer
1x syringe
1x scalpel
1x hemostat
```

Extra circuitboards can only be obtained from cargo for 1200 credits. 
Emag status is tied to the circuitboard. 
Innate armor has been tweaked to accomodate. 

2. DeForest emergency first aid stations now take 2x longer to recharge
but heal 2x faster.

These are the ones you find on shuttles that are always free to use. 

3. Medical crate larp updates

Most medical supplies now come in generic `DeForest Medical crate`s. 
Sansufentanyl now comes in a generic `Interdyne Pharmaceutics crate`.

## Why It's Good For The Game

1. I wanted a way to replace broken or hacked first aid stations WITHOUT
making them spammable. (They really musn't be spammable or it puts
Medbay out of a job.) So Cargo seemed pretty appropriate.

2. Since you can now theoretically steal these from space ruins (which I
think is fine and cool), they needed a small update so as to not also
put Medbay out of a job.

3. Larp larp larp. Cementing DeForest as the main provider of
conventional medical supplies, but also Sansufentanyl is already
flavored as being produced by Interdyne.

## Changelog

🆑 Melbert
add: You can now deconstruct first aid stations with a screwdriver and a
crowbar.
add: You can now buy first aid station circuitboards from cargo for 1200
credits.
add: Most medical supplies ordered from cargo now come in DeForest
crates. Sansufentanyl comes in an Interdyne create.
balance: As they can now be replaced, first aid station armor has been
reduced.
balance: Emergency first aid stations now heal twice as fast but also
take twice as long to recharge.
/🆑
2026-06-13 14:48:25 -07:00
GhomandGitHub eeaa123cd5 More clothing use the clothing_traits var. Accessories can use it as well now. (#96455)
## About The Pull Request
While working on some other PR, something caught my eyes. Some clothing
still use the old method of `equipped()` and `dropped()` overrides for
adding traits to the wearer when we already have a clothing_traits
variable to streamline this behavior. This should make short work of
that.

This also improves the accessories code a tiny bit by giving two of the
procs apter names and implements the clothing_traits var onto
accessories as well.

## Why It's Good For The Game
Better, shorter code.

## Changelog
N/A, if something breaks and goes undetected, then we need more unit
tests.
2026-06-13 14:47:30 -07:00
Ben10OmintrixandGitHub 64baa1979d Basic mulebots. last basic bot refactor (#95899)
my watch has ended

<img width="401" height="256" alt="ffffff"
src="https://github.com/user-attachments/assets/a539203c-020b-4ad8-b034-f69ec0eafa78"
/>



## Changelog
🆑 Profakos (originally pulled from their branch, did massive chunk of
this), Ben10omintrix
refactor: mulebots have been refactored. please report any bugs
/🆑
2026-06-11 23:58:13 -07:00
SmArtKarandGitHub 9b110eb64e Reworks and fixes blood drunk miner megafauna (#96286)
## About The Pull Request

Blood-drunk miner has been reworked to change it from a DPS race into a
more dynamic fight

- Buffed health from 900 to 1300 (45% increase), slightly increased
speed (3 -> 2.5), increased saw damage (6/10 -> 8/12) to compensate for
other changes below
- Slightly reduced PKA shot damage (20 -> 18)
- Saw attacks now have a slightly longer delay inbetween hits
(especially in unfolded form), ***no longer are guaranteed to hit no
matter what*** (was a bug which forced players to eat 50 damage to the
face) and slow down the miner during the combo
- Singular PKA shot has been replaced with a telegraphed barrage of 3
projectiles, during which the miner cannot move, letting players gain
some distance
- Dash is no longer a teleport but a proper charge akin to that of
lobstrocities with a very short chargeup that deals no damage or
knockdown, but allows the miner to travel further
- Miner's attacks no longer give the target stun immunity for a brief
moment (why?)
- Default PKA it drops has been replaced with an infernal version, which
comes with a cheaper (30% vs 50% of the default one) in-built rapid
repeater (that also has a less punishing miss delay)

<img width="169" height="143" alt="Aseprite_UfXRbgVuqB"
src="https://github.com/user-attachments/assets/3ac257a4-5443-4c7f-a891-4e69f8188cb4"
/>

---

Full fight with a single basic pen and 2 legion cores, no PKC trophies:
(fumbled a bit midway though, pre-PKA projectile damage nerf)


https://github.com/user-attachments/assets/40c8af0d-035c-49da-861b-5e74ca7d7551

## Why It's Good For The Game

Current blood-drunk miner is a hard DPS check with unavoidable damage
(both due to the bug and instant dashes/PKA hits) that simply requires
you to facetank the damage using heals and kill it first before it kills
you.
This should make the fight a bit longer, more engaging and fairer than
it is right now.

## Changelog
🆑
add: Blood-drunk miner now drops an infernal PKA with an in-built
improved rapid repeater modification
balance: Blood-drunk miner has been reworked with new attacks and
patterns
fix: Blood-drunk miner's combos are no longer guaranteed to land even if
you move away from it
/🆑
2026-06-05 18:03:12 +02:00
shayoki f601a6ddaf Merge remote-tracking branch 'tgstation/master' into upstream-6-2-2026 2026-06-03 01:23:54 -05:00
Leland KembleandGitHub 0991484c87 Patrol bounties pay money (#96251)
## About The Pull Request

Because patrols do not send anything material via the pad, they never
register `contribution` naturally, and thus runtime when their cube is
created.

Makes patrol bounties register ID `contribution` when they begin
tracking an ID's movements.

## Why It's Good For The Game

I did thousands of credits of unpaid labor before i realized these
weren't working

## Changelog
🆑

fix: Patrol bounties properly pay those who complete them

/🆑
2026-05-29 18:00:02 -04:00
TelevisionStaticandGitHub 58c08b8700 Autolathegoodie (#96242) 2026-05-29 17:03:02 -04:00
Time-GreenandGitHub 64f76f52a9 Interface Science | The Mariana Trench of Feature Content (#95857)
## Interface Science

You know what the problem is with our features? They're all too easy,
too optimized to use. Look at Genetics; we went from a confusing UI that
a 14 year old hardcoded with html into byond to a polished UI using
tgui, optimized for player comfort, and gameplay has suffered. Too long
we have coddled players with fun and easy content, no more I say!!!

To fix ss13, I have added a feature with the most awful, unusable UI
ever. It's just wires with random sequences that may or may not do
something. And yet, you will use it till your fingers bleed and your
eyes go white, and you will be grateful. "Thank you coder daddy", you
say as you sacrifice yourself to a display of unending, procedurally
generated dogshit.

<img width="563" height="294" alt="image"
src="https://github.com/user-attachments/assets/e56c947f-a40c-4df9-beed-672812357576"
/>

Or maybe you're a sick little deviant, and you don't respect me. Instead
of using my awful UI, you start optimizing. You've forced the secret
pulse code, and you're not going to pulse them again and again. You make
your own interface by connecting it with signallers, or integrated
circuits. Ahhh, you beat me! Damn it, and you're gonna get away with it
too.

## About the Pull Request

Adds new job content to science. Science spawns with a few "gizmo"
devices and can order more through cargo. These gizmo's have random
functionalities, like the strange objects you can find in maintenance.
These functionalities come with different settings to change how they
operate.

However, there are no buttons, just wires or a voice interface. You need
to solve, for example, a wire puzzle. You just pulse the wires, and if
you hear ping the sequence is good, if you hear buzz its bad. Just keep
going till you hear a creak sound.

If you do a sequence correctly, there are a bunch of randomly generated
ways this interacts with the functionality, mimicking real life settings
and interactions. Imagine a TV remote with randomized buttons, and you
have to map them out again.

Once you've mapped the sequences, you can make an interface. For simple
ones, you can just make some signaller assemblies. For the best control,
you could connect it with a bunch of integrated circuit signallers, and
program sequences into an integrated circuit machine.

Below is a short video of how the puzzle solving works. (I can't be
arsed to figure out how to record tgui, here's a video I made with my
phone. Also I had the sequences written down, which I STRONGLY recommend
you do.)


https://github.com/user-attachments/assets/93f79f0f-df14-4ff9-8096-f079ebae7e91

<details>
  <summary>Actual details</summary>
  
I have hidden the details to make exploring the feature itself more fun.
The whole thing was written to be convoluted, but intuitive. You should
be able to hit it with a multitool, and figure out everything from
there. It will take a bit to get the gist of it.

Nonetheless, for review purposes I have written down the details here.
If you're reading this for non-review purposes, you should know I have
embedded an internet curse that will at some point in 2026 teleport you
2 meters in a random direction. Continue reading at your own discretion.

The gizmo objects is usually generated with 1 or 2 'gizmodes'.
'Gizmodes' contains the fun-ctionality, and holds different operating
modes (so dubbed 'gizpulse'). You can't directly select a gizpulse, but
instead it generates a bunch of mode selections.

For example, a function that toggles lights has two gizpulses: toggle_on
and toggle_off. There are four different mode selects:
Cycle mode: Adds signal to cycle to the next gizpulse, and to activate
the current gizpulse
Select mode: Adds a signal for selecting every gizpulse, and a signal to
activate whatever the activate gizpulse is
Direct activate mode: Adds a signal for selecting every gizpulse, and
also immediately activates that gizpulse
Cycle-active mode: Cycles to the next mode, and activates it
(inconvenient but only has 1 signal to worry about)

So a light gizmode with the randomly selected 'select mode' has three
signals: select toggle_on, select toggle_off and trigger the currently
selected gizpulse.

Currently implemented gizmodes:
- Lights: toggle on, toggle off
- Move: start moving, stop moving 
- Food printer (its filled with the spongebob grey goop thing): print
food (donut or burger)
- Mood pulser (AOE): happy pulse, sad pulse, radiation pulse
- Mopper: select different reagent, dump onto tile (1/2/3 range), make
smoke cloud
- Teleporter (5 to 15 tiles, random dir): Teleport self, teleport mobs
in range 1, do both
- Electric: charge from nearest cell (looks into objects and stuff),
magically gain some charge, make lightning, make emp, charge nearby
object, defibrillate in an area
- Copier (makes fake copies of mobs and objects, visual copy only): scan
objects, print objects, erase all copies
- Sputter: dump oil and shake, throw self
- Bad: explode, explode, explode harder, explode with fire, stab you,
warning, make robot spider, breaks your bones, throws a grenade at you,
radiation pulses
- Some behind the scenes gizmodes (language toggle for voice interface,
for example)

The voice interface starts with wires, with signals to toggle the
language or dump the code words. After that, you can talk to it using
the code words similarly to the wire sequence to solve the rest of the
gizmodes.

</details>

I've added two to every map, somewhere in or near the experimentor room.
They may ocassionally spawn from a maintenance crate spawner
<img width="611" height="331" alt="image"
src="https://github.com/user-attachments/assets/3782700f-57d3-4591-9282-e0de590056e1"
/>


## Why It's Good For The Game

It's really difficult to have "experimentation" type features in the
game. It all has to fit into 1h rounds, and people get used to it real
quick. The experimentor and strange objects kinda try, but it's just one
button and praying a bear doesnt spawn you explodes you.

I don't claim to have solved this perfectly, but I think this is fun.
You truly have to start experimenting, be systematic and write things
down. If you figure out how something works, you can go to the next
stage of making it more convenient to use. I think it's really fun to
mess around with integrated circuits and USB's, and make, for example, a
BCI controlled bluespace launchpad.

So I lean into it! There's different settings to account for, and its up
to you to make it usable! If you like integrated circuits, you'll love
this (maybe).

The gizmo functions are aimed at benefiting the station as a whole in
some ways, to motivate people to make some fun systems for these to get
maximum benefit! A mood pulser near a busy area will make everyone
happier! (I do need to add more like these, I got distracted doing
stupid shit.)
2026-05-23 18:59:25 +00:00
+37 21b4095dfd [MDB IGNORE] [IDB IGNORE] Upstream Sync - 04/17/2026 (#5453)
Upstream 04/17/2026

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

---------

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

You can order a broadcast camera (the thing the curator can get which
lets them livestream to entertainment screens) in cargo for 800 credits

The cargo version has a smaller view range (4 tiles instead of 7 tiles)
and slows you down slightly

## Why It's Good For The Game

There's a lot of opportunities for gimmicks in being able to broadcast
to the station

Like if you're an antag and want to prove you have a hostage, or you
want to make rival news broadcasts, or you're a clown who livestreams
breaking into security, etc

Access to the ability to broadcast is very very limited (to a single
curator kit). If you wanna do any of the above you have to either play
curator and dedicate your entire round to it, ask the curator for
*their* gimmick item, or if there's no curator and you didn't roll it
you just can't do it at all. (And god forbid if someone steals the
camera or you lose it)

I think it's kinda sad so I wanted to add another way to obtain the
ability to broadcast and I figure cargo is a good place. It's lower
quality because I'm very wary of people robbing the curator of their
gimmick - The curator's camera is top of the line and that's what
differentiates it from the pleb's stuff.

## Changelog

🆑 Melbert
add: You can purchase (lower quality) broadcast cameras in cargo for
800cr
/🆑
2026-05-13 21:10:07 -04:00
ArturlangandGitHub d67ca75e37 kills cargo imports (#5491)
## About The Pull Request
kills cargo imports with no mercy, moves it into goodies with
newly-added subcategories
also adds a persi only agent ID single pack per request
also also tarkon and persi can buy private packs via id money
## Why It's Good For The Game
ugly UI that doesn't work for other factions and needs hacks to work
with cargo ui is not great

## Proof Of Testing


<summary>Screenshots/Videos</summary>
<img width="1268" height="1124" alt="image"
src="https://github.com/user-attachments/assets/fd3d9a58-ea0b-4242-88d2-b6123a214c72"
/>

## Changelog

🆑
add: cargo imports moved into it's own category with a brand subcategory
system, and orderable without a private account (god why did i do this)
add: persistence only agent ID single pack
add: persistence and tarkon can now buy stuff via ids directly
add: captain access can always unlock departmental orders
fix: persistence and persistence cargo consoles sending cargo pods to
the station if cargo bay is selected
del: entire cargo company imports system
/🆑
2026-05-12 17:20:32 -07:00
RoxyandGitHub fb7920cd23 Lets the GMM sell materials again (#5553)
## About The Pull Request
Title. You can once again get material money cubes. Money is back on the
menu.

## Why It's Good For The Game
People can already sell materials to the cargo budget as is by wrapping
them up in a locker and shipping it off. If people want to cheese the
system for Big Money, they might as well have access to the machine
intended for this.

There's a bazillion other ways of getting obscene amounts of credits
(fish gen + powerator lol), it's a fun feature, and I don't see a reason
for it to remain disabled entirely.

## Proof Of Testing
Removed the comment which disabled it so if it compiles it works.

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

</details>

## Changelog

🆑
add: The GMM can sell materials once more.
/🆑
2026-05-11 18:18:54 -04:00
ArcaneMusicandGitHub 283fdd5290 Adds the E-2 Earthcracker, a traitor tool for premeditated sabotage. (#95731)
## About The Pull Request

Adds a new traitor item, the E-2 Earthcracker. The Earthcracker is a
handheld sabotage device that you can deploy onto the ground in order to
deliberately create a weakpoint on that location.

As a recap, weakpoints can be exploited with a sufficiently large enough
explosive in order to create a chain of cracked turfs from it's
location, randomly breaking floors and walls, as well as attempting to
create new weakpoints that will allow for more of the hull to break
down. Weakpoints, if discovered, can be welded to taped up to repair
them using sticky tape.

The earthcracker creates a longer, and larger weakpoint than the kind
that spawn naturally. However, to use this subtly, you'll need to hide
the weakpoint created, as well as clear away the spent earthcracker by
using a wrench.

Practical use is: Get the earthcracker, use in hand to arm/anchor onto a
turf (Can be unwrenched at this point), activate with an empty hand to
begin the cracking process, then wrench away, and you have a well
hidden, high power sabotage device.

Two variants are available in-game: The E-2 Earthcracker which can be
obtained from the traitor uplink at 2TC each, and the E-1 Earthcracker
which can be purchased on the black market. The E-1 variant spawns
normal run-of-the-mill weakpoints as opposed to the E-2, with a 30%
availability from the back market, at a cost of 200-600 credits.


![earthcraking](https://github.com/user-attachments/assets/0ab3a5af-f6c3-4096-b59a-7a1b44a01700)


## Why It's Good For The Game

I'll be frank, I don't think we necessarily need *more* tools to cause
havoc, but I wanted to expand the weakpoint framework a bit and this
idea came to mind. The Earthcracker fits in the same category as C4, but
without a signifigant amount of the control that comes from C4 and
absolutely from X4. This stands to cause more damage across the hull,
with the ability to keep expanding the crack. For that reason, I think I
may have underpriced this in terms of TC, but I'm up for discussion on
if it needs to go up to a 3-5 range.

In an ideal world, this could be used for making booby traps, such as
planting an earthcracker in an area like escape or a larger department,
and then triggering the weakpoint when the right people are around, even
through something like a detomatrix or a trigger on a grenade.

As an added reminder, weakpoints have a dedicated method to repair them
if discovered, that being welding them or hitting them with sticky tape
to repair them quickly, offering some counterplay.

I also added a lighter variant onto the black market as a fun, dubious
thing to have on the black market.

## Changelog
🆑
add: Adds the E-2 Earthcracker device as a purchasable traitor item for
2 TC. Use it to create potentially devastating weakpoints onto the
station!
/🆑
2026-05-07 06:13:55 +02:00
LT3andGitHub 24a9759859 Cargo manifest stamp payment consistency (#95832) 2026-05-04 16:33:30 -04:00
necromanceranneandGitHub 6904a2b68b Adds a more fitting Cybersun reinforcement outfit. And ABSOLUTELY NO ITEMS TO THE BLACK MARKET. (#95918)
## About The Pull Request

Adds an orange and black business outfit for Cybersun
employees/reinforcements.
<img width="86" height="102" alt="Screenshot 2026-04-29 204615"
src="https://github.com/user-attachments/assets/c8afb1c6-6172-4250-9077-67e418eb48f7"
/>
<img width="123" height="126" alt="Screenshot 2026-04-29 204650"
src="https://github.com/user-attachments/assets/8823d05c-0301-4bc7-af4d-d3d5337830e2"
/>


Definitely doesn't add an item to the black market. Nope. No changes at
all there. Don't look at the code.

## Why It's Good For The Game

Cybersun will slowly begin receiving some updates both visually and
narratively in the future. Here is but a small taste.

## Changelog
🆑
add: Gives the Cybersun reinforcement a new outfit.
add: No new items were added to the black market. None. Honest.
/🆑
2026-04-30 08:40:08 +02:00
aa4dc56835 Removes Station-time (more time changes) (#95744)
## About The Pull Request

Removes Station-Time entirely
Server Time is now NST (Nanotrasen Standard Time). SS13 takes place
exactly 540 years in the future of the current day, so every second is 1
second in-game.
Round Time is now PT (Pay-Time), how Nanotrasen keeps track of how long
the current rotation of Employees has been working for.

Telecomms uses NST due to its importance of being the communication to
the blackbox.

Autopsy report, clocks, scientific reports and requisitions use both
timestamps due to them being more official documents that NT may need to
know beyond just the current round (just for flavortext).

Pretty much everything else (Det scanner, PDA, IC logs, Time-of-Death,
AI law changes, Cyborg file downloading) uses PT

PT
<img width="305" height="217" alt="image"
src="https://github.com/user-attachments/assets/cef73025-6292-4f9c-8565-197397bda2ca"
/>
<img width="168" height="59" alt="image"
src="https://github.com/user-attachments/assets/a99db568-045d-45fc-8206-0d9a7b13c7d2"
/>
<img width="308" height="122" alt="image"
src="https://github.com/user-attachments/assets/37ca6f17-8916-4af2-9c91-0f0707038ca5"
/>



https://github.com/user-attachments/assets/29445051-c98b-4af3-a657-812083aab91a


Clock (Literate)
<img width="748" height="292" alt="image"
src="https://github.com/user-attachments/assets/c824e812-91b5-4737-858d-768336e9a7c4"
/>

Clock (Illiterate)
<img width="446" height="94" alt="image"
src="https://github.com/user-attachments/assets/90d5ea0d-eaff-4ced-aa31-ffdf0b4832a5"
/>

New paperwork time working properly

<img width="311" height="190" alt="image"
src="https://github.com/user-attachments/assets/6d048926-db61-4c91-893b-ce93e1ea7775"
/>

NST
<img width="800" height="115" alt="image"
src="https://github.com/user-attachments/assets/35ffde49-13c1-4ce7-ab24-858e48b608bd"
/>
<img width="1288" height="142" alt="image"
src="https://github.com/user-attachments/assets/40c30d16-e0de-4efc-b460-9486eeb901d6"
/>

# Other changes

1. Circuit time checker will now get the value of the given input (Hour,
Minute, Second) rather than the full dedisecond time converted into
hour/minutes/seconds

<img width="270" height="67" alt="image"
src="https://github.com/user-attachments/assets/097440cc-1c45-447f-9976-18de7f9c722c"
/>

2. Turns nightshift into a round event that'll last approximately 22
minutes
3. 12-hour pref (doesn't apply to the stat panel because it's global
info) & removal of "TCT" time

<img width="569" height="440" alt="image"
src="https://github.com/user-attachments/assets/d39083b1-d248-41c0-9a1c-b2398ca203a7"
/>

4. The chocolate pudding negative moodlet is now based on the server's
IRL time.
5. Admins can now use ``class``, ``style`` and ``background`` (they were
already given perms to use ``img`` so hiding background, which was
removed to prevent image embedding, is pointless)
6. Also fixes ``year`` being off on localhost.


## Why It's Good For The Game

Server Time is approximately 1s = 12s converted, not including it
desyncing from lag (I believe?).
This makes it pretty much impossible for people to actually use this as
a unit of measurement for in-game actions.
Different things also uses different timestamps which is a bit more
confusing.

The main change here is for accessibility and, hopefully, using time as
a source of immersion. "20 minutes ago" is no longer OOC, they're just
speaking in PT. There's no timezones in space, Nanotrasen Standard Time
is the closest there is, but Pay Time is how NT considers when you get
your paychecks, so it's what is more commonly used.

It also fixes major inconsistencies between "IC time" and "Station
time", things like breakfast moodlet was the first 15mins of the round
despite the round starting like 7 hours in? Nukies with an L6 SAW firing
down the halls was shooting like 1 bullet every 3 seconds (assuming 4
bullets per second), overall there was just a disconnect between how
long time actually is in the universe.

The secondary reason for this change (though it is what pushed me to
actually get around to making this change) is the greater stat-panel
removal. This hopes to lessen the dependence on the stat panel for
station-time by making it easier to understand, and the end-goal I have
is for this information to be limited to Admins & the AI (AI will get
the IC version with the accurate year), so until that happens I would
like to improve the use of station-time by making it consistent (for
example, you should only care for PT for IC, which is also what your PDA
displays), so that when it gets removed it won't leave players timeless.

If you haven't already, and is interested in helping remove the stat
panel, every entry that needs to be removed can be found here -
https://hackmd.io/443_dE5lRWeEAp9bjGcKYw?view

Closes https://github.com/tgstation/tgstation/issues/94988

## Changelog

🆑
del: Removed Station Time, now we use NST (Nanotrasen Standard Time),
which is IRL server time +540 years, and PT (Pay Time), the amount of
time since the round has started.
del: Station nightshift is now a Station event rather than being based
on Server time.
balance: Time circuit's Unit of Measure now tells the amount of time in
hour/minute/seconds rather than giving the whole time translated to
hours/minutes/seconds.
qol: Added a 12-hour clock pref for people who prefer it.
qol: Hovering over NST timestamps on official documents will now
translate how much it is in PT/Shift Time.
admin: Admins can now use style/class/background in their papercode.
/🆑

---------

Co-authored-by: Isratosh <Isratosh@hotmail.com>
2026-04-25 14:13:31 -06:00
GhomandGitHub 5110eef308 Express consoles have crab rockets once again... (#95817)
## About The Pull Request
Alternative to https://github.com/tgstation/tgstation/pull/95658 that
involves fewer lines rather than more.

## Why It's Good For The Game
Makes it possible to order crab rockets on the express console without
copypasta. I'm not sure if express consoles are supposed to be usable
for special/emag orders (there was a check against that in the code for
some reason), but because they've had the exact same options of a
standard cargo delivery console for such a long time and because I
haven't found any explicit reason for that to not be the case (in lieu
of that, I found a bit of a reference to homoerotic material in the code
comments), I guess it's fine and nothing bad will happen.

## Changelog

🆑
fix: Packs exclusive to the express console (crab rockets for example)
can now be ordered from express consoles.
/🆑
2026-04-23 09:39:26 +12:00
ArcaneMusicandGitHub 7b8efd3daa Stock Market UI Tweaks and improvements (#95564)
## About The Pull Request

This PR pulls forward some UI tweaks that I made in #93183, but cleaned
up and with some additional adjustments.
This adjusts a bit of the GMM Ui, cutting out the horizontal quantity
measurement and rolling that into the supply/order information in the
middle.
<img width="984" height="613" alt="image"
src="https://github.com/user-attachments/assets/40661624-c88d-4899-a624-7f3b391edf27"
/>
Adds a hit of color as well to show what materials are currently being
ordered.
Adds a bit of tooltip text in order to showcase the range of prices that
a mineral can be bought and sold at, in order to showcase why lower
value minerals like glass/iron can be bought and sold from.
In addition to this, also tweaks the logic on the disabling of buttons
to better reflect these thresholds, so you can buy and sell when sitting
on those thresholds.

## Why It's Good For The Game

The market UI needs to exist in a sort of "spreadsheet" format, in order
to see all the values, all the costs, and make decisions about what you
what to buy and how many. That said, it's clunky, and there's a lot of
complexity related to buying and selling materials already that I would
love to cut down on.

This helps trim the UI, makes it a bit smaller, but adds in some missing
information that even I don't have memorized for the purposes of regular
gameplay.

## Changelog

🆑
qol: The GMM Ui can now tell you the minimum and maximum price ranges
that a material will sell for.
qol: You can now sell materials on the edge of their buying and selling
thresholds. (This really only effects iron and glass, practically)
/🆑
2026-04-23 08:50:02 +12:00
LT3andGitHub a614047147 Fixes materials market delivery crate (#95813)
## About The Pull Request
Fixes materials orders being delivered in a box instead of a crate. The
crate is billed as part of the order, subtracted from the order value,
and boxes aren't eligible for the 200cr return credit. This results in a
loss of 400 credits if there is an error in the order and the manifest
is correctly stamped denied.

## Why It's Good For The Game

Fixes materials orders correctly stamped 'Denied' resulting in a loss of
400 credits.

## Changelog

🆑 LT3
fix: Fixed loss of credits for correctly denied minerals market cargo
manifest
fix: Cargo budget materials market orders arrive in crates as expected
/🆑
2026-04-20 21:20:43 +02:00
MrMelbertandGitHub 4eadf5caf7 The big tooltype_act de-cargo-cult-ing (#95408)
## About The Pull Request

Removes a lot of cargo cult copypasta with
`default_deconstruction_screwdriver`, `default_deconstruction_crowbar`,
and to a lesser extent `default_pry_open` and
`default_change_direction_wrench`

ALL you gotta do now if you want your machine to have an openable panel
or be deconstructible with a crowbar is this
```dm
/obj/machinery/dish_drive/screwdriver_act(mob/living/user, obj/item/tool)
	return default_deconstruction_screwdriver(user, tool)

/obj/machinery/dish_drive/crowbar_act(mob/living/user, obj/item/tool)
	return default_deconstruction_crowbar(user, tool)
```

`default_deconstruction_screwdriver` no longer directly sets
`icon_state`, requiring the user pass in the open and closed icon
states. Now, it just calls `update_appearance`, and everything that once
passed the icon state now uses `base_icon_state` and
`update_icon_state`.

## Why It's Good For The Game

Many of these procs were terribly overcomplicated and difficult to work
with for what should be a relatively simple action

Streamlining it makes it easier for coders to understand and work with

## Changelog

🆑 Melbert
refactor: A majority of machines had their screwdriver/crowbar/wrench
interactions rewritten, report any oddities like being unable to open a
machine's panel or deconstruct a machine
/🆑
2026-04-14 19:46:24 -04:00
ArcaneMusicandGitHub 3503e9c565 Re-Implements the Bounty List for cargo, and various bounty improvements. (#95412)
## About The Pull Request

This PR readds a previously removed feature from cargo, that being a
global list of bounties that the whole station has access to, with some
tweaks and adjustments from the original system.

<img width="578" height="377" alt="image"
src="https://github.com/user-attachments/assets/c8e1cb8d-dda6-4983-8588-93dffffc2b4e"
/>

_Seen above: The new Global Bounty Interface._

The civilian bounty pad has a second tab added to it, which contains a
list of all the bounties that are available globally for all crew. You
can select one in order to view the contents of the bounty, as well as
have the option to send items on the pad to contribute to that global
bounty. You may also, as you could several years ago, print a sheet of
paper from the console that consists of all the global bounties on the
station, their their reward values. In addition to those bounties, some
bounties may be labeled has "High Priority", which means that they're
worth more to complete for both you and for cargo, and are denoted with
the different coloring and the star icon on the bounty list.

When a bounty is completed, it will create a bounty cube, the same as
personal bounties. However, for global bounties, multiple people may
contribute to their completion, and when the bounty cube is made and
sold, you will each get a cut of the profits proportional to your
individual contribution. So, if a bounty cube is sold worth 1000
credits, and Person A and Person B contribute 4 items and 6 items
respectively, the total "cut" of the profits crew would receive is 30%
of the total value, so 300 credits. Of those 300 credits, Person A would
receive 120 credits and 180 credits.
(In a real round, the value of the cube's 1000 credits may also increase
if the speedy delivery bonus is met by the cargo department.)

In addition, when a bounty goes from on the list to completed and cubed
up, the global bounty list will likewise automatically update, and
create a new bounty. The number of bounties available for the crew to
complete starts at 5 (Scaled to add one more for every 8 living players,
up to a maximum of 10 to begin with), and for every _3_ completed
bounties, that bounty maximum will go up by an additional 1 bounty. The
new bounty is random from all possible job categories. This may need to
be tweaked so that it pulls 1 bounty from each major department
category, but for now this is how it stands.

Most of the changes in this project fall under tweaks to the pricetag
component, UI work, and then a lot of file-cleanup and tweaking based on
testing.

## Why It's Good For The Game

There is something that was lost in the original shift from global
bounties to personal bounties. Cargo would reach out to crew in order to
get their assistance on projects that let them do their jobs better,
made forced them to have to work with the rest of the crew as opposed to
merely beating them to death when they break in to print their round
start multitools. One of the reasons that we justified that choice was
that bounties were very lopsided. You could be a a superstar helper and
complete a dozen bounties for cargo in a shift, but not only would you
run out of bounties to complete, but you would also receive nothing in
return. Switching to personal bounties did in fact let players generate
their own wealth, but now suddenly the impetus to complete bounties was
that cargo was more of a hang-up to the process than it actually being
part of their job responsibilities.

By re-implementing global bounties, we're giving crew the chance to not
only have that kind of soft community goal, but also we're incentivizing
people to contribute as much as they can to it's completion without
really requiring them to make it their whole shift as tends to be the
case with personal bounties.

There is more that could be done to this system, including using a
unique bounty pool, or at least unique "big" bounties that could be
rolled into the pool that would allow the crew to work on more varied
stuff, but for now this is at least a servable way to re-implement this
from both a longevity and nostalgia standpoint.

I also really, really like printing out sheets of paper and pinning them
to doors. Big mistake on my part by losing that.
2026-04-13 13:07:42 -05:00
ArcaneMusicandThe Sharkening bd01f0f2b6 [NO GBP] Corrects two issues with goodies and the ordering console. (#95478)
## About The Pull Request

Whoops.

~~I missed some nuance when I made #94483, namely that while I didn't
want players requesting CRATES like guns, grenades, spare SM shards with
their department budgets, the logic also touches goodies and private
orders meaning that players were unable to place goodie orders for
things that they may not have explicit access to do so, which is part of
the reason why you'd be ordering them privately in the first place. It's
cargo responsibility to determine if the player should/not be receiving
that item.~~
I have meditated on the issue, and I realize, nah, this is probably both
a healthier design decision as well as the reason we have things like
the black market in the first place. The core of the PR below however is
however sound.

ALSO, I made a fairly confusing mistake with the TGUI where the goodies
category just... hasn't been visible! That's on me.

## Why It's Good For The Game

Makes cargo goodies viewable. Makes cargo goodies purchasable.

Fixes #94928

🐛 💥 ‼️

## Changelog

🆑
fix: Cargo goodies are now visible in the ordering and request consoles.
/🆑
2026-04-13 06:16:04 -06:00
ArcaneMusicandGitHub 8a6649c8a9 Adds a cargo shuttle upgrade for plastic flaps and air refills. (#95393)
## About The Pull Request

We've all been there before. You send the cargo shuttle, you return it
only to find the blast doors were wide open, and air is now venting out
into space, and with the airlock cycling you are now trapped in a
freezing death trap of your own unwitting design.

This is funny and I want us to keep doing this.

But in an effort to continue to offer interesting things for cargo to
buy in a given shift, this PR offers the ability for cargo to buy an
upgrade to the cargo shuttle itself, that being 2 ~~tiny fans~~ Plastic
Flaps that are installed into the shuttle, as denoted by landmarks
mapped into the cargo shuttle.

Upon being picked up, also includes a certificate of installation. to go
onto the shuttle. Honestly, this is mostly so that I can be lazy and not
just spawn an empty crate but Ideally I open this up for future
categories of "cargo upgrades" that just spawn onto the station.

The other feature here is in shuttles having their air refilled on the
way to/from the station, as part of their subscription to air ™️

It's currently offered for the fairly steep price of 8,000 credits.

## Why It's Good For The Game

This is admittedly a luxury purchase, but, for players who are doing
well enough on credits, either through stocks, bounties, shuttle loans,
cargo events, whatever, this is something that players may want to
purchase for peace of mind, while being entirely optional in-game. The
cargo shuttle can be finicky in many ways and can tend towards easy
mistakes causing lots of pressure-related injuries in a round.

Again, this is intentionally offered at a high price point to avoid this
being an automatic purchase early into the round, but also something
that feels like an earned luxury if you have it, allowing you to focus
on your loop of buying and selling items, hustling if you will, without
caring if Larry over there is going to vent the shuttle for the
umpteenth time.

Like other tiny fans, these are not deconstruct-able and intentionally
should be locked to the cargo shuttle in practice.
2026-03-26 17:37:48 -05:00
RusselNotSCPandGitHub 4ceac8f297 Classic Cocktails 2: The liqueurening (#95392)
## About The Pull Request
TL;DR: "What do you mean we didn't have a negroni in the game before?"

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

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

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

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

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

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

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

This PR tweaks how supply_packs' `generate` and `fill` procs function,
so that they do not default to needing to be spawned with a crate
specifically in order to properly spawn.

What this allows is for the random supply drop event to be able to spawn
in with a non-crate container, such as an empty briefcase.

## Why It's Good For The Game

Ran into the random runtime while I was testing something non-cargo
related, and was considering having a non-crate supply crate for #95393,
but decided against it. Took this as a sign that I should implement it
anyway.

Plus, this will add even more variety to the random supply drop event's
results.
2026-03-25 16:33:33 -05:00
ArcaneMusicandGitHub 7740768362 [NO GBP] Corrects two issues with goodies and the ordering console. (#95478)
## About The Pull Request

Whoops.

~~I missed some nuance when I made #94483, namely that while I didn't
want players requesting CRATES like guns, grenades, spare SM shards with
their department budgets, the logic also touches goodies and private
orders meaning that players were unable to place goodie orders for
things that they may not have explicit access to do so, which is part of
the reason why you'd be ordering them privately in the first place. It's
cargo responsibility to determine if the player should/not be receiving
that item.~~
I have meditated on the issue, and I realize, nah, this is probably both
a healthier design decision as well as the reason we have things like
the black market in the first place. The core of the PR below however is
however sound.

ALSO, I made a fairly confusing mistake with the TGUI where the goodies
category just... hasn't been visible! That's on me.

## Why It's Good For The Game

Makes cargo goodies viewable. Makes cargo goodies purchasable.

Fixes #94928

🐛 💥 ‼️

## Changelog

🆑
fix: Cargo goodies are now visible in the ordering and request consoles.
/🆑
2026-03-23 15:16:45 -07:00
MrMelbertandGitHub da64374423 Reverts "Add prosthetic limb" surgery to involve targeting limbs, rather than targeting chest. (Adds stumps) (#95252)
## 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.
/🆑
2026-03-20 14:32:41 +13:00
NickandGitHub 4910e38c5f Changes the access and contents from the shuttle engine crate, and adds a circuitboard/flatpack for it (#95406) 2026-03-17 17:26:48 -04:00
MrMelbertandGitHub 3a47370861 Adds 1/500 chance for a pizza crate to contain a Romerol pizza (#95368)
## About The Pull Request

There's a 1/500 chance that 1 pizza in a pizza crate will have 6u
Romerol (1u per slice). It otherwise looks like a normal pizza and comes
in a normal box.

## Why It's Good For The Game

Ok to start this probably isn't a good idea. This will only cause
problems.

But between the Nanomachine Pizza, the Bomb Pizza, the Anomalous Pizza,
and the Arnold pizza I have this funny idea in my head of pizza orders
just constantly go wrong in universe.

And the thought is, right, if you eat Romerol... nothing happens.......
immediately.
So the crew orders pizza for a pizza party and goes off on their day,
then 30 minutes later it turns out the entire cargo team has risen from
the dead after being killed in a welder bomb accident.

In the post-mortem they're looking through the leftover slices and they
find trace Romerol.

Maybe that's kinda funny? 

## Changelog

🆑 Melbert
add: Adds a 1/500 chance that the grain used to create a pizza in a
pizza crate was cursed by an evil lich.
/🆑
2026-03-13 14:53:43 -04:00
Gboster-0andGitHub cb99136578 Fixes the game trying to give you a bounty for a chemical reaction instead of a drink (#95336)
## About The Pull Request

- Changes 2 chemical reaction datums in the public bounty alcohol list
to the actual drinks

## Why It's Good For The Game

> Changes 2 chemical reaction datums in the public bounty alcohol list
to the actual drinks
- No runtimes trying to read the name of a nameless datum anymore, that
and the bounty working i quess.

## Changelog

🆑
fix: fixed the game trying to make you sell chemical reactions for a
public bounty
/🆑
2026-03-08 16:02:22 +01:00