Compare commits

...
Author SHA1 Message Date
Tobias Berger 414be58480 Remove piping automation since I could not manage to port that easily 2026-06-03 23:38:35 +02:00
Tobias Berger 36ee8429c5 Fix cherrypick mistakes 2026-06-03 21:52:36 +02:00
Ilya246 eaa5cfec1f ok
Co-authored-by: LaCumbiaDelCoronavirus <90893484+LaCumbiaDelCoronavirus@users.noreply.github.com>
(cherry picked from commit b55c30497f4e22873b5fab6319d148ee885e72fe)
2026-06-03 21:33:35 +02:00
Ilya246 1b4e3dc602 unmodify upstream
(cherry picked from commit 0275bc6542dbcd13af6ee9db2f5d0db174d23b84)
2026-06-03 21:33:35 +02:00
Ilya246 368918d46a more
(cherry picked from commit c033e516f20478efd8509eac6ee15930a5d473e8)
2026-06-03 21:32:01 +02:00
Ilya246 04efdf82f6 ops
(cherry picked from commit 5a925c0f1bf8db999728ceaeba458f0c81f128e4)
2026-06-03 21:30:38 +02:00
deltanedas ac50abeab8 make lathes automatable
(cherry picked from commit 3767aba3a1036db46acc9bd1087c4497dbe53a7a)
2026-06-03 21:10:52 +02:00
Roudenn c9dbb1c9a1 Everything comes with built-in automation
(cherry picked from commit 42c2e0fc62aa00bbe64e28e2dc53f4d038164435)
2026-06-03 21:07:16 +02:00
Delta-V bot d6230dfaa9 Automatic changelog update 2026-06-02 17:17:04 +02:00
VelcroboyandVelcroboy 1613a75eba Map Edits: Jug Hotfix (#5944)
Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-06-02 15:16:38 +00:00
DisposableCrewmember42andKara 206b7d0ddb cherry-pick: Fix deny/emag animation (EphemeralSpace/ephemeral-space#181) (#5950)
Fix deny/emag animation (EphemeralSpace/ephemeral-space#181)

Co-signed-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>

Co-authored-by: Kara <mirrorcult@pm.me>
2026-06-02 09:48:10 -04:00
Delta-V bot 005165b6f8 Automatic changelog update 2026-06-02 05:24:30 +02:00
Halo3moth bc96c7baec Sec coat microbalancing (#5939)
micro adjustments inbound
2026-06-01 23:24:10 -04:00
Delta-V bot cd765f34a7 Automatic changelog update 2026-06-01 16:11:59 +02:00
a8c721fbb1 Bluesec - day 0 fixes (#5936)
* Day 0 fixes

Fixes cyborgs, cadet beret, adds grey beret, fixes descriptions, fixes spriting errors in jumpsuits/skirts, makes airlocks slightly brighter (same brightness as the non-glass ones)

* thecoat

total red coat death

* update longcoat descriptions

2 word fix

* 2 pixel sprite updates

* the barriering

barriers, but blue

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* update security radio color

brightens the security radio channel in hopes of making it more readable

* small revert

* Update Resources/Textures/_DV/Objects/Specific/Security/barrier.rsi/meta.json

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: DarkenedSynergy <70016079+DarkenedSynergy@users.noreply.github.com>

---------

Signed-off-by: DarkenedSynergy <70016079+DarkenedSynergy@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-06-01 14:11:38 +00:00
Delta-V bot a97a42701e Automatic changelog update 2026-05-31 22:39:20 +02:00
e8287ada86 Mantis Rework Pt. 1 (#5757)
* this works suspiciously well but also it's not actually that much

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* conflict stuff

* and put the tags back in

* halve glimmer created by psionics and alter the knife a bit

* finally add the guidebook. hopefully this passes tests when I take it off a draft

* fix yaml stuff hopefully

* fix merge conflict stuff

* and put my stuff back

* more merge conflicts aaaaaaaa

* dying

* put implants back in

* c# it up

* Apply suggestions from code review

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

* fix some stuff and add mindbreaker to the guidebook

* make audio stuff mono

* aaaaaaaa

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Janet Blackquill <uhhadd@gmail.com>
2026-05-31 20:39:00 +00:00
Delta-V bot 69f62ca86b Automatic changelog update 2026-05-31 21:29:13 +02:00
Field Command 44f7d66b09 Update to Pebble (#5847) 2026-05-31 15:28:53 -04:00
Delta-V bot 3cec2d61df Automatic changelog update 2026-05-31 18:45:37 +02:00
Sir Warock a61a09b3d9 Reduce JugSuits Stamina Resistance (#5893)
YML warrior
2026-05-31 18:45:17 +02:00
KOTOB 0eca06ccdf RandomHumanoidApperance keep gender parameter (#5932)
gender AND sex? #notverywokeofyou
2026-05-31 16:25:29 +02:00
Delta-V bot 9db24b3f4c Automatic changelog update 2026-05-31 07:25:54 +02:00
Theo 7292a14490 fix ecrossbow despawn (#5931)
whoopsie
2026-05-31 05:25:34 +00:00
github-actions[bot]andDeltaV-Bot 5425432338 Update Credits (#5930)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-05-31 04:51:23 +02:00
d8f38bcc93 Security resprite - blue (#5626)
* Sprites/yaml episode 1

Most of the recolouring of outfits, lockers, doors and adding of new sprites is all done in this one commit

* Squashed commit of the following:

commit cd77b5d86f
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Thu Mar 12 12:24:05 2026 +0100

    Automatic changelog update

commit 373f6ae62d
Author: Stxcking <217132821+Stxcking@users.noreply.github.com>
Date:   Thu Mar 12 07:23:45 2026 -0400

    More Gun Safe Sprite: Salvage + Plain (#5512)

    * everything I could think of

    - added sprites
    - tweaked the ID of existing safes by adding security to them
    - lowercase the name to match with other entities
    - added gun to upstream safe names so I can find it easier in the entity panel

    * name changes

    to match our naming scheme and to not have multiple gun safes name gun safe

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * lowercase s

    It's 3am

    ---------

    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

commit d6c185f484
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Thu Mar 12 05:03:25 2026 +0100

    Automatic changelog update

commit 14ab2cb60b
Author: Coryn <coryler@gmail.com>
Date:   Thu Mar 12 05:03:04 2026 +0100

    Remove Doubling Uranium Window Material (#5470)

commit 2f5ee005c4
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Wed Mar 11 01:14:57 2026 +0100

    Automatic changelog update

commit 35554b0c3c
Author: Theo <tad3@illinois.edu>
Date:   Tue Mar 10 19:14:36 2026 -0500

    jugsuit stamres and buy limit (#5462)

    * reduce jugsuit ranged stam res to 50%, limit to only 1 purchase per uplink, limit to only commander and lone op uplink

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * fix comment

    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    ---------

    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
    Co-authored-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

commit 0b1cac7a84
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Wed Mar 11 00:34:54 2026 +0100

    Automatic changelog update

commit 4ae1393c7a
Author: ConstantlyConfused <67894661+Eternally-Confused@users.noreply.github.com>
Date:   Tue Mar 10 19:34:35 2026 -0400

    Make interdyne herbals not provide omnizine when grounded (#5493)

    Make grinding interdyne herbals not provide omni

commit 663505f12f
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Mar 10 17:30:01 2026 +0100

    Automatic changelog update

commit 15cd42e746
Author: snowywinters <134970424+snowywinters@users.noreply.github.com>
Date:   Tue Mar 10 10:29:41 2026 -0600

    Asterisk arrivals (#5497)

    Arrivals

commit a4318642f4
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Mar 10 04:45:24 2026 +0100

    Automatic changelog update

commit 6d0390d3ce
Author: Solaris <63768197+Solaris7518@users.noreply.github.com>
Date:   Mon Mar 9 22:45:05 2026 -0500

    Minor sec sprite changes and new security mask. (#5426)

    * New secmask sprites

    * secmask spriting changes again

    * Update equipped-MASK.png

    * Why the fuck do all of our races have differing face shapes 😭

    * Too lazy to add an actual removed mask sprite so i just made it so that it removes the filters like with the explorer mask

    * Increased mask size for secmask due to it being simiar size to explorer mask.

    * "High quality" icon of updated sprite

    * secmask inhand sprites changed

    * New secmask description

    * Making the mask its own thing.

    * a

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * Do not question my methods.

    * Update meta.json

    * renaming...

    * screams

    * had to fix this.

    * h

    * ITS CRAFTABLE MOTHERFUCEKRS, YEAAAA!!!!

    * Made the other one craftable too.

    * you know how it is...

    * a

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * im finna lose my shit if i had to do more to fix this not showing up in lathes

    * sprite updates and gas mask size change

    * Update inhand-right.png

    * more sprite changes

    * d

    * HOLY SHIT FINALLY FIXED IT

    * made sprites look slightly better, also now looks like it fits properly with new sec mask equipped.

    * screams

    * screams 2

    * Im finna cry if any of these sprites break

    * test fail fix

    * i fucking hate test fails

    * requested changes

    * changes 2

    * changes 3

    * all done i think

    * 1984

    ---------

    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

commit 2ac4aa418a
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Mar 10 04:44:48 2026 +0100

    Automatic changelog update

commit 1a8060330d
Author: DisposableCrewmember42 <disposablecrewmember42@proton.me>
Date:   Tue Mar 10 03:44:29 2026 +0000

    tweak: minor Conspiracy tweaks (#5499)

    * tweak: add glimmerventscheduler to conspiracy

    * tweak: conspirators should ahelp custom objective

    * tweak: tack onto guidebook addition

commit 133f311a24
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Mar 10 00:05:24 2026 +0100

    Automatic changelog update

commit 8e9f8d015c
Author: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Date:   Mon Mar 9 18:05:04 2026 -0500

    Fix Smile Recipe/Add Research Log (#5482)

    * Fix Smile Recipe/Add Research Log

    * added "slime"

    * Ahh, I see

    * typo fix

    ---------

    Co-authored-by: Velcroboy <velcroboy333@hotmail.com>

commit d328c7a448
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 23:24:28 2026 +0100

    Automatic changelog update

commit 76e1cab5a4
Author: Coryn <coryler@gmail.com>
Date:   Mon Mar 9 23:24:09 2026 +0100

    Add Plant-Box Toggleable Magnetism (#5467)

commit b06f761ee6
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 23:10:19 2026 +0100

    Automatic changelog update

commit 62dfd5c26b
Author: keekee38 <iamabanana372456@gmail.com>
Date:   Mon Mar 9 18:10:00 2026 -0400

    readding the elite suit to the uplink (#5459)

    * need more will think 4 more

    * yay back in catalog,,,

    * me when i forget to branch from master xd

    * oopsie daisy im not smart and also tired

    Signed-off-by: keekee38 <iamabanana372456@gmail.com>

    * undid jug stuff

    * fix comments

    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    * comment fix 2

    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    ---------

    Signed-off-by: keekee38 <iamabanana372456@gmail.com>
    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
    Co-authored-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

commit 73523baf45
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 22:58:37 2026 +0100

    Automatic changelog update

commit f695a8ffe6
Author: snowywinters <134970424+snowywinters@users.noreply.github.com>
Date:   Mon Mar 9 15:58:18 2026 -0600

    AmmoFab (#5476)

    * Ammo

    * test

    * Ammofab last one

commit 769cacc04a
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 20:36:26 2026 +0100

    Automatic changelog update

commit 28fe58435f
Author: DisposableCrewmember42 <disposablecrewmember42@proton.me>
Date:   Mon Mar 9 19:36:06 2026 +0000

    feat: people who turn off panicbunker can turn it back on (#5484)

    * feat: people who turn off panicbunker can turn it back on

    * docs: move patch comment

commit 96a1700b8c
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 15:28:02 2026 +0100

    Automatic changelog update

commit 7759b69984
Author: Vape <76235372+Vapetastic-Gaming@users.noreply.github.com>
Date:   Mon Mar 9 10:27:41 2026 -0400

    Glacier Rework (#4713)

    * Finalizing with Merge conflicts

    * Final updates

    * FIXES: Medical, Doors, Lights

    * Significant Changes

    Medical Reworked again, Atmospherics is up to par with standards, Removed the automated atmos system, its now with what other maps have.
    Medical courtyard is fixed, and is now a hallway, while retaining the courtyard. Medical feung shway has been retained
    Found a couple of passive vents, removed em

    * Slight changes, fixes the fail

    * Fixes, Changes, Pending review

    * UPDATE, I FORGOT ONE LV CABLE

    * Minor changes and fixes

commit 6596031139
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 14:40:32 2026 +0100

    Automatic changelog update

commit 8357533ccf
Author: jimbobby-the-FUCKING-first <Dcmontgomery123@gmail.com>
Date:   Mon Mar 9 09:40:13 2026 -0400

    Forged Sawn Off Shotgun (#5120)

    * Add files via upload

    i dont know what im doing but this seems legit

    Signed-off-by: jimbobby-the-FUCKING-first <Dcmontgomery123@gmail.com>

    * Update shotguns.yml

    adds the forged sawn off yaml

    Signed-off-by: jimbobby-the-FUCKING-first <Dcmontgomery123@gmail.com>

    * Update shotguns.yml

    makes the forged saw-able

    Signed-off-by: jimbobby-the-FUCKING-first <Dcmontgomery123@gmail.com>

    * Add files via upload

    makes the forged gun saw-able even more

    Signed-off-by: jimbobby-the-FUCKING-first <Dcmontgomery123@gmail.com>

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * Update meta.json

    put that , there

    Signed-off-by: jimbobby-the-FUCKING-first <Dcmontgomery123@gmail.com>

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * fix filepath oopsie

    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    ---------

    Signed-off-by: jimbobby-the-FUCKING-first <Dcmontgomery123@gmail.com>
    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
    Co-authored-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

commit ea944f1889
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 14:32:24 2026 +0100

    Automatic changelog update

commit 792aeb97bd
Author: verybigman <171044200+verybigman311@users.noreply.github.com>
Date:   Mon Mar 9 09:32:05 2026 -0400

    Shock Collars Fix (#5332)

    * lalala

    * changed access reader for both

    * tada

commit 39b9b6b179
Author: Theo <tad3@illinois.edu>
Date:   Mon Mar 9 08:31:50 2026 -0500

    Wrenchcrowbar fix (#5388)

    * add anchoring behavior to multipletool comp

    * fixed crowbar state name and wrenching filepath to be real and not guesses

    * Update Resources/Prototypes/_Starlight/Entities/Objects/Tools/tools.yml

    Moving comment

    Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
    Signed-off-by: Theo <tad3@illinois.edu>

    * Update Resources/Prototypes/_Starlight/Entities/Objects/Tools/tools.yml

    Move comment

    Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
    Signed-off-by: Theo <tad3@illinois.edu>

    * fix comments

    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    * fix improper sprite usage

    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    ---------

    Signed-off-by: Theo <tad3@illinois.edu>
    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
    Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
    Co-authored-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

commit 27eea1f08d
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 12:49:17 2026 +0100

    Automatic changelog update

commit 3ee42c048e
Author: Stxcking <217132821+Stxcking@users.noreply.github.com>
Date:   Mon Mar 9 07:48:58 2026 -0400

    Added a New Ruin: Abandoned Dojo (#5427)

    added grid and one line of yaml

commit b0d7578419
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 12:39:54 2026 +0100

    Automatic changelog update

commit e6aad0c2b5
Author: DisposableCrewmember42 <disposablecrewmember42@proton.me>
Date:   Mon Mar 9 11:39:35 2026 +0000

    fix: make sure there isn't a solo conspirator (#5490)

    * fix: add minTotalPlayers to conspirators gamerule, increase delay

    * tweak: remove unnecessary minPlayers attribute

    * tweak: set minplayers to 15

    * tweak: i'll just use cult values

commit 914ea8e65f
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 11:55:28 2026 +0100

    Automatic changelog update

commit a0e1678727
Author: Woljif <243318409+Woljif@users.noreply.github.com>
Date:   Mon Mar 9 06:55:08 2026 -0400

    Change shotgun storage (#5469)

    * Change Kammerer shape to 2x4.

    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    ---------

    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
    Co-authored-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

commit d1fd332dff
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 11:18:09 2026 +0100

    Automatic changelog update

commit e83fabe577
Author: snowywinters <134970424+snowywinters@users.noreply.github.com>
Date:   Mon Mar 9 04:17:49 2026 -0600

    Watchdogs  (#5475)

commit de4c36b4a9
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 10:43:45 2026 +0100

    Automatic changelog update

commit e09c0d998d
Author: HameyTychol <jhammett3229@gmail.com>
Date:   Mon Mar 9 05:43:25 2026 -0400

    Made 4 items recyclable (#5398)

    * Made 4 items recyclable

    Co-authored-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
    Signed-off-by: HameyTychol <jhammett3229@gmail.com>

    ---------

    Signed-off-by: HameyTychol <jhammett3229@gmail.com>
    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
    Co-authored-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

commit af65b0b48f
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 9 10:12:48 2026 +0100

    Automatic changelog update

commit 1967b3063f
Merge: e08134124b 04eaf652f6
Author: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
Date:   Mon Mar 9 20:12:29 2026 +1100

    Merge pull request #5471 from Coryler/universal-pinpointer-ops

    Add Universal Pinpointer to Uplink

commit e08134124b
Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Date:   Sun Mar 8 02:30:55 2026 +0100

    Update Credits (#5483)

    Co-authored-by: DeltaV-Bot <github@deltav.gay>

commit 522a407fc5
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Mar 7 21:35:38 2026 +0100

    Automatic changelog update

commit 0f3376e409
Author: Cepelinas1 <kakelis01@gmail.com>
Date:   Sat Mar 7 22:35:19 2026 +0200

    Make Internal Affairs rollable (#5450)

    * first

    * station event rule, random objectives but error with giving antag status

    * cleanup

    * had a stroke and i think i did the event correctly

    * small unfuckery

    * listen to cc better wording

    * guidebook added

    * somehow duplicated the entirety of events.yml

    * what they asked of me was implemented...

commit 0f467ffeb1
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Mar 7 17:24:44 2026 +0100

    Automatic changelog update

commit 65f06c4901
Author: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
Date:   Sun Mar 8 03:24:25 2026 +1100

    pr spam 3: Kitchen freezer (#5443)

    * adminbelt changes

    * fuck me

    * kitchen freezer

    * freezer machine board

commit 57b995e221
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Mar 7 10:45:41 2026 +0100

    Automatic changelog update

commit ad33cb0ed1
Author: marigauge <thesaiyandude3@gmail.com>
Date:   Sat Mar 7 09:45:22 2026 +0000

    Revert "Revert Soretizone buff (#5307)" but not the agono numbness (#5391)

    Revert "Revert Soretizone buff (#5307)"

    This reverts commit a594aba646.

    Update medicine.yml

commit 340eab226c
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Fri Mar 6 17:21:12 2026 +0100

    Automatic changelog update

commit df06bfd844
Author: Tobias Berger <toby@tobot.dev>
Date:   Fri Mar 6 17:20:22 2026 +0100

    Add missing changelog

commit 47ea823edd
Author: BarryNorfolk <barrynorfolkman@protonmail.com>
Date:   Fri Mar 6 17:10:25 2026 +0100

    Ipc/fix battery alert (#5345)

    * Move SiliconChargeSystem to shared under _DV namespace

    * Remove SiliconHeatEffects

    * Fixup system to match _DV and shared

    * Update usages of other systems

    * Move CVar to server/replicated

    * Remove unused systems

commit ae8bfec6cb
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Fri Mar 6 16:36:54 2026 +0100

    Automatic changelog update

commit 97c31b8bb3
Author: Astra <226853568+EmberAstra@users.noreply.github.com>
Date:   Fri Mar 6 16:36:33 2026 +0100

    Power Digi-Board (#5435)

    * Add CE's power digi-board

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    ---------

    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

commit 13fd8053e4
Author: Astra <226853568+EmberAstra@users.noreply.github.com>
Date:   Fri Mar 6 16:23:12 2026 +0100

    Update Research Digi-Board Sprite Copyright (#5478)

    update meta

commit 8ca0dd8ee8
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Thu Mar 5 22:19:11 2026 +0100

    Automatic changelog update

commit 5654d8b22d
Author: Stxcking <217132821+Stxcking@users.noreply.github.com>
Date:   Thu Mar 5 16:18:51 2026 -0500

    New Mailbox Sprite ! (#5433)

    * Nuked Nyano's and added new !

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * Whooops...

    Corrected the slashes and removed the scaling

    * tweak sprite

     ( I can't do a PR without a million commits) The outline make this looks better after looking at it in game

    ---------

    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

commit 4fb1e99746
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Thu Mar 5 22:17:56 2026 +0100

    Automatic changelog update

commit ffd8a41aa1
Author: Astra <226853568+EmberAstra@users.noreply.github.com>
Date:   Thu Mar 5 22:17:36 2026 +0100

    Small Research Digi-Board Fix (#5434)

    * Fix research digi-bord storage.

    * Fix the sprite too why not

    * Also fix the paper for the inhand sprites whoops

commit 73b3daf7bc
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Thu Mar 5 21:46:33 2026 +0100

    Automatic changelog update

commit cf3ceff0e3
Author: Woljif <243318409+Woljif@users.noreply.github.com>
Date:   Thu Mar 5 15:46:13 2026 -0500

    Increased sec jetpacks from 1.5L to 3.0L and removed ability to go on… (#5357)

    * Increased sec jetpacks from 1.5L to 3.0L and removed ability to go on belt (no longer a mini jetpack clone)

    * Fixed some comments, added overrides.ftl, and also added the GasTank component to the empty sec jetpack so they wouldnt inherit the base jetpack's 5L capacity and be larger than their filled counterparts

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    ---------

    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

commit 6a0610f4d6
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Thu Mar 5 02:33:03 2026 +0100

    Automatic changelog update

commit d93fd29046
Author: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>
Date:   Wed Mar 4 20:32:43 2026 -0500

    Elegance Engineering Crates Hotfix (#5468)

    * Update elegance.yml

    * Update elegance.yml

    * Update elegance.yml

commit 7d3f15b8d8
Author: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
Date:   Wed Mar 4 15:54:34 2026 +1100

    fix missing exception on lavaland ruin (#5472)

commit 04eaf652f6
Author: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date:   Wed Mar 4 02:58:01 2026 +0000

    [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

commit cdfa5457f9
Author: Coryler <coryler@gmail.com>
Date:   Wed Mar 4 03:28:58 2026 +0100

    Add Universal Pinpointer to Uplink

commit 9cb5c83c67
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Wed Mar 4 02:23:40 2026 +0100

    Automatic changelog update

commit 6749a5fd8d
Author: SirrRequiem <webrules11@yahoo.com>
Date:   Tue Mar 3 20:23:20 2026 -0500

    Terra Hotfix 4 - It's Alive! (#5432)

    * Terra Hotfix 4 - It's Alive!

    * Removed all bombing targets from warp points

    * Renamed Vault substatin, extended cargo dock, added AI restore to AI Sat, changed arrivals screen

commit 771b9e59ba
Author: Colin-Tel <113523727+Colin-Tel@users.noreply.github.com>
Date:   Tue Mar 3 11:57:45 2026 -0600

    Update division.yml (#5465)

commit bdb08d0e58
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Mar 3 07:16:54 2026 +0100

    Automatic changelog update

commit f90ba817c1
Author: turtlemutt <wolfybriggan575@gmail.com>
Date:   Mon Mar 2 22:16:35 2026 -0800

    Lighthouse Arrivals (#5419)

    * Update lighthouse.yml

    * Update lighthouse.yml

    * Update lighthouse.yml

    * Update lighthouse.yml

    * Update lighthouse.yml

commit 7912b39117
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Mar 3 05:32:58 2026 +0100

    Automatic changelog update

commit 7d0c7a0feb
Author: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Date:   Mon Mar 2 22:32:38 2026 -0600

    Map Edits: Evac Shuttles (#5457)

    Co-authored-by: Velcroboy <velcroboy333@hotmail.com>

commit 70685a0cf9
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Mar 3 04:16:25 2026 +0100

    Automatic changelog update

commit 0fdf1a3a66
Author: Vape <76235372+Vapetastic-Gaming@users.noreply.github.com>
Date:   Mon Mar 2 22:16:05 2026 -0500

    Submarine Fixes (#5394)

    MASS UPDATE

commit 0976ef3fa2
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 2 20:44:18 2026 +0100

    Automatic changelog update

commit 5c60e7c1ca
Author: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Date:   Mon Mar 2 13:43:58 2026 -0600

    Map Edits: Tortuga (#5437)

    * Map Edits: Tortuga

    * Additional changes

    * Passive vents

    * oh yeah

    * review fixes

    ---------

    Co-authored-by: Velcroboy <velcroboy333@hotmail.com>

commit 7f1bd2c404
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 2 20:36:49 2026 +0100

    Automatic changelog update

commit d2ed0f9296
Author: Halo3moth <mdavid.wininger@gmail.com>
Date:   Mon Mar 2 13:36:29 2026 -0600

    Hos Aura Buff (#5425)

    * that should do it

    * copyright update

    * more work done

    * Rename Icon.png to icon.png

    Signed-off-by: Halo3moth <mdavid.wininger@gmail.com>

    ---------

    Signed-off-by: Halo3moth <mdavid.wininger@gmail.com>

commit 365c613e11
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 2 19:17:50 2026 +0100

    Automatic changelog update

commit da249fc21e
Author: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
Date:   Tue Mar 3 05:17:30 2026 +1100

    Port over Funky's unary pipe layers (#5372)

    * port over funkies unary layers and put them under _funky namespace

    * fix construction thingies having names that cause yaml linter to fail

    * why does yamllinter not show errors on my machine

    * Apply suggestions from code review

    Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

    * addd attributions

    Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    * add attributions 2

    Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    * add attributions 3

    Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>

    * Update Resources/Prototypes/_Funkystation/Entities/Structures/Piping/Atmospherics/alt_layers.yml

    Signed-off-by: BarryNorfolk <barrynorfolkman@protonmail.com>

    ---------

    Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
    Signed-off-by: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
    Signed-off-by: BarryNorfolk <barrynorfolkman@protonmail.com>
    Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
    Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>

commit 6e36d635c3
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Mon Mar 2 18:48:45 2026 +0100

    Automatic changelog update

commit 881ef622e8
Author: pootslap <211648338+pootslap@users.noreply.github.com>
Date:   Mon Mar 2 17:48:25 2026 +0000

    Minor Rat King Tweaks (#5326)

    * baby rat king tweaks

    * requested changes

commit 26d72f8d31
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sun Mar 1 20:48:16 2026 +0100

    Automatic changelog update

commit c280e69b13
Author: Stxcking <217132821+Stxcking@users.noreply.github.com>
Date:   Sun Mar 1 14:47:57 2026 -0500

    Tweak the Health Analyzer Triage System  (#5110)

    * guh

    * applied suggestions + made medical access only

commit 70a3f830a8
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sun Mar 1 15:13:18 2026 +0100

    Automatic changelog update

commit d73fbae4b4
Author: Theo <rebe83a@gmail.com>
Date:   Sun Mar 1 08:12:58 2026 -0600

    add blacklist to cigpackbase for chems (#5402)

    * add blacklist to cigpackbase for bottle and vial

    * hold up i forgot half the shit

commit 842c7c2e40
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sun Mar 1 14:38:37 2026 +0100

    Automatic changelog update

commit a33036a30d
Author: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Date:   Sun Mar 1 07:38:18 2026 -0600

    Enable wizard's teleport scroll and wizard's den map (#5215)

    * Enable wizard's teleport scroll and wizard's den map

    * mapPath

    * longer cable in cave

    ---------

    Co-authored-by: Velcroboy <velcroboy333@hotmail.com>

commit 0e58c784b1
Author: Theo <rebe83a@gmail.com>
Date:   Sun Mar 1 06:56:50 2026 -0600

    Remove ballistic reflect from energy swords (#5429)

    * reduce reflect chance on ninja and cult swords  Energy weapons by default now only reflect energy projectiles

    * Revert "reduce reflect chance on ninja and cult swords  Energy weapons by default now only reflect energy projectiles"

    This reverts commit 444d9a4921.

    * Energy swords only reflect energy shots

commit eee6c70025
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sun Mar 1 12:19:02 2026 +0100

    Automatic changelog update

commit 7ef5a51c4a
Author: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
Date:   Sun Mar 1 22:18:42 2026 +1100

    move bluekies to DV namespace (#5414)

    * move bluekies to DV namespace

    * FIX FAIL

    * fix harpy paramed suit

commit 522cb17266
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sun Mar 1 09:56:59 2026 +0100

    Automatic changelog update

commit 1fe0c0bb5e
Author: snowywinters <134970424+snowywinters@users.noreply.github.com>
Date:   Sun Mar 1 01:56:39 2026 -0700

    Edge fix (#5439)

    * Edge

    * Edge Part two

    * Edge final

commit d26e8e018b
Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Date:   Sun Mar 1 02:49:42 2026 +0100

    Update Credits (#5453)

    Co-authored-by: DeltaV-Bot <github@deltav.gay>

commit ed084e91fb
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Feb 28 21:43:04 2026 +0100

    Automatic changelog update

commit d0733b7ebb
Author: Stxcking <217132821+Stxcking@users.noreply.github.com>
Date:   Sat Feb 28 15:42:44 2026 -0500

    Borg Crew Monitor Fixes (#5342)

    * Update handheld_crew_monitor.yml

    * suggested clarity

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    ---------

    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

commit 92d4563535
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Feb 28 21:06:27 2026 +0100

    Automatic changelog update

commit e969f172b1
Author: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
Date:   Sun Mar 1 07:06:08 2026 +1100

    Add cloth wraps (#5335)

    add cloth wraps

commit df8a041914
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Feb 28 19:14:11 2026 +0100

    Automatic changelog update

commit 12ceb006cd
Author: wesker <53323309+weskified@users.noreply.github.com>
Date:   Sun Mar 1 02:13:51 2026 +0800

    Add new Lobby and Jukebox music by Darklyac (#5424)

    * darkylac muisic real

    * the time

commit aa1dac2263
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Feb 28 15:23:32 2026 +0100

    Automatic changelog update

commit ceff7be9a4
Author: Cepelinas1 <kakelis01@gmail.com>
Date:   Sat Feb 28 16:23:13 2026 +0200

    Let Engineering choose their starter suit (#5317)

    * test

    * a lot of stuff

    * Changed voidsuit speed to 15%. Added a locker variant to just have the hardsuit, with a shitty id

    * test re-run

    * deltaV addition comments

    * goob copyright (just in case bro, don't sue us)

commit 23f866e069
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Feb 28 13:32:18 2026 +0100

    Automatic changelog update

commit 459b706338
Author: Madison Rye Progress <makyo@drab-makyo.com>
Date:   Sat Feb 28 04:31:59 2026 -0800

    fix: (re)remove forced accents (#5343)

    fix: (re)remove clothing/item/role-forced accents

commit 44d3e8ec9c
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Feb 28 11:26:56 2026 +0100

    Automatic changelog update

commit 55ca946fd4
Author: AeraAulin <133451603+AeraAuling@users.noreply.github.com>
Date:   Sat Feb 28 02:26:37 2026 -0800

    PKA fixes try 2 (#5311)

    * easier to just redo the PR rather then fix the old one

    * remove comment

    Co-authored-by: Tobias Berger <toby@tobot.dev>
    Signed-off-by: AeraAulin <133451603+AeraAuling@users.noreply.github.com>

    ---------

    Signed-off-by: AeraAulin <133451603+AeraAuling@users.noreply.github.com>
    Co-authored-by: Tobias Berger <toby@tobot.dev>

commit efcd7626a7
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Feb 28 11:08:01 2026 +0100

    Automatic changelog update

commit 3f9f656db2
Author: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Date:   Sat Feb 28 04:07:41 2026 -0600

    Map Edits: Arena (#5445)

    * Map Edits: Arena

    * AI router

    ---------

    Co-authored-by: Velcroboy <velcroboy333@hotmail.com>

commit 1215bb7174
Author: Field Command <159087063+FieldCommand@users.noreply.github.com>
Date:   Sat Feb 28 10:04:42 2026 +0100

    Reclaimer MK2 hotfix (#5440)

    Fixes #5428

commit ab06084f55
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Feb 28 10:00:40 2026 +0100

    Automatic changelog update

commit f084c8af45
Author: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Date:   Sat Feb 28 03:00:21 2026 -0600

    Map Edits: The Hive (#5438)

    Co-authored-by: Velcroboy <velcroboy333@hotmail.com>

commit 5fa64b44da
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Sat Feb 28 09:50:44 2026 +0100

    Automatic changelog update

commit f3ef2cf2a7
Author: verybigman <171044200+verybigman311@users.noreply.github.com>
Date:   Sat Feb 28 03:50:25 2026 -0500

    Crusher Right Click Wideswing (#5327)

    commit

commit 26f9f37a47
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Fri Feb 27 23:35:33 2026 +0100

    Automatic changelog update

commit df197c802b
Author: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>
Date:   Fri Feb 27 17:35:13 2026 -0500

    Elegance Update Number I Lost Track (#5387)

    * Update elegance.yml

    * holy shit is that kris deltarune

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * dghjdsgjkdfs

    * that one random brick decal under the window:

    * stuff

    * Kill that line

    Signed-off-by: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>

    * Kill that line 2 but it's actually redoing them

    Signed-off-by: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>

    ---------

    Signed-off-by: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>
    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

commit 50f40d88bf
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Fri Feb 27 19:55:43 2026 +0100

    Automatic changelog update

commit 2ede3783bc
Author: KOTOB <59124164+kotobdev@users.noreply.github.com>
Date:   Fri Feb 27 10:55:23 2026 -0800

    Free Suit Storage (#5300)

    what fun

commit 36a2b92b15
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Fri Feb 27 19:31:15 2026 +0100

    Automatic changelog update

commit 22b3945a86
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Fri Feb 27 18:30:55 2026 +0000

    Slavic Accent character trait (#5264)

    * port slavic accent

    * change some replacements

    * bobr

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * eliminate redundant regex

    * bozhe moy

    * order matters

    * Merge branch 'master' into slavicAccent

    Signed-off-by: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * Apply suggestions from code review

    Co-authored-by: Tobias Berger <toby@tobot.dev>
    Signed-off-by: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>

    * Update Content.Server/_DV/Speech/EntitySystems/SlavicAccentSystem.cs

    Co-authored-by: BarryNorfolk <barrynorfolkman@protonmail.com>
    Signed-off-by: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>

    * tryfix

    * Merge branch 'slavicAccent' of https://github.com/zelezniciar1/Delta-v into slavicAccent

commit c4d8441791
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Fri Feb 27 19:25:04 2026 +0100

    Automatic changelog update

commit a3ba35b5a7
Author: DisposableCrewmember42 <disposablecrewmember42@proton.me>
Date:   Fri Feb 27 18:24:43 2026 +0000

    Merge pull request #5218 from DisposableCrewmember42/conspirator-port

    feat: add Conspirators from Harmony

commit ca39571295
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Fri Feb 27 02:31:24 2026 +0100

    Automatic changelog update

commit 334a6b2423
Author: Pharaz4 <143268074+Pharaz4@users.noreply.github.com>
Date:   Fri Feb 27 12:31:05 2026 +1100

    infested frigate ruin fix (#5431)

commit 0899748d43
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Thu Feb 26 21:01:08 2026 +0100

    Automatic changelog update

commit c5110d8ec1
Merge: df3ec49d84 5604de9165
Author: BarryNorfolk <barrynorfolkman@protonmail.com>
Date:   Thu Feb 26 21:00:49 2026 +0100

    Merge pull request #4548 from AeraAuling/tailstuff

    fix the tails

commit df3ec49d84
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Thu Feb 26 08:29:33 2026 +0100

    Automatic changelog update

commit 66fd5c169c
Merge: c48275b131 7940c9a95c
Author: BarryNorfolk <barrynorfolkman@protonmail.com>
Date:   Thu Feb 26 08:29:13 2026 +0100

    Merge pull request #5277 from zelezniciar1/engitape

    Engineering Tape

commit c48275b131
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Wed Feb 25 23:43:08 2026 +0100

    Automatic changelog update

commit 97fcfbf19d
Author: Stxcking <217132821+Stxcking@users.noreply.github.com>
Date:   Wed Feb 25 17:42:48 2026 -0500

    New Gun Safe Sprites (#5314)

commit 35d159c3cc
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Wed Feb 25 21:36:00 2026 +0100

    Automatic changelog update

commit 7f515f4c68
Merge: 9ad43b1944 6eb9eb5d1e
Author: BarryNorfolk <barrynorfolkman@protonmail.com>
Date:   Wed Feb 25 21:35:40 2026 +0100

    Merge pull request #5282 from zelezniciar1/engiSOP

    Engineering SOP

commit 9ad43b1944
Author: keekee38 <iamabanana372456@gmail.com>
Date:   Wed Feb 25 13:29:44 2026 -0500

    removing machine pistol mag compatability for the viper and pollock and fixing practice mags (#5296)

    * sighs

    * :3 oopsie daisy,,,,,

    * adding the thingy

    Signed-off-by: keekee38 <iamabanana372456@gmail.com>

    * Fix comment

    Signed-off-by: Stop-Signs <stopsign221@gmail.com>

    ---------

    Signed-off-by: keekee38 <iamabanana372456@gmail.com>
    Signed-off-by: Stop-Signs <stopsign221@gmail.com>
    Co-authored-by: Stop-Signs <stopsign221@gmail.com>

commit 2b4505a5fa
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Wed Feb 25 19:21:16 2026 +0100

    Automatic changelog update

commit c2ffd25780
Author: ConstantlyConfused <67894661+Eternally-Confused@users.noreply.github.com>
Date:   Wed Feb 25 13:20:57 2026 -0500

    Make the chemvend's bluespace beaker only available through an emag (#5392)

    * move the chemvend bluespace beaker to emaggedInventory

    * forgot to commit

commit 4567d90ebc
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Wed Feb 25 19:20:18 2026 +0100

    Automatic changelog update

commit d72ad394d6
Author: BarryNorfolk <barrynorfolkman@protonmail.com>
Date:   Wed Feb 25 19:19:58 2026 +0100

    Fix shrapnel landmines not triggering properly (#5379)

    * Fix shrapnel landmines not triggering properly

    * Re-enable landmines in the landmine entity table

commit 2993223f20
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Wed Feb 25 19:18:35 2026 +0100

    Automatic changelog update

commit 966c0d6715
Author: Theo <rebe83a@gmail.com>
Date:   Wed Feb 25 12:18:15 2026 -0600

    add emoting component to skia (#5366)

commit b4b52c8497
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Feb 24 20:11:59 2026 +0100

    Automatic changelog update

commit b22fc50349
Merge: a0a120871c 45c99f1e9d
Author: BarryNorfolk <barrynorfolkman@protonmail.com>
Date:   Tue Feb 24 20:11:39 2026 +0100

    Merge pull request #5416 from HameyTychol/Garbage-bag-head

    Garbage bag body part fix

commit a0a120871c
Merge: 09929d7df2 3be5109ce9
Author: BarryNorfolk <barrynorfolkman@protonmail.com>
Date:   Tue Feb 24 20:11:26 2026 +0100

    Merge pull request #5385 from IAmNotGray/does-anyone-even-read-records

    Records Description Length Increase

commit 09929d7df2
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Feb 24 18:26:42 2026 +0100

    Automatic changelog update

commit b2851bbdc4
Author: biddygelson <4606269+Calis007@users.noreply.github.com>
Date:   Tue Feb 24 09:26:22 2026 -0800

    Academy 1.6.0 (#5412)

    * boxketball court is wooden again
    * gave botany a window and moved their machines around, extra crate, extra tools
    * added masks to clown and mime rooms, someone complained "it's barren"
    * fixed hop diectional sign above robo
    * added crashcart to med and viro
    * added mailcart to mail
    * converted maint passage to hallway between epistemics and cargo, and updated directional signs
    * removed christmas cakes from kitchen and cargo cafe
    * replaced winter with spring/summer
    * added gold and silver to cargo

commit 653744b60f
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Feb 24 18:05:10 2026 +0100

    Automatic changelog update

commit 4669b303b4
Author: snowywinters <134970424+snowywinters@users.noreply.github.com>
Date:   Tue Feb 24 10:04:50 2026 -0700

    Asterisk fix (#5373)

    * first part

    * last one

    * last

    * last one maybe

    * last fix

commit 77515c63d7
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Feb 24 06:06:18 2026 +0100

    Automatic changelog update

commit 19b1552db0
Author: keekee38 <iamabanana372456@gmail.com>
Date:   Tue Feb 24 00:05:58 2026 -0500

    Adding purifying salt to the med vend, and a new cryo chem for holy and shadow (#5276)

    * new cryo chem and adding topicals to medivends and med's techfab

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * me when dumb and tired and on phone

    Signed-off-by: keekee38 <iamabanana372456@gmail.com>

    * woof

    * Update Resources/Prototypes/_DV/Recipes/Reactions/medicine.yml

    Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
    Signed-off-by: keekee38 <iamabanana372456@gmail.com>

    * Update Resources/Prototypes/_DV/Reagents/medicine.yml

    Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
    Signed-off-by: keekee38 <iamabanana372456@gmail.com>

    * [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

    * ok maybe that fixes it if not will look at later

    Signed-off-by: keekee38 <iamabanana372456@gmail.com>

    * did the />

    Signed-off-by: keekee38 <iamabanana372456@gmail.com>

    ---------

    Signed-off-by: keekee38 <iamabanana372456@gmail.com>
    Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
    Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

commit 4e9ca44cd7
Author: Delta-V bot <135767721+DeltaV-Bot@users.noreply.github.com>
Date:   Tue Feb 24 05:27:03 2026 +0100

    Automatic changelog update

commit 208e0cc663
Author: Woljif <243318409+Woljif@users.noreply.github.com>
Date:   Mon Feb 23 23:26:44 2026 -0500

    Removed estoc slowdown (#5242)

    * Removed estoc slowdown

    * Re-added speed penalty, but reduced to 0.9x instead of 0.75x

commit 45c99f1e9d
Author: Hamey <jhammett3229@gmail.com>
Date:   Sun Feb 22 19:23:34 2026 -0500

    removed bodyparts ability to be placed in trashbag

commit 161f06d4e9
Author: Hamey <jhammett3229@gmail.com>
Date:   Sun Feb 22 19:22:37 2026 -0500

    Removed ability for limbs to be trashed

commit 7940c9a95c
Merge: b26abf2d79 f5b08f6c7e
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Feb 21 18:48:56 2026 +0000

    Merge branch 'master' into engitape

    Signed-off-by: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>

commit 3be5109ce9
Author: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>
Date:   Sun Feb 15 02:54:45 2026 -0500

    Update PlayerProvidedCharacterRecords.cs

commit a44162ef3d
Author: This_Is_Gray <167829864+IAmNotGray@users.noreply.github.com>
Date:   Sun Feb 15 02:47:53 2026 -0500

    the fabled single line change

commit 6eb9eb5d1e
Author: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date:   Sat Jan 31 20:34:19 2026 +0000

    [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

commit 96390c7d09
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 31 15:31:26 2026 -0500

    minor fixes

commit f348908c4e
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 31 15:19:20 2026 -0500

    fix EngieeringRegulations type

commit 5fbb95ce4b
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 31 15:11:14 2026 -0500

    epic guidebook ops

commit b26abf2d79
Merge: c051498a2a 1a59f9d47b
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Tue Jan 27 14:05:00 2026 -0500

    Merge branch 'master' into engitape

    Signed-off-by: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>

commit 318834107b
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Tue Jan 27 13:56:55 2026 -0500

    epic grammar ops

commit e83764422a
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Tue Jan 27 13:54:50 2026 -0500

    Apply suggestions from code review

    Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
    Signed-off-by: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>

commit c051498a2a
Merge: 04277762b8 a5c9af9759
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Tue Jan 27 11:18:13 2026 -0500

    Merge branch 'master' into engitape

    Signed-off-by: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>

commit 04277762b8
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Mon Jan 26 17:55:56 2026 -0500

    change to 6 charges

commit 53bb098303
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Mon Jan 26 17:27:48 2026 -0500

    1984 engineering holoprojector

commit 763012d593
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Mon Jan 26 14:53:35 2026 +0000

    Update Resources/Prototypes/Catalog/Fills/Lockers/heads.yml

    Co-authored-by: Tobias Berger <toby@tobot.dev>
    Signed-off-by: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>

commit 3b170a396f
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 22:49:29 2026 -0500

    I hate English

commit b82048e097
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 22:48:15 2026 -0500

    the hell is a gar-TEG?

commit 459131b490
Author: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date:   Sun Jan 25 03:32:23 2026 +0000

    [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

commit ad87120ec5
Merge: 13cb721cbb 7dd0741f18
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 22:19:01 2026 -0500

    Merge branch 'engitape' of https://github.com/zelezniciar1/Delta-v into engitape

commit 13cb721cbb
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 22:18:38 2026 -0500

    epic YAML ops

commit 7dd0741f18
Author: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date:   Sat Jan 24 21:08:58 2026 +0000

    [pre-commit.ci] auto fixes from pre-commit.com hooks

    for more information, see https://pre-commit.ci

commit ec46faed2b
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 15:52:40 2026 -0500

    integrate holotape projector

commit cc70987bf7
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 15:39:15 2026 -0500

    recharging

commit 63cff2e3c0
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 15:21:41 2026 -0500

    migration madness

commit a76c69292c
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 15:13:26 2026 -0500

    add holotape component

commit bfb3307a3c
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 14:49:10 2026 -0500

    namespacing

commit 9314cf230c
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 14:47:26 2026 -0500

    port holotape

commit 9676f39298
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 14:19:14 2026 -0500

    epic whitespace ops

commit a0fb085f12
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Sat Jan 24 14:17:20 2026 -0500

    health and safety regs

commit 1d95551bc0
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Fri Jan 23 22:55:01 2026 -0500

    epic autocorrect ops

commit d677ec9cbe
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Fri Jan 23 22:52:48 2026 -0500

    english is a silly little language

commit 3eec3af8da
Author: zelezniciar1 <39102800+zelezniciar1@users.noreply.github.com>
Date:   Fri Jan 23 22:49:52 2026 -0500

    why does this not already exist?

commit 5604de9165
Merge: 3d32f6ec7f acf7b12c87
Author: AeraAulin <133451603+AeraAuling@users.noreply.github.com>
Date:   Sun Oct 19 13:20:13 2025 -0700

    Merge branch 'master' into tailstuff

commit 3d32f6ec7f
Merge: da8804dd9d fad71486d5
Author: AeraAulin <133451603+AeraAuling@users.noreply.github.com>
Date:   Sat Oct 18 19:27:36 2025 -0700

    Merge branch 'master' into tailstuff

commit da8804dd9d
Merge: b5cebe5671 bc36b1d8d1
Author: AeraAulin <133451603+AeraAuling@users.noreply.github.com>
Date:   Sat Oct 18 16:29:45 2025 -0700

    Merge branch 'master' into tailstuff

commit b5cebe5671
Author: AeraAulin <133451603+AeraAuling@users.noreply.github.com>
Date:   Sat Oct 18 15:22:04 2025 -0700

    THIS HAS BOTHERED ME FOR FAR TOO LONG

commit dec82a9bc2
Author: AeraAulin <133451603+AeraAuling@users.noreply.github.com>
Date:   Sat Oct 18 15:13:56 2025 -0700

    Revert "THIS HAS BOTHERED ME FOR FAR TOO LONG"

    This reverts commit 69b6087152.

commit 69b6087152
Author: AeraAulin <133451603+AeraAuling@users.noreply.github.com>
Date:   Sat Oct 18 15:12:52 2025 -0700

    THIS HAS BOTHERED ME FOR FAR TOO LONG

* Sprites take 2

redid lockers for the 200th time, gun lockers and radio

* Part 3

Poncho's, headsets, glasses and more/redone uniforms for all the alternate jobs like detective and corpsman.

* Part 4

Final cut of JUMPSUITS, hopefully.

Renamed blue outfit prototypes to white.

* PDA's

Recoloured all security related PDA's.

* Weaponry

Updates the thematically red weapons (HOS's pistols, and warden's energy shotgun) to fit the blue theme.

* Revert "Weaponry"

This reverts commit 9f1622e70a.

* Weaponry take 2

Recoloured weapons, but in the proper namespace

* Items Part 1

Recoloured security items to match the blue theme, fixed minor issues on clothing.

* Security HUD's

Recolours all HUD's and fixes up minor inconsistencies in clothing icon sprites.

* The Skirtening

Updates all the skirt sprites to their reworked variants.

Also adjusts the cloak/mantle icon.

* Cleanup part 1

Fixes some leftover sprites, adjusts security loadouts.

* PredraftFix

2 pixels man...

* Untouch unrelated testfiles

* protofix

fixes prototype ID's / names for white suit variants

how did I miss 1 pixel on a jumpskirt???

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* RSI

* Dog.

Recolors all the laika/security dog related gear.
minor combat suit changes.

* Spriting never ends

All security hardsuits + det PDA

* Boots

resprites magboots

* Hardsuits final

final adjustments to hardsuit helmets and the color of the lights.

totally final.

* Attribution Ops

See title

* RSIFailFix

Forgotten RSI's + fix errors, wow

* Coats and formals

Recolors the accents on the coats, decided to keep it mostly the same.

Moves HOSformal to DV namespace

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* hosformaldress

real see title

* RSIfix20000

did not forget to merge

* description cleanup + HOS cloaks

update coat descriptions, fix spelling errors in descriptions and update HOS cloak/hat sprites.

also fixes senior officer PDA sprite

* dpt color fix

fixes the departemental color, and slightly brightens the doors/poncho stripes

* those who fix

fixes prototypes and adds a last second recolor of secformalsuit/skirt

* duplifix

* Comments/Loadout

Fixes code comments and cadet loadout

* fixtofix

fix cap and evil loadout duplicate

* Move all 2026 + lathe/migrations

all textures moved to the _DV namespace, properly referred to from the prototypes (HOPEFULLY)

made a migration for the old jumpsuit ID

fixed lathe recipes

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* how

howsomehow

* forgottensprites

adds a few forgotten sprites

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Fix clothing

Resets both uniform yml files to master, spare for the file paths. adds the descriptions to .ftl files

also untouches 1 line in stealtargetgroups

* boxes

boxes

* Update advanced.yml

those who pallette

* HowDidIMissThis

200 merges

* Genpop

Resprites the forgotten genpop turnstiles, lockers and sign.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Proto/Lathe fixes

surely you will not make 200 mistakes

puts clothing prototypes in the correct lathe recipe packs under the correct namespace this time, hopefully and comments out unused ones

* Apply suggestions from code review

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: DarkenedSynergy <70016079+DarkenedSynergy@users.noreply.github.com>

* FinalFixSurely?

:clueless:

* Resolve final issues

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Radezolid <snappednexus@gmail.com>

* Oop missed one.

Signed-off-by: Radezolid <snappednexus@gmail.com>

---------

Signed-off-by: DarkenedSynergy <70016079+DarkenedSynergy@users.noreply.github.com>
Signed-off-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-05-30 20:56:33 -03:00
Delta-V bot ab354dba0d Automatic changelog update 2026-05-30 17:10:38 +02:00
Sir Warock 10b3e4693d Add a Client Toggle for StunVisuals (#5831)
* OneCommitOps

* Update DCCVars.cs

Signed-off-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>

---------

Signed-off-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-05-30 10:10:19 -05:00
Delta-V bot bfb6387fcd Automatic changelog update 2026-05-30 16:45:18 +02:00
Theo 0e9ca82619 Remove psionic eruption (#5821)
comment off
2026-05-30 09:44:58 -05:00
Delta-V bot 6705bbc572 Automatic changelog update 2026-05-30 15:34:47 +02:00
pathetic meowmeow 6ab48778fb Merge pull request #5798 from sowelipililimute/work/jblackquill/es-audiovisual-sauce-bundle
The audiovisual sauce bundle
2026-05-30 09:34:27 -04:00
Mish 8a2b4daccb Igniters spark when triggered (#1084)
* Igniters spark when triggered

* newlines my beloved
2026-05-30 09:16:20 -04:00
FlareguyandNemanja c942b89bd3 Machines now spark on hit (#348)
* sparks on more stuff

* crates

* test fail fix

* a

* Add EOF newline

* Add EOF newline

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
2026-05-30 09:16:20 -04:00
Nemanja 132b3d829d Hark, Sparks! (#491)
* Basic improvements to sparks

* Pull spark configuration out of SparkOnHit component

* Add various sparks to tasers, batons, RCD

* Add sparks back to electrocution

* Adjust new projectiles

* Tile fires on cable cuts

* That's a terrible idea, actually

* Add a custom PreventCollide system

* Make the new prevent collide component prevent collisions
2026-05-30 09:16:20 -04:00
Nemanja 00ff4d5d9b Sparks (#273)
* Add pointlight despawning visuals for sparks

* Add sprite fade out

* Add spark prototypes

* Add sparking behavior to lights

* Integrate sparks with some different stuff

* Remove invalid field
2026-05-30 09:16:20 -04:00
Janet Blackquill d2e65e8b5c MIT/CC0-1.0 2026-05-30 09:16:20 -04:00
Janet Blackquill 01812253c5 janet interaction particles port (#1332)
* Interaction particles (#163)

* move stuff

* tweaks/fixes

* schema fixes

* another

---------

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-30 09:16:08 -04:00
Radezolid c6971fee88 Remove remnants of Dex+ (#5916)
no more error spam
2026-05-30 07:53:18 -05:00
Delta-V bot 4b86de2260 Automatic changelog update 2026-05-30 14:25:47 +02:00
DisposableCrewmember42 2999917b39 tweak: enable preset cooldowns (#5489)
tweak: properly document and enable preset cooldowns in config, adjust cooldown values
2026-05-30 14:25:28 +02:00
Vapeandpathetic meowmeow 6e052b3578 System Hotfix - Stop logging "TypingChangedEvent" (#5917)
* One word C# change

* Update Content.Shared/Chat/TypingIndicator/SharedTypingIndicatorSystem.cs

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-30 04:21:39 +00:00
Delta-V bot 65eaea0d71 Automatic changelog update 2026-05-30 04:20:38 +02:00
Stxcking 0a9ed0bf8d Fix: Allow Ninja to call in Colossus as a Threat (#5909)
uh
2026-05-29 21:20:18 -05:00
Radezolid 3e0dc9516a Fix the PKA change changelog (#5910)
fix
2026-05-29 19:21:19 -04:00
Delta-V bot 61e7473957 Automatic changelog update 2026-05-29 22:33:32 +02:00
BarryNorfolk 438e83ec1e [K9] Give Laika and other secdogs Access + Tracking (#5001)
* Add dataset for Secdog names

* Split secdog into a base + other dogs so laika keeps her name

* Add new system for enabling subdermal ID cards

* Check for subdermal ID cards for access and sensor information

* Add MindOnlyAccess marker component

* Add new generic K9 officer role for secdogs

* Add Laika/K9 officers to security

* Update Laika's role to match K9 officer

* Add subdermal implants and mind only access for K9 officers

* Set MobSecDogBase to abstract

* Set K9Officer card to sec colours

* Update comments for Subdermal IDCard

* Move mind check for access above log for access

* Re-use ImplanterComponent's slot name

* Move idcard container const into component as well

* Add missing setPreference and requirements to k9 officer

* Ensure admin tricks work on subdermal ID cards

* Remove subdermal ID cards from showing in nanochat

* Move secdogs.yml to _DV namespace

* Fix typo

* Unduplicate container id name
2026-05-29 22:33:11 +02:00
Delta-V bot 560bc4e22a Automatic changelog update 2026-05-29 22:26:41 +02:00
Theoandpathetic meowmeow a96d87cafe Ghost buffers (#5814)
* Made all 3 immune to melee (modify corporealspirit and spirit damageModifierSet), moved skia and wisp to bulletproof layer, removed rev ability to emag borgs

* add jaunt to skia

* give reveneant melee 4 damage every 3 seconds in very close range

* make salt packets spillable, make silver sword reveal for 5 seconds, make radiant sword reveal for 10, make bible reveal for 30

* wisp will escape being grabbed

* formatting, typo

* skia slight slight invis for flavor

* unable to emag open lockers, generally tweaked actions to be cheaper. Increased radius and chance of defile, made animate last only 10 seconds

* change action text to be accurate to costs

* add reveal component to baseorganic species, change to resistances and skia layer

* video immediately out of date

* Update Resources/Prototypes/_DV/Entities/Objects/Weapons/Melee/swords.yml

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

* unmangle

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-29 16:26:20 -04:00
Delta-V bot cdc66f87f5 Automatic changelog update 2026-05-29 17:55:23 +02:00
VelcroboyandVelcroboy 850af4cf20 Map Edits: Remove Fun (#5912)
Remove fun

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-05-29 17:55:02 +02:00
This_Is_Gray 024924421b Yet Another Elegance Update (#5815)
* Update elegance.yml

* Update elegance.yml

* Update elegance.yml

* bluesecchanges

* bluesec real

* Update elegance.yml
2026-05-29 15:04:03 +02:00
Delta-V bot 81e7c02e0e Automatic changelog update 2026-05-29 13:09:09 +02:00
a5c651d372 Port Portable Chem Mixer from Goob (#5532)
* Port

* Update tags.ftl

* Update portable_chem_master.yml

* Update portable_chem_master.yml

* new sprites

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Trying to put the new sprites

* New sprites work now yippe

* Changed crafting recipe

* FIxed recipe

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update portable_chem_master.yml

* Rename equipped-suitStorage.png to equipped-SUITSTORAGE.png

Signed-off-by: Apachito <ivanlopezlegos2004@gmail.com>

* Update Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Apachito <ivanlopezlegos2004@gmail.com>

* Update tags.ftl

* Update tags.ftl

* Update tags.ftl

* Update RobustToolbox

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update RobustToolbox

* Revert "Update RobustToolbox"

This reverts commit d3fd3d5f68.

* Revert "Update RobustToolbox"

This reverts commit d3fd3d5f68.

* Reapply "Update RobustToolbox"

This reverts commit 6cc86f3707.

* Revert "Reapply "Update RobustToolbox""

This reverts commit 8d38d2d327.

* Update RobustToolbox

* Fix RobustToolbox version

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Removed fill sprites and ability in the yaml file

---------

Signed-off-by: Apachito <ivanlopezlegos2004@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: Tobias Berger <toby@tobot.dev>
2026-05-29 13:08:48 +02:00
Delta-V bot 1986fbf192 Automatic changelog update 2026-05-28 21:56:57 +02:00
KOTOB d01a50c519 Avali bugfixes (#5881)
* avali major

* whoops

* Update FeatherVisualizer.cs
2026-05-28 19:56:36 +00:00
Delta-V bot 6d339c9939 Automatic changelog update 2026-05-28 20:57:05 +02:00
Sir Warockandpre-commit-ci[bot] 8d4401ccaf Buff Zap (#5694)
* Buff Zap

* Typo fix

* Reduced Glimmer Generation

* fix

* Rewrite with Events

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-28 20:56:45 +02:00
Delta-V bot 61d342a2a1 Automatic changelog update 2026-05-28 20:06:32 +02:00
Sir Warockandpre-commit-ci[bot] 455e232a38 Buff MassSleep (#5692)
* Buff Masssleep

* Increase Glimmer Creation

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Removed Stupidness

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Fix

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-28 20:06:11 +02:00
Delta-V bot 75089bc88e Automatic changelog update 2026-05-28 19:37:29 +02:00
TNEandJanet Blackquill 4cc00970ee Send PDA ringer sound to the StationAI player directly (#5805)
* Send PDA ringer sound to the StationAI player directly

Prevents the sound from appearing at the StationAI core's location and instead plays the sound globally for the StationAI player.

* Actor

---------

Co-authored-by: Janet Blackquill <uhhadd@gmail.com>
2026-05-28 17:37:08 +00:00
Delta-V bot c68cdeb673 Automatic changelog update 2026-05-28 19:07:31 +02:00
Radezolid 7bca51bb57 Lower the PKA's fire rate (#5811)
* Restore the PKA projectile despawn timer to 0.22

* Lower fire rate, make the PKA bigger

* Revert range change

* Made PKA upgrades unobtainable

* Revert firerate change

* Up PKA damage
2026-05-28 13:07:11 -04:00
Delta-V bot 7203e3e216 Automatic changelog update 2026-05-28 18:56:40 +02:00
DisposableCrewmember42andpathetic meowmeow e9b74fbef4 feat: OOC/LOOC/Deadchat muting (#5858)
* feat: LOOC/OOC/Deadchat muting

* refactor: split OocMuteCommands.cs into 3 files

* tweak: use proper admin logging

* refactor: remove unused loc args

* feat: one mute command, channel as argument

- properly marked target player in admin log so it actually alerts.

* refactor: completion options made named constant, used in error message

* tweak: display supported channels in help too

* fix: pass command to help string again

* style: add whitespace

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
Signed-off-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>

---------

Signed-off-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-28 12:56:19 -04:00
Delta-V bot 62e6a412dc Automatic changelog update 2026-05-28 18:04:58 +02:00
Theo 86301996ac fix rootsong and typing indicators (#5908) 2026-05-28 16:04:37 +00:00
Delta-V bot e5d04bfd65 Automatic changelog update 2026-05-28 18:04:20 +02:00
Theo b9b690bf8d Uplink rework part 1 (#5892) 2026-05-28 12:03:59 -04:00
Delta-V bot b7835b8267 Automatic changelog update 2026-05-28 17:57:48 +02:00
Stop-Signs 3258e15c57 Revert Miasma nerfs (#5899) 2026-05-28 11:57:27 -04:00
Delta-V bot 6fa8f1aba3 Automatic changelog update 2026-05-28 17:56:37 +02:00
AeraAulin 3a39317ebf i only put shadow damage res on half of kitsune (#5907) 2026-05-28 11:56:17 -04:00
Delta-V bot b85dd9f03d Automatic changelog update 2026-05-28 01:47:19 +02:00
Stxcking 3864a87103 Tweak: Remove Time Requirements on Specific Clothing (#5603)
* Grind is Kill

* guh
2026-05-27 20:46:58 -03:00
Cepelinas1 e87ebe2fbf Allow light replacers to be put in utility belts (#5901)
first
2026-05-27 20:08:05 -03:00
Delta-V bot 170ee4a0b2 Automatic changelog update 2026-05-27 21:14:22 +02:00
Cepelinas1andStxcking ceca76ccdd More lighters in loadouts (#5845)
* first stuff

* add flippos

* fix Job stuff

* wrong assistant role job

* fixes

* Removed some redundant lines

upstream had a solution refactor and cleaned up their lighter.yml, this is probably the best we can do without conflicts with those changes while staying faithful to the PR

---------

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
2026-05-27 19:14:01 +00:00
Delta-V bot 3f57971501 Automatic changelog update 2026-05-27 20:21:09 +02:00
AeraAulin 65f7a56f84 Add more rewards to the ancient books (#5890)
* small archivist buff

* forgot to add it to the other books

* fix typo

* aaaaaaaaaa
2026-05-27 13:20:48 -05:00
Delta-V bot 0a2d83c5b4 Automatic changelog update 2026-05-27 18:21:37 +02:00
Theo c25aab9214 corps locker tweaks (#5842)
* ok

* revivopine bottle
2026-05-27 11:21:17 -05:00
Delta-V bot ad24fbbd9d Automatic changelog update 2026-05-27 15:45:58 +02:00
KOTOB e9ac10995b Disable borer spawns until properly removable (#5897)
1984
2026-05-27 09:45:37 -04:00
Delta-V bot 378dacbb88 Automatic changelog update 2026-05-27 01:30:55 +02:00
AeraAulin 948318f71f SV-213 security sidearm + give cargo shuttle pilots a windshield wiper(the regular svalinn) (#5889)
* gods I wish there were more powercell laser guns they're actually so cool

* fix that stuff
2026-05-26 20:30:36 -03:00
Delta-V bot 9f5b871312 Automatic changelog update 2026-05-26 01:03:12 +02:00
81cbf9d218 PORT: ImpStation's Wallpapers + Banners + Glow in the Dark Stars (#5722)
* my beautiful wallpapers (#2901)

* my beautiful wallpapers

* test commit

* i understand how construction graphs work now and im very unhappy about it

* GOD DAMN IT

---------

Co-authored-by: hivehum <ketchupfaced@gmail.com>

* Tweaks and stuff !

* Deconstruction :D

Thought it was nice to do

---------

Co-authored-by: crocodilecarousel <184127501+crocodilecarousel@users.noreply.github.com>
Co-authored-by: hivehum <ketchupfaced@gmail.com>
2026-05-25 20:02:52 -03:00
b817cc35c9 Syndicate Spider Operative (#5783)
* Initial checkin.

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Fixing a little oopsie daisy with the mouse names.

* Poke.

* Fixed PointLight so it properly displays given spider's larger sprite.

* Changing armor and cost per CR feedback. Also to kick the can so the builds run again.

* Update Resources/Prototypes/_DV/Catalog/Uplink/allies.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Mobs/NPCs/nukiespider.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>

* Maintainer feedback changes.

---------

Signed-off-by: robobozu <240598948+robobozu@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-05-25 17:07:50 -04:00
Delta-V bot 5712c39330 Automatic changelog update 2026-05-25 21:45:16 +02:00
Khaomiandpre-commit-ci[bot] 211277ecce removed(jukebox): Removed Lone Digger by Caravan Palace (#5887)
* Revert "add lone digger by caravan palace to the jukebox (#1998)"

This reverts commit c38c96fc25.

* deleted: lone digger

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-25 19:44:55 +00:00
Minerva 4aced8451c Groups surgical scrubs in medical loadouts (#5619) 2026-05-25 13:28:28 -03:00
Delta-V bot edfc9a9054 Automatic changelog update 2026-05-25 17:00:00 +02:00
Theoandpathetic meowmeow 42589dc185 Prisoner arrivals fix (#5885)
* doesn't work

* akesi fixed it

* Apply suggestions from code review

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-25 14:59:40 +00:00
Delta-V bot be5093fe7f Automatic changelog update 2026-05-25 16:57:56 +02:00
KOTOB 9122a1ba4c Real Trait System™ tweaks (#5598)
* tweakies

* BUT WAIT! THERE'S MORE!

* Trait priority

yoinked from a couple changes made in https://github.com/Floof-Station/Panta-Rhei/commit/1c69ec2035d3d8246796e46019c0537d1dcf5714#diff-e92e9895e4a58647a9e8958c891cae3104f45517f933efff4e0c10491fe48930

* not confident enough to try comparison godo
2026-05-25 16:57:36 +02:00
Delta-V bot 676145bd21 Automatic changelog update 2026-05-25 15:44:05 +02:00
KOTOB 82bde19134 Make Psionic Eruption less dangerous (#5878)
* we hate fun!

* popup rewording

* adjustment
2026-05-25 08:43:46 -05:00
Delta-V bot 71083b180b Automatic changelog update 2026-05-25 11:13:28 +02:00
SirrRequiem 8e50900df9 Terra 5: A Breath of Fresh Air (#5772)
* Terra 5: Breath of Fresh Air

* buh

* Terra5: Breath of Fresh Air

* Spruced up TEG room with stuff

* TEG gets rotated
2026-05-25 11:13:07 +02:00
VapeandVanessa 8acf3e71ac Moth "Clown Shoes" Sound Reduction (#5869)
* Moth

* Apply suggestions from code review

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-05-24 19:11:40 +00:00
Stxcking 32a7139fa1 Fix: Grav Gauntlet Sprite Error (#5879)
fix
2026-05-24 19:07:26 +00:00
Delta-V bot fe7ae2a838 Automatic changelog update 2026-05-24 18:31:32 +02:00
12d55978f5 Small Buff to Warden Hardsuit (#5700)
* One Commit Ops

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update Content.Shared/_DV/Clothing/Systems/HeavyClothingSystem.cs

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-24 16:31:12 +00:00
Delta-V bot 86a5d53688 Automatic changelog update 2026-05-24 18:18:40 +02:00
Cepelinas1andpathetic meowmeow a2ccf1b106 Purchasable revolvers (#5849)
* first

* Update Resources/Prototypes/_DV/Catalog/Fills/Crates/armory.yml

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-24 16:18:20 +00:00
Delta-V bot c33826f91a Automatic changelog update 2026-05-24 18:14:43 +02:00
AeraAulin 57a92315a2 Syndicate dual swords balance patch (#5859) 2026-05-24 11:14:24 -05:00
Vapeandpre-commit-ci[bot] 70b5fbfbac Tobacco Rework (#5862)
* commit

* updates

* Capitalization and Spacing error

* Review Changeth

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Typo and organization corrections

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-24 18:10:43 +02:00
Delta-V bot f92df73e54 Automatic changelog update 2026-05-24 18:07:13 +02:00
Stxcking 454b11227a Tweak: Move Onion Rings and Taco Shells to the Deep Fryer (#5623)
* It just makes sense

* yippee one line
2026-05-24 12:06:54 -04:00
Delta-V bot 710a7b74a2 Automatic changelog update 2026-05-24 18:02:30 +02:00
ConstantlyConfused c6c4655d83 Add Delta-V specific steal objectives to the traitor guidebook (#5800)
* Add Delta-specific objectives items to traitor guidebook

* error fixes

* add HOP photobook to comments

* replace MG's hardsuit

* add eshotgun to guidebook, remove lucky bill

* add the clerk's stamp
2026-05-24 12:02:11 -04:00
Delta-V bot d5d31aac6a Automatic changelog update 2026-05-24 17:58:53 +02:00
55ad1cb4e1 Add Colorful Chairs (#5864)
* Add colorful chairs

* no yellow :(

* standards

* yaml cleanup

* Apply suggestions from code review

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-24 15:58:33 +00:00
Delta-V bot 90e95b657d Automatic changelog update 2026-05-24 17:48:22 +02:00
Stxcking 6669c0b705 Tweak: Remove 0 TC Cost Items from Surplus (#5853)
blacklist
2026-05-24 11:48:02 -04:00
pathetic meowmeow 0ed24648aa Announce job joins to their departments only (#5863) 2026-05-24 09:13:26 -05:00
Delta-V bot 336b1d07d0 Automatic changelog update 2026-05-24 11:50:45 +02:00
Colin-Tel 880d388624 Set Division's maxPlayers from 70 to 80 (#5780) 2026-05-24 11:50:26 +02:00
Delta-V bot d765649406 Automatic changelog update 2026-05-24 06:56:14 +02:00
ConstantlyConfused 2939a1f6d8 Make the nukie medicine bundle contain salbu instead of dex+ (#5877)
* Make the nukie medicine bundle have salbu instead of dex

* fix yaml order
2026-05-24 04:55:54 +00:00
github-actions[bot]andDeltaV-Bot 48351bfa1c Update Credits (#5876)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-05-24 04:42:21 +02:00
Delta-V bot 484428e533 Automatic changelog update 2026-05-23 22:40:34 +02:00
Vanessa 0378bec386 Fix Gibbing Not Dropping Brain and Organs (#5874)
fix gibbing not dropping organs
2026-05-23 20:40:14 +00:00
Delta-V bot 84bc28f1ec Automatic changelog update 2026-05-23 03:34:03 +02:00
TheoandRadezolid f2882d2c1c remove ambuzol from chem anomaly and random pill tables (#5822)
* remove from chem anomaly and random pill tables

* Update Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml

fix comment

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Theo <tad3@illinois.edu>

---------

Signed-off-by: Theo <tad3@illinois.edu>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-05-22 22:33:43 -03:00
VelcroboyandVelcroboy 9bbcf80999 Update Map Attribution File (#5865)
Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-05-22 12:42:25 -04:00
Delta-V bot 41a3a64cd2 Automatic changelog update 2026-05-22 18:19:06 +02:00
Stxckingandpathetic meowmeow 7b80369206 PORT: Added Holoflare Gun from Frontier (#5837)
* Holoflare Gun

-Created a bunch of file in _NF namespace
-Added flare ammo to energy gun systems
-Basically anything relating the holoflare from the NF repo :>

* DV related

-Added the holoflare gun to any place that made sense to have it

* Engi Borg + Fix

* yaml liner fixes

* voucher is true

* Added FlareGunPellet deletion to Skia Scream

Other CR requests

* Update Content.Shared/_DV/Psionics/Systems/PsionicPowers/PsychokineticScreamPowerSystem.cs

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-22 16:18:46 +00:00
Delta-V bot a35a5b5a1e Automatic changelog update 2026-05-22 17:59:51 +02:00
Stxcking 02f1bf84b0 Fix: Advanced Service Borg Modules Cost as Much as Other Advance Modules (#5855)
overlooked whoops
2026-05-22 11:59:31 -04:00
Delta-V bot f9b8628062 Automatic changelog update 2026-05-22 03:30:45 +02:00
Proxy also works :3 86d2422ced you forgot one (#5860)
no more ipc
2026-05-21 20:30:25 -05:00
Delta-V bot 548a9ffb71 Automatic changelog update 2026-05-22 03:26:46 +02:00
Stop-Signs 3454ace8f5 Raise cooldown on self-uncuffing (#5854)
* Why was it EVER this low

* comment
2026-05-21 20:26:26 -05:00
CorynandJanet Blackquill cb62b27fcf Nubody (2/3) - ShitMed removal (#5844)
* Reapply "Nubody Merge" (#5807)

This reverts commit d62f7cef10.

* Revert "Nubody Merge (#5670)"

This reverts commit b465cfb3fd.

* Revert "IPC fibers (#4968)"

This reverts commit c2b42211f0.

* Revert "IPC Polymorph fix (#4545)"

This reverts commit fa03d8c655.

* Revert "fix IPC not having humanoid emotes (#4445)"

This reverts commit 216fdf999f.

* Revert "ipc heat/cold (#4306)"

This reverts commit fafd5cf816.

* Revert "ipc cables (#4283)"

This reverts commit 54958039a1.

* Revert "feat: ipcs now have dynamic power draw based off movement speed (#3917)"

This reverts commit 71e8b7e64b.

* Revert "fix ipcs not being able to disarm (#3374)"

This reverts commit 764c4dcf54.

* Revert "make steel heal caustic for ipcs (#3206)"

This reverts commit 450ac82550.

* Revert "add missing ipc survival boxes (#3065)"

This reverts commit 888c9cdb00.

* Revert "make borgs use ipc repairing (#3064)"

This reverts commit f77a49dd0b.

* Revert "Update hud.yml to add ipcs to diagnostic hud (#3019)"

This reverts commit 7220643531.

* Revert "Tweak IPCs (#2979)"

This reverts commit 98b47476de.

* Revert "fix nukies ipc test fail (#2957)"

This reverts commit 4a1acbf863.

* Revert "fix ipc nukies not getting comms (#2884)"

This reverts commit 8a2254770e.

* Revert "fix ipc encryption key mispredict (#2879)"

This reverts commit f08726efc1.

* Revert "Merge pull request #2800 from Spielern/port-ipc"

This reverts commit 822fa4312c, reversing
changes made to fe4c23c702.

* Remove and Fix rest of IPC Hangons causing crashes

* Integration test Errors

* Expand migration file with removed IPC stuff

* IPC Leg was found and migrated to naught

* Revert "Merge pull request #2542 from deltanedas/shitmed-ops"

This reverts commit 83a8002922, reversing
changes made to baa89b0052.

* Revert "Set up surgical augments infrastructure & add tool panel augments (#3059)"

This reverts commit a40f0be6fd.

* Revert "Psionic Prosthetics (#4689)"

This reverts commit 2679bb238a.

* Revert "Add surgical cleanliness and sanitation (#2847)"

This reverts commit 64565ba4f7.

* Remove unremoved mentions

* Revert "Add autoclave to easily sanitize large amounts of items and faster (#2933)"

This reverts commit d0da90fa2e.

* Shit Med Removed

* Remove _ShitMed Folders and fix Errors in Console

* Add OrganAnimalBrain into the mirgraiton file

* Heads no Input Mover

* Monke

* Full migration file I guess

* oops

* shiv state fix

* Restore accidental deleted recipe

* Forgot one flt mention

* Fix more issues

* Comment out Damage Visual for motorkind for now

* Motorkind...

* Commenting stuff out for now

* thought there'd be more of this to gut

---------

Co-authored-by: Janet Blackquill <uhhadd@gmail.com>
2026-05-21 20:27:04 -04:00
3e33391980 Add condiment spawner (#5843)
* Add condiment spawner

* minor consistency with upstream stuff

ill know peace once every name has the same convention

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
2026-05-21 03:53:51 +00:00
Delta-V bot be6a2be915 Automatic changelog update 2026-05-21 05:45:01 +02:00
ConstantlyConfused d33b22c1e9 Add code orange to Alert Procedure (#5832)
add code orange to guidebook and wiki
2026-05-20 23:44:40 -04:00
Delta-V bot 47f6adf2a0 Automatic changelog update 2026-05-20 23:07:59 +02:00
825267bbb3 Avali Feather Preening (#5609)
* far more then I had expected

* bird up!

* that's about it

* cleanup

* eeh

* last touch

* copyright formatting fail

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* thanks rebe

* balance 1984

* Apply suggestions from code review

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>

* oops

---------

Signed-off-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-05-20 17:07:38 -04:00
Delta-V bot 78e30274b5 Automatic changelog update 2026-05-20 03:04:27 +02:00
Theo 092efc3b38 add rootspeak (#5827)
* add radio channel and components to nymphs and diona

* add speak to tree, change radio color

* rename to rootsong whoops
2026-05-19 21:04:07 -04:00
Delta-V bot a7096b143d Automatic changelog update 2026-05-20 00:53:21 +02:00
CorynandJanet Blackquill 1f8afb9ba6 Nubody (1/3) - Ipc removal (#5840)
* Reapply "Nubody Merge" (#5807)

This reverts commit d62f7cef10.

* Revert "Nubody Merge (#5670)"

This reverts commit b465cfb3fd.

* Revert "IPC fibers (#4968)"

This reverts commit c2b42211f0.

* Revert "IPC Polymorph fix (#4545)"

This reverts commit fa03d8c655.

* Revert "fix IPC not having humanoid emotes (#4445)"

This reverts commit 216fdf999f.

* Revert "ipc heat/cold (#4306)"

This reverts commit fafd5cf816.

* Revert "ipc cables (#4283)"

This reverts commit 54958039a1.

* Revert "feat: ipcs now have dynamic power draw based off movement speed (#3917)"

This reverts commit 71e8b7e64b.

* Revert "fix ipcs not being able to disarm (#3374)"

This reverts commit 764c4dcf54.

* Revert "make steel heal caustic for ipcs (#3206)"

This reverts commit 450ac82550.

* Revert "add missing ipc survival boxes (#3065)"

This reverts commit 888c9cdb00.

* Revert "make borgs use ipc repairing (#3064)"

This reverts commit f77a49dd0b.

* Revert "added ipc plushie (batteries not included) (#3023)"

This reverts commit 743cdbb606.

* Revert "Update hud.yml to add ipcs to diagnostic hud (#3019)"

This reverts commit 7220643531.

* Revert "Tweak IPCs (#2979)"

This reverts commit 98b47476de.

* Revert "fix nukies ipc test fail (#2957)"

This reverts commit 4a1acbf863.

* Revert "fix ipc nukies not getting comms (#2884)"

This reverts commit 8a2254770e.

* Revert "fix ipc encryption key mispredict (#2879)"

This reverts commit f08726efc1.

* remove oil

* Revert "Merge pull request #2800 from Spielern/port-ipc"

This reverts commit 822fa4312c, reversing
changes made to fe4c23c702.

* Remove and Fix rest of IPC Hangons causing crashes

* Integration test Errors

* Expand migration file with removed IPC stuff

* IPC Leg was found and migrated to naught

* motorkinds need to inherit an actual species base

* forgot the alerts

* irrelevant coscult code

* excess casualties

---------

Co-authored-by: Janet Blackquill <uhhadd@gmail.com>
2026-05-19 18:53:01 -04:00
Delta-V bot fcab8ccb1e Automatic changelog update 2026-05-19 20:42:30 +02:00
Cepelinas1 cd8cbcb2ea Replace Bionic Larynx Implant with Upstream one + Add Voice Mask back to Uplink (#5702)
* first thing

* fix

* woopsie daisy i somehow missed that
2026-05-19 18:42:09 +00:00
Delta-V bot 305de38eb5 Automatic changelog update 2026-05-19 20:37:22 +02:00
Cepelinas1andpre-commit-ci[bot] 72fd5372eb Anomaly Holowarning (#5716)
* first and hopefully last

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* fix hand issue sprite

* sign fix, locker addition

* merge fix, increase crafting time because i'm so evil

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-19 20:37:01 +02:00
Delta-V bot 8ad049d88e Automatic changelog update 2026-05-19 12:01:11 +02:00
DisposableCrewmember42 afc2655c0a fix: Admin QOL Patches (#5618)
* fix: lslaws should only list when lawbound, no law boards!

* tweak: avoid spamming ssd/cadet search strip alerts

* docs: add missing import comments

* fix: also don't alert when finishing to butcher a monkey

* refactor: rename added function

* refactor: break out target/user values for stripping alerts too

* tweak: a newline less

* fix: use continue instead of return when encountering offline watchlisted player

Signed-off-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>

* tweak: the hands alert doesn't need to always alert on living ssd

Signed-off-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>

* tweak: add ghost check to stripping alerts, different values for hand strip

* fix: check for ghost, not mindshield, oops

* tweak: lower alert on pocket ssd strip, rename vars for clarity

Signed-off-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>

* tweak: hold off hand strip alerts until #5699

Signed-off-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>

---------

Signed-off-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>
2026-05-19 10:00:50 +00:00
Delta-V bot 337b9366f5 Automatic changelog update 2026-05-19 10:30:48 +02:00
DisposableCrewmember42 8bc0ac3b38 tweak: nanotask papers don't provide throwing pushback (#5122) 2026-05-19 10:30:27 +02:00
Stxcking a7af20fd67 Added Un-mineable Variants of Planetside Rocks (#5758)
* guh

* compacted

* asteroid, why not
2026-05-19 10:27:47 +02:00
Delta-V bot 665ad33c21 Automatic changelog update 2026-05-19 10:22:20 +02:00
729eabae9d Grav gauntlet (#5767)
* C_GAUNTLET.yml is kinda goated bro

* taser

* thanks Keke :)

* guh

* yes

* SOUNDS AMAZING

* cause i can

* name change

* name changes n stuff

* single word decription change for gun

* added to HoS sidearm Briefcase

* range nerf
slight attack rate nerf

* range buff :/

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Update Resources/Prototypes/_DV/Entities/Objects/Weapons/Melee/C_Gauntlet.yml

Co-authored-by: Tobias Berger <toby@tobot.dev>
Signed-off-by: Apersos-coll <collsherlo@gmail.com>

* Update Resources/Prototypes/_DV/Entities/Objects/Weapons/Melee/C_Gauntlet.yml

Co-authored-by: Tobias Berger <toby@tobot.dev>
Signed-off-by: Apersos-coll <collsherlo@gmail.com>

* text fixes
CGauntlet renamed GravGauntlet
Singularity toy replaced with Guitar in Grav Gauntlet bundle
Icon swap

* new icon (whoopsies)

* also this i forgot to do
get rid of old C_Gauntlet one which was replaced by the correctly named Grav gauntlet one

* thanks woljif for this new description, its like way better :)

* Update grav_gauntlet.yml

Single word change to item description 

Signed-off-by: Apersos-coll <collsherlo@gmail.com>

* Update Resources/Prototypes/_DV/Catalog/HoS_Briefcase_catalog.yml

Signed-off-by: Tobias Berger <toby@tobot.dev>

* Update Resources/Locale/en-US/_DV/tools/Hos-Briefcase.ftl

Signed-off-by: Tobias Berger <toby@tobot.dev>

* Apply suggestion from @Toby222

Signed-off-by: Tobias Berger <toby@tobot.dev>

* Update Hos-Briefcase.ftl

description change to fit in better

Signed-off-by: Apersos-coll <collsherlo@gmail.com>

* HoS Briefcase description change to make it fit in better

* base damage reduction
wielding increases damage
powercell needed for taser
fixed taser
no more left mouse button hits (weird side effect of hybrid weapons like crusher)
fixed spellings
added my friend to credits who helped make the original concept

* quick fix

* changed power cell to a internal battery, as via request. this also fixed the tasers cooldown, back to 55 seconds due to the switch.

* changed parents back to normal, i accidently forgot to change them after adding a new one

* Update Resources/Locale/en-US/_DV/tools/Hos-Briefcase.ftl

Co-authored-by: Tobias Berger <toby@tobot.dev>
Signed-off-by: Apersos-coll <collsherlo@gmail.com>

* added missing word to description

Signed-off-by: Apersos-coll <collsherlo@gmail.com>

---------

Signed-off-by: Apersos-coll <collsherlo@gmail.com>
Signed-off-by: Tobias Berger <toby@tobot.dev>
Co-authored-by: apersos <piggyweweroblox@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Tobias Berger <toby@tobot.dev>
2026-05-19 10:21:56 +02:00
Radezolid a14216de58 CODEOWNERS fix for headmins not being pinged on rule changes (#5835)
Fix
2026-05-19 10:12:38 +02:00
Vape a494ada80b Bugfix - Correct AI Ion laws to be socially acceptable (#5838)
* Update ion_storm.yml

* Updated changes
2026-05-19 04:18:23 +00:00
Hyper 53b126f8c3 Additional Chat Punctuation (#5833)
?,!,…

Signed-off-by: Hyper <45052445+HyperBeast43@users.noreply.github.com>
2026-05-18 20:24:16 -05:00
Delta-V bot 4c639a7342 Automatic changelog update 2026-05-18 07:13:18 +02:00
keekee38andStxcking 78de793ff7 Universal buff and price increase, IK-30 buff (#5592)
* rof -> 2 price -> 12.5k

* ik-30 fireable 1 handed, rof -> 2

* ik-30 semi only

* moved laser mags to adv energy gun research

* ok ik-30 killed, replaced by battery ik-60, ert ik-60 -> ik-60-m, no more magfed ik for sec i gotta redo some sprites

* worlds most basic sprite edits

* ok we go back to the magfed

* minor attribution nickpick

tiny cleaning

---------

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
2026-05-18 05:12:58 +00:00
Delta-V bot 0c6054532a Automatic changelog update 2026-05-18 07:12:04 +02:00
TNE 8a6d3d0e05 Allow station AI access to Crew Manifest, Notes, NanoTask (#5806) 2026-05-18 05:11:44 +00:00
Delta-V bot 65d1f033af Automatic changelog update 2026-05-18 05:55:18 +02:00
TheoandRadezolid a2ea2e216a added tools and doodads to science locker fill (#5714)
* added tools and doodads to science locker fill

* add nestedselector and table

* Change the order to match other Fills

Signed-off-by: Radezolid <snappednexus@gmail.com>

---------

Signed-off-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-05-18 03:54:58 +00:00
Delta-V bot 3cc1b824c6 Automatic changelog update 2026-05-18 05:44:56 +02:00
StxckingandRadezolid 83c1e1b1d1 Tweak: Readd Round Start Tools Module to Medical, Service, and Janitor Borgs (#5657)
* Grr

* So Angry I forgor to comment

* Untouch newlines

---------

Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-05-18 03:44:36 +00:00
Delta-V bot 94de555aa7 Automatic changelog update 2026-05-18 05:40:11 +02:00
AeraAulinandStxcking f93fb70d1c syndicate dual swords (#5725)
* sword

* requested changes

* Update Resources/Prototypes/_DV/Entities/Objects/Weapons/Melee/swords.yml

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
Signed-off-by: AeraAulin <133451603+AeraAuling@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Objects/Weapons/Melee/swords.yml

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
Signed-off-by: AeraAulin <133451603+AeraAuling@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Catalog/Uplink/weaponry.yml

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
Signed-off-by: AeraAulin <133451603+AeraAuling@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Catalog/Uplink/weaponry.yml

Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
Signed-off-by: AeraAulin <133451603+AeraAuling@users.noreply.github.com>

---------

Signed-off-by: AeraAulin <133451603+AeraAuling@users.noreply.github.com>
Co-authored-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
2026-05-17 23:39:51 -04:00
Delta-V bot c1540d2aaa Automatic changelog update 2026-05-18 05:39:08 +02:00
Theo 8c06d97a9b hyperblade tweak (#5721) 2026-05-17 22:38:48 -05:00
MinervaandRadezolid d52b986b63 Assorted typo fixes 1 (#5622)
* Assorted typo fixes 1

* Whoops forgot this one

* Requested changes

* Fix a comment

Signed-off-by: Radezolid <snappednexus@gmail.com>

---------

Signed-off-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-05-18 03:35:41 +00:00
Delta-V bot b74a9884cb Automatic changelog update 2026-05-18 05:12:40 +02:00
keekee38 1cd82ef301 adding pockets to the automaturge robes and flannel jackets (#5646)
* ok functional

* i make prs right before i sleep cause i aint smart
2026-05-18 00:12:20 -03:00
Delta-V bot eadd0f7093 Automatic changelog update 2026-05-18 05:05:41 +02:00
1b643a38bd Nocaf coffee (#5582)
* adds nocaf reagent, nocaf item, and nocaf item to hot drinks vending machine

* Update Resources/Prototypes/Catalog/VendingMachines/Inventories/coffee.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: mazie <dboozlebeep@gmail.com>

* moved drinks.ftl to _DV namespace

* moved drinks.yml to _DV namespace and reordered YAML block to match ss14 conventions

* added drinks_cups.yml to _DV\entites\objects\consumable\drinks and removed references from upstream file

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Signed-off-by: mazie <dboozlebeep@gmail.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-18 00:05:21 -03:00
Delta-V bot 77b96fbf70 Automatic changelog update 2026-05-18 03:28:05 +02:00
Minerva 8c9fb0e082 Tape recorder voice changing in secret stashes (#5629) 2026-05-17 21:27:45 -04:00
Delta-V bot df5f83be5f Automatic changelog update 2026-05-18 02:10:10 +02:00
d2aa5594f1 New/Tweak: Added another Mutation before Deus (#5575)
* Why are there so many seed.yml?

-Sprites
-New entity for nobilis for old deus
-Change deus sprites path to new deus

* Sprite Path + Capitalized A fixes

* suggestion yep

Co-authored-by: Tobias Berger <toby@tobot.dev>
Signed-off-by: Stxcking <217132821+Stxcking@users.noreply.github.com>

* grammar

---------

Signed-off-by: Stxcking <217132821+Stxcking@users.noreply.github.com>
Co-authored-by: Tobias Berger <toby@tobot.dev>
Co-authored-by: Janet Blackquill <uhhadd@gmail.com>
2026-05-17 20:09:50 -04:00
b499f0e1b0 Firebolt (#5825)
* I don't care how big the room is…

* oopsy

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* oopsy part 2

* i should probably fix that

* rsi meta fix

* oh oops

---------

Co-authored-by: hypabeast_ <43hyperbeast@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-17 02:10:09 -04:00
Delta-V bot 97771cc7b9 Automatic changelog update 2026-05-17 07:45:42 +02:00
Radezolid 69f0088bd8 Give headsets to the syndicate visitors (#5698)
* Create common-only headset

* Give the headset to the visitor role
2026-05-17 01:45:22 -04:00
VelcroboyandVelcroboy 323c610f15 Add filled(H20/nutrients) soil beds (#5817)
Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-05-17 01:43:49 -04:00
github-actions[bot]andDeltaV-Bot 47937aa146 Update Credits (#5828)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-05-17 04:34:17 +02:00
Delta-V bot 3c2f992612 Automatic changelog update 2026-05-16 17:21:36 +02:00
TheoandVanessa f519f164f8 Diona Nymph Ghostroles (#5802)
* add ghostrole components and descriptions

* Update Resources/Prototypes/Entities/Mobs/NPCs/animals.yml

Move comments

Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Signed-off-by: Theo <tad3@illinois.edu>

---------

Signed-off-by: Theo <tad3@illinois.edu>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-05-16 15:21:16 +00:00
Delta-V bot 33d47e29ef Automatic changelog update 2026-05-16 17:09:09 +02:00
pathetic meowmeowandpre-commit-ci[bot] 3267b4c2a8 Doorbells (#5799)
* doored bell

* doored bell

* rezept

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-16 10:08:49 -05:00
Delta-V bot 6fda83f4c0 Automatic changelog update 2026-05-15 23:33:00 +02:00
9146c59ecf feat: Fancy Screenshake from Ephemeral Space (#5503)
* cherry-pick: Screenshake (EphemeralSpace/ephemeral-space#627)

* commit your shit at some point maybe

* y

* who knows

* rename?

* debugging  + shit api

* i hope no one fucks my ass

* erm

* p

* replace with shit that makes way more sense

* stuff

* pretty sure this is just fine

* actual fix noise shit

* uhhh hmaybe if i feel like it wrong then later

* explosion shake

* grav shake

* gun shake

* idk

* projectile melee

Co-authored-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>

* tweak: tune recoil on weapons

* docs: add _ES license info to LEGAL.md

* fix: screenshake on spawn fix from ss14Starlight/space-station-14#3664

Co-authored-by: neomoth <69372252+neomoth@users.noreply.github.com>

* feat: add client cvar to disable screenshake

* feat: add screenshake toggle to accessibility settings

* fix: upmerge compatibility

* docs: properly document cvar

* docs: add missing import comments

---------

Co-authored-by: mirrorcult <mirrorcult@pm.me>
Co-authored-by: neomoth <69372252+neomoth@users.noreply.github.com>
2026-05-15 23:32:40 +02:00
VelcroboyandVelcroboy 3a05ef885c Fix Tilewindow CMD (#5816)
* Fix Tilewindow CMD

* Haha...changes

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-05-15 21:43:20 +02:00
Delta-V bot 115c06ba8b Automatic changelog update 2026-05-15 19:18:09 +02:00
da885b1b1d PORT: AAC Tablet Radio Compatibility from Starcup (#5569)
* Allows the AAC to send messages over the radio

* Allows AAC names to be highlighted in chat

* Restores VoiceOverrideComponent to the AAC

* refactor: separate confluent code into new files

Signed-off-by: little-meow-meow <204685920+little-meow-meow@users.noreply.github.com>

* style fix

Signed-off-by: little-meow-meow <204685920+little-meow-meow@users.noreply.github.com>

* Ugh this took me too long to figure out

-Made so many changes to AACTabletBuiState, moved it under _DV: Made it compatible with Wizden #40293 which moved all radio comps and system to shared
-Had issues with having two AAC UI open so made it so one closes before another opens
-Trial and error with the UI window lol

* Reverted Refactor + Comment Clean up

Reverted 0873b66449 which split code between starcup namespace and removed starcup comments because it's editing _DV files.

Fix namespace error due to radio moving the share, seem to work just fine!

---------

Signed-off-by: little-meow-meow <204685920+little-meow-meow@users.noreply.github.com>
Co-authored-by: Oxdeception <9624-oxdeception@users.noreply.gitgud.io>
Co-authored-by: little-meow-meow <204685920+little-meow-meow@users.noreply.github.com>
Co-authored-by: Janet Blackquill <uhhadd@gmail.com>
2026-05-15 17:17:49 +00:00
Delta-V bot 4548e356e5 Automatic changelog update 2026-05-15 18:58:54 +02:00
e334477c2b New/Tweak: Service Borg Module Rework (#5662)
* BorgModuleBureaucracy

* BorgModuleBoxing

* BorgModuleGardeningDV + BorgModuleAdvancedBotany

* BorgModuleChef + BorgAdvancedModuleChef

* BorgModuleBartender + BorgModuleAdvancedBartender

* BorgModuleReporter + BorgModuleFishing

Also tweak the fishing basket and fishing vendor inventory. Why did no one tell me the beer bottles were empty.

* BorgModuleDJ + Portable DAW

Yeah why not add a whole new instrument

* BorgModuleClowningDV

It's almost over

* Clean up

Finally

* More clean up...

I'm tired boss

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* guh

theres probably stuff I missed

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* anchor that up

* unmerge because yaml linter moment

* Kill stamp tag + fix dj set visuals

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Janet Blackquill <uhhadd@gmail.com>
2026-05-15 12:58:34 -04:00
Delta-V bot d5cc6e2136 Automatic changelog update 2026-05-15 18:56:02 +02:00
Theo b0b8b3ad05 RK speech (#5803)
changed mobster accent to mouse transform
2026-05-15 12:55:42 -04:00
Delta-V bot 25e8b301cb Automatic changelog update 2026-05-14 19:08:35 +02:00
Theoandpre-commit-ci[bot] b417bd327c Add tranq and poison ammo for cobra (#5752)
* Add tranq and poison ammo mags for cobra for 4 and 5tc

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* numbers tweaking to make both 4 shots, changed from toxin to heartbreaker toxin

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-14 13:08:14 -04:00
Delta-V bot 9ca9777ce5 Automatic changelog update 2026-05-14 19:03:03 +02:00
Theo a6b1e12d3d syndicate laws in uplink (#5753)
* add da board

* stupid tree

* remove 1 line OUGH
2026-05-14 13:02:42 -04:00
Delta-V bot 641335f316 Automatic changelog update 2026-05-14 03:46:41 +02:00
e80bead714 [new antag] hitman v0.9 (#5506)
* Created Hitman_Case_catalog.yml

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* for hitman

credit:stormyatt. thanks for the help those on discord and the host briefcase

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* for hitman

credit: stormyatt with help from the discord sever and the hos briefcase pr

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* 16/24 items filled

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* for hitman

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* more added

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* top three filled

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* for hitman, full disguise kit

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* 27/30

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* 28/30

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* found the doorjack!

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* spyCrewMonitor is cool

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* found you!

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* for hitman

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* hitman: icons

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* Created Hitman_Case.yml

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* Create Hitman_Briefcase.rsi

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* Delete Resources/Textures/_DV/Objects/Tools/Hitman_Briefcase.rsi

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* fixing it all

* I dont get it either but last of the changes which our just righting things

* Hitman_Case_catalog.yml be like that

* goodbye dupe

* renaming a file and removing a duplicate

* attributions changed to repect the caps

* as requested, name changes and useless line removal

* forgot to control S here

* names changed to try and be both simple and actualy describe the goal

* doing review changes and a small change to prototype order to make sense

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* how did i get where i moved this wrong?

* recharging radio jammer to radio jammer.

---------

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: stormyatt <stormyatt@users.noreply.github.com>
2026-05-13 22:46:21 -03:00
245f9f5713 Salvage Access Only on Salvage Magnet (#5795)
* no more tiders spamming the magnet

* added a little Delta-V thing to it

* Tweak comments

---------

Co-authored-by: AirlineFood <pickeldabfrug@gmail.com>
Co-authored-by: Tobias Berger <toby@tobot.dev>
2026-05-13 22:42:12 -03:00
Radezolid 6c13eee8b9 Add a suffix to the recharging disabler (#5810)
Fix the lack of suffix
2026-05-13 20:21:36 -05:00
BarryNorfolk d62f7cef10 Revert "Nubody Merge" (#5807)
Revert "Nubody Merge (#5670)"

This reverts commit b465cfb3fd.
2026-05-12 21:05:30 +00:00
b465cfb3fd Nubody Merge (#5670)
* Nubody (#42419)

* Nubody

* fix test fails

* gibbing

* lung test returns

* doc comment

* hand organ test

* giblet test

* yaml formatting

* returning

* relocate

* trimming

* re-smite

* oops thusd tweak

* arachnids have slower metabolism i guess

* never mind the old behaviour is bad actually

* rider whyyy

* style changes and allat

* fix collision

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>

* C# files done

* Visual nubody (humanoid appearance refactor) (#42476)

* initial visual nubody

* oops overlay

* im so pheeming rn

* conversion...

* tests

* comeback of the underwear

* oops eyes

* blabbl

* zeds

* yaml linted

* search and visible count constraints

* reordering

* preserve previously selected markings colors

* fix test

* some ui niceties

* ordering

* make DB changes backwards-compatible/downgrade-friendly

* fix things again

* fix migration

* vulpkanin markings limit increase

* wrapping

* code cleanup and more code cleanup and more code cleanup and more code cleanup and

* fix slop ports

* better sampling API

* make filter work + use the method i made for its intended purpose

* fix test fails real quick

* magic mirror cleanup, remove TODO

* don't 0-init the organ profile data

* remove deltastates

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>

* Let vox eat trash again (#42503)

* C# complete port

* Getting closer

* Harpy Nubody Port

* Port Feroxi, Kitsune. Fix some yml typos and remove ipcs stuff

* Port Oni

* Port Rest, except Motorkind

* Port Motorkind

* Remove more surgery, restore too much deleted stuff

* Fix Typos and change some organ names. Need to split eyes next

* Harpy HAve Wings again

* Some fixes, More Surgeyr Removal, Copying of eye organs

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

* Use correct Body imports

* Markings Refactoring, Harpy Layering

* Motorkind doesn't crash anymore. Some layer remappings.

* Allow Organs to have Markings Displacements again. (#43604)

* first shtep

* readd markings support

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>

* Fix STalk eyes and several layerings

* Fix sexed organs (#42554)

* Fix markings for several species, fit them for sexed organs and rename some files to fit them for it

* Additional IPC-related removals

* Vulpkanin eyes are now correct again

* Fix Subtle Cultist Marks on species

* Fix Asakim Sprites (sexed) and make CD imports work

* Migration, error fixes, and Height

* Fix humanoid profile voice being broken (#42550)

Fix humanoid appearance voice being broken

* Change Kitsune SexChanged Event to with ref

* Fix asakim issue, Respirator fix

* Simplify hands UI code (#42534)

* Simplify hands UI code

* i remembered about SortedHands in the component

* minor cleanup

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>

* Set size of Analyzer back to 350, Kitsune can't gib themselves no more. Migration

* yml linter errors and an rudimentary onAdd Organ Functionality

* Fixing it trying to remove nothing

* midpoint migration

* Why do you put so many organs everywhere

* More missing prototypes

* Migration of more organs

* Forgot lungs

* Move character preview handling into a specialized control (#41252)

* Move character preview handling into a specialized control

Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com>

* Restore job name that I accidentally removed from character picker buttons

* Just resolve dependencies the standard way

---------

Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com>
Co-authored-by: Janet Blackquill <uhhadd@gmail.com>

* Drop ICharacterProfile/ICharacterAppearance interfaces (#42661)

* Ensure profile loading only returns valid species (#42842) (Stable merge) (#42865)

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>

* Changes to make it work for us.

* No more bald Harpy

* OperatingTables instead of null

* Adding Delta V Comments, commenting out instead of deleting

* Fix broken Height Scale.

* Remove HumanoidSilicon Mention

* Did an error. Readded, uncommented.

* Clean up Marking data structure, add tests for Zombie transformation (#42756)

* Clean up Marking data structure, add tests for Zombie transformation

* empty

* AAAAAAAAAAAAAAAA

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>

* Fix markings colour setting (#42771)

* Fix: Markings Color For Downstream

* Comment out A Leg. Remove Todo

* Revert to original hidden species code

---------

Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com>
Co-authored-by: Absotively <jen@jenpollock.ca>
Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com>
Co-authored-by: Myra <vasilis@pikachu.systems>
2026-05-12 21:55:29 +02:00
Delta-V bot ea3c31b79d Automatic changelog update 2026-05-12 18:36:50 +02:00
Halo3moth 52ca24747a Xenoborg laser cannon (fix???) (#5661)
boop
2026-05-12 18:36:29 +02:00
Delta-V bot 7e2d8cd8c5 Automatic changelog update 2026-05-12 17:09:28 +02:00
Field Command 90ae0b394e Small fixes to a few shuttles (#5764) 2026-05-12 10:09:04 -05:00
Delta-V bot f25854eeec Automatic changelog update 2026-05-12 17:04:59 +02:00
Field Command 5392d18fe3 Purchasable trade shuttle! (#5789)
Purchasable trade shuttle
2026-05-12 10:04:34 -05:00
Delta-V bot 185b00e09b Automatic changelog update 2026-05-12 05:00:14 +02:00
Sir WarockandJanet Blackquill 3b61986802 Nerf Web Vest Melee Stamina Resistance (#5627)
* Nerf Web Vest Melee Stamina Resistance

* no need to network

---------

Co-authored-by: Janet Blackquill <uhhadd@gmail.com>
2026-05-12 02:59:54 +00:00
Delta-V bot 1adf093ab9 Automatic changelog update 2026-05-12 04:51:35 +02:00
Theo 03814e2bff stealthsuit tweaks (#5739)
added 10% slowdown, increased minimum visibility, stealth not need helmet
2026-05-11 22:51:15 -04:00
Delta-V bot a0a51842d5 Automatic changelog update 2026-05-11 05:21:26 +02:00
BarryNorfolk c55e2acd10 Ensure shields without toggles can still block damage (#5697) 2026-05-11 00:21:06 -03:00
Janet Blackquill 00ceed51dc Better audio attenuation 2026-05-10 11:44:37 -04:00
Kara 6e6123731d Fix door animations (#178) 2026-05-10 11:42:51 -04:00
Delta-V bot 02b540ca34 Automatic changelog update 2026-05-10 17:05:28 +02:00
Stxcking 513b89feb4 Tweak: Made Air Jordans less LRP Bait ( Gorlex Sneakers) (#5786)
* I hate fun

* Oh these should still have this

* Better comments maybe?
2026-05-10 17:05:08 +02:00
Delta-V bot 7ebc5caa6e Automatic changelog update 2026-05-10 16:15:59 +02:00
Theoandpre-commit-ci[bot] f30789e404 add steal eshotgun, ce suit, and hos folder objectives to traitors (#5705)
* add steal eshotgun, ce suit, and hos folder objectives to traitors

* moved namespace

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-05-10 10:15:39 -04:00
Delta-V bot 8a5980902d Automatic changelog update 2026-05-10 16:10:42 +02:00
pathetic meowmeow 3176645b53 Pagers (#5762)
* Pagers

* pagepage :]
2026-05-10 16:10:22 +02:00
Delta-V bot 8930ac52c7 Automatic changelog update 2026-05-10 14:58:01 +02:00
Stxcking fccd3c793f Tweak: Remove Deathsquad Items from Chameleon Whitelist (#5785)
* DS is kill

* Remove organic hardsuit from whitelist

As requested by Bonk. Intentionally kept the helmet as is however.
2026-05-10 07:57:41 -05:00
Delta-V bot a237663f8f Automatic changelog update 2026-05-10 14:54:06 +02:00
Radezolid f34e1d69f0 Add Baba, the scurret bartender (#5791)
* Job stuff

* ID and gear

* Wawa + ghost role locale

* Fix ID + spawner

* Fix handcuff
2026-05-10 07:53:47 -05:00
github-actions[bot]andDeltaV-Bot 8ce3c188b9 Update Credits (#5797)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-05-10 14:13:57 +02:00
Delta-V bot c3c6a6abd9 Automatic changelog update 2026-05-10 13:35:34 +02:00
Stxcking 6f0ad0c181 New: Wallmount Water Dispenser (#5792)
Everything
2026-05-10 13:35:15 +02:00
2796 changed files with 23938 additions and 38057 deletions
+1 -1
View File
@@ -19,7 +19,7 @@
/Content.IntegrationTests/Tests/PostMapInitTest.cs @DeltaV-Station/maptainers
# Server rules
/Resources/ServerInfo/Guidebook/DeltaV/Rules/ @DeltaV-Station/head-administrators
/Resources/ServerInfo/Guidebook/_DV/Rules/ @DeltaV-Station/head-administrators
# Wiki
/.wiki/ @DeltaV-Station/direction
+29
View File
@@ -289,4 +289,33 @@ Emergency alert status. ''Central Command has ordered the Epsilon security level
| style="border: 1px solid #000000;" | Martial Law is in effect. Do not engage with Central Command Personnel. Await orders from Central Command Personnel.
|}
== <span style="color:#ff8119;>Orange Alert</span> ==
Emergency alert status. ''There is a critical station-wide structural or atmospheric threat and recovery is unlikely. Engineering staff are advised to minimize hazards and secure the Evacuation Dock. Crewmembers are advised to stay away from hazardous areas, and prepare for Evacuation.''
{| class="wikitable" style="width: 80%; border: 1px solid #000000;"
!style="text-align:left; width:25%; padding:5px; padding-left:10px; background-color:#FF8119BF; border: 1px solid #000000;" | '''Condition'''
!style="text-align:left; width:75%; padding:5px; padding-left:10px; background-color:#FF8119BF; border: 1px solid #000000;" | '''Description'''
|-
| style="border: 1px solid #000000;" | Chain of Command
| style="border: 1px solid #000000;" | [[Standard_Operating_Procedure#Captain’s_Authority|CO]] > [[Chief Engineer]] > Engineering Personnel > Department Heads > Supervisory Roles
|-
| style="border: 1px solid #000000;" | Armoury Policy
| style="border: 1px solid #000000;" | Issuing of lethal weapons disadvised. EVA protection heavily advised for all personnel.
|-
| style="border: 1px solid #000000;" | Discipline
| style="border: 1px solid #000000;" | Report to supervisor for orders. Non-engineering personnel advised to evacuate affected areas. Security should seek to aid engineering staff where possible.
|-
| style="border: 1px solid #000000;" | Secure Areas
| style="border: 1px solid #000000;" | Secure areas unbolted. [[Standard_Operating_Procedure#High_Security_Areas|HSAs]] and areas with an expectation of privacy, such as bedrooms, dorms, or medical treatment facilities, may be bolted as needed.
|-
| style="border: 1px solid #000000;" | Medical
| style="border: 1px solid #000000;" | Full suit sensors heavily advised. EVA suits and functioning internals recommended for emergency responders.
|-
| style="border: 1px solid #000000;" | Engineering
| style="border: 1px solid #000000;" | EVA suits heavily advised for engineers. Distribute emergency internals to crew. Ensure evacuation as soon as possible.
|-
| style="border: 1px solid #000000;" | Rules of Engagement
| style="border: 1px solid #000000;" | Engage with minimal force required; prioritize de-escalation whenever possible.
|}
{{Guides Menu}}
@@ -269,7 +269,6 @@ Prisoners have certain rights that must be upheld by law enforcement and Station
* Standard prisoner clothing must always be available for prisoners.
* Confiscated clothing should be returned upon request, except in the case of Extended Confinement or if the clothing in question poses a clear risk to prisoner or crew safety.
* Food and water for organic prisoners must be available and given on request.
* Power for silicon prisoners such as IPCs and cyborgs, at minimum a cyborg recharging station must be provided.
* Should the holding cells or Permabrig become uninhabitable, prisoners must be securely and safely relocated to another area for confinement, until the holding cells or Permabrig are returned to a serviceable state.
* Prisoners should be granted freedom of movement within their holding area unless there is an undue risk to life and limb.
-69
View File
@@ -1,76 +1,7 @@
using Content.Shared.Body.Systems;
// Shitmed Change Start
using Content.Shared._Shitmed.Body.Part;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Robust.Client.GameObjects;
using Robust.Shared.Utility;
using Content.Shared.Body.Components;
// Shitmed Change End
namespace Content.Client.Body.Systems;
public sealed class BodySystem : SharedBodySystem
{
// Shitmed Change Start
[Dependency] private readonly MarkingManager _markingManager = default!;
private void ApplyMarkingToPart(MarkingPrototype markingPrototype,
IReadOnlyList<Color>? colors,
bool visible,
SpriteComponent sprite)
{
for (var j = 0; j < markingPrototype.Sprites.Count; j++)
{
var markingSprite = markingPrototype.Sprites[j];
if (markingSprite is not SpriteSpecifier.Rsi rsi)
continue;
var layerId = $"{markingPrototype.ID}-{rsi.RsiState}";
if (!sprite.LayerMapTryGet(layerId, out _))
{
var layer = sprite.AddLayer(markingSprite, j + 1);
sprite.LayerMapSet(layerId, layer);
sprite.LayerSetSprite(layerId, rsi);
}
sprite.LayerSetVisible(layerId, visible);
if (!visible)
continue;
// Okay so if the marking prototype is modified but we load old marking data this may no longer be valid
// and we need to check the index is correct. So if that happens just default to white?
if (colors != null && j < colors.Count)
sprite.LayerSetColor(layerId, colors[j]);
else
sprite.LayerSetColor(layerId, Color.White);
}
}
protected override void ApplyPartMarkings(EntityUid target, BodyPartAppearanceComponent component)
{
if (!TryComp(target, out SpriteComponent? sprite))
return;
if (component.Color != null)
sprite.Color = component.Color.Value;
foreach (var (visualLayer, markingList) in component.Markings)
foreach (var marking in markingList)
{
if (!_markingManager.TryGetMarking(marking, out var markingPrototype))
continue;
ApplyMarkingToPart(markingPrototype, marking.MarkingColors, marking.Visible, sprite);
}
}
protected override void RemoveBodyMarkings(EntityUid target, BodyPartAppearanceComponent partAppearance, HumanoidAppearanceComponent bodyAppearance)
{
return;
}
// Shitmed Change End
}
@@ -2,7 +2,6 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Client.DisplacementMap;
using Content.Client.Inventory;
using Content.Shared._DV.Silicon.IPC; // DeltaV - IPC Snouts
using Content.Shared.Clothing;
using Content.Shared.Clothing.Components;
using Content.Shared.Clothing.EntitySystems;
@@ -103,12 +102,8 @@ public sealed class ClientClothingSystem : ClothingSystem
List<PrototypeLayerData>? layers = null;
// Begin DeltaV Additions - IPC snouts
var speciesId = inventory.SpeciesId;
if (TryComp(args.Equipee, out SnoutHelmetComponent? helmetComponent) && helmetComponent.EnableAlternateHelmet)
speciesId = helmetComponent.ReplacementRace;
// first attempt to get species specific data.
if (speciesId != null)
item.ClothingVisuals.TryGetValue($"{args.Slot}-{speciesId}", out layers);
@@ -120,7 +115,6 @@ public sealed class ClientClothingSystem : ClothingSystem
if (!TryGetDefaultVisuals(uid, item, args.Slot, speciesId, out layers))
return;
}
// End DeltaV Additions
// add each layer to the visuals
var i = 0;
+74 -8
View File
@@ -18,8 +18,36 @@ public sealed class DoorSystem : SharedDoorSystem
{
base.Initialize();
SubscribeLocalEvent<DoorComponent, AppearanceChangeEvent>(OnAppearanceChange);
// ES START
// handle open/close state change on client after animation end, not when server says door is open
SubscribeLocalEvent<DoorComponent, AnimationCompletedEvent>(OnAnimationCompleted);
}
private void OnAnimationCompleted(Entity<DoorComponent> entity, ref AnimationCompletedEvent args)
{
if (!TryComp<SpriteComponent>(entity, out var sprite) || args.Key != DoorComponent.OpenCloseKey)
return;
switch (entity.Comp.State)
{
case DoorState.Open:
foreach (var (layer, layerState) in entity.Comp.OpenSpriteStates)
{
_sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState);
}
break;
case DoorState.Closed:
foreach (var (layer, layerState) in entity.Comp.ClosedSpriteStates)
{
_sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState);
}
break;
}
}
// ES END
protected override void OnComponentInit(Entity<DoorComponent> ent, ref ComponentInit args)
{
var comp = ent.Comp;
@@ -87,10 +115,13 @@ public sealed class DoorSystem : SharedDoorSystem
state = DoorState.Closed;
if (AppearanceSystem.TryGetData<string>(entity, PaintableVisuals.Prototype, out var prototype, args.Component))
UpdateSpriteLayers((entity.Owner, args.Sprite), prototype);
UpdateSpriteLayers((entity.Owner, args.Sprite), prototype);
if (_animationSystem.HasRunningAnimation(entity, DoorComponent.AnimationKey))
_animationSystem.Stop(entity.Owner, DoorComponent.AnimationKey);
// ES START
// dont stop all animations for no reason
//if (_animationSystem.HasRunningAnimation(entity, DoorComponent.AnimationKey))
// _animationSystem.Stop(entity.Owner, DoorComponent.AnimationKey);
// ES END
// We are checking beforehand since some doors may not have an emagging visual layer, and we don't want LayerSetVisible to throw an error.
if (_sprite.TryGetLayer(entity.Owner, DoorVisualLayers.BaseEmagging, out var _, false))
@@ -106,6 +137,12 @@ public sealed class DoorSystem : SharedDoorSystem
switch (state)
{
case DoorState.Open:
// ES START
// If we are already animating the close just let that do its job
if (_animationSystem.HasRunningAnimation(entity, DoorComponent.OpenCloseKey))
return;
// ES END
foreach (var (layer, layerState) in entity.Comp.OpenSpriteStates)
{
_sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState);
@@ -113,6 +150,12 @@ public sealed class DoorSystem : SharedDoorSystem
return;
case DoorState.Closed:
// ES START
// If we are already animating the close just let that do its job
if (_animationSystem.HasRunningAnimation(entity, DoorComponent.OpenCloseKey))
return;
// ES END
foreach (var (layer, layerState) in entity.Comp.ClosedSpriteStates)
{
_sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState);
@@ -123,24 +166,47 @@ public sealed class DoorSystem : SharedDoorSystem
if (entity.Comp.OpeningAnimationTime == TimeSpan.Zero)
return;
_animationSystem.Play(entity, (Animation)entity.Comp.OpeningAnimation, DoorComponent.AnimationKey);
// ES START
// since we dont stop them earlier we check here
if (_animationSystem.HasRunningAnimation(entity, DoorComponent.OpenCloseKey))
return;
// ES END
_animationSystem.Play(entity, (Animation)entity.Comp.OpeningAnimation, DoorComponent.OpenCloseKey);
return;
case DoorState.Closing:
if (entity.Comp.ClosingAnimationTime == TimeSpan.Zero || entity.Comp.CurrentlyCrushing.Count != 0)
return;
_animationSystem.Play(entity, (Animation)entity.Comp.ClosingAnimation, DoorComponent.AnimationKey);
// ES START
// since we dont stop them earlier we check here
if (_animationSystem.HasRunningAnimation(entity, DoorComponent.OpenCloseKey))
return;
// ES END
_animationSystem.Play(entity, (Animation)entity.Comp.ClosingAnimation, DoorComponent.OpenCloseKey);
return;
case DoorState.Denying:
_animationSystem.Play(entity, (Animation)entity.Comp.DenyingAnimation, DoorComponent.AnimationKey);
// ES START
// AnimationKey -> DenyKey
if (_animationSystem.HasRunningAnimation(entity, DoorComponent.DenyKey))
return;
_animationSystem.Play(entity, (Animation)entity.Comp.DenyingAnimation, DoorComponent.DenyKey);
// ES END
return;
case DoorState.Emagging:
// We are checking beforehand since some doors may not have an emagging visual layer.
// ES START
// AnimationKey -> DenyKey
if (_animationSystem.HasRunningAnimation(entity, DoorComponent.EmagKey))
return;
if (_sprite.TryGetLayer(entity.Owner, DoorVisualLayers.BaseEmagging, out var _, false))
_animationSystem.Play(entity, (Animation)entity.Comp.EmaggingAnimation, DoorComponent.AnimationKey);
_animationSystem.Play(entity, (Animation)entity.Comp.EmaggingAnimation, DoorComponent.EmagKey);
// ES END
return;
}
+36 -5
View File
@@ -36,6 +36,9 @@ public sealed class EyeLerpingSystem : EntitySystem
UpdatesAfter.Add(typeof(TransformSystem));
UpdatesAfter.Add(typeof(Robust.Client.Physics.PhysicsSystem));
UpdatesBefore.Add(typeof(SharedEyeSystem));
// ES START
UpdatesBefore.Add(typeof(EyeSystem));
// ES END
UpdatesOutsidePrediction = true;
}
@@ -68,6 +71,11 @@ public sealed class EyeLerpingSystem : EntitySystem
{
_eye.SetRotation(uid, lerpInfo.TargetRotation, component);
_eye.SetZoom(uid, lerpInfo.TargetZoom, component);
// Starlight begin - fix ES Screenshake triggering on spawn
if (TryComp<ContentEyeComponent>(uid, out var contentEye))
contentEye.BaseRotation = lerpInfo.TargetRotation;
// Starlight end
}
}
@@ -175,9 +183,15 @@ public sealed class EyeLerpingSystem : EntitySystem
{
var tickFraction = (float) _gameTiming.TickFraction / ushort.MaxValue;
const double lerpMinimum = 0.00001;
var query = AllEntityQuery<LerpingEyeComponent, EyeComponent, TransformComponent>();
// ES START
// add contenteye bc we only want to modify the fuckin base rotation
var query = AllEntityQuery<LerpingEyeComponent, EyeComponent, ContentEyeComponent, TransformComponent>();
// ES END
while (query.MoveNext(out var entity, out var lerpInfo, out var eye, out var xform))
// ES START
// contenteye
while (query.MoveNext(out var entity, out var lerpInfo, out var eye, out var contentEye, out var xform))
// ES END
{
// Handle zoom
var zoomDiff = Vector2.Lerp(lerpInfo.LastZoom, lerpInfo.TargetZoom, tickFraction);
@@ -191,6 +205,14 @@ public sealed class EyeLerpingSystem : EntitySystem
_eye.SetZoom(entity, zoomDiff, eye);
}
// ES START
// UHHHHHHHHHHHh
// shit is fucked idk
// we need to alter baserotation not regular eye rotation and also i added baserotation because uhh
// there was no good way to separate 'how the eye should be oriented because of the grid/turning/etc' and 'the eye rotating on top of that'
// had to add it
// ES END
// Handle Rotation
TryComp<InputMoverComponent>(entity, out var mover);
@@ -199,7 +221,10 @@ public sealed class EyeLerpingSystem : EntitySystem
if (!NeedsLerp(mover))
{
_eye.SetRotation(entity, lerpInfo.TargetRotation, eye);
// ES START
// contenteye
contentEye.BaseRotation = lerpInfo.TargetRotation;
// ES END
continue;
}
@@ -207,11 +232,17 @@ public sealed class EyeLerpingSystem : EntitySystem
if (Math.Abs(shortest.Theta) < lerpMinimum)
{
_eye.SetRotation(entity, lerpInfo.TargetRotation, eye);
// ES START
// contenteye
contentEye.BaseRotation = lerpInfo.TargetRotation;
// ES END
continue;
}
_eye.SetRotation(entity, shortest * tickFraction + lerpInfo.LastRotation, eye);
// ES START
// contenteye
contentEye.BaseRotation = shortest * tickFraction + lerpInfo.LastRotation;
// ES END
}
}
}
@@ -1,11 +1,9 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Shared._Shitmed.Body.Events; // Shitmed Change
using Content.Client.DisplacementMap;
using Content.Client.Examine;
using Content.Client.Strip;
using Content.Client.Verbs.UI;
using Content.Shared.Body.Part; // Shitmed Change
using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
@@ -51,8 +49,6 @@ namespace Content.Client.Hands.Systems
SubscribeLocalEvent<HandsComponent, ComponentShutdown>(OnHandsShutdown);
SubscribeLocalEvent<HandsComponent, ComponentHandleState>(HandleComponentState);
SubscribeLocalEvent<HandsComponent, VisualsChangedEvent>(OnVisualsChanged);
SubscribeLocalEvent<HandsComponent, BodyPartRemovedEvent>(HandleBodyPartRemoved); // Shitmed Change
SubscribeLocalEvent<HandsComponent, BodyPartDisabledEvent>(HandleBodyPartDisabled); // Shitmed Change
OnHandSetActive += OnHandActivated;
}
@@ -206,35 +202,6 @@ namespace Content.Client.Hands.Systems
#region visuals
// Shitmed Change Start
private void HideLayers(EntityUid uid, HandsComponent component, Entity<BodyPartComponent> part, SpriteComponent? sprite = null)
{
if (part.Comp.PartType != BodyPartType.Hand || !Resolve(uid, ref sprite, logMissing: false))
return;
var location = part.Comp.Symmetry switch
{
BodyPartSymmetry.None => HandLocation.Middle,
BodyPartSymmetry.Left => HandLocation.Left,
BodyPartSymmetry.Right => HandLocation.Right,
_ => throw new ArgumentOutOfRangeException(nameof(part.Comp.Symmetry))
};
if (component.RevealedLayers.TryGetValue(location, out var revealedLayers))
{
foreach (var key in revealedLayers)
sprite.RemoveLayer(key);
revealedLayers.Clear();
}
}
private void HandleBodyPartRemoved(EntityUid uid, HandsComponent component, ref BodyPartRemovedEvent args) => HideLayers(uid, component, args.Part);
private void HandleBodyPartDisabled(EntityUid uid, HandsComponent component, ref BodyPartDisabledEvent args) => HideLayers(uid, component, args.Part);
// Shitmed Change End
protected override void HandleEntityInserted(EntityUid uid, HandsComponent hands, EntInsertedIntoContainerMessage args)
{
base.HandleEntityInserted(uid, hands, args);
@@ -1,7 +1,6 @@
using Content.Shared.MedicalScanner;
using Content.Shared._Shitmed.Targeting; // Shitmed Change
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
using JetBrains.Annotations;
using Content.Shared._DV.MedicalRecords;
using JetBrains.Annotations; // DeltaV - Medical Records
using Robust.Client.UserInterface;
namespace Content.Client.HealthAnalyzer.UI
@@ -21,13 +20,11 @@ namespace Content.Client.HealthAnalyzer.UI
base.Open();
_window = this.CreateWindow<HealthAnalyzerWindow>();
_window.HealthAnalyzer.OnBodyPartSelected += SendBodyPartMessage; // Shitmed Change
_window.HealthAnalyzer.OnTriageStatusChanged += SendTriageStatusMessage; // DeltaV - Medical Records
_window.HealthAnalyzer.OnClaimPatient += SendTriageClaimMessage; // DeltaV - Medical Records
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
}
protected override void ReceiveMessage(BoundUserInterfaceMessage message)
{
if (_window == null)
@@ -39,22 +36,6 @@ namespace Content.Client.HealthAnalyzer.UI
_window.Populate(cast);
}
// Shitmed Change Start
private void SendBodyPartMessage(TargetBodyPart? part, EntityUid target) => SendMessage(new HealthAnalyzerPartMessage(EntMan.GetNetEntity(target), part ?? null));
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (!disposing)
return;
if (_window != null)
_window.HealthAnalyzer.OnBodyPartSelected -= SendBodyPartMessage;
_window?.Dispose();
}
// Shitmed Change End
// Begin DeltaV - Medical Records
private void SendTriageStatusMessage(TriageStatus status)
=> SendMessage(new HealthAnalyzerTriageStatusMessage(status));
@@ -6,160 +6,12 @@
Name="NoPatientDataText"
Text="{Loc health-analyzer-window-no-patient-data-text}" />
<!-- Shitmed Change Start -->
<Button Name="ReturnButton"
Text="{Loc 'health-analyzer-window-return-button-text'}"
Margin="0 0 0 10"
HorizontalExpand="False"/>
<!-- Shitmed Change End -->
<BoxContainer
Name="PatientDataContainer"
Margin="0 0 0 5"
Orientation="Vertical">
<BoxContainer Orientation="Horizontal" Margin="0 0 0 5">
<PanelContainer>
<!-- Shitmed Change Start -->
<SpriteView OverrideDirection="South" Name="SpriteView" Access="Public" SetSize="96 96" />
<PanelContainer
Name="PartView"
SetSize="57 96"
Margin="18 0 0 0"
VerticalAlignment="Center"
HorizontalAlignment="Left">
<PanelContainer
SetSize="15 33"
Margin="4 0 0 0"
HorizontalAlignment="Left">
<TextureButton
Name="RightArmButton"
MinSize="15 25"
StyleClasses="TargetDollButtonRightArm"
VerticalAlignment="Top">
</TextureButton>
<TextureButton
Name="RightHandButton"
MinSize="15 15"
VerticalAlignment="Bottom"
StyleClasses="TargetDollButtonRightHand">
</TextureButton>
</PanelContainer>
<PanelContainer
SetSize="43 75"
Margin="0 0 0 0"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<TextureButton
Name="HeadButton"
MinSize="28 23"
VerticalAlignment="Top"
HorizontalAlignment="Center"
StyleClasses="TargetDollButtonHead">
<!--<PanelContainer
SetSize="14 15"
Margin="-1 9 0 0"
HorizontalAlignment="Center">
<TextureButton
Name="EyesButton"
MinSize="14 9"
VerticalAlignment="Top"
StyleClasses="TargetDollButtonEyes">
<TextureRect
TexturePath="/Textures/Interface/Targeting/Doll/eyes.png"
Stretch="KeepAspectCentered"
SetSize="14 9"/>
</TextureButton>
<TextureButton
Name="MouthButton"
SetSize="8 6"
VerticalAlignment="Bottom"
StyleClasses="TargetDollButtonMouth">
<TextureRect
TexturePath="/Textures/Interface/Targeting/Doll/mouth.png"
Stretch="KeepAspectCentered"
SetSize="8 6"/>
</TextureButton>
</PanelContainer>-->
</TextureButton>
<TextureButton
Name="ChestButton"
SetSize="28 30"
Margin="0 18 0 0"
VerticalAlignment="Top"
HorizontalAlignment="Center"
StyleClasses="TargetDollButtonChest">
</TextureButton>
<PanelContainer
MinSize="38 35"
VerticalAlignment="Bottom"
HorizontalAlignment="Center">
<TextureButton
Name="GroinButton"
MinSize="28 15"
VerticalAlignment="Top"
HorizontalAlignment="Center"
StyleClasses="TargetDollButtonGroin">
</TextureButton>
<PanelContainer
MinSize="20 30"
VerticalAlignment="Bottom"
HorizontalAlignment="Right">
<TextureButton
Name="LeftLegButton"
MinSize="15 28"
VerticalAlignment="Top"
HorizontalAlignment="Left"
StyleClasses="TargetDollButtonLeftLeg">
</TextureButton>
<TextureButton
Name="LeftFootButton"
MinSize="20 10"
VerticalAlignment="Bottom"
StyleClasses="TargetDollButtonLeftFoot">
</TextureButton>
</PanelContainer>
<PanelContainer
MinSize="20 30"
VerticalAlignment="Bottom"
HorizontalAlignment="Left">
<TextureButton
Name="RightLegButton"
MinSize="15 28"
VerticalAlignment="Top"
HorizontalAlignment="Right"
StyleClasses="TargetDollButtonRightLeg">
</TextureButton>
<TextureButton
Name="RightFootButton"
MinSize="20 10"
VerticalAlignment="Bottom"
HorizontalAlignment="Center"
StyleClasses="TargetDollButtonRightFoot">
</TextureButton>
</PanelContainer>
</PanelContainer>
</PanelContainer>
<PanelContainer
SetSize="15 33"
Margin="0 0 4 0"
HorizontalAlignment="Right">
<TextureButton
Name="LeftArmButton"
MinSize="15 25"
StyleClasses="TargetDollButtonLeftArm"
VerticalAlignment="Top">
</TextureButton>
<TextureButton
Name="LeftHandButton"
MinSize="15 15"
VerticalAlignment="Bottom"
StyleClasses="TargetDollButtonLeftHand">
</TextureButton>
</PanelContainer>
</PanelContainer>
</PanelContainer>
<!-- Shitmed Change Start -->
<TextureRect Name="NoDataTex" Access="Public" SetSize="96 96" Visible="false" Stretch="KeepAspectCentered" TexturePath="/Textures/Interface/Misc/health_analyzer_out_of_range.png"/> <!-- DeltaV - Size changed to 96 96 to be consistent with shitmed -->
<TextureRect Name="NoDataTex" Access="Public" SetSize="96 96" Visible="false" Stretch="KeepAspectCentered" TexturePath="/Textures/Interface/Misc/health_analyzer_out_of_range.png"/> <!-- DeltaV - Size changed to 96-->
<BoxContainer Margin="5 0 0 0" Orientation="Vertical" VerticalAlignment="Top">
<RichTextLabel Name="NameLabel" SetWidth="150" />
<Label Name="SpeciesLabel" VerticalAlignment="Top" StyleClasses="LabelSubText" />
@@ -24,7 +24,6 @@ using Content.Client._DV.Traits.Assorted; // DeltaV
using Content.Shared._DV.Traits.Assorted; // DeltaV
using Content.Shared._DV.Medical; // DeltaV - Uncloneable
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
using Content.Shared._Shitmed.Targeting; // Shitmed
// Health analyzer UI is split from its window because it's used by both the
// health analyzer item and the cryo pod UI.
@@ -41,16 +40,6 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
private readonly RedshirtSystem _redshirt; // DeltaV
private readonly UncloneableSystem _uncloneable; // DeltaV
// Shitmed Change Start
public event Action<TargetBodyPart?, EntityUid>? OnBodyPartSelected;
private EntityUid _spriteViewEntity;
private readonly EntProtoId _bodyView = "AlertSpriteView";
private readonly Dictionary<TargetBodyPart, TextureButton> _bodyPartControls;
private EntityUid? _target;
// Shitmed Change End
// Begin DeltaV - Medical Records
private readonly ButtonGroup _triageStatusGroup = new();
private readonly Dictionary<TriageStatus, Button> _triageControls = new();
@@ -72,29 +61,6 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
_unborgable = _entityManager.System<UnborgableSystem>(); // DeltaV
_redshirt = _entityManager.System<RedshirtSystem>(); // DeltaV
_uncloneable = _entityManager.System<UncloneableSystem>(); // DeltaV
// Shitmed Change Start
_bodyPartControls = new Dictionary<TargetBodyPart, TextureButton>
{
{ TargetBodyPart.Head, HeadButton },
{ TargetBodyPart.Torso, ChestButton },
{ TargetBodyPart.Groin, GroinButton },
{ TargetBodyPart.LeftArm, LeftArmButton },
{ TargetBodyPart.LeftHand, LeftHandButton },
{ TargetBodyPart.RightArm, RightArmButton },
{ TargetBodyPart.RightHand, RightHandButton },
{ TargetBodyPart.LeftLeg, LeftLegButton },
{ TargetBodyPart.LeftFoot, LeftFootButton },
{ TargetBodyPart.RightLeg, RightLegButton },
{ TargetBodyPart.RightFoot, RightFootButton },
};
foreach (var bodyPartButton in _bodyPartControls)
{
bodyPartButton.Value.MouseFilter = MouseFilterMode.Stop;
bodyPartButton.Value.OnPressed += _ => SetActiveBodyPart(bodyPartButton.Key, bodyPartButton.Value);
}
ReturnButton.OnPressed += _ => ResetBodyPart();
// Shitmed Change End
// Begin DeltaV - Medical Records
foreach (var item in Enum.GetValues<TriageStatus>())
@@ -120,29 +86,14 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
public void Populate(HealthAnalyzerUiState state)
{
var target = _entityManager.GetEntity(state.TargetEntity);
// Begin Shitmed
_target = target;
EntityUid? part = state.Part != null ? _entityManager.GetEntity(state.Part.Value) : null;
var isPart = part != null;
// End Shitmed
if (target == null
|| !_entityManager.TryGetComponent<DamageableComponent>(isPart ? part : target, out var damageable)) // Shitmed
|| !_entityManager.TryGetComponent<DamageableComponent>(target, out var damageable))
{
NoPatientDataText.Visible = true;
return;
}
// Begin Shitmed
ReturnButton.Visible = isPart;
PartNameLabel.Visible = isPart;
if (part != null)
PartNameLabel.Text = _entityManager.HasComponent<MetaDataComponent>(part)
? Identity.Name(part.Value, _entityManager)
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
// End Shitmed
NoPatientDataText.Visible = false;
// Scan Mode
@@ -157,11 +108,6 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
// Patient Information
SpriteView.SetEntity(SetupIcon(state.Body) ?? target.Value); // Shitmed Change
SpriteView.Visible = state.ScanMode.HasValue && state.ScanMode.Value;
PartView.Visible = SpriteView.Visible; // Shitmed Change
NoDataTex.Visible = !SpriteView.Visible;
var name = new FormattedMessage();
name.PushColor(Color.White);
name.AddText(_entityManager.HasComponent<MetaDataComponent>(target.Value)
@@ -338,65 +284,6 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
}
}
// Shitmed Change Start
public void SetActiveBodyPart(TargetBodyPart part, TextureButton button)
{
if (_target == null)
return;
// Bit of the ole shitcode until we have Groins in the prototypes.
OnBodyPartSelected?.Invoke(part == TargetBodyPart.Groin ? TargetBodyPart.Torso : part, _target.Value);
}
public void ResetBodyPart()
{
if (_target == null)
return;
OnBodyPartSelected?.Invoke(null, _target.Value);
}
public void SetActiveButtons(bool isHumanoid)
{
foreach (var button in _bodyPartControls)
button.Value.Visible = isHumanoid;
}
/// <summary>
/// Sets up the Body Doll using Alert Entity to use in Health Analyzer.
/// </summary>
private EntityUid? SetupIcon(Dictionary<TargetBodyPart, TargetIntegrity>? body)
{
if (body is null)
return null;
if (!_entityManager.Deleted(_spriteViewEntity))
_entityManager.QueueDeleteEntity(_spriteViewEntity);
_spriteViewEntity = _entityManager.Spawn(_bodyView);
if (!_entityManager.TryGetComponent<SpriteComponent>(_spriteViewEntity, out var sprite))
return null;
int layer = 0;
foreach (var (bodyPart, integrity) in body)
{
// TODO: PartStatusUIController and make it use layers instead of TextureRects when EE refactors alerts.
string enumName = Enum.GetName(typeof(TargetBodyPart), bodyPart) ?? "Unknown";
int enumValue = (int) integrity;
var rsi = new SpriteSpecifier.Rsi(new ResPath($"/Textures/_Shitmed/Interface/Targeting/Status/{enumName.ToLowerInvariant()}.rsi"), $"{enumName.ToLowerInvariant()}_{enumValue}");
// Shitcode with love from Russia :)
if (!_spriteSystem.TryGetLayer(_spriteViewEntity, layer, out _, false))
_spriteSystem.AddTextureLayer(_spriteViewEntity, _spriteSystem.Frame0(rsi));
else
_spriteSystem.LayerSetTexture(_spriteViewEntity, layer, _spriteSystem.Frame0(rsi));
_spriteSystem.LayerSetScale(_spriteViewEntity, layer, new Vector2(3f, 3f));
layer++;
}
return _spriteViewEntity;
}
// Shitmed Change End
private Texture GetTexture(string texture)
{
var rsiPath = new ResPath("/Textures/Objects/Devices/health_analyzer.rsi");
@@ -3,7 +3,7 @@
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:ui="clr-namespace:Content.Client.HealthAnalyzer.UI"
MaxHeight="525"
MinWidth="350"> <!-- Shitmed Change -->
MinWidth="300">
<ScrollContainer
Margin="5 5 5 5"
ReturnMeasure="True"
@@ -11,6 +11,6 @@
<ui:HealthAnalyzerControl
Name="HealthAnalyzer"
Access="Public" /> <!-- DeltaV / Shitmed Change - Make Public-->
Access="Public" /> <!-- DeltaV -->
</ScrollContainer>
</controls:FancyWindow>
@@ -88,8 +88,7 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
foreach (var (key, info) in component.CustomBaseLayers)
{
oldLayers.Remove(key);
// Shitmed Change: For whatever reason these weren't actually ignoring the skin color as advertised.
SetLayerData(entity, key, info.Id, sexMorph: false, color: info.Color, overrideSkin: true);
SetLayerData(entity, key, info.Id, sexMorph: false, color: info.Color);
}
// hide old layers
@@ -106,8 +105,7 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
HumanoidVisualLayers key,
string? protoId,
bool sexMorph = false,
Color? color = null,
bool overrideSkin = false) // Shitmed Change
Color? color = null)
{
var component = entity.Comp1;
var sprite = entity.Comp2;
@@ -128,7 +126,7 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
var proto = _prototypeManager.Index<HumanoidSpeciesSpriteLayer>(protoId);
component.BaseLayers[key] = proto;
if (proto.MatchSkin && !overrideSkin) // Shitmed Change
if (proto.MatchSkin)
layer.Color = component.SkinColor.WithAlpha(proto.LayerAlpha);
if (proto.BaseSprite != null)
-12
View File
@@ -98,18 +98,6 @@ namespace Content.Client.Input
human.AddFunction(ContentKeyFunctions.Arcade1);
human.AddFunction(ContentKeyFunctions.Arcade2);
human.AddFunction(ContentKeyFunctions.Arcade3);
// Shitmed Change Start - TODO: Add hands, feet and groin targeting.
human.AddFunction(ContentKeyFunctions.TargetHead);
human.AddFunction(ContentKeyFunctions.TargetTorso);
human.AddFunction(ContentKeyFunctions.TargetLeftArm);
human.AddFunction(ContentKeyFunctions.TargetLeftHand);
human.AddFunction(ContentKeyFunctions.TargetRightArm);
human.AddFunction(ContentKeyFunctions.TargetRightHand);
human.AddFunction(ContentKeyFunctions.TargetLeftLeg);
human.AddFunction(ContentKeyFunctions.TargetLeftFoot);
human.AddFunction(ContentKeyFunctions.TargetRightLeg);
human.AddFunction(ContentKeyFunctions.TargetRightFoot);
// Shitmed Change End
// actions should be common (for ghosts, mobs, etc)
common.AddFunction(ContentKeyFunctions.OpenActionsMenu);
@@ -6,7 +6,6 @@ using Content.Shared.Interaction;
using Content.Shared.Inventory;
using Content.Shared.Inventory.Events;
using Content.Shared.Storage;
using Content.Shared._Shitmed.Targeting.Events; // Shitmed
using JetBrains.Annotations;
using Robust.Client.Player;
using Robust.Client.UserInterface;
@@ -21,8 +21,11 @@ public sealed class SignalTimerBoundUserInterface : BoundUserInterface
_window = this.CreateWindow<SignalTimerWindow>();
_window.OnStartTimer += StartTimer;
_window.OnCurrentTextChanged += OnTextChanged;
_window.OnCurrentDelayMinutesChanged += OnDelayChanged;
_window.OnCurrentDelaySecondsChanged += OnDelayChanged;
// Begin Monolith
// _window.OnCurrentDelayMinutesChanged += OnDelayChanged;
// _window.OnCurrentDelaySecondsChanged += OnDelayChanged;
_window.OnCurrentDelayChanged += OnDelayChanged;
// End Monolith
}
public void StartTimer()
@@ -35,11 +38,11 @@ public sealed class SignalTimerBoundUserInterface : BoundUserInterface
SendMessage(new SignalTimerTextChangedMessage(newText));
}
private void OnDelayChanged(string newDelay)
private void OnDelayChanged(TimeSpan newDelay) // Monolith - Change from string to TimeSpan
{
if (_window == null)
return;
SendMessage(new SignalTimerDelayChangedMessage(_window.GetDelay()));
SendMessage(new SignalTimerDelayChangedMessage(newDelay)); // Mono
}
/// <summary>
@@ -54,8 +57,11 @@ public sealed class SignalTimerBoundUserInterface : BoundUserInterface
return;
_window.SetCurrentText(cast.CurrentText);
_window.SetCurrentDelayMinutes(cast.CurrentDelayMinutes);
_window.SetCurrentDelaySeconds(cast.CurrentDelaySeconds);
// Begin Monolith
// _window.SetCurrentDelayMinutes(cast.CurrentDelayMinutes);
// _window.SetCurrentDelaySeconds(cast.CurrentDelaySeconds);
_window.SetCurrentDelay(cast.CurrentDelay);
// End Monolith
_window.SetShowText(cast.ShowText);
_window.SetTriggerTime(cast.TriggerTime);
_window.SetTimerStarted(cast.TimerStarted);
@@ -7,10 +7,14 @@
</BoxContainer>
<BoxContainer Name="DelayEdit" Orientation="Horizontal">
<Label Name="CurrentDelay" Text="{Loc signal-timer-menu-delay}" />
<!-- Mono: Changed from integer MM:SS to float seconds
<LineEdit Name="CurrentDelayEditMinutes" MinWidth="32" />
<Label Name="Colon" Text=":" />
<LineEdit Name="CurrentDelayEditSeconds" MinWidth="32" />
<Label Name="DelayInfo" Text=" (mm:ss)" />
-->
<FloatSpinBox Name="CurrentDelayEdit" MinWidth="32" />
<Label Text="s" />
</BoxContainer>
<Button Name="StartTimer" Text="{Loc signal-timer-menu-start}" />
</BoxContainer>
@@ -15,8 +15,11 @@ public sealed partial class SignalTimerWindow : DefaultWindow
private const int MaxTextLength = 5;
public event Action<string>? OnCurrentTextChanged;
public event Action<string>? OnCurrentDelayMinutesChanged;
public event Action<string>? OnCurrentDelaySecondsChanged;
// Begin Monolith
// public event Action<string>? OnCurrentDelayMinutesChanged;
// public event Action<string>? OnCurrentDelaySecondsChanged;
public event Action<TimeSpan>? OnCurrentDelayChanged;
// End Monolith
private TimeSpan? _triggerTime;
@@ -30,8 +33,11 @@ public sealed partial class SignalTimerWindow : DefaultWindow
IoCManager.InjectDependencies(this);
CurrentTextEdit.OnTextChanged += e => OnCurrentTextChange(e.Text);
CurrentDelayEditMinutes.OnTextChanged += e => OnCurrentDelayMinutesChange(e.Text);
CurrentDelayEditSeconds.OnTextChanged += e => OnCurrentDelaySecondsChange(e.Text);
// Begin Monolith
// CurrentDelayEditMinutes.OnTextChanged += e => OnCurrentDelayMinutesChange(e.Text);
// CurrentDelayEditSeconds.OnTextChanged += e => OnCurrentDelaySecondsChange(e.Text);
CurrentDelayEdit.OnValueChanged += e => CurrentDelayChange(TimeSpan.FromSeconds(e.Value));
// End Monolith
StartTimer.OnPressed += _ => StartTimerWeh();
}
@@ -77,81 +83,93 @@ public sealed partial class SignalTimerWindow : DefaultWindow
OnCurrentTextChanged?.Invoke(text);
}
public void OnCurrentDelayMinutesChange(string text)
// Begin Monolith
// public void OnCurrentDelayMinutesChange(string text)
// {
// List<char> toRemove = new();
// foreach (var a in text)
// {
// if (!char.IsDigit(a))
// toRemove.Add(a);
// }
// foreach (var a in toRemove)
// {
// CurrentDelayEditMinutes.Text = text.Replace(a.ToString(),"");
// }
// if (CurrentDelayEditMinutes.Text == "")
// return;
// while (CurrentDelayEditMinutes.Text[0] == '0' && CurrentDelayEditMinutes.Text.Length > 2)
// {
// CurrentDelayEditMinutes.Text = CurrentDelayEditMinutes.Text.Remove(0, 1);
// }
// if (CurrentDelayEditMinutes.Text.Length > 2)
// {
// CurrentDelayEditMinutes.Text = CurrentDelayEditMinutes.Text.Remove(2);
// }
// OnCurrentDelayMinutesChanged?.Invoke(CurrentDelayEditMinutes.Text);
// }
// public void OnCurrentDelaySecondsChange(string text)
// {
// List<char> toRemove = new();
// foreach (var a in text)
// {
// if (!char.IsDigit(a))
// toRemove.Add(a);
// }
// foreach (var a in toRemove)
// {
// CurrentDelayEditSeconds.Text = text.Replace(a.ToString(), "");
// }
// if (CurrentDelayEditSeconds.Text == "")
// return;
// while (CurrentDelayEditSeconds.Text[0] == '0' && CurrentDelayEditSeconds.Text.Length > 2)
// {
// CurrentDelayEditSeconds.Text = CurrentDelayEditSeconds.Text.Remove(0, 1);
// }
// if (CurrentDelayEditSeconds.Text.Length > 2)
// {
// CurrentDelayEditSeconds.Text = CurrentDelayEditSeconds.Text.Remove(2);
// }
// OnCurrentDelaySecondsChanged?.Invoke(CurrentDelayEditSeconds.Text);
// }
public void CurrentDelayChange(TimeSpan newValue)
{
List<char> toRemove = new();
foreach (var a in text)
{
if (!char.IsDigit(a))
toRemove.Add(a);
}
foreach (var a in toRemove)
{
CurrentDelayEditMinutes.Text = text.Replace(a.ToString(),"");
}
if (CurrentDelayEditMinutes.Text == "")
return;
while (CurrentDelayEditMinutes.Text[0] == '0' && CurrentDelayEditMinutes.Text.Length > 2)
{
CurrentDelayEditMinutes.Text = CurrentDelayEditMinutes.Text.Remove(0, 1);
}
if (CurrentDelayEditMinutes.Text.Length > 2)
{
CurrentDelayEditMinutes.Text = CurrentDelayEditMinutes.Text.Remove(2);
}
OnCurrentDelayMinutesChanged?.Invoke(CurrentDelayEditMinutes.Text);
}
public void OnCurrentDelaySecondsChange(string text)
{
List<char> toRemove = new();
foreach (var a in text)
{
if (!char.IsDigit(a))
toRemove.Add(a);
}
foreach (var a in toRemove)
{
CurrentDelayEditSeconds.Text = text.Replace(a.ToString(), "");
}
if (CurrentDelayEditSeconds.Text == "")
return;
while (CurrentDelayEditSeconds.Text[0] == '0' && CurrentDelayEditSeconds.Text.Length > 2)
{
CurrentDelayEditSeconds.Text = CurrentDelayEditSeconds.Text.Remove(0, 1);
}
if (CurrentDelayEditSeconds.Text.Length > 2)
{
CurrentDelayEditSeconds.Text = CurrentDelayEditSeconds.Text.Remove(2);
}
OnCurrentDelaySecondsChanged?.Invoke(CurrentDelayEditSeconds.Text);
OnCurrentDelayChanged?.Invoke(newValue);
}
// End Monolith
public void SetCurrentText(string text)
{
CurrentTextEdit.Text = text;
}
// Begin Monolith
// public void SetCurrentDelayMinutes(string delay)
// {
// CurrentDelayEditMinutes.Text = delay;
// }
public void SetCurrentDelayMinutes(string delay)
// public void SetCurrentDelaySeconds(string delay)
// {
// CurrentDelayEditSeconds.Text = delay;
// }
public void SetCurrentDelay(TimeSpan delay)
{
CurrentDelayEditMinutes.Text = delay;
CurrentDelayEdit.Value = (float)delay.TotalSeconds;
}
public void SetCurrentDelaySeconds(string delay)
{
CurrentDelayEditSeconds.Text = delay;
}
// End Monolith
public void SetShowText(bool showTime)
{
TextEdit.Visible = showTime;
@@ -176,8 +194,10 @@ public sealed partial class SignalTimerWindow : DefaultWindow
public void SetHasAccess(bool hasAccess)
{
CurrentTextEdit.Editable = hasAccess;
CurrentDelayEditMinutes.Editable = hasAccess;
CurrentDelayEditSeconds.Editable = hasAccess;
// Begin Monolith
// CurrentDelayEditMinutes.Editable = hasAccess;
// CurrentDelayEditSeconds.Editable = hasAccess;
// End Monolith
StartTimer.Disabled = !hasAccess;
}
@@ -186,10 +206,13 @@ public sealed partial class SignalTimerWindow : DefaultWindow
/// </summary>
public TimeSpan GetDelay()
{
if (!double.TryParse(CurrentDelayEditMinutes.Text, out var minutes))
minutes = 0;
if (!double.TryParse(CurrentDelayEditSeconds.Text, out var seconds))
seconds = 0;
return TimeSpan.FromMinutes(minutes) + TimeSpan.FromSeconds(seconds);
// Begin Monolith
// if (!double.TryParse(CurrentDelayEditMinutes.Text, out var minutes))
// minutes = 0;
// if (!double.TryParse(CurrentDelayEditSeconds.Text, out var seconds))
// seconds = 0;
// return TimeSpan.FromMinutes(minutes) + TimeSpan.FromSeconds(seconds);
return TimeSpan.FromSeconds(CurrentDelayEdit.Value);
// End Monolith
}
}
@@ -60,6 +60,9 @@ public sealed class ContentEyeSystem : SharedContentEyeSystem
while (eyeEntities.MoveNext(out var entity, out ContentEyeComponent? contentComponent, out EyeComponent? eyeComponent))
{
UpdateEyeOffset((entity, eyeComponent));
// ES START
UpdateEyeRotation((entity, eyeComponent));
// ES END
}
}
@@ -71,6 +74,9 @@ public sealed class ContentEyeSystem : SharedContentEyeSystem
while (eyeEntities.MoveNext(out var entity, out ContentEyeComponent? contentComponent, out EyeComponent? eyeComponent))
{
UpdateEyeOffset((entity, eyeComponent));
// ES START
UpdateEyeRotation((entity, eyeComponent));
// ES END
}
}
}
@@ -7,6 +7,7 @@
<Label Text="{Loc 'ui-options-accessability-header-visuals'}"
StyleClasses="LabelKeyText"/>
<CheckBox Name="ReducedMotionCheckBox" Text="{Loc 'ui-options-reduced-motion'}" />
<CheckBox Name="DisableScreenshakeCheckBox" Text="{Loc 'ui-options-es-screen-shake-toggle'}" /> <!-- DeltaV - ES Screenshake Port -->
<CheckBox Name="EnableColorNameCheckBox" Text="{Loc 'ui-options-enable-color-name'}" />
<CheckBox Name="ColorblindFriendlyCheckBox" Text="{Loc 'ui-options-colorblind-friendly'}" />
<ui:OptionSlider Name="ScreenShakeIntensitySlider" Title="{Loc 'ui-options-screen-shake-intensity'}" />
@@ -1,3 +1,4 @@
using Content.Shared._DV.CCVars; // DeltaV - ES Screenshake Port
using Content.Shared.CCVar;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
@@ -15,6 +16,7 @@ public sealed partial class AccessibilityTab : Control
Control.AddOptionCheckBox(CCVars.ChatEnableColorName, EnableColorNameCheckBox);
Control.AddOptionCheckBox(CCVars.AccessibilityColorblindFriendly, ColorblindFriendlyCheckBox);
Control.AddOptionCheckBox(CCVars.ReducedMotion, ReducedMotionCheckBox);
Control.AddOptionCheckBox(DCCVars.EsScreenshakeDisabled, DisableScreenshakeCheckBox); // DeltaV - ES Screenshake Port
Control.AddOptionPercentSlider(CCVars.ScreenShakeIntensity, ScreenShakeIntensitySlider);
Control.AddOptionPercentSlider(CCVars.ChatWindowOpacity, ChatWindowOpacitySlider);
Control.AddOptionPercentSlider(CCVars.SpeechBubbleTextOpacity, SpeechBubbleTextOpacitySlider);
@@ -1,6 +1,5 @@
using System.Numerics;
using Content.Client.Stylesheets;
using Content.Shared._Goobstation.CCVar; // GoobStation
using Content.Shared.CCVar;
using Content.Shared.Input;
using Robust.Client.AutoGenerated;
@@ -244,20 +243,6 @@ namespace Content.Client.Options.UI.Tabs
AddButton(ContentKeyFunctions.NanoChatNavigateDownUnread);
// DeltaV - End NanoChat keybinds
// Shitmed Change Start - TODO: Add hands, feet and groin targeting.
AddHeader("ui-options-header-targeting");
AddButton(ContentKeyFunctions.TargetHead);
AddButton(ContentKeyFunctions.TargetTorso);
AddButton(ContentKeyFunctions.TargetLeftArm);
AddButton(ContentKeyFunctions.TargetLeftHand);
AddButton(ContentKeyFunctions.TargetRightArm);
AddButton(ContentKeyFunctions.TargetRightHand);
AddButton(ContentKeyFunctions.TargetLeftLeg);
AddButton(ContentKeyFunctions.TargetLeftFoot);
AddButton(ContentKeyFunctions.TargetRightLeg);
AddButton(ContentKeyFunctions.TargetRightFoot);
// Shitmed Change End
AddHeader("ui-options-header-misc");
AddButton(ContentKeyFunctions.TakeScreenshot);
AddButton(ContentKeyFunctions.TakeScreenshotNoUI);
@@ -1,4 +1,5 @@
using Content.Client.CartridgeLoader;
using Content.Shared._DV.Pager; // DeltaV - pagers
using Content.Shared.CartridgeLoader;
using Content.Shared.Containers.ItemSlots;
using Content.Shared.PDA;
@@ -72,6 +73,13 @@ namespace Content.Client.PDA
SendMessage(new PdaLockUplinkMessage());
};
// Begin DeltaV - pagers
_menu.OnUnlinkDevicePressed += address =>
{
SendMessage(new PagerRemoveAddressMessage(address));
};
// End DeltaV - pagers
_menu.OnProgramItemPressed += ActivateCartridge;
_menu.OnInstallButtonPressed += InstallCartridge;
_menu.OnUninstallButtonPressed += UninstallCartridge;
@@ -100,6 +108,7 @@ namespace Content.Client.PDA
}
_menu.UpdateState(updateState);
UpdateLinkedDevices(); // DeltaV - pagers
}
protected override void AttachCartridgeUI(Control cartridgeUIFragment, string? title)
@@ -127,5 +136,13 @@ namespace Content.Client.PDA
{
return EntMan.GetComponentOrNull<PdaBorderColorComponent>(Owner);
}
// Begin DeltaV - pagers
public void UpdateLinkedDevices()
{
if (EntMan.TryGetComponent<PagerComponent>(Owner, out var receiver))
_menu?.UpdateLinkedDevices(receiver.Devices);
}
// End DeltaV - pagers
}
}
+13
View File
@@ -70,6 +70,12 @@
Access="Public"
Text="{Loc 'comp-pda-ui-ringtone-button'}"
Description="{Loc 'comp-pda-ui-ringtone-button-description'}"/>
<!-- Begin DeltaV Additions: Pagers -->
<pda:PdaSettingsButton Name="LinkedDevicesButton"
Access="Public"
Text="{Loc 'comp-pda-ui-linked-devices-button'}"
Description="{Loc 'comp-pda-ui-linked-devices-description'}"/>
<!-- End DeltaV Additions: Pagers -->
<pda:PdaSettingsButton Name="ActivateMusicButton"
Access="Public"
Visible="False"
@@ -92,6 +98,13 @@
HorizontalExpand="True"
Name="ProgramView"
Access="Public">
<!-- Begin DeltaV Additions: Pagers -->
<BoxContainer Orientation="Vertical"
VerticalExpand="True"
HorizontalExpand="True"
Name="LinkedDeviceList"
Visible="False"/>
<!-- End DeltaV Additions: Pagers -->
</BoxContainer>
</BoxContainer>
<BoxContainer Name="ContentFooter" HorizontalExpand="True" SetHeight="28" Margin="1 0 2 1">
+7
View File
@@ -131,6 +131,12 @@ namespace Content.Client.PDA
{
_clipboard.SetText(_currentDate);
};
LinkedDevicesButton.OnPressed += _ =>
{
LinkedDeviceList.Visible = true;
ToProgramView(Loc.GetString("comp-pda-ui-linked-devices-title"));
};
// End DeltaV additions
@@ -300,6 +306,7 @@ namespace Content.Client.PDA
ProgramCloseButton.Visible = false;
ProgramListButton.Visible = true;
SettingsButton.Visible = true;
LinkedDeviceList.Visible = false; // DeltaV - pagers
}
/// <summary>
+6
View File
@@ -1,10 +1,12 @@
using System.Numerics;
using Content.Shared._DV.CCVars; // DeltaV - Enable Stars via CVar.
using Content.Shared.CombatMode;
using Content.Shared.Interaction;
using Content.Shared.Stunnable;
using Robust.Client.Animations;
using Robust.Client.GameObjects;
using Robust.Shared.Animations;
using Robust.Shared.Configuration; // DeltaV - Enable Stars via CVar.
using Robust.Shared.Input;
using Robust.Shared.Input.Binding;
using Robust.Shared.Random;
@@ -13,6 +15,7 @@ namespace Content.Client.Stunnable;
public sealed class StunSystem : SharedStunSystem
{
[Dependency] private readonly IConfigurationManager _cfg = default!; // DeltaV - Enable Stars via CVar.
[Dependency] private readonly SharedCombatModeSystem _combat = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SpriteSystem _spriteSystem = default!;
@@ -78,6 +81,9 @@ public sealed class StunSystem : SharedStunSystem
var visible = Appearance.TryGetData<bool>(entity, StunVisuals.SeeingStars, out var stars) && stars;
if (visible && !_cfg.GetCVar(DCCVars.ShowStunVisuals)) // DeltaV - Enable Stars via CVar.
visible = false;
_spriteSystem.LayerSetVisible((entity, entity.Comp), index, visible);
_spriteSystem.LayerSetRsiState((entity, entity.Comp), index, state);
}
-54
View File
@@ -1759,60 +1759,6 @@ namespace Content.Client.Stylesheets
.Prop(Control.StylePropertyModulateSelf, JusticeColorHovered),
// End DeltaV
// Shitmed Change Start
Element<TextureButton>().Class("TargetDollButtonHead")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/head_hover.png")),
Element<TextureButton>().Class("TargetDollButtonChest")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/torso_hover.png")),
Element<TextureButton>().Class("TargetDollButtonGroin")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/groin_hover.png")),
Element<TextureButton>().Class("TargetDollButtonLeftArm")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/leftarm_hover.png")),
Element<TextureButton>().Class("TargetDollButtonLeftHand")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/lefthand_hover.png")),
Element<TextureButton>().Class("TargetDollButtonRightArm")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/rightarm_hover.png")),
Element<TextureButton>().Class("TargetDollButtonRightHand")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/righthand_hover.png")),
Element<TextureButton>().Class("TargetDollButtonLeftLeg")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/leftleg_hover.png")),
Element<TextureButton>().Class("TargetDollButtonLeftFoot")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/leftfoot_hover.png")),
Element<TextureButton>().Class("TargetDollButtonRightLeg")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/rightleg_hover.png")),
Element<TextureButton>().Class("TargetDollButtonRightFoot")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/rightfoot_hover.png")),
Element<TextureButton>().Class("TargetDollButtonEyes")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/eyes_hover.png")),
Element<TextureButton>().Class("TargetDollButtonMouth")
.Pseudo(TextureButton.StylePseudoClassHover)
.Prop(TextureButton.StylePropertyTexture, resCache.GetTexture("/Textures/_Shitmed/Interface/Targeting/Doll/mouth_hover.png")),
// Shitmed Change End
// Silicon law edit ui
Element<Label>().Class(SiliconLawContainer.StyleClassSiliconLawPositionLabel)
.Prop(Label.StylePropertyFontColor, NanoGold),
@@ -9,7 +9,6 @@
xmlns:hotbar="clr-namespace:Content.Client.UserInterface.Systems.Hotbar.Widgets"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:inventory="clr-namespace:Content.Client.UserInterface.Systems.Inventory.Widgets"
xmlns:targeting="clr-namespace:Content.Client._Shitmed.UserInterface.Systems.Targeting.Widgets"
Name="DefaultHud"
VerticalExpand="False"
VerticalAlignment="Bottom"
@@ -29,7 +28,6 @@
<widgets:GhostGui Name="Ghost" Access="Protected" />
<inventory:InventoryGui Name="Inventory" Access="Protected" />
<hotbar:HotbarGui Name="Hotbar" Access="Protected" />
<targeting:TargetingControl Name="Targeting" Access="Protected"/> <!-- Shitmed Change -->
<chat:ResizableChatBox Name="Chat" Access="Protected" />
<alerts:AlertsUI Name="Alerts" Access="Protected" />
</screens:DefaultGameScreen>
@@ -22,12 +22,11 @@ public sealed partial class DefaultGameScreen : InGameScreen
SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5);
SetAnchorAndMarginPreset(Chat, LayoutPreset.TopRight, margin: 10);
SetAnchorAndMarginPreset(Alerts, LayoutPreset.TopRight, margin: 10);
SetAnchorAndMarginPreset(Targeting, LayoutPreset.BottomRight, margin: 5); // Shitmed Change
Chat.OnResized += ChatOnResized;
Chat.OnChatResizeFinish += ChatOnResizeFinish;
MainViewport.OnResized += ResizeActionContainer;
MainViewport.OnResized += ResizeAlertsContainer;
Inventory.OnResized += ResizeActionContainer;
}
@@ -37,12 +36,6 @@ public sealed partial class DefaultGameScreen : InGameScreen
Actions.ActionsContainer.MaxGridHeight = MainViewport.Size.Y - indent;
}
private void ResizeAlertsContainer()
{
float indent = Chat.Size.Y + Targeting.Size.Y + 120;
Alerts.AlertContainer.MaxGridHeight = Math.Max(MainViewport.Size.Y - indent, 1);
}
private void ChatOnResizeFinish(Vector2 _)
{
var marginBottom = Chat.GetValue<float>(MarginBottomProperty);
@@ -10,7 +10,6 @@
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:inventory="clr-namespace:Content.Client.UserInterface.Systems.Inventory.Widgets"
xmlns:targeting="clr-namespace:Content.Client._Shitmed.UserInterface.Systems.Targeting.Widgets"
Name="SeparatedChatHud"
VerticalExpand="False"
VerticalAlignment="Bottom"
@@ -21,9 +20,8 @@
<widgets:GhostGui Name="Ghost" Access="Protected" />
<inventory:InventoryGui Name="Inventory" Access="Protected"/>
<hotbar:HotbarGui Name="Hotbar" Access="Protected"/>
<targeting:TargetingControl Name="Targeting" Access="Protected"/> <!-- Shitmed Change -->
<BoxContainer Name="TopLeftContainer" Orientation="Horizontal"> <!--goobstation-->
<actions:ActionsBar Name="Actions" Access="Protected" />
<BoxContainer Name="TopLeftContainer" Orientation="Vertical">
<actions:ActionsBar Name="Actions" Access="Protected" />
<BoxContainer Name="VoteMenu" Access="Public" Orientation="Vertical"/>
</BoxContainer>
<alerts:AlertsUI Name="Alerts" Access="Protected" />
@@ -27,8 +27,7 @@ public sealed partial class SeparatedChatGameScreen : InGameScreen
SetAnchorAndMarginPreset(Ghost, LayoutPreset.BottomWide, margin: 80);
SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5);
SetAnchorAndMarginPreset(Alerts, LayoutPreset.CenterRight, margin: 10);
SetAnchorAndMarginPreset(Targeting, LayoutPreset.BottomRight, margin: 5);
ScreenContainer.OnSplitResizeFinished += () =>
OnChatResized?.Invoke(new Vector2(ScreenContainer.SplitFraction, 0));
@@ -1,13 +1,7 @@
<widgets:AlertsUI xmlns="https://spacestation14.io"
xmlns:widgets="clr-namespace:Content.Client.UserInterface.Systems.Alerts.Widgets"
xmlns:partStatus="clr-namespace:Content.Client._Shitmed.UserInterface.Systems.PartStatus.Widgets"
MinSize="64 64">
<!-- Shitmed Change Start - TODO: Refactor this godforsaken abomination -->
<GridContainer Columns="1" HorizontalAlignment="Right" VerticalAlignment="Top">
<PanelContainer >
<GridContainer Name="AlertContainer" Columns="1" HorizontalAlignment="Right" VerticalAlignment="Center" Access="Public" />
</PanelContainer>
<partStatus:PartStatusControl Name="PartStatus" Access="Protected"/>
</GridContainer>
<!-- Shitmed Change End -->
<PanelContainer HorizontalAlignment="Right" VerticalAlignment="Top">
<BoxContainer Name="AlertContainer" Access="Public" Orientation="Vertical" />
</PanelContainer>
</widgets:AlertsUI>
@@ -280,7 +280,10 @@ public sealed partial class GunSystem : SharedGunSystem
if (!Timing.IsFirstTimePredicted || user == null || recoil == Vector2.Zero || recoilScalar == 0)
return;
_recoil.KickCamera(user.Value, recoil.Normalized() * 0.5f * recoilScalar);
// ES START
// reduce recoil even further
_recoil.KickCamera(user.Value, recoil.Normalized() * 0.13f * recoilScalar);
// ES END
}
protected override void Popup(string message, EntityUid? uid, EntityUid? user)
@@ -23,16 +23,20 @@ public sealed class AACBoundUserInterface : BoundUserInterface
protected override void Open()
{
base.Open();
_window?.Close();
if (_window is { Disposed: false })
_window.Close();
_window = this.CreateWindow<AACWindow>();
_window.OnClose += Close;
_window.PhraseButtonPressed += OnPhraseButtonPressed;
_window.Typing += OnTyping;
_window.SubmitPressed += OnSubmit;
}
private void OnPhraseButtonPressed(List<ProtoId<QuickPhrasePrototype>> phraseId)
private void OnPhraseButtonPressed(List<ProtoId<QuickPhrasePrototype>> phraseId, string prefix)
{
SendMessage(new AACTabletSendPhraseMessage(phraseId));
SendMessage(new AACTabletSendPhraseMessage(phraseId, prefix));
}
private void OnTyping()
@@ -46,4 +50,14 @@ public sealed class AACBoundUserInterface : BoundUserInterface
_typing ??= EntMan.System<TypingIndicatorSystem>();
_typing?.ClientSubmittedChatText();
}
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (state is not AACTabletBuiState msg)
return;
_window?.Update(msg);
}
}
@@ -18,7 +18,14 @@
StyleClasses="AacCheckbox"
Margin="0 0 8 0"/>
<Control HorizontalExpand="True"/>
</BoxContainer>
<Control SetWidth="170" Margin="8 0 0 0"/>
<OptionButton Name="RadioChannels"
StyleClasses="OpenBoth"
SetWidth="120"
Margin="8 0 0 0"/>
</BoxContainer>
<!-- Buffer Display and Controls -->
<BoxContainer Orientation="Horizontal">
@@ -29,7 +36,6 @@
StyleClasses="AacBufferText"
Margin="8 4"/>
</PanelContainer>
<Button Name="ClearButton"
Text="{Loc 'aac-tablet-backspace'}"
TextAlign="Center"
@@ -2,6 +2,9 @@ using System.Linq;
using System.Numerics;
using Content.Client.UserInterface.Controls;
using Content.Shared._DV.QuickPhrase;
using Content.Shared._DV.AACTablet;
using Content.Shared.Chat;
using Content.Shared.Radio;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
@@ -16,7 +19,7 @@ public sealed partial class AACWindow : FancyWindow
[Dependency] private readonly IPrototypeManager _prototype = default!;
private readonly List<QuickPhrasePrototype> _phrases;
private readonly Dictionary<string, List<QuickPhrasePrototype>> _filteredPhrases = new();
public event Action<List<ProtoId<QuickPhrasePrototype>>>? PhraseButtonPressed;
public event Action<List<ProtoId<QuickPhrasePrototype>>, string>? PhraseButtonPressed;
public event Action? Typing;
public event Action? SubmitPressed;
@@ -42,10 +45,16 @@ public sealed partial class AACWindow : FancyWindow
SearchBar.OnTextChanged += FilterSearch;
SendButton.OnPressed += SendBuffer;
ClearButton.OnPressed += BackspaceBuffer;
RadioChannels.OnItemSelected += OnChannelSelected;
PopulateGui();
FilterSearch(null);
}
private void OnChannelSelected(OptionButton.ItemSelectedEventArgs args)
{
RadioChannels.SelectId(args.Id);
}
private void BackspaceBuffer(BaseButton.ButtonEventArgs obj)
{
if (_phraseBuffer.Count == 0)
@@ -68,12 +77,14 @@ public sealed partial class AACWindow : FancyWindow
private void SendBuffer(BaseButton.ButtonEventArgs obj)
{
PhraseButtonPressed?.Invoke(_phraseBuffer);
PhraseButtonPressed?.Invoke(_phraseBuffer, Prefix);
_phraseBuffer.Clear();
BufferedString.Text = string.Empty;
SubmitPressed?.Invoke();
}
private string Prefix => (string?)RadioChannels.SelectedMetadata ?? SharedChatSystem.LocalPrefix.ToString();
private void FilterSearch(LineEdit.LineEditEventArgs? obj)
{
SearchResults.RemoveAllChildren();
@@ -82,7 +93,8 @@ public sealed partial class AACWindow : FancyWindow
var emptySearch = string.IsNullOrEmpty(SearchBar.Text);
foreach (var phrase in _phrases)
{
if (!emptySearch && !Loc.GetString(phrase.Text).Contains(SearchBar.Text, StringComparison.CurrentCultureIgnoreCase))
if (!emptySearch && !Loc.GetString(phrase.Text)
.Contains(SearchBar.Text, StringComparison.CurrentCultureIgnoreCase))
{
continue;
}
@@ -236,8 +248,24 @@ public sealed partial class AACWindow : FancyWindow
{
_phraseSingle.Clear();
_phraseSingle.Add(phraseId);
PhraseButtonPressed?.Invoke(_phraseSingle);
PhraseButtonPressed?.Invoke(_phraseSingle, Prefix);
SubmitPressed?.Invoke();
}
}
internal void Update(AACTabletBuiState msg)
{
RadioChannels.Clear();
var id = 0;
RadioChannels.AddItem("Local", id);
RadioChannels.SetItemMetadata(RadioChannels.GetIdx(id), SharedChatSystem.LocalPrefix.ToString());
foreach (var channel in msg.RadioChannels)
{
var channelProto = _prototype.Index<RadioChannelPrototype>(channel);
RadioChannels.AddItem(channelProto.LocalizedName, ++id);
RadioChannels.SetItemMetadata(RadioChannels.GetIdx(id), string.Concat(SharedChatSystem.RadioChannelPrefix, channelProto.KeyCode));
}
}
}
@@ -0,0 +1,8 @@
using Content.Shared._DV.Access.Systems;
namespace Content.Client._DV.Access.Systems;
/// <summary>
/// Client side handling of the subdermal ID system.
/// </summary>
public sealed class SubdermalIdCardSystem : SharedSubdermalIdCardSystem;
@@ -1,10 +0,0 @@
<ui:RadialMenu xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client.UserInterface.Controls"
BackButtonStyleClass="RadialMenuBackButton"
CloseButtonStyleClass="RadialMenuCloseButton"
VerticalExpand="True"
HorizontalExpand="True"
MinSize="450 450">
<ui:RadialContainer Name="Main" VerticalExpand="True" HorizontalExpand="True" InitialRadius="100" ReserveSpaceForHiddenChildren="False"/>
</ui:RadialMenu>
@@ -1,72 +0,0 @@
using Content.Client.UserInterface.Controls;
using JetBrains.Annotations;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Client.UserInterface;
using Content.Shared.Storage;
using System.Numerics;
using Robust.Shared.GameObjects;
namespace Content.Client._DV.Augments;
[GenerateTypedNameReferences]
public sealed partial class AugmentToolPanelMenu : RadialMenu
{
[Dependency] private readonly EntityManager _entManager = default!;
public event Action<EntityUid?>? SendAugmentToolPanelSystemMessageAction;
private EntityUid _owner;
public AugmentToolPanelMenu()
{
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this);
}
public void SetEntity(EntityUid uid)
{
_owner = uid;
Refresh();
}
public void Refresh()
{
if (!_entManager.TryGetComponent<StorageComponent>(_owner, out var storage))
return;
foreach (var (entity, _) in storage.StoredItems)
{
var button = new RadialMenuButtonWithSector()
{
SetSize = new Vector2(64f, 64f),
};
button.AddChild(new SpriteView(entity, _entManager)
{
Scale = new Vector2(3f, 3f),
});
Main.AddChild(button);
button.OnButtonUp += _ =>
{
SendAugmentToolPanelSystemMessageAction?.Invoke(entity);
Close();
};
}
var nilButton = new RadialMenuButtonWithSector()
{
SetSize = new Vector2(64f, 64f),
};
Main.AddChild(nilButton);
nilButton.OnButtonUp += _ =>
{
SendAugmentToolPanelSystemMessageAction?.Invoke(null);
Close();
};
}
}
@@ -1,39 +0,0 @@
using Robust.Client.Graphics;
using Robust.Client.Input;
using Robust.Client.UserInterface;
using Robust.Shared.Prototypes;
using Content.Shared._DV.Augments;
namespace Content.Client._DV.Augments;
public sealed class AugmentToolPanelMenuBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IClyde _displayManager = default!;
[Dependency] private readonly IInputManager _inputManager = default!;
[Dependency] private readonly IEntityManager _entMan = default!;
private AugmentToolPanelMenu? _menu;
public AugmentToolPanelMenuBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
IoCManager.InjectDependencies(this);
}
protected override void Open()
{
base.Open();
_menu = this.CreateWindow<AugmentToolPanelMenu>();
_menu.SetEntity(Owner);
_menu.SendAugmentToolPanelSystemMessageAction += SendAugmentToolPanelSystemMessage;
// Open the menu, centered on the mouse
var vpSize = _displayManager.ScreenSize;
_menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize);
}
public void SendAugmentToolPanelSystemMessage(EntityUid? desiredTool)
{
SendMessage(new AugmentToolPanelSystemMessage(_entMan.GetNetEntity(desiredTool)));
}
}
@@ -0,0 +1,41 @@
using Content.Shared._DV.Body.Components;
using Content.Shared.Clothing.Components;
using Content.Shared.Clothing.EntitySystems;
using Robust.Client.GameObjects;
namespace Content.Client._DV.Body;
/// <summary>
/// Colors feathers.
/// </summary>
public sealed class FeatherVisualizer : VisualizerSystem<FeatherComponent>
{
[Dependency] private readonly ClothingSystem _clothing = default!;
protected override void OnAppearanceChange(EntityUid uid, FeatherComponent component, ref AppearanceChangeEvent args)
{
if (!AppearanceSystem.TryGetData<Color>(uid, FeatherVisuals.FeatherColor, out var featherColor, args.Component))
return;
SpriteSystem.LayerSetColor(uid, FeatherVisualLayers.Feather, featherColor);
if (TryComp<ClothingComponent>(uid, out var clothing))
{
foreach (var slotPair in clothing.ClothingVisuals)
{
_clothing.SetLayerColor(clothing, slotPair.Key, "feather", featherColor);
}
}
if (!AppearanceSystem.TryGetData<Color>(uid, FeatherVisuals.BloodColor, out var bloodColor, args.Component))
return;
SpriteSystem.LayerSetColor(uid, FeatherVisualLayers.Blood, bloodColor);
}
}
public enum FeatherVisualLayers : byte
{
Feather,
Blood,
}
@@ -9,6 +9,7 @@
StyleClasses="LabelKeyText"/>
<CheckBox Name="DisableFiltersCheckBox" Text="{Loc 'ui-options-no-filters'}" />
<CheckBox Name="DisableGlimmerEffectCheckBox" Text="{Loc 'ui-options-disable-glimmer-effect'}" />
<CheckBox Name="EnableStunVisualsCheckBox" Text="{Loc 'ui-options-enable-stun-visuals'}" />
<Label Text="{Loc 'ui-options-delta-tips'}"
StyleClasses="LabelKeyText"/>
<CheckBox Name="DisableTipsCheckBox" Text="{Loc 'ui-options-delta-disable-tips'}" />
@@ -18,6 +18,7 @@ public sealed partial class DeltaTab : Control
Control.AddOptionCheckBox(DCCVars.NoVisionFilters, DisableFiltersCheckBox);
Control.AddOptionCheckBox(DCCVars.DisableGlimmerShader, DisableGlimmerEffectCheckBox);
Control.AddOptionCheckBox(DCCVars.ShowStunVisuals, EnableStunVisualsCheckBox);
Control.AddOptionCheckBox(DCCVars.DisableTips, DisableTipsCheckBox);
ResetTipsButton.OnPressed += _ => OnResetTipsPressed();
@@ -0,0 +1,25 @@
using Content.Client.PDA;
using Content.Shared._DV.Pager;
using Content.Shared.PDA;
namespace Content.Client._DV.PDA;
public sealed class ClientEventNotificationReceiverSystem : EntitySystem
{
[Dependency] private readonly SharedUserInterfaceSystem _userInterface = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PagerComponent, AfterAutoHandleStateEvent>(OnAfterAutoHandleState);
}
private void OnAfterAutoHandleState(Entity<PagerComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (!_userInterface.TryGetOpenUi<PdaBoundUserInterface>(ent.Owner, PdaUiKey.Key, out var bui))
return;
bui.UpdateLinkedDevices();
}
}
@@ -0,0 +1,6 @@
<PanelContainer HorizontalExpand="True" xmlns="https://spacestation14.io">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" Margin="4">
<Label Name="DeviceName" Access="Public" HorizontalExpand="True" />
<Button Name="Unlink" Access="Public" StyleClasses="ButtonSmall" Text="{Loc 'comp-pda-ui-linked-devices-unlink'}"/>
</BoxContainer>
</PanelContainer>
@@ -0,0 +1,14 @@
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._DV.PDA;
[GenerateTypedNameReferences]
public sealed partial class LinkedDeviceItem : PanelContainer
{
public LinkedDeviceItem()
{
RobustXamlLoader.Load(this);
}
}
+28
View File
@@ -0,0 +1,28 @@
using Content.Client._DV.PDA;
using Content.Client.Stylesheets;
using System.Linq;
namespace Content.Client.PDA;
public sealed partial class PdaMenu
{
public event Action<string>? OnUnlinkDevicePressed;
public void UpdateLinkedDevices(Dictionary<string, string> devices)
{
LinkedDeviceList.RemoveAllChildren();
var even = false;
foreach (var (address, name) in devices.OrderBy(kvp => kvp.Value))
{
var item = new LinkedDeviceItem()
{
DeviceName = { Text = name },
};
item.Unlink.OnPressed += _ => OnUnlinkDevicePressed?.Invoke(address);
LinkedDeviceList.AddChild(item);
LinkedDeviceList.StyleClasses.Add(even ? StyleClass.PanelDark : StyleClass.PanelLight);
even = !even;
}
}
}
@@ -0,0 +1,41 @@
using Content.Shared._DV.Pager;
using Robust.Client.Animations;
using Robust.Client.GameObjects;
namespace Content.Client._DV.Pager;
public sealed class PagerButtonSystem : SharedPagerButtonSystem
{
[Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!;
private const string AnimateKey = "pager-press";
protected override void AfterActivated(Entity<PagerButtonComponent> ent)
{
if (!_animationPlayer.HasRunningAnimation(ent.Owner, AnimateKey))
_animationPlayer.Play(ent.Owner, GetAnimation(ent), AnimateKey);
}
private Animation GetAnimation(Entity<PagerButtonComponent> ent)
{
const float flickDuration = 20f / 60f;
return new Animation()
{
Length = TimeSpan.FromSeconds(flickDuration),
AnimationTracks =
{
new AnimationTrackSpriteFlick()
{
LayerKey = PagerButtonVisualLayers.Base,
KeyFrames =
{
new AnimationTrackSpriteFlick.KeyFrame(ent.Comp.PressState, 0f),
new AnimationTrackSpriteFlick.KeyFrame(ent.Comp.UnpressedState, flickDuration),
},
},
},
};
}
}
@@ -1,28 +0,0 @@
using Content.Shared._DV.Silicon.IPC;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
namespace Content.Client._DV.Silicon.IPC;
public sealed class SnoutHelmetSystem : EntitySystem
{
private const MarkingCategories MarkingToQuery = MarkingCategories.Snout;
private const int MaximumMarkingCount = 0;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SnoutHelmetComponent, ComponentStartup>(OnComponentStartup);
}
private void OnComponentStartup(EntityUid uid, SnoutHelmetComponent component, ComponentStartup args)
{
if (TryComp(uid, out HumanoidAppearanceComponent? humanoidAppearanceComponent) &&
humanoidAppearanceComponent.ClientOldMarkings.Markings.TryGetValue(MarkingToQuery, out var markings) &&
markings.Count > MaximumMarkingCount)
{
component.EnableAlternateHelmet = true;
}
}
}
@@ -1,31 +0,0 @@
using Content.Client.Alerts;
using Content.Shared._EE.Silicon.Components;
using Content.Shared._EE.Silicon.Systems;
namespace Content.Client._DV.Silicon.Charge;
public sealed class SiliconChargeSystem : SharedSiliconChargeSystem
{
[Dependency] private readonly ClientAlertsSystem _alerts = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SiliconComponent, ComponentInit>(OnSiliconInit);
SubscribeLocalEvent<SiliconComponent, SiliconChargeStateUpdateEvent>(OnSiliconChargeStateUpdate);
}
private void OnSiliconInit(EntityUid uid, SiliconComponent component, ComponentInit args)
{
if (!component.BatteryPowered)
return;
_alerts.ShowAlert(uid, component.BatteryAlert, component.ChargeState);
}
private void OnSiliconChargeStateUpdate(EntityUid uid, SiliconComponent component, SiliconChargeStateUpdateEvent ev)
{
_alerts.ShowAlert(uid, component.BatteryAlert, ev.ChargePercent);
}
}
@@ -1,29 +0,0 @@
using Content.Client.Alerts;
using Content.Shared._EE.Silicon.Components;
using Content.Shared._DV.Silicons.Charge;
namespace Content.Client._DV.Silicon.Charge;
public sealed class SiliconDrainSystem : SharedSiliconDrainSystem
{
[Dependency] private readonly ClientAlertsSystem _alerts = default!;
protected override void UpdateChargeIcon(Entity<SiliconComponent> ent, short chargePercent)
{
// If you can't find a battery, set the indicator and skip it.
if (!TryGetSiliconBattery(ent, out _))
{
if (_alerts.IsShowingAlert(ent.Owner, ent.Comp.BatteryAlert))
{
_alerts.ClearAlert(ent.Owner, ent.Comp.BatteryAlert);
_alerts.ShowAlert(ent.Owner, ent.Comp.NoBatteryAlert);
}
}
// If the battery was replaced and the no battery indicator is showing, replace the indicator
else if (_alerts.IsShowingAlert(ent.Owner, ent.Comp.NoBatteryAlert))
{
_alerts.ClearAlert(ent.Owner, ent.Comp.NoBatteryAlert);
_alerts.ShowAlert(ent.Owner, ent.Comp.BatteryAlert, chargePercent);
}
}
}
@@ -1,22 +0,0 @@
using Content.Client.Items;
using Content.Shared._DV.Surgery;
using Content.Shared.Inventory;
using Robust.Shared.Containers;
namespace Content.Client._DV.Surgery;
/// <summary>
/// This shows the item status for dirty surgery tools.
/// </summary>
public sealed class SurgeryCleanStatusSystem : EntitySystem
{
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
public override void Initialize()
{
base.Initialize();
Subs.ItemStatus<SurgeryDirtinessComponent>(ent => new SurgeryDirtinessItemStatus(ent, EntityManager, _inventory, _container));
}
}
@@ -1,99 +0,0 @@
using System.Numerics;
using Content.Client.UserInterface.Controls;
using Content.Shared._DV.Surgery;
using Content.Shared._Shitmed.Medical.Surgery.Tools;
using Content.Shared.FixedPoint;
using Content.Shared.Inventory;
using Robust.Shared.Containers;
using Robust.Shared.Timing;
namespace Content.Client._DV.Surgery;
public sealed class SurgeryDirtinessItemStatus : SplitBar
{
private readonly IEntityManager _entMan;
private readonly EntityUid _uid;
private readonly InventorySystem _inventory;
private readonly SharedContainerSystem _container;
private FixedPoint2? _dirtiness = null;
private FixedPoint2? _gloveDirtiness = null;
private static readonly Color SelfCleanColor = new Color(0xD1, 0xD5, 0xD9);
private static readonly Color SelfDirtyColor = new Color(0xE9, 0x3D, 0x58);
private static readonly Color GloveCleanColor = new Color(0xAB, 0xE9, 0xFB);
private static readonly Color GloveDirtyColor = new Color(0xE9, 0x64, 0x3A);
public SurgeryDirtinessItemStatus(EntityUid uid, IEntityManager entMan, InventorySystem inventory, SharedContainerSystem container)
{
_uid = uid;
_entMan = entMan;
_inventory = inventory;
_container = container;
MinBarSize = new Vector2(10, 0);
Margin = new Thickness(4);
MinHeight = 16;
MaxHeight = 16;
}
protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
if (!_entMan.TryGetComponent<SurgeryDirtinessComponent>(_uid, out var comp))
return;
var isTool = _entMan.HasComponent<SurgeryToolComponent>(_uid);
if (_dirtiness == comp.Dirtiness && !isTool)
return;
_dirtiness = comp.Dirtiness;
if (isTool && _container.TryGetContainingContainer((_uid, null, null), out var container))
{
var user = container.Owner;
FixedPoint2? glovesDirtiness =
_inventory.TryGetSlotEntity(user, "gloves", out var gloves)
? _entMan.TryGetComponent<SurgeryDirtinessComponent>(_uid, out var glovesComp)
? glovesComp.Dirtiness
: FixedPoint2.Zero
: null;
if (glovesDirtiness is not null && _gloveDirtiness == glovesDirtiness)
return;
_gloveDirtiness = glovesDirtiness;
Clear();
var toolAmount = FixedPoint2.Min(_dirtiness.Value / 100, 1);
var gloveAmount = FixedPoint2.Min((_gloveDirtiness ?? 0) / 100, 1);
var remaining = 1 - toolAmount - gloveAmount;
var clean = (_dirtiness + (_gloveDirtiness ?? 0)) < 50;
var maskOn = _inventory.TryGetSlotEntity(user, "mask", out var _);
var isFine = clean && maskOn && _gloveDirtiness is not null;
if (toolAmount != FixedPoint2.Zero)
AddEntry(toolAmount.Float() * 100, isFine ? SelfCleanColor : SelfDirtyColor);
if (gloveAmount != FixedPoint2.Zero)
AddEntry(gloveAmount.Float() * 100, isFine ? GloveCleanColor : GloveDirtyColor);
if (remaining > FixedPoint2.Zero)
AddEntry(remaining.Float() * 100, Color.SlateGray);
}
else
{
Clear();
var amount = FixedPoint2.Min(_dirtiness.Value / 100, 1);
var remaining = 1 - amount;
if (amount != FixedPoint2.Zero)
AddEntry(amount.Float(), amount < 0.5 ? SelfCleanColor : SelfDirtyColor);
if (remaining != FixedPoint2.Zero)
AddEntry(remaining.Float(), Color.SlateGray);
}
}
}
+99
View File
@@ -0,0 +1,99 @@
using System.Numerics;
using Content.Shared._DV.CCVars;
using Content.Shared._ES.Camera;
using Content.Shared.Camera;
using Robust.Shared.Configuration;
using Robust.Shared.Noise;
using Robust.Shared.Timing;
namespace Content.Client._ES;
// DeltaV - Anything not marked DeltaV is Ephemeral Space code moved from SharedESScreenshakeSystem
public sealed class ESScreenshakeSystem : EntitySystem
{
[Dependency] private readonly IConfigurationManager _config = default!; // DeltaV
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly SharedESScreenshakeSystem _shared = default!;
private bool _disabled; // DeltaV
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<ESScreenshakeComponent, GetEyeOffsetEvent>(OnGetEyeOffset);
SubscribeLocalEvent<ESScreenshakeComponent, ESGetEyeRotationEvent>(OnGetEyeRotation);
_config.OnValueChanged(DCCVars.EsScreenshakeDisabled, OnDisabledChanged, true); // DeltaV
}
private void OnDisabledChanged(bool obj)
{
_disabled = obj;
}
private void OnGetEyeOffset(Entity<ESScreenshakeComponent> ent, ref GetEyeOffsetEvent args)
{
if (!TryComp<EyeComponent>(ent, out var eye) || _disabled) // DeltaV - check if disabled
return;
var noise = new FastNoiseLite(67);
noise.SetNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
var accumulatedOffset = Vector2.Zero;
var maxOffset = new Vector2(0.15f, 0.15f);
foreach (var command in ent.Comp.Commands)
{
if (command.Translational == null)
continue;
var trauma =
_shared.CalculateTraumaValueForCurrentTime(command.Translational, command.Start);
if (trauma <= 0)
continue;
noise.SetFrequency(command.Translational.Frequency);
// using the starst c ommand for y pos kinda doesnt work in the case where multiple shakes get sent at the same time
// and the shakes are identical otherwise. but like dont do that or something idk
var offsetX = (maxOffset.X * trauma) * noise.GetNoise((float)_timing.RealTime.TotalMilliseconds,
(float)command.Start.TotalMilliseconds);
noise.SetSeed(68);
var offsetY = (maxOffset.Y * trauma) * noise.GetNoise((float)_timing.RealTime.TotalMilliseconds,
(float)command.Start.TotalMilliseconds);
noise.SetSeed(67);
accumulatedOffset += new Vector2(offsetX, offsetY);
}
args.Offset += accumulatedOffset;
}
private void OnGetEyeRotation(Entity<ESScreenshakeComponent> ent, ref ESGetEyeRotationEvent args)
{
if (!TryComp<EyeComponent>(ent, out var eye) || _disabled) // DeltaV - check if disabled
return;
var noise = new FastNoiseLite(67 + 420); // Epic bacon
noise.SetNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
// 20deg max
var accumulatedAngle = Angle.Zero;
var maxAngleDegrees = 20f;
foreach (var command in ent.Comp.Commands)
{
if (command.Rotational == null)
continue;
var trauma =
_shared.CalculateTraumaValueForCurrentTime(command.Rotational, command.Start);
if (trauma <= 0)
continue;
noise.SetFrequency(command.Rotational.Frequency);
var angle = (maxAngleDegrees * trauma) * noise.GetNoise((float)_timing.RealTime.TotalMilliseconds, (float)command.Start.TotalMilliseconds);
accumulatedAngle += Angle.FromDegrees(angle);
}
// TODO ughhh this shit breaks with something idk
args.Rotation += accumulatedAngle;
}
}
@@ -0,0 +1,14 @@
using Content.Shared._ES.Core.Timer.Components;
namespace Content.Client._ES.Lighting.Components;
/// <summary>
/// Handles a point light that fades out while synced to a <see cref="ESTimedDespawnComponent"/>
/// </summary>
[RegisterComponent]
[Access(typeof(ESTimedDespawnLightFadeSystem))]
public sealed partial class ESTimedDespawnLightFadeComponent : Component
{
[DataField]
public TimeSpan FadeTime = TimeSpan.FromSeconds(1);
}
@@ -0,0 +1,52 @@
using Content.Client._ES.Lighting.Components;
using Content.Shared._ES.Core.Timer.Components;
using Robust.Client.Animations;
using Robust.Client.GameObjects;
using Robust.Shared.Animations;
using Robust.Shared.Timing;
namespace Content.Client._ES.Lighting;
public sealed class ESTimedDespawnLightFadeSystem : VisualizerSystem<ESTimedDespawnLightFadeComponent>
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!;
private const string FadeTrack = "light-fade";
protected override void OnAppearanceChange(EntityUid uid, ESTimedDespawnLightFadeComponent component, ref AppearanceChangeEvent args)
{
base.OnAppearanceChange(uid, component, ref args);
if (_animationPlayer.HasRunningAnimation(uid, FadeTrack))
return;
if (!AppearanceSystem.TryGetData<TimeSpan>(uid, ESTimedDespawnVisuals.DespawnTime, out var time, args.Component) ||
!TryComp<PointLightComponent>(uid, out var light))
return;
var duration = time - _timing.CurTime;
var animation = new Animation
{
Length = duration,
AnimationTracks =
{
new AnimationTrackComponentProperty
{
Property = nameof(PointLightComponent.Energy),
ComponentType = typeof(PointLightComponent),
InterpolationMode = AnimationInterpolationMode.Linear,
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(light.Energy, 0f),
new AnimationTrackProperty.KeyFrame(light.Energy, (float) (duration - component.FadeTime).TotalSeconds),
new AnimationTrackProperty.KeyFrame(0f, (float) component.FadeTime.TotalSeconds, Easings.OutSine),
}
}
}
};
_animationPlayer.Play(uid, animation, FadeTrack);
}
}
@@ -0,0 +1,14 @@
using Content.Shared._ES.Core.Timer.Components;
namespace Content.Client._ES.Sprite.Components;
/// <summary>
/// Handles a sprite that fades out while synced to a <see cref="ESTimedDespawnComponent"/>
/// </summary>
[RegisterComponent]
[Access(typeof(ESTimedDespawnSpriteFadeSystem))]
public sealed partial class ESTimedDespawnSpriteFadeComponent : Component
{
[DataField]
public TimeSpan FadeTime = TimeSpan.FromSeconds(1);
}
@@ -0,0 +1,57 @@
using Content.Client._ES.Sprite.Components;
using Content.Shared._ES.Core.Timer.Components;
using Robust.Client.Animations;
using Robust.Client.GameObjects;
using Robust.Shared.Animations;
using Robust.Shared.Timing;
namespace Content.Client._ES.Sprite;
/// <summary>
/// This handles <see cref="ESTimedDespawnSpriteFadeComponent"/>
/// </summary>
public sealed class ESTimedDespawnSpriteFadeSystem : VisualizerSystem<ESTimedDespawnSpriteFadeComponent>
{
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!;
private const string FadeTrack = "es-sprite-fade";
protected override void OnAppearanceChange(EntityUid uid, ESTimedDespawnSpriteFadeComponent component, ref AppearanceChangeEvent args)
{
base.OnAppearanceChange(uid, component, ref args);
if (args.Sprite is not { } sprite)
return;
if (_animationPlayer.HasRunningAnimation(uid, FadeTrack))
return;
if (!AppearanceSystem.TryGetData<TimeSpan>(uid, ESTimedDespawnVisuals.DespawnTime, out var time, args.Component))
return;
var duration = time - _timing.CurTime;
var animation = new Animation
{
Length = duration,
AnimationTracks =
{
new AnimationTrackComponentProperty
{
Property = nameof(SpriteComponent.Color),
ComponentType = typeof(SpriteComponent),
InterpolationMode = AnimationInterpolationMode.Linear,
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(sprite.Color, 0f),
new AnimationTrackProperty.KeyFrame(sprite.Color, MathF.Max((float) (duration - component.FadeTime).TotalSeconds, 0f)),
new AnimationTrackProperty.KeyFrame(sprite.Color.WithAlpha(0f), (float) component.FadeTime.TotalSeconds, Easings.OutSine),
},
},
},
};
_animationPlayer.Play(uid, animation, FadeTrack);
}
}
@@ -0,0 +1,129 @@
// SPDX-FileCopyrightText: 2026 Janet Blackquill <uhhadd@gmail.com>
//
// SPDX-License-Identifier: MIT
using System.Numerics;
using Content.Shared._ST.Interaction;
using Robust.Client.Animations;
using Robust.Client.GameObjects;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Client._ST.Interaction;
public sealed class StellarInteractionParticleSystem : EntitySystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly AnimationPlayerSystem _animation = default!;
private const string AnimateKey = "particle-animation";
private static readonly EntProtoId InteractionParticleId = "StellarInteractionParticle";
public override void Initialize()
{
base.Initialize();
SubscribeAllEvent<StellarInteractionParticleEvent>(OnInteractionParticle);
}
private void OnInteractionParticle(StellarInteractionParticleEvent ev)
{
var performer = GetEntity(ev.Performer);
var used = GetEntity(ev.Used);
var target = GetEntity(ev.Target);
if (!Exists(performer) || !Exists(target))
return;
var performerXform = Transform(performer);
var targetXform = Transform(target);
if (performerXform.MapID == MapId.Nullspace || targetXform.MapID == MapId.Nullspace)
return;
if (performerXform.ParentUid != targetXform.ParentUid)
return;
var performerTargetDelta = targetXform.LocalPosition - performerXform.LocalPosition;
var particle = Spawn(InteractionParticleId, performerXform.Coordinates);
if (used is { } usedEntity && Exists(usedEntity) && TryComp<SpriteComponent>(usedEntity, out var usedSprite))
{
_sprite.CopySprite((usedEntity, usedSprite), particle);
// ES START
_sprite.SetDrawDepth(particle, (int) Shared.DrawDepth.DrawDepth.Effects);
// ES END
}
var spriteColor = Comp<SpriteComponent>(particle).Color;
_animation.Play(particle, GetAnimation(performerTargetDelta, spriteColor), AnimateKey);
}
private Animation GetAnimation(Vector2 endOffset, Color color)
{
var startRotation = _random.NextAngle(Angle.FromDegrees(-80), Angle.FromDegrees(80));
var endRotation = Angle.Zero;
var startScale = new Vector2(0.3f, 0.3f);
var endScale = new Vector2(1f, 1f);
var rotationLength = TimeSpan.FromMilliseconds(600);
var startOffset = new Vector2();
var offsetLength = TimeSpan.FromMilliseconds(200);
var startColor = color.WithAlpha(color.A * 0.9f);
var endColor = color.WithAlpha(0f);
var colorLength = rotationLength + offsetLength;
return new Animation()
{
Length = colorLength,
AnimationTracks =
{
new AnimationTrackComponentProperty()
{
ComponentType = typeof(SpriteComponent),
Property = nameof(SpriteComponent.Rotation),
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(startRotation, 0f),
new AnimationTrackProperty.KeyFrame(endRotation, (float)rotationLength.TotalSeconds, Easings.OutBounce),
},
},
new AnimationTrackComponentProperty()
{
ComponentType = typeof(SpriteComponent),
Property = nameof(SpriteComponent.Scale),
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(startScale, 0f),
new AnimationTrackProperty.KeyFrame(endScale, (float)rotationLength.TotalSeconds, Easings.OutBounce),
},
},
new AnimationTrackComponentProperty()
{
ComponentType = typeof(SpriteComponent),
Property = nameof(SpriteComponent.Offset),
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(startOffset, 0f),
new AnimationTrackProperty.KeyFrame(endOffset, (float)offsetLength.TotalSeconds, Easings.OutBounce),
},
},
new AnimationTrackComponentProperty()
{
ComponentType = typeof(SpriteComponent),
Property = nameof(SpriteComponent.Color),
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(startColor, 0f),
new AnimationTrackProperty.KeyFrame(startColor, (float)rotationLength.TotalSeconds),
new AnimationTrackProperty.KeyFrame(endColor, (float)offsetLength.TotalSeconds, Easings.InOutCirc),
},
},
},
};
}
}
@@ -1,14 +0,0 @@
<controls:FancyWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'autodoc-add-step'}">
<BoxContainer Orientation="Vertical">
<Button Name="SurgeryButton" Text="{Loc 'autodoc-add-step-surgery'}"/>
<Button Name="GrabItemButton" Text="{Loc 'autodoc-add-step-grab-item'}"/>
<Button Name="GrabOrganButton" Text="{Loc 'autodoc-add-step-grab-organ'}"/>
<Button Name="GrabPartButton" Text="{Loc 'autodoc-add-step-grab-part'}"/>
<Button Name="StoreItemButton" Text="{Loc 'autodoc-add-step-store-item'}"/>
<Button Name="SetLabelButton" Text="{Loc 'autodoc-add-step-set-label'}"/>
<Button Name="WaitButton" Text="{Loc 'autodoc-add-step-wait'}"/>
</BoxContainer>
</controls:FancyWindow>
@@ -1,138 +0,0 @@
using Content.Client.UserInterface.Controls;
using Content.Shared.Administration;
using Content.Shared._Shitmed.Autodoc;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._Shitmed.Autodoc;
[GenerateTypedNameReferences]
public sealed partial class AddStepWindow : FancyWindow
{
public event Action<IAutodocStep>? OnAddStep;
private PickSurgeryWindow? _surgery;
private DialogWindow? _grab;
private DialogWindow? _label;
private DialogWindow? _wait;
public AddStepWindow()
{
RobustXamlLoader.Load(this);
// close the window once any step is added
OnAddStep += _ => Close();
OnClose += () =>
{
_surgery?.Close();
_grab?.Close();
_label?.Close();
_wait?.Close();
};
// dedicated ui to pick the enum values and surgery type
SurgeryButton.OnPressed += _ =>
{
if (_surgery is {} window)
{
window.MoveToFront();
return;
}
_surgery = new PickSurgeryWindow();
_surgery.OnAddStep += step => OnAddStep?.Invoke(step);
_surgery.OnClose += () => _surgery = null;
_surgery.OpenCentered();
};
// just picking a string, use a dialog
GrabItemButton.OnPressed += _ =>
{
if (_grab is {} dialog)
{
dialog.MoveToFront();
return;
}
var field = "name";
var prompt = Loc.GetString("autodoc-add-step-grab-item-prompt");
var placeholder = Loc.GetString("autodoc-add-step-grab-item-placeholder");
var entry = new QuickDialogEntry(field, QuickDialogEntryType.ShortText, prompt, placeholder);
var entries = new List<QuickDialogEntry> { entry };
_grab = new DialogWindow(GrabItemButton.Text!, entries);
_grab.OnConfirmed += responses =>
{
var name = responses[field].Trim();
if (name.Length < 1 || name.Length > 100)
return;
OnAddStep?.Invoke(new GrabItemAutodocStep()
{
Name = name
});
};
_grab.OnClose += () => _grab = null;
};
// no arguments so these are trivial
GrabOrganButton.OnPressed += _ => OnAddStep?.Invoke(new GrabAnyOrganAutodocStep());
GrabPartButton.OnPressed += _ => OnAddStep?.Invoke(new GrabAnyBodyPartAutodocStep());
StoreItemButton.OnPressed += _ => OnAddStep?.Invoke(new StoreItemAutodocStep());
SetLabelButton.OnPressed += _ =>
{
if (_label is {} dialog)
{
dialog.MoveToFront();
return;
}
var field = "label";
var prompt = Loc.GetString("autodoc-add-step-set-label-prompt");
var entry = new QuickDialogEntry(field, QuickDialogEntryType.ShortText, prompt);
var entries = new List<QuickDialogEntry> { entry };
_label = new DialogWindow(SetLabelButton.Text!, entries);
_label.OnConfirmed += responses =>
{
var label = responses[field].Trim();
if (label.Length < 1 || label.Length > 20)
return;
OnAddStep?.Invoke(new SetLabelAutodocStep()
{
Label = label
});
};
_label.OnClose += () => _label = null;
};
WaitButton.OnPressed += _ =>
{
if (_wait is {} dialog)
{
dialog.MoveToFront();
return;
}
var field = "length";
var prompt = Loc.GetString("autodoc-add-step-wait-prompt");
var entry = new QuickDialogEntry(field, QuickDialogEntryType.Integer, prompt);
var entries = new List<QuickDialogEntry> { entry };
_wait = new DialogWindow(WaitButton.Text!, entries);
_wait.OnConfirmed += responses =>
{
var length = int.Parse(responses[field].Trim());
if (length < 1 || length > 30)
return;
OnAddStep?.Invoke(new WaitAutodocStep()
{
Length = length
});
};
_wait.OnClose += () => _wait = null;
};
}
}
@@ -1,42 +0,0 @@
using Content.Shared._Shitmed.Autodoc;
using Robust.Client.GameObjects;
using Robust.Client.Player;
namespace Content.Client._Shitmed.Autodoc;
public sealed class AutodocBoundUserInterface : BoundUserInterface
{
[Dependency] private readonly IEntityManager _entMan = default!;
[Dependency] private readonly IPlayerManager _player = default!;
[ViewVariables]
private AutodocWindow? _window;
public AutodocBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
_window = new AutodocWindow(owner, _entMan, _player);
_window.OnCreateProgram += title => SendMessage(new AutodocCreateProgramMessage(title));
_window.OnToggleProgramSafety += program => SendMessage(new AutodocToggleProgramSafetyMessage(program));
_window.OnRemoveProgram += program => SendMessage(new AutodocRemoveProgramMessage(program));
_window.OnAddStep += (program, step, index) => SendMessage(new AutodocAddStepMessage(program, step, index));
_window.OnRemoveStep += (program, stepIndex) => SendMessage(new AutodocRemoveStepMessage(program, stepIndex));
_window.OnImportProgram += (program) => SendMessage(new AutodocImportProgramMessage(program));
_window.OnStart += program => SendMessage(new AutodocStartMessage(program));
_window.OnStop += () => SendMessage(new AutodocStopMessage());
_window.OnClose += () => Close();
_window.OpenCentered();
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
_window?.Dispose();
}
}
@@ -1,20 +0,0 @@
<controls:FancyWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'autodoc-view-program-title'}"
SetSize="600 500">
<BoxContainer Orientation="Horizontal">
<BoxContainer Orientation="Vertical" Margin="5 5 5 5">
<Label Name="ProgramTitle"/> <!-- Set to Program.Title -->
<Button Name="SafetyButton" Text="{Loc 'autodoc-safety-enabled'}"/>
<Button Name="RemoveButton" StyleClasses="Caution" Text="{Loc 'autodoc-remove-program'}"/>
<Button Name="AddStepButton" Text="{Loc 'autodoc-add-step'}"/>
<Button Name="RemoveStepButton" StyleClasses="Caution" Text="{Loc 'autodoc-remove-step'}" Disabled="True"/>
<Button Name="StartButton" StyleClasses="Caution" Text="{Loc 'autodoc-start-program'}"/>
<Button Name="ExportProgramButton" Text="{Loc 'autodoc-export-program'}"/>
</BoxContainer>
<ScrollContainer HorizontalExpand="True" VerticalExpand="True">
<ItemList Name="Steps"/> <!-- Set to Program.Steps -->
</ScrollContainer>
</BoxContainer>
</controls:FancyWindow>
@@ -1,202 +0,0 @@
using Content.Client.UserInterface.Controls;
using Content.Shared._Shitmed.Autodoc;
using Content.Shared._Shitmed.Autodoc.Components;
using Content.Shared._Shitmed.Autodoc.Systems;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Serialization.Manager;
using Robust.Shared.Timing;
using System.IO;
namespace Content.Client._Shitmed.Autodoc;
[GenerateTypedNameReferences]
public sealed partial class AutodocProgramWindow : FancyWindow
{
[Dependency] private readonly IEntityManager _entMan = default!;
[Dependency] private readonly IFileDialogManager _dialogManager = default!;
[Dependency] private readonly ILogManager _logMan = default!;
[Dependency] private readonly ISerializationManager _serMan = default!;
private SharedAutodocSystem _autodoc = default!;
public event Action? OnToggleSafety;
public event Action? OnRemoveProgram;
public event Action<IAutodocStep, int>? OnAddStep;
public event Action<int>? OnRemoveStep;
public event Action? OnStart;
private EntityUid _owner;
private AutodocProgram _program;
private int _steps;
private bool _safety = true;
private ISawmill _sawmill;
private int? _selected;
private AddStepWindow? _addStep;
public AutodocProgramWindow(EntityUid owner, AutodocProgram program)
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_autodoc = _entMan.System<SharedAutodocSystem>();
_owner = owner;
_program = program;
_sawmill = _logMan.GetSawmill("autodoc-ui");
OnClose += () => _addStep?.Close();
SafetyButton.OnPressed += _ =>
{
OnToggleSafety?.Invoke();
program.SkipFailed ^= true;
UpdateSafety();
};
UpdateSafety();
RemoveButton.OnPressed += _ =>
{
OnRemoveProgram?.Invoke();
Close();
};
AddStepButton.OnPressed += _ =>
{
if (_addStep is {} window)
{
window.MoveToFront();
return;
}
_addStep = new AddStepWindow();
_addStep.OnAddStep += step =>
{
// if nothing is selected add it to the end
// if something is selected, insert just before it
var index = _selected ?? program.Steps.Count;
OnAddStep?.Invoke(step, index);
_selected = null;
RemoveButton.Disabled = true;
program.Steps.Insert(index, step);
UpdateSteps();
};
_addStep.OnClose += () => _addStep = null;
_addStep.OpenCentered();
};
RemoveStepButton.OnPressed += _ =>
{
if (_selected is not {} index)
return;
_selected = null;
RemoveStepButton.Disabled = true;
OnRemoveStep?.Invoke(index);
// Steps.RemoveChild throws for no fucking reason so rebuild it
program.Steps.RemoveAt(index);
UpdateSteps();
};
StartButton.OnPressed += _ =>
{
OnStart?.Invoke();
Close();
};
ExportProgramButton.OnPressed += _ =>
{
ExportProgram();
};
Steps.OnItemSelected += args =>
{
_selected = args.ItemIndex;
RemoveStepButton.Disabled = false;
};
Steps.OnItemDeselected += _ =>
{
_selected = null;
RemoveStepButton.Disabled = true;
};
UpdateSteps();
UpdateSafety();
}
private async void ExportProgram()
{
if (await _dialogManager.SaveFile(new FileDialogFilters(new FileDialogFilters.Group("yml"))) is not {} file)
return;
try
{
var node = _serMan.WriteValue(_program.GetType(), _program);
await using var writer = new StreamWriter(file.fileStream);
node.Write(writer);
}
catch (Exception e)
{
_sawmill.Error($"Error when exporting program: {e}");
}
finally
{
await file.fileStream.DisposeAsync();
}
}
private void UpdateSafety()
{
var safety = !_program.SkipFailed;
if (safety == _safety)
return;
_safety = safety;
SafetyButton.Text = Loc.GetString("autodoc-safety-" + (safety ? "enabled" : "disabled"));
if (safety)
SafetyButton.RemoveStyleClass("Caution");
else
SafetyButton.AddStyleClass("Caution");
}
private void UpdateSteps()
{
var count = _program.Steps.Count;
if (_steps == count)
return;
_steps = count;
Steps.Clear();
for (int i = 0; i < count; i++)
{
Steps.AddItem(_program.Steps[i].Title);
}
if (!_entMan.TryGetComponent<AutodocComponent>(_owner, out var comp))
return;
AddStepButton.Disabled = count >= comp.MaxProgramSteps;
}
private void UpdateStart()
{
if (!_entMan.TryGetComponent<AutodocComponent>(_owner, out var comp))
return;
StartButton.Disabled = _autodoc.GetPatient((_owner, comp)) == null;
}
protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
UpdateSteps();
UpdateSafety();
UpdateStart();
}
}
@@ -1,15 +0,0 @@
<controls:FancyWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'autodoc-title'}">
<BoxContainer Orientation="Vertical">
<ScrollContainer MinWidth="600" MinHeight="400" VerticalExpand="True">
<BoxContainer Name="Programs" Orientation="Vertical"/> <!-- Populated at runtime -->
</ScrollContainer>
<BoxContainer Orientation="Horizontal" Margin="5 5 5 5" Align="Center">
<Button Name="CreateProgramButton" StyleClasses="OpenRight" Text="{Loc 'autodoc-create-program'}"/>
<Button Name="ImportProgramButton" StyleClasses="OpenLeft" Text="{Loc 'autodoc-import-program'}"/>
</BoxContainer>
<Button Name="AbortButton" MaxWidth="350" Text="{Loc 'autodoc-abort-program'}" Disabled="True"/>
</BoxContainer>
</controls:FancyWindow>
@@ -1,222 +0,0 @@
using Content.Client.UserInterface.Controls;
using Content.Shared.Administration;
using Content.Shared._Shitmed.Autodoc;
using Content.Shared._Shitmed.Autodoc.Components;
using Content.Shared._Shitmed.Autodoc.Systems;
using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects;
using Robust.Client.Player;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Timing;
using Robust.Client.UserInterface;
using Robust.Shared.Serialization.Manager;
using Robust.Shared.Utility;
using System.IO;
using YamlDotNet.RepresentationModel;
using Robust.Shared.Serialization.Markdown;
namespace Content.Client._Shitmed.Autodoc;
[GenerateTypedNameReferences]
public sealed partial class AutodocWindow : FancyWindow
{
[Dependency] private readonly IEntityManager _entMan = default!;
[Dependency] private readonly IFileDialogManager _dialogMan = default!;
[Dependency] private readonly IPlayerManager _player = default!;
[Dependency] private readonly ISerializationManager _serMan = default!;
[Dependency] private readonly ILogManager _logMan = default!;
private SharedAutodocSystem _autodoc;
private EntityUid _owner;
private bool _active;
private int _programCount = 0;
private ISawmill _sawmill;
public event Action<string>? OnCreateProgram;
public event Action<int>? OnToggleProgramSafety;
public event Action<int>? OnRemoveProgram;
public event Action<int, IAutodocStep, int>? OnAddStep;
public event Action<int, int>? OnRemoveStep;
public event Action<int>? OnStart;
public event Action? OnStop;
public event Action<AutodocProgram>? OnImportProgram;
private DialogWindow? _dialog;
private AutodocProgramWindow? _currentProgram;
public AutodocWindow(EntityUid owner, IEntityManager entMan, IPlayerManager player)
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_sawmill = _logMan.GetSawmill("autodoc-ui");
_autodoc = entMan.System<SharedAutodocSystem>();
_owner = owner;
OnClose += () =>
{
_dialog?.Close();
_currentProgram?.Close();
};
ImportProgramButton.OnPressed += _ =>
{
ImportProgram();
};
CreateProgramButton.OnPressed += _ =>
{
if (_dialog != null)
{
_dialog.MoveToFront();
return;
}
if (!_entMan.TryGetComponent<AutodocComponent>(_owner, out var comp))
return;
var field = "title";
var prompt = Loc.GetString("autodoc-program-title");
var placeholder = Loc.GetString("autodoc-program-title-placeholder", ("number", comp.Programs.Count + 1));
var entry = new QuickDialogEntry(field, QuickDialogEntryType.ShortText, prompt, placeholder);
var entries = new List<QuickDialogEntry> { entry };
_dialog = new DialogWindow(CreateProgramButton.Text!, entries);
_dialog.OnConfirmed += responses =>
{
var title = responses[field].Trim();
if (title.Length < 1 || title.Length > comp.MaxProgramTitleLength)
return;
OnCreateProgram?.Invoke(title);
};
// prevent MoveToFront being called on a closed window and double closing
_dialog.OnClose += () => _dialog = null;
};
AbortButton.AddStyleClass("Caution");
AbortButton.OnPressed += _ => OnStop?.Invoke();
UpdateActive();
UpdatePrograms();
}
public void UpdateActive()
{
if (!_entMan.TryGetComponent<AutodocComponent>(_owner, out var comp))
return;
// UI must be in the inactive state by default, since this wont run when inactive at startup
var active = _entMan.HasComponent<ActiveAutodocComponent>(_owner);
if (active == _active)
return;
_active = active;
CreateProgramButton.Disabled = active || _programCount >= comp.MaxPrograms;
AbortButton.Disabled = !active;
foreach (var button in Programs.Children)
{
((Button) button).Disabled = active;
}
if (!active)
return;
// close windows that can only be open when inactive
_dialog?.Close();
_currentProgram?.Close();
}
private void UpdatePrograms()
{
if (!_entMan.TryGetComponent<AutodocComponent>(_owner, out var comp))
return;
var count = comp.Programs.Count;
if (count == _programCount)
return;
_programCount = count;
CreateProgramButton.Disabled = _active || _programCount >= comp.MaxPrograms;
Programs.RemoveAllChildren();
for (int i = 0; i < comp.Programs.Count; i++)
{
var button = new Button()
{
Text = comp.Programs[i].Title
};
var index = i;
button.OnPressed += _ => OpenProgram(index);
button.Disabled = _active;
Programs.AddChild(button);
}
}
private async void ImportProgram()
{
if (await _dialogMan.OpenFile(new FileDialogFilters(new FileDialogFilters.Group("yml"))) is not {} file)
return;
try
{
using var reader = new StreamReader(file, EncodingHelpers.UTF8);
var yamlStream = new YamlStream();
yamlStream.Load(reader);
var root = yamlStream.Documents[0].RootNode;
var program = _serMan.Read<AutodocProgram>(root.ToDataNode(), notNullableOverride: true);
OnImportProgram?.Invoke(program);
}
catch (Exception e)
{
_sawmill.Error($"Error when importing program: {e}");
}
}
private void OpenProgram(int index)
{
if (!_entMan.TryGetComponent<AutodocComponent>(_owner, out var comp))
return;
// no editing multiple programs at once
if (_currentProgram is {} existing)
existing.Close();
var window = new AutodocProgramWindow(_owner, comp.Programs[index]);
window.OnToggleSafety += () => OnToggleProgramSafety?.Invoke(index);
window.OnRemoveProgram += () =>
{
OnRemoveProgram?.Invoke(index);
Programs.RemoveChild(index);
};
window.OnAddStep += (step, stepIndex) => OnAddStep?.Invoke(index, step, stepIndex);
window.OnRemoveStep += step => OnRemoveStep?.Invoke(index, step);
window.OnStart += () =>
{
if (_active)
return;
OnStart?.Invoke(index);
// predict it starting the program
_entMan.EnsureComponent<ActiveAutodocComponent>(_owner);
};
window.OnClose += () => _currentProgram = null;
_currentProgram = window;
window.OpenCentered();
}
protected override void FrameUpdate(FrameEventArgs args)
{
base.FrameUpdate(args);
UpdateActive();
UpdatePrograms();
}
}
@@ -1,20 +0,0 @@
<controls:FancyWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'autodoc-add-step-surgery'}"
MinSize="600 400">
<BoxContainer Orientation="Horizontal" VerticalExpand="True" HorizontalExpand="True">
<BoxContainer Orientation="Vertical" MinWidth="200" HorizontalAlignment="Center">
<BoxContainer Name="Symmetry" Orientation="Horizontal" HorizontalExpand="True"/> <!-- Populated with a radio option of BodyPartSymmetry values -->
<PanelContainer StyleClasses="LowDivider" Margin="0 5 0 5"/>
<ScrollContainer VerticalExpand="True" HorizontalExpand="True">
<ItemList Name="Parts"/> <!-- Populated with BodyPartType values -->
</ScrollContainer>
<PanelContainer StyleClasses="LowDivider" Margin="0 5 0 5"/>
<Button Name="SubmitButton" Text="{Loc 'autodoc-submit'}" Disabled="True"/>
</BoxContainer>
<ScrollContainer HorizontalExpand="True">
<ItemList Name="Surgeries"/> <!-- Populated with SharedSurgerySystem.AllSurgeries -->
</ScrollContainer>
</BoxContainer>
</controls:FancyWindow>
@@ -1,147 +0,0 @@
using Content.Client.UserInterface.Controls;
using Content.Shared._Shitmed.Autodoc;
using Content.Shared._Shitmed.Medical.Surgery;
using Content.Shared._Shitmed.Medical.Surgery.Conditions;
using Content.Shared.Body.Part;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client._Shitmed.Autodoc;
[GenerateTypedNameReferences]
public sealed partial class PickSurgeryWindow : FancyWindow
{
[Dependency] private readonly IEntityManager _entMan = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
private readonly SharedSurgerySystem _surgery;
public event Action<IAutodocStep>? OnAddStep;
private BodyPartType? _part;
private BodyPartSymmetry? _symmetry;
private EntProtoId<SurgeryComponent>? _surgeryId;
public PickSurgeryWindow()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_surgery = _entMan.System<SharedSurgerySystem>();
OnAddStep += _ => Close();
var options = new RadioOptions<BodyPartSymmetry?>(RadioOptionsLayout.Horizontal);
options.ButtonStyle = "OpenBoth";
options.FirstButtonStyle = "OpenRight";
options.LastButtonStyle = "OpenLeft";
options.AddItem(Loc.GetString("autodoc-body-symmetry-ignored"), null);
foreach (var symmetry in Enum.GetValues<BodyPartSymmetry>())
{
var name = Loc.GetString("autodoc-body-symmetry-" + symmetry.ToString());
options.AddItem(name, symmetry);
}
Symmetry.AddChild(options);
options.OnItemSelected += args =>
{
args.Button.Select(args.Id);
_symmetry = args.Button.SelectedValue;
UpdateSurgeries();
};
foreach (var part in Enum.GetValues<BodyPartType>())
{
var name = Loc.GetString("autodoc-body-part-" + part.ToString());
Parts.AddItem(name, metadata: part);
}
Parts.OnItemSelected += args =>
{
if (Parts[args.ItemIndex].Metadata is not BodyPartType part)
return;
_part = part;
UpdateSubmit();
UpdateSurgeries();
};
Parts.OnItemDeselected += _ =>
{
_part = null;
SubmitButton.Disabled = true;
};
Surgeries.OnItemSelected += args =>
{
if (Surgeries[args.ItemIndex].Metadata is not EntProtoId<SurgeryComponent> id)
return;
_surgeryId = id;
UpdateSubmit();
};
Surgeries.OnItemDeselected += _ =>
{
_surgeryId = null;
SubmitButton.Disabled = true;
};
SubmitButton.OnPressed += _ =>
{
var step = new SurgeryAutodocStep()
{
Part = _part!.Value,
Symmetry = _symmetry,
Surgery = _surgeryId!.Value
};
OnAddStep?.Invoke(step);
};
UpdateSurgeries();
}
// doesn't handle prototype reload so you have to reopen the window to see new surgeries
private void UpdateSurgeries()
{
Surgeries.Clear();
foreach (var id in _surgery.AllSurgeries)
{
var name = _proto.Index(id).Name;
var protoId = new EntProtoId<SurgeryComponent>(id);
if (_part is not BodyPartType part)
{
Surgeries.AddItem(name, metadata: protoId);
continue;
}
var ent = _surgery.GetSingleton(protoId);
if (ent is null)
continue;
if (!_entMan.TryGetComponent<SurgeryPartConditionComponent>(ent.Value, out var comp))
{
Surgeries.AddItem(name, metadata: protoId);
continue;
}
var partOk = comp.Part == part;
var symmetryOk = (comp.Symmetry == null || _symmetry == null) ? true : comp.Symmetry == _symmetry;
var passesFilter = (partOk && symmetryOk) ^ comp.Inverse;
if (passesFilter)
Surgeries.AddItem(name, metadata: protoId);
}
Surgeries.SortItemsByText();
}
private void UpdateSubmit()
{
// symmetry is optional, others are not
SubmitButton.Disabled = _part == null || _surgeryId == null;
}
}
@@ -1,5 +0,0 @@
using Content.Shared._Shitmed.Autodoc.Systems;
namespace Content.Client._Shitmed.Autodoc.Systems;
public sealed class AutodocSystem : SharedAutodocSystem;
@@ -1,7 +0,0 @@
// DeltaV - When "Fix eating and drinking verbs showing up after a short delay and making your verb UI bounce (#38164)"
// was merged from upstream, it moved StomachComponent into shared, causing a duplicate component registered
// crash on client startup. I have no idea if me commenting this out is problematic, but i don't think so?
//namespace Content.Client._Shitmed.Body.Components;
//[RegisterComponent]
//public sealed partial class StomachComponent : Component { }
@@ -1,17 +0,0 @@
<ui:ChoiceControl
xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client._Shitmed.Choice.UI">
<BoxContainer Orientation="Horizontal">
<Button Name="Button" Access="Public"
HorizontalExpand="True" VerticalExpand="False"
StyleClasses="ButtonSquare" Margin="0">
<BoxContainer Orientation="Horizontal" Margin="0">
<TextureRect Name="Texture" Access="Public"
HorizontalExpand="False" VerticalExpand="False"
Margin="1"/>
<Control MinWidth="5"/>
<RichTextLabel Name="NameLabel" Access="Public" VerticalAlignment="Center"/>
</BoxContainer>
</Button>
</BoxContainer>
</ui:ChoiceControl>
@@ -1,26 +0,0 @@
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Utility;
namespace Content.Client._Shitmed.Choice.UI;
[GenerateTypedNameReferences]
[Virtual]
public partial class ChoiceControl : Control
{
public ChoiceControl() => RobustXamlLoader.Load(this);
public void Set(string name, Texture? texture)
{
NameLabel.SetMessage(name);
Texture.Texture = texture;
}
public void Set(FormattedMessage msg, Texture? texture)
{
NameLabel.SetMessage(msg);
Texture.Texture = texture;
}
}
@@ -1,473 +0,0 @@
using Content.Client._Shitmed.Choice.UI;
using Content.Client.Administration.UI.CustomControls;
using Content.Shared._Shitmed.Medical.Surgery;
using Content.Shared._Shitmed.Medical.Surgery.Steps.Parts; // DeltaV - New UI
using Content.Shared.Body.Components;
using Content.Shared.Body.Part;
using Content.Shared.Humanoid;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
using Robust.Client.Player;
using Robust.Client.UserInterface.Controls; // DeltaV - New UI
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Client._Shitmed.Medical.Surgery;
[UsedImplicitly]
public sealed class SurgeryBui : BoundUserInterface
{
[Dependency] private readonly IEntityManager _entities = default!;
[Dependency] private readonly IPlayerManager _player = default!;
private readonly SurgerySystem _system;
[ViewVariables]
private SurgeryWindow? _window;
private EntityUid? _part;
private bool _isBody;
private (EntityUid Ent, EntProtoId Proto)? _surgery;
private readonly List<EntProtoId> _previousSurgeries = new();
private (EntityUid Ent, TextureButton)? _previousPart; // DeltaV - New UI
public SurgeryBui(EntityUid owner, Enum uiKey) : base(owner, uiKey) => _system = _entities.System<SurgerySystem>();
protected override void ReceiveMessage(BoundUserInterfaceMessage message)
{
if (_window is null
|| message is not SurgeryBuiRefreshMessage)
return;
RefreshUI();
}
protected override void UpdateState(BoundUserInterfaceState state)
{
if (state is not SurgeryBuiState s)
return;
Update(s);
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
_window?.Dispose();
}
private void Update(SurgeryBuiState state)
{
if (_window == null)
{
_window = new SurgeryWindow();
_window.OnClose += Close;
_window.Title = Loc.GetString("surgery-ui-window-title");
_window.PartsButton.OnPressed += _ =>
{
_part = null;
_isBody = false;
_surgery = null;
_previousSurgeries.Clear();
DeactivateOtherParts(); // DeltaV - New UI
View(ViewType.Parts);
};
_window.SurgeriesButton.OnPressed += _ =>
{
_surgery = null;
_previousSurgeries.Clear();
if (!_entities.TryGetNetEntity(_part, out var netPart)
|| State is not SurgeryBuiState s
|| !s.Choices.TryGetValue(netPart.Value, out var surgeries))
return;
OnPartPressed(netPart.Value, surgeries);
};
_window.StepsButton.OnPressed += _ =>
{
if (!_entities.TryGetNetEntity(_part, out var netPart)
|| _previousSurgeries.Count == 0)
return;
var last = _previousSurgeries[^1];
_previousSurgeries.RemoveAt(_previousSurgeries.Count - 1);
if (_system.GetSingleton(last) is not { } previousId
|| !_entities.TryGetComponent(previousId, out SurgeryComponent? previous))
return;
OnSurgeryPressed((previousId, previous), netPart.Value, last);
};
}
_window.Surgeries.RemoveAllChildren();
_window.Steps.RemoveAllChildren();
_window.Parts.RemoveAllChildren();
View(ViewType.Parts);
var oldSurgery = _surgery;
var oldPart = _part;
_part = null;
_surgery = null;
var options = new List<(NetEntity netEntity, EntityUid entity, string Name, BodyPartType? PartType)>();
foreach (var choice in state.Choices.Keys)
if (_entities.TryGetEntity(choice, out var ent))
{
if (_entities.TryGetComponent(ent, out BodyPartComponent? part))
options.Add((choice, ent.Value, _entities.GetComponent<MetaDataComponent>(ent.Value).EntityName, part.PartType));
else if (_entities.TryGetComponent(ent, out BodyComponent? body))
options.Add((choice, ent.Value, _entities.GetComponent<MetaDataComponent>(ent.Value).EntityName, null));
}
options.Sort((a, b) =>
{
int GetScore(BodyPartType? partType)
{
return partType switch
{
BodyPartType.Head => 1,
BodyPartType.Torso => 2,
BodyPartType.Arm => 3,
BodyPartType.Hand => 4,
BodyPartType.Leg => 5,
BodyPartType.Foot => 6,
// BodyPartType.Tail => 7, No tails yet!
BodyPartType.Other => 8,
_ => 9
};
}
return GetScore(a.PartType) - GetScore(b.PartType);
});
// DeltaV Start - New UI
foreach (var textureButton in _window.Buttons)
{
textureButton.Visible = false;
textureButton.StyleIdentifier = "SurgeryTextureButton";
}
// DeltaV End - New UI
foreach (var (netEntity, entity, partName, bodyPartType) in options) // DeltaV - New UI
{
//var netPart = _entities.GetNetEntity(part.Owner);
var surgeries = state.Choices[netEntity];
// Delta Start - New UI
var button = GetBodyPartTextureButton(entity, bodyPartType);
if (button != null)
{
button.Visible = true;
button.OnPressed += _ => OnPartPressed(netEntity, surgeries);
if (_entities.HasComponent<IncisionOpenComponent>(entity))
button.StyleIdentifier = "OpenIncision";
}
else
{
var partButton = new ChoiceControl();
partButton.Set(partName, null);
partButton.Button.OnPressed += _ => OnPartPressed(netEntity, surgeries);
_window.Parts.AddChild(partButton);
}
// Delta End - New UI
foreach (var surgeryId in surgeries)
{
if (_system.GetSingleton(surgeryId) is not { } surgery ||
!_entities.TryGetComponent(surgery, out SurgeryComponent? surgeryComp))
continue;
if (oldPart == entity && oldSurgery?.Proto == surgeryId)
OnSurgeryPressed((surgery, surgeryComp), netEntity, surgeryId);
}
if (oldPart == entity && oldSurgery == null)
OnPartPressed(netEntity, surgeries);
}
if (!_window.IsOpen)
_window.OpenCentered();
}
private void AddStep(EntProtoId stepId, NetEntity netPart, EntProtoId surgeryId)
{
if (_window == null
|| _system.GetSingleton(stepId) is not { } step)
return;
var stepName = new FormattedMessage();
stepName.AddText(_entities.GetComponent<MetaDataComponent>(step).EntityName);
var stepButton = new SurgeryStepButton { Step = step };
stepButton.Button.OnPressed += _ => SendMessage(new SurgeryStepChosenBuiMsg(netPart, surgeryId, stepId, _isBody));
_window.Steps.AddChild(stepButton);
}
private void OnSurgeryPressed(Entity<SurgeryComponent> surgery, NetEntity netPart, EntProtoId surgeryId)
{
if (_window == null)
return;
_part = _entities.GetEntity(netPart);
_isBody = _entities.HasComponent<BodyComponent>(_part);
_surgery = (surgery, surgeryId);
_window.Steps.RemoveAllChildren();
// This apparently does not consider if theres multiple surgery requirements in one surgery. Maybe thats fine.
if (surgery.Comp.Requirement is { } requirementId && _system.GetSingleton(requirementId) is { } requirement)
{
var label = new ChoiceControl();
label.Button.OnPressed += _ =>
{
_previousSurgeries.Add(surgeryId);
if (_entities.TryGetComponent(requirement, out SurgeryComponent? requirementComp))
OnSurgeryPressed((requirement, requirementComp), netPart, requirementId);
};
var msg = new FormattedMessage();
var surgeryName = _entities.GetComponent<MetaDataComponent>(requirement).EntityName;
msg.AddMarkup($"[bold]{Loc.GetString("surgery-ui-window-require")}: {surgeryName}[/bold]");
label.Set(msg, null);
_window.Steps.AddChild(label);
_window.Steps.AddChild(new HSeparator { Margin = new Thickness(0, 0, 0, 1) });
}
foreach (var stepId in surgery.Comp.Steps)
AddStep(stepId, netPart, surgeryId);
View(ViewType.Steps);
RefreshUI();
}
private void OnPartPressed(NetEntity netPart, List<EntProtoId> surgeryIds)
{
if (_window == null)
return;
_part = _entities.GetEntity(netPart);
_isBody = _entities.HasComponent<BodyComponent>(_part);
// DeltaV Start - New UI
var bodyPart = _entities.GetComponent<BodyPartComponent>(_part.Value);
var body = bodyPart.Body!.Value;
if (_previousPart != null)
{
(var previousEnt, var previousButton) = _previousPart.Value;
if (!_entities.HasComponent<IncisionOpenComponent>(previousEnt))
previousButton.StyleIdentifier = "SurgeryTextureButton";
}
var button = GetBodyPartTextureButton(_part.Value, bodyPart.PartType);
if (button != null && button.Pressed)
{
_previousPart = (_part.Value, button);
DeactivateOtherParts(button);
}
else if (button != null && !button.Pressed)
{
_part = null;
_isBody = false;
_surgery = null;
_previousSurgeries.Clear();
View(ViewType.Parts);
return;
}
// DeltaV End - New UI
_window.Surgeries.RemoveAllChildren();
var surgeries = new List<(Entity<SurgeryComponent> Ent, EntProtoId Id, string Name)>();
foreach (var surgeryId in surgeryIds)
{
if (_system.GetSingleton(surgeryId) is not { } surgery ||
!_entities.TryGetComponent(surgery, out SurgeryComponent? surgeryComp))
{
continue;
}
// Begin DeltaV Additions - only show surgeries with completed requirements
if (surgeryComp.Requirement is { } reqId && _system.GetSingleton(reqId) is { } reqUid)
{
if (!_entities.TryGetComponent<SurgeryComponent>(reqUid, out var reqComp) ||
!_system.PreviousStepsComplete(body, _part.Value, (reqUid, reqComp), string.Empty)) // step is unused as this is only for checking the requirement
{
// don't show any surgeries whose requirement isn't complete
continue;
}
}
// End DeltaV Additions
var name = _entities.GetComponent<MetaDataComponent>(surgery).EntityName;
surgeries.Add(((surgery, surgeryComp), surgeryId, name));
}
surgeries.Sort((a, b) =>
{
var priority = a.Ent.Comp.Priority.CompareTo(b.Ent.Comp.Priority);
if (priority != 0)
return priority;
return string.Compare(a.Name, b.Name, StringComparison.Ordinal);
});
foreach (var surgery in surgeries)
{
var surgeryButton = new ChoiceControl();
surgeryButton.Set(surgery.Name, null);
surgeryButton.Button.OnPressed += _ => OnSurgeryPressed(surgery.Ent, netPart, surgery.Id);
_window.Surgeries.AddChild(surgeryButton);
}
RefreshUI();
View(ViewType.Surgeries);
}
// DeltaV Start - New UI
private TextureButton? GetBodyPartTextureButton(EntityUid entity, BodyPartType? partType)
{
if (_window == null
|| !_entities.TryGetComponent(entity, out BodyPartComponent? bodyPart))
return null;
var isLeftPart = bodyPart.Symmetry.HasFlag(BodyPartSymmetry.Left);
switch (partType)
{
case BodyPartType.Torso:
var isHumanoid = _entities.HasComponent<HumanoidAppearanceComponent>(bodyPart.Body);
return isHumanoid ? _window.ChestButton : _window.CarpButton;
case BodyPartType.Head:
return _window.HeadButton;
case BodyPartType.Arm:
return isLeftPart ? _window.LArmButton : _window.RArmButton;
case BodyPartType.Hand:
return isLeftPart ? _window.LHandButton : _window.RHandButton;
case BodyPartType.Leg:
return isLeftPart ? _window.LLegButton : _window.RLegButton;
case BodyPartType.Foot:
return isLeftPart ? _window.LFootButton : _window.RFootButton;
case BodyPartType.Tail:
case BodyPartType.Other:
case null:
return null;
default:
throw new ArgumentOutOfRangeException(nameof(partType), partType, null);
}
}
/// <summary>
/// Deactivates all other buttons that are currently active.
/// </summary>
/// <param name="activatedButton">The button that should be the only active button.</param>
private void DeactivateOtherParts(TextureButton? activatedButton = null)
{
if (_window == null)
return;
foreach (var button in _window.Buttons)
{
if (activatedButton == button)
continue;
button.Pressed = false;
}
}
// DeltaV End - New UI
private void RefreshUI()
{
if (_window == null
|| !_window.IsOpen
|| _part == null
|| !_entities.HasComponent<SurgeryComponent>(_surgery?.Ent)
|| !_entities.TryGetComponent(_player.LocalEntity ?? EntityUid.Invalid, out SurgeryTargetComponent? surgeryComp)
|| !surgeryComp.CanOperate)
return;
var next = _system.GetNextStep(Owner, _part.Value, _surgery.Value.Ent);
var i = 0;
foreach (var child in _window.Steps.Children)
{
if (child is not SurgeryStepButton stepButton)
continue;
var status = StepStatus.Incomplete;
if (next == null)
status = StepStatus.Complete;
else if (next.Value.Surgery.Owner != _surgery.Value.Ent)
status = StepStatus.Incomplete;
else if (next.Value.Step == i)
status = StepStatus.Next;
else if (i < next.Value.Step)
status = StepStatus.Complete;
stepButton.Button.Disabled = status != StepStatus.Next;
var stepName = new FormattedMessage();
stepName.AddText(_entities.GetComponent<MetaDataComponent>(stepButton.Step).EntityName);
if (status == StepStatus.Complete)
stepButton.Button.Modulate = Color.Green;
else
{
stepButton.Button.Modulate = Color.White;
if (_player.LocalEntity is { } player
&& status == StepStatus.Next
&& !_system.CanPerformStep(player, Owner, _part.Value, stepButton.Step, false, out var popup, out var reason, out _))
stepButton.ToolTip = popup;
}
var texture = _entities.GetComponentOrNull<SpriteComponent>(stepButton.Step)?.Icon?.Default;
stepButton.Set(stepName, texture);
i++;
}
}
private void View(ViewType type)
{
if (_window == null)
return;
_window.PartsButton.Parent!.Margin = new Thickness(0, 0, 0, 10);
_window.Parts.Visible = type == ViewType.Parts;
_window.PartsButton.Disabled = type == ViewType.Parts;
_window.Surgeries.Visible = type == ViewType.Surgeries;
_window.SurgeriesButton.Disabled = type != ViewType.Steps;
_window.Steps.Visible = type == ViewType.Steps;
_window.StepsButton.Disabled = type != ViewType.Steps || _previousSurgeries.Count == 0;
if (_entities.TryGetComponent(_part, out MetaDataComponent? partMeta) &&
_entities.TryGetComponent(_surgery?.Ent, out MetaDataComponent? surgeryMeta))
_window.Title = $"Surgery - {partMeta.EntityName}, {surgeryMeta.EntityName}";
else if (partMeta != null)
_window.Title = $"Surgery - {partMeta.EntityName}";
else
_window.Title = "Surgery";
}
private enum ViewType
{
Parts,
Surgeries,
Steps
}
private enum StepStatus
{
Next,
Complete,
Incomplete
}
}
@@ -1,4 +0,0 @@
<controls:SurgeryStepButton
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client._Shitmed.Medical.Surgery">
</controls:SurgeryStepButton>
@@ -1,16 +0,0 @@
using Content.Client._Shitmed.Choice.UI;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._Shitmed.Medical.Surgery;
[GenerateTypedNameReferences]
public sealed partial class SurgeryStepButton : ChoiceControl
{
public EntityUid Step { get; set; }
public SurgeryStepButton()
{
RobustXamlLoader.Load(this);
}
}
@@ -1,11 +0,0 @@
using Content.Shared._Shitmed.Medical.Surgery;
namespace Content.Client._Shitmed.Medical.Surgery;
public sealed class SurgerySystem : SharedSurgerySystem
{
public override void Initialize()
{
base.Initialize();
}
}
@@ -1,80 +0,0 @@
<controls:FancyWindow
xmlns="https://spacestation14.io"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:customcontrols="clr-namespace:Content.Client.Administration.UI.CustomControls"
xmlns:ui="clr-namespace:Content.Client._Shitmed.Medical.Surgery"
MinSize="400 400">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" VerticalExpand="True" MinSize="570, 336">
<BoxContainer Orientation="Vertical" HorizontalExpand="False" VerticalExpand="False" MinSize="264, 408">
<TextureRect Name="Texture" TextureScale="6 6"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUIBackground.png" Access="Public"
HorizontalAlignment="Center" VerticalAlignment="Center"
Stretch="KeepAspectCentered" StyleClasses="">
<PanelContainer>
<TextureButton
Name="CarpButton" Scale="8 8" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0 0 0 11"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUICarp.png" Access="Public"/>
<TextureButton
Name="ChestButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0 0 0 11"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUITorso.png" Access="Public"/>
<TextureButton
Name="HeadButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Top" HorizontalAlignment="Center" Margin="0 30 0 0"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUIHead.png" Access="Public"/>
<TextureButton
Name="RArmButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Center" HorizontalAlignment="Left" Margin="30 0 0 47"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUIRArm.png" Access="Public"/>
<TextureButton
Name="RHandButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Center" HorizontalAlignment="Left" Margin="30 61 0 0"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUIRHand.png" Access="Public"/>
<TextureButton
Name="RLegButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="78 0 0 42"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUIRLeg.png" Access="Public"/>
<TextureButton
Name="RFootButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="54 0 0 30"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUIRFoot.png" Access="Public"/>
<TextureButton
Name="LArmButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0 0 30 47"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUILArm.png" Access="Public"/>
<TextureButton
Name="LHandButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0 61 30 0"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUILHand.png" Access="Public"/>
<TextureButton
Name="LLegButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0 0 78 42"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUILLeg.png" Access="Public"/>
<TextureButton
Name="LFootButton" Scale="6 6" ToggleMode="True" StyleIdentifier="SurgeryTextureButton" Visible="False"
VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0 0 54 30"
TexturePath="/Textures/_Shitmed/Interface/SurgeryUI/surgeryUILFoot.png" Access="Public"/>
</PanelContainer>
</TextureRect>
</BoxContainer>
<customcontrols:VSeparator StyleClasses="LowDivider" />
<BoxContainer Orientation="Vertical" HorizontalExpand="True" VerticalExpand="True">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" Margin="0 0 0 10">
<Button Name="PartsButton" Access="Public" Text="{Loc 'surgery-ui-window-parts'}"
HorizontalExpand="True" StyleClasses="OpenBoth" />
<Button Name="SurgeriesButton" Access="Public" Text="{Loc 'surgery-ui-window-surgeries'}"
HorizontalExpand="True" StyleClasses="OpenBoth" />
<Button Name="StepsButton" Access="Public" Text="{Loc 'surgery-ui-window-steps'}"
HorizontalExpand="True" StyleClasses="OpenBoth" />
</BoxContainer>
<customcontrols:HSeparator />
<ScrollContainer VScrollEnabled="True" HorizontalExpand="True" VerticalExpand="True">
<BoxContainer Name="Parts" Access="Public" Orientation="Vertical" Visible="False" />
<BoxContainer Name="Surgeries" Access="Public" Orientation="Vertical" Visible="False" />
<BoxContainer Name="Steps" Access="Public" Orientation="Vertical" Visible="False" />
</ScrollContainer>
</BoxContainer>
</BoxContainer>
</controls:FancyWindow>
@@ -1,30 +0,0 @@
using Content.Client.UserInterface.Controls; // DeltaV - New UI
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls; // DeltaV - New UI
using Robust.Client.UserInterface.XAML;
namespace Content.Client._Shitmed.Medical.Surgery;
[GenerateTypedNameReferences]
public sealed partial class SurgeryWindow : FancyWindow
{
public List<TextureButton> Buttons { get; } = []; // DeltaV - New UI
public SurgeryWindow()
{
RobustXamlLoader.Load(this);
// DeltaV Start - New UI
Buttons.Add(ChestButton);
Buttons.Add(HeadButton);
Buttons.Add(LArmButton);
Buttons.Add(LHandButton);
Buttons.Add(RArmButton);
Buttons.Add(RHandButton);
Buttons.Add(LLegButton);
Buttons.Add(LFootButton);
Buttons.Add(RLegButton);
Buttons.Add(RFootButton);
Buttons.Add(CarpButton);
// DeltaV End - New UI
}
}
@@ -1,102 +0,0 @@
using Content.Shared.Input;
using Content.Shared._Shitmed.Targeting;
using Content.Shared._Shitmed.Targeting.Events;
using Robust.Client.Player;
using Robust.Shared.Input.Binding;
using Robust.Shared.Player;
namespace Content.Client._Shitmed.Targeting;
public sealed class TargetingSystem : SharedTargetingSystem
{
[Dependency] private readonly IPlayerManager _playerManager = default!;
public event Action<TargetingComponent>? TargetingStartup;
public event Action? TargetingShutdown;
public event Action<TargetBodyPart>? TargetChange;
public event Action<TargetingComponent>? PartStatusStartup;
public event Action<TargetingComponent>? PartStatusUpdate;
public event Action? PartStatusShutdown;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<TargetingComponent, LocalPlayerAttachedEvent>(HandlePlayerAttached);
SubscribeLocalEvent<TargetingComponent, LocalPlayerDetachedEvent>(HandlePlayerDetached);
SubscribeLocalEvent<TargetingComponent, ComponentStartup>(OnTargetingStartup);
SubscribeLocalEvent<TargetingComponent, ComponentShutdown>(OnTargetingShutdown);
SubscribeNetworkEvent<TargetIntegrityChangeEvent>(OnTargetIntegrityChange);
CommandBinds.Builder
.Bind(ContentKeyFunctions.TargetHead,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.Head)))
.Bind(ContentKeyFunctions.TargetTorso,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.Torso)))
.Bind(ContentKeyFunctions.TargetLeftArm,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftArm)))
.Bind(ContentKeyFunctions.TargetLeftHand,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftHand)))
.Bind(ContentKeyFunctions.TargetRightArm,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightArm)))
.Bind(ContentKeyFunctions.TargetRightHand,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightHand)))
.Bind(ContentKeyFunctions.TargetLeftLeg,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftLeg)))
.Bind(ContentKeyFunctions.TargetLeftFoot,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.LeftFoot)))
.Bind(ContentKeyFunctions.TargetRightLeg,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightLeg)))
.Bind(ContentKeyFunctions.TargetRightFoot,
InputCmdHandler.FromDelegate((session) => HandleTargetChange(session, TargetBodyPart.RightFoot)))
.Register<SharedTargetingSystem>();
}
private void HandlePlayerAttached(EntityUid uid, TargetingComponent component, LocalPlayerAttachedEvent args)
{
TargetingStartup?.Invoke(component);
PartStatusStartup?.Invoke(component);
}
private void HandlePlayerDetached(EntityUid uid, TargetingComponent component, LocalPlayerDetachedEvent args)
{
TargetingShutdown?.Invoke();
PartStatusShutdown?.Invoke();
}
private void OnTargetingStartup(EntityUid uid, TargetingComponent component, ComponentStartup args)
{
if (_playerManager.LocalEntity != uid)
return;
TargetingStartup?.Invoke(component);
PartStatusStartup?.Invoke(component);
}
private void OnTargetingShutdown(EntityUid uid, TargetingComponent component, ComponentShutdown args)
{
if (_playerManager.LocalEntity != uid)
return;
TargetingShutdown?.Invoke();
PartStatusShutdown?.Invoke();
}
private void OnTargetIntegrityChange(TargetIntegrityChangeEvent args)
{
if (!TryGetEntity(args.Uid, out var uid)
|| !_playerManager.LocalEntity.Equals(uid)
|| !TryComp(uid, out TargetingComponent? component)
|| !args.RefreshUi)
return;
PartStatusUpdate?.Invoke(component);
}
private void HandleTargetChange(ICommonSession? session, TargetBodyPart target)
{
if (session == null
|| session.AttachedEntity is not { } uid
|| !TryComp<TargetingComponent>(uid, out var targeting))
return;
TargetChange?.Invoke(target);
}
}
@@ -1,82 +0,0 @@
using Content.Client.Gameplay;
using Content.Client._Shitmed.UserInterface.Systems.PartStatus.Widgets;
using Content.Shared._Shitmed.Targeting;
using Content.Client._Shitmed.Targeting;
using Robust.Client.GameObjects;
using Robust.Client.UserInterface.Controllers;
using Robust.Client.Player;
using Robust.Shared.Utility;
using Robust.Client.Graphics;
namespace Content.Client._Shitmed.UserInterface.Systems.PartStatus;
public sealed class PartStatusUIController : UIController, IOnStateEntered<GameplayState>, IOnSystemChanged<TargetingSystem>
{
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private readonly IEntityNetworkManager _net = default!;
private SpriteSystem _spriteSystem = default!;
private TargetingComponent? _targetingComponent;
private PartStatusControl? PartStatusControl => UIManager.GetActiveUIWidgetOrNull<PartStatusControl>();
public void OnSystemLoaded(TargetingSystem system)
{
system.PartStatusStartup += AddPartStatusControl;
system.PartStatusShutdown += RemovePartStatusControl;
system.PartStatusUpdate += UpdatePartStatusControl;
}
public void OnSystemUnloaded(TargetingSystem system)
{
system.PartStatusStartup -= AddPartStatusControl;
system.PartStatusShutdown -= RemovePartStatusControl;
system.PartStatusUpdate -= UpdatePartStatusControl;
}
public void OnStateEntered(GameplayState state)
{
if (PartStatusControl != null)
{
PartStatusControl.SetVisible(_targetingComponent != null);
if (_targetingComponent != null)
PartStatusControl.SetTextures(_targetingComponent.BodyStatus);
}
}
public void AddPartStatusControl(TargetingComponent component)
{
_targetingComponent = component;
if (PartStatusControl != null)
{
PartStatusControl.SetVisible(_targetingComponent != null);
if (_targetingComponent != null)
PartStatusControl.SetTextures(_targetingComponent.BodyStatus);
}
}
public void RemovePartStatusControl()
{
if (PartStatusControl != null)
PartStatusControl.SetVisible(false);
_targetingComponent = null;
}
public void UpdatePartStatusControl(TargetingComponent component)
{
if (PartStatusControl != null && _targetingComponent != null)
PartStatusControl.SetTextures(_targetingComponent.BodyStatus);
}
public Texture GetTexture(SpriteSpecifier specifier)
{
if (_spriteSystem == null)
_spriteSystem = _entManager.System<SpriteSystem>();
return _spriteSystem.Frame0(specifier);
}
}
@@ -1,57 +0,0 @@
<widgets:PartStatusControl
xmlns="https://spacestation14.io"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:widgets="clr-namespace:Content.Client._Shitmed.UserInterface.Systems.PartStatus.Widgets"
Name="PartStatusIndicator"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<Control>
<PanelContainer>
<TextureRect
Name="DollHead"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollTorso"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollGroin"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollLeftArm"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollLeftHand"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollRightArm"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollRightHand"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollLeftLeg"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollLeftFoot"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollRightLeg"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
<TextureRect
Name="DollRightFoot"
Stretch="KeepAspectCentered"
SetSize="64 64"/>
</PanelContainer>
</Control>
</widgets:PartStatusControl>
@@ -1,50 +0,0 @@
using Content.Client._Shitmed.UserInterface.Systems.PartStatus;
using Content.Shared._Shitmed.Targeting;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Utility;
using System.Linq;
namespace Content.Client._Shitmed.UserInterface.Systems.PartStatus.Widgets;
[GenerateTypedNameReferences]
public sealed partial class PartStatusControl : UIWidget
{
private readonly Dictionary<TargetBodyPart, TextureRect> _partStatusControls;
private readonly PartStatusUIController _controller;
public PartStatusControl()
{
RobustXamlLoader.Load(this);
_controller = UserInterfaceManager.GetUIController<PartStatusUIController>();
_partStatusControls = new Dictionary<TargetBodyPart, TextureRect>
{
{ TargetBodyPart.Head, DollHead },
{ TargetBodyPart.Torso, DollTorso },
{ TargetBodyPart.Groin, DollGroin },
{ TargetBodyPart.LeftArm, DollLeftArm },
{ TargetBodyPart.LeftHand, DollLeftHand },
{ TargetBodyPart.RightArm, DollRightArm },
{ TargetBodyPart.RightHand, DollRightHand },
{ TargetBodyPart.LeftLeg, DollLeftLeg },
{ TargetBodyPart.LeftFoot, DollLeftFoot },
{ TargetBodyPart.RightLeg, DollRightLeg },
{ TargetBodyPart.RightFoot, DollRightFoot }
};
}
public void SetTextures(Dictionary<TargetBodyPart, TargetIntegrity> state)
{
foreach (var (bodyPart, integrity) in state)
{
string enumName = Enum.GetName(typeof(TargetBodyPart), bodyPart) ?? "Unknown";
int enumValue = (int) integrity;
var texture = new SpriteSpecifier.Rsi(new ResPath($"/Textures/_Shitmed/Interface/Targeting/Status/{enumName.ToLowerInvariant()}.rsi"), $"{enumName.ToLowerInvariant()}_{enumValue}");
_partStatusControls[bodyPart].Texture = _controller.GetTexture(texture);
}
}
public void SetVisible(bool visible) => this.Visible = visible;
}
@@ -1,82 +0,0 @@
using Content.Client.Gameplay;
using Content.Client._Shitmed.UserInterface.Systems.Targeting.Widgets;
using Content.Shared._Shitmed.Targeting;
using Content.Client._Shitmed.Targeting;
using Content.Shared._Shitmed.Targeting.Events;
using Robust.Client.UserInterface.Controllers;
using Robust.Client.Player;
namespace Content.Client._Shitmed.UserInterface.Systems.Targeting;
public sealed class TargetingUIController : UIController, IOnStateEntered<GameplayState>, IOnSystemChanged<TargetingSystem>
{
[Dependency] private readonly IEntityManager _entManager = default!;
[Dependency] private readonly IEntityNetworkManager _net = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
private TargetingComponent? _targetingComponent;
private TargetingControl? TargetingControl => UIManager.GetActiveUIWidgetOrNull<TargetingControl>();
public void OnSystemLoaded(TargetingSystem system)
{
system.TargetingStartup += AddTargetingControl;
system.TargetingShutdown += RemoveTargetingControl;
system.TargetChange += CycleTarget;
}
public void OnSystemUnloaded(TargetingSystem system)
{
system.TargetingStartup -= AddTargetingControl;
system.TargetingShutdown -= RemoveTargetingControl;
system.TargetChange -= CycleTarget;
}
public void OnStateEntered(GameplayState state)
{
if (TargetingControl == null)
return;
TargetingControl.SetTargetDollVisible(_targetingComponent != null);
if (_targetingComponent != null)
TargetingControl.SetBodyPartsVisible(_targetingComponent.Target);
}
public void AddTargetingControl(TargetingComponent component)
{
_targetingComponent = component;
if (TargetingControl != null)
{
TargetingControl.SetTargetDollVisible(_targetingComponent != null);
if (_targetingComponent != null)
TargetingControl.SetBodyPartsVisible(_targetingComponent.Target);
}
}
public void RemoveTargetingControl()
{
if (TargetingControl != null)
TargetingControl.SetTargetDollVisible(false);
_targetingComponent = null;
}
public void CycleTarget(TargetBodyPart bodyPart)
{
if (_playerManager.LocalEntity is not { } user
|| _entManager.GetComponent<TargetingComponent>(user) is not { } targetingComponent
|| TargetingControl == null)
return;
var player = _entManager.GetNetEntity(user);
if (bodyPart != targetingComponent.Target)
{
var msg = new TargetChangeEvent(player, bodyPart);
_net.SendSystemNetworkMessage(msg);
TargetingControl?.SetBodyPartsVisible(bodyPart);
}
}
}
@@ -1,216 +0,0 @@
<widgets:TargetingControl
xmlns="https://spacestation14.io"
xmlns:widgets="clr-namespace:Content.Client._Shitmed.UserInterface.Systems.Targeting.Widgets"
Name="TargetingButton"
VerticalExpand="True"
VerticalAlignment="Bottom"
HorizontalAlignment="Right">
<Control HorizontalAlignment="Right">
<TextureRect
Name="TargetDoll"
Stretch="KeepAspectCentered"
SetSize="96 96">
<PanelContainer
SetSize="57 96"
Margin="18 0 0 0"
VerticalAlignment="Bottom"
HorizontalAlignment="Left">
<PanelContainer
SetSize="18 39"
Margin="0 7 0 0"
HorizontalAlignment="Left">
<TextureButton
Name="RightArmButton"
MinSize="18 30"
StyleClasses="TargetDollButtonRightArm"
VerticalAlignment="Top">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/rightarm.png"
Stretch="KeepAspectCentered"
SetSize="12 24"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
<TextureButton
Name="RightHandButton"
MinSize="18 18"
VerticalAlignment="Bottom"
StyleClasses="TargetDollButtonRightHand">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/righthand.png"
Stretch="KeepAspectCentered"
SetSize="12 12"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
</PanelContainer>
<PanelContainer
SetSize="51 90"
Margin="0 64 0 0"
VerticalAlignment="Bottom"
HorizontalAlignment="Center">
<TextureButton
Name="HeadButton"
MinSize="33 27"
VerticalAlignment="Top"
HorizontalAlignment="Center"
StyleClasses="TargetDollButtonHead">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/head.png"
Stretch="KeepAspectCentered"
SetSize="27 21"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
<!--<PanelContainer
SetSize="15 15"
Margin="0 9 0 0"
HorizontalAlignment="Center">
<TextureButton
Name="EyesButton"
MinSize="15 9"
VerticalAlignment="Top"
StyleClasses="TargetDollButtonEyes">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/eyes.png"
Stretch="KeepAspectCentered"
SetSize="15 9"/>
</TextureButton>
<TextureButton
Name="MouthButton"
SetSize="9 6"
VerticalAlignment="Bottom"
StyleClasses="TargetDollButtonMouth">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/mouth.png"
Stretch="KeepAspectCentered"
SetSize="9 6"/>
</TextureButton>
</PanelContainer>-->
</TextureButton>
<TextureButton
Name="ChestButton"
SetSize="33 36"
Margin="0 21 0 0"
VerticalAlignment="Top"
HorizontalAlignment="Center"
StyleClasses="TargetDollButtonChest">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/torso.png"
Stretch="KeepAspectCentered"
SetSize="27 30"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
<PanelContainer
MinSize="45 42"
VerticalAlignment="Bottom"
HorizontalAlignment="Center">
<TextureButton
Name="GroinButton"
MinSize="33 18"
VerticalAlignment="Top"
HorizontalAlignment="Center"
StyleClasses="TargetDollButtonGroin">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/groin.png"
Stretch="KeepAspectCentered"
SetSize="27 12"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
<PanelContainer
MinSize="24 36"
VerticalAlignment="Bottom"
HorizontalAlignment="Right">
<TextureButton
Name="LeftLegButton"
MinSize="18 33"
VerticalAlignment="Top"
HorizontalAlignment="Left"
StyleClasses="TargetDollButtonLeftLeg">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/leftleg.png"
Stretch="KeepAspectCentered"
SetSize="12 27"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
<TextureButton
Name="LeftFootButton"
MinSize="24 12"
VerticalAlignment="Bottom"
StyleClasses="TargetDollButtonLeftFoot">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/leftfoot.png"
Stretch="KeepAspectCentered"
SetSize="18 9"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
</PanelContainer>
<PanelContainer
MinSize="24 36"
VerticalAlignment="Bottom"
HorizontalAlignment="Left">
<TextureButton
Name="RightLegButton"
MinSize="18 33"
VerticalAlignment="Top"
HorizontalAlignment="Right"
StyleClasses="TargetDollButtonRightLeg">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/rightleg.png"
Stretch="KeepAspectCentered"
SetSize="12 27"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
<TextureButton
Name="RightFootButton"
MinSize="24 12"
VerticalAlignment="Bottom"
HorizontalAlignment="Center"
StyleClasses="TargetDollButtonRightFoot">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/rightfoot.png"
Stretch="KeepAspectCentered"
SetSize="18 9"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
</PanelContainer>
</PanelContainer>
</PanelContainer>
<PanelContainer
SetSize="18 39"
Margin="0 7 0 0"
HorizontalAlignment="Right">
<TextureButton
Name="LeftArmButton"
MinSize="18 30"
StyleClasses="TargetDollButtonLeftArm"
VerticalAlignment="Top">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/leftarm.png"
Stretch="KeepAspectCentered"
SetSize="12 24"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
<TextureButton
Name="LeftHandButton"
MinSize="18 18"
VerticalAlignment="Bottom"
StyleClasses="TargetDollButtonLeftHand">
<TextureRect
TexturePath="/Textures/_Shitmed/Interface/Targeting/Doll/lefthand.png"
Stretch="KeepAspectCentered"
SetSize="12 12"
VerticalAlignment="Center"
HorizontalAlignment="Center"/>
</TextureButton>
</PanelContainer>
</PanelContainer>
</TextureRect>
</Control>
</widgets:TargetingControl>
@@ -1,58 +0,0 @@
using System.Linq;
using Content.Shared._Shitmed.Targeting;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._Shitmed.UserInterface.Systems.Targeting.Widgets;
[GenerateTypedNameReferences]
public sealed partial class TargetingControl : UIWidget
{
private readonly TargetingUIController _controller;
private readonly Dictionary<TargetBodyPart, TextureButton> _bodyPartControls;
public TargetingControl()
{
RobustXamlLoader.Load(this);
_controller = UserInterfaceManager.GetUIController<TargetingUIController>();
_bodyPartControls = new Dictionary<TargetBodyPart, TextureButton>
{
// TODO: ADD EYE AND MOUTH TARGETING
{ TargetBodyPart.Head, HeadButton },
{ TargetBodyPart.Torso, ChestButton },
{ TargetBodyPart.Groin, GroinButton },
{ TargetBodyPart.LeftArm, LeftArmButton },
{ TargetBodyPart.LeftHand, LeftHandButton },
{ TargetBodyPart.RightArm, RightArmButton },
{ TargetBodyPart.RightHand, RightHandButton },
{ TargetBodyPart.LeftLeg, LeftLegButton },
{ TargetBodyPart.LeftFoot, LeftFootButton },
{ TargetBodyPart.RightLeg, RightLegButton },
{ TargetBodyPart.RightFoot, RightFootButton },
};
foreach (var bodyPartButton in _bodyPartControls)
{
bodyPartButton.Value.MouseFilter = MouseFilterMode.Stop;
bodyPartButton.Value.OnPressed += _ => SetActiveBodyPart(bodyPartButton.Key);
TargetDoll.Texture = Theme.ResolveTexture("target_doll");
}
}
private void SetActiveBodyPart(TargetBodyPart bodyPart) => _controller.CycleTarget(bodyPart);
public void SetBodyPartsVisible(TargetBodyPart bodyPart)
{
foreach (var bodyPartButton in _bodyPartControls)
bodyPartButton.Value.Children.First().Visible = bodyPartButton.Key == bodyPart;
}
protected override void OnThemeUpdated() => TargetDoll.Texture = Theme.ResolveTexture("target_doll");
public void SetTargetDollVisible(bool visible) => Visible = visible;
}
@@ -47,11 +47,11 @@ public sealed class SaveLoadReparentTest
var parts = bodySystem.GetBodyChildren(human).Skip(1).ToArray();
var organs = bodySystem.GetBodyOrgans(human).ToArray();
Assert.Multiple(() =>
{
Assert.That(parts, Is.Not.Empty);
Assert.That(organs, Is.Not.Empty);
});
// Assert.Multiple(() =>
// {
// Assert.That(parts, Is.Not.Empty);
// Assert.That(organs, Is.Not.Empty);
// });
foreach (var (id, component) in parts)
{
@@ -132,11 +132,11 @@ public sealed class SaveLoadReparentTest
parts = bodySystem.GetBodyChildren(human).Skip(1).ToArray();
organs = bodySystem.GetBodyOrgans(human).ToArray();
Assert.Multiple(() =>
{
Assert.That(parts, Is.Not.Empty);
Assert.That(organs, Is.Not.Empty);
});
// Assert.Multiple(() =>
// {
// Assert.That(parts, Is.Not.Empty);
// Assert.That(organs, Is.Not.Empty);
// });
foreach (var (id, component) in parts)
{
@@ -315,9 +315,7 @@ namespace Content.IntegrationTests.Tests.Buckle
await server.WaitAssertion(() =>
{
// Still buckled
//Assert.That(buckle.Buckled); // goob edit
// he's not supposed to be buckled with the new falling down system
// do i just did this :trollface:
Assert.That(buckle.Buckled);
// Still with items in hand
foreach (var hand in hands.Hands.Keys)
@@ -87,12 +87,8 @@ namespace Content.IntegrationTests.Tests.GameObjects.Components.Mobs
Assert.That(clientAlertsUI.AlertContainer.ChildCount, Is.GreaterThanOrEqualTo(3));
var alertControls = clientAlertsUI.AlertContainer.Children.Select(c => (AlertControl) c);
var alertIDs = alertControls.Select(ac => ac.Alert.ID).ToArray();
// Goobstation - IPC have BorgHealth instead of HumanHealth
var expectedDebugIDs = new[] { "Debug1", "Debug2" };
var expectedHealthIDs = new[] { "BorgHealth", "HumanHealth" };
Assert.That(alertIDs, Is.SupersetOf(expectedDebugIDs));
Assert.That(alertIDs, Has.Some.Matches<string>(item => expectedHealthIDs.Contains(item)));
var expectedIDs = new[] { "HumanHealth", "Debug1", "Debug2" };
Assert.That(alertIDs, Is.SupersetOf(expectedIDs));
});
await server.WaitAssertion(() =>
@@ -108,12 +104,8 @@ namespace Content.IntegrationTests.Tests.GameObjects.Components.Mobs
Assert.That(clientAlertsUI.AlertContainer.ChildCount, Is.GreaterThanOrEqualTo(2));
var alertControls = clientAlertsUI.AlertContainer.Children.Select(c => (AlertControl) c);
var alertIDs = alertControls.Select(ac => ac.Alert.ID).ToArray();
// Goobstation - IPC have BorgHealth instead of HumanHealth
var expectedDebugIDs = new[] { "Debug2" };
var expectedHealthIDs = new[] { "BorgHealth", "HumanHealth" };
Assert.That(alertIDs, Is.SupersetOf(expectedDebugIDs));
Assert.That(alertIDs, Has.Some.Matches<string>(item => expectedHealthIDs.Contains(item)));
var expectedIDs = new[] { "HumanHealth", "Debug2" };
Assert.That(alertIDs, Is.SupersetOf(expectedIDs));
});
await pair.CleanReturnAsync();
@@ -24,7 +24,6 @@ using Content.Shared.Station.Components;
using Robust.Server.GameObjects;
using Robust.Shared.GameObjects;
using Robust.Shared.Map.Components;
using Content.Shared._EE.Silicon.Components; // Goobstation
using Robust.Shared.Prototypes;
namespace Content.IntegrationTests.Tests.GameRules;
@@ -230,15 +229,12 @@ public sealed class NukeOpsTest
var totalSeconds = 30;
var totalTicks = (int) Math.Ceiling(totalSeconds / server.Timing.TickPeriod.TotalSeconds);
var increment = 5;
var resp = entMan.GetComponent<RespiratorComponent>(player);
var damage = entMan.GetComponent<DamageableComponent>(player);
for (var tick = 0; tick < totalTicks; tick += increment)
{
await pair.RunTicksSync(increment);
if (!entMan.HasComponent<SiliconComponent>(player)) // Goobstation - IPC
{
var resp = entMan.GetComponent<RespiratorComponent>(player);
Assert.That(resp.SuffocationCycles, Is.LessThanOrEqualTo(resp.SuffocationCycleThreshold));
}
Assert.That(resp.SuffocationCycles, Is.LessThanOrEqualTo(resp.SuffocationCycleThreshold));
Assert.That(damage.TotalDamage, Is.EqualTo(FixedPoint2.Zero));
}
@@ -1,63 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Content.Shared.Humanoid.Prototypes;
using Robust.Shared.GameObjects;
using Robust.Shared.Prototypes;
namespace Content.IntegrationTests.Tests._Shitmed.Body;
[TestFixture]
public sealed class SpeciesBUiTest
{
[TestPrototypes]
private const string Prototypes = @"
- type: entity
name: BaseMobSpeciesTest
id: BaseMobSpeciesTest
parent: BaseMobSpecies
";
private Dictionary<Enum, InterfaceData> GetInterfaces(UserInterfaceComponent comp) =>
(Dictionary<Enum, InterfaceData>)
typeof(UserInterfaceComponent).GetField("Interfaces", BindingFlags.NonPublic | BindingFlags.Instance)!
.GetValue(comp);
[Test]
public async Task AllSpeciesHaveBaseBUiTest()
{
await using var pair = await PoolManager.GetServerClient(new PoolSettings
{
Dirty = true,
Connected = false
});
var server = pair.Server;
var proto = server.ResolveDependency<IPrototypeManager>();
var factoryComp = server.ResolveDependency<IComponentFactory>();
await server.WaitAssertion(() =>
{
var bUiSys = server.System<SharedUserInterfaceSystem>();
Assert.That(proto.TryIndex("BaseMobSpeciesTest", out var baseEnt), Is.True);
Assert.That(baseEnt, Is.Not.Null);
Assert.That(baseEnt.TryGetComponent<UserInterfaceComponent>(out var bUiBase, factoryComp), Is.True);
Assert.That(bUiBase, Is.Not.Null);
var baseKeys = GetInterfaces(bUiBase).Keys.ToArray();
foreach (var species in proto.EnumeratePrototypes<SpeciesPrototype>())
{
var ent = proto.Index(species.Prototype);
Assert.That(ent.TryGetComponent<UserInterfaceComponent>(out var bUi, factoryComp), Is.True);
Assert.That(bUi, Is.Not.Null);
var states = GetInterfaces(bUiBase);
foreach (var key in baseKeys)
{
Assert.That(states.ContainsKey(key), Is.True, $"Species {species.ID} has not UserInterface of type enum.{key.GetType().Name}");
}
}
});
await pair.CleanReturnAsync();
}
}
@@ -36,6 +36,7 @@ public sealed partial class AdminVerbSystem
private static readonly EntProtoId ParadoxCloneRuleId = "ParadoxCloneSpawn";
private static readonly EntProtoId DefaultConspiratorRule = "Conspirators"; // Harmony
private static readonly EntProtoId DefaultWizardRule = "Wizard";
private static readonly EntProtoId DefaultHitmanRule = "HitmanRule";
private static readonly EntProtoId DefaultNinjaRule = "NinjaSpawn";
private static readonly ProtoId<StartingGearPrototype> PirateGearId = "PirateGear";
@@ -262,7 +263,22 @@ public sealed partial class AdminVerbSystem
};
args.Verbs.Add(agent);
// End DeltaV Additions
// start DeltaV Additions - add hitman
var hitmanName = Loc.GetString("admin-verb-make-hitman");
Verb hitman = new()
{
Text = hitmanName,
Category = VerbCategory.Antag,
Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/_DV/Interface/Misc/job_icons.rsi"), "Hitman"),
Act = () =>
{
_antag.ForceMakeAntag<HitmanRuleComponent>(targetPlayer, DefaultHitmanRule);
},
Impact = LogImpact.High,
Message = string.Join(": ", hitmanName, Loc.GetString("admin-verb-text-make-hitman")),
};
args.Verbs.Add(hitman);
// end DeltaV additions - add hitman
// Harmony start
var conspiratorName = Loc.GetString("admin-verb-text-make-conspirator");
Verb conspirator = new()
@@ -1,6 +1,7 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Numerics;
using Content.Server._DV.Access.Systems; // DeltaV - Subdermal ID Cards
using Content.Server.Cargo.Components;
using Content.Server.Doors.Systems;
using Content.Server.Hands.Systems;
@@ -57,6 +58,7 @@ public sealed partial class AdminVerbSystem
[Dependency] private readonly MetaDataSystem _metaSystem = default!;
[Dependency] private readonly GunSystem _gun = default!;
[Dependency] private readonly RevenantAnimatedSystem _revenantAnimate = default!; // Imp
[Dependency] private readonly SubdermalIdCardSystem _subdermalId = default!; // DeltaV - Subdermal ID Cards
private void AddTricksVerbs(GetVerbsEvent<Verb> args)
{
@@ -869,6 +871,11 @@ public sealed partial class AdminVerbSystem
}
}
// Begin DeltaV Additions - Subdermal ID chips
if (_subdermalId.TryGetIdCard(target, out var idEntity))
return idEntity;
// End DeltaV Additions - Subdermal ID chips
return null;
}
@@ -239,7 +239,7 @@ namespace Content.Server.Atmos.EntitySystems
if (pressure <= Atmospherics.HazardLowPressure)
{
// Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear.
_damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false, canSever: false, partMultiplier: 0.2f); // Shitmed Change
_damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false);
if (!barotrauma.TakingDamage)
{
@@ -254,7 +254,7 @@ namespace Content.Server.Atmos.EntitySystems
var damageScale = MathF.Min(((pressure / Atmospherics.HazardHighPressure) - 1) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage);
// Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear.
_damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false, canSever: false); // Shitmed Change
_damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false);
if (!barotrauma.TakingDamage)
{
@@ -141,10 +141,7 @@ namespace Content.Server.Body.Commands
if (attachAt == default)
attachAt = bodySystem.GetBodyChildren(entity, body).First();
// Shitmed Change Start
var slotId = $"{part.Symmetry.ToString().ToLower()} {part.GetHashCode().ToString()}";
part.SlotId = part.GetHashCode().ToString();
// Shitmed Change End
var slotId = part.GetHashCode().ToString();
if (!bodySystem.TryCreatePartSlotAndAttach(attachAt.Id, slotId, hand, BodyPartType.Hand, attachAt.Component, part))
{
@@ -98,15 +98,8 @@ namespace Content.Server.Body.Commands
return;
}
// Shitmed Change Start
var slotId = "";
if (part.Symmetry != BodyPartSymmetry.None)
slotId = $"{part.Symmetry.ToString().ToLower()} {part.GetHashCode().ToString()}";
else
slotId = $"{part.GetHashCode().ToString()}";
var slotId = $"AttachBodyPartVerb-{partUid}";
part.SlotId = part.GetHashCode().ToString();
// Shitmed Change End
// ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
if (body.RootContainer.ContainedEntity != null)
{
+1 -33
View File
@@ -1,7 +1,6 @@
using System.Numerics;
using Content.Server.Ghost;
using Content.Server.Humanoid;
using Content.Shared._Shitmed.Body.Part;
using Content.Shared.Body.Components;
using Content.Shared.Body.Events;
using Content.Shared.Body.Part;
@@ -19,10 +18,6 @@ using Content.Server.Polymorph.Components; // DeltaV
using Content.Server.Polymorph.Systems; // DeltaV
using Content.Shared.Damage.Components;
// Shitmed Change
using System.Linq;
using Content.Shared.Damage;
namespace Content.Server.Body.Systems;
public sealed class BodySystem : SharedBodySystem
@@ -31,7 +26,6 @@ public sealed class BodySystem : SharedBodySystem
[Dependency] private readonly GhostSystem _ghostSystem = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly HumanoidAppearanceSystem _humanoidSystem = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!; // Shitmed Change
[Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly SharedMindSystem _mindSystem = default!;
[Dependency] private readonly PolymorphSystem _polymorph = default!;
@@ -86,7 +80,7 @@ public sealed class BodySystem : SharedBodySystem
}
}
public override void RemovePart( // DeltaV - Made public
protected override void RemovePart(
Entity<BodyComponent?> bodyEnt,
Entity<BodyPartComponent> partEnt,
string slotId)
@@ -103,31 +97,5 @@ public sealed class BodySystem : SharedBodySystem
var layers = HumanoidVisualLayersExtension.Sublayers(layer.Value);
_humanoidSystem.SetLayersVisibility((bodyEnt, humanoid), layers, visible: false);
_appearance.SetData(bodyEnt, layer, true); // Shitmed Change
}
// Shitmed Change Start
protected override void ApplyPartMarkings(EntityUid target, BodyPartAppearanceComponent component)
{
return;
}
protected override void RemoveBodyMarkings(EntityUid target, BodyPartAppearanceComponent partAppearance, HumanoidAppearanceComponent bodyAppearance)
{
foreach (var (visualLayer, markingList) in partAppearance.Markings)
foreach (var marking in markingList)
_humanoidSystem.RemoveMarking(target, marking.MarkingId, sync: false, humanoid: bodyAppearance);
Dirty(target, bodyAppearance);
}
protected override void PartRemoveDamage(Entity<BodyComponent?> bodyEnt, Entity<BodyPartComponent> partEnt)
{
var bleeding = partEnt.Comp.SeverBleeding;
if (partEnt.Comp.IsVital)
bleeding *= 2f;
TryComp<BloodstreamComponent>(bodyEnt, out var bloodstream);
_bloodstream.TryModifyBleedAmount((bodyEnt, bloodstream), bleeding);
}
// Shitmed Change End
}
@@ -1,8 +1,6 @@
using Content.Server.Administration.Logs;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Body.Components;
using Content.Shared._Shitmed.Body.Components; // Shitmed Change
using Content.Shared._Shitmed.Body.Organ; // Shitmed Change
using Content.Server.Chat.Systems;
using Content.Shared._DV.Body.Components; // DeltaV - Addition of CPR
using Content.Shared.Body.Systems;
@@ -29,7 +27,6 @@ using Robust.Shared.Timing;
using Content.Shared._DV.CosmicCult.Components; // DeltaV
using Content.Shared._Goobstation.Body.Components; // Goobstation
namespace Content.Server.Body.Systems;
[UsedImplicitly]
@@ -84,7 +81,7 @@ public sealed class RespiratorSystem : EntitySystem
respirator.NextUpdate += respirator.AdjustedUpdateInterval;
if (_mobState.IsDead(uid) || HasComp<BreathingImmunityComponent>(uid) || HasComp<SpecialBreathingImmunityComponent>(uid)) // Shitmed: BreathingImmunity Goob immunity too
if (_mobState.IsDead(uid) || HasComp<SpecialBreathingImmunityComponent>(uid)) // Shitmed: BreathingImmunity Goob immunity too
continue;
// Begin DeltaV Additions
@@ -98,8 +95,7 @@ public sealed class RespiratorSystem : EntitySystem
UpdateSaturation(uid, multiplier * (float) respirator.UpdateInterval.TotalSeconds, respirator); // DeltaV: use multiplier instead of negating
if ((!_mobState.IsIncapacitated(uid)
|| TryComp<AffectedByCPRComponent>(uid, out var cprComp) && cprComp.IsActive) // DeltaV - Addition of CPR
&& !HasComp<DebrainedComponent>(uid)) // Shitmed Change - Cannot breathe in crit or when no brain.
|| TryComp<AffectedByCPRComponent>(uid, out var cprComp) && cprComp.IsActive)) // DeltaV - Addition of CPR.
{
switch (respirator.Status)
{
@@ -386,8 +382,7 @@ public sealed class RespiratorSystem : EntitySystem
if (ent.Comp.SuffocationCycles == 2)
_adminLogger.Add(LogType.Asphyxiation, $"{ToPrettyString(ent):entity} started suffocating");
var suffocationDamage = HasComp<DebrainedComponent>(ent) ? ent.Comp.Damage * 4.5f : ent.Comp.Damage; // Shitmed Change - Increased damage for debrained
_damageableSys.ChangeDamage(ent.Owner, suffocationDamage, interruptsDoAfters: false, ignoreResistances: true); // Shitmed Change
_damageableSys.ChangeDamage(ent.Owner, ent.Comp.Damage, interruptsDoAfters: false, ignoreResistances: true); // Shitmed Change
if (ent.Comp.SuffocationCycles < ent.Comp.SuffocationCycleThreshold)
return;
@@ -12,6 +12,7 @@ using Content.Shared.CCVar;
using Content.Shared.Chat;
using Content.Shared.Database;
using Content.Shared.Mind;
using Content.Shared.Players; // DeltaV - OOC muting
using Content.Shared.Players.RateLimiting;
using Robust.Shared.Configuration;
using Robust.Shared.Network;
@@ -283,6 +284,11 @@ internal sealed partial class ChatManager : IChatManager
return;
}
// DeltaV - OOC muting START
if (player.ContentData() is { OocMuted: true })
return;
// DeltaV END
Color? colorOverride = null;
var wrappedMessage = Loc.GetString("chat-manager-send-ooc-wrap-message", ("playerName",player.Name), ("message", FormattedMessage.EscapeText(message)));
if (_adminManager.HasAdminFlag(player, AdminFlags.Admin))
@@ -92,6 +92,9 @@ public sealed class ChatSanitizationManager : IChatSanitizationManager
Entry("[':", "chatsan-tearfully-smiles"),
Entry("('=", "chatsan-tearfully-smiles"),
Entry("['=", "chatsan-tearfully-smiles"),
Entry("?", "chatsan-confused"), //DeltaV
Entry("!", "chatsan-surprised"), //DeltaV
Entry("…", "chatsan-sighs"), //DeltaV (note that ... doesn't work as that turns into a radio message)
];
[Dependency] private readonly IConfigurationManager _configurationManager = default!;
+3 -7
View File
@@ -1,5 +1,4 @@
using Content.Server.Ghost;
using Content.Shared._EE.Silicon.Components; // EE
using Content.Server.Hands.Systems;
using Content.Shared.Administration.Logs;
using Content.Shared.Chat;
@@ -31,7 +30,7 @@ public sealed class SuicideSystem : EntitySystem
[Dependency] private readonly SharedSuicideSystem _suicide = default!;
private static readonly ProtoId<TagPrototype> CannotSuicideTag = "CannotSuicide";
private static readonly ProtoId<TagPrototype> CannotSuicideAny = "CannotSuicideAny"; // DeltaV / Goob, ProtoID Tag
// private static readonly ProtoId<TagPrototype> CannotSuicideAny = "CannotSuicideAny"; // DeltaV / Goob, ProtoID Tag
public override void Initialize()
{
@@ -50,7 +49,7 @@ public sealed class SuicideSystem : EntitySystem
public bool Suicide(EntityUid victim)
{
// Can't suicide if we're already dead
if (!TryComp<MobStateComponent>(victim, out var mobState) || _mobState.IsDead(victim, mobState) || _tagSystem.HasTag(victim, CannotSuicideAny)) // Goobstation - DeltaV Use ProtoId
if (!TryComp<MobStateComponent>(victim, out var mobState) || _mobState.IsDead(victim, mobState) /*|| _tagSystem.HasTag(victim, CannotSuicideAny*/) // Goobstation - DeltaV Use ProtoId
return false;
_adminLogger.Add(LogType.Mind, $"{ToPrettyString(victim):player} is attempting to suicide");
@@ -173,10 +172,7 @@ public sealed class SuicideSystem : EntitySystem
return;
}
if (HasComp<SiliconComponent>(victim)) // Goobstation
args.DamageType ??= "Shock";
else
args.DamageType ??= "Bloodloss";
args.DamageType ??= "Bloodloss";
_suicide.ApplyLethalDamage(victim, args.DamageType);
args.Handled = true;
}

Some files were not shown because too many files have changed in this diff Show More