Commit Graph

121590 Commits

Author SHA1 Message Date
MrMelbert
c080b83c41 Monkey eating glowup (#93759)
## About The Pull Request

1. Monkeys will only seek out food to eat if they are actually hungry,
rather than on an arbitrary cooldown.
2. Monkeys will no longer teleport-yoink food out of your hands.
Instead, they may get angry at you for stealing their food, and fight
you over it. The hungrier the monkey, the more likely they are to fight.
3. Monkeys will discard trash and empty glasses (on the floor) after
eating or drinking them.
4. Monkeys can target soup to eat
5. PunPun will no longer seek out drinks if they are hungry.
6. PunPun will now, if the bartender is absent and there are multiple
patrons around, attempt to find filled glasses or food to hand out to
patrons.
7. Several places that sought edible items no longer include drinking
glasses as edible items

<img width="656" height="185" alt="image"
src="https://github.com/user-attachments/assets/8b3a6ac1-ae2c-41a0-919f-b471ad93bb0f"
/>

## Why It's Good For The Game

PunPun shouldn't be yoinking glasses out of patron's hands - their
intended behavior is to serve drinks not steal them

Otherwise, monkey eating was a bit jank due to it being some of our
oldest ai code. I largely just brought it up to more modern ai
standards.

## Changelog

🆑 Melbert
add: If the bartender is absent, PunPun will serve filled drink glasses
to patrons that don't have one.
add: PunPun will now ignore filled drinks and items being held when
looking for stuff to eat.
add: Monkeys can eat soup.
add: Monkeys will no longer seek out food if they are not hungry.
add: Hungry monkeys might fight you over the food you are holding. The
hungrier the monkey, the angrier the monkey.
fix: Monkeys can no longer teleport items out of your hands to eat. 
/🆑
2025-11-08 01:32:46 +01:00
tgstation-ci[bot]
90377aa997 Automatic changelog compile [ci skip] 2025-11-08 00:28:06 +00:00
tgstation-ci[bot]
cfb95c659a Automatic changelog for PR #93631 [ci skip] 2025-11-08 00:09:46 +00:00
L0pz
22ed558265 Adds gladiuses (gladii?) (#93631)
## About The Pull Request

Adds the Gladius alongside its scabbard. Replaces undead roman
legionarries' claymores with gladii.
<img width="152" height="105" alt="image"
src="https://github.com/user-attachments/assets/fdd21960-0f73-4564-b381-7044838a0f51"
/>
<img width="194" height="165" alt="image"
src="https://github.com/user-attachments/assets/a3f602e1-9ce6-4ded-b40d-d7088da292c9"
/>
<img width="136" height="133" alt="image"
src="https://github.com/user-attachments/assets/e8105ba3-d1e5-42cb-86e5-16db6edd56f7"
/>


## Why It's Good For The Game

This started as me thinking "hmmm those guys shouldn't have longswords"
and so I gave them the gladius, the famous standard issue foot soldier
weapon for the roman army. It's better in that it's more historically
accurate, which is definitely something everyone cares about a lot.

## Changelog
🆑
add: Roman skeletons now have Roman swords.
/🆑

---------

Co-authored-by: die <96586172+grungussuss@users.noreply.github.com>
2025-11-08 01:09:23 +01:00
tgstation-ci[bot]
b4d4660414 Automatic changelog for PR #93729 [ci skip] 2025-11-07 23:56:46 +00:00
paganiy
ecdf809196 Add Insert Button to Chemistry Machines (#93729)
## About The Pull Request
Adds an "Insert" button to chemistry machine UIs so you don't have to
click on the physical machine behind the interface window.

<img width="1615" height="723" alt="Screenshot 2025-11-01 193237"
src="https://github.com/user-attachments/assets/184c02b1-5ee3-4426-af8e-4adae79d8703"
/>

## Why It's Good For The Game

- No more moving or closing UI windows just to insert containers
- Much easier to move beakers between different chemistry machines
## Changelog
🆑
qol:  Added Insert beaker buttons to chemistry machines.
code: Minor code update for interacting with chemical machines
/🆑
2025-11-08 00:56:26 +01:00
tgstation-ci[bot]
cccf8a5da7 Automatic changelog for PR #93783 [ci skip] 2025-11-07 23:55:47 +00:00
Cursor
8fc2743581 Gives Clown Ops a Unique SecHud Icon (#93783)
## About The Pull Request

<img width="97" height="84" alt="image"
src="https://github.com/user-attachments/assets/7df15cb4-336e-43a3-8991-25053a9fc8a8"
/>


## Why It's Good For The Game

Clowns are a proud people. They should be seen as clowns.

## Changelog
🆑
add: Clown Ops now have a unique SecHud icon.
/🆑
2025-11-08 00:55:26 +01:00
tgstation-ci[bot]
09a9ff6c23 Automatic changelog for PR #93816 [ci skip] 2025-11-07 23:37:16 +00:00
tgstation-ci[bot]
933ef102c7 Automatic changelog for PR #93818 [ci skip] 2025-11-07 23:37:07 +00:00
Leland Kemble
8cad3fc210 fixes runtime in plumbing iv add_context() (#93816)
## About The Pull Request

nullchecks `held_item` in `iv_drip/plumbing/add_context()` to prevent
runtimes when attempting to check null.tool_behaviour

## Why It's Good For The Game

fixes #93815

## Changelog
🆑

fix: prevents runtime when hovering over plumbing iv drip

/🆑
2025-11-08 00:36:58 +01:00
Roxy
4c0b617752 Fix PDA RaptorDex being unclosable (#93818)
## About The Pull Request

PDA apps use `<NtosWindow>` instead of `<Window>` because the former
adds a header with an X button and system info, moves all the content of
the RaptorDex component to a new RaptorDexContent component, converts
`<RaptorDex>` to be just the `<Window>` tag and adds a NtosRaptorDex
component for PDAs that uses `<NtosWindow>` instead

## Why It's Good For The Game

Fixes #93761 

## Changelog
🆑
fix: fixed RaptorDex PDA app having no close button
/🆑
2025-11-08 00:36:41 +01:00
tgstation-ci[bot]
550315c422 Automatic changelog for PR #93764 [ci skip] 2025-11-07 23:36:04 +00:00
LemonInTheDark
292bcef13c Adds proper cleanup for the vampire's blood levels hud element (#93764)
## About The Pull Request

This hung a ref, which both caused a harddel and also broke the user's
hud permentantly due to the stuck null in infodisplay

Halloween Moment! FUN JUMPSCARE!!!

## Changelog
🆑
fix: Changing your species from vampire to not vampire will no longer
brick your plane masters/rendering after 3 minutes or so.
/🆑
2025-11-08 00:35:45 +01:00
tgstation-ci[bot]
e0d86f14bc Automatic changelog for PR #93808 [ci skip] 2025-11-07 19:49:31 +00:00
mcbalaam
95d70f5d9b feat: removes varedited icon states from turret controls on 27(!!) maps (#93808)
## About The Pull Request

Removes the varedited "icon_state" from `turretid` objects on station
and away maps. Continues
https://github.com/tgstation/tgstation/pull/93728, closes #93766

## Why It's Good For The Game

Those icon states don't exist anymore, making the ingame object
invisible. My PR fixes that

## Changelog

🆑
fix: Turret controls are visible again
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-11-07 20:49:09 +01:00
tgstation-ci[bot]
ea21142e2a Automatic changelog for PR #93817 [ci skip] 2025-11-07 19:39:08 +00:00
Roxy
7d26c2c4f5 Fix elevator music (#93817)
## About The Pull Request

There was a few things going on here
- The prox monitor for elevators didn't need to be the advanced subtype,
and that was actually breaking it because for some reason with a range
of 1 `field_turfs` only includes the center turf and there are no
`edge_turfs`, meaning the check to not overlap music if you're already
in range wouldn't work and music would start every step except the
middle
- The looping_sound subtype for elevator music had `sound_channel`
already set but the `New` code for looping_sound also has a
sound_channel arg and didn't check if one has actually been passed
before setting it, so sound_channel was being overwritten with null and
thus the music would not stop when you exited the elevator zone

## Why It's Good For The Game

Fixes #92623
Fixes #88261 


https://github.com/user-attachments/assets/e5a2f736-bf68-430a-a3bc-070482e9b68e

## Changelog
🆑
fix: fixed elevator music starting every time you took a step
fix: fixed elevator music not stopping when you left the elevator
/🆑
2025-11-07 20:38:46 +01:00
tgstation-ci[bot]
9e7203845e Automatic changelog for PR #93613 [ci skip] 2025-11-07 18:00:37 +00:00
L0pz
2634d05098 Drone chat recolor (#93613) 2025-11-07 13:00:19 -05:00
tgstation-ci[bot]
b713d11ce7 Automatic changelog for PR #93694 [ci skip] 2025-11-07 14:25:46 +00:00
RikuTheKiller
337ab7f2c3 Refactors status effects to be based on subsystem ticks, among a few other minor status effect fixes/refactors (#93694)
## About The Pull Request

Refactors status effects to track their durations and tick intervals
using counters.
In effect, [var/duration] now directly refers to how many deciseconds
are left on the status effect.
I've also moved the old [var/tick_interval] [world.time] implementation
to a tick-based [var/time_until_next_tick] counter.

There are a couple, less noteworthy changes in here as well. The main
one is that there was an unused bit of bloat code for setting tick
intervals based on a random lower and upper threshold, but that can be
done in tick() now so it's completely redundant, and I thus removed it
entirely. That makes parts of [proc/process] much easier to read.

I added/modified some unit tests (which I expect to fail) to verify that
[var/duration] and [var/tick_interval] are both multiples of the
subsystem wait assigned to the status effect. If the programmer wants a
duration of 2.5 seconds, they expect it to work that way, but it won't
because SSfastprocess only ticks once every 0.2 seconds, which 2.5 is
not a multiple of. This becomes way more apparent when a status effect
is set to use SSprocessing.

The final, perhaps most important unit test I've added, is one that
verifies that the overall tick count and overall accumulated
[seconds_between_ticks] are equal to "[var/duration] /
[var/tick_interval]" and "[var/duration]" respectively.
## Why It's Good For The Game

The main thing this PR fixes is timing inconsistencies. Before this PR,
durations and tick intervals were tracked using world.time, while the
[proc/tick] call timing was dependent on the wait time of the subsystem
the status effect was processing on. Thing is, SSfastprocess and
SSprocessing rarely run completely in one tick during real gameplay.
This led to a continuous desync where status effects were consistently
inconsistent in their overall tick count. This is a big problem as
[seconds_between_ticks] is constant and thus doesn't account for this
difference in tick count.

As an example, Changeling's Fleshmend has a duration of 10 seconds, a
tick interval of 1 second and a healing rate of 4 brute per tick.
Previously, if the server was lagging even slightly and it only ticked 8
times over the course of 10 seconds, you would heal 32 health rather
than the 40 that a full Fleshmend would give you. The total effect
potency of a status effect being reliant on server lag is incredibly
stupid, especially for status effects that have an associated cost.
(like the aforementioned Fleshmend)

As for the refactors, they make status effect code easier to read and
debug. Unit tests also make verifying things are working as intended
much easier.
## Changelog
🆑
fix: Status effects now tick consistently, with Fleshmend and such
giving a consistent total healing amount. Report any oddities.
refactor: Status effect code is now easier to read and makes more sense.
Again, report any oddities, the changes are major.
/🆑
2025-11-07 15:25:16 +01:00
tgstation-ci[bot]
7f7c84ae52 Automatic changelog for PR #93769 [ci skip] 2025-11-07 14:23:59 +00:00
Tim
b77d5d9bdf [NO GBP] Fix locked secure safes not showing correct UI (#93769)
## About The Pull Request
Caused by: 
- #93085

I messed up the formatting for arguments accidentally so the 2nd
argument was moved to the 3rd position due to the extra `,`.

## Why It's Good For The Game
Fixes the UI.

## Changelog
🆑
fix: Fix locked secure safes not showing correct UI
/🆑
2025-11-07 15:23:40 +01:00
tgstation-ci[bot]
5cb4d0f2c2 Automatic changelog for PR #93777 [ci skip] 2025-11-07 14:23:27 +00:00
LT3
d4f5b137b2 Add active RETA to airlock examine (#93777)
## About The Pull Request

Adds the active RETA grant to examine on airlocks.

## Why It's Good For The Game

Lets you know what RETA door access is enabled without having to guess
by trying to open it. In the future this could be expanded to different
icon states based on active department.

## Changelog

🆑 LT3
qol: Airlock RETA status is now shown on examine
/🆑
2025-11-07 15:23:08 +01:00
tgstation-ci[bot]
1fa09aaf47 Automatic changelog for PR #93802 [ci skip] 2025-11-07 13:34:37 +00:00
LemonInTheDark
4fc1e031a0 Fixes SS_KEEP_TIMING causing RUNLEVEL_LOBBY subsystems to fire with 75% their set wait (#93802)
## About The Pull Request

Ok so this explanation is gonna suck a bit I'm sorry. I was sittin in
coderbus and @flleeppyy mentioned this problem where SSticker counted
down to roundstart significantly faster then it should.

I poked on tg, and saw the same behavior. I did further poking, and
realized that despite wait being 20ds, the actual delay between fires
was 15ds.

I'll spare you the rest of the story, it turned out that SSticker's
next_fire was set to 0 at the start instead of world.time, so when we
did the KEEP_TIMING thing of incrementing next_fire by wait, we were
pretty much always going to be trying to fire on the very next tick.

This was prevented by the existing sanity check which limits how fast
KEEP_TIMING subsystems are allowed to try and recover their tick locked
nature, reducing it to 15ds instead of 1ds delay.

The actual problem here was next_fire not being set properly, which is
normally handled by a block in the while(1) block that checks to see if
the run level has changed. Unfortunately if you have the starting run
level, this never happens.

This impacts EXACTLY SSticker, and nothing else. For now at least.

Solution is to write similar code in Loop's setup block, which brings
SSticker's roundstart timer back into parity with real life. This has
the nice side effect of achieving the randomized starting delays we want
for subsystems, to prevent clumping. See discussion on #71730 for more
on that.

I'm going straight off the dome on this one. Didn't wanna bug mto about
it if I feel comfortable and all.

Please note, this does mean the roundstart lobby time is slower now,
it's accurate but it's slower. Might need config changes idk.

I also added some code that checks to see if the subsystem we're
randomizing is a ticker or not, I'm kind of dubious on the "wait is
actually TICKS for ONLY TICKER" thing but I'm not comfortable enough to
change that yet.

## Why It's Good For The Game

When we say the round starts in 5 minutes, it should actually do that.

## Changelog
🆑
fix: Fixed a timing issue with SS_KEEP_TIMING subsystems, which impacts
exactly SSticker. TLDR is roundstart will now actually take the time it
says it does, instead of 75% of it.
config: The roundstart delay config is now accurate, so you may want to
decrease it to not overlengthen lobby time. IDK you decide.
/🆑
2025-11-07 14:34:18 +01:00
tgstation-ci[bot]
ac0fa328d6 Automatic changelog for PR #93812 [ci skip] 2025-11-07 13:27:46 +00:00
Alien
b08cb86bd6 Spaceproof plasmaman EVA suits from cargo can have their extinguisher properly refueled (#93812)
## About The Pull Request

Refueling them now gives them 10 charges like it's supposed to. You cant
reduce it's charges by refueling it now

## Why It's Good For The Game

Fix bug

## Changelog
🆑 Cat
fix: Plasmaman EVA suits from cargo can have their extinguisher refueled
fully now
/🆑

---------

Co-authored-by: John Doe <markkavalerov87@gmail.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2025-11-07 14:27:26 +01:00
tgstation-ci[bot]
7279c6e908 Automatic changelog for PR #93753 [ci skip] 2025-11-07 02:10:50 +00:00
Aliceee2ch
ea67ebe963 Desouls your soups (#93753)
## About The Pull Request

Changes the old bowl sprites to the new one in every food that uses the
bowl sprite.

![awesomesoup](https://github.com/user-attachments/assets/05647c5f-db93-4a67-9095-2ffbc5d7310e)

## Why It's Good For The Game

I like new sprites!! Also consistency

## Changelog

🆑
image: Resprited every food in bowl (salads, soups, martian, moth,
etc.).
/🆑
2025-11-07 03:10:29 +01:00
tgstation-ci[bot]
c203004032 Automatic changelog for PR #93779 [ci skip] 2025-11-07 02:10:19 +00:00
Bloop
69b2e3ea71 Prevents SSwardrobe from messing with modsuit parts (#93779)
## About The Pull Request

If you have an outfit with a modsuit control, and are equipping it to a
dummy for previews, when you unequip it SSwardrobe tries to delete the
individual parts when stashing the mod control since they are in the
suit's `contents`.

The control is then stashed, and the parts all cause hard deletes after
a while since the suit itself is still holding a ref to all of them.

Since there is currently no good fast way of checking all the modsuit
parts outside of a nest of istypes I added an item flag for it.

## Why It's Good For The Game

Fixes an oversight, should not have any performance impact.

## Changelog

🆑
fix: fixes an oversight where the wardrobe system tries to delete
modsuit parts when stashing the modsuit
/🆑
2025-11-07 03:10:00 +01:00
tgstation-ci[bot]
fb458c1649 Automatic changelog for PR #93781 [ci skip] 2025-11-07 02:09:11 +00:00
tgstation-ci[bot]
151cf92a99 Automatic changelog for PR #93782 [ci skip] 2025-11-07 02:09:00 +00:00
Leland Kemble
e0bb662db7 Prevents double-dipping when making fake walls (#93781)
## About The Pull Request

Makes each "if stack is this material type" an "else if" in the fake
wall making code, preventing trying a second time after failing a
`do_after()`

## Why It's Good For The Game

You can currently do this:



https://github.com/user-attachments/assets/b4fa2ecc-84e8-48fb-9bf9-7ba8388de9a7

You should not be able to do that, for two reasons.

## Changelog
🆑

fix: prevents retrying making a fake wall from range

/🆑
2025-11-07 03:08:53 +01:00
MrMelbert
e9339f4f7e You can't use null as a grouped status effect source (#93782)
## About The Pull Request

Fixes https://github.com/tgstation/tgstation/issues/88311

1. Grouped status effects will throw a stack trace if trying to pass
null as a source
2. Fishing hooks will not proceed to hook if they fail to hook (lol)
3. Replaced cursed slot machine "grouped effect" with a normal effect
(since it didn't use the group aspect at all)

## Changelog

🆑 Melbert
fix: Fishing hooks will no longer hook even though the hook failed
/🆑
2025-11-07 03:08:43 +01:00
tgstation-ci[bot]
f54ea38182 Automatic changelog compile [ci skip] 2025-11-07 00:31:32 +00:00
tgstation-ci[bot]
255099f384 Automatic changelog for PR #93788 [ci skip] 2025-11-07 00:13:25 +00:00
Aliceee2ch
4fc1a65cfa Adds gas sensor in WawaStation SM chamber (#93788)
## About The Pull Request

Closes #93780

## Why It's Good For The Game

map consistency

## Changelog

🆑
fix: Added missing gas sensors in SM chamber on WawaStation.
/🆑
2025-11-07 00:13:07 +00:00
tgstation-ci[bot]
d77d5b6733 Automatic changelog for PR #93680 [ci skip] 2025-11-07 00:04:24 +00:00
Fghj240
6b2409065a Empaths is now a component instead of a trait (#93680)
## About The Pull Request

Empath has become a component instead of a trait, letting it store
variables or whatever components are good for. Also, it works slightly
differently for empath quirk users and moon heretics alike.

Additionally:
- You can only shiver when you see an evil person once. After that it
won't happen again.
- Empaths no longer get a mood debuff from seeing someone distressed. 
- Moon heretic empaths no longer get smited by evil people. 
- Moon heretic empaths aren't scared of evil people.

The component also supports empaths being able to tell if a fake dead
body is actually dead, and being able to use empath on yourself, but
those aren't enabled for the empath quirk or moon heretics. (Self-empath
would probably powercreep self aware)

## Why It's Good For The Game

While the empath quirk is incompatible with the evil quirk, the trait
wasn't. That means you could potentially become an evil empath and still
feel bad about other people feeling bad and get smited by other evil
people. Being an empath is different from having empathy, and there's
now a personality trait (compassionate) that has a very similar feature
so the mood debuff got axed and moon heretics can't get smited by
mending touch anymore.

I think being a heretic and looking into pierced realities probably
means you have the mental fortitude to not freak out when you see an
evil person. Evil people are (probably) a lot less scary than whatever
mind destroying thing is in those holes.

As for the only-getting-scared-once bit, freaking out when you see an
evil person is flavorful but annoying after it happens multiple times.
Especially if it happens after examining the same person multiple times.
2025-11-06 18:04:07 -06:00
tgstation-ci[bot]
7b296c44e7 Automatic changelog for PR #93786 [ci skip] 2025-11-06 20:15:55 +00:00
tgstation-ci[bot]
602af51d79 Automatic changelog for PR #93785 [ci skip] 2025-11-06 20:15:08 +00:00
LT3
02c6f22292 Fixes some theme CSS (#93785) 2025-11-06 21:14:50 +01:00
Aliceee2ch
7dc8ac3f3f Updates old screen_gen sprites (#93786) 2025-11-06 21:14:37 +01:00
tgstation-ci[bot]
ccc4a6d2ba Automatic changelog for PR #93044 [ci skip] 2025-11-06 10:07:56 +00:00
harry
f8e6d91d3c moves clientside storage to an iframe instead of byondstorage (#93044)
## About The Pull Request

this converts the dependency on byondstorage, which is laggy (due to
being a large json file written to disk every 10 seconds), to using
indexeddb, like we did prior to 516. this is achieved by using an iframe
to give us a persistent origin, as the web is evil and has invented
same-origin policy
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy.

this also hosts the iframe page on the github pages site for a secondary
repository (see tgstation/byond-client-storage) so it works OOTB without
requiring server operators to setup the webroot cdn (which i don't
believe is configured on the tg servers at the moment)

however, if a server is using the webroot cdn, it will use that instead
of github pages

you could also host the iframe.html page on a separate host from your
cdn or github pages if you wanted to

if we can't access the configured cdn at all, it failovers to use
byondstorage anyway, if the internet stops working and you still want
your chat history to save, i guess

## Why It's Good For The Game

saving this enormous json file is laggy, and this solution would fix
https://github.com/tgstation/tgstation/issues/89988 and fix
https://github.com/tgstation/tgstation/issues/92035

i am open to other solutions, but this does seem to require the least
amount of external dependencies of posed solutions

## Changelog

🆑
fix: you should experience less stutters every 10 seconds
server: server operators can now configure an alternative storage domain
for clientside data storage, read the example configuration for more
/🆑

---------

Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
2025-11-06 10:07:33 +00:00
tgstation-ci[bot]
790694ff3c Automatic changelog compile [ci skip] 2025-11-06 00:30:11 +00:00