Commit Graph

2324 Commits

Author SHA1 Message Date
Jeremiah
620361d503 Fixes two biome warnings (#92326) 2025-07-30 22:58:23 -06:00
_0Steven
5b5460cd14 Fixes newspapers being unreadable. (#92372)
## About The Pull Request

Apparently the scrollbar on newspapers got lost, meaning tabbing to a
page too large to render in the box would get you stuck until you resize
it so you can see everything that's off-screen. Yes, including the page
buttons.
This just adds `scrollable`, fixing that issue.
Adds `scrollable` to newspapers such that they're actually readable
again, instead of

I think it'd be better if the previous/next page buttons were always on
screen and the stories would have a scrollbar, but after a while of
trying to do that with no progress I'm just posting this fix that
returns it to the previous functional state first.
2025-07-30 21:54:27 -05:00
John Willard
c3bbf807c5 Adds Coroner to Mafia & Bunch of Mafia changes (#92158)
## About The Pull Request

Changeling chat is now at night, rather than :j saymode, and it is also
separated from normal messages as [CHANGELING CHAT]
Adds a new [DEAD CHAT], all dead players in Mafia are corpselocked and
talking will instead go to Dead chat.
The Chaplain's ability is now being able to hear Dead chat at night, and
being able to in turn speak to the Dead.
The Chaplain's old ability has been given to a new role, the Coroner.
"Pray" is now "Autopsy".
Deaths in the Mafia arena aren't broadcasted anymore, to lessen
annoyance to round observers.

Also updates role icons & some outfits, as well as some bug fixes I
encountered while messing with it on localhost. I also tried (but not
fully) to make Mafia games more modular and independent, so maybe in the
future we can have more than one Mafia game running at a time.

I am limited to 2 player testing for this, so it is very much possible
that there's some issues I haven't found from my local testing, let me
know if you find anything please.

## Why It's Good For The Game

Being dead in Mafia boots you out of the round regardless of how
invested you were, that kidna sucks so hopefully being able to still
contribute something to the game, or at least discuss it with other dead
players in your own chat, makes players feel important to the game
they're playing.

I have a previous attempt of this here -
https://github.com/tgstation/tgstation/pull/75879 - but it staled out.
This differs from that attempt, as only dead players from the Mafia game
can speak in dead chat, while the old attempt allowed anyone that was
observing a mafia sign post (so dead players from the game, but not
observing the post, weren't able to speak to Chaplains, making him very
hard to be useful especially since getting information like that across
is a little hard). Being corpselocked also prevents them from being able
to see who Changelings are by simply looking at who has maptext at
night, and keeps them more focused on the game being played.

## Changelog

🆑
add: Added a new role to Mafia; the Coroner, which takes the Chaplain's
ability to see dead people's roles.
add: Mafia Chaplains now speak with the dead at night instead, and the
dead are corpselocked to prevent cheating.
fix: Mafia's HoS doesn't kill himself when executing non-townies.
qol: You can now update your notes & send them in chat while dead, as
well as look up the descriptions of other roles.
/🆑
2025-07-30 19:59:30 +10:00
Joshua Kidder
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
Arthri
61e42170db Remove stories present in tgui-core (#92317)
## About The Pull Request
Removes tgui component stories that are already present in tgui-core
## Why It's Good For The Game
Less code less maintenance burden

Co-authored-by: Arthri <41360489+a@users.noreply.github.com>
2025-07-27 12:42:21 +02:00
Joshua Kidder
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
Jeremiah
d49cd3337f [tgui] Replaces eslint with biome (#92144) 2025-07-26 09:13:45 +02:00
Jeremiah
b0ee9c51b0 [tgui] Fixes admin fax bluescreen (#92196)
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may
not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull
request process. -->

## About The Pull Request
... and other horrors. Lots of hacky code removed.
Main issue was using the wrong onchange params (typical javascript
problems)
Removed many static pixel dimensions and very manual placements
Fixed the textarea not extending to the entire window's width
<!-- Describe The Pull Request. Please be sure every change is
documented or this can delay review and even discourage maintainers from
merging your PR! -->

## Why It's Good For The Game
Fixes #91745
Made it typescript (long term project)
<!-- Argue for the merits of your changes and how they benefit the game,
especially if they are controversial and/or far reaching. If you can't
actually explain WHY what you are doing will improve the game, then it
probably isn't good for the game in the first place. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely
observed by players or admins you should add a changelog. If your change
does NOT meet this description, remove this section. Be sure to properly
mark your PRs to prevent unnecessary GBP loss. You can read up on GBP
and its effects on PRs in the tgstation guides for contributors. Please
note that maintainers freely reserve the right to remove and add tags
should they deem it appropriate. You can attempt to finagle the system
all you want, but it's best to shoot for clear communication right off
the bat. -->

🆑
admin: Fixed the bluescreen in admin fax panel
/🆑

<!-- Both 🆑's are required for the changelog to work! You can put
your name to the right of the first 🆑 if you want to overwrite your
GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the
icon ingame) and delete the unneeded ones. Despite some of the tags,
changelogs should generally represent how a player might be affected by
the changes rather than a summary of the PR's contents. -->
2025-07-25 03:14:29 +01:00
_0Steven
119d859d70 Increase height of notice board UI so all papers actually fit on it. (#92223)
## About The Pull Request

While playing with the notice board I realized the UI would cut off
beyond 6~ papers.
This ups the height of the UI to fit all 8 paper entries, with the same
amount of buffer above and below.
## Why It's Good For The Game

It no longer cuts off several papers:
<img width="569" height="243" alt="image"
src="https://github.com/user-attachments/assets/67dd432a-3574-45ce-8154-763c38a64937"
/>
## Changelog
🆑
fix: The notice board UI actually fits the full 8 paper entries.
/🆑
2025-07-20 17:30:07 -07:00
ArcaneMusic
90a81e6a4e The Material Stock Market will now showcase the current elastic modifier of materials. (#92005)
## About The Pull Request

The GMM Material stock market now informs the player about the elastic
modifier which that material currently has, namely for avoiding funny
situations where someone sells hundreds of units of a material and
doesn't quite follow why their perfectly priced material has sold for
nothing.


![image](https://github.com/user-attachments/assets/87ab1987-769e-44b8-919c-9b06fcffa6d2)

Additionally, I've added a note to the instructions dropdown describing
how elasticity works. In hindsight, that drop down only gets more ugly
by the day, and should probably be co-opted by a modal all things
considered, but for this 3 seconds I think this is fine as a stopgap.

## Why It's Good For The Game

The elasticity feature on the GMM has been REALLY poorly handled all
things considered, and it's not very clear that elasticity even effects
stock market sales. This adds at least a UI element describing how the
sale price has decreased, so that cargo can better coordinate on how to
work around different material elasticities.

This also pairs well with the other fix PR syncit dropped, in the case
that we can clear up a bit about how this mechanic works overall.

## Changelog

🆑
qol: The GMM Stock market now shows material elasticity, AKA the sale
price reduction caused by selling a material, which will steadily
recover after a sale.
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2025-07-19 11:40:51 -06:00
Lucy
b21c6b6250 you can now click on the URL in the tgui audio player widget (#92203)
## About The Pull Request

port of https://github.com/Monkestation/Monkestation2.0/pull/7220

<img width="729" height="109" alt="image"
src="https://github.com/user-attachments/assets/3a1dddac-5dd8-4d60-b360-678d9d796581"
/>

## Why It's Good For The Game

much less annoying than having to copy-paste it

## Changelog
🆑
qol: You can now click on the song URL in the music player widget in
chat.
/🆑
2025-07-18 19:03:36 -07:00
Jeremiah
d9e370ef48 Refactors detective board (#92054)
## About The Pull Request
Doing some spot touch ups to the detective notice board UI. It had some
improper types, among other crimes. It should totally get a real
refactor by a brave soul.
## Why It's Good For The Game
Code quality
## Changelog
2025-07-15 21:30:18 +03:00
Ice-Type
f24a22ec1f Extends Integer scaling range, corrects some info (#92130)
## About The Pull Request

Extends the max range for integer scaling up to 9x, corrects some
misinfo in the visuals guide

## Why It's Good For The Game

This allows proper integer scaling up to 8k resolution, which not only
is generally the highest consumer-available resolution currently, but
also the next resolution that is able to perfectly display a 480p image
on it via integer scaling.

Also corrects misinfo because misinfo is bad.

## Changelog

🆑
qol: Increased the integer scaling range up to 9x
/🆑
2025-07-14 17:20:40 -06:00
Jeremiah
d59e5ad5c6 [tgui] Linter fixes 8 (#92101)
## About The Pull Request
8! Yeah! How many more? Well, there's seemingly a fountain of old code
from TG at any given point, and probably a hundred more linter errors
that have collected over time. However, this should be the last batch
before we ship biome. Knock on wood (I am not sitting near anything made
of wood)!
## Command
Get [Biome](https://biomejs.dev/guides/manual-installation/) (the
executable, at least)
`biome lint --write --only "useTemplate" --unsafe`

## Why It's Good For The Game
I would like to install a new linter/formatter
## Changelog
2025-07-14 13:38:06 +12:00
Jeremiah
6ba7ba69dc [tgui] Linter fixes 7 (#92100)
## About The Pull Request
A collection of manual edits from warnings indicated by the [biome
linter](https://biomejs.dev)
## Why It's Good For The Game
Code quality at no cost
## Changelog
2025-07-14 13:37:14 +12:00
MrMelbert
d291e45e30 Decal Painter refactor + merge with tile sprayer + more decals to paint (#91915)
## About The Pull Request

1. Decal painter has been refactored. Decals to paint are now datums.

2. Tile sprayer has been deleted, and merged with the decal painter. 

3. A bunch of map decals previously un-paintable are now paintable.

4. Some preset map colors are now available for selection

Including:

- All sidings (Colored, Plating, Wood)
- Missing tile decals (Full tile, checkered tile)
   - And the missing tile decal colors (Dark colors)
- Missing warning decals (Loading area)


![image](https://github.com/user-attachments/assets/dc67f913-1e3e-42a4-8bec-1cf65381b5fb)

## Why It's Good For The Game

1. Makes it drastically easier to add more decals in the future.

2. The split always felt needless to me. I always printed one, ran to my
construction site, opened up the UI - only to realize I printed the
wrong one.

3. Allows for much greater potential while building

4. Makes it easier to match mapped in decals

(This code is commissioned, but I also wanted it, soooo)

## Changelog

🆑 Melbert
refactor: Refactored the decal painter, report any missing decals or
ones that come out weird.
del: Tile sprayer is dead. Its functionality has been merged with the
decal painter.
qol: A bunch of decals have been added to the decal painter. Style to
your heart's content.
/🆑
2025-07-12 22:58:56 +02:00
SyncIt21
f57f95aa95 [MDB Ignore] General maintenance for SMES (#91587)
## About The Pull Request
- SMES now directly gives/takes charge to the power cells stored inside
its component parts instead of modifying a `charge` variable whose value
was set from the total charge of its stored cells
- Removed `capacity` var. It's now derived from the total cells
`max_charge`. Even then its value was set to this so manually setting it
was a waste
- Fixes #71918. Because of point 1, this also means if you install
rigged cells in the SMES it now explodes
- Adds examines & screentips for installing terminal & other tool acts
- Smes can be connected to the powernet with a multitool with the panel
open after construction.
- General maintenance for portable smes as well. Repaths it to machine
subtype instead of power cause all it's functionality wasn't used
- Removed a bunch of unused defines, autodoc and shuffled around other
code

## Changelog
🆑
qol: SMES has examines and screentips for various stuff
code: Improved code of SMES in general
fix: smes can be connected to the powernet with a multitool with the
panel open after construction
refactor: SMES now functions consistently with its power cells & the
RPED.
/🆑
2025-07-12 16:21:58 +02:00
Kubisopplay
598686e338 Tweaks to biddler malf (#92039)
## About The Pull Request
Fixes the bugged malf ai descriptions, properly describing which modules
need minimum number of hacked apcs
Adds a processing power limit to discourage just sitting on your ass for
2 hours to stack up infinite points
Increases the power draw of hacked APCs to increase the phantom drain on
powernet brought by malf hacking a lot
## Why It's Good For The Game
Discourages hacking two apcs and waiting for next two hours. Also having
working descriptions is cool.
2025-07-11 18:01:29 -05:00
SyncIt21
2d41569c65 Flatpacker & machine frame enhancements (#91752)
## About The Pull Request

**1. Makes the machine creation process from both efficient.**
The machine frame no longer creates & deletes the machines old component
parts before moving in the new parts. It instead now passes its parts
directly to the circuit boards `apply_default_parts()` meaning the old
parts are never created and the new ones get applied directly. This also
mean it does not have to again call `RefreshParts()` as the machines
`Initialize()` proc will do that for us by default so the performance is
just faster now.
Flatpack box also benefits from this and it will need it as stated below

- Fixes #86514. As the circuit board is passed to the machine's
`Initialize()` proc during reconstruction so it sets it's
`all_products_free` from the board both during mapload & when player
constructed from either machine frame & flatpack

**2. Flatpack enhancements** 
- The flatpack box now passes its stored circuit board into the machine
meaning any changes made like with a screw driver or such are preserved
in the newly created machine rather than the board getting deleted & the
machine creating the default board
- Flatpacker now accept custom component parts that replaces its stored
circuit board default parts. This implements

https://github.com/tgstation/tgstation/pull/91670#issuecomment-2977259973
meaning instead of the vendor created from the flatpacker starting out
empty it now accepts the refill canister and will package both of them
together. Then during deployment that stored canister is stored back in
the vendor meaning instead of starting out empty you get to carry over
all your previous stock

Depends on https://github.com/tgstation/tgstation/pull/91512 because of
named arg conflict. Keep this drafted till that gets merged

## Changelog
🆑
qol: flatpacker now accepts custom component parts(like vendor refill
canister) along with the circuit board so you can carry over your
previous stock during deployment rather than starting out empty
fix: flatpack boxes now passes its stored circuit board into the machine
thus preserving its properties instead of creating a default board in
the machine
fix: vending machines reconstructed on station from circuits loaded off
station(having free products) will continue to sell free products
code: machine construction via flatpacker/machine frame is faster
performance wise
/🆑
2025-07-11 08:58:11 +02:00
Jeremiah
936007fd8a [tgui] Linter fixes 5 (#92051)
## About The Pull Request
Batch of fixes from the biome linter. Many files could have their syntax
shortened.

I also fixed a prettier ignore file issue so that tgui.html can properly
get formatted
## Command
Get [Biome](https://biomejs.dev/guides/manual-installation/) (the
executable, at least)
`biome lint --write --only "useOptionalChain" --unsafe`

## Why It's Good For The Game
Moving us to a simple linter/formatter and shaving off a number of
packages, tech debt
## Changelog
2025-07-11 08:27:59 +02:00
Jeremiah
dc53bc504b [tgui] Linter fixes 6 (#92071)
## About The Pull Request
Fixes some things the biome linter pointed out. This edition: Banned
typescript types. Some manual fixes in here, no gameplay effect to any
of it.
## Command
Get [Biome](https://biomejs.dev/guides/manual-installation/) (the
executable, at least)
`biome lint --write --only "noBannedTypes" --unsafe`

## Why It's Good For The Game
Code quality. Biome linter.
## Changelog
2025-07-11 08:05:21 +02:00
Aylong
499d5914bc Fix stat panel background color (#92052)
## About The Pull Request
Just a fix for a stat panel background color, was broken after -
https://github.com/tgstation/tgstation/pull/92004
Also removed unused goonStyle from it. There is no browserOutput.css in
repo

## Why It's Good For The Game
No dark background in stat panel, even on light theme
2025-07-09 12:37:36 -05:00
Jeremiah
b96f915bb1 [tgui] Linter fixes 2 (#91953)
## About The Pull Request
Part of a series of linter auto fixes from biome. These change
typescript imports to specify `type`. It's a safe fix:
https://biomejs.dev/linter/rules/use-import-type/

## Command
Get [Biome](https://biomejs.dev/guides/manual-installation/) (the
executable, at least)
`biome lint --write --only "useImportType"`

## Why It's Good For The Game
Moving us to a simple linter/formatter and shaving off a number of
packages, tech debt
## Changelog
2025-07-09 12:56:26 +12:00
Jeremiah
cadb0adeb4 [tgui] Linter fixes 4 (#91991)
## About The Pull Request
Hopefully the last of the linter fixes from biome. This is just cleanup
of some small errors found in the codebase. All manually edited.
## Why It's Good For The Game
Moving us to a simple linter/formatter and shaving off a number of
packages, tech debt
## Changelog
2025-07-09 12:56:18 +12:00
Jeremiah
87a4c082ab [tgui] Retvrn to rspack (#91982)
## About The Pull Request
Swaps us back to RSPack. I keep getting pings about this #91925, which I
can only guess is webpack related. That, and I don't want to just give
up on rspack, I was merely frustrated with it while fixing bun builds.

## Why It's Good For The Game
Less javascript. Puts us back on our last build tool. Might fix the html
entity issue
We can also run the config in ts which I think is sweet

## Changelog
2025-07-09 12:17:09 +12:00
Jeremiah
4f422e5d5c Fixes debug component printer (#92025)
## About The Pull Request
Seems this went under my radar. The backend was sending the wrong data.
I also tuned up the UI a little bit to signify that it's the debug
component printer.

It will print anything listed, free.

<details>
<summary>Screenshots</summary>

![Screenshot 2025-07-07
162543](https://github.com/user-attachments/assets/de9b490d-66ee-4c67-8453-485769fd2ebd)

![Screenshot 2025-07-07
162550](https://github.com/user-attachments/assets/2a5a7cfd-3cd3-42af-aeea-3d83bb51ce9c)

</details>

## Why It's Good For The Game
Fixes #71511
## Changelog
🆑
admin: The admin spawned component printer UI functions again
/🆑
2025-07-09 12:16:54 +12:00
Jeremiah
bab8f73208 [tgui] Linter fixes 3 (#91961)
## About The Pull Request
Part of a series of fixes by biome. This handles improperly accessing
objects via string index. This uncovered some erroneous logic, which
still needs fixed (hence draft).

This uses lint rule
[useLiteralKeys](https://biomejs.dev/linter/rules/use-literal-keys/)

## Command
Get [Biome](https://biomejs.dev/guides/manual-installation/) (the
executable, at least)
`biome lint --write --only "useLiteralKeys" --unsafe`
This may include manual fixes, like this PR includes
## Why It's Good For The Game
Moving us to a simple linter/formatter and shaving off a number of
packages, tech debt

## Changelog
2025-07-09 12:16:11 +12:00
Jeremiah
52cc2a95ba [tgui] Refactors personal crafting (#91843)
## About The Pull Request
Sorry this is uninteresting, but I made no visual or functional changes
to the UI at all

- Entire UI is sorted into a folder
- Props were not typed at all
[link](https://github.com/tgstation/tgstation/blob/master/tgui/packages/tgui/interfaces/PersonalCrafting.tsx#L645)
- Removed `as any` casts
[link](https://github.com/tgstation/tgstation/blob/master/tgui/packages/tgui/interfaces/PersonalCrafting.tsx#L975)
- Removed lines which were asking javascript to index based on a
string-minus-number
[link](https://github.com/tgstation/tgstation/blob/master/tgui/packages/tgui/interfaces/PersonalCrafting.tsx#L575)
<details>
<summary>complimentary rant</summary>

Destructuring react props within the params is bad. Like, we see
[here](https://github.com/tgstation/tgstation/blob/master/tgui/packages/tgui/interfaces/PersonalCrafting.tsx#L778)
what we're going for, but the problem is that these are actually type
`any`. To type this you'd need to write another inline type or a named
type.

```tsx
// God forbid it's an inline destructure and an inline type
const RecipeContent = ({ item, craftable, busy, mode, diet }: { busy: BooleanLike; craftable: boolean; item: Recipe; mode: BooleanLike }) => {
// You have saved precisely no one's time
```

In either case, you lose the function signature in a mess of typescript
goo. Please just separate them or I will cry

```tsx
type Props = {
  busy: BooleanLike;
  craftable: boolean;
  item: Recipe;
  mode: BooleanLike;
};

export function RecipeContentCompact(props: Props) {
  const { item, craftable, busy, mode } = props;
```

</details>



## Why It's Good For The Game
Fixed a bug in this UI the other day which made me realize it's 1000
LoC. There is no reason to do UIs like this unless you wish to stunlock
reviewers. This makes the UI code much more sensible and digestible.
## Changelog
2025-07-09 12:16:00 +12:00
ZeWaka
02bfa573df change raw nonrendered browser bg color of tgui windows (#92004)
## About The Pull Request

helps remove the shitty white flashing, way way less noticeable

so like this will still happen on first mount of each♻️reused tgui
window♻️, but subsequent full **full** rerenders won't look shitty ugly
gross

pictured: me spamming refresh



https://github.com/user-attachments/assets/706cde5f-06a0-4658-a489-8038d2c517fe



i can't fix first mount unless lummox gives us the ability to set
`WebView2.DefaultBackgroundColor` via `browse()` which, ..... LOL

feel free to merge or close or edit or whatever this is just a courtesy
upstream PR, no warranty


here's the song i was listening to while i wrote this

[![image](https://github.com/user-attachments/assets/24b5643d-7108-4e2b-85d0-b9303ea0444f)](https://open.spotify.com/track/2dYwmQKGTqHEFEafnNwr60)



## Why It's Good For The Game

obviously not as good on different themes than default but still better
than shitty white

i don't think you even have light mode, so no 5% of users or whatever to
complain there either

## Changelog

🆑
fix: white TGUI window flashing should be less present
/🆑

---------

Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
2025-07-08 23:55:13 +00:00
Jeremiah
8757460daf [tgui] Linter fixes 1 (#91951)
## About The Pull Request
Atomized PR from converting us to biome. This converts all cases where
we're using `let` but it's never reassigned. This is considered a safe
fix
https://biomejs.dev/linter/rules/use-const/

## Command
Get [Biome](https://biomejs.dev/guides/manual-installation/) (the
executable, at least)
`biome lint --write --only "useConst"`


## Why It's Good For The Game
Moving us to a simple linter/formatter and shaving off a number of
packages, tech debt
## Changelog
Should be absolutely zero effect on gameplay
2025-07-06 22:10:21 +02:00
Kubisopplay
a6f20468f9 Biddler Malf (#91895)
## About The Pull Request
AI now gains its malf points over time, based on the number of APCs
hacked. I also added a simple way to lock malf modules from being bought
if you haven't hacked enough APCs, to avoid cheese with delta or robot
factory.
## Why It's Good For The Game
APCs hacked are a constant risk of being found, and instantly targeted,
yet they give one time bonus, that is fairly small. This incentivises
not using antag powers, and using natural AI tools, which blurs the line
for the crew between malf and subverted AIs, and makes fighting it
easier and more boring. With constant gain from the APCs the risk of
being found is rewarded, and malf that hacks a big amount of APCs and
avoids being found can use its powers fairly liberally, at a cost of
having to manage the detection chance.
2025-07-04 12:56:22 -05:00
FeudeyTF
75b1d318f4 [NO GBP] Fix: Evidences twitching on the detective's board (#91899)
## About The Pull Request

After updating the detective's board styles, a bug appeared that caused
the evidences on the board to twitch, especially when there were other
pieces of evidence on the board and they were moving. This bug was
caused by the fact that a random angle rotation was added for the sake
of aesthetics. When the board was updated, this rotation was
recalculated, resulting in a twitching effect. Now, the rotation is
remembered and does not need to be recalculated every time the board is
updated. My fault

## Why It's Good For The Game

This is fix, why it can be bad for the game?

## Changelog

🆑 FeudeyTF
fix: fixed evidences twitching on the detective's board
/🆑
2025-07-01 15:45:06 -07:00
Arthri
cf031ab89c Replace most collections.ts functions with es-toolkit functions (#91471)
## About The Pull Request
This PR has no player-facing changes. Closes #83161

Replaces several `collection.ts` functions with functions from the
`es-toolkit` package.

### Migration
<table>
<tr>
<th width="100px">Function</th>
<th>Notes</th>
</tr>
<tr>
<td>

`filter`
</td>
<td rowspan="3">

Replace `common/collections` import with `es-toolkit/compat`
</td>
</tr>
<tr>
<td>

`map`
</td>
</tr>
<tr>
<td>

`reduce`
</td>
</tr>
<tr>
<td>

`uniqBy`
</td>
<td rowspan="5">

Replace `common/collections` import with `es-toolkit`
</td>
</tr>
<tr>
<td>

`uniq`
</td>
</tr>
<tr>
<td>

`zip`
</td>
</tr>
<tr>
<td>

`range`
</td>
</tr>
<tr>
<td>

`sortBy`
</td>
</tr>
<tr>
<td>

`paginate`
</td>
<td>

Replace with `chunk` from `es-toolkit`
</td>
</tr>
<tr>
<td>

`deepMerge`
</td>
<td>

Replace with `toMerged` from `es-toolkit`
</td>
</tr>
<tr>
<td>

`sort`
</td>
<td>

This function is broken because it leaves the input array unchanged.
Replace with es-toolkit's `sortBy` or the native `Array.prototype.sort`
depending on context
</td>
</tr>
</table>

## Why It's Good For The Game
Reduced maintenance costs

---------

Co-authored-by: Arthri <41360489+a@users.noreply.github.com>
2025-07-01 13:33:38 -07:00
Time-Green
39a2434c06 Voidwalker Rework | Basic Mob Edition + Bonus Antag (#91646)
## About The Pull Request

Reworks the Voidwalker into a basic mob, including a lot of the balance
and mechanics!

Old (left), new (right)

![image](https://github.com/user-attachments/assets/5583db66-6025-4874-95dd-938aa828634c)![image](https://github.com/user-attachments/assets/2785c5cc-ccda-4ffd-bc1c-5bb278873d9b)


https://github.com/user-attachments/assets/22d6138f-11aa-4f7a-8600-2565e6578bcf

(little outdated)
https://youtu.be/cp1E3qPJGX4 (high res mirror)

**🟨Voidwalker mob changes🟨**
No longer a human species and no more void eater. Instead deals damage
by simple unarmed attacks.
Instead of dealing brute, the voidwalker does oxygen damage (4-5 hits to
knock out) with left-click, and slight brute on right click. Non-human
mobs automatically take brute damage instead of oxygen damage.

150 HP
33% burn armor

Yes it has hands, but it can only pick up and drop stuff

**🟨Window phase🟨**

![image](https://github.com/user-attachments/assets/82a330ee-16f8-46e4-a325-c894fc8931d6)
Instead of needing to smash a window with the void eater, moving through
windows simply leaves them passable for 5 seconds. Makes kidnapping a
lot easier, but also makes it easier for people to chase you

People who used the voided skull also leave windows passable for a short
bit.

**🟩Cosmic Charge🟩**
Standard charge ability, but only lets you charge towards space and
works while dragging people

**🟩The Vomitwalker🟩**
People you kidnapped now occasionally do the nebula vomit, which
voidwalkers can use to dive from and into

![image](https://github.com/user-attachments/assets/e483a0d2-a418-479e-89e5-1dcd71165140)
Diving into it is very fast but also removes the nebula vomit. You can
also kidnap people into the vomit (this doesn't remove the vomit).

There is also a little UI for tracking this. Clicking it while in space
dive teleports you to the next nebula vomit, if there are any.


![image](https://github.com/user-attachments/assets/8907f261-6395-44fb-86ea-0ed548aca3ab)

**🟨Voided people changes🟨**
Kidnapped people and people that used the cosmic skull are no longer
muted, but take 10% extra brute and occasionally leave behind glass
shards when taking a lot of damage.

Are no longer obliterated on a second encounter with voidwalkers.
Voidwalkers can't hurt people they've already voided (unless they really
want to), but instead just knock them out for 30s

Also the kidnapped do space vomit as I said earlier.

**🟩Sunwalker🟩**
Voidwalker variant made for pure murderbone. Has no camo and kindap
mechanics, but has a fiery charge, loads of damage and area igniting and
people ignition. It's admin, but I might change this later once I've had
some more time to think about it.

![image](https://github.com/user-attachments/assets/2383dc6e-2173-4449-b71b-367e81c55f88)

Other changes: 
- Voidwindows no longer need to be space adjacent
- Unsettle works faster but can't be used in combat anymore
- Space camo now grants complete space invisibility
- Makes a lot of aspects easily moddable, so we can easily mod it into a
moistwalker in-game
- Taking a cosmic skull when you already used one gives you the old
voidwalker void eater arm. Additional uses just gives you more void
eater arms until you run out of hands
- I definitely forgot a lot more
- I made a cool voidwalker hud! It even has a unique space camo toggle
## Why It's Good For The Game

<details>
  <summary>Lot of text</summary>
  
Voidwalker was basically a snowflaked toghether human species because I
didn't know how to sprite, but I was able to work with species and
visual effects. Then I realized I can just commission sprites!

This also let me just cut out a lot of the snowflake code, because it's
no longer a human so half the things I didn't want them to be able to
do, they just literally cannot do.

Voidwalkers were in a bit of strange spot with kidnapping? There was
essentially no incentive, other than "smash spaceman = funny". They also
had issues doing, anything? There's surprisingly little space on a space
station, especially maps such as tram. Making the voided victims have
nebula vomit gives the voidwalker a reason to WANT to kidnap, by giving
them a way to appear basically anywhere on the station. I don't think
it's too overpowered. Voided people don't vomit that much, it's easily
cleanable and diving into it removes them, so they're limited usability.

Replacing the brute damage with oxygen damage also kinda... just makes
sense? I seriously contemplated letting them do stamina damage for the
first iteration, but opted not to do it because stamina damage has so
many hooks attached. Oxygen damage doesn't! It's also just incredibly
thematic, let's them bypass most armor and makes them more suited to
non-letha kidnappings.

Space camo making them completely invisible was also long overdue. It
was literally just urging people to turn up their gamma and turn down
their parallax settings. I thought it was an interesting mechanic, but
it's just straight up unfair and doesn't belong in a multiplayer game.
They now more frequently leave behind little glass shards, leave
particles from nebula vomit they leave from and have more unique sound
effects, so attentive (and lucky) people can still deduce if an area is
safe-ish.

I removed being able to shatter voided people because the mechanic was
deeply misunderstood. It was intended to give them a means of removing
people if they kept incessently bothering the voidwalker, but people
went out of their way to use this to roundremove people they had already
voided. The 30s sleep conveys my intention a lot better, and fits better
now that the voidwalker benefits from having as many voided people
vomitting all over the place.

The cosmic charge gives them some much needed survivability. My
experiences (in observing voidwalkers, I can never get the roll ;_;) is
that they're constantly one mistake away from complete obliteration. The
cosmic charge let's them get out quick despite their slow movement speed
in gravity. It also makes them stronger when fighting in space.

They got 33% burn armor so it's a tiny bit harder to wipe them away in a
single laser salvo, while still giving people ample opportunity to fight
them off . Also they're like glass or something so it fits thematically.

I gave them hands because I thought it was cool, might be a mistake idk
  
</details>

## Changelog

🆑 Time-Green, INFRARED_BACON
add: Voidwalker has been throughly reworked! Now you are even less safe!
admin: Adds admin-only Sunwalker mob
fix: Unsettle doesnt work on yourself anymore
fix: Space camo doesnt stop bobbing anymore
fix: Voidwalker windows now recharge on kidnap 
runtime: Fixes healthanalyzers runtiming when scanning mobs without
reagent holders
/🆑
2025-07-01 12:55:31 +01:00
FeudeyTF
69e3883466 [NO GBP] Fix: Support for a light theme for standard radio channels (#91907)
## About The Pull Request

Fix of https://github.com/tgstation/tgstation/issues/91881
What has changed? Now you can't set custom colors for channels that have
color settings in the chat based on the theme (freqspans), but the color
will be displayed correctly in different themes

It is still possible to change the channel name for all types (custom
and standard). It is also possible to change the color of your channels
(without support for the light theme)

I hope this will be a temporary solution, as I would like to return full
customization of channels based on the user's chosen theme.

## Why It's Good For The Game

Fans of the light theme will be pleased.

## Changelog

🆑 FeudeyTF
fix: added light theme support for standard radio channels
/🆑
2025-06-30 19:53:45 -07:00
Mikhail G.
2a94d3c574 Fix: linux build file name (#91877) 2025-06-29 11:48:17 +02:00
FeudeyTF
35494b93bb Telecomms Update: Ability to change existing radio channels and create new ones (#91647)
## About The Pull Request
I have added the ability to create and edit station radio channels
through the existing telecommunications system.
You can change the name of the radio channel and its color.

The channel settings are changed and created through the servers
(Frequencies Settings)

![ui](https://github.com/user-attachments/assets/cb010d75-bb00-4e3c-86b6-351b39b832e3)

Here i created my own channel:
1) Add frequency at Receiver (you will not see channel name):

![TestChannelInReceiver](https://github.com/user-attachments/assets/d3934e96-fb2d-492a-a1d6-84e8bfbd6628)
2) Add frequency at Bus (you will not see channel name):

![TestChannelnBus](https://github.com/user-attachments/assets/9955fb9c-9ca0-44f5-8d8f-caf02c0b3a9c)
3) Add frequency at Server
4) Add settings for your frequency

![NewChannel](https://github.com/user-attachments/assets/14a86eae-a000-4106-848b-a140ab678c3c)
5) See the result:

![TestChannel](https://github.com/user-attachments/assets/a720c660-43f6-47c0-8e85-fd313e8ce8d7)

Important Notes:
1) Headsets, radios, and intercoms will not see a change in
telecommunications, but will use standard names (Common, Security etc.).
2) There are still reserved names that cannot be used: CentComm,
Syndicate, Uplink, CTFs channels
3) Servers must filter frequency for applying settings on them

## Why It's Good For The Game

Now telecommunication channels names and colors depends on the settings
of the network servers, which makes it more flexible and logical. It is
also useful for foreign language servers, as you can translate channel
names.

## Changelog

🆑
add: Added ability to change existing radio channels and create new
qol: Added color for some buttons in Telecomms UI
/🆑
2025-06-28 01:19:18 +10:00
SyncIt21
8dc52d0e70 Plumbing reaction chamber UI is scrollable again (#91792)
## About The Pull Request
- Fixes #91734

## Changelog
🆑
fix: plumbing reaction chamber UI is scrollable again
/🆑
2025-06-25 17:39:32 -07:00
Jeremiah
dee9d0cbc4 Fixes cooking menu (#91787)
## About The Pull Request
In the case where items had multiple foodtypes, it would create
components only using the parent item's ref, meaning they would not have
a unique key
2025-06-25 19:38:22 -05:00
MrMelbert
4c277dc572 Dynamic Rework (#91290)
## About The Pull Request

Implements https://hackmd.io/@tgstation/SkeUS7lSp , rewriting Dynamic
from the ground-up

- Dynamic configuration is now vastly streamlined, making it far far far
easier to understand and edit

- Threat is gone entirely; round chaos is now determined by dynamic
tiers
   - There's 5 dynamic tiers, 0 to 4.
      - 0 is a pure greenshift.
- Tiers are just picked via weight - "16% chance of getting a high chaos
round".
- Tiers have min pop ranges. "Tier 4 (high chaos) requires 25 pop to be
selected".
- Tier determines how much of every ruleset is picked. "Tier 4 (High
Chaos) will pick 3-4 roundstart[1], 1-2 light, 1-2 heavy, and 2-3
latejoins".
- The number of rulesets picked depends on how many people are in the
server - this is also configurable[2]. As an example, a tier that
demands "1-3" rulesets will not spawn 3 rulesets if population <= 40 and
will not spawn 2 rulesets if population <= 25.
- Tiers also determine time before light, heavy, and latejoin rulesets
are picked, as well as the cooldown range between spawns. More chaotic
tiers may send midrounds sooner or wait less time between sending them.

- On the ruleset side of things, "requirements", "scaling", and
"enemies" is gone.
- You can configure a ruleset's min pop and weight flat, or per tier.
- For example a ruleset like Obsession is weighted higher for tiers 1-2
and lower for tiers 3-4.
- Rather than scaling up, roundstart rulesets can just be selected
multiple times.
- Rulesets also have `min_antag_cap` and `max_antag_cap`.
`min_antag_cap` determines how many candidates are needed for it to run,
and `max_antag_cap` determines how many candidates are selected.

- Rulesets attempt to run every 2.5 minutes. [3]

- Light rulesets will ALWAYS be picked before heavy rulesets. [4]

- Light injection chance is no longer 100%, heavy injection chance
formula has been simplified.
- Chance simply scales based on number of dead players / total number
off players, with a flag 50% chance if no antags exist. [5]

[1] This does not guarantee you will actually GET 3-4 roundstart
rulesets. If a roundstart ruleset is picked, and it ends up being unable
to execute (such as "not enough candidates", that slot is effectively a
wash.) This might be revisited.

[2] Currently, this is a hard limit - below X pop, you WILL get a
quarter or a half of the rulesets. This might be revisited to just be
weighted - you are just MORE LIKELY to get a quarter or a half.

[3] Little worried about accidentally frontloading everything so we'll
see about this

[4] This may be revisited but in most contexts it seems sensible. 

[5] This may also be revisited, I'm not 100% sure what the best / most
simple way to tackle midround chances is.

Other implementation details

- The process of making rulesets has been streamlined as well. Many
rulesets only amount to a definition and `assign_role`.

- Dynamic.json -> Dynamic.toml

- Dynamic event hijacked was ripped out entirely.
- Most midround antag random events are now dynamic rulesets. Fugitives,
Morphs, Slaughter Demons, etc.
      - The 1 weight slaughter demon event is gone. RIP in peace. 
- There is now a hidden midround event that simply adds +1 latejoin, +1
light, or +1 heavy ruleset.

- `mind.special_role` is dead. Minds have a lazylist of special roles
now but it's essentially only used for traitor panel.

- Revs refactored almost entirely. Revs can now exist without a dynamic
ruleset.

- Cult refactored a tiny bit. 

- Antag datums cleaned up.

- Pre round setup is less centralized on Dynamic.

- Admins have a whole panel for interfacing with dynamic. It's pretty
slapdash I'm sure someone could make a nicer looking one.


![image](https://github.com/user-attachments/assets/e99ca607-20b0-4d30-ab4a-f602babe7ac7)


![image](https://github.com/user-attachments/assets/470c3c20-c354-4ee6-b63b-a8f36dda4b5c)

- Maybe some other things.

## Why It's Good For The Game

See readme for more info.

Will you see a massive change in how rounds play out? My hunch says
rounds will spawn less rulesets on average, but it's ultimately to how
it's configured

## Changelog

🆑 Melbert
refactor: Dynamic rewritten entirely, report any strange rounds
config: Dynamic config reworked, it's now a TOML file
refactor: Refactored antag roles somewhat, report any oddities
refactor: Refactored Revolution entirely, report any oddities
del: Deleted most midround events that spawn antags - they use dynamic
rulesets now
add: Dynamic rulesets can now be false alarms
add: Adds a random event that gives dynamic the ability to run another
ruleset later
admin: Adds a panel for messing around with dynamic
admin: Adds a panel for chance for every dynamic ruleset to be selected
admin: You can spawn revs without using dynamic now
fix: Nuke team leaders get their fun title back
/🆑
2025-06-25 17:36:10 -07:00
Jeremiah
6dccb679c0 [tgui] Reworks dev server into Bun + TS (#91695)
## About The Pull Request
This started out as just a small fix for dev server crashing but lo, I
cannot keep my hands off of such a juicy rework, it now uses Bun's own
websocket server and is written entirely in typescript. It makes much
more use of console.log (you can see these in client) as well
## Why It's Good For The Game
Lets devs use tgui-dev again

## Changelog
2025-06-22 00:17:28 -07:00
Jeremiah
c0c8ebe979 [tgui] Removes some unused features (#91681)
## About The Pull Request
I don't know anyone that uses these. I don't think bench is even
relevant for webview2. Even the documents are outdated (referencing
ie8).
## Why It's Good For The Game
Anything these were testing for is probably old news, which makes this
just a maintenance burden
## Changelog
2025-06-19 18:24:08 +00:00
moocowswag
c2e0d21c7a Adds Modular shield consoles, boards, and tech, lets monkeys mash their keyboards (#91189)
## About The Pull Request
(had to cut off the video cause of github file size limit)


https://github.com/user-attachments/assets/f6a51d28-dc35-41ad-93ac-099c48215013


Adds modular shield generator consoles to the game, boards are available
through holographics tech

Simply multitool buffer a generator and then use the buffer on a
console.

The console can see the current shield health status of every generator
that is linked to it and can toggle the generators on
and off, but cannot change radius or any other settings.

The console can also rename generators for convenience



And should a monkey manage to slip past your defenses via ventcrawl it
will be able to randomly toggle your shields.


https://github.com/user-attachments/assets/94435d15-e52f-45c7-a2e6-135228e7bc08


## Why It's Good For The Game

Helps engineers keep track of their generators for primarily PVE content
(mainly when they are trying to protect the station against meteors)
## Changelog
🆑
add: You can now remotely monitor and control modular shield generators
using modular shield generator consoles.
/🆑

---------

Co-authored-by: SyncIt21 <110812394+SyncIt21@users.noreply.github.com>
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-06-19 14:16:47 +00:00
Tim
bb568c9d7a Fix admin immersion buttons scaling incorrectly with UI (#91684)
## About The Pull Request
Fixes some buttons on the admin secrets menu that scale incorrectly when
the UI is stretched.

## Why It's Good For The Game
Better UI.

## Changelog
🆑
fix: Fix admin immersion buttons scaling incorrectly when UI is
stretched.
/🆑
2025-06-18 16:28:56 -07:00
Tim
b68ab68be3 Fix broken link to TGUI component documentation (#91682)
## About The Pull Request
A few days ago TGUI was updated in:
- #91644

It removed the old component guide since it was out of date and replaced
it with Storyboard. However it never updated the `README.md` and people
are sent to a broken link to non-existing component guide.

## Why It's Good For The Game
Working documentation good.

## Changelog
N/A
2025-06-18 16:28:45 -07:00
Jeremiah
bb12d370dc [tgui] bumps tgui-core to v4.2 (#91644) 2025-06-16 22:43:54 +00:00
Jeremiah
e1c3946591 [tgui] Replaces node with bun (#91359)
## About The Pull Request
Swaps out node & yarn in favor of [bun](https://bun.sh/)

![image](https://github.com/user-attachments/assets/3df68cdf-98ed-477b-a9b6-5072d0de27ed)

sub tasks
- [x] add bun setup script
- [x] fix tgui-dev-server (bun glob is different)
- [x] set juke to run bun
- [x] remove all yarn stuff 
- [x] convert all tests from vitest to bun 
- [x] fight with CI/tgs

## Why It's Good For The Game
Yarn has served us over the years as our package manager but the method
it bundles dependencies has lead to issues and setbacks, notably needing
to wait on rspack support, but more recently in trying to switch to
biome
1. I can add in packages that do not need these workarounds, like god
intended
2. We won't need to [keep around
sdks](https://yarnpkg.com/getting-started/editor-sdks) which rely on
yarn to even publish
3. We're not committing the yarn cache or .pnp file, which kind of
defeats the purpose
4. Native typescript support and testing
5. Because it'd be cool

## Caveats
Rspack was throwing errors on TGS while doing this. I needed to switch
back to webpack/swc, which seems to work flawlessly. It was too tiring
for anyone involved to debug and this was the simplest route. It adds a
completely negligible amount of time to build. It might even resolve
some issues elsewhere.

Making this switch extends that very first setup time! I'm working on
cutting it down, but as of right now, it takes about 80 seconds just for
TGUI to download all the packages. Afterwards, it's the same.
## Changelog
2025-06-17 09:03:23 +12:00
Tim
a91d61d449 Photocopier Improvements (#91258)
## About The Pull Request
Photocopiers no longer initialize all their stored papers. Since the
only paper that can be stored has to be empty this is now just stored as
a number value. This prevents hundreds of blank papers from being
spawned during round start loading, since every station map has a dozen
of these machines scattered about.

Other stuff:
- Emag function where it breaks the payment system so people are no
longer charged for printing
- Stock parts now affect max paper storage, print time, and toner usage
(swapped servo part for matter bin)
- Can now load paper via paper bins
- Can now select which type of paper to print with (regular, carbon,
construction, natural)
- Fix stored paper counts being wrong
- Gave paper subtypes proper names so we can use them in our UI
- Paper and toner are now dropped when machine deconstructed
- Refactored item code to use `item_interaction()` instead of
`attackby()`

## Why It's Good For The Game
New functionality, bugfixes, refactored code, and optimizations are
good.

## Changelog
🆑
add: Photocopiers can now be emagged to disable the payment system that
charges you for printing copies
add: Photocopiers are now affected by stock part upgrades. Matter bins
affect paper capacity, lasers affect toner usage, and scanning module
affects time to print. The servo stock part was replaced with matter
bin.
add: Photocopiers can now be loaded with regular, carbon, construction,
and natural paper. You can select which kind to use in the UI when
printing copies if any are stored.
qol: Photocopiers can now be loaded with paper bins
fix: Photocopiers now display the correct amount of stored paper
fix: Photocopiers now drop toner and paper when machine is deconstructed
code: Paper subtypes (carbon, construction, natural) were given proper
names to use with photocopiers UI menu.
refactor: Photocopier code was refactored to not spawn paper when it is
initialized. Instead it stores blank papers as a numeric value. Also
switched the `attackby()` code handling to use the modern
`item_interaction()` proc.
/🆑

---------

Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-06-08 16:09:56 +00:00
Arthri
26cc40c64c Fix tgui-dev-server crash when reloading after connected client closes (#91470)
## About The Pull Request
Added a catch handler to the dreamseeker.js topic call which removes the
client from the global register if the topic call results in
`ECONNREFUSED` (i.e. the client closed). Allows the dev server to be
left open in the background between game restarts
## Why It's Good For The Game
Better developer experience

Co-authored-by: Arthri <41360489+a@users.noreply.github.com>
2025-06-08 14:42:08 +00:00
SmArtKar
da42bad433 Fixes urgent ahelps not working (#91413)
## About The Pull Request

Closes #91366

## Changelog
🆑
fix: Fixed the "Alert Admins" button not allowing you to click it
/🆑
2025-06-07 12:48:29 -07:00