4624 Commits
Author SHA1 Message Date
nevimer b348b617a3 Merge branch 'master' of https://github.com/tgstation/tgstation into pupstream-2025-09-07
# Conflicts:
#	README.md
#	code/__DEFINES/admin.dm
#	code/__DEFINES/melee.dm
#	code/_globalvars/traits/_traits.dm
#	code/controllers/subsystem/economy.dm
#	code/datums/components/crafting/crafting.dm
#	code/datums/elements/crusher_loot.dm
#	code/modules/antagonists/pirate/pirate_shuttle_equipment.dm
#	code/modules/clothing/suits/_suits.dm
#	code/modules/escape_menu/leave_body.dm
#	code/modules/jobs/job_types/_job.dm
#	code/modules/mining/equipment/mineral_scanner.dm
#	code/modules/mob/living/living.dm
#	code/modules/plumbing/plumbers/pill_press.dm
#	tgui/packages/tgui/interfaces/Vending.tsx
2025-09-07 00:37:52 -04:00
nevimer c9956892db Merge remote-tracking branch 'origin/master' into pupstream-08-19-keepsha
# Conflicts:
#	_maps/map_files/BoxStation/BoxStation.dmm
#	code/_globalvars/lists/flavor_misc.dm
2025-09-03 21:03:51 -04:00
nevimer db5aa35b59 Fix build issues related to upstream pull 2025-09-03 20:27:07 -04:00
fb1bc13935 Excited groups no longer breakdown during certain gas reactions. (#92412)
## About The Pull Request
Excited groups no longer breakdown during certain gas reactions that are
considered too volatile without necessarily being a fire.
## Why It's Good For The Game
This stops shit like antinoblium from breaking down and equalising with
a large chunk of the station instantly. Should make that feel more like
goop spreading.
## Changelog
🆑
balance: Some gas reactions will prevent excited groups from breaking
down.
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2025-09-02 21:39:37 -07:00
subject217andGitHub ef6aed1974 fixes a typo in an admin message about achievements cleanup (#92831)
## About The Pull Request

the verb is achievements-admin-panel

## Why It's Good For The Game

tells the admin what to actually type

## Changelog

🆑
spellcheck: fixed a typo in the admin message about achievements cleanup
/🆑
2025-09-02 18:59:03 -07:00
67d27ffe91 Accounting Glowup: Advances, Pay raises and cuts, and more (#92419)
## About The Pull Request

Fixes #92188

1. The Accounting console now has a new UI

<img width="757" height="486" alt="image"
src="https://github.com/user-attachments/assets/0c6ce73f-ae1c-4a54-b6ba-bcc3b3232d13"
/>

2. The Accounting console can now dish out advances on paychecks, giving
you for full paycheck early. You can give up to 3 advances. This of
course means your next paycheck is not paid out when relevant.

3. The Accounting console can now change paycheck sizes of crewmembers -
up to 1.5x and down to 0.5x.

## Why It's Good For The Game

- Gives the HoP some more duties, now being able to dish out money on
request, reward good behavior, or punish bad behavior.

## Changelog

🆑 Melbert
add: Accounting Console: New UI!
add: Accounting Console: Now can give advances to crewmembers
add: Accounting Console: Can now give pay raises or pay cuts
add: Accounting Console: Now only printable in the security lathe
add: Accounting Console: A spare board is now now found in secure tech
storage.
fix: Fix vending machines adding payments to audit log twice.
fix: Non-crewmembers are no longer shown in the accounting console
/🆑

---------

Co-authored-by: ArcaneMusic <41715314+ArcaneMusic@users.noreply.github.com>
2025-09-02 18:57:20 -07:00
TimandGitHub dce0bf9f9a Correct bitwise logic for bitfield checks (#92609)
## About The Pull Request
This fixes several bitfield operations that were missing parenthesis
encapsulation. I noticed this problem in:
- #92601

And decided to use regex to search for similar patterns which I came
across in:
- Move loops bypassing the `MOVELOOP_STATUS_RUNNING` status
- Elastic arms mutation bypassing `ABSTRACT` object flags for picking up
objects
- Species radiation bypassing `HEAD_HAIR` hairstyle flags for balding
- Damaged APC board status bypassing `EMAGGED` and `BROKEN` status for
screentips
- Shuttle cleanup code bypassing `MOVE_CONTENTS` for moving old turfs
- Tram crossing signals bypassing `NORTH` and `EAST` direction checks

## Why It's Good For The Game
Code behaves as intended.
2025-09-01 02:16:22 +00:00
MrMelbertandGitHub 80069f4830 Increase repo default max number of traitors spawned roundstart (#92478)
## About The Pull Request

Repo default max traitors upped from

1 per 38 players (up to 2 traitors at 50 pop, up to 3 traitors at 80
pop)

to

1 per 24 players (up to 3 traitors at 50 pop, up to 4 traitors at 80
pop)

Note: The ruleset can be executed twice or even thrice depending on RNG,
meaning a particularly chaotic round may spawn with up to 6/9 traitors
at 50 pop (and more may be added via midrounds and latejoins).

## Why It's Good For The Game

#67823 changed this number

This was done because dynamic would force spawn midround traitor IF any
midround ruleset failed to execute. But dynamic no longer does that. So
this value should be reverted.
2025-08-30 12:49:27 -05:00
MrMelbertandGitHub c2b8ef1d09 Allow localhosts to set "dev override preferences" to load a specific preference savefile for guests (#92770)
## About The Pull Request

A verb is now available on localhost called `"Export Save as Dev
Preferences"`

This exports your current savefile to `/config/dev_preferences.json`

If you then connect to your localhost as a guest, it will load
`dev_preferences.json` as your preference datum

This allows for devs testing the game locally to load preferences for
guests.
(Guests connecting to live servers are completely unaffected.)

## Why It's Good For The Game

Initially I only did this because the recent keybinding changes have
destroyed my muscle memory when testing w/o logging in.

But as I worked on it I thought of a few other usecases, like when
implementing preference version migration - the dev preference is never
saved which means you can re-compile as much as you want without needing
to revert your save manually.
2025-08-29 18:36:56 -04:00
RhialsandGitHub 822a1d3d55 Fugitive Hunters spawn again (#92761)
## About The Pull Request

Fugitive hunters no longer runtime on their timer check. 

The `check_spawn_hunters` proc was getting passed the fugitive hunters'
backstory (not needed in the proc) instead of the time until their
expected spawn.
## Why It's Good For The Game

The fugitive hunters are a pretty important part of the fugitive antag.
It's like playing hide and seek without any seekers. It sucks.

Closes the unresolved part of #92618.
2025-08-29 15:15:08 -05:00
ReturnandGitHub eff9523da9 Job estimation refactor (#4544)
## About The Pull Request
This PR moves the job estimation panel to SSticker, reducing its
performance impact.

No player-facing changes, it'll work exactly the same

## Why It's Good For The Game
The server will hopefully crash less

## Proof Of Testing
<img width="242" height="85" alt="image"
src="https://github.com/user-attachments/assets/535f8e6d-e175-440c-a0d4-1fac5e4d5a51"
/>

## Changelog

🆑 ReturnToZender
refactor: Job estimation now performs better
/🆑
2025-08-26 11:44:28 -07:00
necromanceranneandGitHub cb7e44e7ee Updates the AFK logout report to utilize configs for it's timers (#92662)
## About The Pull Request

Rather than use hardcoded timers for the logout report, the report
instead utilizes a timer based on config values. The default value is
the current live value.

This timer can also be configurated to utilize randomization. Currently,
it defaults to randomizing between -3 minutes to +3 minutes for when the
report is sent.

The logout report timer is also added to the admin log.

## Why It's Good For The Game

This shouldn't be dictated by the codebase, as it is an admin tool.
2025-08-26 12:29:56 -05:00
AnturKandGitHub 53a034c5b0 Adds admin panel for achievement metadata cleanup (#92345) 2025-08-25 23:11:47 -06:00
ReturnandGitHub 6e31070eb3 Makes the roundstart notification display at previous round end (#4507)
## About The Pull Request
This makes the roundstart ping happen at the end of the previous round,
giving everyone more time to prepare.

## Why It's Good For The Game
More time to get ready for a new round!

## Proof Of Testing
I physically cannot test this but it should work. It compiles with no
errors!

</details>

## Changelog

🆑 ReturnToZender
qol: The roundstart ping now happens at the end of the round, rather
than the start of a new one
/🆑
2025-08-24 21:45:29 +03:00
RhialsandGitHub 8476ac925e Solo fugitives spawn with a toolbox, like group fugitives do (#92685)
## About The Pull Request

Solo fugitives weren't getting their toolbox because
`equip_fugitive_leader()` doesn't get called. While this makes sense,
seeing as there isn't a "leader" to equip, there isn't actually a reason
not to call this for single fugitives.

So, `equip_fugitive_leader()` now runs for all fugitive quantities. If
someone wants to add more essential equipment for newly spawned
fugitives, it should go there alongside the toolbox.
## Why It's Good For The Game

Partially handles #92618.
## Changelog
🆑 Rhials
fix: Solo fugitives now spawn with a mechanical toolbox, as intended.
/🆑
2025-08-24 07:29:58 +02:00
Kashargulandnevimer 722c3b7797 follow up fix for #92508 (#92571)
## About The Pull Request
This is a follow up patch for #92508, otherwise than said in coderbus,
calling the cleanup too early can lead to bad assets. We'll now keep
track of the count of assets in generation and only clean up after they
all have passed the generation.
<img width="3067" height="455" alt="grafik"
src="https://github.com/user-attachments/assets/0b65acf3-464f-436c-8a60-84c9472be6cd"
/>
## Why It's Good For The Game
## Changelog
There should be nothing player facing here as the asset job fails
straight up if the cache was cleared too early.
2025-08-19 22:41:07 -04:00
Time-Greenandnevimer a66a60e711 1X3 ICEBOX | Wilderness Expansion (Now not extremely slow!) (#91920)
## About The Pull Request
Turns the surface z-level of icebox into a 1x3 area, effectively adding
2 wilderness new z-levels surrounding the station

Because it's not always clear to other people what I'm talking about,
this is what I mean with making the surface level a 3x3 z-level

The wilderness z-levels are gridlinked, instead of crosslinked, which
just means the connections are consistent and not randomized. If you
keep going right, you will always end up where you started again,
eventually. This also removes the black border around the surface icebox
z-level (cause you can just go there now)

**Wilderness levels**
I've added some Z-level templates that can be generated. They're
incredibly basic, but all can spawn runes on them as well.
- Snow planes (5x)
- Ice planes (1x)
- Forest planes (1x)
- Mountain planes (1x)

I've also tweaked surface generation quite a bit. It being completely
covered in bones always felt weird, and the intersparsed rocks and
chasms never sat right with me. The default overworldgen is now more
like the Forested trait, but with more sparse trees.

All of this is modular btw. You can increase the amount of z-levels,
make any space z-level be unrandomized gridlinked or add your own
wilderness z-levels (either to your own map or icebox)

## Why It's Good For The Game
Icebox exploration is kind of depressing. We have this unique setting,
but we can't really go anywhere? You can go down and find that one pool,
which is about the peak of exploration of icebox.

Now you can literally explore the entire round and get incredibly lost!
It's also a great opportunity for mappers! (Especially since the
templates I made were made rather quickly as I wasn't sure if this had
merit).

2 extra z-levels isn't a lot, but it'll let us further develop planetary
wilderness z-levels further without impacting load times that much.
Maybe 3x3 icebox can be real in the future, but for now 1x3 icebox will
have to do
2025-08-19 22:41:05 -04:00
necromanceranneandnevimer 60e3451960 Declutters settlers a bit. (#92425) 2025-08-19 22:39:40 -04:00
_0Stevenandnevimer edb85b2d0c Refactors say modes and custom say verbs. Extends custom say verbs to more situations, forwards more spans. (#92127)
## About The Pull Request

Oh man, so this entire pr started because of two things:
1. A kinda hacky fix to #92123 that got closed a good while ago.
2. A borg I know mentioning you can't do custom say verbs over robotic
talk.

Which subsequently led me down this rabbit hole of say modes and custom
say verbs.
So! The most wide-reaching thing this does is merge the custom say
verb/radio emote logic that used to be specialcased in
`compose_message(...)` into `say_quote(...)`, renaming this to
`generate_messagepart(...)` with its new functionality. This means
things that don't use the exact same chain as living things talking
normally can still generate custom say verbs if given that message
modifier.

Then, we split up say modes into a "can we do this" and "try to do this"
check to reduce conflicts (like #92123), and forward more of our data to
the latter. This allows us to then edit the say modes to actually make
use of that data, and with the previous addition of
`generate_messagepart(...)` allow for custom say verbs to be used.

In doing this I realized the logging was kind of awkward and all over
the place, so we create the new logging helper `log_sayverb_talk(...)`
which handles selecting how we should log things based on the given
message modifiers.

For better or worse I forgot about this pr for a few weeks, so I don't
perfectly remember all the details, but those are the big key parts.
## Why It's Good For The Game

Fixes #92123.

I think custom say verbs are some of the best flavour we have for
talking over radio, and any situation benefits from that being possible.
It's great to be able to tap your microphone, and it's hilarious for an
AI to be able to emote beaming an image directly into the heads of their
borgs over robotic talk.

The rest is mostly cleanup.
2025-08-19 22:35:54 -04:00
Kashargulandnevimer 31dd4a7c40 fix asset loading subsystem (#92508)
## About The Pull Request
The entire asset loading had multiple issues.

Firstly, we could hit a tick check after an asset was generated and
didn't remove the index, leading to the asset being generated twice.

Secondly, we had the issue that the icon forge batching uses UNTIL to
wait until generation finishes. This led to the situation that the
entire subsystem fire proc was paused outside of the internal tick check
pause.
## Why It's Good For The Game
Especially on larger sprite sheets or when there're many to be generated
this led to the situation that we looked up a rust job multiple times:
 
`[2025-08-08T18:42:11] Runtime in
code/modules/asset_cache/iconforge/batched_spritesheet.dm,200:
Spritesheet design UNKNOWN ERROR: NO SUCH JOB`

## Changelog
No player facing changes.
2025-08-19 22:33:50 -04:00
SyncIt21andnevimer 8b0d22d14b General maintenance for vending machines (#91987)
## About The Pull Request
**1. Code Improvements**
- Removed unused vars `coin`, `bill` & other stuff
- Removed duplicate definition of `on_deconstruction()`
- Autodoc for a lot of procs
- Merged smaller procs into larger ones to avoid scrolling in the code
editor & reduced overhead
- Split the vending machine file into several smaller files for easy
code management

**2. Qol**
- Implemented vending machine ads. They now display random stuff on the
UI

https://github.com/user-attachments/assets/9720ea60-f268-4ca2-940d-243e3d0ac75f
- More error messages for custom & normal vendors as to why an item
could not be loaded
- Custom vending machines can be deconstructed safely via crowbar
without any explosion only after unlinking your account from the machine
else you get the same explosion. Upon deconstruction all loaded items
are moved into its restock canister meaning the machine can be safely
moved with all its products just like a regular vending machine to a new
location

**3. Fixes**
- Fixes #81917. Any returned items in the vending machine now show up as
free in the UI & won't cost credits to buy them
- Fixes #87416. Custom & normal vendors now keep track of products
removed via `Exited()` so the UI gets always updated
- Fixes #83151. Items with different names & custom prices now show up
in unique rows
- Fixes #92170 Custom vendors now show the correct icon for inserted
items
- Closes #80010. From the above fix this situation is impossible so it's
safe to close this as a duplicate
- Closes #78016 same problem as above with `Exited()` duplicate
- Custom vendors can now actually be used by players who are not the
owner instead of locking down the UI
- Vending machines keep track of `max_amount` of stocked items by hand
as well & not just RPED

**4. Refactor**
- Separates custom vending machine code from normal vending machine
code. This prime Marely focus on the `vending_machine_input` list which
now only exists inside the custom vending machine
- Compressed the UI code for vending machine so both custom & normal
vending machines can send the same data instead of separating the 2.
Overall less code
- Moved attack chain from `attackby()` to `item_interaction()` for
loading items

## Changelog
🆑
code: cleaned up vending machine code
qol: vending machines now have more product slogans you never heard
before
qol: custom & normal vending machines now have more feedback on why an
item could not be loaded
qol: vending machines now display random ads on the UI
qol: custom vending machines can be deconstructed via crowbar safely
only after unlinking your account from the machine.
qol: upon deconstructing a custom vendor all its products are moved into
its refill canister & it will be restored when reconstructing the
machine elsewhere
fix: Returned items to the vending machine now show up as free in the UI
and won't be greyed out if you don't have credits to get them back
fix: items that leave the vending machine by any means will update the
UI in all cases
fix: loading items by hand to the vending machine now respects the
max_amount for that category
fix: custom vendors can now actually be used by players who are not the
owner thus enabling them to transfer credits to the owner during
purchases & basically they do their job again
fix: custom vendors now show the correct icon for inserted items
fix: Items with different names & custom prices now show up in unique
rows in custom vendors
refactor: separated custom & normal vending machine code. Reduced UI
code & improved attack chain
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
# Conflicts:
#	code/modules/vending/_vending.dm
#	tgui/packages/tgui/interfaces/Vending.tsx
2025-08-19 22:28:01 -04:00
nevimer 81313b27a5 Merge remote-tracking branch 'origin/pupstream-25-08-08' 2025-08-15 17:36:16 -04:00
KashargulandGitHub 0bd054538a follow up fix for #92508 (#92571)
## About The Pull Request
This is a follow up patch for #92508, otherwise than said in coderbus,
calling the cleanup too early can lead to bad assets. We'll now keep
track of the count of assets in generation and only clean up after they
all have passed the generation.
<img width="3067" height="455" alt="grafik"
src="https://github.com/user-attachments/assets/0b65acf3-464f-436c-8a60-84c9472be6cd"
/>
## Why It's Good For The Game
## Changelog
There should be nothing player facing here as the asset job fails
straight up if the cache was cleared too early.
2025-08-15 14:51:58 +02:00
Time-GreenandGitHub a47835a04f 1X3 ICEBOX | Wilderness Expansion (Now not extremely slow!) (#91920)
## About The Pull Request
Turns the surface z-level of icebox into a 1x3 area, effectively adding
2 wilderness new z-levels surrounding the station

Because it's not always clear to other people what I'm talking about,
this is what I mean with making the surface level a 3x3 z-level

The wilderness z-levels are gridlinked, instead of crosslinked, which
just means the connections are consistent and not randomized. If you
keep going right, you will always end up where you started again,
eventually. This also removes the black border around the surface icebox
z-level (cause you can just go there now)

**Wilderness levels**
I've added some Z-level templates that can be generated. They're
incredibly basic, but all can spawn runes on them as well.
- Snow planes (5x)
- Ice planes (1x)
- Forest planes (1x)
- Mountain planes (1x)

I've also tweaked surface generation quite a bit. It being completely
covered in bones always felt weird, and the intersparsed rocks and
chasms never sat right with me. The default overworldgen is now more
like the Forested trait, but with more sparse trees.

All of this is modular btw. You can increase the amount of z-levels,
make any space z-level be unrandomized gridlinked or add your own
wilderness z-levels (either to your own map or icebox)

## Why It's Good For The Game
Icebox exploration is kind of depressing. We have this unique setting,
but we can't really go anywhere? You can go down and find that one pool,
which is about the peak of exploration of icebox.

Now you can literally explore the entire round and get incredibly lost!
It's also a great opportunity for mappers! (Especially since the
templates I made were made rather quickly as I wasn't sure if this had
merit).

2 extra z-levels isn't a lot, but it'll let us further develop planetary
wilderness z-levels further without impacting load times that much.
Maybe 3x3 icebox can be real in the future, but for now 1x3 icebox will
have to do
2025-08-15 01:58:58 -05:00
necromanceranneandGitHub ae3b29018a Declutters settlers a bit. (#92425) 2025-08-14 12:52:05 +00:00
_0StevenandGitHub 089c6a8f94 Refactors say modes and custom say verbs. Extends custom say verbs to more situations, forwards more spans. (#92127)
## About The Pull Request

Oh man, so this entire pr started because of two things:
1. A kinda hacky fix to #92123 that got closed a good while ago.
2. A borg I know mentioning you can't do custom say verbs over robotic
talk.

Which subsequently led me down this rabbit hole of say modes and custom
say verbs.
So! The most wide-reaching thing this does is merge the custom say
verb/radio emote logic that used to be specialcased in
`compose_message(...)` into `say_quote(...)`, renaming this to
`generate_messagepart(...)` with its new functionality. This means
things that don't use the exact same chain as living things talking
normally can still generate custom say verbs if given that message
modifier.

Then, we split up say modes into a "can we do this" and "try to do this"
check to reduce conflicts (like #92123), and forward more of our data to
the latter. This allows us to then edit the say modes to actually make
use of that data, and with the previous addition of
`generate_messagepart(...)` allow for custom say verbs to be used.

In doing this I realized the logging was kind of awkward and all over
the place, so we create the new logging helper `log_sayverb_talk(...)`
which handles selecting how we should log things based on the given
message modifiers.

For better or worse I forgot about this pr for a few weeks, so I don't
perfectly remember all the details, but those are the big key parts.
## Why It's Good For The Game

Fixes #92123.

I think custom say verbs are some of the best flavour we have for
talking over radio, and any situation benefits from that being possible.
It's great to be able to tap your microphone, and it's hilarious for an
AI to be able to emote beaming an image directly into the heads of their
borgs over robotic talk.

The rest is mostly cleanup.
2025-08-12 16:24:50 -05:00
Roxy 4c62a21b1a Fixes for #92061 2025-08-12 13:50:57 -04:00
WaterpigandRoxy 55504da79d Datumizes DNA blocks, makes DNA cleaner in general (#92061)
Moves all the dna block handling onto singleton datums initialized
inside global lists, to make the handling dna less of a copy-paste mess
and make adding new blocks significantly easier. There is still some
work to be done in the copypaste department but ultimately that falls
under its own PR scope after the core refactor goes through. (Ill
probably do those but it will also be easier for everyone else as the
code is now significantly less of an eyesore)

Both features and identities have been tested through and through, and
seem to be working fine.

Also removed the reliance on weird hardcoded lookup tables for length,
and other similar things that just didn't make sense when I was passing
through DNA code. There's a lot more that fall out of scope for this
exact PR's goal however

I've been told the maintainers will love me for doing this

🆑
code: feature keys are no longer magical strings floating around the
codebase and use proper defines
refactor: DNA blocks are now handled with singleton datums.
/🆑
2025-08-12 13:48:00 -04:00
KashargulandGitHub 8cd44d26c6 fix asset loading subsystem (#92508)
## About The Pull Request
The entire asset loading had multiple issues.

Firstly, we could hit a tick check after an asset was generated and
didn't remove the index, leading to the asset being generated twice.

Secondly, we had the issue that the icon forge batching uses UNTIL to
wait until generation finishes. This led to the situation that the
entire subsystem fire proc was paused outside of the internal tick check
pause.
## Why It's Good For The Game
Especially on larger sprite sheets or when there're many to be generated
this led to the situation that we looked up a rust job multiple times:
 
`[2025-08-08T18:42:11] Runtime in
code/modules/asset_cache/iconforge/batched_spritesheet.dm,200:
Spritesheet design UNKNOWN ERROR: NO SUCH JOB`

## Changelog
No player facing changes.
2025-08-11 21:15:50 +02:00
0b6101a37e General maintenance for vending machines (#91987)
## About The Pull Request
**1. Code Improvements**
- Removed unused vars `coin`, `bill` & other stuff
- Removed duplicate definition of `on_deconstruction()`
- Autodoc for a lot of procs
- Merged smaller procs into larger ones to avoid scrolling in the code
editor & reduced overhead
- Split the vending machine file into several smaller files for easy
code management

**2. Qol**
- Implemented vending machine ads. They now display random stuff on the
UI


https://github.com/user-attachments/assets/9720ea60-f268-4ca2-940d-243e3d0ac75f
- More error messages for custom & normal vendors as to why an item
could not be loaded
- Custom vending machines can be deconstructed safely via crowbar
without any explosion only after unlinking your account from the machine
else you get the same explosion. Upon deconstruction all loaded items
are moved into its restock canister meaning the machine can be safely
moved with all its products just like a regular vending machine to a new
location

**3. Fixes**
- Fixes #81917. Any returned items in the vending machine now show up as
free in the UI & won't cost credits to buy them
- Fixes #87416. Custom & normal vendors now keep track of products
removed via `Exited()` so the UI gets always updated
- Fixes #83151. Items with different names & custom prices now show up
in unique rows
- Fixes #92170 Custom vendors now show the correct icon for inserted
items
- Closes #80010. From the above fix this situation is impossible so it's
safe to close this as a duplicate
- Closes #78016 same problem as above with `Exited()` duplicate
- Custom vendors can now actually be used by players who are not the
owner instead of locking down the UI
- Vending machines keep track of `max_amount` of stocked items by hand
as well & not just RPED

**4. Refactor**
- Separates custom vending machine code from normal vending machine
code. This prime Marely focus on the `vending_machine_input` list which
now only exists inside the custom vending machine
- Compressed the UI code for vending machine so both custom & normal
vending machines can send the same data instead of separating the 2.
Overall less code
- Moved attack chain from `attackby()` to `item_interaction()` for
loading items

## Changelog
🆑
code: cleaned up vending machine code
qol: vending machines now have more product slogans you never heard
before
qol: custom & normal vending machines now have more feedback on why an
item could not be loaded
qol: vending machines now display random ads on the UI
qol: custom vending machines can be deconstructed via crowbar safely
only after unlinking your account from the machine.
qol: upon deconstructing a custom vendor all its products are moved into
its refill canister & it will be restored when reconstructing the
machine elsewhere
fix: Returned items to the vending machine now show up as free in the UI
and won't be greyed out if you don't have credits to get them back
fix: items that leave the vending machine by any means will update the
UI in all cases
fix: loading items by hand to the vending machine now respects the
max_amount for that category
fix: custom vendors can now actually be used by players who are not the
owner thus enabling them to transfer credits to the owner during
purchases & basically they do their job again
fix: custom vendors now show the correct icon for inserted items
fix: Items with different names & custom prices now show up in unique
rows in custom vendors
refactor: separated custom & normal vending machine code. Reduced UI
code & improved attack chain
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
2025-08-11 14:37:13 +02:00
947750f946 Slows station time to 2x real time, instead of 12x (#4319)
## About The Pull Request
This PR makes it so the displayed station time in-world moves more
slowly, at a rate of 2x normal time. It has no effect on the speed of
the game itself, only the time displayed on clocks.

Mostly for lore reasons, so players aren't playing a 36-hour shift in
setting every time they play the game. Just something minor that always
bothered me.

This does mean Night Shifts are longer, though.

Includes upstream TG PRs 92428 and 92469.

## Why It's Good For The Game
Makes time more accessible for players by slowing it down. Now you can
set meetings for specific times in-game and have a rough idea of when
that will be!

## Proof Of Testing
Should just work out of the box. Compiles with no errors.

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

</details>

## Changelog

🆑 LT3, ReturnToZender
add: The displayed station time has been slowed down, making time more
consistent for players.
/🆑

---------

Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
2025-08-10 12:57:46 -07:00
MrZoramanandGitHub ac9b7c2fd8 Allow command to have missing limbs on roundstart. (#4311)
## About The Pull Request

As the code currently is, if any missing limb is selected, command is
locked. This PR adjusts the logic so that command is locked only if both
arms are missing.
## Why It's Good For The Game

Disabled captains and other heads of staff offer more character creation
and roleplay opportunities. This change removes such logic discrepancies
such as a paraplegic captain being fine bug a legless captain being
disallowed. Crew with one hand are still very capable and do not need to
be blocked from command roles.
## Proof Of Testing

Code compiles with 0 errors, 0 warnings. Tested locally and working as
expected.
<details>
<summary>Screenshots/Videos</summary>

</details>

## Changelog
🆑
balance: Heads of staff are free to be missing as many roundstart limbs
as they want, as long as they have at least one hand.
/🆑
2025-08-09 22:11:47 -04:00
SmArtKarandnevimer 16aa15a136 Changes human name updates to be request-based instead of being automatically done every single tick (#92393)
## About The Pull Request

Changes human name to update whenever anything that could result in
their visible name changing occurs, such as changing IDs, equipping
gasmasks, picking potted plants, etc. Currently name updates occur every
``Life()`` tick and in a few "special" cases, which causes a lot of name
changes from sources such as equipment to not apply until the mob ticks,
and makes us waste a tiiiny bit of CPU time on name updates.
I've also slighly cleaned up human /Life() and made species'
``spec_life()`` not run when the mob is dead, as it was causing certain
unintended interactions, such as slimepeople regenerating blood while
dead.

## Why It's Good For The Game

Microoptimization, ensures that correct names are always used (in case
something could update their name but the mob hasn't ticked yet), plus
its just a cleaner implementation

(cherry picked from commit 87e1ef6f64)

# Conflicts:
#	code/game/data_huds.dm
2025-08-08 15:34:22 -04:00
LemonInTheDarkandnevimer eb7d505bef Makes the MC stat panel tab usable, and also nicer (#92405)
(cherry picked from commit 0909348cea)
2025-08-08 15:33:44 -04:00
Arturlangandnevimer 1c0ac21cb4 Fixes the issue of usr pointing to admins by making Trigger pass down clicker (#92354)
## About The Pull Request
Fixes the issue of usr pointing to admins by making Trigger pass down
clicker, as usr is fucky and can be passed down by other unrelated
procs. Fun.
Added the clicker arg to all usages of Trigger as well
Also changes isobserver check in antagonist ui_act code that prevents
observers from clicking UI's instead to check if the ui.user is
owner.current
## Why It's Good For The Game
Fixes admins giving heretic to people opening the heretic UI for the
admin instead

(cherry picked from commit 0bc42d6940)
2025-08-08 15:31:08 -04:00
SmArtKarandGitHub 87e1ef6f64 Changes human name updates to be request-based instead of being automatically done every single tick (#92393)
## About The Pull Request

Changes human name to update whenever anything that could result in
their visible name changing occurs, such as changing IDs, equipping
gasmasks, picking potted plants, etc. Currently name updates occur every
``Life()`` tick and in a few "special" cases, which causes a lot of name
changes from sources such as equipment to not apply until the mob ticks,
and makes us waste a tiiiny bit of CPU time on name updates.
I've also slighly cleaned up human /Life() and made species'
``spec_life()`` not run when the mob is dead, as it was causing certain
unintended interactions, such as slimepeople regenerating blood while
dead.

## Why It's Good For The Game

Microoptimization, ensures that correct names are always used (in case
something could update their name but the mob hasn't ticked yet), plus
its just a cleaner implementation
2025-08-08 13:01:12 -05:00
LemonInTheDarkandGitHub 0909348cea Makes the MC stat panel tab usable, and also nicer (#92405) 2025-08-08 19:32:46 +02:00
ArturlangandGitHub 0bc42d6940 Fixes the issue of usr pointing to admins by making Trigger pass down clicker (#92354)
## About The Pull Request
Fixes the issue of usr pointing to admins by making Trigger pass down
clicker, as usr is fucky and can be passed down by other unrelated
procs. Fun.
Added the clicker arg to all usages of Trigger as well
Also changes isobserver check in antagonist ui_act code that prevents
observers from clicking UI's instead to check if the ui.user is
owner.current
## Why It's Good For The Game
Fixes admins giving heretic to people opening the heretic UI for the
admin instead
2025-08-05 22:58:40 -05:00
ffb2eac09a debug proc for visuallizing spatial grids (#92325)
## About The Pull Request
debug PROC (because its super laggy so i locked it behind a proc call on
a subsystem) for painting the world based on the cell its located in

pulled out of my port of spatial grids in
https://github.com/shiptest-ss13/Shiptest/pull/4399


https://github.com/user-attachments/assets/07008518-e418-442b-ab80-6557e936fee2
## Why It's Good For The Game
useful for debugging spatial grid issues. also helped ,e discover a bug
since it calls get_cell on every atom.
## Changelog
🆑
code: debug proc for painting the world based on spatial grid.
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2025-08-04 20:53:41 -04:00
db0113106f Fixes constant and realtime station time being calculated incorrectly (#92428)
## About The Pull Request

Sorta-config related, replaced magic numbers in station time code with
defines and fixed station time calculations.
Constant time was (incorrectly) adjusted by your timezone in actual
station time calculations despite us changing all time ops to UTC+0, and
realtime was adjusted by your timezone in the wrong direction (realtime
returns GMT, and station time itself deducted your timezone again). Also
fixed station_time_debug debug proc using seconds instead of deciseconds
(by converting it to defines)

I've also made realtime config change time dilation factor from 12 to 1,
as its intended to make station time reflect real time *in the server's
own timezone*, and 12x time dilation made it deviate from that extremely
quickly (this does not affect gameplay in any meaningful manner, station
time dilation only affects displayed clock time and not any in-game
events except nightshifts)

- Closes #92380

## Changelog
🆑
fix: Fixed constant and realtime station time being calculated
incorrectly
/🆑

---------

Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2025-08-04 20:53:40 -04:00
itsmeowandRoxy 8a7e6d059f Bumps rust_g to 4.0.0 / IconForge Improvements (#92333) 2025-08-04 20:53:34 -04:00
b76d0e6ed0 debug proc for visuallizing spatial grids (#92325)
## About The Pull Request
debug PROC (because its super laggy so i locked it behind a proc call on
a subsystem) for painting the world based on the cell its located in

pulled out of my port of spatial grids in
https://github.com/shiptest-ss13/Shiptest/pull/4399


https://github.com/user-attachments/assets/07008518-e418-442b-ab80-6557e936fee2
## Why It's Good For The Game
useful for debugging spatial grid issues. also helped ,e discover a bug
since it calls get_cell on every atom.
## Changelog
🆑
code: debug proc for painting the world based on spatial grid.
/🆑

---------

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2025-08-04 09:09:16 -07:00
d0770346d8 Fixes constant and realtime station time being calculated incorrectly (#92428)
## About The Pull Request

Sorta-config related, replaced magic numbers in station time code with
defines and fixed station time calculations.
Constant time was (incorrectly) adjusted by your timezone in actual
station time calculations despite us changing all time ops to UTC+0, and
realtime was adjusted by your timezone in the wrong direction (realtime
returns GMT, and station time itself deducted your timezone again). Also
fixed station_time_debug debug proc using seconds instead of deciseconds
(by converting it to defines)

I've also made realtime config change time dilation factor from 12 to 1,
as its intended to make station time reflect real time *in the server's
own timezone*, and 12x time dilation made it deviate from that extremely
quickly (this does not affect gameplay in any meaningful manner, station
time dilation only affects displayed clock time and not any in-game
events except nightshifts)

- Closes #92380

## Changelog
🆑
fix: Fixed constant and realtime station time being calculated
incorrectly
/🆑

---------

Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
2025-08-04 03:06:34 +02:00
itsmeowandGitHub 23816b8ef2 Bumps rust_g to 4.0.0 / IconForge Improvements (#92333) 2025-07-30 22:51:23 -06:00
Joshua KidderandRoxy 9494021f16 [NO GBP] Silo logging hotfix 2 (includes hotfix 1): Multitool linking, decon/recon, funky define fix (#92349)
## About The Pull Request
Includes #92346

Additionally, fixes a non-pattern define that would fling the silo
logging formatting off its spinwheel when it would recursively jsonify
the logs.

Adds an id_read_failure for disassembling ore silos logging all their
dropped materials.

## Why It's Good For The Game
Hotfixes for a PR

## Changelog
🆑 Bisar
fix: Ore silos should be able to be connected/disconnected/disassembled
without any issues now.
fix: The define for CENTCOM_SPECOPS was incorrectly formatted; it has
been fixed.
/🆑
2025-07-30 17:37:43 -04:00
Joshua KidderandRoxy ff7ee72146 Ore silo logging & access refactor; UI updates, single-target bans, more robust logging information, more robust access control (#91142)
## About The Pull Request

# More robust logging
## Ore silo logs have now been refactored in the UI to display:
- Number of sheets is now the relative unit when displaying a given log.
- Instead of `100 iron` being displayed when removing one sheet, it just
says `1 iron`
- Instead of `25 iron` being displayed when using a quarter sheet, it
just says `0.25 iron`
- All information from ID_DATA(log_user) now sent to tgui backend
    - The items rendered to ore silo users are:
	- Name on ID, job on ID
- If the ID's bank account (if one is registered) is one of the ore
silo's banned users
- If the user for a given entry was wearing a chameleon card, they will
always appear unbanned
- NOTE: The bank account ID # is (currently) not shown to players using
the ore silo.
- Full log information is rendered within a dropdown; the dropdown
one-liner shows
  - Action (deposit, eject, item created)
- Amount (deposit/eject? amount of material used. item created? number
of items created.)
- Either name of material (if deposit/eject) or the name of items
crafted
- The name of the user who performed a given operation (if wearing an
unbanned ID) or ID_READ_FAILURE (if ore silo ID requirement has been
disabled and the person is not wearing an ID)
  - As name, but instead, the job of the ID (or ID_READ_FAILURE)


![image](https://github.com/user-attachments/assets/bb992a81-8db3-4a92-ad3a-917239fc407a)


# Access control improvements
## Single-user bans
- Anyone with QM access (not silicons) can now ban/unban a user from a
given log from using the ore silo
    - Bans are associated to bank account IDs.
        - Wearers of chameleon cards bypass any ban restrictions.
	- Anyone with QM access on their worn card bypasses ban restrictions.
	- Silicons bypass ban restrictions.
- QM access requirement is removed if the ore silo is emagged.
- Silicons can ban/unban people if the ore silo is emagged.
## Worn ID requirement
- Enabled at roundstart, can be disabled by anyone with QM access (not
silicons)
- If enabled, you must be wearing an ID with a bank account associated
to it to use ore silo materials.
- Wearers of chameleon cards bypass this restriction (so-called ID
requirement free thinkers wearing chameleon ID cards)
- QM access requirement to toggle removed if emagged.
- Silicons can toggle this on/off if the ore silo is emagged.
# Access control radio notifications
## Access control operations reported on the radio
- Any operations for access control are reported on radio channels.
    - Currently, the policy is always the default.
- In the future, the ore silo UI will allow the quartermaster to modify
what operations are reported on what channels (petty QM broadcasting ban
reports on Common)
- Current default policy:
    - Reported on COMMON channel:
- Anyone but the Captain attempts to ban someone with QM access from the
ore silo (nice try dumbass)
	    - Ore silo ID requirement toggling
	- Reported on COMMAND channel:
	    - Common channel reports.
		- Per-user banning/unbanning.
		- Anyone without QM access attempts to ban/unban someone.
		- Anyone without QM access attempts to toggle the restriction for ID.
		- Silicons attempting to tamper with the ID requirement restriction
		- Silicons attempting to tamper with the ban/unbanned user list
- A ban attempt failing because a given log entry had a user with no
bank ID.
	- Reported on SECURITY channel:
	    - Common channel reports.
		- Per-user banning/unbanning.
		- Anyone without QM access tampering with the silo.
	- Reported on SUPPLY channel:
	    - Command channel reports.
- Reporting to the radio is disabled if the ore silo is emagged.
## Modifications to the remote_materials component
- Strictly encompass the behavior for connecting/disconnecting ore silos
to material receptacles (RCDs, machines, etc) into procs on the
component, instead of handling it all over the place

## Why It's Good For The Game

Gives people with ore silo access more fine grained control over ore
silo use without having to resort to heavy-handed fabricator lockouts

Makes the logging on the ore silo more robust so we can make sure we
kill the right Roboticist for using all the materials

Offers an avenue for sidestepping all of this with a chameleon card or
emag if a given traitor (organic or otherwise) is particularly opposed
to DRM mats.



https://github.com/user-attachments/assets/effd2c63-509c-4d33-992f-837a0d62b935



## Changelog
🆑 Bisar
add: The ore silo has had a significant expansion to its logging
capabilities.
add: The ore silo now allows any ID with Quartermaster access (NOT
SILICONS!) to ban/unban specific users from the silo.
add: The ore silo now has a toggle (on by default) that a user of ore
silo materials has an ID with an associated bank account. This can be
toggled by anyone with Quartermaster access (NOT SILICONS!)
add: NanoTrasen discounts any reports that Syndicate contraband
(cryptographic sequencer, agent card) can be used to circumvent any
protocols instituted on the ore silo access control routines.
add: The ore silo now announces operations to ban/unban users and
enable/disable ID requirements on radio channels (check the Github for
actions reported to what channels.)
add: The tgui interface for ore silo log entries has been reworked.
refactor: The code for logging a given access to ore silo materials has
been significantly refactored.
qol: Ore silo log entries now display materials spent in terms of sheets
rather than the obfuscated absolute-units previously display (1 iron
ejected instead of -100 iron, 0.25 used in a craft instead of -25 iron)
/🆑
2025-07-30 17:37:38 -04:00
FalloutFalconandRoxy 06f7cb0824 regex for for loop anti pattern (#92136)
## About The Pull Request
I made and metek improved this regex for finding instances if(itterator)
in for loops because a downstream im working on does it an insane
amount. Im fairly certin all these instaces have no reason to be running
if checks here saying most of the for loops are typed so if it was null
or something it shouldnt be iterated on
`for\s*\(var(/\w+)*/(\w+) .*\n\s+if\(\2\)`
## Why It's Good For The Game
just kinda bad practice. Its way way way worse on the downstream tho
holy shit
<img width="1264" height="759" alt="image"
src="https://github.com/user-attachments/assets/1d0f152d-372d-49d4-a9fa-6d8e4d27a816"
/>
## Changelog
N/A
2025-07-30 17:37:28 -04:00
Joshua KidderandGitHub 07f6b7e879 [NO GBP] Silo logging hotfix 2 (includes hotfix 1): Multitool linking, decon/recon, funky define fix (#92349)
## About The Pull Request
Includes #92346

Additionally, fixes a non-pattern define that would fling the silo
logging formatting off its spinwheel when it would recursively jsonify
the logs.

Adds an id_read_failure for disassembling ore silos logging all their
dropped materials.

## Why It's Good For The Game
Hotfixes for a PR

## Changelog
🆑 Bisar
fix: Ore silos should be able to be connected/disconnected/disassembled
without any issues now.
fix: The define for CENTCOM_SPECOPS was incorrectly formatted; it has
been fixed.
/🆑
2025-07-28 20:16:49 +02:00
Joshua KidderandGitHub 988ca0b482 Ore silo logging & access refactor; UI updates, single-target bans, more robust logging information, more robust access control (#91142)
## About The Pull Request

# More robust logging
## Ore silo logs have now been refactored in the UI to display:
- Number of sheets is now the relative unit when displaying a given log.
- Instead of `100 iron` being displayed when removing one sheet, it just
says `1 iron`
- Instead of `25 iron` being displayed when using a quarter sheet, it
just says `0.25 iron`
- All information from ID_DATA(log_user) now sent to tgui backend
    - The items rendered to ore silo users are:
	- Name on ID, job on ID
- If the ID's bank account (if one is registered) is one of the ore
silo's banned users
- If the user for a given entry was wearing a chameleon card, they will
always appear unbanned
- NOTE: The bank account ID # is (currently) not shown to players using
the ore silo.
- Full log information is rendered within a dropdown; the dropdown
one-liner shows
  - Action (deposit, eject, item created)
- Amount (deposit/eject? amount of material used. item created? number
of items created.)
- Either name of material (if deposit/eject) or the name of items
crafted
- The name of the user who performed a given operation (if wearing an
unbanned ID) or ID_READ_FAILURE (if ore silo ID requirement has been
disabled and the person is not wearing an ID)
  - As name, but instead, the job of the ID (or ID_READ_FAILURE)


![image](https://github.com/user-attachments/assets/bb992a81-8db3-4a92-ad3a-917239fc407a)


# Access control improvements
## Single-user bans
- Anyone with QM access (not silicons) can now ban/unban a user from a
given log from using the ore silo
    - Bans are associated to bank account IDs.
        - Wearers of chameleon cards bypass any ban restrictions.
	- Anyone with QM access on their worn card bypasses ban restrictions.
	- Silicons bypass ban restrictions.
- QM access requirement is removed if the ore silo is emagged.
- Silicons can ban/unban people if the ore silo is emagged.
## Worn ID requirement
- Enabled at roundstart, can be disabled by anyone with QM access (not
silicons)
- If enabled, you must be wearing an ID with a bank account associated
to it to use ore silo materials.
- Wearers of chameleon cards bypass this restriction (so-called ID
requirement free thinkers wearing chameleon ID cards)
- QM access requirement to toggle removed if emagged.
- Silicons can toggle this on/off if the ore silo is emagged.
# Access control radio notifications
## Access control operations reported on the radio
- Any operations for access control are reported on radio channels.
    - Currently, the policy is always the default.
- In the future, the ore silo UI will allow the quartermaster to modify
what operations are reported on what channels (petty QM broadcasting ban
reports on Common)
- Current default policy:
    - Reported on COMMON channel:
- Anyone but the Captain attempts to ban someone with QM access from the
ore silo (nice try dumbass)
	    - Ore silo ID requirement toggling
	- Reported on COMMAND channel:
	    - Common channel reports.
		- Per-user banning/unbanning.
		- Anyone without QM access attempts to ban/unban someone.
		- Anyone without QM access attempts to toggle the restriction for ID.
		- Silicons attempting to tamper with the ID requirement restriction
		- Silicons attempting to tamper with the ban/unbanned user list
- A ban attempt failing because a given log entry had a user with no
bank ID.
	- Reported on SECURITY channel:
	    - Common channel reports.
		- Per-user banning/unbanning.
		- Anyone without QM access tampering with the silo.
	- Reported on SUPPLY channel:
	    - Command channel reports.
- Reporting to the radio is disabled if the ore silo is emagged.
## Modifications to the remote_materials component
- Strictly encompass the behavior for connecting/disconnecting ore silos
to material receptacles (RCDs, machines, etc) into procs on the
component, instead of handling it all over the place

## Why It's Good For The Game

Gives people with ore silo access more fine grained control over ore
silo use without having to resort to heavy-handed fabricator lockouts

Makes the logging on the ore silo more robust so we can make sure we
kill the right Roboticist for using all the materials

Offers an avenue for sidestepping all of this with a chameleon card or
emag if a given traitor (organic or otherwise) is particularly opposed
to DRM mats.



https://github.com/user-attachments/assets/effd2c63-509c-4d33-992f-837a0d62b935



## Changelog
🆑 Bisar
add: The ore silo has had a significant expansion to its logging
capabilities.
add: The ore silo now allows any ID with Quartermaster access (NOT
SILICONS!) to ban/unban specific users from the silo.
add: The ore silo now has a toggle (on by default) that a user of ore
silo materials has an ID with an associated bank account. This can be
toggled by anyone with Quartermaster access (NOT SILICONS!)
add: NanoTrasen discounts any reports that Syndicate contraband
(cryptographic sequencer, agent card) can be used to circumvent any
protocols instituted on the ore silo access control routines.
add: The ore silo now announces operations to ban/unban users and
enable/disable ID requirements on radio channels (check the Github for
actions reported to what channels.)
add: The tgui interface for ore silo log entries has been reworked.
refactor: The code for logging a given access to ore silo materials has
been significantly refactored.
qol: Ore silo log entries now display materials spent in terms of sheets
rather than the obfuscated absolute-units previously display (1 iron
ejected instead of -100 iron, 0.25 used in a craft instead of -25 iron)
/🆑
2025-07-26 22:17:51 -07:00
FalloutFalconandGitHub 51581d91d1 regex for for loop anti pattern (#92136)
## About The Pull Request
I made and metek improved this regex for finding instances if(itterator)
in for loops because a downstream im working on does it an insane
amount. Im fairly certin all these instaces have no reason to be running
if checks here saying most of the for loops are typed so if it was null
or something it shouldnt be iterated on
`for\s*\(var(/\w+)*/(\w+) .*\n\s+if\(\2\)`
## Why It's Good For The Game
just kinda bad practice. Its way way way worse on the downstream tho
holy shit
<img width="1264" height="759" alt="image"
src="https://github.com/user-attachments/assets/1d0f152d-372d-49d4-a9fa-6d8e4d27a816"
/>
## Changelog
N/A
2025-07-22 22:38:40 -07:00