Commit Graph

4188 Commits

Author SHA1 Message Date
Bloop
4aebc85937 Adds a new admin verb, Mass Modify Traits (#93767)
## About The Pull Request

Adds a verb, Mass Modify Traits, which allows an admin to apply or
remove a specific trait from all living mobs.

This lets you do things like give all mobs the `TRAIT_NOBREATHING`, or
making all mobs able to fly.

<img width="345" height="138" alt="JvkEnGMkQI"
src="https://github.com/user-attachments/assets/fad89db3-a1a5-42d7-ae54-67ca7ba92301"
/>

You can specify only cliented mobs, as well as the trait source for
removals.

<details><summary>results</summary>


![dreamseeker_K4w1Mmt73N](https://github.com/user-attachments/assets/62025b6a-1c16-4eb5-81ac-e2f5387877dd)

</details>

## Why It's Good For The Game

More tools for admins to get creative with is always a good thing, I
think! The trait system uses macros so it's difficult to use SQL to
mass-apply, so here's an easy verb for it instead.

## Changelog

🆑
admin: added new admin verb, 'Mass Modify Traits', which can be used to
add or remove a trait to/from every living mob.
/🆑

---------

Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
2025-11-04 12:29:53 -05:00
SmArtKar
d72dde631c Fixes `"Return Value of Proccall"` breaking on list returns (#93727)
## About The Pull Request

Closes #93693

## Changelog
🆑
fix: Fixed ``"Return Value of Proccall"`` breaking on list returns when
an admin calls a proc
/🆑
2025-11-02 15:30:07 +01:00
Cirrial
15c729ce22 Fix the swapped "display who played this song" anonymity buttons for Play Internet Sound (#93717)
## About The Pull Request

Hi I'm on a downstream server and this is driving me actually insane

## Why It's Good For The Game

I can't speak for tgstation admins but I like it when the buttons in a
panel are not lies

## Changelog
🆑
admin: Made the buttons asking you for anonymity when you select/approve
a Play Internet Sound request actually do what they say, instead of the
opposite.
/🆑
2025-11-02 01:43:11 -05:00
Jordan Dominion
105b74cb52 Trigger TGS config syncs on manual reboot (#93471)
Ops found that manually rebooting the server skips config syncs. Rectify

---------

Co-authored-by: Jordan Dominion <Cyberboss@users.noreply.github.com>
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-10-31 21:47:55 +00:00
Roxy
f3848f1ef2 Renames flatten_list proc to assoc_to_values (#93453)
## About The Pull Request

`/proc/flatten_list()` -> `/proc/assoc_to_values()`, also changes the
code doc to mirror the language of `assoc_to_keys()`'s code doc

## Why It's Good For The Game

Having a proc called `assoc_to_keys` that takes an associative list and
returns a list of the keys, and also having a proc that takes an
associative list and returns a list of the values, and the latter not
being called `assoc_to_values` is very funny

## Changelog
🆑
code: renamed flatten_list proc to assoc_to_values
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-10-14 21:01:09 +00:00
mcbalaam
1c9e617697 Fixes and QOL for the "Request Internet sound" verb (#93244)
## About The Pull Request

Fixes inverted `tgui_input` arguments. Prettifies both admin and user
outputs.


https://github.com/user-attachments/assets/e91bc950-0117-42b4-add0-45de2295744d

<img width="687" height="202" alt="image"
src="https://github.com/user-attachments/assets/23b6fa14-016d-4357-ae9b-7121226be4a8"
/>

## Why It's Good For The Game

Cleaner code, looks better ingame

## Changelog

🆑
qol: Better output for sound requesting
fix: "Request Internet sound" input window's title and description are
not inverted anymore
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2025-10-14 22:30:48 +02:00
MrMelbert
65bd5e581a Beaker panel TGUI / At least makes it functional (#93398)
## About The Pull Request

Makes Beaker Panel a TGUI so it actually works

<img width="787" height="295" alt="image"
src="https://github.com/user-attachments/assets/343056d2-f059-473d-a1eb-5604d2c3a38e"
/>

There's a lot more I want to do to this UI, namely UX and more features
(like changing grenade types) but I figured I should PR it now that it's
bare minimum functional so I don't get eaten by scope creep

Fixes #89954

## Changelog

🆑 Melbert
admin: Spawn-reagent-container works again, and it's a TGUI
/🆑
2025-10-14 20:20:15 +02:00
Bloop
b7402b77c2 Changes cat tail define from FEATURE_TAIL to FEATURE_TAIL_CAT so it matches the rest (#93426)
## About The Pull Request

Just a simple find + replace PR. All the other tail defines match their
text strings, but for some reason cat tails are just `FEATURE_TAIL`
which is inconsistent.

## Why It's Good For The Game

Consistency, + a lot of downstreams have a generic "tail" feature key
which is distinct from cat tails, so not taking up that define is
better.

## Changelog

Nothing any players would notice
2025-10-12 23:51:54 +02:00
SmArtKar
975d3d47ae Fixes certain broken icons in the outfit editor, stripping menu and multiple others (#93319)
## About The Pull Request

``icon2base64`` does not like animated icons and will display an atlas
in TGUI when one is passed into it

<img width="239" height="220" alt="JKneqDL9NH"
src="https://github.com/user-attachments/assets/47e0ffdf-c155-4c84-94ce-c23203281012"
/>

Additionally added some padding between the icon and the slot name in
the outfit editor because it annoyed me

## Changelog
🆑
fix: Fixed certain broken icons in the outfit editor, stripping menu and
multiple others
/🆑
2025-10-07 18:42:17 +02:00
SmArtKar
cd5b2c2b82 [NO GBP] Fixes some filterrific functions not working (#93232)
## About The Pull Request

Non-smooth modification and renaming didn't work, and mass application
broke a lot of things (always, did actually)

## Changelog
🆑
fix: Fixed some Filterrific functions not working
/🆑
2025-10-02 12:37:17 -07:00
MrMelbert
44acefa73f More things use trait huds over raw hud management (#93084) 2025-10-02 21:36:40 +02:00
SmArtKar
0375103ff5 Fixes some Filteriffic issues and implements colorspace/blend mode controls (#93145)
## About The Pull Request

- Fixes filteriffic erroring out when trying to edit a filter
- Implements plugs for color/transform matrix editing rather than just
displaying an error
- Fixes bloom threshold displaying as a float rather than a color due to
an overlap with rays filter
- Displace filter flags can now be controlled
- Color matrix filter now allows the user to change the colorspace (not
really that useful considering you still can't edit the matrix)
- Layering filter now allows the user to control its blending mode
(actually useful this time)

## Changelog
🆑
fix: Fixed filteriffic runtiming when editing filters, and claiming that
bloom threshold is a number
admin: Filteriffic got a few new options (you should still avoid using
it)
/🆑
2025-10-01 05:45:36 +00:00
mcbalaam
bf1c46a173 Adds a TGUI spawn panel for badmining time (#90943)
## About The Pull Request

### Adds this TGUI spawn panel with a lot of stuff


![image](https://github.com/user-attachments/assets/f2ce34e9-3bd3-488e-bc48-cb5930b865ba)

### Adds two useful admining hotkeys

`Ctrl + Shift + LMB` on an atom opens the View Variables window

`Ctrl + LMB` on a mob opens the Player Panel window

This PR is an upgrade/continuation/upstreaming of the following PR by
@Ez-Briz: https://github.com/ss220club/BandaStation/pull/1242

## Why It's Good For The Game

### Icon and object previews!


https://github.com/user-attachments/assets/894c4383-0455-4ba8-9cc1-7fb0d8dff6c7

### Introducing Fuzzy Search!


![image](https://github.com/user-attachments/assets/e5d6e3d7-8328-49c1-991b-7eee75895e10)

### Easier datum marking and recalling!


https://github.com/user-attachments/assets/4934ecca-18aa-45ce-83af-1fe90263b534

### Targeted spawn and quick targeted droppods (Build Mode Lite™️) (RMB
to disengage)!


https://github.com/user-attachments/assets/38eb6e08-74bf-471c-8bd5-61e1b219086b

### Weaponize your tiders with a hover of a mouse!


https://github.com/user-attachments/assets/9840d0ed-d20d-4d48-91e0-2dc1eaf17e36

The options are persistent between opens and even rounds, using local
`storage`, which means you won't have to readjust your panel every time
you close it!

...and it doesn't end there.

## WIP things:

- [x] implement fuzzy search (requires
https://github.com/tgstation/tgui-core/pull/166 to be merged);
- [x] add a modal window to adjust description, icon file/state/size and
badmin flags;
- [x] clean the code up;

## Changelog

🆑 mcbalaam, Ez-Briz
admin: Added a new TGUI spawn panel, removing it's ancestors - HTML
"Create X" panels
/🆑
2025-09-24 01:05:27 +02:00
SmArtKar
4a2efa2928 Refactors filters to utilize binary insertion instead of timSort (#93053)
## About The Pull Request

update_filters() is more expensive than it should be due to running
timSort every time a filter is added or removed, plus we wipe
re-initialize the entire atom filter list every time we call it. I
swapped it to use binary insertion into the main list, and we can cut
down on the amount of filter churn by storing filters in a separate list
which we can use Insert on, which allows us to stop constantly deleting
and recreating filters completely.

## Why It's Good For The Game

Server CPU consumption go down

## Changelog
🆑
refactor: Refactored filters to utilize binary insertion instead of
timSort. The server should run somewhat faster now, hopefully.
/🆑
2025-09-21 14:48:38 +02:00
MrMelbert
750ca9d2ec Two as anything greps (and some other cleanup) (#92974) 2025-09-20 13:44:28 -04:00
MrMelbert
65852c9362 Removes Captain from the security department (still under sec in the ban panel) (#92940)
## About The Pull Request

Removes the security department from the Captain 

Captain still remains under Security in jobbans

<img width="436" height="74" alt="image"
src="https://github.com/user-attachments/assets/ffac3488-282c-458e-80f1-82fd316fb006"
/>

## Why It's Good For The Game

There seemed to be a common misconception that the Captain was
officially integrated into security as a consequence of the Captain
gaining security department for the purpose of jobban sorting

However, Captain is *not* a member of Security.

## Changelog

🆑 Melbert
del: Captain's no longer sorted under Security in places such as the
manifest or job selection
/🆑
2025-09-11 23:05:04 -07:00
SyncIt21
95ed2de101 Fixes map export breaking semi colon dependent strings (#92898)
## About The Pull Request
Take the atmos gas mixture string for example. All parts of the gas
mixture is appended together with semicolon `;`

d2ec1056ab/code/modules/atmospherics/gasmixtures/gas_mixture.dm (L768)

However the map export replaces semicolon `;` with an empty string ` `

d2ec1056ab/code/modules/admin/verbs/map_export.dm (L180)

We don't want that cause you get broken gas strings. There is no problem
in writing special strings that would spawn items because we are already
replacing `{` & `}` with empty strings so the string becomes non
parseable anyway

## Changelog
🆑
fix: map export won't break exported gas strings & other that depend on
semicolon
/🆑
2025-09-09 11:52:05 +02:00
MrMelbert
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
SimplyLogan
e17c21b82c Fixes #92714 - Admin Cure Diseases now adds immunity to disease (#92723)
## About The Pull Request

Fixes #92714

Admin Cure all in secrets.dm explicitly did not add immunity from curing
all diseases, which meant re-infection happened, it passed a value of 0
which prevented immunity.

It is permanent immunity to that disease with no time limit so added a
prompt to clarify the button.
## Why It's Good For The Game

- Makes the anti disease button for admins better
2025-08-26 16:37:40 -05:00
Lucy
5d8bddfcf4 Pre-sort PDA messengers by name/job instead of sorting every time we list them (#92613)
## About The Pull Request

this gets rid of the `get_messengers_sorted_by_name` and
`get_messengers_sorted_by_job` procs, instead replacing them with two
new global lists: `GLOB.pda_messengers_by_name` and
`GLOB.pda_messengers_by_job`

those two lists are updated in the `add_messenger` proc, which uses the
binary insert macros to insert it into the properly sorted place.

why? bc sorts suck for performance and all inserts/removals to this list
go thru a single proc anyways, so we can just ensure it's sorted like
this once, instead of re-sorting each time.

thanks to @LemonInTheDark for helping me with this

<details>
<summary><h3>Testing Proof</h3></summary>

<img width="1708" height="1349" alt="2025-08-16 (1755391989) ~
dreamseeker"
src="https://github.com/user-attachments/assets/1e2dc99a-1863-4a35-8032-8ae64706fdaa"
/>

<img width="1708" height="1349" alt="2025-08-16 (1755392002) ~
dreamseeker"
src="https://github.com/user-attachments/assets/4d9b3bd0-7f3a-410b-a073-1bf2bd69690b"
/>

</details>

## Why It's Good For The Game

because doing a sort repeatedly whenever someone has their PDA messenger
open is stupid and sucks

## Changelog

no player-facing changes
2025-08-18 00:15:18 +02:00
_0Steven
69bd91b2f4 Fixes newscaster channels having a random chance of breaking upon creation of a new channel, refactors how channels are tracked in the first place (#92371)
## About The Pull Request

So in a recent round I noticed the newscaster UI was acting kind of
funky, where two channels seemed to overlap and weirdly pick between the
two in unpredictable ways. Looking into it, it seemed that somehow the
channels had managed to get their unique IDs to overlap-
Oh.

5d3353e7af/code/game/machinery/newscaster/newscaster_data.dm (L109-L131)
I see.

...I think that code speaks for itself, in how this could've gone wrong.

Anyhow, in this pr we entirely ditch this system, and instead make it
use an incremental and thus guaranteed to be unique ID.
This fixes our issues.

While we're here, we also remove the unused `channel_IDs` list, and
replace it with the associative lists `network_channels_by_id` and
`network_channels_by_name`. This allows us to also stop iterating over
every network channel until we find the one with the right name or ID.
We also rename some confusing, wrong, or non-standard vars while we're
here.
2025-08-12 16:22:35 -05:00
MrMelbert
5df4de3f71 [MDB Ignore] Re-add hop console second ID slot (#92157)
## About The Pull Request

<img width="491" height="301" alt="image"
src="https://github.com/user-attachments/assets/a3b5b19f-edf5-4de9-9201-9cbfab9e8827"
/>

Mod computers with the access changing software installed have a
secondary ID slot once again. This ID slot doesn't contribute to access.
You can insert IDs into the slot with right click and remove them with
alt-right click.

Also removes the "New IDs and you" memo paper. 

Also tweaks PDA on_deconstruct so contents are dropped on when they're
deconstructed with assembly.

Fixes #92151

## Why It's Good For The Game

Changing IDs is very unnecessarily clunky with the one slot. Insert hop
id, log in, remove hop id, insert crew id, change access, remove crew
id, log out.

We had it right back when we had two slots. Insert hop ID, insert crew
id, log in. It just works.

This also allows for mobile HoPs to change access without necessitating
removing their ID from their PDA.

Other changes: 

The "New IDs and you" memo is very old. They haven't been new for 4
years now. I don't think anyone reads it and they served their purpose.

I found it odd that, if your PDA was melted or blown up, it would delete
your ID. If this is a hold-over from old PDA behavior feel free to let
me know but otherwise it seems sensible that it'd spit out the contents
as you would expect.

## Changelog

🆑 Melbert
qol: The access changing software (the HoP console) now has ID two slots
again (one for the HoP's id and one for the ID being changed). You can
insert IDs in the secondary slot via the UI or right click, and remove
them via the UI or alt-right click.
qol: If your PDA is destroyed via acid or bombs, your ID (and similar
contents such as disks) are spit out instead of being deleted
del: Deletes the "New IDs and you" memo in the HoP's office. They
haven't been new for 4 years.
fix: Engineering sub-tab in the access changing software no longer looks
messed up
fix: Fix reversed alt-click logic for mod pcs
/🆑
2025-08-11 19:08:18 +00:00
Arturlang
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
FalloutFalcon
7b5ee58502 Whitelist Admin Verb (#92276)
Co-authored-by: Lucy <lucy@absolucy.moe>
2025-07-28 15:32:02 -04:00
MrMelbert
dba39d33c7 Allows set_blood_type to take strings (#92242) 2025-07-28 05:15:07 +02:00
Yasha
50bcb00109 Add custom sound action on command report (#91985)
## About The Pull Request

When I was administering one downstream there were often situations when
instead of the standard announcement sound it was necessary to play
something of my own. So I got my hands on it. Together with standard
announcement sounds there is a possibility to play a custom sound.


https://github.com/user-attachments/assets/ba17f4d1-56f6-4022-b049-6ad6dab8481f


## Why It's Good For The Game

Admins will ~~get a soundpad~~ have the ability to play their own
announcement sounds to match the tone of the situation.

## Changelog
🆑
admin: Added the ability to play your own announce sounds.
/🆑
2025-07-25 10:43:47 +02:00
Tim
30d2f28c16 map_export now saves welded airlocks and paper on noticeboards (#91960)
When using `map-export`:
- Exports the welded state of an airlock to the welded airlock mapping
helper
- Exports the paper inside of a noticeboard to pop out and be saved on
the same turf

Both `airlocks` and `noticeboards` handle the outside objects already in
their `Initialization()` procs so I didn't have to change anything. Also
I cleaned up the paper code and added some better code documentation to
`on_object_saved()`.

We convert this:

![dreamseeker_h4gQeOTaSC](https://github.com/user-attachments/assets/356b976f-b597-4492-96b0-7169b22e1845)

To this:

![StrongDMM_lQ5B1i8lH5](https://github.com/user-attachments/assets/b5360967-3e36-4e32-b94d-a51245eab867)

## Why It's Good For The Game
There weren't any good examples of using `on_object_saved()` and the
documentation was lacking so I wanted to include some proof of concept
for a few objects. Also airlocks already save their welded state, but I
think it looks better to have it as a mapping helper since it shows up
in StrongDMM instead of being a VV edit.
2025-07-15 10:39:23 -04:00
Waterpig
b01756b97c Datumizes DNA blocks, makes DNA cleaner in general (#92061)
## About The Pull Request

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

## Why It's Good For The Game

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

## Changelog

🆑
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-07-14 16:51:45 -06:00
Gaxeer
0c10a3684d remove useless view_variables verb from stat panel (#92040)
## About The Pull Request

Make `VV` verb Context Menu only.
As it's very annoing when clicked on, because it's forming the list of
all atoms in world which causes nasty client freeze.

## Why It's Good For The Game

No more accidentally clicking VV when trying to click View Runtimes 😠 

## Changelog

🆑
admin: VV verb is removed from Debug tab. Who is even using it?
/🆑
2025-07-09 09:39:23 -04:00
Tim
83ecdecb39 Fix map_export including projectiles in saved maps (#91878)
## About The Pull Request
The map export verb was including fired projectiles from
guns/lasers/magic/etc. if a map was saved at the exact time the
projectile was on the screen. This is bad because when the map is
loaded, the projectile is just stationary and doesn't disappear.

## Why It's Good For The Game
Mapping consistency.

## Changelog
🆑
fix: Fix map export including projectiles in saved maps
/🆑
2025-07-06 21:12:42 +02:00
Fikou
75fddec771 sdql wrapper for generators and getting list output from generators (#91954) 2025-07-04 19:02:37 -04:00
Lucy
3a71c8a352 adds some more SDQL2/Lua wrappers (#91950)
## About The Pull Request

This adds ~~3~~ 8 wrappers for SDQL2/Lua: `_floor(x)`, `_ceil(x)` (we
already had `_round(a, b = 1)`), and `_typesof(a, subtypes_only)`

`_typesof` has a second argument, `subtypes_only` (default false), which
makes it act like `subtypesof` instead, to save from having to manually
remove the base type (especially since removing by value is kind of
annoying in Lua)

the Lua SS13 library has had a `SS13.typesof` function added, which does
exactly what it says on the tin (also with the second `subtypes_only`
argument)

also added `_uppertext`, `_html_encode`, `_html_decode`, `_url_encode`,
and `_url_decode`. these should all be selfexplanatory

## Why It's Good For The Game

more utility for Lua and SDQL2

## Changelog
🆑
admin: Added some more Lua/SDQL2 wrappers: _floor(), _ceil(),
_typesof(), _uppertext(), _html_encode(), _html_decode(), _url_encode(),
and _url_decode()
/🆑
2025-07-04 11:40:20 +02:00
LemonInTheDark
2e5d3ad984 Adds In Game Rank Editing (Permissions Panel Cleanup) (#91873)
## About The Pull Request

Ok there's a lot here, sorry bout that.

- Cleaned up the permissions panel backend pretty signficantly
- Added some extra security measures to said code, mostly proc call
checks
- Properly implemented filtering code jordie wrote years and years ago
for permissions logs
- Cleaned up the permissions ui generally, more bars, nicer lookin
stuff, etc
- Fixed the Management panel's relationship with combined roles, and
renamed it to Housekeeping. Its display is expanded too.
- Added tracking to rank datums on where exactly they came from
- Added a new tab to the permissions panel which allows the modification
and deletion of ranks
- Beefed up rank modification to try and avoid accidential temp rank
additions to the db

I'm doing my best to avoid perms escalation issues, tho they are always
possible right.
Also, got mad at some query cleanup handling, did a pass on it. this
isn't nearly all of em, but it's some.

## Why It's Good For The Game

I realized there is no way to, in game, cleanly edit/create ranks, and
that the way the existing system worked was quite opaque.
I'm trying to fix that here. It does mean potentially opening up DB rank
deletion/modification to bad actors, but frankly I am not overly worried
about that. Admin modification has always been a vulnerability so like.

Here's a video with my changes (mostly, it's lightly outdated)
https://file.house/XqME7KWKk0ULj4ZUkJ5reg==.mp4

## Changelog
🆑
refactor: Fucked with admin rank setup very slightly, please yell at me
if anything is wrong.
admin: Updated the permissions panel to be a good bit more user
friendly, added rank management support to it.
server: I've added code that gives the game modification/deletion perms
for the rank table, be made aware.
/🆑

---------

Co-authored-by: san7890 <the@san7890.com>
2025-06-29 11:41:41 -06:00
Twaticus
8d08fc6c53 Schoolgirl Outfit Resprited Renamed and GAGsified (#91871)
## About The Pull Request

Renames the schoolgirl costume to seifuku, the japanese name for sailor
style uniforms.
Resprites the uniform using GAGs.
Adds an 'adjust' style for the uniforms(rolled sleeves).
Tweaks the stock uniform colors from blue, red, green, and orange to
blue, red, teal, and tan.

stock options
blue, red, teal, tan. long sleeve/short sleeve

![dreamseeker_SZEV1Ql3XP](https://github.com/user-attachments/assets/5e183af5-816d-454c-b20b-353d849f3c91)

custom colors as example
+anyone sad about the sailor moon reference being replaced with more
basic colors dont worry you can still make them :)

![dreamseeker_ECcQewtUaI](https://github.com/user-attachments/assets/defb90a2-0c78-4119-a7b6-2f830b82b23e)
## Why It's Good For The Game

Updates the sprite to be more inline with our current clothes.
Makes the sprite in-game player customizable.
## Changelog
🆑
image: resprites the schoolgirl outfit using GAGs
/🆑
2025-06-28 21:43:28 -07: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
LemonInTheDark
afdd88c717 Fixes an issue with ranks (#91848)
## About The Pull Request

All these guard checks, layers and layers of protection, built from the
ground to the outer firmament, and you fucking got the negation wrong.
2025-06-26 22:59:41 -05:00
Roxy
9ab9bef187 Fix egalitarian station not working on all airlocks (#91788)
Co-authored-by: san7890 <the@san7890.com>
2025-06-26 06:56:28 +02: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
John Willard
4c82b029c7 Removes widescreen config (#91419)
## About The Pull Request

19x15 forever, or 15x15 if you're non widescreen user.

## Why It's Good For The Game

Idek why this is a config
2025-06-22 01:14:55 +00:00
MrMelbert
ed1657ebbb Explosions severing cable networks cause nearby(ish) connected rooms's lights to flicker. Also reduces cable integrity. (#91263)
## About The Pull Request

- If a cable is destroyed by an explosion, all rooms within 64-100 (it's
a probability) tiles AND which are connected to the same powernet as the
split cable will have their lights flicker 1-3 times.

- Also adds a verb for visualizing powernets.

- Reduces cable integrity from 300 to 50.

- Cables have innate 75% bomb armor when under a floor tile.

## Why It's Good For The Game

- A big devastating explosion a few doors down is, usually, not felt at
all outside of the screen shake. This adds a bit more ambience to the
effect - you hear a big explosion, your screen goes wild, and the lights
cut for just a second.

- Verb just makes it easier to trace powernets.

- I found it a little ridiculous that cables have 300 integrity, the
same as most furniture. This ultimately makes them a lot more vulnerable
to stuff like acid and fire.

- To compensate for their drastically reduced integrity, I gave cables a
considerable boost to explosive resistance while concealed under the
floor. This prevents bombs from outright shredding all cables in a 50
mile radius. (Devastating explosions will still one-tap them, but heavy
explosions will on average take two blasts.)

## Changelog

🆑 Melbert
add: If a cable is destroyed by an explosion, all rooms within 64-100
(it's a probability) tiles AND which are connected to the same powernet
as the split cable will have their lights flicker 1-3 times.
balance: Cable integrity has been reduced from 300 to 50
balance: Cables have an innate 75% bomb resistance while under floor
tiles
/🆑
2025-06-20 01:57:48 +00:00
necromanceranne
57624ca1e2 Rebalances wound determination values, wounding escalation and wound armor to hopefully be less explosive (#91099)
## About The Pull Request

This is a big one so please bear with me, wounds are complicated

### Max Potential Wound Rolls

We've decreased the max contributed damage to wound rolls from 35 to 25.
This results, after the exponent, a max possible wound roll of 1 to 91
before any modifiers (assuming the attack, after armor, is 25 or above).

The minimum value to wound is still 5.

### Wound Escalation Penalties

Most wounds were contributing significant numbers per wound type to the
potential for a new wound to occur. Getting wounded once meant you were
getting wound a lot, but actually getting past that first wounding may
be the tricky part.

We have significantly reigned in the wound penalty that having a wound
contributes, and instead utilize the series wound penalty to allow same
type wounds to escalate themselves faster as a priority. Having wounds
still makes you more wound vulnerable, just not to such an extreme
degree.

The priority here for what wounds matter most for contributing to
overall wounding vulnerability is ``Infected BURNS > BURNS >
SLASH|PIERCE > BLUNT.``

### Wound Armor

Wound armor, unlike all other kinds of armor, was used as a additive
value to the wound roll modifiers rather than a multiplicative value.

We have reworked how wound armor is determined by changing how wound
modifiers are calculated.

Firstly, we're passing our entire injury roll into the
``check_woundings_mod()`` proc, as we're not treating this as a proc
that just adds values anymore.

Secondly, bare wound bonus only applies if there is no potential wound
protection from any source, as expected. But it comes last in the
calculations.

Thirdly, wound protection is applied to the injury roll last, after
wound bonuses from the attack, wound bonuses from other wounds and wound
bonuses from a disabled limb are applied. This does not include serial
wound bonuses, which are determined outside of this proc.

Wound protection comes from two sources. Clothing and limb wound
resistance. Your chest and head have an amount of wound resistance so
long as they are not mangled in any fashion. Being mangled means having
either a hairline fracture or a weeping avulsion wound.

Wound protection reduces the final injury roll by a percentage. Say our
roll is 50, and we have effectively 50% wound protection. The final roll
would be 25.

### ~~Wound Armor on Clothing~~ Reverted

~~Most clothing have had their wound armor values changed. As a loose
rule, I used the highest of melee or bomb armor, except where that value
was 100, in which case I used the lowest instead. I'm basing this
decision on how embeds are calculated, which is attack type agnostic.~~

~~Some armor have inconsistent values because they are alternative
armors to an existing armor type or are hyperspecialized armor.
Ablative, bulletproof and security vests all share a value of 35,
despite the former two not having decent melee or bomb armor.~~

~~Some clothing missing wound armor that should have had them now have
wound armor.~~

~~This may need a bit of scrutiny in case one or two seem weirdly high.
Some have maybe become too low. Its a bit hard to say.~~

### The ``bare_wound_bonus`` variable

I changed it to ``exposed_wound_bonus`` to better represent when it
applies. You can be naked and still not be affected by this bonus if the
limb has wound resistance.

## Why It's Good For The Game

I'm not promising anything with this PR, but this is an attempt to
sanity check the values on wounds so that we're not seeing what the data
that determined the removal of beheading presented. An extreme
over-representation of tier 3 wounds. ~~And, from that, maybe I can
argue for beheadings coming back. That's my goal. I think beheadings
happened so much because the numbers were in need of work.~~ Well okay I
just wanna make wounds a bit more workable actually more than I want
beheadings.

Why is it that tier 3 wounds were so over-represented? Because wounds
will often force more severe wounds of other types by merit of any
wounds existing at all on a limb. Having **_a_** wound makes you more
wound prone for any kind of wound, and not just making you more likely
to suffer a more severe type of the same wound.

The threshold mechanic was intended to simulate making a wound worse,
but oddly just made a limb broadly more prone to getting worse from any
kind of attack to such a degree that future wound rolls of different
types were often going to start at the threshold necessary to be a tier
3 wound.

Dismemberment, mind you, requires you to suffer a flesh wound while you
have a bone wound of tier 2 or higher (with tier 3 giving a bonus to
this). You can do this readily via just a sharp weapon, because having a
mangled limb causes the wound to turn into a bone wound. Technically,
this is meant to be less likely as the effective damage for this wound
is halved. But the wound bonus from having a flesh wound was almost
always significant enough to kick your new bone wound up to a tier 3.

In other words; its not surprising that you saw so many beheadings,
because the system wanted to behead you as fast as it possibly can
thanks to all these escalating values.

Wound armor was only applied as a flat reduction on the roll. The
average for wound armor was 10. After receiving a single wound, you can
expect wound rolls to reach upwards of 100, even if the actual damage
roll was not particularly high, due to wound stacking bonuses form being
wounded.

This meant that wounds, if they happened, came thick and fast after the
first, regardless of what your protection might be to wounds. It was
just a matter of getting past the initial bump.

This is why effects that forced wounds were so powerful. They basically
made a given limb more prone to taking a wound without having to deal
with the protection problem first.

Finally, this is just a broad flaw with the system that is not its
fault. It is actually a problem that isn't a problem. Most people in the
game are not wearing helmets that protect their head. So most people are
going to suffer from a higher proclivity of being wounded if people are
aiming for the head. There is this...kind of cargo cult belief that
aiming for the head means you do more damage, or can stun someone if
you're lucky or what have you. It's entirely nonsense, but it has a
grain of truth in that people rarely wear, or even have access too,
headwear that provides wound protection or any protection at all. People
have jumpsuits, which are universally wound protected, but that isn't
true of the head. Look, the point is, they're not aiming at the head
because it is usually less armored, its for other reasons but it just so
happens to become true due to wounds and how wounds roll their type.

To soften this issue, I've decided to treat wound resistance as armor
until the limb suffers a tier 3 wound. This way, hits to the head MAY
not necessarily escalate to tier 3 instantly as they would on live even
from relatively low power weapons. Some weapons have very low force, but
have extreme bare wound bonuses. This should be less likely after this
change. I doubt this will necessarily make high damage high wound
weapons like energy swords any less prone to cutting you clean open, but
it might thanks to the reduction to contributed damage to the injury
roll. The system is now _a bit more random_.

## Changelog
🆑
balance: Wounds do not make you as vulnerable to suffering wounds of all
types as before. Instead, wounds make you more vulnerable to suffering
worse versions of themselves as a priority.
balance: Wound armor is now more impactful when protecting you from
wounds when you have already been wounded.
balance: Your head and chest are more difficult to wound until they have
been mangled; either from suffering from a weeping avulsion or a
hairline fracture.
code: Changed the variable for bare_wound_bonus to exposed_wound_bonus
to better explain what that variable is doing.
/🆑

---------

Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
2025-06-19 17:49:59 +02:00
Lucy
df490306ba Add a "Count Atoms/Datums" debug verb (#91529)
## About The Pull Request

This adds a new `+DEBUG` verb, "Count Atoms/Datums". It outputs a
(sorted) json file of how many of each datum/atom typepath instances
there are. Ported from
https://github.com/Monkestation/Monkestation2.0/pull/6893

![2025-06-08
(1749414807)](https://github.com/user-attachments/assets/43f83a9a-6a69-4473-bdff-581eb8db1944)
![2025-06-08 (1749414825) ~
notepad++](https://github.com/user-attachments/assets/6b395177-7efd-445f-aebd-9cdff9f19f0f)

## Changelog
🆑
admin: Added a "Count Atoms/Datums" debug verb.
/🆑
2025-06-11 19:42:45 -06:00
Steve-Cambridge
6aaa6266cd fixes create_mob and create_turf, in line with create_object (#91518)
## About The Pull Request
As detailed in #91431, PR #91379 misplaced a few semicolons and broke
the functionality for these three admin tools. Only the object panel was
fixed, but the mob and turf panels remain broken. This fixes it, the
exact same issue was/is the problem.


## Why It's Good For The Game
Restores admin functionality that is currently missing.

## Changelog
🆑
fix: create mob and create turf both function correctly again.
/🆑
2025-06-09 16:21:03 +01:00
LemonInTheDark
c8701aa056 Mob ckey sanity check now respects insano aghost code (#91517)
## About The Pull Request

I HATE THIS PLACE DUDE, aghosting sets your ckey/key to your normal
ckey/ckey but with @ prefixed. hhhhhhhhh.
2025-06-08 15:09:54 -06:00
Ghom
14fb86e3e8 Mutation code cleanup, mutations now have sources to avoid concurrency problems. (#91346)
## About The Pull Request
This PR aims to clean or bring up to date portions of code about dna,
the dna console and mutations. This includes taking care of or removing
some of the awful choices like the pratically useless
`datum/mutation/human` pathing, or the class variable, in favor of using
sources to avoid potential issues with extraneous sources of a mutation.

The files changed are over a hundred just because I removed the
`datum/mutation/human` path, but the actual bulk of the code is mainly
shared between the datum/dna.dm, _mutations.dm and dna_console.dm.

## Why It's Good For The Game
Mutation shitcode is hurting my future plans for infusions a little.
Also it's a much needed refactor. Drafted 'till I'm sure it works
without issues.

## Changelog

🆑
refactor: Refactored mutation code backend. Report any issue.
/🆑
2025-06-08 13:57:10 +02:00
SyncIt21
a9a65bd929 Create object panel search function works again (#91431)
## About The Pull Request
Broken by #91379 all because a semicolon got misplaced

Before
![Screenshot
(463)](https://github.com/user-attachments/assets/7de12f0e-8da1-4ccf-9450-384cd66e6cb7)

After
![Screenshot
(464)](https://github.com/user-attachments/assets/6684b6a5-aa1b-4fe2-9e26-dc43b8dcba10)

And the code wasn't updated to check for this change

58cd0099d9/code/modules/admin/create_object.dm (L12)

58cd0099d9/code/modules/admin/create_object.dm (L29)

Well now it does

## Changelog
🆑
fix: create object panel for game admins works again
/🆑
2025-06-02 13:38:35 +00:00
SmArtKar
b4061f1800 [MDB IGNORE] Blood Refactor Chapter 2: Collector's Edition (#91054)
## About The Pull Request

Refactors most of blood handling code untouched by #90593 and completely
rewrites all blood decals, components and reagents.

- Blood types now have behavioral flags which allow them to control
where they leave decals/DNA/viruses. Oil no longer transfers DNA and
viruses with it, while podpeople water-blood doesn't leave visible
decals on turfs and items, but still can be picked up by DNA scanners.
- Multiple blood types have received unique handling - liquid
electricity blood now glows in the dark, oil trails are flammable and
lube ones are slippery. Oil blood can be restored with fuel, lube with
silicon and slime with stable plasma (as normal plasma already passively
regenerates their blood), instead of everything using iron. Saline
solution only supplements on iron-based blood and won't do anything to
help with bloodloss for species who rely on different blood types.
(Roundstart this applies only to Ethereals)
- All blood logic has been moved away from the blood reagent itself into
a blood element that is assigned to the blood reagent by default, and to
any reagent that's drawn from a mob as their "blood" (in
``transfer_blood_to``). This means that blood you draw from lizards will
be green and have lizard's blood description instead of mentioning red
blood cells, Ethereal "blood" will actually contain their DNA and genes,
etc.
- Refactored all blood decals. Blood states are no more, everything is
now handled via blood DNA. Credits to MrMelbert and Maplestation, as a
significant amount of code has been taken from
https://github.com/MrMelbert/MapleStationCode/pull/436 and many of his
followup PRs. Oil and xenomorph splatters are now subtypes of blood,
blood drying is now animated, blood trails now curve and can be
diagonal.
- Rewrote bloodysoles and bloody_spreader components, credits to Melbert
again for the former, while latter now makes more sense with its
interactions. Bloody soles no longer share blood DNA with your hands.
- Ported Melbert's bloody footprint sprites and bot-blood-spreading
functionality.
- Removed all species-side reagent interactions, instead they're handled
by said species' livers. (This previously included exotic blood
handling, thus the removal)
- Slightly optimized human rendering by removing inbetween overlay
holders for clothing when they're not needed.
- Blood-transmitted diseases will now get added to many more decals than
before.
- Cleaned up and partially refactored replica pods, fixed an issue where
monkeys/manipulators were unable to harvest mindless pods.
- Exotic bloodtype on species now automatically assigns their blood
reagent, without the need to assign them separately.
- Clown mobs now bleed (with colorful reagent instead of blood during
april fools), and so do vatbeasts (lizard blood)
- Implemented generic procs for handling bleeding checks, all sorts of
scanners now also correctly call your blood for what it is.
- Podpeople's guts are now lime-green like their organs, instead of
being weirdly greyish like their water-blood. (Their bleeding overlays
are still grey, as they're bleeding water)
- Slimepeople now can bleed. Their jelly is pale purple in color, but
their wound overlays copy their body color.
- Injecting/spraying/splashing/etc mob with a reagent preserves its
data, so you could theoretically recycle fine wines from someone's
bloodstream
- Fixed burdened chaplain's sect never actually giving a blessing when
applying effects, and giving a blessing when nothing can be healed.
Inverted check strikes again.

- Closes #91039 

#### Examples

A lot of blood here has dried, visually the blood colors are almost
exactly the same as before either of the blood refactors.


![dreamseeker_BSP7FE9pRB](https://github.com/user-attachments/assets/45711fa0-ae65-4ec2-9e89-753fa7dd876f)

![dreamseeker_zyv9ssh5VN](https://github.com/user-attachments/assets/7b112854-b7e3-4bfe-b78b-199a55b5b051)
2025-05-31 19:38:07 -05:00
Jeremiah
9db2f6916b Sets prettier to run on the repo (#91379)
## About The Pull Request
Prettier (an auto formatter) is set to only run within the tgui folder
currently. This removes that limitation, allowing it to automatically
format all supported files in the repo (.js, .html, .yml
[etc](https://prettier.io/docs/))

I made a few exceptions for bundled and generated files
## Why It's Good For The Game
I'm of the opinion that code should look uniform and am lazy enough to
want CTRL-S to format files without having to think beyond that
## Changelog
2025-05-29 21:23:59 -07:00
Tim
2eb1a97936 [NO_GBP] Fix map_export admin verb not blacklisting obj/effects (#91335)
Should have used `typecacheof()` instead of `typesof()` to properly
configure the blacklist.

Multi-z has `obj/effect/abstract` being applied to lots of turfs that
need to be ignored.
2025-05-29 15:22:32 -04:00
Tim
c7178bfe45 map_export admin verb can now save atmos for turfs and canisters (#91051)
## About The Pull Request
Due to the atmos complexity, this was split off from:
- #90998

This takes the atmos gas mixture from a turf and converts it into a
string for saving via the `map_export` verb. The behavior is as follows:
- Space and wall turfs atmos are skipped
- Rounds all gases to 0.01 decimal for their individual mole value
- Any gases less than 0.01 moles get skipped

This does not keep track of active fires since those have hotspots,
active turfs, etc., which is way more complicated to save. Another
caveat is the amount of characters the map reader needs to write is much
larger since every turf (besides space/walls) will have different atmos
due to mobs breathing, airlocks opening, etc. so I made this setting
into a `SAVE_ATMOS` flag that you can apply when saving.

This also keeps track of air inside of canisters.

## Why It's Good For The Game
Atmospherics changes to the station can now be saved properly. 

## Changelog
🆑
qol: `map_export` admin verb can now save atmos for turfs and air
canisters
/🆑
2025-05-26 13:32:11 +00:00