Compare commits

...
Author SHA1 Message Date
Vanessa 7ad3187963 Add damage examinable to base structure. 2026-06-27 09:50:31 -05:00
Delta-V bot 932dd5e429 Automatic changelog update 2026-06-26 19:23:56 +02:00
wesker 3001253e43 Synthetic Emotes Fix (#6125)
* separate synthetic emote

* fix duplicate IDs (server error)

* Update speech_emotes.yml

* maybe this

* maybe keep the removed things from upstream lol

* imagine yamlops-ing when the problem was your trash code all along
2026-06-26 19:23:37 +02:00
Vanessa d3b13a6c83 I hate submodules. Why did it have to be submodules? (#6117)
Living on a prayer.
2026-06-25 15:07:33 -05:00
Delta-V bot 2ab0163598 Automatic changelog update 2026-06-25 20:04:07 +02:00
pathetic meowmeow 6cdeb3d9cf Suit sensors, but in space? Perish the thought. (#6054) 2026-06-25 12:59:49 -05:00
Delta-V bot d7543bd24a Automatic changelog update 2026-06-25 18:17:46 +02:00
f7f800c439 Tweaked Synthetic (#6090)
* actually not overhauled but tweaked i think

* forgot to stage this one

* make shocking 60% chance instead of 80%, and make shock dmg 5-20 random.

* update comment

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

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

* okay this should work + remember to mention new changesa asdas asd

* I ALREADY STAGED ALL

* important summary comments to give more important info when someone's
too lazy to check the rule

* fix some stuff

* signs of shock

* Update Resources/Prototypes/_DV/Traits/meta.yml

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

* Update Resources/Prototypes/_DV/Traits/meta.yml

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

* Update Resources/Locale/en-US/_DV/traits/traits.ftl

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

* changessss

---------

Signed-off-by: wesker <53323309+weskified@users.noreply.github.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>
2026-06-25 11:17:26 -05:00
Delta-V bot b6ed84325f Automatic changelog update 2026-06-25 17:37:53 +02:00
ManoobandVanessa 61aee79dc2 Replace nachos recipes (#6099)
* make nachos from tacos and change how cheesy and chili variants get made

* Change WizDen Contentfreeze recipelimit

* Update Resources/Prototypes/_DV/Recipes/Cooking/deep_fryer_recipes.yml

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

* Moved nacho metamorph to DV folder

* newlline, keep file as it was :^)

---------

Signed-off-by: Manoob <manu.demoen@gmail.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-06-25 10:37:33 -05:00
Delta-V bot 55fe6026ea Automatic changelog update 2026-06-25 17:28:10 +02:00
pathetic meowmeowandVanessa 6dfa12a509 AI? Being able to send faxes? Perish the thought. (#6064)
* AI? Being able to send faxes? Perish the thought.

* Update Resources/Prototypes/Entities/Mobs/Player/silicon.yml

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-06-25 15:27:49 +00:00
Delta-V bot 485fd14f05 Automatic changelog update 2026-06-25 16:07:32 +02:00
Theo 031b37ffcb Washing machines can hold huge items (#6086)
washer size huge
2026-06-25 09:07:12 -05:00
Delta-V bot 06365bdbf0 Automatic changelog update 2026-06-25 15:10:58 +02:00
Tmanzxd 7f18c5f346 Commented out Surgeon Job Requirement for CMO (#6112) 2026-06-25 13:10:38 +00:00
Delta-V bot d407652eb0 Automatic changelog update 2026-06-25 04:28:46 +02:00
Manoob 9108e2c9b5 Fix Low metabolism rate modifiers from truncating to zero (#6104) 2026-06-24 21:28:26 -05:00
VelcroboyandVelcroboy c7ef614f3d Edit towel spawner (#6106)
* Edit towel spawner

* numbers

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-06-24 21:26:51 -05:00
VelcroboyandVelcroboy fa735f7669 Fix Chapel Access (#6105)
Fix chapel access

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-06-24 20:12:36 -05:00
Delta-V bot 6de6421636 Automatic changelog update 2026-06-25 00:03:18 +02:00
Vanessa 3cb24c8b68 Custom Client-Side Radio Colors (#6101) 2026-06-24 22:02:58 +00:00
Delta-V bot 9fad412075 Automatic changelog update 2026-06-24 15:15:21 +02:00
Vanessa fbc3104836 Fix Infinite Cloaking (#6085)
Fix infinite cloaking because I guess power draw doesn't count as using the battery charge.
2026-06-24 15:15:01 +02:00
Delta-V bot e231d9d67c Automatic changelog update 2026-06-24 15:08:40 +02:00
Stxcking 468d929c4b Tweak: AAC Subject Button Colors Return + Words Capitalized (#5567)
* Nuked StyleNano + Added colors to sheetlet

SubjectButtonColors table to define colors (same hex as the ones in StyleNano)
SubjectColorRules to loop rules for applying colors

* Capitalize every single phrase

CONSISTENCY RAHH
2026-06-24 15:08:20 +02:00
Delta-V bot 2f1aaff32c Automatic changelog update 2026-06-24 00:35:07 +02:00
Vanessa 4f49ccde68 Sleepers no longer have an annoucement (#6066)
* Sleepers no longer have an annoucement.

* NT sleepers too.
2026-06-23 18:34:47 -04:00
Vanessaandpre-commit-ci[bot] cb3b74e49e Station-Specific Department Cleanup (#6078)
* Removed some jobs from station specific jobs because they are on all stations.

* Department Prototype Cleanup

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

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

* Actually fix brigmedic on the crew monitor

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-23 18:34:44 -04:00
Vanessaandpre-commit-ci[bot] 7d15a39a77 Fixed emergency access locale string (#6044)
* Fixed emergency access locale string

* [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-06-23 18:23:22 -04:00
Delta-V bot 3ac816fee1 Automatic changelog update 2026-06-24 00:19:37 +02:00
Delta-V bot b909d9a2e5 Automatic changelog update 2026-06-23 17:27:27 +02:00
Theo 7547752159 Broken bottle slicing (#6092)
add comps
2026-06-23 10:27:07 -05:00
Manoob 9b7819288e Added a fix that resets the cook timers on fryer power changed (#6075) 2026-06-23 09:17:06 -05:00
Delta-V bot 424a4569d8 Automatic changelog update 2026-06-23 14:50:11 +02:00
wesker 12827c0e98 TraitSystem require fix (#6097)
how did i even forget this
2026-06-23 12:49:51 +00:00
Delta-V bot d1e61ba0a2 Automatic changelog update 2026-06-23 12:40:37 +02:00
652e52dbca Nuke/CosCult Global Music and SFX (#5918)
* Extended ServerGlobalSoundSystem and exposed its lies. Now its actually global.

* Fixed Epsilon event rule namespacing and formatting.

* Cosmic Cult Music Updates

* Few more CosCult changes.

* Nuke and Alert Changes

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

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

* Update Content.Server/_DV/CosmicCult/EntitySystems/CosmicChantrySystem.cs

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

* Update Content.Server/_DV/Audio/ServerGlobalSoundSystem.cs

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

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-06-23 12:40:17 +02:00
Delta-V bot e7fe4865de Automatic changelog update 2026-06-22 20:06:07 +02:00
A111Vojta 84b600a39f Harmony lanyards (#6035)
* Lanyards Part1

* Lanyards Part 2

* Lanyards Part 3

* Fix

* Lanyards - Adding Comments

* replace plaintext with LocIds

* expanded the lanyard slot blacklist
2026-06-22 20:05:47 +02:00
Delta-V bot 31201c44ba Automatic changelog update 2026-06-22 18:48:51 +02:00
Theo 4f9f93eb87 Slugs structural increase TWO! (#6068)
* number up

* comment formatting
2026-06-22 11:48:31 -05:00
Delta-V bot f8a4d823b9 Automatic changelog update 2026-06-22 13:37:10 +02:00
Proxy also works :3 c61d2c6a58 guidebook shields (#6070) 2026-06-22 06:36:50 -05:00
Delta-V bot e25181e1bc Automatic changelog update 2026-06-22 13:11:55 +02:00
7c052442a8 Traits UI Modifications, Visuals, and a new Condition (#6082)
* traits ui things

* fluent

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

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

* Update Resources/Locale/en-US/_DV/traits/traits-ui.ftl

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

* i hate toby

* newline

* pattern matching

* made simpler

* 2sleepy4myowngood

* kl;jasglkknf.,/.sa/.mmmmmmmmm

---------

Signed-off-by: wesker <53323309+weskified@users.noreply.github.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-06-22 11:11:35 +00:00
Delta-V bot 19b0de35dd Automatic changelog update 2026-06-22 10:46:57 +02:00
wesker 1c66c1fe2e Fix 8 0'Clock Ghosts to be Mono (#6084)
* fix jukebox to be mono

* ACTUALLY fix this, holy shit audacity
2026-06-22 10:46:37 +02:00
Delta-V bot ef46675a2f Automatic changelog update 2026-06-22 06:23:31 +02:00
Halo3moth c0b6929c9a lower pitbull vent spawn rate (#6081) 2026-06-22 04:23:12 +00:00
Vanessa c7aa50cf85 Update C# Contribution Examples and Guidelines (#6039)
Updated C# guidelines.
2026-06-21 15:59:47 +02:00
Delta-V bot c69fb99600 Automatic changelog update 2026-06-21 15:48:33 +02:00
VelcroboyandVelcroboy 3ca37d9c2b Map Edits: The Hive (#6018)
* Map Edits: The Hive

* review changes

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-06-21 15:48:12 +02:00
github-actions[bot]andDeltaV-Bot 8ba993d1a9 Update Credits (#6072)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-06-21 05:30:08 +02:00
Delta-V bot edd1500bf3 Automatic changelog update 2026-06-20 19:14:31 +02:00
einknusprigestoastandpre-commit-ci[bot] 2ec64360b7 ERT Security Loadout overhaul (#6049)
* ERT Selectors Amber Sec

* Added SRT Loadouts

* Added SRT Loadouts

* Added ERT selectors

* ERT Loadout tweaks

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

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

* Changed Omnitool to be ToolDebug + Multitool

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-20 19:14:11 +02:00
Delta-V bot e0540c6205 Automatic changelog update 2026-06-20 17:02:34 +02:00
7953b0469a I SCREAM, YOU SCREAM, WE ALL SCREAM FOR ICE CREAM (#5943)
* Initial commit.

* Minor tweaks to names, added caramel bottle.

* Fixing open state of caramel bottle.

* JSON cleanup.

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

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

* Minor tweak to cookie dough ice cream recipe. Removed unused sprites.

* Swapping out updated sprites for rainbow sherbet, tropical sundae, neapolitan.

* Removing plushies.zip.

* Moved frozen treats to their own guidebook section under drinks to reduce clutter.

* Fixing flavor references, adding icecreamflavors.yml to contain definitions, corrected loadout ID references in loadoutgroups.

* Committing loadout changes that slipped through the cracks.

* Corrected casing in reference to RSI.

* Changed recipe for caramel to be just sugar to prevent conflict with Sigynate's recipe.

* So I'm kinda dumb and somehow it didn't occur to me that making sugar alone yield caramel would actually not only not fix the issue with Syginate but also wreck it for so many other chems, oopsie daisy, we're swapping it for Saline for a more shelf-stable salted caramel sauce.

* Tweaking ratio for Caramel, also, what are the odds that the tempermental build just works after this?

* At this point I'm just curious if a different build will fail this time.

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

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

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

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

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

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

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

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

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

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

* Update Resources/Prototypes/_DV/Entities/Clothing/Uniforms/jumpsuits.yml

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

* Update Resources/Prototypes/_DV/Entities/Objects/Consumable/Drinks/frozen_treats.yml

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

* Update Resources/Prototypes/Guidebook/references.yml

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

* Review changes

* Pascal-ify-ing flavor IDs.

* Update Resources/Prototypes/_DV/Entities/Objects/Consumable/Drinks/frozen_treats.yml

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

---------

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>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-06-20 15:02:13 +00:00
Delta-V bot a3d3d23600 Automatic changelog update 2026-06-20 16:24:55 +02:00
pathetic meowmeow 5ccfce1e7f NanoChat? Outside the same grid? Perish the thought. (#6057) 2026-06-20 09:24:35 -05:00
Delta-V bot 879cbf43f5 Automatic changelog update 2026-06-20 16:20:24 +02:00
einknusprigestoastandpre-commit-ci[bot] 9c84627db5 Added CentComm Turrets (#6069)
* Added CentComm Turrets

* [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-06-20 09:20:04 -05:00
Delta-V bot 3134e91fa5 Automatic changelog update 2026-06-20 12:46:22 +02:00
3ac30b7b7b [new item] Hitman card (#5896)
* 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>

* almost made hitman card

* many modifactions to make it work.

* i need to get around to fixing my repo after this

* hope this works. reverting by hand

Signed-off-by: storm! <253825839+stormyatt@users.noreply.github.com>

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

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

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

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

* as requested

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

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

* less dependies, pretty sure only needed ones now

* review 2. card space addition

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

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

---------

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>
Signed-off-by: storm! <253825839+stormyatt@users.noreply.github.com>
Co-authored-by: stormyatt <stormyatt@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-20 12:46:02 +02:00
Delta-V bot 4daea082bc Automatic changelog update 2026-06-20 00:07:10 +02:00
Vanessa 6a37e1268e SRN Fixes (#6045)
* Fixed SRNs getting borg AA on their borgs

* SRNs can print batteries
2026-06-19 18:06:50 -04:00
Delta-V bot 331a25c7d3 Automatic changelog update 2026-06-19 23:54:07 +02:00
Vanessaandpre-commit-ci[bot] b5121e10e9 Increase Syndicate Hardsuit Aura by 15% (#6060)
* Various syndicate hardsuit sprite upgrades for overlay.

* Added (missing) overlays for Feroxi and Reptiles.

* added base bluekie light

* Added stealthsuit variant.

* Fixed duplicate yaml entry

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

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

* Fix missing entry in meta.json for syndie medic

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-19 17:53:47 -04:00
Delta-V bot 9584a7b0ae Automatic changelog update 2026-06-19 23:43:04 +02:00
Vanessaandpre-commit-ci[bot] f9880c148b Cloned zombie players no longer get mauled by cats (#6053)
* Moved DeltaV modifications of ZombieSystem to a partial class. Fixed factions and pacifist trait on zombie cloning. Added survival objective to cloned II.

* [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-06-19 17:42:45 -04:00
Delta-V bot 25ef15f162 Automatic changelog update 2026-06-19 21:26:41 +02:00
Theo 997a6e31e6 Felinid SinkClaws action (#5996)
action and sprites
2026-06-19 14:26:22 -05:00
Delta-V bot 5a342570a4 Automatic changelog update 2026-06-19 20:35:52 +02:00
Proxy also works :3 97bb68b2a6 kill cult metashield (#6026) 2026-06-19 13:35:33 -05:00
Delta-V bot ac9f8852b3 Automatic changelog update 2026-06-19 20:12:19 +02:00
DisposableCrewmember42andneomoth 8c8f4b4f2c tweak: better screenshake (#6059)
* tweak: explosion shake directional, distance fall-off

partial port of ss14Starlight/space-station-14#3707 by neomoth:
0b6282eb267ef1efc0b2bcd78a39e53a776f1c79

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

* tweak: melee shake depends on damage/wielding

partial port of ss14Starlight/space-station-14#3707 by neomoth:
0b6282eb267ef1efc0b2bcd78a39e53a776f1c79

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

* tweak: explosion kick falloff

* chore: remove debug log

* feat: melee shake has heavy/light variants instead of only showing for high blunt/wielded

* refactor: use MathF instead of Math

* tweak: more noticeable camera kick falloff

* tweak: generally dampen explosion kick a little more, fall off slower

* docs: explain camera kick falloff

* docs: remove commented upstream code per review

* docs: document screenshake falloff too, clarify distance

---------

Co-authored-by: neomoth <69372252+neomoth@users.noreply.github.com>
2026-06-19 13:11:59 -05:00
Delta-V bot 8eeb5f6523 Automatic changelog update 2026-06-19 20:00:05 +02:00
Theo 45432aa3bb Kobolds exist again (#5968)
copy paste ops
2026-06-19 17:59:45 +00:00
Delta-V bot b9153f0f13 Automatic changelog update 2026-06-19 19:53:03 +02:00
Theo e3d3fe72f0 remove damage examine from bomb pen (#6010)
remove hit damage
2026-06-19 17:52:43 +00:00
Delta-V bot 0a65236363 Automatic changelog update 2026-06-19 19:49:19 +02:00
Halo3moth afe6021455 remove chameleon gears metashield (#6000)
Update 2_Metagaming.xml
2026-06-19 13:48:59 -04:00
Delta-V bot e5db02c736 Automatic changelog update 2026-06-19 18:16:18 +02:00
Theo cbc5f819c4 Security radio recolor (#6016)
* change

* less saturated
2026-06-19 11:15:58 -05:00
Delta-V bot 339b3fb32c Automatic changelog update 2026-06-19 18:06:08 +02:00
AstraandVanessa e96faec07d Allow purified salts in belts/medkits (#6062)
* Allow purified salts in medical belts

* Medkits too why not

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

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-06-19 16:05:48 +00:00
Delta-V bot a1bbf142a4 Automatic changelog update 2026-06-19 17:52:56 +02:00
DisposableCrewmember42andPieter-Jan Briers e47a0bf455 feat: chat follow links for ghosts (upstream port) (#6063)
* Ghosts have follow buttons in chat (#44284)

* Fix ghost follow buttons for station entity (#44289)

---------

Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com>
2026-06-19 10:52:36 -05:00
Delta-V bot 72f3edd378 Automatic changelog update 2026-06-19 17:49:17 +02:00
freezer dog 030deb6f27 SV-213 QoL stuff (and a tiny bit more) (#6065)
wwoof
2026-06-19 10:48:57 -05:00
Vanessaandpathetic meowmeow 4397017c5a Added ESEffectSparks to excluded list on integration tests (#6061)
* Added ESEffectSparks to excluded list on integration tests

* Update Content.IntegrationTests/Tests/EntityTest.cs

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

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
2026-06-18 20:32:39 -04:00
Delta-V bot 0f19340d41 Automatic changelog update 2026-06-18 18:37:52 +02:00
Stxcking 3c28ee8d20 Tweak: Broken Station Maps can be Deconstructed (#6005)
mhm
2026-06-18 11:37:32 -05:00
Delta-V bot 11cc04dd87 Automatic changelog update 2026-06-18 18:35:12 +02:00
Sugarcane f87ed28744 Bluesec in Guidebook (#6013) 2026-06-18 11:34:52 -05:00
Delta-V bot 62c76332f5 Automatic changelog update 2026-06-18 18:22:35 +02:00
pathetic meowmeow 34c212e4fb Fax machines? That are ready roundstart? Perish the thought. (#6058) 2026-06-18 11:22:15 -05:00
Radezolid 353290e55b Mostly locker entityTables cleanup (#5982)
* Remove our changes to dressers.yml

* Engineering

* Heads

* Science

* Security

* Append our tables with upstream's, apply suggestion and small comment cleanup
2026-06-17 15:55:26 -04:00
Delta-V bot 0cbe9c01fb Automatic changelog update 2026-06-17 17:32:53 +02:00
Vanessa d88938887b Fixed biomasser dividing by zero (#6042)
Fixed biomasser dividing by 0.
2026-06-17 17:32:34 +02:00
Delta-V bot 1656a91c5e Automatic changelog update 2026-06-17 16:08:07 +02:00
Proxy also works :3 c70cbcb9f5 bne (#6050) 2026-06-17 09:07:47 -05:00
Delta-V bot 3e22d89d1e Automatic changelog update 2026-06-17 15:56:46 +02:00
TNE a790954f06 Prevent zombies/non-humanoids/non-borgs from using jetpacks (#5776)
Prevent zombies from using jetpacks

Introduces CanComplexInteract check from ActionBlockerSystem alongside a translation string
When Zombifying: Removes AutomaticJetpackUserComponent, calls SharedJetpackSystem.SetEnable(..., false, ...)
2026-06-17 15:56:26 +02:00
Delta-V bot 0676186fe5 Automatic changelog update 2026-06-17 15:36:21 +02:00
Theo db6d1e3970 Uplink pt 1 touchup (#5991)
* buffs

* damage change on knuckledusters
2026-06-17 08:36:01 -05:00
fd20b74b8f Update mapping spawners (#5857)
* Update mapping spawners

* more casing

* Clothing and towels

* minor fixes

* Finalize clothing

* Begin Items

* Final updates

* Fixes

* save button

* `n`

* Add pitbull to animal spawner

* Add random satchels

* Glowsticks

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/animals.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/boardgames.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/boardgames.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/books.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/machineparts.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/schoolgirl.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/seeds.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/towels.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

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

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

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

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Update Resources/Prototypes/_DV/Entities/Markers/Spawners/Random/mobs.yml

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>

* Review changes

---------

Signed-off-by: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com>
Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-06-16 23:54:22 -03:00
Delta-V bot d016838687 Automatic changelog update 2026-06-17 03:07:15 +02:00
Vanessa 160aa17052 Pitbull Fixes (#6046)
pitbull fixes
2026-06-16 22:06:55 -03:00
Delta-V bot 2b6729fa64 Automatic changelog update 2026-06-16 22:02:38 +02:00
Field Commandandpre-commit-ci[bot] 3439340530 Updated to ghost bar syndicate prison (#6006)
* Updated to ghost bar syndicate prison

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

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

* Some last minute fixes

* Update to prison and sprites

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-06-16 15:02:18 -05:00
Delta-V bot 28c2223a8a Automatic changelog update 2026-06-16 19:43:30 +02:00
CarolandVanessa 1b47c246c9 Added dynamic cost to Ratkings OnRaiseArmy ability (#6017)
* added dynamic cost to Ratkings OnRaiseArmy ability

* Update Content.Server/RatKing/RatKingSystem.cs

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

* switched summary to one line

* added using directive for Linq

---------

Signed-off-by: Carol <292806487+CarolCuchara@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-06-16 12:43:10 -05:00
Delta-V bot 8141512cc4 Automatic changelog update 2026-06-16 19:09:52 +02:00
DisposableCrewmember42 fd986fec6e feat: Effigy-driven Colossus (mid-round Colossus rework) (#5565)
* feat: effigy-driven colossus

* feat: impl final stage, tweaks, randomization, fixes

* fix: actually broadcast first effigy audio

* style: add some newlines

* feat: notify player about updated target location in chat

* tweak: effigy always grows

* feat: make alwaysGrow show on anom scanner

* tweak: raise minimumPlayers to 35

* refactor: move FTL additions to _DV

* refactor: break out buffs into comps, add event

also added missing docs and made effigies heal colossi fully, as
specified in the PR body. I accidentally left it at 50% damage taken.

* docs: add effigy comp docs
2026-06-16 13:09:32 -04:00
Delta-V bot dd2a6e1c28 Automatic changelog update 2026-06-16 16:16:28 +02:00
TNEandDisposableCrewmember42 6c7c9de253 fix: don't show SSD examine on dead people/ghost role (#6012)
fix: don't display examine text on dead people or untaken ghost roles

Co-authored-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>
2026-06-16 09:16:08 -05:00
Delta-V bot 2b96bb79f8 Automatic changelog update 2026-06-15 19:27:20 +02:00
CarolandVanessa c1239ef7bf Remove headset from pockets when player get zombified (#6030)
* Remove radio form pocket when secdogs get zombified

* Update Content.Server/Zombies/ZombieSystem.Transform.cs

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

---------

Signed-off-by: Carol <292806487+CarolCuchara@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-06-15 12:27:00 -05:00
Delta-V bot 62b6401e48 Automatic changelog update 2026-06-15 18:46:55 +02:00
freezer dog f79a599c65 fixing machine pistol magazine issues and clearing gun chambers (#5819)
* kill... slaughter...

* ok why not im gonna clear chambers too

* ok maybe thats all the chambers clear

* time to find out i screwed up everythin xd

* whoops i killed the chambers....

---------

Signed-off-by: freezer dog <iamabanana372456@gmail.com>
2026-06-15 13:46:35 -03:00
Delta-V bot 9acd3f2ecb Automatic changelog update 2026-06-15 18:06:32 +02:00
Delta-V bot 47215d7876 Automatic changelog update 2026-06-15 18:02:26 +02:00
fe53298d27 Delta-V: Wrath of the Pitbulls (#5915)
* DIRECTION KNOWS BEST

DIRECTION KNOWS BEST GLORY TO DELTA-V

* MORE

More names

* It begins

Im not sorry

* Pitbull changes

They fear me because of what I can do.

* They will fuck you up if you Hit them

* Update pitbull.yml

* The infamous pitbull faction

* Update ai_factions.yml

* Update ai_factions.yml

Staff Requested changes

* Update pitbull.yml

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

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

* sprites added!

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

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

* event addition part 1

* Pitbull Crate

* Event work part 2

* obvious

* bullshit fix part 1

* Bullshit fix part 2

* bullshit fixes part 3

* i hate it here

* removes bullshit 5137268

* shortened timer to catch crew off guard

* crash fix 1 i think

* Update cargo_livestock.yml

* They no longer maul II

* they are angry.

* they cant maul you now.

* Update pitbull.ftl

* Update pitbull.yml

* Update events.yml

* Update interaction-popup-component.ftl

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

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

* Update events.yml

* Update pests.yml

* Update pitbull.yml

* Update events.yml

* Update pitbull.yml

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

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

* Update pitbull.yml

* 1984 pitbull faction

* Inshallah this will work

* More names

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

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

* Update pitbull_names.yml

* Update pitbull.ftl

* Update pitbull_names.yml

* Increased amount of mice and hopefully enables higher chance of ventbulls to spawn

* DIRECTION KNOWS BEST

DIRECTION KNOWS BEST
DIRECTION KNOWS BEST
DIRECTION KNOWS BEST
DIRECTION KNOWS BEST
DIRECTION KNOWS BEST

Signed-off-by: Solaris <63768197+StarboundSolaris@users.noreply.github.com>

* DIRECTION KNOWS BEST

DIRECTION KNOWS BEST

Signed-off-by: Solaris <63768197+StarboundSolaris@users.noreply.github.com>

* Refactor inheritence for pitbulls

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

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

* forgot a file

* Makes it so the crate spawns the named versions

* Ensures they have random names.

* Update pitbull.yml

* Prep for mapped pitbull

* Adds Pibble

* Returns id to previous version

* Update pitbull.yml

* Update events.yml

---------

Signed-off-by: Solaris <63768197+StarboundSolaris@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Solaris <63768197+Solaris7518@users.noreply.github.com>
Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
2026-06-15 11:02:06 -05:00
Theo 1aee2519df Kill Poncho Meta (#6001)
numbers
2026-06-15 10:51:38 -05:00
Delta-V bot e8cd052c31 Automatic changelog update 2026-06-15 17:10:19 +02:00
Carol a27fa291e7 Fix: Beer googles not stopping glasses from spilling when throw (#6031)
* fixed beer googles not keeping glasses form spilling on throw

* fixed beer googles not keeping glasses form spilling on throw
2026-06-15 10:09:59 -05:00
Delta-V bot 7e6f66a651 Automatic changelog update 2026-06-15 17:05:49 +02:00
pathetic meowmeow 08c27979a1 Interaction particles pass (#6033) 2026-06-15 10:05:29 -05:00
Delta-V bot b49a94100c Automatic changelog update 2026-06-14 20:30:54 +02:00
Carol cfa24eb20c Added a range check for pager linking (#6032) 2026-06-14 14:30:34 -04:00
Delta-V bot 1787683435 Automatic changelog update 2026-06-14 10:13:44 +02:00
Stop-Signs 389fbf99e1 Reduce WT550 SMG fire-rate (#5581)
* the PR

* comments

* hunt showdown queue times

* comment

* .desc
2026-06-14 08:13:24 +00:00
Delta-V bot 74c7bf0a05 Automatic changelog update 2026-06-14 06:13:17 +02:00
Carol 6764276a47 Changed secborgs fibers to blue (#6025)
changed secborgs fibers to blue
2026-06-14 04:12:57 +00:00
github-actions[bot]andDeltaV-Bot 03934d3fbd Update Credits (#6028)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-06-14 04:59:28 +02:00
SumTwo 468150c817 Adding the Logistics Beret as a loadout option for Cargo Technicians (#6015)
* Step One: Add Hat

Signed-off-by: SumTwo <its.a.joke1000@gmail.com>

* Step Two: Add Hat

Signed-off-by: SumTwo <its.a.joke1000@gmail.com>

* Step Three: Im Stupid

Signed-off-by: SumTwo <its.a.joke1000@gmail.com>

* Step Four: Im Stupid

Signed-off-by: SumTwo <its.a.joke1000@gmail.com>

* Step Five: Obey CR

Signed-off-by: SumTwo <its.a.joke1000@gmail.com>

---------

Signed-off-by: SumTwo <its.a.joke1000@gmail.com>
2026-06-13 21:07:20 -03:00
Delta-V bot 310ac0809b Automatic changelog update 2026-06-13 22:03:35 +02:00
7b71611dc9 [antag variant]Hitman midround variant (#5848)
* 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.

* added hitman midround stuff

* made the professional not cause errors and have a ghost warp point

* enter at the ends of these files

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

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

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

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

* updated the professional to professional

* decal adds

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

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

* fixes and stuff

* gave hitmans headset traffic and freelance comms

* all review changes made

* Apply suggestion from @Radezolid

caps my foe

Co-authored-by: Radezolid <snappednexus@gmail.com>
Signed-off-by: storm! <253825839+stormyatt@users.noreply.github.com>

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

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

* nevermind i distrust this

* Update Resources/Prototypes/_DV/Catalog/Fills/Lockers/hitman_locker.yml

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

---------

Signed-off-by: stormyatt <dratticuscrabs@gmail.com>
Signed-off-by: storm! <253825839+stormyatt@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: stormyatt <stormyatt@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-06-13 20:03:15 +00:00
Delta-V bot f2153d66c3 Automatic changelog update 2026-06-13 21:29:23 +02:00
Theo b6833cbbcf Remove Fractured Form (#6011)
* remove from the table

* full remove
2026-06-13 14:29:04 -05:00
Delta-V bot 4e2bd0c244 Automatic changelog update 2026-06-13 04:29:23 +02:00
bf0abd7ffa Add SRT Hardsuit and Antelope + Remove DS mentions (#6003)
* Added Chameleon Armor

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

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

* nerfvest

* Lowered Price

* Changed Jackdaw and Atrides fire rates

* Changed battery on Pulse Rifle, upped fire rate

* lowered pulse rifle recharge rate

* Added SRT Hardsuit

* Added Antelope

* Revert "lowered pulse rifle recharge rate"

This reverts commit 73f348c3e7.

* Revert "Changed battery on Pulse Rifle, upped fire rate"

This reverts commit d6f408620d.

* Revert "Changed Jackdaw and Atrides fire rates"

This reverts commit 0779c08d44.

* Revert "Lowered Price"

This reverts commit d798cd92e9.

* Revert "Merge branch 'toastdrip' of https://github.com/einknusprigestoast/Delta-v into toastdrip"

This reverts commit ca038e3699, reversing
changes made to f74f3e506d.

* Revert "nerfvest"

This reverts commit f74f3e506d.

* Revert "Added Chameleon Armor"

This reverts commit b57fa738f3.

* Removed Edge from Mateba

* whoops, forgot comment

* Removed DS mention + Added NV to ERT + Added Thermal Vision to DS

* removed deathsquad mentions on the jumpsuit

* removed deathsquafd mentions on the backpack

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

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

* Unfucked my parenting

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

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

* non-localisation maintainer requests

* Added FTLs

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

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

* One point, one singular point

* AHHHH

* Fix comments

Signed-off-by: Radezolid <snappednexus@gmail.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-06-12 23:29:03 -03:00
Delta-V bot c4d65da8ed Automatic changelog update 2026-06-12 19:16:19 +02:00
Stxcking 6dac24f03a Shoukou / Shoko Map Update - BlueSec (#5940)
* first

sobs

* second

* review fixes
2026-06-12 12:15:59 -05:00
Delta-V bot 9550a7d53d Automatic changelog update 2026-06-11 03:28:51 +02:00
VelcroboyandVelcroboy d826a15ff2 Map Edits: Arena (#6009)
* Map Edits: Arena

* Link lightswitch

* Remove duplicate suit storage

* reveiw edits

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-06-10 20:28:31 -05:00
Delta-V bot 23a9a75703 Automatic changelog update 2026-06-10 20:23:59 +02:00
Vape 79a0000547 Xeno Rework - Pull sprites and audio from RMC (#5891)
* Additions

* Changes per direction

* Update xeno.yml

* Requested Changes
2026-06-10 18:21:13 +00:00
Delta-V bot 71badde1a0 Automatic changelog update 2026-06-09 20:48:54 +02:00
Theo 5ab49cd46b Reduce meat spike build time (#5999) 2026-06-09 14:48:35 -04:00
Delta-V bot 0398c527a1 Automatic changelog update 2026-06-09 20:10:21 +02:00
Cepelinas1 cdafd4c257 More Tips + slight tweaks to weapon names (#6004)
* first

* typo

* figured it out :)

* what reviewers wanted
2026-06-09 15:10:01 -03:00
Delta-V bot 8dc06f010a Automatic changelog update 2026-06-09 15:45:46 +02:00
Theo fee62b449f shadow cat tweaks (#5977)
* add and remove

* remove comment

* oh yeah and this one
2026-06-09 13:45:26 +00:00
Delta-V bot c0d20b3d79 Automatic changelog update 2026-06-08 23:57:59 +02:00
snowywinters b2944fba52 Edge update (#5983)
* Update edge.yml

* Removed surgeon
2026-06-08 16:57:39 -05:00
2e39916957 Admeme gun changes (#5971)
* Added Chameleon Armor

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

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

* nerfvest

* Lowered Price

* Changed Jackdaw and Atrides fire rates

* Changed battery on Pulse Rifle, upped fire rate

* lowered pulse rifle recharge rate

* Update Resources/Prototypes/_DV/Entities/Objects/Weapons/Guns/Rifles/rifles.yml

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

* Update Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml

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

* Update Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml

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

* Update Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml

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

---------

Signed-off-by: einknusprigestoast <90181825+einknusprigestoast@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-08 17:35:29 -03:00
Delta-V bot 874bbf4fd2 Automatic changelog update 2026-06-08 21:50:51 +02:00
VelcroboyandVelcroboy e1ff1ea820 Map Edits: Tortuga (#5965)
* Map Edits: Tortuga

* Final commits

* Robo-Proto

* Service jobs

* reveiw fixes

* Jimbo's birthday present

---------

Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-06-08 21:50:31 +02:00
Delta-V bot 79a4a15403 Automatic changelog update 2026-06-08 21:36:22 +02:00
Vape 0bb2b6ee7b Updates to Submarine.yml (#5760)
* Commit#1

* Update submarine.yml

* ATTEMPT#2

* CASE SENSITIVITIY

* Committing Changes

* Bluesec

* Review updakes
2026-06-08 12:36:01 -07:00
Delta-V bot 18d9325b60 Automatic changelog update 2026-06-08 19:23:43 +02:00
Field Command f07648bc24 Ghost Bar: Syndicate Prison (#5578)
* Ghost Bar: Syndicate Prison

* Copy-paste is evil...

* formatting fix

* IPC no more

* update

* Fix
2026-06-08 12:23:24 -05:00
Delta-V bot f5da329b98 Automatic changelog update 2026-06-08 07:30:14 +02:00
ConstantlyConfused ad6581f2d3 Make the nuclear fab announce when it recieves new recipes (#5985)
make the nuclear fabiractor announce researches
2026-06-08 02:29:55 -03:00
Delta-V bot 430fef2a10 Automatic changelog update 2026-06-08 06:35:40 +02:00
Theo 6970cb9d28 Add cooldown to ninja emp (#5967)
* add 10 second cooldown

* 5 seconds instead
2026-06-08 00:35:20 -04:00
Delta-V bot ea2b8df2cc Automatic changelog update 2026-06-07 22:49:09 +02:00
Theo b87b113736 cult simplemobs deal blunt damage (#5962)
add blunt damage
2026-06-07 20:48:49 +00:00
Delta-V bot f087b2895e Automatic changelog update 2026-06-07 21:46:37 +02:00
MD360andRadezolid 0a14310574 Remove duplicate towels (#5964)
* duplicate begone

* white too

* Fix comment

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

* Fix of the comment-fix

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

---------

Signed-off-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-06-07 19:46:18 +00:00
Delta-V bot d9c2f26438 Automatic changelog update 2026-06-07 21:34:18 +02:00
Stxcking a4f11c63dc Fix: Holoflares not Hurting Skia (#5976)
net
2026-06-07 16:33:58 -03:00
Delta-V bot 4ff05277fa Automatic changelog update 2026-06-07 21:05:35 +02:00
Stxcking a33e12e85e Fix: Glowsticks can now be use for glow in the dark stars! (#5970)
yipe
2026-06-07 16:05:16 -03:00
Delta-V bot 62e9ebc216 Automatic changelog update 2026-06-07 20:13:32 +02:00
biddygelson 25b69a3f9e Academy 1.9.0 BLU+ (#5972)
* * Added Poppy to Eng break room.
* Replaced all faxes with department variants. Note Justice was used over Lawyer; faxes added to Dorms, Chem, Botany, Chef, Bar. MimeLaw.
* Replaced Emergency EVAs with Epistemics EVAs in Artefact.
* Replaced RED-Sec with BLU-Sec; Sec, Brig, and Evac.
* Added Anti-Anom to solars.

* * replaced RED with BLU sec in viro security
* removed condenser in chem
* added condenser in atmos front
* added APC to atmos burn chambers
2026-06-07 20:13:12 +02:00
Field Command 7ed7dbcbb1 Maps: Timer be gone! (#5980)
✔
2026-06-07 18:05:08 +00:00
Delta-V bot fcdf1cbbf4 Automatic changelog update 2026-06-07 18:23:16 +02:00
SirrRequiem 9f786a7c1c Terra 6: Everything is Blue (#5956)
* Terra 6: Everything is Blue

* Curtains and carpets now match
2026-06-07 18:22:57 +02:00
github-actions[bot]andDeltaV-Bot e2e5c40f83 Update Credits (#5974)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-06-07 04:55:51 +02:00
Delta-V bot d0c3cff669 Automatic changelog update 2026-06-06 21:14:23 +02:00
ed1fa64a6e feat: Recent SSD indicator, SSD time in admin overlay (#5699)
* feat: Recent SSD indicator, SSD time in admin overlay

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

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

* tweak: remove colon from ssd time loc string

* feat: add another stage

* feat: ssd examine text

* apply suggestion: make ssdstage serializable, use proper doc comments

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

* apply suggestion: more compact switch, throw instead of logging if invalid stage

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

* apply suggestion: missing DeltaV comment

Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
Signed-off-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>

* fix: add missing import

* refactor: remove unnecessary state-keeping

i don't remember why i did it like that

* chore: remove unused import

* refactor: don't separate comp from ent

---------

Signed-off-by: DisposableCrewmember42 <disposablecrewmember42@proton.me>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: pathetic meowmeow <uhhadd@gmail.com>
Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-06-06 19:14:03 +00:00
Delta-V bot cb245477b8 Automatic changelog update 2026-06-06 14:08:17 +02:00
0fdfef7175 New Lobby/Jukebox Track Made By Me (#5620)
* woah

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

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

* attributions updates

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

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

* Update Resources/Audio/_DV/Lobby/attributions.yml

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

* Update Resources/Audio/_DV/Jukebox/attributions.yml

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

* Update RobustToolbox

---------

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>
Co-authored-by: Tobias Berger <toby@tobot.dev>
2026-06-06 12:07:55 +00:00
Delta-V bot 646d538c4a Automatic changelog update 2026-06-06 11:53:38 +02:00
Stxcking 6ebcf78d08 Fix: Radiation Barrier Projector Works as Intended (#5787)
fix
2026-06-06 11:53:19 +02:00
Delta-V bot 2b7e3c8058 Automatic changelog update 2026-06-05 23:14:09 +02:00
pathetic meowmeow 4736a8db6f Add cyborg wire panel (#5948)
* Add cyborg wire panel

* MORE WIRES RAAAGH

* file capitalization

* renamed

* more comments
2026-06-05 23:13:49 +02:00
Delta-V bot 6057388bae Automatic changelog update 2026-06-05 19:34:29 +02:00
50a651beea Added Chameleon Armor (#5921)
* Added Chameleon Armor

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

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

* nerfvest

* Lowered Price

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

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

* Changed Carapace Parent

* Remove irrelevant Braces

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

---------

Signed-off-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-06-05 17:34:09 +00:00
VelcroboyandVelcroboy 7e1308dd12 Map Hotfix: Elegance (#5966)
Co-authored-by: Velcroboy <velcroboy333@hotmail.com>
2026-06-05 18:06:03 +02:00
Delta-V bot 338ff271c7 Automatic changelog update 2026-06-05 17:33:16 +02:00
Stxcking fddd9079d3 Feat: Small Nuclear Reactor and Small Gas Turbine for Purchase (#5945)
mhmm
2026-06-05 11:32:56 -04:00
Delta-V bot bedc17ae73 Automatic changelog update 2026-06-05 17:29:04 +02:00
Stxcking ec80e99e26 Tweak: Added More Pride Theme Items in the Pride-o-Mat (#5946)
* gay

* more gay
2026-06-05 11:28:44 -04:00
Delta-V bot 4ceb567439 Automatic changelog update 2026-06-05 17:26:45 +02:00
Theo 6a9984475c Random nukie and ninja appearance (#5922)
* ninja and nukie random appearance component added to gamerules

* ninja and nukie random appearance component added to gamerules

* add keepgender
2026-06-05 15:26:24 +00:00
Delta-V bot 030eb95c63 Automatic changelog update 2026-06-05 17:18:10 +02:00
Stxcking 00abed028d Feat: No Paradox Clone Trait (#5937)
* yip

* whoops
2026-06-05 11:17:50 -04:00
Delta-V bot 0f3d319a6d Automatic changelog update 2026-06-05 17:08:02 +02:00
biddygelson a9ddc102e7 Academy 1.8.1 (#5880)
* added secure windoors to sec disposal chutes
* added secure windoors to epi-brig disposal chute, sec and epi locked.
* tweak medical escape pods for DV 5x7 variant
* tweak justice escape pods for DV 5x7 variant
* replaced all solar grill with random grill spawner
* tweak moved disposal light so it doesn't break from trash
2026-06-05 17:07:41 +02:00
Delta-V bot a51896b08d Automatic changelog update 2026-06-05 17:06:12 +02:00
Stxcking 356106342f Tweak: Revert Upstream Medical Borg Rework + More (#5656)
* Medical Borg Good Again :D

* Indents buh

* im blind

or dumb, theres errors that seem unrelated to the bodybags after this

* IM SORRY I FORGOT ABOUT THIS

* Anchoring it
2026-06-05 11:05:52 -04:00
Delta-V bot a3b450ac07 Automatic changelog update 2026-06-05 15:34:19 +02:00
pathetic meowmeow 4ddb5901b0 Better douner name generation (#5836)
* better douner name generation

* more names

* yet more names

* ugly sins that i hate

* screaming

* e
2026-06-05 15:33:56 +02:00
Delta-V bot 972d852bf4 Automatic changelog update 2026-06-05 14:46:20 +02:00
pathetic meowmeow ef0d317d12 Interaction particle finetuning (#5933) 2026-06-05 08:46:01 -04:00
003e08b583 Flavourful emotes (#5595)
* Changed up how emoting works

This was a long 10 hours just to get the chat to behave slightly different.

At least we can now scream over radio!

Will most definitely need some more work to get bugs out since this is the first implementation.

* Not ok

This was unmarked for some reason... I don't remember unmarking this.

* DeltaV comments

Added comments to explain changes.

Moved localization files to the _DV folder.

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

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

* Moved code

Moved code to more suitable files and added some comments.

* Rights for robots

Now those with intrinsic radios can also emote!

* Fixes up some small stuff

Changes to fix some small issues with the code to align it more with modern standards.

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

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

* Fix by-ref event

Never worked with this event type before so gonna hope this works.

* Update Content.Shared/Chat/SharedChatSystem.Emote.cs

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

* Update Content.Shared/Chat/SharedChatSystem.cs

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

* Update Content.Server/Chat/Systems/ChatSystem.cs

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

* fix style nits

* remove conflicting chatsan

---------

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-06-04 17:25:58 +00:00
Delta-V bot 74739709c4 Automatic changelog update 2026-06-04 12:59:17 +02:00
AeraAulinandSir Warock 61840fd5ab Rename Holy to Radiant and Shadow to Soul (#5952)
* rename shadow to soul and change it all since it's ours, hopefully change holy to radiant while touching as little as possible

* obliterate a mention of shadow

* Update Resources/Prototypes/_Impstation/Entities/Mobs/Anomalites/anomalite_damage.yml

Co-authored-by: Sir Warock <67167466+SirWarock@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: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-06-04 07:58:56 -03:00
Delta-V bot 90f7aa7999 Automatic changelog update 2026-06-03 20:44:15 +02:00
turtlemutt 2260af7ce1 Bluehouse (#5898)
Update lighthouse.yml
2026-06-03 20:43:55 +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
3558 changed files with 171285 additions and 109528 deletions
+1 -1
View File
@@ -19,7 +19,7 @@
/Content.IntegrationTests/Tests/PostMapInitTest.cs @DeltaV-Station/maptainers /Content.IntegrationTests/Tests/PostMapInitTest.cs @DeltaV-Station/maptainers
# Server rules # Server rules
/Resources/ServerInfo/Guidebook/DeltaV/Rules/ @DeltaV-Station/head-administrators /Resources/ServerInfo/Guidebook/_DV/Rules/ @DeltaV-Station/head-administrators
# Wiki # Wiki
/.wiki/ @DeltaV-Station/direction /.wiki/ @DeltaV-Station/direction
+9
View File
@@ -12,12 +12,21 @@ jobs:
- name: Setup submodule - name: Setup submodule
run: | run: |
git submodule update --init --recursive git submodule update --init --recursive
pushd RobustToolbox/Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Pull engine updates - name: Pull engine updates
uses: space-wizards/submodule-dependency@v0.1.5 uses: space-wizards/submodule-dependency@v0.1.5
- name: Update Engine Submodules - name: Update Engine Submodules
run: | run: |
cd RobustToolbox/ cd RobustToolbox/
git submodule update --init --recursive git submodule update --init --recursive
pushd Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Setup .NET Core - name: Setup .NET Core
uses: actions/setup-dotnet@v4.1.0 uses: actions/setup-dotnet@v4.1.0
with: with:
+9 -1
View File
@@ -24,7 +24,11 @@ jobs:
- name: Setup Submodule - name: Setup Submodule
run: | run: |
git submodule update --init --recursive git submodule update --init --recursive
pushd RobustToolbox/Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Pull engine updates - name: Pull engine updates
uses: space-wizards/submodule-dependency@v0.1.5 uses: space-wizards/submodule-dependency@v0.1.5
@@ -32,6 +36,10 @@ jobs:
run: | run: |
cd RobustToolbox/ cd RobustToolbox/
git submodule update --init --recursive git submodule update --init --recursive
pushd Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Setup .NET Core - name: Setup .NET Core
uses: actions/setup-dotnet@v4.1.0 uses: actions/setup-dotnet@v4.1.0
+8
View File
@@ -24,6 +24,10 @@ jobs:
- name: Setup Submodule - name: Setup Submodule
run: | run: |
git submodule update --init --recursive git submodule update --init --recursive
pushd RobustToolbox/Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Pull engine updates - name: Pull engine updates
uses: space-wizards/submodule-dependency@v0.1.5 uses: space-wizards/submodule-dependency@v0.1.5
@@ -32,6 +36,10 @@ jobs:
run: | run: |
cd RobustToolbox/ cd RobustToolbox/
git submodule update --init --recursive git submodule update --init --recursive
pushd Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Setup .NET Core - name: Setup .NET Core
uses: actions/setup-dotnet@v4.1.0 uses: actions/setup-dotnet@v4.1.0
+7
View File
@@ -20,6 +20,7 @@ jobs:
- uses: actions/checkout@v4.2.2 - uses: actions/checkout@v4.2.2
with: with:
submodules: 'recursive' submodules: 'recursive'
- name: Setup .NET Core - name: Setup .NET Core
uses: actions/setup-dotnet@v4.1.0 uses: actions/setup-dotnet@v4.1.0
with: with:
@@ -30,6 +31,12 @@ jobs:
cd RobustToolbox cd RobustToolbox
git fetch --depth=1 git fetch --depth=1
- name: Get Engine Tag
run: |
cd RobustToolbox/Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
- name: Install dependencies - name: Install dependencies
run: dotnet restore run: dotnet restore
+8
View File
@@ -39,6 +39,10 @@ jobs:
- name: Setup Submodule - name: Setup Submodule
run: | run: |
git submodule update --init --recursive git submodule update --init --recursive
pushd RobustToolbox/Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Pull engine updates - name: Pull engine updates
uses: space-wizards/submodule-dependency@v0.1.5 uses: space-wizards/submodule-dependency@v0.1.5
@@ -47,6 +51,10 @@ jobs:
run: | run: |
cd RobustToolbox/ cd RobustToolbox/
git submodule update --init --recursive git submodule update --init --recursive
pushd Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Setup .NET Core - name: Setup .NET Core
uses: actions/setup-dotnet@v4.1.0 uses: actions/setup-dotnet@v4.1.0
+8
View File
@@ -17,12 +17,20 @@ jobs:
- name: Setup submodule - name: Setup submodule
run: | run: |
git submodule update --init --recursive git submodule update --init --recursive
pushd RobustToolbox/Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Pull engine updates - name: Pull engine updates
uses: space-wizards/submodule-dependency@v0.1.5 uses: space-wizards/submodule-dependency@v0.1.5
- name: Update Engine Submodules - name: Update Engine Submodules
run: | run: |
cd RobustToolbox/ cd RobustToolbox/
git submodule update --init --recursive git submodule update --init --recursive
pushd Lidgren.Network/Lidgren.Network
git fetch
git checkout 726dd552a4b104fb2b701848705f1250a073f060
popd
- name: Setup .NET Core - name: Setup .NET Core
uses: actions/setup-dotnet@v4.1.0 uses: actions/setup-dotnet@v4.1.0
with: with:
+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. | 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}} {{Guides Menu}}
+1 -1
View File
@@ -269,7 +269,7 @@ Sentencing modifiers are to be applied by the sentencing officer, judge, or arbi
| style="border: 1px solid black;" | [[File:SL_BreakingAndEntering.png]] | style="border: 1px solid black;" | [[File:SL_BreakingAndEntering.png]]
! style="border: 1px solid black;" | {{anchor|Breaking and Entering}}Breaking and Entering ! style="border: 1px solid black;" | {{anchor|Breaking and Entering}}Breaking and Entering
| style="border: 1px solid black;" | 5 minutes | style="border: 1px solid black;" | 5 minutes
| style="border: 1px solid black;" | To break and enter into a high security area where one is not authorised nor invited, with intent to commit a crime within. | style="border: 1px solid black;" | To break and enter into an area where one is not authorised nor invited.
|- |-
| style="border: 1px solid black;" | 203 | style="border: 1px solid black;" | 203
| style="border: 1px solid black;" | [[File:SL_Rioting.png]] | style="border: 1px solid black;" | [[File:SL_Rioting.png]]
@@ -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. * 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. * 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. * 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. * 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. * Prisoners should be granted freedom of movement within their holding area unless there is an undue risk to life and limb.
+78 -18
View File
@@ -73,28 +73,88 @@ If you are adding a lot of C# code, then take advantage of partial classes. Put
Otherwise, **add comments on or around any changed lines.** Otherwise, **add comments on or around any changed lines.**
A comment on a new imported namespace: ### Single-Line Changes
Format should look like this.
```cs ```cs
using Content.Server.Psionics.Glimmer; // DeltaV /* Importing Namespaces - Include optional comment if its not obvious what its being used for. */
using Content.Server._DV.Psionics.Glimmer; // DeltaV
using Content.Shared.Damage.Systems; // DeltaV - Addition of HandHeldArmor
/* Changing an upstream line - Same line as the change */
if (!TryComp<EyeComponent>(ent, out var eye) || _disabled) // DeltaV - check if disabled
/* Adding - Either same line or above the line. */
EnsureComp<PotentialPsionicComponent>(entity); // Deltav - Psionics
/* "Deleting" - Don't actually delete, just comment out and say why. This only applies to upstream code. */
// args.StatusIcons.Add(_prototype.Index(component.Icon)); // DeltaV - commented out. status icon now added above
``` ```
A pair of comments enclosing a block of added code: > * Its pretty obvious in the example above that importing `Content.Server._DV.Psionics.Glimmer` means we'll be interacting with glimmer so putting `// DeltaV - Add Glimmer` is needlessly redundant.
> * It's not as obvious what the `Content.Shared.Damage.Systems` namespace is used for, since its so broad, so adding a comment what feature is using it helps.
> * Actual code changes should almost always include the comment after ``// DeltaV`.
### Multi-Line Changes
Depending on how much you are editing, putting a comment on EACH line may be excessive, so if you have a larger block of code you are changing, denote it like so:
```cs ```cs
private EntityUid Slice(...) // BEGIN DeltaV - Remove innate radio and radios from pockets
for (var i = 1; i <= 4; i++) // Arachnids have 4 pockets
{ {
... if (_inventory.TryGetSlotEntity(target, $"pocket{i}", out var headset) && HasComp<HeadsetComponent>(headset))
_inventory.TryUnequip(target, $"pocket{i}", true, true);
_transform.SetLocalRotation(sliceUid, 0);
// DeltaV - start of deep frier stuff
var slicedEv = new FoodSlicedEvent(user, uid, sliceUid);
RaiseLocalEvent(uid, ref slicedEv);
// DeltaV - end of deep frier stuff
...
} }
RemComp<ActiveRadioComponent>(target); // If the zombie has an innate radio, get rid of it.
// END DeltaV
``` ```
> * Denoting these with a BEGIN and END clearly shows they are block of code without having to read the entire comment. This makes it easier to tell when you're dealing with single-line comments versus a block with merging in conflicts.
> * Case and order of the first two words is less of a concern. `// DeltaV Begin` or `// Begin DeltaV` will work fine too.
> * Try to make your blocks as small as possible, but use your discretion.
> * If you deleting multiple lines, use line comments (``//``) if its a few lines but if its a larger block (like commenting out an entire function), it is preferable to use block comments (`/* */`).
#### Soft Exceptions to the Multi-Line "Rules"
Some multi-line changes can use a single-line comment in certain scenarios. But if you are UNSURE, just use `// BEGIN DeltaV` and `// END DeltaV` comments like the previous section does and it'll be fine.
I'll give some examples.
```cs
/* This change comments out 3 lines but only needs a single line comment because commenting out the if statement implies that its logic will be commented out too. */
// if (obj.WasModified<TraitPrototype>()) // DeltaV - Refreshed in TraitsTab
// {
// _profileEditor.RefreshTraits();
// }
/* Same principle here. This adds two lines but the if statement implies the next line so commenting both lines isn't really needed. */
if (_flight.IsFlying(entity.Owner)) // DeltaV - Harpy Flight
return true;
```
### New Methods or Component Variables
Sometimes, you'll need to implement a whole new method or component variable and instead of wrapping it in `// BEGIN DeltaV` and `// END DeltaV`, you can just denote that it's a DeltaV function in the summary block before the function. This denotes the WHOLE function as a DeltaV addition.
```cs
/* New Method Example */
/// <summary>
/// DeltaV - Handle revealing ninja if cloaked when attacked by a hitscan attack.
/// </summary>
private void OnNinjaAttacked(Entity<SpaceNinjaComponent> ent, ref DamageChangedEvent args)
{
...
}
/* New Component Variable Example */
/// <summary>
/// DeltaV - If disabled the action will not disable when no charges remain. Use if you want to handle no charges differently.
/// </summary>
[DataField]
public bool DisableWhenEmpty = true;
```
In short:
* Use `// BEGIN DeltaV` and `// END Delta` to denote a *block* of changes.
* Keep blocks as small as possible.
* Use `// DeltaV` on or before the line if its not a block of changes.
* Use exceptions when they make sense.
### Changing Upstream Localization Fluent .ftl files ### Changing Upstream Localization Fluent .ftl files
**Move all changed locale strings to a new DeltaV file** - use a `.ftl` file in the `_DV` folder. Comment out the old strings in the upstream file, and explain that they were moved. **Move all changed locale strings to a new DeltaV file** - use a `.ftl` file in the `_DV` folder. Comment out the old strings in the upstream file, and explain that they were moved.
@@ -104,10 +164,10 @@ Example:
Commented out old string in `Resources\Locale\en-US\xenoarchaeology\artifact-analyzer.ftl` Commented out old string in `Resources\Locale\en-US\xenoarchaeology\artifact-analyzer.ftl`
``` ```
# DeltaV - moved to _DV file # DeltaV - moved to _DV file
#analysis-console-info-effect-value = [font="Monospace" size=11][color=gray]{ $state -> # analysis-console-info-effect-value = [font="Monospace" size=11][color=gray]{ $state ->
# [true] {$info} # [true] {$info}
# *[false] Unlock nodes to gain info # *[false] Unlock nodes to gain info
#}[/color][/font] # }[/color][/font]
``` ```
The new version of the string in `Resources\Locale\en-US\_DV\xenoarchaeology\artifact-analyzer.ftl` The new version of the string in `Resources\Locale\en-US\_DV\xenoarchaeology\artifact-analyzer.ftl`
@@ -8,12 +8,14 @@ using Content.Shared.CCVar;
using Content.Shared.Ghost; using Content.Shared.Ghost;
using Content.Shared.Mind; using Content.Shared.Mind;
using Content.Shared.Roles; using Content.Shared.Roles;
using Content.Shared.SSDIndicator; // DeltaV - SSD time indicator
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.ResourceManagement; using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Shared.Configuration; using Robust.Shared.Configuration;
using Robust.Shared.Enums; using Robust.Shared.Enums;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Timing; // DeltaV - SSD time indicator
namespace Content.Client.Administration; namespace Content.Client.Administration;
@@ -26,6 +28,7 @@ internal sealed class AdminNameOverlay : Overlay
private readonly IUserInterfaceManager _userInterfaceManager; private readonly IUserInterfaceManager _userInterfaceManager;
private readonly SharedRoleSystem _roles; private readonly SharedRoleSystem _roles;
private readonly IPrototypeManager _prototypeManager; private readonly IPrototypeManager _prototypeManager;
private readonly IGameTiming _timing; // DeltaV - Add timing
private readonly Font _font; private readonly Font _font;
private readonly Font _fontBold; private readonly Font _fontBold;
private AdminOverlayAntagFormat _overlayFormat; private AdminOverlayAntagFormat _overlayFormat;
@@ -53,7 +56,8 @@ internal sealed class AdminNameOverlay : Overlay
IUserInterfaceManager userInterfaceManager, IUserInterfaceManager userInterfaceManager,
IConfigurationManager config, IConfigurationManager config,
SharedRoleSystem roles, SharedRoleSystem roles,
IPrototypeManager prototypeManager) IPrototypeManager prototypeManager,
IGameTiming timing) // DeltaV - Add timing
{ {
_system = system; _system = system;
_entityManager = entityManager; _entityManager = entityManager;
@@ -62,6 +66,7 @@ internal sealed class AdminNameOverlay : Overlay
_userInterfaceManager = userInterfaceManager; _userInterfaceManager = userInterfaceManager;
_roles = roles; _roles = roles;
_prototypeManager = prototypeManager; _prototypeManager = prototypeManager;
_timing = timing; // DeltaV - Add timing
ZIndex = 200; ZIndex = 200;
// Setting these to a specific ttf would break the antag symbols // Setting these to a specific ttf would break the antag symbols
_font = resourceCache.NotoStack(); _font = resourceCache.NotoStack();
@@ -231,6 +236,18 @@ internal sealed class AdminNameOverlay : Overlay
currentOffset += lineoffset; currentOffset += lineoffset;
} }
// DeltaV - SSD Time START
if (_entityManager.TryGetComponent<SSDIndicatorComponent>(entity, out var ssdIndicator)
&& ssdIndicator.SsdSince is {} ssdSince)
{
color = Color.MediumPurple;
color.A = alpha;
var ssdText = Loc.GetString("admin-overlay-ssd-time", ("time", (_timing.CurTime - ssdSince).ToString("%hh':'mm':'ss")));
args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, ssdText, uiScale, color);
currentOffset += lineoffset;
}
// DeltaV END
// Determine antag symbol // Determine antag symbol
string? symbol; string? symbol;
switch (_overlaySymbolStyle) switch (_overlaySymbolStyle)
@@ -5,6 +5,7 @@ using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Shared.Configuration; using Robust.Shared.Configuration;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Timing; // DeltaV - SSD time indicator
namespace Content.Client.Administration.Systems namespace Content.Client.Administration.Systems
{ {
@@ -19,6 +20,7 @@ namespace Content.Client.Administration.Systems
[Dependency] private readonly IConfigurationManager _configurationManager = default!; [Dependency] private readonly IConfigurationManager _configurationManager = default!;
[Dependency] private readonly SharedRoleSystem _roles = default!; [Dependency] private readonly SharedRoleSystem _roles = default!;
[Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IGameTiming _timing = default!; // DeltaV - added for SSD time indicator
private AdminNameOverlay _adminNameOverlay = default!; private AdminNameOverlay _adminNameOverlay = default!;
@@ -36,7 +38,8 @@ namespace Content.Client.Administration.Systems
_userInterfaceManager, _userInterfaceManager,
_configurationManager, _configurationManager,
_roles, _roles,
_proto); _proto,
_timing); // DeltaV - Add timing
_adminManager.AdminStatusUpdated += OnAdminStatusUpdated; _adminManager.AdminStatusUpdated += OnAdminStatusUpdated;
} }
-69
View File
@@ -1,76 +1,7 @@
using Content.Shared.Body.Systems; 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; namespace Content.Client.Body.Systems;
public sealed class BodySystem : SharedBodySystem 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 System.Linq;
using Content.Client.DisplacementMap; using Content.Client.DisplacementMap;
using Content.Client.Inventory; using Content.Client.Inventory;
using Content.Shared._DV.Silicon.IPC; // DeltaV - IPC Snouts
using Content.Shared.Clothing; using Content.Shared.Clothing;
using Content.Shared.Clothing.Components; using Content.Shared.Clothing.Components;
using Content.Shared.Clothing.EntitySystems; using Content.Shared.Clothing.EntitySystems;
@@ -103,12 +102,8 @@ public sealed class ClientClothingSystem : ClothingSystem
List<PrototypeLayerData>? layers = null; List<PrototypeLayerData>? layers = null;
// Begin DeltaV Additions - IPC snouts
var speciesId = inventory.SpeciesId; var speciesId = inventory.SpeciesId;
if (TryComp(args.Equipee, out SnoutHelmetComponent? helmetComponent) && helmetComponent.EnableAlternateHelmet)
speciesId = helmetComponent.ReplacementRace;
// first attempt to get species specific data. // first attempt to get species specific data.
if (speciesId != null) if (speciesId != null)
item.ClothingVisuals.TryGetValue($"{args.Slot}-{speciesId}", out layers); 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)) if (!TryGetDefaultVisuals(uid, item, args.Slot, speciesId, out layers))
return; return;
} }
// End DeltaV Additions
// add each layer to the visuals // add each layer to the visuals
var i = 0; var i = 0;
+74 -8
View File
@@ -18,8 +18,36 @@ public sealed class DoorSystem : SharedDoorSystem
{ {
base.Initialize(); base.Initialize();
SubscribeLocalEvent<DoorComponent, AppearanceChangeEvent>(OnAppearanceChange); 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) protected override void OnComponentInit(Entity<DoorComponent> ent, ref ComponentInit args)
{ {
var comp = ent.Comp; var comp = ent.Comp;
@@ -87,10 +115,13 @@ public sealed class DoorSystem : SharedDoorSystem
state = DoorState.Closed; state = DoorState.Closed;
if (AppearanceSystem.TryGetData<string>(entity, PaintableVisuals.Prototype, out var prototype, args.Component)) 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)) // ES START
_animationSystem.Stop(entity.Owner, DoorComponent.AnimationKey); // 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. // 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)) if (_sprite.TryGetLayer(entity.Owner, DoorVisualLayers.BaseEmagging, out var _, false))
@@ -106,6 +137,12 @@ public sealed class DoorSystem : SharedDoorSystem
switch (state) switch (state)
{ {
case DoorState.Open: 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) foreach (var (layer, layerState) in entity.Comp.OpenSpriteStates)
{ {
_sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState); _sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState);
@@ -113,6 +150,12 @@ public sealed class DoorSystem : SharedDoorSystem
return; return;
case DoorState.Closed: 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) foreach (var (layer, layerState) in entity.Comp.ClosedSpriteStates)
{ {
_sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState); _sprite.LayerSetRsiState((entity.Owner, sprite), layer, layerState);
@@ -123,24 +166,47 @@ public sealed class DoorSystem : SharedDoorSystem
if (entity.Comp.OpeningAnimationTime == TimeSpan.Zero) if (entity.Comp.OpeningAnimationTime == TimeSpan.Zero)
return; 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; return;
case DoorState.Closing: case DoorState.Closing:
if (entity.Comp.ClosingAnimationTime == TimeSpan.Zero || entity.Comp.CurrentlyCrushing.Count != 0) if (entity.Comp.ClosingAnimationTime == TimeSpan.Zero || entity.Comp.CurrentlyCrushing.Count != 0)
return; 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; return;
case DoorState.Denying: 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; return;
case DoorState.Emagging: 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)) 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; return;
} }
+10
View File
@@ -7,6 +7,7 @@ using Content.Shared.IdentityManagement;
using Content.Shared.Input; using Content.Shared.Input;
using Content.Shared.Interaction.Events; using Content.Shared.Interaction.Events;
using Content.Shared.Item; using Content.Shared.Item;
using Content.Shared.Radio.Components; // DeltaV - Client-side Radio Colors
using Content.Shared.Verbs; using Content.Shared.Verbs;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
@@ -158,6 +159,15 @@ namespace Content.Client.Examine
// since there's probably one open already if it's coming in from the server. // since there's probably one open already if it's coming in from the server.
var entity = GetEntity(ev.EntityUid); var entity = GetEntity(ev.EntityUid);
// BEGIN DeltaV - Client-Side Radio Colors
// This *seems* a bit hacky, but we basically don't want to overwrite what's been pushed on the client-side,
// because the server will send us the server-side colors (default). I've yet to find a scenario where the
// server and client don't match, so until then, this is probably fine, if a little hacky.
if (HasComp<EncryptionKeyHolderComponent>(entity) || HasComp<EncryptionKeyComponent>(entity))
return;
// END DeltaV
OpenTooltip(player.Value, entity, ev.CenterAtCursor, ev.OpenAtOldTooltip, ev.KnowTarget); OpenTooltip(player.Value, entity, ev.CenterAtCursor, ev.OpenAtOldTooltip, ev.KnowTarget);
UpdateTooltipInfo(player.Value, entity, ev.Message, ev.Verbs, getVerbs: false); UpdateTooltipInfo(player.Value, entity, ev.Message, ev.Verbs, getVerbs: false);
} }
+36 -5
View File
@@ -36,6 +36,9 @@ public sealed class EyeLerpingSystem : EntitySystem
UpdatesAfter.Add(typeof(TransformSystem)); UpdatesAfter.Add(typeof(TransformSystem));
UpdatesAfter.Add(typeof(Robust.Client.Physics.PhysicsSystem)); UpdatesAfter.Add(typeof(Robust.Client.Physics.PhysicsSystem));
UpdatesBefore.Add(typeof(SharedEyeSystem)); UpdatesBefore.Add(typeof(SharedEyeSystem));
// ES START
UpdatesBefore.Add(typeof(EyeSystem));
// ES END
UpdatesOutsidePrediction = true; UpdatesOutsidePrediction = true;
} }
@@ -68,6 +71,11 @@ public sealed class EyeLerpingSystem : EntitySystem
{ {
_eye.SetRotation(uid, lerpInfo.TargetRotation, component); _eye.SetRotation(uid, lerpInfo.TargetRotation, component);
_eye.SetZoom(uid, lerpInfo.TargetZoom, 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; var tickFraction = (float) _gameTiming.TickFraction / ushort.MaxValue;
const double lerpMinimum = 0.00001; 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 // Handle zoom
var zoomDiff = Vector2.Lerp(lerpInfo.LastZoom, lerpInfo.TargetZoom, tickFraction); var zoomDiff = Vector2.Lerp(lerpInfo.LastZoom, lerpInfo.TargetZoom, tickFraction);
@@ -191,6 +205,14 @@ public sealed class EyeLerpingSystem : EntitySystem
_eye.SetZoom(entity, zoomDiff, eye); _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 // Handle Rotation
TryComp<InputMoverComponent>(entity, out var mover); TryComp<InputMoverComponent>(entity, out var mover);
@@ -199,7 +221,10 @@ public sealed class EyeLerpingSystem : EntitySystem
if (!NeedsLerp(mover)) if (!NeedsLerp(mover))
{ {
_eye.SetRotation(entity, lerpInfo.TargetRotation, eye); // ES START
// contenteye
contentEye.BaseRotation = lerpInfo.TargetRotation;
// ES END
continue; continue;
} }
@@ -207,11 +232,17 @@ public sealed class EyeLerpingSystem : EntitySystem
if (Math.Abs(shortest.Theta) < lerpMinimum) if (Math.Abs(shortest.Theta) < lerpMinimum)
{ {
_eye.SetRotation(entity, lerpInfo.TargetRotation, eye); // ES START
// contenteye
contentEye.BaseRotation = lerpInfo.TargetRotation;
// ES END
continue; 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.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using Content.Shared._Shitmed.Body.Events; // Shitmed Change
using Content.Client.DisplacementMap; using Content.Client.DisplacementMap;
using Content.Client.Examine; using Content.Client.Examine;
using Content.Client.Strip; using Content.Client.Strip;
using Content.Client.Verbs.UI; using Content.Client.Verbs.UI;
using Content.Shared.Body.Part; // Shitmed Change
using Content.Shared.Hands; using Content.Shared.Hands;
using Content.Shared.Hands.Components; using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems; using Content.Shared.Hands.EntitySystems;
@@ -51,8 +49,6 @@ namespace Content.Client.Hands.Systems
SubscribeLocalEvent<HandsComponent, ComponentShutdown>(OnHandsShutdown); SubscribeLocalEvent<HandsComponent, ComponentShutdown>(OnHandsShutdown);
SubscribeLocalEvent<HandsComponent, ComponentHandleState>(HandleComponentState); SubscribeLocalEvent<HandsComponent, ComponentHandleState>(HandleComponentState);
SubscribeLocalEvent<HandsComponent, VisualsChangedEvent>(OnVisualsChanged); SubscribeLocalEvent<HandsComponent, VisualsChangedEvent>(OnVisualsChanged);
SubscribeLocalEvent<HandsComponent, BodyPartRemovedEvent>(HandleBodyPartRemoved); // Shitmed Change
SubscribeLocalEvent<HandsComponent, BodyPartDisabledEvent>(HandleBodyPartDisabled); // Shitmed Change
OnHandSetActive += OnHandActivated; OnHandSetActive += OnHandActivated;
} }
@@ -206,35 +202,6 @@ namespace Content.Client.Hands.Systems
#region visuals #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) protected override void HandleEntityInserted(EntityUid uid, HandsComponent hands, EntInsertedIntoContainerMessage args)
{ {
base.HandleEntityInserted(uid, hands, args); base.HandleEntityInserted(uid, hands, args);
@@ -1,7 +1,6 @@
using Content.Shared.MedicalScanner; using Content.Shared.MedicalScanner;
using Content.Shared._Shitmed.Targeting; // Shitmed Change using Content.Shared._DV.MedicalRecords;
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records using JetBrains.Annotations; // DeltaV - Medical Records
using JetBrains.Annotations;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
namespace Content.Client.HealthAnalyzer.UI namespace Content.Client.HealthAnalyzer.UI
@@ -21,13 +20,11 @@ namespace Content.Client.HealthAnalyzer.UI
base.Open(); base.Open();
_window = this.CreateWindow<HealthAnalyzerWindow>(); _window = this.CreateWindow<HealthAnalyzerWindow>();
_window.HealthAnalyzer.OnBodyPartSelected += SendBodyPartMessage; // Shitmed Change
_window.HealthAnalyzer.OnTriageStatusChanged += SendTriageStatusMessage; // DeltaV - Medical Records _window.HealthAnalyzer.OnTriageStatusChanged += SendTriageStatusMessage; // DeltaV - Medical Records
_window.HealthAnalyzer.OnClaimPatient += SendTriageClaimMessage; // DeltaV - Medical Records _window.HealthAnalyzer.OnClaimPatient += SendTriageClaimMessage; // DeltaV - Medical Records
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName; _window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
} }
protected override void ReceiveMessage(BoundUserInterfaceMessage message) protected override void ReceiveMessage(BoundUserInterfaceMessage message)
{ {
if (_window == null) if (_window == null)
@@ -39,22 +36,6 @@ namespace Content.Client.HealthAnalyzer.UI
_window.Populate(cast); _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 // Begin DeltaV - Medical Records
private void SendTriageStatusMessage(TriageStatus status) private void SendTriageStatusMessage(TriageStatus status)
=> SendMessage(new HealthAnalyzerTriageStatusMessage(status)); => SendMessage(new HealthAnalyzerTriageStatusMessage(status));
@@ -6,160 +6,12 @@
Name="NoPatientDataText" Name="NoPatientDataText"
Text="{Loc health-analyzer-window-no-patient-data-text}" /> 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 <BoxContainer
Name="PatientDataContainer" Name="PatientDataContainer"
Margin="0 0 0 5" Margin="0 0 0 5"
Orientation="Vertical"> Orientation="Vertical">
<BoxContainer Orientation="Horizontal" Margin="0 0 0 5"> <BoxContainer Orientation="Horizontal" Margin="0 0 0 5">
<PanelContainer> <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-->
<!-- 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 -->
<BoxContainer Margin="5 0 0 0" Orientation="Vertical" VerticalAlignment="Top"> <BoxContainer Margin="5 0 0 0" Orientation="Vertical" VerticalAlignment="Top">
<RichTextLabel Name="NameLabel" SetWidth="150" /> <RichTextLabel Name="NameLabel" SetWidth="150" />
<Label Name="SpeciesLabel" VerticalAlignment="Top" StyleClasses="LabelSubText" /> <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.Traits.Assorted; // DeltaV
using Content.Shared._DV.Medical; // DeltaV - Uncloneable using Content.Shared._DV.Medical; // DeltaV - Uncloneable
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records 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 UI is split from its window because it's used by both the
// health analyzer item and the cryo pod UI. // 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 RedshirtSystem _redshirt; // DeltaV
private readonly UncloneableSystem _uncloneable; // 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 // Begin DeltaV - Medical Records
private readonly ButtonGroup _triageStatusGroup = new(); private readonly ButtonGroup _triageStatusGroup = new();
private readonly Dictionary<TriageStatus, Button> _triageControls = new(); private readonly Dictionary<TriageStatus, Button> _triageControls = new();
@@ -72,29 +61,6 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
_unborgable = _entityManager.System<UnborgableSystem>(); // DeltaV _unborgable = _entityManager.System<UnborgableSystem>(); // DeltaV
_redshirt = _entityManager.System<RedshirtSystem>(); // DeltaV _redshirt = _entityManager.System<RedshirtSystem>(); // DeltaV
_uncloneable = _entityManager.System<UncloneableSystem>(); // 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 // Begin DeltaV - Medical Records
foreach (var item in Enum.GetValues<TriageStatus>()) foreach (var item in Enum.GetValues<TriageStatus>())
@@ -120,29 +86,14 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
public void Populate(HealthAnalyzerUiState state) public void Populate(HealthAnalyzerUiState state)
{ {
var target = _entityManager.GetEntity(state.TargetEntity); 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 if (target == null
|| !_entityManager.TryGetComponent<DamageableComponent>(isPart ? part : target, out var damageable)) // Shitmed || !_entityManager.TryGetComponent<DamageableComponent>(target, out var damageable))
{ {
NoPatientDataText.Visible = true; NoPatientDataText.Visible = true;
return; 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; NoPatientDataText.Visible = false;
// Scan Mode // Scan Mode
@@ -157,11 +108,6 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
// Patient Information // 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(); var name = new FormattedMessage();
name.PushColor(Color.White); name.PushColor(Color.White);
name.AddText(_entityManager.HasComponent<MetaDataComponent>(target.Value) 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) private Texture GetTexture(string texture)
{ {
var rsiPath = new ResPath("/Textures/Objects/Devices/health_analyzer.rsi"); var rsiPath = new ResPath("/Textures/Objects/Devices/health_analyzer.rsi");
@@ -3,7 +3,7 @@
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:ui="clr-namespace:Content.Client.HealthAnalyzer.UI" xmlns:ui="clr-namespace:Content.Client.HealthAnalyzer.UI"
MaxHeight="525" MaxHeight="525"
MinWidth="350"> <!-- Shitmed Change --> MinWidth="300">
<ScrollContainer <ScrollContainer
Margin="5 5 5 5" Margin="5 5 5 5"
ReturnMeasure="True" ReturnMeasure="True"
@@ -11,6 +11,6 @@
<ui:HealthAnalyzerControl <ui:HealthAnalyzerControl
Name="HealthAnalyzer" Name="HealthAnalyzer"
Access="Public" /> <!-- DeltaV / Shitmed Change - Make Public--> Access="Public" /> <!-- DeltaV -->
</ScrollContainer> </ScrollContainer>
</controls:FancyWindow> </controls:FancyWindow>
@@ -88,8 +88,7 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
foreach (var (key, info) in component.CustomBaseLayers) foreach (var (key, info) in component.CustomBaseLayers)
{ {
oldLayers.Remove(key); 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);
SetLayerData(entity, key, info.Id, sexMorph: false, color: info.Color, overrideSkin: true);
} }
// hide old layers // hide old layers
@@ -106,8 +105,7 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
HumanoidVisualLayers key, HumanoidVisualLayers key,
string? protoId, string? protoId,
bool sexMorph = false, bool sexMorph = false,
Color? color = null, Color? color = null)
bool overrideSkin = false) // Shitmed Change
{ {
var component = entity.Comp1; var component = entity.Comp1;
var sprite = entity.Comp2; var sprite = entity.Comp2;
@@ -128,7 +126,7 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
var proto = _prototypeManager.Index<HumanoidSpeciesSpriteLayer>(protoId); var proto = _prototypeManager.Index<HumanoidSpeciesSpriteLayer>(protoId);
component.BaseLayers[key] = proto; component.BaseLayers[key] = proto;
if (proto.MatchSkin && !overrideSkin) // Shitmed Change if (proto.MatchSkin)
layer.Color = component.SkinColor.WithAlpha(proto.LayerAlpha); layer.Color = component.SkinColor.WithAlpha(proto.LayerAlpha);
if (proto.BaseSprite != null) if (proto.BaseSprite != null)
-12
View File
@@ -98,18 +98,6 @@ namespace Content.Client.Input
human.AddFunction(ContentKeyFunctions.Arcade1); human.AddFunction(ContentKeyFunctions.Arcade1);
human.AddFunction(ContentKeyFunctions.Arcade2); human.AddFunction(ContentKeyFunctions.Arcade2);
human.AddFunction(ContentKeyFunctions.Arcade3); 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) // actions should be common (for ghosts, mobs, etc)
common.AddFunction(ContentKeyFunctions.OpenActionsMenu); common.AddFunction(ContentKeyFunctions.OpenActionsMenu);
@@ -6,7 +6,6 @@ using Content.Shared.Interaction;
using Content.Shared.Inventory; using Content.Shared.Inventory;
using Content.Shared.Inventory.Events; using Content.Shared.Inventory.Events;
using Content.Shared.Storage; using Content.Shared.Storage;
using Content.Shared._Shitmed.Targeting.Events; // Shitmed
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Client.Player; using Robust.Client.Player;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
@@ -1,13 +1,16 @@
<controls:FancyWindow xmlns="https://spacestation14.io" <controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client.Medical.CrewMonitoring" xmlns:ui="clr-namespace:Content.Client.Medical.CrewMonitoring"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:crewMonitoring="clr-namespace:Content.Client._DV.CrewMonitoring"
Title="{Loc crew-monitoring-ui-title}" Title="{Loc crew-monitoring-ui-title}"
Resizable="False" Resizable="False"
SetSize="1210 700" SetSize="1210 700"
MinSize="1210 700"> MinSize="1210 700">
<BoxContainer Orientation="Vertical"> <BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal" VerticalExpand="True" HorizontalExpand="True"> <BoxContainer Orientation="Horizontal" VerticalExpand="True" HorizontalExpand="True">
<ui:CrewMonitoringNavMapControl Name="NavMap" HorizontalExpand="True" VerticalExpand="True" Margin="5 20"/> <ui:CrewMonitoringNavMapControl Name="NavMap" HorizontalExpand="True" VerticalExpand="True" Margin="5 20" Visible="False" />
<crewMonitoring:CrewMonitoringShuttleControl Name="ShuttleMap" HorizontalExpand="True" VerticalExpand="True" Margin="5 20" Visible="False" />
<BoxContainer Orientation="Vertical" Margin="0 0 10 0"> <BoxContainer Orientation="Vertical" Margin="0 0 10 0">
<controls:StripeBack> <controls:StripeBack>
<PanelContainer> <PanelContainer>
@@ -5,6 +5,7 @@ using Content.Client.Pinpointer.UI;
using Content.Client.Stylesheets; using Content.Client.Stylesheets;
using Content.Client.UserInterface.Controls; using Content.Client.UserInterface.Controls;
using Content.Shared.Medical.SuitSensor; using Content.Shared.Medical.SuitSensor;
using Content.Shared.Station; // DeltaV - crew monitoring radar
using Content.Shared.StatusIcon; using Content.Shared.StatusIcon;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
@@ -27,6 +28,7 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
[Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
private readonly SharedTransformSystem _transformSystem; private readonly SharedTransformSystem _transformSystem;
private readonly SpriteSystem _spriteSystem; private readonly SpriteSystem _spriteSystem;
private readonly SharedStationSystem _station; // DeltaV - crew monitoring radar
private NetEntity? _trackedEntity; private NetEntity? _trackedEntity;
private bool _tryToScrollToListFocus; private bool _tryToScrollToListFocus;
@@ -39,8 +41,10 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
_transformSystem = _entManager.System<SharedTransformSystem>(); _transformSystem = _entManager.System<SharedTransformSystem>();
_spriteSystem = _entManager.System<SpriteSystem>(); _spriteSystem = _entManager.System<SpriteSystem>();
_station = _entManager.System<SharedStationSystem>(); // DeltaV - crew monitoring radar
NavMap.TrackedEntitySelectedAction += SetTrackedEntityFromNavMap; NavMap.TrackedEntitySelectedAction += SetTrackedEntityFromNavMap;
ShuttleMap.NavMap = NavMap; // DeltaV - crew monitoring radar
} }
public void Set(string stationName, EntityUid? mapUid) public void Set(string stationName, EntityUid? mapUid)
@@ -50,8 +54,10 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
if (_entManager.TryGetComponent<TransformComponent>(mapUid, out var xform)) if (_entManager.TryGetComponent<TransformComponent>(mapUid, out var xform))
NavMap.MapUid = xform.GridUid; NavMap.MapUid = xform.GridUid;
else // Begin DeltaV - handle navmap visibility based on current position
NavMap.Visible = false; // else
// NavMap.Visible = false;
// End DeltaV - handle navmap visibility based on current position
StationName.AddStyleClass("LabelBig"); StationName.AddStyleClass("LabelBig");
StationName.Text = stationName; StationName.Text = stationName;
@@ -62,6 +68,19 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
{ {
base.FrameUpdate(args); base.FrameUpdate(args);
// Begin DeltaV - handle navmap visibility based on current position
if (_station.GetOwningStation(ShuttleMap.Owner) is not null)
{
NavMap.Visible = true;
ShuttleMap.Visible = false;
}
else
{
NavMap.Visible = false;
ShuttleMap.Visible = true;
}
// End DeltaV - handle navmap visibility based on current position
if (_tryToScrollToListFocus) if (_tryToScrollToListFocus)
TryToScrollToFocus(); TryToScrollToFocus();
} }
@@ -69,6 +88,7 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
public void ShowSensors(List<SuitSensorStatus> sensors, EntityUid monitor, EntityCoordinates? monitorCoords) public void ShowSensors(List<SuitSensorStatus> sensors, EntityUid monitor, EntityCoordinates? monitorCoords)
{ {
ClearOutDatedData(); ClearOutDatedData();
ShuttleMap.Owner = monitor; // DeltaV - crew monitoring radar
// No server label // No server label
if (sensors.Count == 0) if (sensors.Count == 0)
@@ -304,7 +324,7 @@ public sealed partial class CrewMonitoringWindow : FancyWindow
jobContainer.AddChild(jobLabel); jobContainer.AddChild(jobLabel);
// Add user coordinates to the navmap // Add user coordinates to the navmap
if (coordinates != null && NavMap.Visible && _blipTexture != null) if (coordinates != null && _blipTexture != null) // DeltaV - don't filter the navmap visibility
{ {
NavMap.TrackedEntities.TryAdd(sensor.SuitSensorUid, NavMap.TrackedEntities.TryAdd(sensor.SuitSensorUid,
new NavMapBlip new NavMapBlip
@@ -60,6 +60,9 @@ public sealed class ContentEyeSystem : SharedContentEyeSystem
while (eyeEntities.MoveNext(out var entity, out ContentEyeComponent? contentComponent, out EyeComponent? eyeComponent)) while (eyeEntities.MoveNext(out var entity, out ContentEyeComponent? contentComponent, out EyeComponent? eyeComponent))
{ {
UpdateEyeOffset((entity, 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)) while (eyeEntities.MoveNext(out var entity, out ContentEyeComponent? contentComponent, out EyeComponent? eyeComponent))
{ {
UpdateEyeOffset((entity, eyeComponent)); UpdateEyeOffset((entity, eyeComponent));
// ES START
UpdateEyeRotation((entity, eyeComponent));
// ES END
} }
} }
} }
@@ -10,6 +10,7 @@
<tabs:AudioTab Name="AudioTab" /> <tabs:AudioTab Name="AudioTab" />
<tabs:AccessibilityTab Name="AccessibilityTab" /> <tabs:AccessibilityTab Name="AccessibilityTab" />
<tabs:AdminOptionsTab Name="AdminOptionsTab" /> <tabs:AdminOptionsTab Name="AdminOptionsTab" />
<dtabs:RadioTab Name="RadioTab" /> <!-- DeltaV - Client-side Radio Options -->
<dtabs:DeltaTab Name="DeltaTab" /> <!-- DeltaV --> <dtabs:DeltaTab Name="DeltaTab" /> <!-- DeltaV -->
</TabContainer> </TabContainer>
</DefaultWindow> </DefaultWindow>
@@ -21,7 +21,8 @@ namespace Content.Client.Options.UI
Tabs.SetTabTitle(3, Loc.GetString("ui-options-tab-audio")); Tabs.SetTabTitle(3, Loc.GetString("ui-options-tab-audio"));
Tabs.SetTabTitle(4, Loc.GetString("ui-options-tab-accessibility")); Tabs.SetTabTitle(4, Loc.GetString("ui-options-tab-accessibility"));
Tabs.SetTabTitle(5, Loc.GetString("ui-options-tab-admin")); Tabs.SetTabTitle(5, Loc.GetString("ui-options-tab-admin"));
Tabs.SetTabTitle(6, Loc.GetString("ui-options-tab-deltav")); // DeltaV specific settings Tabs.SetTabTitle(6, Loc.GetString("ui-options-tab-radio")); // DeltaV - Radio Channel Colors
Tabs.SetTabTitle(7, Loc.GetString("ui-options-tab-deltav")); // DeltaV specific settings
UpdateTabs(); UpdateTabs();
} }
@@ -36,6 +37,7 @@ namespace Content.Client.Options.UI
AccessibilityTab.Control.ReloadValues(); AccessibilityTab.Control.ReloadValues();
AudioTab.Control.ReloadValues(); AudioTab.Control.ReloadValues();
AdminOptionsTab.Control.ReloadValues(); AdminOptionsTab.Control.ReloadValues();
RadioTab.Control.ReloadValues(); // DeltaV - Radio Channel Colors
DeltaTab.Control.ReloadValues(); // DeltaV DeltaTab.Control.ReloadValues(); // DeltaV
} }
} }
@@ -7,6 +7,7 @@
<Label Text="{Loc 'ui-options-accessability-header-visuals'}" <Label Text="{Loc 'ui-options-accessability-header-visuals'}"
StyleClasses="LabelKeyText"/> StyleClasses="LabelKeyText"/>
<CheckBox Name="ReducedMotionCheckBox" Text="{Loc 'ui-options-reduced-motion'}" /> <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="EnableColorNameCheckBox" Text="{Loc 'ui-options-enable-color-name'}" />
<CheckBox Name="ColorblindFriendlyCheckBox" Text="{Loc 'ui-options-colorblind-friendly'}" /> <CheckBox Name="ColorblindFriendlyCheckBox" Text="{Loc 'ui-options-colorblind-friendly'}" />
<ui:OptionSlider Name="ScreenShakeIntensitySlider" Title="{Loc 'ui-options-screen-shake-intensity'}" /> <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 Content.Shared.CCVar;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
@@ -15,6 +16,7 @@ public sealed partial class AccessibilityTab : Control
Control.AddOptionCheckBox(CCVars.ChatEnableColorName, EnableColorNameCheckBox); Control.AddOptionCheckBox(CCVars.ChatEnableColorName, EnableColorNameCheckBox);
Control.AddOptionCheckBox(CCVars.AccessibilityColorblindFriendly, ColorblindFriendlyCheckBox); Control.AddOptionCheckBox(CCVars.AccessibilityColorblindFriendly, ColorblindFriendlyCheckBox);
Control.AddOptionCheckBox(CCVars.ReducedMotion, ReducedMotionCheckBox); Control.AddOptionCheckBox(CCVars.ReducedMotion, ReducedMotionCheckBox);
Control.AddOptionCheckBox(DCCVars.EsScreenshakeDisabled, DisableScreenshakeCheckBox); // DeltaV - ES Screenshake Port
Control.AddOptionPercentSlider(CCVars.ScreenShakeIntensity, ScreenShakeIntensitySlider); Control.AddOptionPercentSlider(CCVars.ScreenShakeIntensity, ScreenShakeIntensitySlider);
Control.AddOptionPercentSlider(CCVars.ChatWindowOpacity, ChatWindowOpacitySlider); Control.AddOptionPercentSlider(CCVars.ChatWindowOpacity, ChatWindowOpacitySlider);
Control.AddOptionPercentSlider(CCVars.SpeechBubbleTextOpacity, SpeechBubbleTextOpacitySlider); Control.AddOptionPercentSlider(CCVars.SpeechBubbleTextOpacity, SpeechBubbleTextOpacitySlider);
@@ -1,6 +1,5 @@
using System.Numerics; using System.Numerics;
using Content.Client.Stylesheets; using Content.Client.Stylesheets;
using Content.Shared._Goobstation.CCVar; // GoobStation
using Content.Shared.CCVar; using Content.Shared.CCVar;
using Content.Shared.Input; using Content.Shared.Input;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
@@ -244,20 +243,6 @@ namespace Content.Client.Options.UI.Tabs
AddButton(ContentKeyFunctions.NanoChatNavigateDownUnread); AddButton(ContentKeyFunctions.NanoChatNavigateDownUnread);
// DeltaV - End NanoChat keybinds // 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"); AddHeader("ui-options-header-misc");
AddButton(ContentKeyFunctions.TakeScreenshot); AddButton(ContentKeyFunctions.TakeScreenshot);
AddButton(ContentKeyFunctions.TakeScreenshotNoUI); AddButton(ContentKeyFunctions.TakeScreenshotNoUI);
@@ -20,6 +20,7 @@
<CheckBox Name="ShowLoocAboveHeadCheckBox" Text="{Loc 'ui-options-show-looc-on-head'}" /> <CheckBox Name="ShowLoocAboveHeadCheckBox" Text="{Loc 'ui-options-show-looc-on-head'}" />
<CheckBox Name="FancySpeechBubblesCheckBox" Text="{Loc 'ui-options-fancy-speech'}" /> <CheckBox Name="FancySpeechBubblesCheckBox" Text="{Loc 'ui-options-fancy-speech'}" />
<CheckBox Name="FancyNameBackgroundsCheckBox" Text="{Loc 'ui-options-fancy-name-background'}" /> <CheckBox Name="FancyNameBackgroundsCheckBox" Text="{Loc 'ui-options-fancy-name-background'}" />
<CheckBox Name="ChatFollowButton" Text="{Loc 'ui-options-chat-follow-button'}" />
<Label Text="{Loc 'ui-options-general-cursor'}" <Label Text="{Loc 'ui-options-general-cursor'}"
StyleClasses="LabelKeyText"/> StyleClasses="LabelKeyText"/>
<CheckBox Name="ShowHeldItemCheckBox" Text="{Loc 'ui-options-show-held-item'}" /> <CheckBox Name="ShowHeldItemCheckBox" Text="{Loc 'ui-options-show-held-item'}" />
@@ -63,6 +63,7 @@ public sealed partial class MiscTab : Control
Control.AddOptionCheckBox(CCVars.ChatEnableFancyBubbles, FancySpeechBubblesCheckBox); Control.AddOptionCheckBox(CCVars.ChatEnableFancyBubbles, FancySpeechBubblesCheckBox);
Control.AddOptionCheckBox(CCVars.ChatFancyNameBackground, FancyNameBackgroundsCheckBox); Control.AddOptionCheckBox(CCVars.ChatFancyNameBackground, FancyNameBackgroundsCheckBox);
Control.AddOptionCheckBox(CCVars.StaticStorageUI, StaticStorageUI); Control.AddOptionCheckBox(CCVars.StaticStorageUI, StaticStorageUI);
Control.AddOptionCheckBox(CCVars.InterfaceChatFollowButton, ChatFollowButton);
Control.Initialize(); Control.Initialize();
} }
@@ -1,4 +1,5 @@
using Content.Client.CartridgeLoader; using Content.Client.CartridgeLoader;
using Content.Shared._DV.Pager; // DeltaV - pagers
using Content.Shared.CartridgeLoader; using Content.Shared.CartridgeLoader;
using Content.Shared.Containers.ItemSlots; using Content.Shared.Containers.ItemSlots;
using Content.Shared.PDA; using Content.Shared.PDA;
@@ -72,6 +73,13 @@ namespace Content.Client.PDA
SendMessage(new PdaLockUplinkMessage()); SendMessage(new PdaLockUplinkMessage());
}; };
// Begin DeltaV - pagers
_menu.OnUnlinkDevicePressed += address =>
{
SendMessage(new PagerRemoveAddressMessage(address));
};
// End DeltaV - pagers
_menu.OnProgramItemPressed += ActivateCartridge; _menu.OnProgramItemPressed += ActivateCartridge;
_menu.OnInstallButtonPressed += InstallCartridge; _menu.OnInstallButtonPressed += InstallCartridge;
_menu.OnUninstallButtonPressed += UninstallCartridge; _menu.OnUninstallButtonPressed += UninstallCartridge;
@@ -100,6 +108,7 @@ namespace Content.Client.PDA
} }
_menu.UpdateState(updateState); _menu.UpdateState(updateState);
UpdateLinkedDevices(); // DeltaV - pagers
} }
protected override void AttachCartridgeUI(Control cartridgeUIFragment, string? title) protected override void AttachCartridgeUI(Control cartridgeUIFragment, string? title)
@@ -127,5 +136,13 @@ namespace Content.Client.PDA
{ {
return EntMan.GetComponentOrNull<PdaBorderColorComponent>(Owner); 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" Access="Public"
Text="{Loc 'comp-pda-ui-ringtone-button'}" Text="{Loc 'comp-pda-ui-ringtone-button'}"
Description="{Loc 'comp-pda-ui-ringtone-button-description'}"/> 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" <pda:PdaSettingsButton Name="ActivateMusicButton"
Access="Public" Access="Public"
Visible="False" Visible="False"
@@ -92,6 +98,13 @@
HorizontalExpand="True" HorizontalExpand="True"
Name="ProgramView" Name="ProgramView"
Access="Public"> Access="Public">
<!-- Begin DeltaV Additions: Pagers -->
<BoxContainer Orientation="Vertical"
VerticalExpand="True"
HorizontalExpand="True"
Name="LinkedDeviceList"
Visible="False"/>
<!-- End DeltaV Additions: Pagers -->
</BoxContainer> </BoxContainer>
</BoxContainer> </BoxContainer>
<BoxContainer Name="ContentFooter" HorizontalExpand="True" SetHeight="28" Margin="1 0 2 1"> <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); _clipboard.SetText(_currentDate);
}; };
LinkedDevicesButton.OnPressed += _ =>
{
LinkedDeviceList.Visible = true;
ToProgramView(Loc.GetString("comp-pda-ui-linked-devices-title"));
};
// End DeltaV additions // End DeltaV additions
@@ -300,6 +306,7 @@ namespace Content.Client.PDA
ProgramCloseButton.Visible = false; ProgramCloseButton.Visible = false;
ProgramListButton.Visible = true; ProgramListButton.Visible = true;
SettingsButton.Visible = true; SettingsButton.Visible = true;
LinkedDeviceList.Visible = false; // DeltaV - pagers
} }
/// <summary> /// <summary>
@@ -56,8 +56,8 @@ public partial class NavMapControl : MapGridControl
// Constants // Constants
protected float UpdateTime = 1.0f; protected float UpdateTime = 1.0f;
protected float MaxSelectableDistance = 10f; public float MaxSelectableDistance = 10f; // DeltaV - accessible to CrewMonitoringShuttleControl
protected float MinDragDistance = 5f; public float MinDragDistance = 5f; // DeltaV - accessible to CrewMonitoringShuttleControl
protected static float MinDisplayedRange = 8f; protected static float MinDisplayedRange = 8f;
protected static float MaxDisplayedRange = 128f; protected static float MaxDisplayedRange = 128f;
protected static float DefaultDisplayedRange = 48f; protected static float DefaultDisplayedRange = 48f;
@@ -193,6 +193,13 @@ public partial class NavMapControl : MapGridControl
_recenter.Disabled = false; _recenter.Disabled = false;
} }
// Begin DeltaV - we need access to that from outside
public void TrackEntity(NetEntity? entity)
{
TrackedEntitySelectedAction?.Invoke(entity);
}
// End DeltaV - we need access to that from outside
protected override void KeyBindUp(GUIBoundKeyEventArgs args) protected override void KeyBindUp(GUIBoundKeyEventArgs args)
{ {
base.KeyBindUp(args); base.KeyBindUp(args);
@@ -19,6 +19,7 @@ public sealed class SSDIndicatorSystem : EntitySystem
[Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IConfigurationManager _cfg = default!;
[Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly Shared.SSDIndicator.SSDIndicatorSystem _shared = default!; // DeltaV - SSD Recency, don't want to rename the upstream class
public override void Initialize() public override void Initialize()
{ {
@@ -35,13 +36,26 @@ public sealed class SSDIndicatorSystem : EntitySystem
!HasComp<ActiveNPCComponent>(uid) && !HasComp<ActiveNPCComponent>(uid) &&
HasComp<MindExaminableComponent>(uid)) HasComp<MindExaminableComponent>(uid))
{ {
// Begin DeltaV Addition // Begin DeltaV Additions
var ev = new ShowSSDIndicatorEvent(); var ev = new ShowSSDIndicatorEvent();
RaiseLocalEvent(uid, ref ev); RaiseLocalEvent(uid, ref ev);
if (ev.Hidden) if (ev.Hidden)
return; return;
// End DeltaV Addition
args.StatusIcons.Add(_prototype.Index(component.Icon)); // SSD Recency Indicator
var stage = _shared.GetStage(new Entity<SSDIndicatorComponent>(uid, component));
var icon = stage switch
{
SsdStage.VeryRecent => component.VeryRecentIcon,
SsdStage.Recent => component.RecentIcon,
SsdStage.Cryoable => component.Icon,
_ => throw new InvalidOperationException($"{ToPrettyString(uid)} has an invalid SSD stage {stage}."),
};
args.StatusIcons.Add(_prototype.Index(icon));
// End DeltaV Additions
// args.StatusIcons.Add(_prototype.Index(component.Icon)); // DeltaV - commented out. status icon now added above
} }
} }
} }
+6
View File
@@ -1,10 +1,12 @@
using System.Numerics; using System.Numerics;
using Content.Shared._DV.CCVars; // DeltaV - Enable Stars via CVar.
using Content.Shared.CombatMode; using Content.Shared.CombatMode;
using Content.Shared.Interaction; using Content.Shared.Interaction;
using Content.Shared.Stunnable; using Content.Shared.Stunnable;
using Robust.Client.Animations; using Robust.Client.Animations;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
using Robust.Shared.Animations; using Robust.Shared.Animations;
using Robust.Shared.Configuration; // DeltaV - Enable Stars via CVar.
using Robust.Shared.Input; using Robust.Shared.Input;
using Robust.Shared.Input.Binding; using Robust.Shared.Input.Binding;
using Robust.Shared.Random; using Robust.Shared.Random;
@@ -13,6 +15,7 @@ namespace Content.Client.Stunnable;
public sealed class StunSystem : SharedStunSystem 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 SharedCombatModeSystem _combat = default!;
[Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SpriteSystem _spriteSystem = 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; 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.LayerSetVisible((entity, entity.Comp), index, visible);
_spriteSystem.LayerSetRsiState((entity, entity.Comp), index, state); _spriteSystem.LayerSetRsiState((entity, entity.Comp), index, state);
} }
-165
View File
@@ -159,35 +159,6 @@ namespace Content.Client.Stylesheets
public static readonly Color ChatBackgroundColor = Color.FromHex("#25252ADD"); public static readonly Color ChatBackgroundColor = Color.FromHex("#25252ADD");
// DeltaV - AAC button variables
public static readonly string CommandButtonClass = "CommandButton";
public static readonly string EngineeringButtonClass = "EngineeringButton";
public static readonly string EpistemicsButtonClass = "EpistemicsButton";
public static readonly string JusticeButtonClass = "JusticeButton";
public static readonly string LogisticsButtonClass = "LogisticsButton";
public static readonly string MedicalButtonClass = "MedicalButton";
public static readonly string SecurityButtonClass = "SecurityButton";
public static readonly string ServiceButtonClass = "ServiceButton";
// DeltaV - AAC button colors
public static readonly Color CommandButtonColorDefault = Color.FromHex("#404A58");
public static readonly Color CommandColorHovered = Color.FromHex("#4F587B");
public static readonly Color EngineeringButtonColorDefault = Color.FromHex("#77684B");
public static readonly Color EngineeringColorHovered = Color.FromHex("#776D71");
public static readonly Color EpistemicsButtonColorDefault = Color.FromHex("#6F5973");
public static readonly Color EpistemicsColorHovered = Color.FromHex("#71638E");
public static readonly Color LogisticsButtonColorDefault = Color.FromHex("#61503A");
public static readonly Color LogisticsColorHovered = Color.FromHex("#675C64");
public static readonly Color JusticeButtonColorDefault = Color.FromHex("#4F3D4C");
public static readonly Color JusticeColorHovered = Color.FromHex("#5C4B5A");
public static readonly Color MedicalButtonColorDefault = Color.FromHex("#49687D");
public static readonly Color MedicalColorHovered = Color.FromHex("#556E95");
public static readonly Color SecurityButtonColorDefault = Color.FromHex("#724449");
public static readonly Color SecurityColorHovered = Color.FromHex("#745370");
public static readonly Color ServiceButtonColorDefault = Color.FromHex("#607952");
public static readonly Color ServiceColorHovered = Color.FromHex("#667A76");
// End DeltaV
public const string StyleClassCrewManifestGender = "CrewManifestGender"; //Delta-V - Manifest pronouns public const string StyleClassCrewManifestGender = "CrewManifestGender"; //Delta-V - Manifest pronouns
// i'm not sure what the missing symbols were referencing, and this is getting obseleted anyway so: // i'm not sure what the missing symbols were referencing, and this is getting obseleted anyway so:
@@ -1677,142 +1648,6 @@ namespace Content.Client.Stylesheets
BackgroundColor = FancyTreeSelectedRowColor, BackgroundColor = FancyTreeSelectedRowColor,
}), }),
// DeltaV - AAC button styles
Element<ContainerButton>()
.Class(CommandButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, CommandButtonColorDefault),
Element<ContainerButton>()
.Class(CommandButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, CommandColorHovered),
Element<ContainerButton>()
.Class(EngineeringButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, EngineeringButtonColorDefault),
Element<ContainerButton>()
.Class(EngineeringButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, EngineeringColorHovered),
Element<ContainerButton>()
.Class(EpistemicsButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, EpistemicsButtonColorDefault),
Element<ContainerButton>()
.Class(EpistemicsButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, EpistemicsColorHovered),
Element<ContainerButton>()
.Class(LogisticsButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, LogisticsButtonColorDefault),
Element<ContainerButton>()
.Class(LogisticsButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, LogisticsColorHovered),
Element<ContainerButton>()
.Class(MedicalButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, MedicalButtonColorDefault),
Element<ContainerButton>()
.Class(MedicalButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, MedicalColorHovered),
Element<ContainerButton>()
.Class(SecurityButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, SecurityButtonColorDefault),
Element<ContainerButton>()
.Class(SecurityButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, SecurityColorHovered),
Element<ContainerButton>()
.Class(ServiceButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, ServiceButtonColorDefault),
Element<ContainerButton>()
.Class(ServiceButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.Prop(Control.StylePropertyModulateSelf, ServiceColorHovered),
Element<ContainerButton>()
.Class(JusticeButtonClass)
.Pseudo(ContainerButton.StylePseudoClassNormal)
.Prop(Control.StylePropertyModulateSelf, JusticeButtonColorDefault),
Element<ContainerButton>()
.Class(JusticeButtonClass)
.Pseudo(ContainerButton.StylePseudoClassHover)
.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 // Silicon law edit ui
Element<Label>().Class(SiliconLawContainer.StyleClassSiliconLawPositionLabel) Element<Label>().Class(SiliconLawContainer.StyleClassSiliconLawPositionLabel)
.Prop(Label.StylePropertyFontColor, NanoGold), .Prop(Label.StylePropertyFontColor, NanoGold),
@@ -9,7 +9,6 @@
xmlns:hotbar="clr-namespace:Content.Client.UserInterface.Systems.Hotbar.Widgets" xmlns:hotbar="clr-namespace:Content.Client.UserInterface.Systems.Hotbar.Widgets"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:inventory="clr-namespace:Content.Client.UserInterface.Systems.Inventory.Widgets" xmlns:inventory="clr-namespace:Content.Client.UserInterface.Systems.Inventory.Widgets"
xmlns:targeting="clr-namespace:Content.Client._Shitmed.UserInterface.Systems.Targeting.Widgets"
Name="DefaultHud" Name="DefaultHud"
VerticalExpand="False" VerticalExpand="False"
VerticalAlignment="Bottom" VerticalAlignment="Bottom"
@@ -29,7 +28,6 @@
<widgets:GhostGui Name="Ghost" Access="Protected" /> <widgets:GhostGui Name="Ghost" Access="Protected" />
<inventory:InventoryGui Name="Inventory" Access="Protected" /> <inventory:InventoryGui Name="Inventory" Access="Protected" />
<hotbar:HotbarGui Name="Hotbar" Access="Protected" /> <hotbar:HotbarGui Name="Hotbar" Access="Protected" />
<targeting:TargetingControl Name="Targeting" Access="Protected"/> <!-- Shitmed Change -->
<chat:ResizableChatBox Name="Chat" Access="Protected" /> <chat:ResizableChatBox Name="Chat" Access="Protected" />
<alerts:AlertsUI Name="Alerts" Access="Protected" /> <alerts:AlertsUI Name="Alerts" Access="Protected" />
</screens:DefaultGameScreen> </screens:DefaultGameScreen>
@@ -22,12 +22,11 @@ public sealed partial class DefaultGameScreen : InGameScreen
SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5); SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5);
SetAnchorAndMarginPreset(Chat, LayoutPreset.TopRight, margin: 10); SetAnchorAndMarginPreset(Chat, LayoutPreset.TopRight, margin: 10);
SetAnchorAndMarginPreset(Alerts, LayoutPreset.TopRight, margin: 10); SetAnchorAndMarginPreset(Alerts, LayoutPreset.TopRight, margin: 10);
SetAnchorAndMarginPreset(Targeting, LayoutPreset.BottomRight, margin: 5); // Shitmed Change
Chat.OnResized += ChatOnResized; Chat.OnResized += ChatOnResized;
Chat.OnChatResizeFinish += ChatOnResizeFinish; Chat.OnChatResizeFinish += ChatOnResizeFinish;
MainViewport.OnResized += ResizeActionContainer; MainViewport.OnResized += ResizeActionContainer;
MainViewport.OnResized += ResizeAlertsContainer;
Inventory.OnResized += ResizeActionContainer; Inventory.OnResized += ResizeActionContainer;
} }
@@ -37,12 +36,6 @@ public sealed partial class DefaultGameScreen : InGameScreen
Actions.ActionsContainer.MaxGridHeight = MainViewport.Size.Y - indent; 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 _) private void ChatOnResizeFinish(Vector2 _)
{ {
var marginBottom = Chat.GetValue<float>(MarginBottomProperty); var marginBottom = Chat.GetValue<float>(MarginBottomProperty);
@@ -10,7 +10,6 @@
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client" xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:inventory="clr-namespace:Content.Client.UserInterface.Systems.Inventory.Widgets" xmlns:inventory="clr-namespace:Content.Client.UserInterface.Systems.Inventory.Widgets"
xmlns:targeting="clr-namespace:Content.Client._Shitmed.UserInterface.Systems.Targeting.Widgets"
Name="SeparatedChatHud" Name="SeparatedChatHud"
VerticalExpand="False" VerticalExpand="False"
VerticalAlignment="Bottom" VerticalAlignment="Bottom"
@@ -21,9 +20,8 @@
<widgets:GhostGui Name="Ghost" Access="Protected" /> <widgets:GhostGui Name="Ghost" Access="Protected" />
<inventory:InventoryGui Name="Inventory" Access="Protected"/> <inventory:InventoryGui Name="Inventory" Access="Protected"/>
<hotbar:HotbarGui Name="Hotbar" Access="Protected"/> <hotbar:HotbarGui Name="Hotbar" Access="Protected"/>
<targeting:TargetingControl Name="Targeting" Access="Protected"/> <!-- Shitmed Change --> <BoxContainer Name="TopLeftContainer" Orientation="Vertical">
<BoxContainer Name="TopLeftContainer" Orientation="Horizontal"> <!--goobstation--> <actions:ActionsBar Name="Actions" Access="Protected" />
<actions:ActionsBar Name="Actions" Access="Protected" />
<BoxContainer Name="VoteMenu" Access="Public" Orientation="Vertical"/> <BoxContainer Name="VoteMenu" Access="Public" Orientation="Vertical"/>
</BoxContainer> </BoxContainer>
<alerts:AlertsUI Name="Alerts" Access="Protected" /> <alerts:AlertsUI Name="Alerts" Access="Protected" />
@@ -27,8 +27,7 @@ public sealed partial class SeparatedChatGameScreen : InGameScreen
SetAnchorAndMarginPreset(Ghost, LayoutPreset.BottomWide, margin: 80); SetAnchorAndMarginPreset(Ghost, LayoutPreset.BottomWide, margin: 80);
SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5); SetAnchorAndMarginPreset(Hotbar, LayoutPreset.BottomWide, margin: 5);
SetAnchorAndMarginPreset(Alerts, LayoutPreset.CenterRight, margin: 10); SetAnchorAndMarginPreset(Alerts, LayoutPreset.CenterRight, margin: 10);
SetAnchorAndMarginPreset(Targeting, LayoutPreset.BottomRight, margin: 5);
ScreenContainer.OnSplitResizeFinished += () => ScreenContainer.OnSplitResizeFinished += () =>
OnChatResized?.Invoke(new Vector2(ScreenContainer.SplitFraction, 0)); OnChatResized?.Invoke(new Vector2(ScreenContainer.SplitFraction, 0));
@@ -1,13 +1,7 @@
<widgets:AlertsUI xmlns="https://spacestation14.io" <widgets:AlertsUI xmlns="https://spacestation14.io"
xmlns:widgets="clr-namespace:Content.Client.UserInterface.Systems.Alerts.Widgets" xmlns:widgets="clr-namespace:Content.Client.UserInterface.Systems.Alerts.Widgets"
xmlns:partStatus="clr-namespace:Content.Client._Shitmed.UserInterface.Systems.PartStatus.Widgets"
MinSize="64 64"> MinSize="64 64">
<!-- Shitmed Change Start - TODO: Refactor this godforsaken abomination --> <PanelContainer HorizontalAlignment="Right" VerticalAlignment="Top">
<GridContainer Columns="1" HorizontalAlignment="Right" VerticalAlignment="Top"> <BoxContainer Name="AlertContainer" Access="Public" Orientation="Vertical" />
<PanelContainer > </PanelContainer>
<GridContainer Name="AlertContainer" Columns="1" HorizontalAlignment="Right" VerticalAlignment="Center" Access="Public" />
</PanelContainer>
<partStatus:PartStatusControl Name="PartStatus" Access="Protected"/>
</GridContainer>
<!-- Shitmed Change End -->
</widgets:AlertsUI> </widgets:AlertsUI>
@@ -1,6 +1,7 @@
using System.Globalization; using System.Globalization;
using System.Linq; using System.Linq;
using System.Numerics; using System.Numerics;
using System.Text.RegularExpressions; // DeltaV - Client-Side Radio Channel Colors
using Content.Client.Administration.Managers; using Content.Client.Administration.Managers;
using Content.Client.Chat; using Content.Client.Chat;
using Content.Client.Chat.Managers; using Content.Client.Chat.Managers;
@@ -839,8 +840,38 @@ public sealed partial class ChatUIController : UIController
} }
} }
/// <summary>
/// DeltaV - Regex expression to match on the chat message text in order to replace it with another color.
/// </summary>
private static readonly Regex RadioChatColorRegex = new(@"color=#?([a-fA-F0-9]{8})", RegexOptions.Compiled);
/// <summary>
/// DeltaV - Replaces the channel color hex code in a message with the client-side hex color
/// overridden by <see cref="Content.Client._DV.Radio.RadioChannelColorSystem"/> .
/// </summary>
/// <param name="message">The message to find and replace the color hex code in.</param>
/// <param name="channelProtoId">The proto ID of the channel. Basically the replacement color.</param>
/// <returns>The message with the color hex code replaced, if it exists.</returns>
private string ReplaceRadioChannelColorFromServer(string message, string channelProtoId)
{
if (_prototypeManager.Resolve<RadioChannelPrototype>(channelProtoId, out var channel))
{
return RadioChatColorRegex.Replace(message, $"color={channel.Color.ToHex()}");
}
return message;
}
public void ProcessChatMessage(ChatMessage msg, bool speechBubble = true) public void ProcessChatMessage(ChatMessage msg, bool speechBubble = true)
{ {
// BEGIN DeltaV
// Needs to happen before ANY other color or pattern matching so that we don't screw up the other colors in the message.
if (msg.Channel == ChatChannel.Radio && msg.RadioChannelProtoId is { } channel)
{
msg.WrappedMessage = ReplaceRadioChannelColorFromServer(msg.WrappedMessage, channel);
}
// END DeltaV
// color the name unless it's something like "the old man" // color the name unless it's something like "the old man"
if ((msg.Channel == ChatChannel.Local || msg.Channel == ChatChannel.Whisper) && _chatNameColorsEnabled) if ((msg.Channel == ChatChannel.Local || msg.Channel == ChatChannel.Whisper) && _chatNameColorsEnabled)
{ {
@@ -280,7 +280,10 @@ public sealed partial class GunSystem : SharedGunSystem
if (!Timing.IsFirstTimePredicted || user == null || recoil == Vector2.Zero || recoilScalar == 0) if (!Timing.IsFirstTimePredicted || user == null || recoil == Vector2.Zero || recoilScalar == 0)
return; 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) protected override void Popup(string message, EntityUid? uid, EntityUid? user)
@@ -23,16 +23,20 @@ public sealed class AACBoundUserInterface : BoundUserInterface
protected override void Open() protected override void Open()
{ {
base.Open(); base.Open();
_window?.Close();
if (_window is { Disposed: false })
_window.Close();
_window = this.CreateWindow<AACWindow>(); _window = this.CreateWindow<AACWindow>();
_window.OnClose += Close;
_window.PhraseButtonPressed += OnPhraseButtonPressed; _window.PhraseButtonPressed += OnPhraseButtonPressed;
_window.Typing += OnTyping; _window.Typing += OnTyping;
_window.SubmitPressed += OnSubmit; _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() private void OnTyping()
@@ -46,4 +50,14 @@ public sealed class AACBoundUserInterface : BoundUserInterface
_typing ??= EntMan.System<TypingIndicatorSystem>(); _typing ??= EntMan.System<TypingIndicatorSystem>();
_typing?.ClientSubmittedChatText(); _typing?.ClientSubmittedChatText();
} }
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (state is not AACTabletBuiState msg)
return;
_window?.Update(msg);
}
} }
@@ -12,6 +12,19 @@ namespace Content.Client._DV.AACTablet.UI;
[CommonSheetlet] [CommonSheetlet]
public sealed class AACSheetlet<T> : Sheetlet<T> where T : PalettedStylesheet, IButtonConfig public sealed class AACSheetlet<T> : Sheetlet<T> where T : PalettedStylesheet, IButtonConfig
{ {
private static readonly (string StyleClass, Color Normal, Color Hover)[] SubjectButtonColors =
[
// Department colors
("CommandButton", Color.FromHex("#404A58"), Color.FromHex("#4F587B")),
("EngineeringButton", Color.FromHex("#77684B"), Color.FromHex("#776D71")),
("EpistemicsButton", Color.FromHex("#6F5973"), Color.FromHex("#71638E")),
("JusticeButton", Color.FromHex("#4F3D4C"), Color.FromHex("#5C4B5A")),
("LogisticsButton", Color.FromHex("#61503A"), Color.FromHex("#675C64")),
("MedicalButton", Color.FromHex("#49687D"), Color.FromHex("#556E95")),
("SecurityButton", Color.FromHex("#724449"), Color.FromHex("#745370")),
("ServiceButton", Color.FromHex("#607952"), Color.FromHex("#667A76")),
];
public override StyleRule[] GetRules(T sheet, object config) public override StyleRule[] GetRules(T sheet, object config)
{ {
// Create style boxes // Create style boxes
@@ -81,6 +94,21 @@ public sealed class AACSheetlet<T> : Sheetlet<T> where T : PalettedStylesheet, I
.Prop(Control.StylePropertyModulateSelf, Color.DarkRed), .Prop(Control.StylePropertyModulateSelf, Color.DarkRed),
]); ]);
SubjectColorRules(rules);
return rules.ToArray(); return rules.ToArray();
} }
// AAC - Makes sure colors are applied to subject buttons
private static void SubjectColorRules(List<StyleRule> rules)
{
foreach (var (styleClass, normal, hover) in SubjectButtonColors)
{
rules.AddRange([
E<ContainerButton>().Class(ContainerButton.StyleClassButton).Class(styleClass)
.PseudoNormal().Prop(Control.StylePropertyModulateSelf, normal),
E<ContainerButton>().Class(ContainerButton.StyleClassButton).Class(styleClass)
.PseudoHovered().Prop(Control.StylePropertyModulateSelf, hover),
]);
}
}
} }
@@ -18,7 +18,14 @@
StyleClasses="AacCheckbox" StyleClasses="AacCheckbox"
Margin="0 0 8 0"/> Margin="0 0 8 0"/>
<Control HorizontalExpand="True"/> <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 --> <!-- Buffer Display and Controls -->
<BoxContainer Orientation="Horizontal"> <BoxContainer Orientation="Horizontal">
@@ -29,7 +36,6 @@
StyleClasses="AacBufferText" StyleClasses="AacBufferText"
Margin="8 4"/> Margin="8 4"/>
</PanelContainer> </PanelContainer>
<Button Name="ClearButton" <Button Name="ClearButton"
Text="{Loc 'aac-tablet-backspace'}" Text="{Loc 'aac-tablet-backspace'}"
TextAlign="Center" TextAlign="Center"
@@ -2,6 +2,9 @@ using System.Linq;
using System.Numerics; using System.Numerics;
using Content.Client.UserInterface.Controls; using Content.Client.UserInterface.Controls;
using Content.Shared._DV.QuickPhrase; 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.AutoGenerated;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
@@ -16,7 +19,7 @@ public sealed partial class AACWindow : FancyWindow
[Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IPrototypeManager _prototype = default!;
private readonly List<QuickPhrasePrototype> _phrases; private readonly List<QuickPhrasePrototype> _phrases;
private readonly Dictionary<string, List<QuickPhrasePrototype>> _filteredPhrases = new(); 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? Typing;
public event Action? SubmitPressed; public event Action? SubmitPressed;
@@ -42,10 +45,16 @@ public sealed partial class AACWindow : FancyWindow
SearchBar.OnTextChanged += FilterSearch; SearchBar.OnTextChanged += FilterSearch;
SendButton.OnPressed += SendBuffer; SendButton.OnPressed += SendBuffer;
ClearButton.OnPressed += BackspaceBuffer; ClearButton.OnPressed += BackspaceBuffer;
RadioChannels.OnItemSelected += OnChannelSelected;
PopulateGui(); PopulateGui();
FilterSearch(null); FilterSearch(null);
} }
private void OnChannelSelected(OptionButton.ItemSelectedEventArgs args)
{
RadioChannels.SelectId(args.Id);
}
private void BackspaceBuffer(BaseButton.ButtonEventArgs obj) private void BackspaceBuffer(BaseButton.ButtonEventArgs obj)
{ {
if (_phraseBuffer.Count == 0) if (_phraseBuffer.Count == 0)
@@ -68,12 +77,14 @@ public sealed partial class AACWindow : FancyWindow
private void SendBuffer(BaseButton.ButtonEventArgs obj) private void SendBuffer(BaseButton.ButtonEventArgs obj)
{ {
PhraseButtonPressed?.Invoke(_phraseBuffer); PhraseButtonPressed?.Invoke(_phraseBuffer, Prefix);
_phraseBuffer.Clear(); _phraseBuffer.Clear();
BufferedString.Text = string.Empty; BufferedString.Text = string.Empty;
SubmitPressed?.Invoke(); SubmitPressed?.Invoke();
} }
private string Prefix => (string?)RadioChannels.SelectedMetadata ?? SharedChatSystem.LocalPrefix.ToString();
private void FilterSearch(LineEdit.LineEditEventArgs? obj) private void FilterSearch(LineEdit.LineEditEventArgs? obj)
{ {
SearchResults.RemoveAllChildren(); SearchResults.RemoveAllChildren();
@@ -82,7 +93,8 @@ public sealed partial class AACWindow : FancyWindow
var emptySearch = string.IsNullOrEmpty(SearchBar.Text); var emptySearch = string.IsNullOrEmpty(SearchBar.Text);
foreach (var phrase in _phrases) 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; continue;
} }
@@ -206,7 +218,7 @@ public sealed partial class AACWindow : FancyWindow
MaxSize = new Vector2(ButtonWidth, ButtonWidth), MaxSize = new Vector2(ButtonWidth, ButtonWidth),
ClipText = false, ClipText = false,
HorizontalExpand = true, HorizontalExpand = true,
StyleClasses = { styleClass } StyleClasses = { ContainerButton.StyleClassButton, styleClass }
}; };
var buttonLabel = new RichTextLabel var buttonLabel = new RichTextLabel
@@ -236,8 +248,24 @@ public sealed partial class AACWindow : FancyWindow
{ {
_phraseSingle.Clear(); _phraseSingle.Clear();
_phraseSingle.Add(phraseId); _phraseSingle.Add(phraseId);
PhraseButtonPressed?.Invoke(_phraseSingle); PhraseButtonPressed?.Invoke(_phraseSingle, Prefix);
SubmitPressed?.Invoke(); 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,
}
@@ -0,0 +1,180 @@
using System.Numerics;
using Content.Client.Pinpointer.UI;
using Content.Client.Shuttles.UI;
using Content.Shared.Shuttles.Components;
using Content.Shared.Shuttles.Systems;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
using Robust.Shared.Input;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
namespace Content.Client._DV.CrewMonitoring;
public sealed class CrewMonitoringShuttleControl : BaseShuttleControl
{
[Dependency] private readonly IMapManager _mapManager = default!;
private readonly SharedShuttleSystem _shuttles;
private readonly SharedTransformSystem _transform;
public EntityUid? Owner;
public NavMapControl? NavMap;
private List<Entity<MapGridComponent>> _grids = new();
public CrewMonitoringShuttleControl() : base(64f, 256f, 256f)
{
_shuttles = EntManager.System<SharedShuttleSystem>();
_transform = EntManager.System<SharedTransformSystem>();
}
protected override void Draw(DrawingHandleScreen handle)
{
base.Draw(handle);
DrawBacking(handle);
DrawCircles(handle);
if (Owner is not { } owner || NavMap is not { } navMap)
return;
var xformQuery = EntManager.GetEntityQuery<TransformComponent>();
var fixturesQuery = EntManager.GetEntityQuery<FixturesComponent>();
var bodyQuery = EntManager.GetEntityQuery<PhysicsComponent>();
var iffQuery = EntManager.GetEntityQuery<IFFComponent>();
if (!xformQuery.TryGetComponent(owner, out var xform)
|| xform.MapID == MapId.Nullspace)
{
return;
}
var coordinates = new EntityCoordinates(owner, Vector2.Zero);
var mapPos = _transform.ToMapCoordinates(coordinates);
var ourEntRot = Angle.Zero;
var ourEntMatrix = Matrix3Helpers.CreateTransform(_transform.GetWorldPosition(xform), ourEntRot);
Matrix3x2.Invert(ourEntMatrix, out var worldToShuttle);
var shuttleToView = Matrix3x2.CreateScale(new Vector2(MinimapScale, -MinimapScale)) * Matrix3x2.CreateTranslation(MidPointVector);
var worldToView = worldToShuttle * shuttleToView;
var viewBounds = new Box2Rotated(new Box2(-WorldRange, -WorldRange, WorldRange, WorldRange).Translated(mapPos.Position), ourEntRot, mapPos.Position);
var viewAABB = viewBounds.CalcBoundingBox();
_grids.Clear();
_mapManager.FindGridsIntersecting(xform.MapID, new Box2(mapPos.Position - MaxRadarRangeVector, mapPos.Position + MaxRadarRangeVector), ref _grids, approx: true, includeMap: false);
foreach (var grid in _grids)
{
if (!fixturesQuery.HasComponent(grid))
continue;
var body = bodyQuery.GetComponent(grid);
iffQuery.TryComp(grid, out var iff);
if (!_shuttles.CanDraw(grid, body, iff))
continue;
var curGridToWorld = _transform.GetWorldMatrix(grid);
var curGridToView = curGridToWorld * worldToShuttle * shuttleToView;
var gridAABB = curGridToWorld.TransformBox(grid.Comp.LocalAABB);
if (!gridAABB.Intersects(viewAABB))
continue;
var labelColor = _shuttles.GetIFFColor(grid, self: false, iff);
DrawGrid(handle, curGridToView, grid, labelColor);
}
var curTime = Timing.RealTime;
var blinkFrequency = 1f / 1f;
var lit = curTime.TotalSeconds % blinkFrequency > blinkFrequency / 2f;
var box = SizeBox;
foreach (var (coord, value) in navMap.TrackedCoordinates)
{
if (!lit || !value.Visible)
continue;
var blipPos = _transform.ToMapCoordinates(coord);
if (mapPos.MapId == MapId.Nullspace)
continue;
handle.DrawCircle(Vector2.Clamp(Vector2.Transform(blipPos.Position, worldToView), box.TopLeft, box.BottomRight), float.Sqrt(MinimapScale) * 2f, value.Color);
}
foreach (var blip in navMap.TrackedEntities.Values)
{
if (blip.Blinks && !lit)
continue;
var blipPos = _transform.ToMapCoordinates(blip.Coordinates);
if (mapPos.MapId == MapId.Nullspace)
continue;
handle.DrawCircle(Vector2.Clamp(Vector2.Transform(blipPos.Position, worldToView), box.TopLeft, box.BottomRight), float.Sqrt(MinimapScale) * 2f, blip.Color);
}
}
protected override void KeyBindUp(GUIBoundKeyEventArgs args)
{
base.KeyBindUp(args);
if (Owner is not { } owner || NavMap is null)
return;
if (!EntManager.TryGetComponent<TransformComponent>(owner, out var xform) || xform.MapID == MapId.Nullspace)
{
return;
}
var ourEntRot = Angle.Zero;
var ourEntMatrix = Matrix3Helpers.CreateTransform(_transform.GetWorldPosition(xform), ourEntRot);
Matrix3x2.Invert(ourEntMatrix, out var worldToShuttle);
var shuttleToView = Matrix3x2.CreateScale(new Vector2(MinimapScale, -MinimapScale)) * Matrix3x2.CreateTranslation(MidPointVector);
var worldToView = worldToShuttle * shuttleToView;
Matrix3x2.Invert(worldToView, out var viewToWorld);
if (args.Function == EngineKeyFunctions.UIClick)
{
if (NavMap.TrackedEntities.Count == 0)
return;
if ((StartDragPosition - args.PointerLocation.Position).Length() > NavMap.MinDragDistance)
return;
var localPosition = args.PointerLocation.Position - GlobalPixelPosition;
var worldPosition = Vector2.Transform(localPosition, viewToWorld);
var closestEntity = NetEntity.Invalid;
var closestDistance = float.PositiveInfinity;
foreach (var (currentEntity, blip) in NavMap.TrackedEntities)
{
if (!blip.Selectable)
continue;
var currentDistance = (_transform.ToMapCoordinates(blip.Coordinates).Position - worldPosition).Length();
if (closestDistance < currentDistance || currentDistance * MinimapScale > NavMap.MaxSelectableDistance)
continue;
closestEntity = currentEntity;
closestDistance = currentDistance;
}
if (closestDistance > NavMap.MaxSelectableDistance || !closestEntity.IsValid())
return;
NavMap.TrackEntity(closestEntity);
}
else if (args.Function == EngineKeyFunctions.UIRightClick)
{
NavMap.TrackEntity(null);
}
}
}
@@ -9,6 +9,7 @@
StyleClasses="LabelKeyText"/> StyleClasses="LabelKeyText"/>
<CheckBox Name="DisableFiltersCheckBox" Text="{Loc 'ui-options-no-filters'}" /> <CheckBox Name="DisableFiltersCheckBox" Text="{Loc 'ui-options-no-filters'}" />
<CheckBox Name="DisableGlimmerEffectCheckBox" Text="{Loc 'ui-options-disable-glimmer-effect'}" /> <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'}" <Label Text="{Loc 'ui-options-delta-tips'}"
StyleClasses="LabelKeyText"/> StyleClasses="LabelKeyText"/>
<CheckBox Name="DisableTipsCheckBox" Text="{Loc 'ui-options-delta-disable-tips'}" /> <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.NoVisionFilters, DisableFiltersCheckBox);
Control.AddOptionCheckBox(DCCVars.DisableGlimmerShader, DisableGlimmerEffectCheckBox); Control.AddOptionCheckBox(DCCVars.DisableGlimmerShader, DisableGlimmerEffectCheckBox);
Control.AddOptionCheckBox(DCCVars.ShowStunVisuals, EnableStunVisualsCheckBox);
Control.AddOptionCheckBox(DCCVars.DisableTips, DisableTipsCheckBox); Control.AddOptionCheckBox(DCCVars.DisableTips, DisableTipsCheckBox);
ResetTipsButton.OnPressed += _ => OnResetTipsPressed(); ResetTipsButton.OnPressed += _ => OnResetTipsPressed();
@@ -0,0 +1,87 @@
<tabs:RadioTab xmlns="https://spacestation14.io"
xmlns:tabs="clr-namespace:Content.Client._DV.Options.UI.Tabs"
xmlns:ui="clr-namespace:Content.Client.Options.UI">
<BoxContainer Orientation="Vertical">
<ScrollContainer VerticalExpand="True" HScrollEnabled="False">
<BoxContainer Orientation="Vertical" Margin="8">
<!-- Common -->
<Label Text="{Loc 'ui-options-radio-header-common'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioCommonColorSlider"
Example="{Loc 'ui-options-radio-example-common'}"/>
<Button Name="ResetCommonColorButton" Text="{Loc 'ui-options-radio-reset-common'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Command -->
<Label Text="{Loc 'ui-options-radio-header-command'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioCommandColorSlider"
Example="{Loc 'ui-options-radio-example-command'}"/>
<Button Name="ResetCommandColorButton" Text="{Loc 'ui-options-radio-reset-command'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Security -->
<Label Text="{Loc 'ui-options-radio-header-security'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioSecurityColorSlider"
Example="{Loc 'ui-options-radio-example-security'}"/>
<Button Name="ResetSecurityColorButton" Text="{Loc 'ui-options-radio-reset-security'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Medical -->
<Label Text="{Loc 'ui-options-radio-header-medical'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioMedicalColorSlider"
Example="{Loc 'ui-options-radio-example-medical'}"/>
<Button Name="ResetMedicalColorButton" Text="{Loc 'ui-options-radio-reset-medical'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Engineering -->
<Label Text="{Loc 'ui-options-radio-header-engineering'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioEngineeringColorSlider"
Example="{Loc 'ui-options-radio-example-engineering'}"/>
<Button Name="ResetEngineeringColorButton" Text="{Loc 'ui-options-radio-reset-engineering'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Science -->
<Label Text="{Loc 'ui-options-radio-header-science'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioScienceColorSlider"
Example="{Loc 'ui-options-radio-example-science'}"/>
<Button Name="ResetScienceColorButton" Text="{Loc 'ui-options-radio-reset-science'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Cargo -->
<Label Text="{Loc 'ui-options-radio-header-cargo'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioCargoColorSlider"
Example="{Loc 'ui-options-radio-example-cargo'}"/>
<Button Name="ResetCargoColorButton" Text="{Loc 'ui-options-radio-reset-cargo'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Service -->
<Label Text="{Loc 'ui-options-radio-header-service'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioServiceColorSlider"
Example="{Loc 'ui-options-radio-example-service'}"/>
<Button Name="ResetServiceColorButton" Text="{Loc 'ui-options-radio-reset-service'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- Binary -->
<Label Text="{Loc 'ui-options-radio-header-binary'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioBinaryColorSlider"
Example="{Loc 'ui-options-radio-example-binary'}"/>
<Button Name="ResetBinaryColorButton" Text="{Loc 'ui-options-radio-reset-binary'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- DeltaV - Justice -->
<Label Text="{Loc 'ui-options-radio-header-justice'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioJusticeColorSlider"
Example="{Loc 'ui-options-radio-example-justice'}"/>
<Button Name="ResetJusticeColorButton" Text="{Loc 'ui-options-radio-reset-justice'}" MaxWidth="300" Margin="0 4 0 0" />
<!-- DeltaV - Prison -->
<Label Text="{Loc 'ui-options-radio-header-prison'}"
StyleClasses="LabelKeyText"/>
<ui:OptionColorSlider Name="RadioPrisonColorSlider"
Example="{Loc 'ui-options-radio-example-prison'}"/>
<Button Name="ResetPrisonColorButton" Text="{Loc 'ui-options-radio-reset-prison'}" MaxWidth="300" Margin="0 4 0 0" />
</BoxContainer>
</ScrollContainer>
<ui:OptionsTabControlRow Name="Control" Access="Public" />
</BoxContainer>
</tabs:RadioTab>
@@ -0,0 +1,55 @@
using Content.Client.Options.UI;
using Content.Shared._DV.CCVars;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
namespace Content.Client._DV.Options.UI.Tabs;
[GenerateTypedNameReferences]
public sealed partial class RadioTab : Control
{
[Dependency] private readonly IConfigurationManager _config = default!; // DeltaV
public RadioTab()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
// Having so many color sliders on one page is a lot. We should only really try
// to have common/departmental channels here, or it just becomes WAAAAY too much.
Control.AddOptionColorSlider(DCCVars.RadioColorCommon, RadioCommonColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorCommand, RadioCommandColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorSecurity, RadioSecurityColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorMedical, RadioMedicalColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorEngineering, RadioEngineeringColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorScience, RadioScienceColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorCargo, RadioCargoColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorService, RadioServiceColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorBinary, RadioBinaryColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorJustice, RadioJusticeColorSlider);
Control.AddOptionColorSlider(DCCVars.RadioColorPrison, RadioPrisonColorSlider);
ResetCommonColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorCommon);
ResetCommandColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorCommand);
ResetSecurityColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorSecurity);
ResetMedicalColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorMedical);
ResetEngineeringColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorEngineering);
ResetScienceColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorScience);
ResetCargoColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorCargo);
ResetServiceColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorService);
ResetBinaryColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorBinary);
ResetJusticeColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorJustice);
ResetPrisonColorButton.OnPressed += _ => OnResetColorButton(DCCVars.RadioColorPrison);
Control.Initialize();
}
private void OnResetColorButton(CVarDef<string> cvar)
{
_config.SetCVar(cvar, cvar.DefaultValue);
Control.ReloadValues();
}
}
@@ -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,6 +0,0 @@
using Content.Shared._DV.Psionics.Systems.PsionicPowers;
namespace Content.Client._DV.Psionics.Systems.PsionicPowers;
// This does nothing here. The code is all in the shared/server version.
public sealed class FracturedFormPowerSystem : SharedFracturedFormPowerSystem;
@@ -0,0 +1,49 @@
using Content.Shared._DV.CCVars;
using Content.Shared.Radio;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
namespace Content.Client._DV.Radio;
public sealed partial class RadioChannelColorSystem : EntitySystem
{
[Dependency] private readonly IConfigurationManager _config = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
// Feels like there should be a better way to do this but I'd rather not add a client-side cvar ID or reference
// to a prototype in Content.Shared, since I don't want people thinking they can ever use it on the server-side.
private static readonly ProtoId<RadioChannelPrototype> CommonChannelProto = "Common";
private static readonly ProtoId<RadioChannelPrototype> CommandChannelProto = "Command";
private static readonly ProtoId<RadioChannelPrototype> SecurityChannelProto = "Security";
private static readonly ProtoId<RadioChannelPrototype> MedicalChannelProto = "Medical";
private static readonly ProtoId<RadioChannelPrototype> EngineeringChannelProto = "Engineering";
private static readonly ProtoId<RadioChannelPrototype> ScienceChannelProto = "Science";
private static readonly ProtoId<RadioChannelPrototype> CargoChannelProto = "Supply";
private static readonly ProtoId<RadioChannelPrototype> ServiceChannelProto = "Service";
private static readonly ProtoId<RadioChannelPrototype> BinaryChannelProto = "Binary";
private static readonly ProtoId<RadioChannelPrototype> JusticeChannelProto = "Justice";
private static readonly ProtoId<RadioChannelPrototype> PrisonChannelProto = "Prison";
public override void Initialize()
{
base.Initialize();
_config.OnValueChanged(DCCVars.RadioColorCommon, (value) => { SetChannelColor(CommonChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorCommand, (value) => { SetChannelColor(CommandChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorSecurity, (value) => { SetChannelColor(SecurityChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorMedical, (value) => { SetChannelColor(MedicalChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorEngineering, (value) => { SetChannelColor(EngineeringChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorScience, (value) => { SetChannelColor(ScienceChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorCargo, (value) => { SetChannelColor(CargoChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorService, (value) => { SetChannelColor(ServiceChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorBinary, (value) => { SetChannelColor(BinaryChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorJustice, (value) => { SetChannelColor(JusticeChannelProto, value); }, true);
_config.OnValueChanged(DCCVars.RadioColorPrison, (value) => { SetChannelColor(PrisonChannelProto, value); }, true);
}
private void SetChannelColor(ProtoId<RadioChannelPrototype> channel, string newColor)
{
if (Color.TryParse(newColor, out var color))
_proto.Index(channel).Color = color;
}
}
@@ -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);
}
}
}
@@ -0,0 +1,17 @@
using Content.Shared.Labels.Components;
namespace Content.Client._DV.Silicons;
public static class NameHelpers
{
extension(IEntityManager self)
{
public string PaperName(EntityUid paper)
{
if (self.TryGetComponent<LabelComponent>(paper, out var label) && label.CurrentLabel is { } labelText)
return labelText;
return self.GetComponent<MetaDataComponent>(paper).EntityName;
}
}
}
@@ -0,0 +1,144 @@
using System.IO;
using Content.Shared._DV.Silicons;
using Content.Shared.Fax;
using JetBrains.Annotations;
using Robust.Client.UserInterface;
using Robust.Shared.Containers;
namespace Content.Client._DV.Silicons;
[UsedImplicitly]
public sealed class StationAiFaxBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
{
[Dependency] private readonly IFileDialogManager _fileDialogManager = default!;
private StationAiFaxWindow? _window;
private List<StationAiFaxPageWindow> _windows = new();
private bool _dialogIsOpen;
protected override void Open()
{
base.Open();
_window = this.CreateWindow<StationAiFaxWindow>();
_window.FileButtonPressed += OnFileButtonPressed;
_window.BlankButtonPressed += OnBlankButtonPressed;
_window.OpenSendWindowPressed += OnOpenSendWindowPressed;
_window.ExaminePressed += OnExaminePressed;
_window.ShredPressed += OnShredPressed;
_window.DuplicatePressed += OnDuplicatePressed;
UpdateFaxes(EntMan.System<SharedContainerSystem>().EnsureContainer<Container>(Owner, StationAiFaxComponent.Container, out _));
}
private async void OnFileButtonPressed()
{
if (_dialogIsOpen)
return;
_dialogIsOpen = true;
var filters = new FileDialogFilters(new FileDialogFilters.Group("txt"));
await using var file = await _fileDialogManager.OpenFile(filters, FileAccess.Read);
_dialogIsOpen = false;
if (_window == null || _window.Disposed || file == null)
{
return;
}
using var reader = new StreamReader(file);
var firstLine = await reader.ReadLineAsync();
string? label = null;
var content = await reader.ReadToEndAsync();
if (firstLine is { })
{
if (firstLine.StartsWith('#'))
{
label = firstLine[1..].Trim();
}
else
{
content = firstLine + "\n" + content;
}
}
SendMessage(new FaxFileMessage(
label?[..Math.Min(label.Length, FaxFileMessageValidation.MaxLabelSize)],
content[..Math.Min(content.Length, FaxFileMessageValidation.MaxContentSize)],
false));
}
private void OnBlankButtonPressed()
{
SendMessage(new FaxFileMessage(null, string.Empty, false));
}
private void OnOpenSendWindowPressed(EntityUid entity)
{
var window = new StationAiFaxPageWindow(entity, EntMan);
_windows.Add(window);
window.RefreshButtonPressed += OnRefreshButtonPressed;
window.PeerSelected += OnPeerSelected;
window.SendButtonPressed += OnSendDocument;
if (UiSystem.TryGetUiState<FaxUiState>(Owner, UiKey, out var state))
{
window.UpdateState(state);
}
window.OpenCentered();
}
private void OnSendDocument(EntityUid entity)
{
SendMessage(new StationAiFaxSendMessage(EntMan.GetNetEntity(entity)));
}
private void OnExaminePressed(EntityUid entity)
{
SendPredictedMessage(new StationAiFaxExamineMessage(EntMan.GetNetEntity(entity)));
}
private void OnShredPressed(EntityUid entity)
{
SendPredictedMessage(new StationAiFaxShredMessage(EntMan.GetNetEntity(entity)));
}
private void OnDuplicatePressed(EntityUid entity)
{
SendPredictedMessage(new StationAiFaxDuplicateMessage(EntMan.GetNetEntity(entity)));
}
private void OnRefreshButtonPressed()
{
SendMessage(new FaxRefreshMessage());
}
private void OnPeerSelected(string address)
{
SendMessage(new FaxDestinationMessage(address));
}
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (state is not FaxUiState cast)
return;
_window?.UpdateState(cast);
foreach (var window in _windows)
{
window.UpdateState(cast);
}
}
public void UpdateFaxes(Container container)
{
_window?.UpdateFaxes(container);
}
}
@@ -0,0 +1,14 @@
<PanelContainer xmlns="https://spacestation14.io"
xmlns:ui="clr-namespace:Content.Client._DV.UserInterfaces"
xmlns:xe="clr-namespace:Content.Client.UserInterface.XamlExtensions"
StyleClasses="PanelLight"
HorizontalExpand="True">
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" Margin="8">
<Label Name="PaperName" HorizontalExpand="True" />
<ui:IconButton Name="Shred" StyleClasses="OpenRight" Icon="{xe:Tex '/Textures/Interface/shredder.svg.192dpi.png'}" />
<ui:IconButton Name="Duplicate" StyleClasses="OpenBoth" Icon="{xe:Tex '/Textures/Interface/files.svg.192dpi.png'}" />
<ui:IconButton Name="Examine" StyleClasses="OpenBoth" Icon="{xe:Tex '/Textures/Interface/eye.svg.192dpi.png'}" />
<ui:IconButton Name="Send" StyleClasses="OpenLeft" Icon="{xe:Tex '/Textures/Interface/send.svg.192dpi.png'}" />
</BoxContainer>
</PanelContainer>
@@ -0,0 +1,27 @@
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._DV.Silicons;
[GenerateTypedNameReferences]
public sealed partial class StationAiFaxItem : PanelContainer
{
public string? Text { get => PaperName.Text; set => PaperName.Text = value; }
public bool CanSend { get => !Duplicate.Disabled; set => Duplicate.Disabled = !value; }
public event Action? ShredPressed;
public event Action? DuplicatePressed;
public event Action? ExaminePressed;
public event Action? SendPressed;
public StationAiFaxItem()
{
RobustXamlLoader.Load(this);
Shred.OnPressed += _ => ShredPressed?.Invoke();
Duplicate.OnPressed += _ => DuplicatePressed?.Invoke();
Examine.OnPressed += _ => ExaminePressed?.Invoke();
Send.OnPressed += _ => SendPressed?.Invoke();
}
}
@@ -0,0 +1,64 @@
<controls:FancyWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'fax-machine-ui-page-window'}"
MinSize="380 220">
<BoxContainer Orientation="Vertical" HorizontalExpand="True" VerticalExpand="True">
<PanelContainer StyleClasses="PanelDark" HorizontalExpand="True" VerticalExpand="True">
<BoxContainer Orientation="Vertical" Margin="8">
<BoxContainer Orientation="Horizontal">
<Label Text="{Loc 'fax-machine-ui-sending'}"
VerticalAlignment="Bottom"
HorizontalExpand="True" />
<Label Name="SendingLabel"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Align="Right"/>
</BoxContainer>
<BoxContainer Orientation="Horizontal">
<Label Text="{Loc 'fax-machine-ui-from'}"
VerticalAlignment="Bottom"
HorizontalExpand="True" />
<Label Name="FromLabel"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Align="Right"/>
</BoxContainer>
<BoxContainer
Orientation="Horizontal">
<Label Text="{Loc 'fax-machine-ui-to'}"
VerticalAlignment="Bottom"
HorizontalExpand="True"/>
<BoxContainer Orientation="Horizontal">
<OptionButton Name="PeerSelector"
StyleClasses="OpenRight" />
<Button StyleClasses="OpenLeft"
Name="RefreshButton"
ToolTip="{Loc 'fax-machine-ui-refresh-button'}">
<TextureButton
MouseFilter="Ignore"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Scale="0.9 0.9"
StyleClasses="RefreshButton" />
</Button>
</BoxContainer>
</BoxContainer>
</BoxContainer>
</PanelContainer>
<BoxContainer Orientation="Horizontal" SeparationOverride="8" Margin="8">
<Button Name="SendButton"
Text="{Loc 'fax-machine-ui-send-button'}"
HorizontalExpand="True"
Disabled="True" />
</BoxContainer>
</BoxContainer>
</controls:FancyWindow>
@@ -0,0 +1,70 @@
using System.Linq;
using Content.Client.UserInterface.Controls;
using Content.Shared.Fax;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._DV.Silicons;
[GenerateTypedNameReferences]
public sealed partial class StationAiFaxPageWindow : FancyWindow
{
public event Action? RefreshButtonPressed;
public event Action<string>? PeerSelected;
public event Action<EntityUid>? SendButtonPressed;
public StationAiFaxPageWindow(EntityUid uid, IEntityManager entityManager)
{
RobustXamlLoader.Load(this);
SendingLabel.Text = entityManager.PaperName(uid);
RefreshButton.OnPressed += _ => RefreshButtonPressed?.Invoke();
SendButton.OnPressed += _ => SendButtonPressed?.Invoke(uid);
PeerSelector.OnItemSelected += args =>
PeerSelected?.Invoke((string) args.Button.GetItemMetadata(args.Id)!);
}
public void UpdateState(FaxUiState state)
{
SendButton.Disabled = !state.CanSendCooldown;
FromLabel.Text = state.DeviceName;
if (state.AvailablePeers.Count == 0)
{
PeerSelector.AddItem(Loc.GetString("fax-machine-ui-no-peers"));
PeerSelector.Disabled = true;
}
if (PeerSelector.Disabled && state.AvailablePeers.Count != 0)
{
PeerSelector.Clear();
PeerSelector.Disabled = false;
}
// always must be selected destination
if (string.IsNullOrEmpty(state.DestinationAddress) && state.AvailablePeers.Count != 0)
{
PeerSelected?.Invoke(state.AvailablePeers.First().Key);
return;
}
if (state.AvailablePeers.Count != 0)
{
PeerSelector.Clear();
foreach (var (address, name) in state.AvailablePeers)
{
var id = AddPeerSelect(name, address);
if (address == state.DestinationAddress)
PeerSelector.Select(id);
}
}
}
private int AddPeerSelect(string name, string address)
{
PeerSelector.AddItem(name);
PeerSelector.SetItemMetadata(PeerSelector.ItemCount - 1, address);
return PeerSelector.ItemCount - 1;
}
}
@@ -0,0 +1,37 @@
using Content.Shared._DV.Silicons;
using Content.Shared.Fax;
using Robust.Client.GameObjects;
using Robust.Shared.Containers;
namespace Content.Client._DV.Silicons;
public sealed class StationAiFaxSystem : SharedStationAiFaxSystem
{
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<StationAiFaxComponent, EntRemovedFromContainerMessage>(OnRemoved);
}
protected override void OnInserted(Entity<StationAiFaxComponent> ent, ref EntInsertedIntoContainerMessage args)
{
base.OnInserted(ent, ref args);
if (!_userInterface.TryGetOpenUi<StationAiFaxBoundUserInterface>(ent.Owner, FaxUiKey.Key, out var bui))
return;
bui.UpdateFaxes(_container.EnsureContainer<Container>(ent, StationAiFaxComponent.Container, out _));
}
private void OnRemoved(Entity<StationAiFaxComponent> ent, ref EntRemovedFromContainerMessage args)
{
if (!_userInterface.TryGetOpenUi<StationAiFaxBoundUserInterface>(ent.Owner, FaxUiKey.Key, out var bui))
return;
bui.UpdateFaxes(_container.EnsureContainer<Container>(ent, StationAiFaxComponent.Container, out _));
}
}
@@ -0,0 +1,29 @@
<controls:FancyWindow
xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'fax-machine-ui-window'}"
MinSize="500 600">
<BoxContainer Orientation="Vertical" Name="NoFaxes" HorizontalAlignment="Center" VerticalAlignment="Center" SeparationOverride="8">
<Label StyleClasses="PlaceholderText" Text="{Loc 'fax-machine-ui-no-faxes'}" Align="Center" />
<BoxContainer Orientation="Vertical" HorizontalAlignment="Center">
<Button Name="NoFaxesBlank" Text="{Loc 'fax-machine-ui-add-blank-file'}" HorizontalExpand="True" StyleClasses="OpenLeft" />
<Button Name="NoFaxesUpload" Text="{Loc 'fax-machine-ui-upload-file'}" HorizontalExpand="True" StyleClasses="OpenRight" />
</BoxContainer>
</BoxContainer>
<BoxContainer Orientation="Vertical" Name="YesFaxes" HorizontalExpand="True" VerticalExpand="True">
<PanelContainer StyleClasses="PanelDark" VerticalExpand="True" HorizontalExpand="True">
<ScrollContainer VerticalExpand="True" HorizontalExpand="True">
<BoxContainer Name="FaxList" Margin="8" VerticalAlignment="Top" HorizontalExpand="True" SeparationOverride="8" Orientation="Vertical" />
</ScrollContainer>
</PanelContainer>
<BoxContainer Orientation="Horizontal" SeparationOverride="8" Margin="8">
<Button Name="YesFaxesBlank" Text="{Loc 'fax-machine-ui-add-blank-file'}" HorizontalAlignment="Center" />
<Button Name="YesFaxesUpload" Text="{Loc 'fax-machine-ui-upload-file'}" HorizontalAlignment="Center" />
</BoxContainer>
</BoxContainer>
</controls:FancyWindow>
@@ -0,0 +1,92 @@
using Content.Client.UserInterface.Controls;
using Content.Shared.Fax;
using Content.Shared.Labels.Components;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._DV.Silicons;
[GenerateTypedNameReferences]
public sealed partial class StationAiFaxWindow : FancyWindow
{
[Dependency] private readonly IEntityManager _entityManager = default!;
public event Action? BlankButtonPressed;
public event Action? FileButtonPressed;
public event Action<EntityUid>? OpenSendWindowPressed;
public event Action<EntityUid>? ExaminePressed;
public event Action<EntityUid>? ShredPressed;
public event Action<EntityUid>? DuplicatePressed;
public bool CanSend
{
get;
set
{
if (field == value)
return;
field = value;
foreach (var item in FaxList.Children)
{
var castItem = (StationAiFaxItem)item;
castItem.CanSend = value;
}
NoFaxesBlank.Disabled = !value;
NoFaxesUpload.Disabled = !value;
YesFaxesBlank.Disabled = !value;
YesFaxesUpload.Disabled = !value;
}
}
public StationAiFaxWindow()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
NoFaxesBlank.OnPressed += _ => BlankButtonPressed?.Invoke();
NoFaxesUpload.OnPressed += _ => FileButtonPressed?.Invoke();
YesFaxesBlank.OnPressed += _ => BlankButtonPressed?.Invoke();
YesFaxesUpload.OnPressed += _ => FileButtonPressed?.Invoke();
}
public void UpdateFaxes(Robust.Shared.Containers.Container container)
{
FaxList.RemoveAllChildren();
foreach (var item in container.ContainedEntities)
{
var page = new StationAiFaxItem
{
Text = _entityManager.TryGetComponent<LabelComponent>(item, out var label) &&
label.CurrentLabel is { } labelText
? labelText
: _entityManager.GetComponent<MetaDataComponent>(item).EntityName,
CanSend = CanSend,
};
FaxList.AddChild(page);
page.ExaminePressed += () => ExaminePressed?.Invoke(item);
page.ShredPressed += () => ShredPressed?.Invoke(item);
page.DuplicatePressed += () => DuplicatePressed?.Invoke(item);
page.SendPressed += () => OpenSendWindowPressed?.Invoke(item);
}
if (container.ContainedEntities.Count == 0)
{
YesFaxes.Visible = false;
NoFaxes.Visible = true;
}
else
{
YesFaxes.Visible = true;
NoFaxes.Visible = false;
}
}
public void UpdateState(FaxUiState state)
{
CanSend = state.CanSendCooldown;
}
}
@@ -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);
}
}
}
@@ -108,6 +108,70 @@ public sealed partial class TraitCategory : BoxContainer
{ {
CategoryPointsLabel.Visible = false; CategoryPointsLabel.Visible = false;
} }
// Lock unselected entries whenever the category cap is reached so the
// player gets a clear visual cue instead of silently failing to equip.
UpdateCategoryFullState();
}
/// <summary>
/// Propagates category-cap lock state to every entry.
/// <para>
/// Selected entries are never locked - they are the traits filling the cap
/// and must stay interactive so the player can deselect them.
/// </para>
/// <para>
/// Unselected entries are locked when:
/// <list type="bullet">
/// <item><see cref="TraitCategoryPrototype.MaxTraits"/> is defined and already reached, OR</item>
/// <item><see cref="TraitCategoryPrototype.MaxPoints"/> is defined and this specific
/// trait's cost would push spending over the limit.</item>
/// </list>
/// </para>
/// </summary>
private void UpdateCategoryFullState()
{
var traitCapReached = _category.MaxTraits.HasValue && SelectedCount >= _category.MaxTraits.Value;
foreach (var (_, entry) in _traitEntries)
{
if (entry.IsSelected)
{
// Selected traits are never locked by category state.
entry.SetLockedByCategory(false);
continue;
}
var locked = traitCapReached;
// Even when the trait count cap hasn't been hit, lock this specific entry
// if adding its cost would exceed the category's point budget.
if (!locked && _category.MaxPoints.HasValue)
locked = PointsSpent + entry.TraitCost > _category.MaxPoints.Value;
entry.SetLockedByCategory(locked);
}
}
/// <summary>
/// Called by <see cref="TraitsTab"/> whenever the player's global point budget changes.
/// Locks any unselected entry whose cost the player can no longer afford.
/// <para>
/// Free (0-cost) and negative-cost traits are never locked - they cost nothing or
/// actually give points back. Selected traits are also never locked here; they
/// were affordable when picked and must stay interactive to be deselected.
/// </para>
/// </summary>
public void UpdateGlobalPointsLock(int remainingPoints)
{
foreach (var (_, entry) in _traitEntries)
{
// A selected trait is always unlocked here - same reasoning as category cap:
// it was paid for at selection time and must stay interactive.
// Traits that cost nothing or give points back are never locked by budget.
var shouldLock = !entry.IsSelected && entry.TraitCost > remainingPoints;
entry.SetLockedByPoints(shouldLock);
}
} }
public void SetTraitSelected(ProtoId<TraitPrototype> traitId, bool selected) public void SetTraitSelected(ProtoId<TraitPrototype> traitId, bool selected)
@@ -171,11 +235,11 @@ public sealed partial class TraitCategory : BoxContainer
/// Updates condition states for all trait entries based on current job/species. /// Updates condition states for all trait entries based on current job/species.
/// Traits that don't meet conditions are disabled but still visible. /// Traits that don't meet conditions are disabled but still visible.
/// </summary> /// </summary>
public void UpdateConditions(ProtoId<JobPrototype>? jobId, ProtoId<SpeciesPrototype>? speciesId, IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences) public void UpdateConditions(ProtoId<JobPrototype>? jobId, ProtoId<SpeciesPrototype>? speciesId, IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences, IReadOnlySet<ProtoId<TraitPrototype>>? selectedTraits)
{ {
foreach (var (_, entry) in _traitEntries) foreach (var (_, entry) in _traitEntries)
{ {
entry.UpdateConditionsMet(jobId, speciesId, antagPreferences); entry.UpdateConditionsMet(jobId, speciesId, antagPreferences, selectedTraits);
} }
// Update stats since some traits may have been deselected // Update stats since some traits may have been deselected
+160 -39
View File
@@ -27,6 +27,9 @@ public sealed partial class TraitEntry : PanelContainer
private bool _isUpdating; private bool _isUpdating;
private readonly List<string> _failedConditionTooltips = new(); private readonly List<string> _failedConditionTooltips = new();
private bool _isLockedByCategory;
private bool _isLockedByPoints;
public TraitEntry(TraitPrototype trait) public TraitEntry(TraitPrototype trait)
{ {
RobustXamlLoader.Load(this); RobustXamlLoader.Load(this);
@@ -59,9 +62,17 @@ public sealed partial class TraitEntry : PanelContainer
foreach (var condition in _trait.Conditions) foreach (var condition in _trait.Conditions)
{ {
var tooltip = condition.GetTooltip(_prototype, _loc); if (condition is TraitDependencyCondition depCond)
if (!string.IsNullOrEmpty(tooltip)) {
tooltips.Add(tooltip); // Use GetTooltips() to get individual lines without duplication
tooltips.AddRange(depCond.GetTooltips(_prototype, _loc));
}
else
{
var tooltip = condition.GetTooltip(_prototype, _loc);
if (!string.IsNullOrEmpty(tooltip))
tooltips.Add(tooltip);
}
} }
if (tooltips.Count > 0) if (tooltips.Count > 0)
@@ -91,39 +102,92 @@ public sealed partial class TraitEntry : PanelContainer
/// <summary> /// <summary>
/// Updates whether conditions are met based on current job/species. /// Updates whether conditions are met based on current job/species.
/// </summary> /// </summary>
public void UpdateConditionsMet(ProtoId<JobPrototype>? jobId, ProtoId<SpeciesPrototype>? speciesId, IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences) public void UpdateConditionsMet(
ProtoId<JobPrototype>? jobId,
ProtoId<SpeciesPrototype>? speciesId,
IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences,
IReadOnlySet<ProtoId<TraitPrototype>>? selectedTraits)
{ {
_failedConditionTooltips.Clear(); _failedConditionTooltips.Clear();
MeetsConditions = true; MeetsConditions = true;
foreach (var condition in _trait.Conditions) foreach (var condition in _trait.Conditions)
{ {
var result = condition switch bool result;
{
IsSpeciesCondition speciesCond => CheckSpeciesCondition(speciesCond, speciesId),
HasJobCondition jobCond => CheckJobCondition(jobCond, jobId),
InDepartmentCondition deptCond => CheckDepartmentCondition(deptCond, jobId),
HasCompCondition compCond => !compCond.Invert, // can't check in lobby but screws with the inversion logic
IsAntagEligibleCondition antagEligibleCond => CheckAntagEligibleCondition(antagEligibleCond, antagPreferences),
AnyOfCondition anyOfCond => CheckAnyOfCondition(anyOfCond, jobId, speciesId, antagPreferences),
_ => true,
};
// Apply inversion if (condition is TraitDependencyCondition depCond)
result ^= condition.Invert; {
result = CheckDependencyCondition(depCond, selectedTraits);
// CheckDependencyCondition adds its own tooltips directly
}
else
{
result = condition switch
{
IsSpeciesCondition speciesCond => CheckSpeciesCondition(speciesCond, speciesId),
HasJobCondition jobCond => CheckJobCondition(jobCond, jobId),
InDepartmentCondition deptCond => CheckDepartmentCondition(deptCond, jobId),
HasCompCondition compCond => !compCond.Invert, // can't check in lobby
IsAntagEligibleCondition antagEligibleCond => CheckAntagEligibleCondition(antagEligibleCond, antagPreferences),
AnyOfCondition anyOfCond => CheckAnyOfCondition(anyOfCond, jobId, speciesId, antagPreferences, selectedTraits),
_ => true,
};
// Apply inversion for non-dependency conditions
result ^= condition.Invert;
if (!result)
{
var tooltip = condition.GetTooltip(_prototype, _loc);
if (!string.IsNullOrEmpty(tooltip))
_failedConditionTooltips.Add(tooltip);
}
}
if (!result) if (!result)
{
MeetsConditions = false; MeetsConditions = false;
var tooltip = condition.GetTooltip(_prototype, _loc);
if (!string.IsNullOrEmpty(tooltip))
_failedConditionTooltips.Add(tooltip);
}
} }
UpdateDisabledState(); UpdateDisabledState();
} }
/// <summary>
/// Checks a TraitDependencyCondition and adds failure tooltips directly.
/// Returns true if the condition passes.
/// </summary>
private bool CheckDependencyCondition(TraitDependencyCondition condition, IReadOnlySet<ProtoId<TraitPrototype>>? selectedTraits)
{
var passed = true;
foreach (var conflict in condition.Conflicts)
{
if (selectedTraits == null || !selectedTraits.Contains(conflict))
continue;
if (_prototype.TryIndex(conflict, out var conflictProto))
{
_failedConditionTooltips.Add(_loc.GetString("trait-condition-trait-conflict",
("trait", _loc.GetString(conflictProto.Name))));
}
passed = false;
}
foreach (var required in condition.Requires)
{
if (selectedTraits != null && selectedTraits.Contains(required))
continue;
if (_prototype.TryIndex(required, out var requiredProto))
{
_failedConditionTooltips.Add(_loc.GetString("trait-condition-trait-required",
("trait", _loc.GetString(requiredProto.Name))));
}
passed = false;
}
return passed;
}
private bool CheckSpeciesCondition(IsSpeciesCondition condition, ProtoId<SpeciesPrototype>? speciesId) private bool CheckSpeciesCondition(IsSpeciesCondition condition, ProtoId<SpeciesPrototype>? speciesId)
{ {
if (!_prototype.TryIndex(speciesId, out var species)) if (!_prototype.TryIndex(speciesId, out var species))
@@ -159,7 +223,12 @@ public sealed partial class TraitEntry : PanelContainer
return antagPreferences.Contains(condition.Antag); return antagPreferences.Contains(condition.Antag);
} }
private bool CheckAnyOfCondition(AnyOfCondition condition, ProtoId<JobPrototype>? jobId, ProtoId<SpeciesPrototype>? speciesId, IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences) private bool CheckAnyOfCondition(
AnyOfCondition condition,
ProtoId<JobPrototype>? jobId,
ProtoId<SpeciesPrototype>? speciesId,
IReadOnlySet<ProtoId<AntagPrototype>>? antagPreferences,
IReadOnlySet<ProtoId<TraitPrototype>>? selectedTraits)
{ {
if (condition.Conditions.Count == 0) if (condition.Conditions.Count == 0)
return false; return false;
@@ -167,19 +236,27 @@ public sealed partial class TraitEntry : PanelContainer
// Return true if ANY child condition evaluates to true // Return true if ANY child condition evaluates to true
foreach (var childCondition in condition.Conditions) foreach (var childCondition in condition.Conditions)
{ {
var result = childCondition switch bool result;
{
IsSpeciesCondition speciesCond => CheckSpeciesCondition(speciesCond, speciesId),
HasJobCondition jobCond => CheckJobCondition(jobCond, jobId),
InDepartmentCondition deptCond => CheckDepartmentCondition(deptCond, jobId),
HasCompCondition compCond => !compCond.Invert, // can't check in lobby
AnyOfCondition nestedAnyOf => CheckAnyOfCondition(nestedAnyOf, jobId, speciesId, antagPreferences), // Recursive!
IsAntagEligibleCondition antagEligibleCond => CheckAntagEligibleCondition(antagEligibleCond, antagPreferences),
_ => true,
};
// Apply child's inversion if (childCondition is TraitDependencyCondition depCond)
result ^= childCondition.Invert; {
result = CheckDependencyCondition(depCond, selectedTraits);
}
else
{
result = childCondition switch
{
IsSpeciesCondition speciesCond => CheckSpeciesCondition(speciesCond, speciesId),
HasJobCondition jobCond => CheckJobCondition(jobCond, jobId),
InDepartmentCondition deptCond => CheckDepartmentCondition(deptCond, jobId),
HasCompCondition compCond => !compCond.Invert, // can't check in lobby
IsAntagEligibleCondition antagEligibleCond => CheckAntagEligibleCondition(antagEligibleCond, antagPreferences),
AnyOfCondition nestedAnyOf => CheckAnyOfCondition(nestedAnyOf, jobId, speciesId, antagPreferences, selectedTraits),
_ => true,
};
result ^= childCondition.Invert;
}
// If any child passes, the AnyOf passes // If any child passes, the AnyOf passes
if (result) if (result)
@@ -190,16 +267,50 @@ public sealed partial class TraitEntry : PanelContainer
return false; return false;
} }
/// <summary>
/// Called by <see cref="TraitCategory"/> whenever the category's trait or
/// points-cap state changes. Locking only applies to <em>unselected</em>
/// entries - the selected traits are the ones filling the cap and must
/// remain interactive so the player can deselect them.
/// </summary>
public void SetLockedByCategory(bool locked)
{
if (_isLockedByCategory == locked)
return;
_isLockedByCategory = locked;
UpdateDisabledState();
}
/// <summary>
/// Called by <see cref="TraitCategory"/> whenever the player's global point budget
/// changes. Locks unselected entries whose cost the player can no longer afford.
/// Free (0-cost) and negative-cost traits are never locked by this.
/// </summary>
public void SetLockedByPoints(bool locked)
{
if (_isLockedByPoints == locked)
return;
_isLockedByPoints = locked;
UpdateDisabledState();
}
private void UpdateDisabledState() private void UpdateDisabledState()
{ {
if (!MeetsConditions) var isSelected = TraitCheckbox.Pressed;
var conditionLocked = !MeetsConditions;
var categoryLocked = _isLockedByCategory && !isSelected;
var pointsLocked = _isLockedByPoints && !isSelected;
var isDisabled = conditionLocked || categoryLocked || pointsLocked;
if (isDisabled)
{ {
// Hide checkbox, show lock icon // Hide checkbox, show lock icon
TraitCheckbox.Visible = false; TraitCheckbox.Visible = false;
LockIcon.Visible = true; LockIcon.Visible = true;
// Deselect if conditions no longer met if (isSelected && conditionLocked)
if (TraitCheckbox.Pressed)
{ {
_isUpdating = true; _isUpdating = true;
TraitCheckbox.Pressed = false; TraitCheckbox.Pressed = false;
@@ -211,14 +322,24 @@ public sealed partial class TraitEntry : PanelContainer
// Add disabled styling // Add disabled styling
AddStyleClass("TraitsEntryDisabled"); AddStyleClass("TraitsEntryDisabled");
// Update tooltip to show failed conditions // Tooltip priority for conditions: condition failures > category full > insufficient points.
if (_failedConditionTooltips.Count > 0) if (conditionLocked && _failedConditionTooltips.Count > 0)
{ {
var tooltipText = Loc.GetString("trait-conditions-not-met-tooltip", var tooltipText = Loc.GetString("trait-conditions-not-met-tooltip",
("requirements", string.Join("\n", _failedConditionTooltips))); ("requirements", string.Join("\n", _failedConditionTooltips)));
TooltipSupplier = _ => CreateMarkupTooltip(tooltipText); TooltipSupplier = _ => CreateMarkupTooltip(tooltipText);
} }
else if (categoryLocked)
{
var tooltipText = Loc.GetString("trait-category-full-tooltip");
TooltipSupplier = _ => CreateMarkupTooltip(tooltipText);
}
else if (pointsLocked)
{
var tooltipText = Loc.GetString("trait-insufficient-points-tooltip");
TooltipSupplier = _ => CreateMarkupTooltip(tooltipText);
}
} }
else else
{ {
+18 -8
View File
@@ -154,14 +154,18 @@ public sealed partial class TraitsTab : BoxContainer
} }
} }
// Check conflicts // Check conflicts via TraitDependencyCondition
foreach (var conflict in trait.Conflicts) var depCondition = trait.Conditions.OfType<Content.Shared._DV.Traits.Conditions.TraitDependencyCondition>().FirstOrDefault();
if (depCondition != null)
{ {
if (!_selectedTraits.Contains(conflict)) foreach (var conflict in depCondition.Conflicts)
continue; {
if (!_selectedTraits.Contains(conflict))
continue;
RevertTraitToggle(traitId); RevertTraitToggle(traitId);
return; return;
}
} }
_selectedTraits.Add(traitId); _selectedTraits.Add(traitId);
@@ -176,6 +180,7 @@ public sealed partial class TraitsTab : BoxContainer
} }
UpdateGlobalStats(); UpdateGlobalStats();
UpdateAllConditions();
UpdateCategoryStats(trait.Category); UpdateCategoryStats(trait.Category);
OnTraitsChanged?.Invoke(_selectedTraits); OnTraitsChanged?.Invoke(_selectedTraits);
} }
@@ -211,7 +216,7 @@ public sealed partial class TraitsTab : BoxContainer
// If parent width is 0 (not laid out yet), defer until layout happens // If parent width is 0 (not laid out yet), defer until layout happens
if (parentWidth > 0) if (parentWidth > 0)
{ {
GlobalPointsBar.SetWidth = (int)((parentWidth - 2 ) * percentage); GlobalPointsBar.SetWidth = (int)((parentWidth - 2) * percentage);
_awaitingLayoutUpdate = false; _awaitingLayoutUpdate = false;
} }
else if (!_awaitingLayoutUpdate) else if (!_awaitingLayoutUpdate)
@@ -235,6 +240,11 @@ public sealed partial class TraitsTab : BoxContainer
> 0f => "TraitsProgressBarLow", > 0f => "TraitsProgressBarLow",
_ => "TraitsProgressBarEmpty" _ => "TraitsProgressBarEmpty"
}); });
foreach (var (_, categoryUi) in _categoryUis)
{
categoryUi.UpdateGlobalPointsLock(remainingPoints);
}
} }
private void OnProgressBarParentResized() private void OnProgressBarParentResized()
@@ -281,7 +291,7 @@ public sealed partial class TraitsTab : BoxContainer
foreach (var (_, categoryUi) in _categoryUis) foreach (var (_, categoryUi) in _categoryUis)
{ {
// If some fork wants to use the top selected job as well, just add that to the UpdateConditions method in the editor // If some fork wants to use the top selected job as well, just add that to the UpdateConditions method in the editor
categoryUi.UpdateConditions(null, _profile?.Species, _profile?.AntagPreferences); categoryUi.UpdateConditions(null, _profile?.Species, _profile?.AntagPreferences, _selectedTraits);
} }
RecalculateStats(); RecalculateStats();
@@ -0,0 +1,7 @@
<Button xmlns="https://spacestation14.io">
<TextureRect Name="TextureRect"
TextureScale="0.5 0.5"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Stretch="KeepCentered"/>
</Button>
@@ -0,0 +1,17 @@
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client._DV.UserInterfaces;
[GenerateTypedNameReferences]
public sealed partial class IconButton : Button
{
public Texture? Icon { get => TextureRect.Texture; set => TextureRect.Texture = value; }
public IconButton()
{
RobustXamlLoader.Load(this);
}
}
+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,184 @@
// 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 Dictionary<StellarInteractionParticleType, EntProtoId> InteractionParticleIds = new ()
{
{ StellarInteractionParticleType.Use, "StellarInteractionParticleUse" },
{ StellarInteractionParticleType.Pull, "StellarInteractionParticlePull" },
};
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;
if (ev.Type == StellarInteractionParticleType.Pull)
{
(performer, target) = (target, performer);
}
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(InteractionParticleIds[ev.Type], 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;
var animation = ev.Type switch
{
StellarInteractionParticleType.Use => GetUseAnimation(performerTargetDelta, spriteColor),
StellarInteractionParticleType.Pull => GetPullAnimation(performerTargetDelta, spriteColor),
_ => throw new ArgumentOutOfRangeException(nameof(ev), $"Interaction particle event has unknown particle type {ev.Type}"),
};
_animation.Play(particle, animation, AnimateKey);
}
private Animation GetUseAnimation(Vector2 endOffset, Color color)
{
var startRotation = _random.NextAngle(Angle.FromDegrees(-40), Angle.FromDegrees(40));
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(250);
var startColor = color.WithAlpha(color.A * 0.7f);
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.OutBack),
},
},
new AnimationTrackComponentProperty()
{
ComponentType = typeof(SpriteComponent),
Property = nameof(SpriteComponent.Scale),
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(startScale, 0f),
new AnimationTrackProperty.KeyFrame(endScale, (float)rotationLength.TotalSeconds, Easings.OutBack),
},
},
new AnimationTrackComponentProperty()
{
ComponentType = typeof(SpriteComponent),
Property = nameof(SpriteComponent.Offset),
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(startOffset, 0f),
new AnimationTrackProperty.KeyFrame(endOffset, (float)offsetLength.TotalSeconds, Easings.OutBack),
},
},
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),
},
},
},
};
}
private Animation GetPullAnimation(Vector2 endOffset, Color color)
{
var rotationLength = TimeSpan.FromMilliseconds(8f * (1000f / 12f));
var startOffset = new Vector2();
var offsetLength = TimeSpan.FromMilliseconds(4f * (1000f / 12f));
var endColor = color.WithAlpha(0f);
return new Animation
{
Length = rotationLength,
AnimationTracks =
{
new AnimationTrackComponentProperty()
{
ComponentType = typeof(SpriteComponent),
Property = nameof(SpriteComponent.Offset),
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(startOffset, 0f),
new AnimationTrackProperty.KeyFrame(endOffset, (float)rotationLength.TotalSeconds, Easings.InOutCirc),
},
},
new AnimationTrackComponentProperty()
{
ComponentType = typeof(SpriteComponent),
Property = nameof(SpriteComponent.Color),
KeyFrames =
{
new AnimationTrackProperty.KeyFrame(color, 0f),
new AnimationTrackProperty.KeyFrame(color, (float)offsetLength.TotalSeconds),
new AnimationTrackProperty.KeyFrame(endColor, (float)rotationLength.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>

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