Commit Graph
3758 Commits
Author SHA1 Message Date
Alexis 88e84645b1 Merge commit '6b52b564a50e4f3091470529c683587e5de15d49' into upstream-sync-7-22-2026 2026-07-22 13:39:09 -04:00
SmArtKarandGitHub 677f070995 Elevates (almost all) inventory variables from /carbon to /human (#96955)
## About The Pull Request

Moves all inventory slots but handcuffs/legcuffs (as those can be used
by xenos) from ``/carbon`` onto ``/human``, as xenos do not use any of
those inventory slots, only leaving them in use by humans. Their
presence on ``/carbon`` is an artifact of times when monkeys weren't
humans, and some of the slots had to be shared by all carbons.
In some places I've used ``get_item_by_slot`` rather than swapping
checks to ``ishuman`` for simplicity's sake, in some places it might not
be the most optimal solution but in cases like help act any other
solution would require a refactor of the whole (massive) proc.

## Why It's Good For The Game

Cleaner/more sensible code, one step closer to fully datumized
inventories.

## Changelog
🆑
refactor: Moved a lot of human-specific inventory code onto human mobs,
report if inventories break!
/🆑
2026-07-16 03:03:50 -07: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
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
ArcaneMusicandGitHub af8f8cf66e Lights now call update when moving Z-levels. (#96934)
## About The Pull Request

As it says on the tin, light fixtures now call update when their Z-level
changes. The intention here is to help fix lighting issues on shuttles,
primarily the cargo shuttle and escape shuttle, to keep the shuttle(s)
from arriving pitch black unless the bulb is replaced.

## Why It's Good For The Game

This bug has been frusterating me for a bit. That said, I'm not 100%
confident that this change is going to consistently or completely solve
the issue, but does provide an additional way for lighting to fix
itself, potentially.

## Changelog

🆑
fix: Lights will now update themselves when moving Z-levels.
/🆑
2026-07-13 20:54:12 -06:00
OdairuandGitHub c1236bdd71 Removes the delamination suppression system from the game (#5934)
## About The Pull Request
Title
## Why It's Good For The Game
<img width="1098" height="339" alt="image"
src="https://github.com/user-attachments/assets/da8e04b0-a8ce-4e12-84ec-159212f87b6a"
/>
## Proof Of Testing


button/machine with free freon gone
<img width="873" height="851" alt="image"
src="https://github.com/user-attachments/assets/c294cfd8-be0f-4364-a9f7-02198e2ab1f2"
/>
<details>
<summary>Screenshots/Videos</summary>

</details>

## Changelog
🆑
del: Delamination suppression system
/🆑
2026-07-11 14:13:52 -07: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
Leland KembleandGitHub ad860bc23e Moves a great many more things from attackby() to item_interaction() (#96657)
## About The Pull Request

30 more(files, counting by files now). In combination with the other pr
this means that we are now at more `item_interaction()` overrides than
`attackby()` overrides, not counting `[tool]_act()`s.

Changes beyond conversion:
You can no longer repeatedly put gravitational or bluespace cores into
the gravity and wormhole guns, respectively. One's enough.
A runtime that occured when boxcuttering a package open no longer occurs

## Why It's Good For The Game

300 GBP for the cost of 3. A steal if I've ever seen one. You should get
in on this.

## Changelog
🆑

fix: You can no longer repeatedly put anomaly cores into the anomaly
core guns
fix: A runtime that occured when opening a package with a boxcutter no
longer occurs.

code: 30 files have been moved from attackby() to item_interaction()

/🆑
2026-07-07 22:02:24 +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
Leland KembleandGitHub e816dfebeb Moves a great many things from attackby() to item_interaction() (#96642)
## About The Pull Request

21 things.
Additionally, an actual refactor(a real one) of refunding of item-based
spellbook entries, as in the three summons, which hasn't worked for four
years and now does.
Lastly, the holopayment stand IDs can project can now accept payment.


## Why It's Good For The Game

They want you to think this is worth 210 gbp, don't believe the lies

## Changelog
🆑

fix: Wizards can now successfully refund summoning items
fix: Holopayment stands can now take payment

code: 21 things have been moved from attackby() to item_interaction()

/🆑
2026-07-05 10:02:06 +02:00
LT3 55ff6c47ce Merge branch 'master' of https://github.com/Bubberstation/Bubberstation 2026-07-04 11:17:46 -07:00
LT3 f60215e225 Fixes cascade resonance announcement spam, improves logging (#96758)
## About The Pull Request

- Fixes air raid siren/priority announcement being sent each time the
cascade strategy is activated.
- Improves logging for admins, removes code duplication by moving the
log generation into the respective parent procs.

## Why It's Good For The Game

Fixes bug, code improvement

## Changelog

🆑 LT3
fix: Fixed duplicate priority announcements about a possible resonance
cascade
code: Improved supermatter delamination logging
/🆑
2026-07-04 11:17:30 -07:00
LT3andGitHub 72debff5a7 Fixes cascade resonance announcement spam, improves logging (#96758)
## About The Pull Request

- Fixes air raid siren/priority announcement being sent each time the
cascade strategy is activated.
- Improves logging for admins, removes code duplication by moving the
log generation into the respective parent procs.

## Why It's Good For The Game

Fixes bug, code improvement

## Changelog

🆑 LT3
fix: Fixed duplicate priority announcements about a possible resonance
cascade
code: Improved supermatter delamination logging
/🆑
2026-07-04 19:54:45 +02:00
RobwoandGitHub 38b510437e Cell, Stock Part, Apc and Intercom Resprites (#5895)
## About The Pull Request
**Skyrat killer! I kill the skyrat sprites!** 
In all seriousness, the main part of this pr was to replace the skyrat
sprites for cells because it was bothering me that they were in a
different perspective from most things. This grew into changing stock
parts to fit in with the cells, then grew into respriting telecoms
parts, then grew into respriting the intercom, THEN grew into respriting
the apc!

- For cells, extra states were added for the emp-proof cell, the
miniature cell and the AA megacell.
- For intercoms, extra states were added for the syndicate variant and
all departmental encryption key variants.

## Why It's Good For The Game
More uniformity and consistency for our sprite replacements! Fixes for
edge cases like command/prison intercoms not having a state despite tg
having it and the broken apc sticker not being accounted for, yay!

## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
<img width="832" height="384" alt="image"
src="https://github.com/user-attachments/assets/56f49ed3-f4f2-44a5-9310-25db3649c345"
/>

</details>

## Changelog
🆑 Robwo
image: Cells, stock parts, apcs and intercoms have been resprited.
/🆑
2026-07-04 10:15:07 -07:00
Leland KembleandGitHub eaeb4b07c4 Moves a small few things from attackby() to item_interaction() (#96663)
## About The Pull Request

Ten files. No mechanical changes this time around, so the most notable
thing about this is a change to the way laying pipe cleaners works. I
guess since there's only ten, I can list them. But I'm not going to.

## Why It's Good For The Game

You probably don't regard the way pipe cleaner laying works to be sacred

## Changelog
🆑

code: Ten files have been moved from attackby() to item_interaction()

/🆑
2026-07-02 09:59:51 +02:00
MrMelbertandGitHub c06d6eac81 Rework to cursed/omen effects (#96529)
## About The Pull Request

- Cursed/omen: Vending machines will have a chance to tip over onto you
when you purchase something, rather than passively as you walk around
them.

- Cursed/omen: Airlocks will now have a chance to crush you if you stand
on them when they try to close, rather than passively as you walk
through them.

- Cursed/omen: Light fixtures will now have a chance to shock you if
they break or are turned on/off, rather than passively as you walk
around them.

- Cursed/omen: Mirror reaction will only trigger if you step up to a
mirror, rather than if you step within two tiles of a mirror.

- Cursed/omen: Several chat descriptions of events have been rewritten
to be more "final destination", less "you're being haunted".

- Bad luck smite set to infinite can no longer be blessed to be removed.

- Fixes and refactors for Omen

## Why It's Good For The Game

Cursed is a very fun idea for a quirk but it is quite miserable to play.
Just navigating around results in you being hardstunned every minute as
you break literally every light fixture in your department.

I wanted to lessen this misery a bit while still keeping the theme of
the quirk/component. I figure it'd be more appropriate/fair if these
unlucky interactions happen as a consequence of something you (probably)
did rather than just existing.

## Changelog

🆑 Melbert
balance: Cursed: Vending machines will have a chance to tip over onto
you when you purchase something, rather than passively as you walk
around them.
balance: Cursed: Airlocks will now have a chance to crush you if you
stand on them when they try to close, rather than passively as you walk
through them.
balance: Cursed: Nearby light fixtures will now have a chance to shock
you if they break or are turned on/off, rather than passively as you
walk around them.
balance: Cursed: Mirror reaction will only trigger if you step up to a
mirror, rather than if you step within two tiles of a mirror.
spellcheck: Cursed: Several chat feedback messages have been rewritten
to be less "overt" about their nature. (More "final destination", less
"a demon is haunting you".)
admin: Bad luck smite set to "permanent" can no longer be removed by
chaplains.
admin: Bad luck smite set to "permanent" won't gib the guy on death if
they've experienced one bad luck event.
refactor: Cursed/omen/bad luck has been refactored, report any oddities
with it.
/🆑
2026-07-02 09:33:30 +02:00
QuiteLiterallyAnythingandGitHub c68896e6f9 Fixes manual switching of night lighting on APCs (#96733)
## About The Pull Request
The button which allows you to manually toggle night lighting on APCs is
currently broken. When pressed outside of night shift, the APC will
briefly swap to night lighting before immediately going back to
standard. I suspect this might be caused by the changes to 'apc_main.dm'
which occured during PR #95744.

Additionally, the low power night light enabling introduced in #69374
doesn't seem to account for station security level when APCs get
repowered. If a whole station loses power while on red alert during
night shift (perhaps by a powersink) then the station will be entirely
on night lighting when repowered.

I assume neither of these quirks are intentional and have attempted to
fix them here.
## Why It's Good For The Game
Unless I've completely misunderstood something, this should (probably)
fix a bug as per local testing.
## Changelog
🆑
fix: Night shift lighting can be manually enabled through APCs again.
fix: Night lighting is no longer automatically reenabled during red
alert night shifts when APCs are drained and recharged.
/🆑
2026-07-01 13:49:58 +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
c3c54bf66c Heretic rework & reintroduction - less prog, less murder, more cultsim LARP (#5445)
# Before TMing this please contact me on discord, I'd like to observe
the TM

## About The Pull Request

### There is a shimmer in the air, again. Familiar. The nighttime walk
of dreams yet again takes the uncomfortable form of an icey woodfield,
moths and owls swooping overhead. An uneasy shiver runs down the spine
of the world. The gaze of the Light focuses on our lowly region of space
- will you knock?

Design doc V1 (Tentative, may change based on feedback):
https://hackmd.io/@NikoTheGuyDUde/B1XEAAv3Zg

Reverts https://github.com/Bubberstation/Bubberstation/pull/5268 by
reworking heretic into a far less scaling, less dangerous, and less
murdery antagonist. Read the design doc for more.

### DISCLAIMER
I was not a mainline heretic player, nor someone who had constant
contact with ehretics. Therefore, I am not the best judge of heretic's
balance. A lot of this is **prone to change**.

### Changes
Heretic is now named **acolyte.**

#### Base kit
1. Heretics can no longer blade break. This is because jesus christ
blade breaking was annoying but also as a way to remove some of
heretic's crazy mobility.
2. Cloak of shadows and warren king's welcome are now 0.5 cost shop
items.
3. Passives are purchased now, with cost based off the path itself.
4. The same is true for blades and the mansus grasp mark, being 2 cost
nodes.
5. The heretic aura is now completely disabled, until I find some way to
use it.
6. The living heart ritual now requires plasma. You cannot get a heart
in perma, good riddance.
7. You can no longer shovestun after a grasp. Still a very useful tool,
though.
9. _**ASCENSION IS GONE.**_ Your only progression is with your
objectives. Find a gimmick to do if you want. Opening ways will be hard
enough.
10. Rituals & Mansus grasp are disabled if you have no heart. Its now
complete neutering.

#### Countermeasures
1. No heart = No rituals and no mansus grasp for anything but runes.
2. Added antimagic collars to security and cargo that act the same as
having no living heart, but is less invasive and can be more easily
removed.
3. Most heretic items have examine hints to non-heretics now.

#### Progression
1. Heretics now only progress via their intrinsic objectives, and only
up to a point. Ex. 0.5 points per influence, 2 points per way.
4. Passive generation is also substantially slower.
5. Heretics now have access to **fifteen knowledge points** on spawn,
and **their entire research tree+draft shop**. No more draft freebees
exist, either. (This is prone to change)
#### Objectives
1. Drain Influences - Influences now passively drain sanity aroudn them,
cause hallucinations, and have a rare onetime chance to spawn a heretic
mob. The heretic must drain **six-seven** influences to gain **two**
knowledge points.
2. Open Ways - Ways are a new type of heretic influence that spawn
exclusively in high-importance or high-traffic areas. A heretic must
perform a ritual with four randomly generated items on the way to open
it. Once open, the way has a variety of effects, the majority of which
are **beneficial, but in a bad way.** Ex. spawning 5000 mols of a
valuable gas. The heretic must drain **three** ways to gain **four**
knowledge points.
3. Wildcard - There are currently five wildcard objectives any heretic
can roll. **One:** Steal 1000-1250 credits from crewmembers using the
Claw of the Capitalist ritual. **Three:** Have 9-10 crewmembers consume
potions from the Mawed Crucible. **Four:** Perform a ritual in the SM
chamber to neuter its output for 10 minutes. **Five:** Perform a ritual
in the AI upload to upload 3 ion laws to the AI.
#### New spells
1. Cloak of shadows & Warren king's welcome are now 0.5 cost knowledge -
This gives me a reason to give heretics just a bit more starting
knowledge.
2. The Owl's Secrets - Sacrifice a radio, a pair of ears, and a
bluespace crystal to cast a curse on the telecomms processors. For five
minutes, any outgoing message will be corrupted into heretic-speak, and
will damge the sanity and brain of anyone who hears them. If you start
seeing hypnophrase in the chat, take off your headset or turn off the
processors. 2 uses, as this has the potential to be really annoying. 1
cost.
3. Paranoia's eye - A silent, focusless spell that curses nearby people
to see everyone around them as heretics and disables their ability to
examine them for one minute. 1 cost.
6. Claw of the Capitalist - Allows you to transmute someone's blood into
money by stealing it from their account. Each 1u of blood of 5% drained.
If the blood is from a phylactery, it wont steal any that will reduce
the target's account below 300 credits. The target is notified when this
happens. 1 cost.
7. Voice of the mansus - Single use, but re-researchable, ritual that
allows you to do a fake announcement. 1 ears, 1 radio. 0.5 cost.
12. Trickster's pen - Transmute a pen, a sheet of plasma, and a pair of
eyes into a pen that can be used to change the name, age, job, and trim
of a card, and clicked to turn you momentarily near-invisible. 1 cost.
13. Trickster's mask - Transmute a bandana and a spraycan into a
chameleon mask. Thats it. Best with the pen. 0.5 cost.
14. Trickster's Promise - prestidigitation. You can make an item glow,
clean a atom (cleans forensics), shoot confetti, or my personal
favorite, increase the food quality of an edible by 2 and add 5u of a
weak synth-healing omnizine to it. Perfect for chef heretics. 1 cost.
15. Unwrap Minds - EARLY PULL FROM
https://github.com/tgstation/tgstation/pull/95796/. Scalpal, glass
shard, paper, victim. Hypnotizes the victim with whatever is on the
paper. 2 cost.
16. The Blacksmith's Hammer - One diamond, one set of wirecutters,
upgrades your mansus grasp to emag whatever you hit on right click. One
time use - has to be reinvoked every time. 1 cost.
17. Watching Eye - One set of eyes, a sheet of plasmaglass, and a
blindfold creates a one-time small item that can be viewed as if it was
a long-rnged x-ray camera. Has 10% opacity, for sneakiness. While
uncontained in anything, the heretic can whisper a phrase - such as
sleep, blind - to create a short-term, localized negative effect on
non-heretics that the eye is viewing (but only if theyd be viewable
without x-ray). 2 cost, only one can be made - high risk, high reward.
Sprite by Burger, from path of exile.
#### Spell rebalance
1. Ether of the newborn now doesnt heal normal damage. Get a medkit for
that. Additionally, implants remain. Get a _doctor_ for those, or use
any of the other methods to break them.
2. Mawed crucible potions can now be consumed by non-heretics, albiet
disgusting. The potion shop gimmick is real. Additionally, crucible soul
now lasts for 20 seconds and leaves a trail towards the location you
jaunted from when you return. This is because I've heard quite a few
people complain about this thing in the olden days. This doesnt make it
useless, but it does make it more difficult to use.
4. Space phase now has a 2 second do after before phasing out,
uninterruptable. This is mainly for tramstation and icebox when holy
fucking shit it is ridiculous.
5. Wave of desparation now costs 3 points.
8. Armor is now four points.
9. Rust kit and paintings are gone.
10. Codex morbus is gone. Sorry, I dont want to deal with rebalancing it
right now.
11. Phylactery now needs LOS, and has a 3 second do after.
12. Void cloak now disguises itself instead of going invisible.

### Changed paths

#### Void
In the interest of making void a little less murderkill, I opted to add
some flavor and alternate use to void's abilities.

**Void chill** can now put you to sleep if you click its status. This
sleep will heal you via cryoxadone. Being hit will wake you up, as will
void chill going away.
* This is intended to add a alternate, medical use to void, as well as
to nerf void chill a little bit. It does nothing to help you in active
1v1 combat, but if the void heretic disengages, you can heal yourself.
Its alsl nice and flavorful.
Void chill is also now nearly 100% countered by leporazine. Coffee and
tea help with the slowdown, but dont help with cold at 5 stacks.

**Void pull** is gone. **Cloak of darkness** replaces it, with perfect
invisibility taht prevents the use of any tools or abilities while its
active. Being hit instantly banishes it. The cloak slowly cools the air
around you, so if people are aware of your status of a void heretic,
they might be able to guess the chill in a previously warm room might be
you.

**Void conduit** no longer griefs windows and doors. It now chills the
air around it, while putting people to sleep - using the same eldritch
sleep that void chill does. You can use coffee to counteract this, or
simply fire at the conduit from a distance.

**Void cage** now heals the target for 2 of each damgae type a second.
Can now be self-cast. _Still useful for its intended roles._

**Void phase** now has a 40 second cooldown instead of 20. 20 is
ridiculously low for a jaunt with guaranteed EVA power, and 40 should
prevent its abuse.

_Void will probably receive further changes._ On the docket is a void
phase nerf and a void conduit nerf.

#### Moon

**Ringleader** no longer stuns you if you kill a clone, only knocks
down.
**Lunar parade** now lasts for 45 tiles, down from 60.
The passive's healing is reduced by 25%.
The blades upgraded brain damage is now 20, and the sanity threshold for
insanity is now disturbed.
The armor now translates slughtly more health, meaning its less
protective.

_I understand moon the least of all the paths, but I love its flavor, so
I decided to focus on it. Im balancing based off what Roxy suggested
were the issues._

## TODO

- [x] Void path rework
- [x] Investigate if we need to nerf moon more, maybe reflavor it as
well
- [x] Implement the third objective
- [x] Rigorous bug testing
- [x] Rewrite UI
- [x] Remove irrelevant tarting spells (sacrifice, notably)
- [x] Add more non-combat spells

### Implemented paths

- [x] Void
- [ ] Moon
- [x] Lock
- [x] Flesh
The paths beneath this line will be focused on after the initial TM is a
success.
- [ ] Blade
- [ ] Ash
- [x] Cosmic
- [ ] Rust
## Why It's Good For The Game

Heretic is one of the most flavorful internal antagonists in the entire
game, flavorful enough people were making characters around heretic,
people had entire storylines based on heretic, and I feel a lot of value
was lost with heretic. Simulatniously, uh, _**heretic was one of the
worst designed antags in the game?**_ Too powerful, too scalable, and
generally just has a "I HAVE A ANTI-EVERYTHING SHIELD" vibe.

This PR brings it back as a static, traitor-style antag with limited
progression. Variety is always good.
## Proof Of Testing
<details>
<summary>Screenshots/Videos</summary>
TODO
</details>

## Changelog
🆑
add: Heretic - Now reworked as a far less oppressive and far less
scaling antagonist
/🆑

---------

Co-authored-by: Roxy <94389951+SapphoQueer@users.noreply.github.com>
2026-06-18 20:37:25 +02:00
Leland KembleandGitHub 32fe49e63c Fixes pinpointers when AI shunts (#96351)
## About The Pull Request

Checking `occupier` right after `occupier` is nulled

Also, entirely unused signal, deleted.

## Why It's Good For The Game

Runtime Error

## Changelog
🆑

fix: Pinpointers stop tracking a shunted ai when that ai is no longer
shunted

/🆑
2026-06-06 18:08:46 +02:00
Ugo ManzoandGitHub c8c2541967 Fix: Prevent infinite recursion in light destruction (#96126) (#96348)
## About The Pull Request

A synchronous signal re-entrancy vulnerability caused a server crash
when plasma-infused floor lights were ignited.
When on_deconstruction() called break_light_tube(), the tube spawned
sparks before updating its internal broken state. The sparks ignited the
plasma, which triggered a secondary on_deconstruction() on the same
tick, resulting in an infinite recursion loop and eventual Overflow.
<img width="2559" height="1391" alt="Screenshot 2026-06-04 151658"
src="https://github.com/user-attachments/assets/e8f1b5fa-826e-4c76-8d04-3ba6c424822a"
/>

This PR applies a State-Before-Side-Effects pattern, the status =
LIGHT_BROKEN mutation is now applied before do_sparks() is invoked
(caching the previous state for the effects). This kills any synchronous
recursive loops originating from the sparks.
<img width="2559" height="1389" alt="Screenshot 2026-06-04 155247"
src="https://github.com/user-attachments/assets/db5b346e-d525-493b-ab64-00acc48493cd"
/>

Fixes #96126

## Why It's Good For The Game

Fixes a reproducible server crash that could be triggered by a single
player in seconds if they got metalgen (funny but broken). It also
hardens the core light machinery architecture against future re-entrancy
bugs caused by synchronous environmental events.

## Changelog

🆑
fix: Fixed a server crash caused by igniting plasma-covered floor
lights.
/🆑
2026-06-05 08:32:54 +12:00
shayoki f601a6ddaf Merge remote-tracking branch 'tgstation/master' into upstream-6-2-2026 2026-06-03 01:23:54 -05:00
MrMelbertandGitHub 6b631cb2c2 Roundstart nuke ops now spawn on an elevator to wait while the base loads in (#96178) 2026-06-02 20:59:42 +10:00
MrMelbertandGitHub 49d502ac9b Optimizes grid check event a bit (+minor fixes) (#96075) 2026-05-27 20:43:58 -04:00
AeriandGitHub adc35e700b Make gravgen sounds respect announcement preference (#5601)
## About The Pull Request

Gates the EXTREMELY LOUD gravity generator startup/shutdown sound behind
the existing announcement sound preference with the other highly
irritating Skyrat announcement sounds.

Previously, the gravity generator’s up/down sounds were played directly
through `playsound_local()`, which meant they could still play even when
a player had disabled announcement sounds. This PR checks
`/datum/preference/toggle/sound_announcements` before playing the
gravgen sound.

This only affects the sound playback. Camera shake and gravity behavior
are unchanged.

## Why It's Good For The Game

The gravity generator restart sound is loud, lengthy, and
announcement-like, so it should respect the same player preference as
other announcement sounds. I can distinctly tell that these two sounds
are part of the "Skyrat announcer pack" which is mostly dispelled by the
sounds. The station still shakes and it makes a softer noise somehow
anyways, so I think it works great!

This improves preference consistency and gives players who disable
announcement sounds a way to avoid what is definitely an announcement
sound.


## Changelog

🆑
sound: Gravity generator startup/shutdown sounds now respect the
announcement sounds preference.
/🆑
2026-05-17 04:11:29 +02: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 01c26ef5c4 Solar arrays don't check for the pressence of space vines every process tick (#96010)
## About The Pull Request

Replaces the space vine check in solar `/process` with a turf trait

## Why It's Good For The Game

Just cleans up this random bespoke interaction for something more
reusable

## Changelog

🆑 Melbert
code: Solar arrays don't check for the pressence of space vines every
process tick
/🆑
2026-05-11 11:17:46 -04:00
Leland KembleandGitHub e5a1cae7e8 Cables without power do not produce sparks when placed (#95908)
## About The Pull Request

Cables attempted to shock, and thus produced sparks, regardless of
whether they had any power in them.
Also, one letter vars.

## Why It's Good For The Game

Sparks from where

## Changelog
🆑

fix: Cables without power no longer produce sparks when placed

/🆑
2026-04-29 22:26:35 +01:00
BloopandGitHub 966d6547e8 Big tooltype decargo-culting (continued) (#95814)
## About The Pull Request

Gets some instances that I caught missed by
https://github.com/tgstation/tgstation/pull/95408
2026-04-29 12:19:00 -05:00
tmyqlfpirandGitHub 901a1d4450 Add USB ports to emitters/temperature pumps/temperature machines (#95497)
## About The Pull Request

This PR adds USB functionality to temperature pumps, emitters and
temperature control unit machines.

<img width="1082" height="340" alt="working"
src="https://github.com/user-attachments/assets/25e40c17-33ab-4159-b431-b3ccbe83626d"
/>

### New USB Components

<img width="139" height="101" alt="emitter"
src="https://github.com/user-attachments/assets/66580351-6cca-4dfe-9de4-3813cf62678c"
/>

* Emitter
New exposed controls allow you to manually fire a single beam, and get
signals whenever it is toggled on/off/fired.
It doesn't allow a player to toggle it on/off (must be done physically).
ID locking the emitter will also lock out the ability to fire the
emitter via USB.

<img width="303" height="226" alt="temp pump"
src="https://github.com/user-attachments/assets/4d0e6758-d653-4ac1-a080-d8e31d64408d"
/>

* Temperature Pump
This works exactly the same as the other USB controlled pumps, with the
addition of setting the heat rate.

<img width="267" height="151" alt="temperature control"
src="https://github.com/user-attachments/assets/6fff5148-bd70-4a1c-9899-10c997279669"
/>

* Temperature Control Unit
The USB interface now allows this to be remotely turned off and on like
the other USB pump interfaces.

## Why It's Good For The Game

These three parts are crucial to engineering/atmos projects, and gives
experienced players more depth to toy with circuits.

## Changelog

🆑
add: Added USB interface to emitters, temperature pumps and temperature
control unit machines
/🆑
2026-04-29 16:52:55 +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
FinancialGooseandGitHub e98cb75c57 Refactor gasmix mole change into a proc (#95327)
## About The Pull Request
Refactor the majority of the current gasmix mole change use cases into a
proc called adjust_gas which simply adds the designated mole count of
the species into the gas mix while also handling asserting the gas and
garbage_collect()
I also added adjust_multiple_gases and convert_gas() for modifying
multiple gases and within a gasmix

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

## Changelog

🆑
refactor: refactored majority of gas_mix mole change into adjust_gas()
proc
/🆑
2026-04-21 13:43:47 -07:00
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 5f94264779 Adds an admin secret that fixes gravity (#95618) 2026-04-05 18:49:05 -04:00
SmArtKarandGitHub d1393ee0ad Fixes unpowered field generators yeeting people (#95561) 2026-03-31 15:33:23 -04:00
SmArtKarandGitHub 11fbb59049 TGUIfies some VV actions, replaces the actions dropdown with a searchable one (#95480) 2026-03-29 21:47:29 -04:00
713dadae87 Fixes friendly wisps, wizard orbiting gravity anomalies & tesla periphery balls being disabled on shuttle transit (#95407)
## About The Pull Request

When something that is orbiting something travels on a shuttle with that
thing, its orbit is temporarily removed and then put back right after.
To make this happen, the orbiting component calls `stop_orbit()` (on the
orbiting object) & then `begin_orbit()` (on itself, the component). This
means that effects that begin in `orbit()` & delete their effects in
`stop_orbit()` simply lose their effect without putting them back,
because `orbit()` is never called again.

The solution presented is to pass the `refreshing` argument given in the
component's `end_orbit()` into the atom's `stop_orbit()`, and condition
actual deletion on that. The `refreshing` argument is `TRUE` only during
shuttle movements and re-orbits of the same thing.

## Why It's Good For The Game

fixes #95331 & wizard grav anoms & tesla periphery balls

## Changelog
🆑

fix: Friendly wisps, wizard gravity balls, & tesla periphery balls are
no longer disabled due to shuttle transit

/🆑

---------

Co-authored-by: Time-Green <7501474+Time-Green@users.noreply.github.com>
2026-03-24 16:51:27 +01:00
MrMelbertandGitHub 43c049386f RTG code refresh (#95372)
## About The Pull Request

1. Mappers and admins can now VV RTG power without it breaking

2. Replace attackby usage

3. `base_icon_state` usage

4. Rewriting power in terms of watts

5. Grammar updates

## Why It's Good For The Game

These are mostly meant for events and mappers but they were relatively
difficult to use for events and mappers, requiring you made a subtype.

This just brings the code up to snuff to make them more usable.

## Changelog

🆑 Melbert
code: Cleaned up RTG code. Admins can now VV them easier. If you come
across a ruin on Lavaland or in space that uses them and see any odd
behavior, report it as an issue.
/🆑
2026-03-24 07:25:20 +01:00
gavlaandGitHub 392f93e89a Merge branch 'master' into upstream-feb12-2026 2026-03-11 00:05:03 -05:00
ArrisFairburneandGitHub 6f0a9400f4 Arris biodome maptainance (#5127)
## About The Pull Request

Updates Biodome to be gooder.

## Why It's Good For The Game

Biodome is one of the more interesting maps thanks to the titular
gimmick, but for one reason or another the playerbase loathes it. I'll
be making changes to Biodome that I think will improve it, as well as
changes to


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

<img width="1861" height="1187" alt="17684994760802257449426043441716"
src="https://github.com/user-attachments/assets/0617a32e-bee7-4cbf-a5d9-e9234046bde3"
/>
<img width="1952" height="1483" alt="17684995784481011964462438821388"
src="https://github.com/user-attachments/assets/bf8ee6df-f3a6-4692-bff2-729be806b2b6"
/>
<img width="1610" height="1279" alt="17684995044717250940024567843557"
src="https://github.com/user-attachments/assets/c33d9ba5-f20c-42a4-a985-b0dae3b47e66"
/>

</details>

## Changelog
🆑
map: various changes to Biodome
/🆑

## To-do 

- [x] Rework to science
- [x] Divide upper biodome with firelocks so that vacuum cannot spread
- [x] Plasmaglass to turbine
- [x] Compress solars and make them stylistically identical: follow
Boxstation example
- [x] Expand bitrunning; chute to send crates straight to ore storage?
Space heater. Make it look pretty and Gamer in there.
- [x] Remove bitrunning window. (Gamers hate sunlight, and also
voidwalker abductions)
- [x] Make unique cryopods room
- [x] Expand crystallizer room (
https://discord.com/channels/1059199070016655462/1460406585401544867/1461868917285982269
)
- [x] Reorganize service biodome departments: move janitorial to be
built into the wall. Remove bathroom and rad shelter and build them into
a building. Make more space so that the biodome can be more bio.
- [x] Reorganize the bridge: move more stuff to lower floor (meeting
room, HOP office). Make the blueshield office less of a shrek shack.
- [x] Make the cargo waiting area bigger and friendlier to passerby.
- [x] Expand blacksmith's workshop. Right now it's more like maints...
- [x] Transport tube rebuild; make them less winding and more practical
to get to square hallways around station
- [x] Add more space windows for void walkers 
- [x] Wire APC research lab into the grid
- [x] Warden's office windoors
- [x] Wires/atmospipes south of sec to connect in
- [x] Sec firing range and maints door near it need access change proper
- [x] Look at courtrooms access
- [x] Remove metal foam floors from maints above engi
- [x] APC in R&D front office wire to grid
- [x] APC in sec C-hallway wire to grid
- [x] Correct airlocks direction near vacant office
- [x] Vacant office mislabelled maints door
- [x] SM cooling loop unconnected in plasma windows
- [x] Fix dispopipes and atmospipes in wrestling arena
- [x] Biodome lake tiles need planet atmos removed
- [x] Doors in science need acess tweaks
- [x] L-shaped genpop area
- [x] Fix elevator engineering side to be OSHA compliant
- [ ] Beer tap fix
- [x] Sec locker room needs lights
- [x] Wall-mounted extinguisher is on the table near arrivals secpoint
- [ ] Check maints for holes
- [x] Remove duplicated button in sec mechbay
- [x] Fix access to the law office backdoor
- [x] Change the west minibridge
- [x] Check on the courthouse backroom access
- [x] Replace the metal foam over the engineering areas
- [x] The new sauna in the unisex restrooms has no APC and therefore has
infinite power.
- [x] The old dorm in maints (with neon carpet) has an non-functional
bolting button. (Possibly intentional.)
- [x] Robotics mechbay shutters have no access, for the inside buttons;
hallway button does. (Possibly intentional.)
- [x] Captains Quarters area extenders outside of the area. (Image
attached below.)
- [x] Science external solars are disconnected from maintenance and the
walls do not attach properly (Image attached below.)
- [ ] Gather more criticism of Biodome flaws
- [ ] Testing
2026-03-10 20:26:37 -05:00
BloopandGitHub 38a086093e create_and_destroy will no longer spawn abstract types (#95071)
## About The Pull Request

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

## Why It's Good For The Game

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

## Changelog

Not player-facing
2026-03-08 00:34:47 -08:00
LucyandGitHub 651d7f074a minor optimizations for APC late_process (#95274)
## About The Pull Request

just some micro-opts for `/obj/machinery/power/apc/proc/late_process`,
ported from https://github.com/Monkestation/Monkestation2.0/pull/10529

firstly, i converted `if(!area || !area.requires_power)` to
`if(!area?.requires_power)`

secondly, when checking cell percentages, it called `cell.percent()`
repeatedly... instead of, y'know, just calling it once and setting it as
a var. i fixed that.

## Why It's Good For The Game

less proc overhead and less duplicate calls should be better

## Changelog
🆑
code: Minor code optimizations for APC processing.
/🆑
2026-03-01 17:31:35 -05:00
RoxyandGitHub cf8d8121c8 Add Emitter Emissives (#95270)
## About The Pull Request

Add an emissive overlay for the lights on emitters

## Why It's Good For The Game

<img width="285" height="218" alt="image"
src="https://github.com/user-attachments/assets/372f5b1b-61ed-4627-a189-577ec3aac264"
/>
<img width="275" height="234" alt="image"
src="https://github.com/user-attachments/assets/5959ac90-4856-427b-ab29-f1cbeb68422a"
/>


cool

## Changelog
🆑
image: emitters glow in the dark now
/🆑
2026-02-28 19:46:05 -05:00
Phantastic-SwanandGitHub 8cc58f2223 fixes crushing gravity around the grav gen when it goes offline (#95253)
## About The Pull Request

The Phantastic Swan comes out of the shadow realm to fix some shit
again. One liners baby.

Whenever the grav gen went offline, the crushing gravity effect around
it stayed active. This was because the gravity generator seems to
override it's own gravity field on round start, removing the connection
between it's status and the forced gravity around it.

## Why It's Good For The Game

Fixes a bug. I think it also closes #76403 

## Changelog

🆑 Swan
fix: fixes the gravity generator's crushing gravity effect not
disappearing when the gen goes offline
/🆑
2026-02-26 19:45:54 -05:00
MrMelbertandGitHub 4fe16acd0b Minor shock() refactor (#95204)
## About The Pull Request

`shock` was copy pasted across a bunch of base types
I needed the behavior unified and it was fairly trivial to do 
So now we have `/obj/proc/shock` which all the old implementations call 

## Changelog

🆑 Melbert
refactor: Made some minor changes to how things like airlocks, vendors,
and autolathes shock you. Report any wierdness with that
/🆑
2026-02-24 21:12:59 -05:00
SmArtKarandGitHub a3498fdcd7 Material Science 1: A bunch of math (#95090) 2026-02-22 16:53:51 +11:00
nevimer 00ccf0c6b5 Merge remote-tracking branch 'tgstation/master' into upstream-feb12-2026
# Conflicts:
#	.github/CODEOWNERS
#	.github/workflows/compile_changelogs.yml
#	.github/workflows/stale.yml
#	SQL/database_changelog.md
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/__DEFINES/atom_hud.dm
#	code/__DEFINES/inventory.dm
#	code/__DEFINES/mobs.dm
#	code/__DEFINES/species_clothing_paths.dm
#	code/__DEFINES/subsystems.dm
#	code/__DEFINES/surgery.dm
#	code/__HELPERS/global_lists.dm
#	code/_globalvars/lists/maintenance_loot.dm
#	code/_globalvars/traits/_traits.dm
#	code/controllers/subsystem/minor_mapping.dm
#	code/controllers/subsystem/processing/quirks.dm
#	code/controllers/subsystem/shuttle.dm
#	code/datums/components/palette.dm
#	code/datums/components/surgery_initiator.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/hud.dm
#	code/datums/mood.dm
#	code/datums/mutations/chameleon.dm
#	code/datums/quirks/negative_quirks/nyctophobia.dm
#	code/datums/status_effects/debuffs/debuffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/slime/slime_leech.dm
#	code/datums/weather/weather.dm
#	code/game/data_huds.dm
#	code/game/objects/items.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/frog_statue.dm
#	code/game/objects/items/rcd/RLD.dm
#	code/game/objects/items/robot/items/hypo.dm
#	code/game/objects/items/stacks/medical.dm
#	code/game/objects/items/stacks/wrap.dm
#	code/game/objects/items/storage/garment.dm
#	code/game/objects/items/tools/medical/defib.dm
#	code/game/objects/items/weaponry.dm
#	code/game/objects/items/weaponry/melee/misc.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/game/objects/structures/curtains.dm
#	code/game/objects/structures/dresser.dm
#	code/game/objects/structures/girders.dm
#	code/game/objects/structures/maintenance.dm
#	code/game/objects/structures/mirror.dm
#	code/modules/admin/greyscale_modify_menu.dm
#	code/modules/admin/verbs/light_debug.dm
#	code/modules/antagonists/ashwalker/ashwalker.dm
#	code/modules/antagonists/heretic/knowledge/starting_lore.dm
#	code/modules/antagonists/ninja/ninjaDrainAct.dm
#	code/modules/art/paintings.dm
#	code/modules/client/preferences.dm
#	code/modules/client/verbs/ooc.dm
#	code/modules/clothing/head/wig.dm
#	code/modules/events/disease_outbreak.dm
#	code/modules/holodeck/holo_effect.dm
#	code/modules/jobs/job_types/head_of_security.dm
#	code/modules/jobs/job_types/security_officer.dm
#	code/modules/library/skill_learning/generic_skillchips/point.dm
#	code/modules/mining/lavaland/ash_flora.dm
#	code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/basic/guardian/guardian.dm
#	code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
#	code/modules/mob/living/carbon/carbon.dm
#	code/modules/mob/living/carbon/human/human.dm
#	code/modules/mob/living/carbon/human/human_defines.dm
#	code/modules/mob/living/carbon/life.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob/living/living_defines.dm
#	code/modules/mob/mob.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mod/mod_control.dm
#	code/modules/mod/modules/modules_general.dm
#	code/modules/modular_computers/computers/item/computer_ui.dm
#	code/modules/paperwork/paper.dm
#	code/modules/paperwork/paperbin.dm
#	code/modules/power/lighting/light.dm
#	code/modules/projectiles/guns/energy/kinetic_accelerator.dm
#	code/modules/projectiles/projectile.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/food_reagents.dm
#	code/modules/reagents/chemistry/reagents/other_reagents.dm
#	code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
#	code/modules/research/xenobiology/crossbreeding/_clothing.dm
#	code/modules/research/xenobiology/crossbreeding/prismatic.dm
#	code/modules/surgery/advanced/brainwashing.dm
#	code/modules/surgery/advanced/lobotomy.dm
#	code/modules/surgery/amputation.dm
#	code/modules/surgery/blood_filter.dm
#	code/modules/surgery/bodyparts/_bodyparts.dm
#	code/modules/surgery/brain_surgery.dm
#	code/modules/surgery/cavity_implant.dm
#	code/modules/surgery/coronary_bypass.dm
#	code/modules/surgery/gastrectomy.dm
#	code/modules/surgery/healing.dm
#	code/modules/surgery/limb_augmentation.dm
#	code/modules/surgery/organ_manipulation.dm
#	code/modules/surgery/revival.dm
#	code/modules/surgery/sleeper_protocol.dm
#	code/modules/surgery/surgery_helpers.dm
#	code/modules/surgery/surgery_step.dm
#	code/modules/unit_tests/_unit_tests.dm
#	code/modules/unit_tests/designs.dm
#	code/modules/unit_tests/icon_state_worn.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png
#	icons/map_icons/clothing/head/_head.dmi
#	icons/map_icons/clothing/shoes.dmi
#	icons/map_icons/items/_item.dmi
#	icons/mob/huds/hud.dmi
#	icons/mob/inhands/64x64_lefthand.dmi
#	icons/mob/inhands/64x64_righthand.dmi
#	icons/obj/machines/computer.dmi
#	tgui/packages/tgui/interfaces/OperatingComputer.jsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
#	tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
#	tools/icon_cutter/check.py
2026-02-12 23:50:09 -05:00
86a5caf594 Lets sinks mount to floors (#95062)
## About The Pull Request

That's all. 

The sprites clearly have a pedestal which is attached to the floor. They
shouldn't behave as if they are free floating wash basins.

<details><summary>example: a barber shop</summary>

<img width="614" height="818" alt="StrongDMM_ahHbCymkjR"
src="https://github.com/user-attachments/assets/aeee4090-e209-4ad7-8d1d-fef9dcbb36e2"
/>

</details>

Also runs the UpdatePaths script so it can collapse some duplicate tiles
which have been annoying me with diffs each time it's run.

## Why It's Good For The Game

More mapping flexibility for bathrooms and medical spaces.

## Changelog

🆑
code: sinks can be mounted to floors
/🆑

---------

Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
2026-02-08 18:48:53 -05:00
SmArtKarandGitHub f58b8511f0 Refactors effect_system (#94999)
## About The Pull Request

This PR refactors ``effect_system``s to be a bit easier to use by
getting rid of ``set_up``, allowing ``attach()`` to be chained into
``start()`` and refactoring most direct system usages in our code to use
helper procs.

``set_up`` was unnecessary and only existed to allow ``New``'s behavior
to be fully overriden, which is not required if we split
sparks/lightning/steam into a new ``/datum/effect_system/basic`` subtype
which houses the effect spreading behavior. This allows us to roll all
logic from ``set_up`` into ``New`` and cut down on code complexity.
Chaining setup as ``system.attach(src).start()`` also helps a bit in
case no helper method exists

I've added ``do_chem_smoke`` and ``do_foam`` helpers, which respectively
allow chemical smoke or foam to be spawned easily without having to
manually create effect datums and reagent holders.

Also turns out we've had some nonfunctional effect systems which either
never set themselves up, or never started, so I fixed those while I was
at it (mostly by moving them to aforementioned helper procs)

## Why It's Good For The Game

Cleaner code, makes it significantly easier for users to work with. Also
most of our effect system usage was copypasta which was passing booleans
as numbers, while perfectly fine helper procs existed in our code.

## Changelog
🆑
refactor: Refactored sparks, foam, smoke, and other miscellaneous effect
systems.
refactor: Vapes now have consistent rigging with cigs using the new
system.
fix: Fixed some effects never working.
/🆑
2026-02-03 22:23:09 -05:00
SyncIt21andGitHub 362ac3d7f3 Fixes 2 floor light instances not mounting (#94993) 2026-01-29 19:51:49 +01:00