Compare commits

..
Author SHA1 Message Date
pre-commit-ci[bot] 3d24fa691f [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
2026-08-23 14:09:05 +00:00
Vanessa 270948aa69 Hyperblade to 25TC 2026-08-23 09:02:43 -05:00
Delta-V bot bbf1bec942 Automatic changelog update 2026-08-23 14:57:21 +02:00
Vanessaandpre-commit-ci[bot] bd34a94587 Embeddable Syndicate and Hitman Business Cards (#6439)
* make business cards embed

* [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-08-23 07:57:01 -05:00
Delta-V bot 86c54228f8 Automatic changelog update 2026-08-23 14:56:33 +02:00
Vanessa c66bf7c249 Remove coords for Arms Dealers, Asakim, and SRN (#6441)
* Remove coords for arms dealers, asakim, and SRN

* Also set a bunch of other syndicate uniforms to coords off

* forgot two
2026-08-23 07:56:12 -05:00
github-actions[bot]andDeltaV-Bot fd0f01e49a Update Credits (#6444)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-08-23 02:56:31 +02:00
Delta-V bot cfddb40c2f Automatic changelog update 2026-08-22 18:18:52 +02:00
DisposableCrewmember42 19d4eb8489 feat: Unorbitable component (#6435)
* feat: Unorbitable component

* feat: stealthmin adds/removes Unorbitable
2026-08-22 11:18:31 -05:00
Delta-V bot 9bb7925bd2 Automatic changelog update 2026-08-21 20:29:57 +02:00
Radezolid e340ddcec9 Kill combat medkits free storage (#6413)
* Kill!!

* Medkit size

* Removed from printable list + made resistant to explosions

* Make the test not angry at me

* I can't read

* I can't read v2
2026-08-21 13:29:37 -05:00
Delta-V bot e0b6261454 Automatic changelog update 2026-08-21 04:39:06 +02:00
Radezolid d741daca19 Syndie shuttles fixes + interdyne locker + new syndie evac pod (#6094)
* Interdyne locker

* Haibu

* strongbox

* synth

* Census

* hornet

* old evac pod to adming folder

* Add a syndie door and fix census

* Apply requested changes

---------

Signed-off-by: Radezolid <snappednexus@gmail.com>
2026-08-20 21:38:45 -05:00
Vanessa 970c8d71b5 Fix NodeCrawling ClientSide Errors (#6429)
fix some clientside errors with nodecrawling
2026-08-20 12:28:47 -05:00
Delta-V bot b6801b2fe5 Automatic changelog update 2026-08-20 19:20:06 +02:00
Vanessa 5cd26f877e Fix Hitman Targeting Marked as Protected (#6426)
Fix objective immunity.
2026-08-20 12:19:46 -05:00
Minerva 105ad32f98 Minor indentation change on pull request template (#5634) 2026-08-20 10:18:59 -05:00
Delta-V bot e3566a4cc9 Automatic changelog update 2026-08-20 16:25:25 +02:00
Vanessa 5e63549b8c Locale Ops (#6427)
* Fixed missing locale strings.

* Meant to revert this.
2026-08-20 09:24:59 -05:00
Delta-V bot 5b08961c35 Automatic changelog update 2026-08-18 20:15:03 +02:00
3c6ab7b676 Reduced the slowdown of the Advanced Riot Control Suit to 15% (#6353)
* ARCS slowdown 15% explosion resist 40%

* Comment on the explosion resistance of the ARCS

* Replaces the ARCS with the upstream riot suit, riot suit now has 40% explosion resist

* Apply suggestion from @ShepardToTheStars

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

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: john <sadadawd3@gmail.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-08-18 18:14:43 +00:00
23e55c9c40 Fix lack of justice access on AA (#6408)
* Add access, uncomment brig

* borgs

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

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

---------

Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-18 18:08:39 +00:00
Delta-V bot ffa442f844 Automatic changelog update 2026-08-18 19:51:56 +02:00
CorynandVanessa 6d75455dd1 Add Vulp Scream Sound Collection (#6348)
* Add Vulp Scream Sound Collection

* Fix mistake

---------

Signed-off-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
Co-authored-by: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>
2026-08-18 12:51:36 -05:00
Delta-V bot 0d89320364 Automatic changelog update 2026-08-18 18:39:28 +02:00
Theo 1984cc2118 hristov rework (#5905)
* Add deviation, slowdown, projectile slower, bipod and stats

* add nt-3 piercing remove bullet slow

* fixed the piercing stuff

* ok
2026-08-18 11:39:07 -05:00
Delta-V bot 3248ee4715 Automatic changelog update 2026-08-17 22:26:29 +02:00
Vanessaandpre-commit-ci[bot] b2b08e698e Ramping Scheduler Fixes / Convert to Survival Fixes (#6416)
* Fixed nukie behavior check firing early

* Fixed ZombieOutbreak adding ramping schedulers

* RampingSchedulers now look at when they were added for keypoint times

* Xenoborgs no longer has a RampingScheduler roundstart.

* Added number of cuffed hands check

* Use GameRule activation time.

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

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

* silly compiler flag

* 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>

* Fix other locale usages

* silly me

* PR feedback

---------

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>
2026-08-17 15:26:09 -05:00
Delta-V bot 3a612b9450 Automatic changelog update 2026-08-17 21:14:50 +02:00
Vanessaandpre-commit-ci[bot] 9746e92479 Adjust Traitor Objectives if 30TC (#6389)
* Adjust traitor objectives. More objectives. Increase objective variance a bit. Add new CMO steal target.

* Remove stealcondition blacklist from DAGD so its not just muderboning

* locale

* Fix DAGD steal objective again. Tweak LO steal objectives

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

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

* Updated super surplus

* Added migration.

* Locale tweak

* [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-08-17 14:14:31 -05:00
Delta-V bot 9d723af15d Automatic changelog update 2026-08-17 19:38:23 +02:00
Vanessa 8e925a02b9 Fix Kitsune Getting Posioned by Raw Meat (#6422)
fix kitsune
2026-08-17 19:38:02 +02:00
Delta-V bot d898300c5c Automatic changelog update 2026-08-16 17:05:00 +02:00
Vanessa 4294df8fd7 Fix Holy Water (#6421)
fix holy water
2026-08-16 10:04:40 -05:00
Delta-V bot 365209174b Automatic changelog update 2026-08-16 16:08:07 +02:00
Sir Warock 0c852409b3 Prioritize ejecting handgun from secbelt (#6418)
one commit
2026-08-16 09:07:45 -05:00
github-actions[bot]andDeltaV-Bot 9fb8bab84e Update Credits (#6420)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-08-16 02:55:39 +02:00
Delta-V bot c7e1c980b6 Automatic changelog update 2026-08-14 06:31:17 +02:00
Stop-Signs 0516e97461 Disallow evil fucked up brainwashing (#6414) 2026-08-13 23:30:57 -05:00
Delta-V bot fd5b16abb3 Automatic changelog update 2026-08-13 17:02:06 +02:00
Vanessa 1a9281ab63 Fixed Species Organs (#6409)
Fixed some inconsistent organs with species.
2026-08-13 10:01:47 -05:00
Delta-V bot c9038be25f Automatic changelog update 2026-08-13 03:17:23 +02:00
Vanessa b3cf460bda Fix and Tweak Random Shuttle Spawns (#6401)
* Fix and slightly alter random shuttle spawns

* Few more tweaks. Twice as many shuttles.

* Tweaked to be max every 90 min
2026-08-13 03:17:03 +02:00
Delta-V bot 7fddf52368 Automatic changelog update 2026-08-12 19:34:32 +02:00
pathetic meowmeow 4a96535892 Finetune ion law set (#6390) 2026-08-12 14:34:11 -03:00
Stop-Signs 93f614fdfc Add animation to the radiant sword (#6380)
* progress

* kermit

* donezo

* light
2026-08-12 14:15:26 -03:00
Delta-V bot 40997fb4a4 Automatic changelog update 2026-08-12 19:05:52 +02:00
freezer dog c3adbb32f1 a cowboy crate edit (#6363)
yeehaw
2026-08-12 14:05:32 -03:00
Delta-V bot 3974a0331b Automatic changelog update 2026-08-12 18:49:52 +02:00
SumofThreeParts 92c6c8cfa3 Making Universals Cheaper (#6366)
* Making Universals Cheaper

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

* Update cargo_armory.yml

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

* Update cargo_armory.yml

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

---------

Signed-off-by: SumofThreeParts <its.a.joke1000@gmail.com>
2026-08-12 13:49:31 -03:00
Vanessa ea313aae4a Update Configs (#6407)
* add configs that were not managed in git

* Add fallback preset

* removed map_enabled
2026-08-10 17:03:25 -05:00
Delta-V bot 272c38a6d0 Automatic changelog update 2026-08-10 18:15:15 +02:00
Coryn 7f11e1eebb Harpy Layers Fix (#6406)
* Harpy Layers Fix

* Remove unused Dependency

* Commented out Visual Subscribes, Add RArmExtension has a hideable layer for hardsuits

* Untouch Harpy Visuals
2026-08-10 11:14:55 -05:00
Delta-V bot 06429d050a Automatic changelog update 2026-08-09 20:24:45 +02:00
ed07a12d24 Gnomes (#6027)
* add gnomes, gnome hat, gnome gamerule, gnome voice

* inventory and hand fixed, speech half fix, hat embed, gamerule doesn't work

* fix audio, gamerule doesn't spawn correctly, need to fix dead sprite 90 degrees off

* add audio, add custom jaunt + polymorph, "fix" dead sprite

* add storage to hat, gnome fit into duffelbags

* make jaunt 2 seconds, hat store small items

* fix spawn

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

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

* jaunt 20 seconds

* fix stupid web merge, 20 second jaunt cooldown

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

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

* add pitch variation

* audio fixes and guidebook, make pulling need hands

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

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

* fix hands and polymorph inventory, make storage implant unremovable

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

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

* polymorph inventory make linter mad

* Update Resources/Prototypes/_DV/Polymorphs/polymorph.yml

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

* Update Resources/Locale/en-US/_DV/abilities/psionic.ftl

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

* passive HTN and glimmer event

* fix comment

* random names

* PR Review Suggestions but it works this time

---------

Signed-off-by: Theo <rebe83a@gmail.com>
Signed-off-by: Theo <tad3@illinois.edu>
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>
Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
2026-08-09 18:24:25 +00:00
Delta-V bot 493db6d129 Automatic changelog update 2026-08-09 20:14:34 +02:00
Vanessa d07f16f43f Allow curators to help out with people learning the game (#6374) 2026-08-09 13:14:15 -05:00
Delta-V bot f580f3b060 Automatic changelog update 2026-08-09 18:57:52 +02:00
Vanessa e7869d8221 Fix Jaunting/Polymorph while Nodecrawling (#6400)
* Disable polymorph while ventcrawling

* Actually, allow but remove from vent

* update comments
2026-08-09 11:57:32 -05:00
Vanessa 398e3eb75f Server Location Updates (#6405)
Server name updates (because we're in canada now)
2026-08-09 11:54:55 -05:00
Vanessa 0637a82e40 Update CODEOWNERS (#6404) 2026-08-09 11:41:59 -05:00
github-actions[bot]andDeltaV-Bot 206ded17c8 Update Credits (#6402)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-08-09 03:11:44 +02:00
Delta-V bot 847f534ff6 Automatic changelog update 2026-08-08 01:25:14 +02:00
VanessaandWhatstone b38f0b1a59 Fix parcel wrap transform parenting via SpawnAtPosition (#44679) (#6399)
ParcelWrap: spawn at position, use PopupEntity

Co-authored-by: Whatstone <166147148+whatston3@users.noreply.github.com>
2026-08-07 23:24:53 +00:00
Delta-V bot efbeb5bf68 Automatic changelog update 2026-08-07 18:51:45 +02:00
VanessaandSir Warock 1f09c717f3 Fix Antags Being Crazy Smol (#6398)
* Fixed antags being crazy smol

* Update Content.Shared/Sprite/SharedScaleVisualsSystem.cs

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: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-08-07 16:51:24 +00:00
Radezolid 52ed881e2c Extra mapping stuff for justice rework (#6397)
* Banner

* Beacons

* Warp

* Gun safe stuff
2026-08-07 09:04:06 -05:00
Radezolid 393e1951a2 More suffixes fixes for Justice (#6396)
Suffixes, suffixes!
2026-08-05 00:07:51 +00:00
Delta-V bot ca7c7daf6c Automatic changelog update 2026-08-05 00:19:07 +02:00
Stxcking 697da0679a Fix: Moproach Ghostrole + Critter Emoting Fixes (#6356)
yeah sure it works
2026-08-04 17:18:46 -05:00
Delta-V bot 1b75cad94f Automatic changelog update 2026-08-04 23:49:39 +02:00
Vanessa 82e5d9b924 Fix Shadekin Changelog (#6395)
* Fix changelog

* i can't spell
2026-08-04 21:49:18 +00:00
Radezolid e44717f262 Fix Justice Warden's suffixes for mapping (#6393)
* SUFFIXES

* I missed the PDA one.

* Justice warden's shit

* Holopad
2026-08-04 12:45:19 -05:00
Delta-V bot 9c83b91850 Automatic changelog update 2026-08-04 18:41:34 +02:00
VanessaandSir Warock f027ae4566 Fix Shadekin Inheritence (#6381)
* Make shadekin organic

* Removed shadekin lungs

* Update Content.Server/_Starlight/ShadekinSystem.cs

Co-authored-by: Sir Warock <67167466+SirWarock@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: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-08-04 16:41:14 +00:00
Delta-V bot 724cd1c9b8 Automatic changelog update 2026-08-04 18:28:16 +02:00
Vanessaandpre-commit-ci[bot] f44178bec3 Character Height Slider + Character Height Changes (#6320)
* Do the thing for everyone. Height is now +/- 20% for everyone.

* Make the height slider show height. Solve for special cases. Solve world hunger.

* Fixed some minor things.

* Adjust some densities

* Smaller character balance

* Comment

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

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

* Oops, that was from a failed thing.

* Size calc correction

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

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

* people are tall in the future

* I need to refactor a bit still.

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

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

* Refactor into a system

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

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

* smol

* Fixed remaining scale visual components and species

* Remove MockScale. Just add scale visuals for Allalulo to compensate.

* PR feedback

* Slight refactor. Moved profile/species scale out of the scale system and put it into the HumanoidProfileSystem. Removed some CD logic that is no longer needed.

* how'd this get in there

* Move the other motorkind.yml to AprilFools dir

* NO NO_PENTALTY lol

* Other PR stuff

* Other PR stuff

* Add a dirty

* Add some networking to the comp

* Add small character to cloning

* One more fixX

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-04 16:27:55 +00:00
Delta-V bot 877267cd31 Automatic changelog update 2026-08-03 04:45:31 +02:00
3572bf4739 Skia Shadow-Walk and DarkVision instead of VentCrawl (#6346)
* What if Skia were awesome instead of sucking

* Shhh Yaml Linter... Shhh

* Small change to make it feel more consistant

* Reworked shadowwalking to be lazy

Much faster, preserves most of the feel

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

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

* Update Content.Shared/_DV/Overlays/Components/DarkVisionComponent.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-08-02 22:45:11 -04:00
Delta-V bot 7867fb7f1f Automatic changelog update 2026-08-02 15:31:52 +02:00
a3b1059c21 PORT: Added Construction Bag and Bag of Holding from Frontier (#5846)
* Construction Bag (#1487)

* initial commit

* Un Tag

* fixes

* no tickets

* research thingy

* inflatable walls, shared.comp

---------

Co-authored-by: Dvir <dvirf01@gmail.com>

* DeltaV related

Don't kill me for fixing my own grammar mistake with the borg module please

* BorgModuleAdvancedConstruction

- I will fix the spelling in another PR I guess. GUH
- Some fixes to the bag according to linter.
Anything and everything you need for a borg module:
- Lathe recipe.
- Module.
- Icon/action sprite.

* Sprite fixes

* lathe fix I forgor

* nuke BorgModuleAdvancedConstruction

CR request

* why was this not merged uh whoops

* suggestions

* Update Resources/Prototypes/_NF/Recipes/Lathes/misc.yml

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

---------

Signed-off-by: Radezolid <snappednexus@gmail.com>
Co-authored-by: ErhardSteinhauer <65374927+ErhardSteinhauer@users.noreply.github.com>
Co-authored-by: Dvir <dvirf01@gmail.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-08-02 13:31:30 +00:00
Stxckingandpre-commit-ci[bot] 076d960072 Justice Rework - Mapping (#6276)
* windoors, airlocks, faxes, dresser, beacon, warppoints

* Lockers and placeholder bedsheets

Most of this done by Rebe

* attorney as a separate role

idk why we decide to just modify upstream lawyer instead of making a separate role from the start sobs

* justice warden, armorer, marshal job roles

* linter fixes

* holy shit theres more

a mixture of everything as I had a list to go down
-JusticeDetective stuff because Det is now under justice
-More Armorer stuff
-Cameras
-Telecoms
-Prosec/Attorney lockers
-Secure windoors

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

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

* brig access as requested + admin config

also dupe beacon fix wop

* Reb

* Bypass ChameleonJobLoadoutTest

dear maint i pinky promise they will get added before rework launches

* suggestions and fixes

They don't need to be on the access config right now but should be fine.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-08-02 10:20:12 -03:00
github-actions[bot]andDeltaV-Bot acb6677aff Update Credits (#6392)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-08-02 04:08:22 +02:00
Delta-V bot c916f9a90b Automatic changelog update 2026-07-30 19:31:07 +02:00
71b6dfc0b1 Add Remote Medical Tracking to T3 Biochemical Tree (#6272)
* Added handheld monitors to the research tree.

* changed logi crate parent

* Added new board to dynamic pack

* Namespaced new entity

* [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: Radezolid <snappednexus@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: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Radezolid <snappednexus@gmail.com>
2026-07-30 17:30:47 +00:00
Delta-V bot 5fe8a394ba Automatic changelog update 2026-07-29 17:42:20 +02:00
Vanessaandpre-commit-ci[bot] 69d3d96d79 Reduce Sink Claws Delay + Sink Claws Alert (#6376)
* Reduced felinid rootable delay to tolerable levels

* Added the unused toggle icon to the alerts on the side when claws are protracted, instead of using the diona one.

* [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-07-29 17:42:01 +02:00
Delta-V bot 1e6f69361d Automatic changelog update 2026-07-29 14:19:14 +02:00
NollaDarkstarandjohn cb71e8159c Change resistances of the Durathread Vest and Plate Carrier (#6311)
* Change to durathread vest and plate carrier

* Increase heat resistance of the durathread to 20%, plate carrier remains at 20% slash

* Plate Carrier is back at 20% heat

---------

Co-authored-by: john <sadadawd3@gmail.com>
2026-07-29 12:18:53 +00:00
Delta-V bot 809525b1bd Automatic changelog update 2026-07-27 21:26:57 +02:00
CalliganSierreandpre-commit-ci[bot] b81ccd4f15 Ported Shadekin Audio Revamp (#6370)
* Port TheDen Shadowkin voice noises for Shadekin

Bring over TheDen's Shadowkin scream, laugh, and talk audio, wire them into Shadekin emote sound collections and speech sounds so Shadekin no longer use generic human laughs/speech.

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

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

* Move TheDen Shadowkin voice prototypes to _DEN

Restore Starlight shadekin sound collections and emote sounds to their original state. Keep TheDen scream, laugh, and talk wiring under _DEN and point MobShadekin at those prototypes.

* Clean up comments on Shadekin voice port

Remove unnecessary inline notes from MobShadekin wiring and drop the extra header on sound collections. Keep a single provenance comment on the TheDen emote sound block.

* Cleaned up unneccessary comments

* Added gulps, i guess lol

* Removed custom laugh emotes for shadekin, reverted to normal human laugh.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-27 21:26:37 +02:00
Delta-V bot c50871e76b Automatic changelog update 2026-07-27 18:43:40 +02:00
Stxcking 1206fca623 Feat: Departmental Bomber Jackets (#6220)
* Sprites

* bombers.yml

* drobes changes

* loadouts

* armor values (dread) + fixes

* updated sprites

* Suggestions
2026-07-27 11:43:19 -05:00
140be08fbb Health analyzer plus (#6230)
* Add medtek+ cart, healthanalyzer+ gui, research target

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

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

* Make new health analyzer default, remove research

* Remove bloodlevel unit count, center damage/reagents

* Accidentally pushed wording change, reverting

* Added unknown reagent category. Fixed some issues with FixedPoint2 showing 100x the damage.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Vanessa <vanessalouwagie@gmail.com>
2026-07-27 14:02:14 +00:00
Delta-V bot b218279e7f Automatic changelog update 2026-07-27 15:48:35 +02:00
Vanessa 5664d6746d Revert "PORT: Selectable Cyborg Chassis from CosmicDrift (#5712)" (#6385)
This reverts commit 4e2dce4414.
2026-07-27 08:48:14 -05:00
github-actions[bot]andDeltaV-Bot ac747032ce Update Credits (#6383)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-07-26 04:09:10 +02:00
Delta-V bot 42db88fa74 Automatic changelog update 2026-07-24 19:39:38 +02:00
a52809279e Nerf & Fix NT-3 (#5653)
* One Commit ops

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

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

* Implement requested changes

Co-Authored-By: Vanessa <908648+ShepardToTheStars@users.noreply.github.com>

* Well Well Well

* Fix Pierce Mechanic

* Include it in comment

* Implement requested changes

---------

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-07-24 12:39:18 -05:00
Delta-V bot 07f73179cd Automatic changelog update 2026-07-24 19:35:07 +02:00
freezer dog d1c4e94499 giving the wt a little love not like a whole lot like a pat on the shoulder or somethin (#6364)
* i cant think of anything funny to say yknow just like yep its like yknow and like yeah

* deletin this, also saw literally nothing attached to this to begin with i guess? gonna double check but yeah
2026-07-24 12:34:47 -05:00
Delta-V bot 481335487e Automatic changelog update 2026-07-24 19:29:07 +02:00
pootslapandpre-commit-ci[bot] ef0e8497ce Monkey emote sounds (#5928)
* pitch change ops

adding the params to emoteSounds overrides every individual emote which sucks

* lower gulps and blinking

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

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

* Update speech_emote_sounds.yml

Signed-off-by: pootslap <211648338+pootslap@users.noreply.github.com>

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

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

---------

Signed-off-by: pootslap <211648338+pootslap@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-24 12:28:47 -05:00
Delta-V bot 06c5917dbf Automatic changelog update 2026-07-24 19:28:20 +02:00
Manoob f0d1f668fe FIX: Emergency access doesn't change the BOLT/Emergency permissions on a door using remote control (#6141)
AA doesnt change the BOLT/AA permissions on a door using remote control!
2026-07-24 12:28:00 -05:00
Vanessa 583eb39799 ADMIN: Move common QUERY commands to DEBUG (#6351)
ADMIN: Move entities command to DEBUG
2026-07-24 12:27:47 -05:00
Delta-V bot a0ebf263e3 Automatic changelog update 2026-07-23 22:07:23 +02:00
VanessaandSir Warock 898101b18e Buckle Bugfix + Dynamic CPR Prio (#6375)
* Fix long-time carrying bug with buckling. Also change CPR priority

* remove TODO comment

* small nitpick

Refactor OnRemoved method and improve code formatting.

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: Sir Warock <67167466+SirWarock@users.noreply.github.com>
2026-07-23 20:07:03 +00:00
Delta-V bot 25f4ffda47 Automatic changelog update 2026-07-23 18:29:49 +02:00
turtlemutt 796e6e4405 Lighthouse Tweaks (#6088)
* Update lighthouse.yml

* Update lighthouse.yml
2026-07-23 18:29:29 +02:00
Delta-V bot 5a4e73574d Automatic changelog update 2026-07-23 05:17:21 +02:00
Astra e4e3f30b84 Shrink entropic blades (#6371)
Resize entropic blade
2026-07-23 00:17:01 -03:00
William Lemonandpre-commit-ci[bot] b15639af05 Fixed Motorkind (#6347)
* Fixed Motorkind

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

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

* Gave the hand sprites human hand sprites

I'm not making motorkind hand sprites. Please god don't make me

* Tiny fixes

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2026-07-21 23:51:35 +00:00
Delta-V bot 009371129a Automatic changelog update 2026-07-21 20:45:08 +02:00
Coryn 09553d6b8e Add back Felinid Rootable (#6358) 2026-07-21 18:44:48 +00:00
Delta-V bot d736537261 Automatic changelog update 2026-07-21 09:59:15 +02:00
Coryn c0fbc4f262 Shadekin fixes (#6357)
* Fix Shadekin Emote availablity for everyone else

* Add Shadekin Bloodstream, so meds work
2026-07-21 03:58:55 -04:00
Delta-V bot cc33dc08e8 Automatic changelog update 2026-07-21 04:20:49 +02:00
Stxcking f6558cef8e Fix: Yip missing string (#6354)
yips
2026-07-21 02:20:29 +00:00
527 changed files with 9307 additions and 5703 deletions
+10 -19
View File
@@ -1,34 +1,25 @@
# Last match in file takes precedence.
# See https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners#example-of-a-codeowners-file
# C# code
/Content.*/ @DeltaV-Station/maintainers
# Any assets
/Resources/ @DeltaV-Station/maintainers
* @DeltaV-Station/maintainers
# Server config files
/Resources/ConfigPresets/ @Toby222
/Resources/ConfigPresets/ @DeltaV-Station/lead-maintainers
# Github workflows
/.github/ @DeltaV-Station/lead-maintainers
# Lobby art and music - automatically direction issues since its immediately visible to players
/Resources/Audio/Lobby/ @DeltaV-Station/direction
/Resources/Textures/LobbyScreens/ @DeltaV-Station/direction
/Resources/Audio/Lobby/ @DeltaV-Station/direction @DeltaV-Station/maintainers
/Resources/Textures/LobbyScreens/ @DeltaV-Station/direction @DeltaV-Station/maintainers
# Maps
/Resources/Maps/ @DeltaV-Station/maptainers
/Resources/Prototypes/Maps/ @DeltaV-Station/maptainers
/Content.IntegrationTests/Tests/PostMapInitTest.cs @DeltaV-Station/maptainers
/Content.IntegrationTests/Tests/PostMapInitTest.cs @DeltaV-Station/maptainers @DeltaV-Station/maintainers
# Server rules
/Resources/ServerInfo/Guidebook/_DV/Rules/ @DeltaV-Station/head-administrators
# Wiki
/.wiki/ @DeltaV-Station/direction
# Tools and scripts
/Tools/ @Toby222
# Workflows, codeowners, templates, etc.
/.github/ @Toby222
# Standalone files in the root repo
/* @Toby222
/.wiki/ @DeltaV-Station/direction
+1 -1
View File
@@ -26,7 +26,7 @@ This just saves them the trouble. Note that AGPL or MIT licensing is only applic
- [ ] I confirm that I am the creator of the code in this PR, and allow licensing it under the following license(s), or that the original author(s) has given me permission to do so:
- [X] AGPL (https://github.com/DeltaV-Station/Delta-v/blob/master/LICENSE-AGPLv3.txt) <!-- This one is required to contribute to DeltaV -->
- [X] MIT (https://github.com/DeltaV-Station/Delta-v/blob/master/LICENSE-MIT.txt) <!-- Optional - A lot of other SS14 forks use MIT -->
<!-- Feel free to add more licenses as you see fit -->
<!-- Feel free to add more licenses as you see fit -->
**Changelog**
<!-- Add a Changelog entry to make players aware of new features or changes that could affect gameplay.
+1 -1
View File
@@ -59,7 +59,7 @@ public sealed partial class BountyEntry : BoxContainer
var claimedByText = string.IsNullOrEmpty(bounty.ClaimedBy) ? Loc.GetString("bounty-console-claimed-by-none") : bounty.ClaimedBy;
ClaimedBylabel.SetMarkup(Loc.GetString("bounty-console-claimed-by", ("claimant", claimedByText)));
StatusLabel.SetMarkup(Loc.GetString($"bounty-console-formatted-status-{bounty.Status.ToString()}"));
StatusLabel.SetMarkup(Loc.GetString($"bounty-console-status-formatted-{bounty.Status.ToString()}"));
// End DeltaV bounty claiming
}
@@ -59,9 +59,12 @@
<Label Text="{Loc 'health-analyzer-window-entity-temperature-text'}" />
<Label Name="TemperatureLabel" />
<Label Text="{Loc 'health-analyzer-window-entity-blood-level-text'}" />
<Label Name="BloodLabel" />
<Label Text="{Loc 'health-analyzer-window-entity-damage-total-text'}" />
<Label Name="DamageLabel" />
<!-- Begin DeltaV - Health Analyzer Plus -->
<Label Name="BloodLevelLabel" />
<!-- Label Name="BloodLabel" / -->
<!-- Label Text="{Loc 'health-analyzer-window-entity-damage-total-text'}" / -->
<!-- Label Name="DamageLabel" / -->
<!-- End DeltaV - Health Analyzer Plus -->
</GridContainer>
</BoxContainer>
@@ -73,10 +76,41 @@
<PanelContainer StyleClasses="LowDivider" />
<BoxContainer
Name="GroupsContainer"
Margin="0 5 0 5"
Orientation="Vertical">
</BoxContainer>
<!-- Begin DeltaV - Health Analyzer Plus -->
<!-- BoxContainer Name="GroupsContainer" Margin="0 5 0 5" Orientation="Vertical" -->
<!-- /BoxContainer -->
<GridContainer Margin="0 5 0 5" Columns="3" HorizontalAlignment="Center">
<BoxContainer Name="DamageBox" Margin="5 5 5 5" Orientation="Vertical">
<Label Name="TotalDamageLabel" HorizontalAlignment="Center" />
<PanelContainer Name="DamageGroupsDivider" StyleClasses="LowDivider" />
<Label
Name="NoDamageLabel"
HorizontalAlignment="Center"
Text="{Loc 'health-analyzer-plus-window-no-damage-text'}"
FontColorOverride="DeepSkyBlue"
Margin="0 5 0 5" />
<BoxContainer HorizontalAlignment="Center">
<BoxContainer Name="DamageGroupsContainer" Margin="0 5 0 5" Orientation="Vertical" />
</BoxContainer>
</BoxContainer>
<PanelContainer StyleClasses="LowDivider" />
<BoxContainer Name="BloodstreamBox" Margin="5 5 5 5" Orientation="Vertical">
<Label Name="TotalReagentQuantityLabel" HorizontalAlignment="Center" />
<PanelContainer Name="BloodstreamReagentsDivider" StyleClasses="LowDivider" />
<Label
Name="NoReagentsLabel"
HorizontalAlignment="Center"
Text="{Loc 'health-analyzer-plus-window-no-reagents-text'}"
FontColorOverride="DeepSkyBlue"
Margin="0 5 0 5" />
<BoxContainer HorizontalAlignment="Center">
<BoxContainer Name="BloodstreamReagentListContainer" Orientation="Vertical" Margin="0 5 0 5" />
</BoxContainer>
</BoxContainer>
</GridContainer>
<!-- End DeltaV - Health Analyzer Plus -->
</BoxContainer>
@@ -19,12 +19,25 @@ using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
// BEGIN DeltaV
using Content.Client._DV.Traits.Assorted;
using Content.Shared._DV.Traits.Assorted;
using Content.Shared._DV.Medical; // Uncloneable
using Content.Shared._DV.MedicalRecords; // Medical Records
// Health Analyzer Plus
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Body.Systems;
using Content.Client.Body.Systems;
using Content.Shared.Chemistry.EntitySystems;
using Content.Client.Chemistry.Containers.EntitySystems;
using Content.Shared.Body.Components;
// END DeltaV
namespace Content.Client.HealthAnalyzer.UI;
using Content.Client._DV.Traits.Assorted; // DeltaV
using Content.Shared._DV.Traits.Assorted; // DeltaV
using Content.Shared._DV.Medical; // DeltaV - Uncloneable
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
// Health analyzer UI is split from its window because it's used by both the
// health analyzer item and the cryo pod UI.
@@ -32,6 +45,8 @@ using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
[GenerateTypedNameReferences]
public sealed partial class HealthAnalyzerControl : BoxContainer
{
private const string REAGENT_GROUP_MEDICINE = "Medicine"; // DeltaV - Health Analyzer
private readonly IEntityManager _entityManager;
private readonly SpriteSystem _spriteSystem;
private readonly IPrototypeManager _prototypes;
@@ -41,6 +56,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
private readonly UnborgableSystem _unborgable; // DeltaV
private readonly RedshirtSystem _redshirt; // DeltaV
private readonly UncloneableSystem _uncloneable; // DeltaV
private readonly SharedBloodstreamSystem _bloodstream; // DeltaV
private readonly SharedSolutionContainerSystem _solutionContainer; // DeltaV
// Begin DeltaV - Medical Records
private readonly ButtonGroup _triageStatusGroup = new();
@@ -66,6 +83,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
_unborgable = _entityManager.System<UnborgableSystem>(); // DeltaV
_redshirt = _entityManager.System<RedshirtSystem>(); // DeltaV
_uncloneable = _entityManager.System<UncloneableSystem>(); // DeltaV
_bloodstream = _entityManager.System<BloodstreamSystem>(); // DeltaV
_solutionContainer = _entityManager.System<SolutionContainerSystem>(); // DeltaV
// Begin DeltaV - Medical Records
foreach (var item in Enum.GetValues<TriageStatus>())
@@ -138,9 +157,13 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
? $"{state.Temperature - Atmospherics.T0C:F1} °C ({state.Temperature:F1} K)"
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
// Begin DeltaV - Health Analyzer Plus
/*
BloodLabel.Text = !float.IsNaN(state.BloodLevel)
? $"{state.BloodLevel * 100:F1} %"
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
*/
// End DeltaV - Health Analyzer Plus
StatusLabel.Text =
_entityManager.TryGetComponent<MobStateComponent>(target.Value, out var mobStateComponent)
@@ -149,7 +172,7 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
// Total Damage
DamageLabel.Text = _damageable.GetTotalDamage(target.Value).ToString();
// DamageLabel.Text = _damageable.GetTotalDamage(target.Value).ToString(); // DeltaV - Health Analyzer Plus
// Alerts
// DeltaV traits - This is going to be horrid if we just keep adding things like this.
@@ -216,6 +239,7 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
var damagePerType = _damageable.GetAllDamage(target.Value).DamageDict;
DrawDiagnosticGroups(damageSortedGroups, damagePerType);
DrawBloodstreamInfo(target.Value, state.BloodSolution, state.BloodLevel); // End DeltaV - Health Analyzer Plus
// Begin DeltaV - Medical Records
if (state.MedicalRecord is not { } records)
@@ -254,7 +278,15 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
Dictionary<ProtoId<DamageGroupPrototype>, FixedPoint2> groups,
IReadOnlyDictionary<ProtoId<DamageTypePrototype>, FixedPoint2> damageDict)
{
GroupsContainer.RemoveAllChildren();
// Begin DeltaV - Health Analyzer Plus
// GroupsContainer.RemoveAllChildren();
DamageGroupsContainer.RemoveAllChildren();
// Begin DeltaV - Health Analyzer Plus
var totalDamage = damageDict.Sum(x => x.Value.Double());
TotalDamageLabel.Text = Loc.GetString("health-analyzer-plus-window-entity-total-damage-text", ("amount", Math.Round(totalDamage, 2)));
NoDamageLabel.Visible = totalDamage == 0;
// End DeltaV - Health Analyzer Plus
foreach (var (damageGroupId, damageAmount) in groups)
{
@@ -275,7 +307,8 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
groupContainer.AddChild(CreateDiagnosticGroupTitle(groupTitleText, damageGroupId));
GroupsContainer.AddChild(groupContainer);
// GroupsContainer.AddChild(groupContainer); // DeltaV - Health Analyzer Plus
DamageGroupsContainer.AddChild(groupContainer); // DeltaV - Health Analyzer Plus
// Show the damage for each type in that group.
var group = _prototypes.Index(damageGroupId);
@@ -296,6 +329,116 @@ public sealed partial class HealthAnalyzerControl : BoxContainer
}
}
// Begin DeltaV - Health Analyzer Plus
private void DrawBloodstreamInfo(EntityUid target, Solution? bloodSolution, float bloodlevel)
{
BloodstreamReagentListContainer.RemoveAllChildren();
List<ReagentQuantity> bloodstream = new();
double totalReagentQuantity = 0;
double unknownReagents = 0;
// Make sure we can access the bloodtype and reagents before trying to use them
if (bloodSolution is not null)
{
if (!_entityManager.TryGetComponent<BloodstreamComponent>(target, out var bloodstreamComp) ||
!_solutionContainer.ResolveSolution(target, bloodstreamComp.BloodSolutionName, ref bloodstreamComp.BloodSolution, out var bloodReagentSolution))
return;
// Get the blood reagent IDs to ignore in the scan
var bloodReagentIds = bloodstreamComp.BloodReferenceSolution.Select(b => b.Reagent);
// Get all of the medicines in the bloodstream
foreach (var reagent in bloodSolution!.Contents)
{
if (bloodReagentIds.Contains(reagent.Reagent))
continue;
if (_prototypes.Index<ReagentPrototype>(reagent.Reagent.Prototype).Group == REAGENT_GROUP_MEDICINE)
{
bloodstream.Add(reagent);
totalReagentQuantity += reagent.Quantity.Double();
}
else
{
unknownReagents += reagent.Quantity.Double();
}
}
}
var bloodQuantityPercent = !float.IsNaN(bloodlevel)
? $"{bloodlevel * 100:F1} %"
: Loc.GetString("health-analyzer-window-entity-unknown-value-text");
// Display the percent and amount of blood in the system
// Normal health scanner is percent only, this one adds the actual units too
BloodLevelLabel.Text = Loc.GetString(
"health-analyzer-plus-window-entity-blood-level-quantity-text",
("percent", bloodQuantityPercent)
);
// Display the total amount of reagents in the bloodstream, 0 is valid
TotalReagentQuantityLabel.Text = Loc.GetString(
"health-analyzer-plus-window-entity-total-reagents-text",
("amount", Math.Round(totalReagentQuantity, 1).ToString("0.0"))
);
// If the bloodstream was empty, display a message instead to fill the space with something
NoReagentsLabel.Visible = bloodstream.Count == 0 && unknownReagents == 0;
// For each of the reagents in the bloodstream, add them to the list of reagents
// If there are none, this loop will simply do nothing
foreach (var (reagentID, reagentQuantity) in bloodstream)
{
var reagentPrototype = _prototypes.Index<ReagentPrototype>(reagentID.Prototype);
// Make a new container for each reagent we add to the list
var reagentContainer = new BoxContainer
{
Align = AlignMode.Begin,
Orientation = LayoutOrientation.Vertical
};
// Add the string "[] <reagent_name>: <reagent_amount>u" for the current reagent
// The [] is a unicode block character, and is colored with the reagent color
// to make it easier to identify
reagentContainer.AddChild(
new RichTextLabel
{
Text = Loc.GetString("health-analyzer-plus-window-reagent-text",
("reagentColor", reagentPrototype.SubstanceColor),
("reagentName", reagentPrototype.LocalizedName),
("amount", Math.Round(reagentQuantity.Double(), 1).ToString("0.0"))
)
}
);
BloodstreamReagentListContainer.AddChild(reagentContainer);
}
// Add unknown reagents (if any)
if (unknownReagents > 0)
{
var unknownReagentContainer = new BoxContainer
{
Align = AlignMode.Begin,
Orientation = LayoutOrientation.Vertical
};
unknownReagentContainer.AddChild(
new RichTextLabel
{
Text = Loc.GetString("health-analyzer-plus-window-unknown-reagents-text",
("amount", Math.Round(unknownReagents, 1).ToString("0.0"))
)
}
);
BloodstreamReagentListContainer.AddChild(unknownReagentContainer);
}
return;
}
// End DeltaV - Health Analyzer Plus
private Texture GetTexture(string texture)
{
var rsiPath = new ResPath("/Textures/Objects/Devices/health_analyzer.rsi");
@@ -7,7 +7,9 @@
<ScrollContainer
Margin="5 5 5 5"
ReturnMeasure="True"
VerticalExpand="True">
VerticalExpand="True"
VScrollBarHidden="True"
HScrollBarHidden="True"> <!-- DeltaV - Hide the scroll bars -->
<ui:HealthAnalyzerControl
Name="HealthAnalyzer"
@@ -9,6 +9,8 @@ using Content.Shared.Preferences;
using Robust.Client.UserInterface.Controls;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using Content.Client._CD.Records.UI; // DeltaV
using Content.Shared._DV.Body.Systems; // DeltaV
namespace Content.Client.Lobby.UI;
@@ -193,6 +195,7 @@ public sealed partial class HumanoidProfileEditor
RefreshLoadouts();
UpdateSexControls(); // update sex for new species
UpdateSpeciesGuidebookIcon();
UpdateHeightControls(); // DeltaV
ReloadPreview();
}
@@ -204,23 +207,22 @@ public sealed partial class HumanoidProfileEditor
ReloadProfilePreview();
}
private void UpdateHeightControls()
{
if (Profile == null)
{
return;
}
var species = _species.Find(x => x.ID == Profile.Species);
if (species != null)
_defaultHeight = species.DefaultHeight;
var prototype = _prototypeManager.Index(Profile.Species);
_defaultHeight = prototype.DefaultHeight;
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
var sliderPercent = (Profile.Height - prototype.MinHeight) /
(prototype.MaxHeight - prototype.MinHeight);
CDHeightSlider.Value = sliderPercent;
CDHeight.Text = Profile.Height.ToString(CultureInfo.InvariantCulture);
var scaleReference = _defaultHeight * prototype.BaseScale.Y;
var newHeight = MathF.Round(MathHelper.Lerp(prototype.MinHeight, prototype.MaxHeight, sliderPercent), 2);
CDHeightLabel.Text = UnitConversion.GetMetricAndImperialDisplayFromScale(scaleReference * newHeight);
CDPullSpeedReductionLabel.Text = SmallCharacterSystem.GetPullSpeedPenaltyDisplayFromScale(newHeight);
}
// End CD - Character Records
@@ -73,9 +73,13 @@
<BoxContainer HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-height-label'}" />
<Control HorizontalExpand="True" />
<Label Name="CDHeightLabel" />
<Slider Name="CDHeightSlider" HorizontalAlignment="Right" SetWidth="300" MinValue="0.0" MaxValue="1.0"/>
<LineEdit HorizontalAlignment="Right" Name="CDHeight" MinSize="60 0" Text="1.0" />
<Button Name="CDHeightReset" Text="{Loc 'humanoid-profile-editor-reset-height-button'}" HorizontalAlignment="Right"/>
</BoxContainer>
<BoxContainer HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-height-pull-speed-penalty-label'}" />
<Control HorizontalExpand="True" />
<Label Name="CDPullSpeedReductionLabel" />
</BoxContainer>
<!-- End CD - Character Records -->
<!-- Sex -->
@@ -2,9 +2,6 @@ using Content.Client.Humanoid;
using Content.Client.Message;
using Content.Client.Players.PlayTimeTracking;
using Content.Client.Sprite;
using Content.Client.UserInterface.Systems.Guidebook;
using Content.Shared._DV.Species; // DeltaV - Species hider
using Content.Shared.Body;
using Content.Shared.CCVar;
using Content.Shared.GameTicking;
using Content.Shared.Humanoid;
@@ -22,13 +19,8 @@ using Robust.Shared.ContentPack;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
using Direction = Robust.Shared.Maths.Direction;
// Begin CD - Character Records
using System.Globalization;
using Content.Client._CD.Records.UI;
using Content.Shared._CD.Records;
// End CD - Character Records
using Content.Shared._DV.Traits;
using Content.Shared.Humanoid.Prototypes; // DV - Traits
using Content.Client._CD.Records.UI; // CD - Character Records
using Content.Shared._DV.Body.Systems; // DV - Traits
namespace Content.Client.Lobby.UI
{
@@ -221,34 +213,18 @@ namespace Content.Client.Lobby.UI
// Begin CD - Character Records
#region CDHeight
CDHeight.OnTextChanged += args =>
{
if (Profile is null || !float.TryParse(args.Text, out var newHeight))
return;
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
newHeight = MathF.Round(Math.Clamp(newHeight, prototype.MinHeight, prototype.MaxHeight), 2);
// The percentage between the start and end numbers, aka "inverse lerp"
var sliderPercent = (newHeight - prototype.MinHeight) /
(prototype.MaxHeight - prototype.MinHeight);
CDHeightSlider.Value = sliderPercent;
SetProfileHeight(newHeight);
};
CDHeightReset.OnPressed += _ =>
{
CDHeight.SetText(_defaultHeight.ToString(CultureInfo.InvariantCulture), true);
};
CDHeightSlider.OnValueChanged += _ =>
{
if (Profile is null)
return;
var prototype = _prototypeManager.Index<SpeciesPrototype>(Profile.Species);
var prototype = _prototypeManager.Index(Profile.Species);
var newHeight = MathF.Round(MathHelper.Lerp(prototype.MinHeight, prototype.MaxHeight, CDHeightSlider.Value), 2);
CDHeight.Text = newHeight.ToString(CultureInfo.InvariantCulture);
var speciesScale = prototype.BaseScale.Y;
CDHeightLabel.Text = UnitConversion.GetMetricAndImperialDisplayFromScale(newHeight * speciesScale);
CDPullSpeedReductionLabel.Text = SmallCharacterSystem.GetPullSpeedPenaltyDisplayFromScale(newHeight);
SetProfileHeight(newHeight);
};
@@ -88,9 +88,9 @@ public sealed partial class CryoPodWindow : FancyWindow
// Health analyzer
var maybePatient = _entityManager.GetEntity(msg.Health.TargetEntity);
var hasPatient = msg.Health.TargetEntity.HasValue;
var hasDamage = hasPatient && msg.HasDamage;
// var hasDamage = hasPatient && msg.HasDamage; // DeltaV - Health Analyzer Plus
NoDamageText.Visible = (hasPatient && !hasDamage);
NoDamageText.Visible = false; //(hasPatient && !hasDamage); // DeltaV - Health Analyzer Plus
HealthSection.Visible = hasPatient;
EjectPatientButton.Disabled = !hasPatient;
@@ -1,9 +1,8 @@
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:customControls="clr-namespace:Content.Client.Administration.UI.CustomControls"
xmlns:chassisSpriteControls="clr-namespace:Content.Client._CD.Silicons.Borgs.UI"
Title="{Loc 'borg-select-type-menu-title'}"
SetSize="600 480">
SetSize="550 300">
<BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal" VerticalExpand="True">
<!-- Left pane: selection of borg type -->
@@ -30,9 +29,6 @@
<RichTextLabel Name="DescriptionLabel" VerticalExpand="True" VerticalAlignment="Top" />
</BoxContainer>
</Control>
<chassisSpriteControls:ChassisSpriteSelection Name="ChassisSpriteSelection"/> <!-- CD change -->
<controls:ConfirmButton Name="ConfirmTypeButton" Text="{Loc 'borg-select-type-menu-confirm'}"
Disabled="True" HorizontalAlignment="Right"
MinWidth="200" />
@@ -1,7 +1,6 @@
using System.Linq;
using Content.Client.UserInterface.Controls;
using Content.Client.UserInterface.Systems.Guidebook;
using Content.Shared._CD.Silicons; // CosmicDrift
using Content.Shared.Guidebook;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
@@ -30,7 +29,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
private BorgTypePrototype? _selectedBorgType;
public event Action<ProtoId<BorgTypePrototype>>? ConfirmedBorgType;
public event Action<EntityPrototype?>? ConfirmedBorgSubtype; // CosmicDrift event - borg subtypes
private static readonly List<ProtoId<GuideEntryPrototype>> GuidebookEntries = new() { "Cyborgs", "Robotics" };
@@ -58,13 +56,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
ConfirmTypeButton.OnPressed += ConfirmButtonPressed;
HelpGuidebookIds = GuidebookEntries;
// Start CosmicDrift Changes - borg subtypes
ChassisSpriteSelection.SubtypeSelected += () =>
{
ConfirmTypeButton.Disabled = false;
};
// End CosmicDrift Changes - borg subtypes
}
private void UpdateInformation(BorgTypePrototype prototype)
@@ -96,14 +87,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
NameLabel.Text = PrototypeName(prototype);
DescriptionLabel.Text = Loc.GetString($"borg-type-{prototype.ID}-desc");
ChassisView.SetPrototype(prototype.DummyPrototype);
// Start CosmicDrift Changes - borg subtypes
if (_selectedBorgType != null)
{
ConfirmTypeButton.Disabled = true;
ChassisSpriteSelection.Update(_selectedBorgType);
}
// End CosmicDrift Changes - borg subtypes
}
private void ConfirmButtonPressed(BaseButton.ButtonEventArgs obj)
@@ -111,7 +94,6 @@ public sealed partial class BorgSelectTypeMenu : FancyWindow
if (_selectedBorgType == null)
return;
ConfirmedBorgSubtype?.Invoke(ChassisSpriteSelection.SubtypePrototype); // CosmicDrift
ConfirmedBorgType?.Invoke(_selectedBorgType);
}
@@ -1,6 +1,4 @@
using Content.Shared._CD.Silicons; // CosmicDrift
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift
using Content.Shared.Silicons.Borgs.Components;
using Content.Shared.Silicons.Borgs.Components;
using JetBrains.Annotations;
using Robust.Client.UserInterface;
@@ -28,6 +26,5 @@ public sealed class BorgSelectTypeUserInterface : BoundUserInterface
_menu = this.CreateWindow<BorgSelectTypeMenu>();
_menu.ConfirmedBorgType += prototype => SendPredictedMessage(new BorgSelectTypeMessage(prototype));
_menu.ConfirmedBorgSubtype += subtypePrototype => SendPredictedMessage(new BorgSelectSubtypeMessage(subtypePrototype?.ID)); // CosmicDrift - borg subtypes
}
}
@@ -1,12 +1,9 @@
using Content.Client.PDA; // DeltaV
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift
using Content.Client.PDA; // DeltaV
using Content.Shared.Movement.Components;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Client.GameObjects;
using Robust.Client.ResourceManagement; // CosmicDrift
using Robust.Shared.Serialization.TypeSerializers.Implementations; // CosmicDrift
using Robust.Shared.Timing; // CosmicDrift
using Robust.Shared.Serialization; // DeltaV
namespace Content.Client.Silicons.Borgs;
@@ -20,7 +17,6 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
[Dependency] private readonly BorgSystem _borgSystem = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly IGameTiming _timing = default!; // CosmicDrift - borg subtypes
public override void Initialize()
{
@@ -44,20 +40,15 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
Entity<BorgSwitchableTypeComponent> entity,
BorgTypePrototype prototype)
{
// Begin Afterlight Addition - added checks to stop sprite state errors
if (!_timing.IsFirstTimePredicted)
return;
if (TryComp<BorgSwitchableSubtypeComponent>(entity, out var subtype) &&
subtype.BorgSubtype != null)
{
var ev = new TypeTryingToUpdateVisualsEvent();
RaiseLocalEvent(entity, ref ev);
return;
}
// End Afterlight Additions - added checks to stop sprite state errors
// Begin DeltaV Additions
if (prototype.ClientComponents is {} add)
EntityManager.AddComponents(entity, add);
// End DeltaV Additions
if (TryComp(entity, out SpriteComponent? sprite))
{
// Begin DeltaV Additions - work around engine bug with AddComponents
((ISerializationHooks) sprite).AfterDeserialization();
// End DeltaV Additions
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.Body, prototype.SpriteBodyState);
_sprite.LayerSetRsiState((entity, sprite), BorgVisualLayers.LightStatus, prototype.SpriteToggleLightState);
}
@@ -85,26 +76,6 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
}
// DeltaV - borg pdas
// Start CosmicDrift Changes - borg subtypes
if (prototype.SpriteBodyMovementState is { } movementState)
{
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
spriteMovement.NoMovementLayers.Clear();
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
{
State = prototype.SpriteBodyState,
};
spriteMovement.MovementLayers.Clear();
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
{
State = movementState,
};
}
else
{
RemComp<SpriteMovementComponent>(entity);
}
// End CosmicDrift Changes - borg subtypes
base.UpdateEntityAppearance(entity, prototype);
}
}
@@ -49,11 +49,6 @@
<Control HorizontalExpand="True" />
<Label Name="RecordContainerSpecies" Align="Right" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-height'}"/>
<Control HorizontalExpand="True" />
<Label Name="RecordContainerHeight" Align="Right" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}"/>
<Control HorizontalExpand="True" />
@@ -325,8 +325,7 @@ public sealed partial class CharacterRecordViewer : FancyWindow
RecordContainerJob.Text = record.JobTitle; /* At some point in the future we might want to display the icon */
RecordContainerGender.Text = record.Gender.ToString();
RecordContainerSpecies.Text = record.Species;
RecordContainerHeight.Text = cr.Height + " " + UnitConversion.GetImperialDisplayLength(cr.Height);
RecordContainerWeight.Text = cr.Weight + " " + UnitConversion.GetImperialDisplayMass(cr.Weight);
RecordContainerWeight.Text = $"{cr.Weight} ({UnitConversion.GetImperialDisplayMass(cr.Weight)})";
RecordContainerContactName.SetValue(cr.EmergencyContactName);
RecordContainerEmployment.Visible = false;
@@ -5,12 +5,6 @@
<BoxContainer Orientation="Vertical" HorizontalExpand="True" Margin="10">
<!-- Height, Weight -->
<GridContainer Columns="2">
<BoxContainer HorizontalExpand="True" SeparationOverride="2">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-height'}" />
<Control HorizontalExpand="True" MinSize="5 0" />
<LineEdit Name="HeightEdit" HorizontalAlignment="Right" MinSize="60 0" />
<Label Name="HeightImperialLabel" MinWidth="60" />
</BoxContainer>
<BoxContainer HorizontalExpand="True" SeparationOverride="2">
<Label Text="{Loc 'humanoid-profile-editor-cd-records-weight'}" />
<Control HorizontalExpand="True" MinSize="5 0" />
@@ -25,14 +25,6 @@ public sealed partial class RecordEditorGui : Control
#region General
HeightEdit.OnTextChanged += args =>
{
if (!int.TryParse(args.Text, out var newHeight))
return;
UpdateImperialHeight(newHeight);
UpdateRecords(_records.WithHeight(newHeight));
};
WeightEdit.OnTextChanged += args =>
{
if (!int.TryParse(args.Text, out var newWeight))
@@ -128,8 +120,6 @@ public sealed partial class RecordEditorGui : Control
private void UpdateWidgets()
{
HeightEdit.SetText(_records.Height.ToString());
UpdateImperialHeight(_records.Height);
WeightEdit.SetText(_records.Weight.ToString());
UpdateImperialWeight(_records.Weight);
ContactNameEdit.SetText(_records.EmergencyContactName);
@@ -143,13 +133,8 @@ public sealed partial class RecordEditorGui : Control
PostmortemEdit.SetText(_records.PostmortemInstructions);
}
private void UpdateImperialHeight(int newHeight)
{
HeightImperialLabel.Text = UnitConversion.GetImperialDisplayLength(newHeight);
}
private void UpdateImperialWeight(int newWeight)
{
WeightImperialLabel.Text = UnitConversion.GetImperialDisplayMass(newWeight);
WeightImperialLabel.Text = $"({UnitConversion.GetImperialDisplayMass(newWeight)})";
}
}
@@ -2,15 +2,47 @@ namespace Content.Client._CD.Records.UI;
public static class UnitConversion
{
/// <summary>
/// DeltaV - The average height of a human in centimeters. According to the US CDC, its
/// 171 for men and 160 for women. So average of that is ~165cm.
///
/// Just kidding, we're going with EE's arbitrary standard of 175cm.
/// </summary>
private const int AVERAGE_HEIGHT_CM = 175;
/// <summary>
/// DeltaV - 1.0 scale is considered average for humans, so a scale of 1 will be 175cm.
/// Ensure that scale also includes the base species height AND the user-defined height.
/// </summary>
/// <param name="scale"></param>
/// <returns></returns>
private static int GetMetricHeightFromScale(float scale = 1)
{
// cast as int because we don't care about decimal
return (int)Math.Max(scale * AVERAGE_HEIGHT_CM, 1); // can't be shorter than 1cm I guess
}
/// <summary>
/// DeltaV - Gets nicely formatted string that contains both metric and imperial measurements.
/// With a scale of 1, it should look like... 175cm (5' 9")
/// </summary>
/// <param name="scale"></param>
/// <returns></returns>
public static string GetMetricAndImperialDisplayFromScale(float scale = 1)
{
var metricHeight = GetMetricHeightFromScale(scale);
return $"{metricHeight}cm ({GetImperialDisplayLength(metricHeight)})";
}
public static string GetImperialDisplayLength(int lengthCm)
{
var heightIn = (int) Math.Round(lengthCm * 0.3937007874 /* cm to in*/);
return $"({heightIn / 12}'{heightIn % 12}'')";
var heightIn = (int)Math.Round(lengthCm * 0.3937007874 /* cm to in*/);
return $"{heightIn / 12}'{heightIn % 12}\"";
}
public static string GetImperialDisplayMass(int massKg)
{
var weightLbs = (int) Math.Round(massKg * 2.2046226218 /* kg to lbs */);
return $"({weightLbs} lbs)";
var weightLbs = (int)Math.Round(massKg * 2.2046226218 /* kg to lbs */);
return $"{weightLbs} lbs";
}
}
@@ -1,102 +0,0 @@
using System.Linq;
using Content.Client.Silicons.Borgs;
using Content.Shared._CD.Silicons.Borgs;
using Content.Shared.Movement.Components;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Client.GameObjects;
using Robust.Shared.Prototypes;
namespace Content.Client._CD.Silicons.Borgs;
/// <summary>
/// Primarily handles the appearance aspects of the borg subtype.
/// </summary>
public sealed class BorgSwitchableSubtypeSystem : SharedBorgSwitchableSubtypeSystem
{
[Dependency] private readonly SpriteSystem _sprite = default!;
[Dependency] private readonly BorgSystem _borg = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, ComponentStartup>(OnComponentStartup);
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, AfterAutoHandleStateEvent>(OnAutoHandleEvent);
}
private void OnAutoHandleEvent(Entity<BorgSwitchableSubtypeComponent> ent, ref AfterAutoHandleStateEvent args)
{
SelectBorgSubtype(ent);
}
private void OnComponentStartup(Entity<BorgSwitchableSubtypeComponent> ent, ref ComponentStartup args)
{
SelectBorgSubtype(ent);
}
protected override void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity, EntityPrototype borgSubtypePrototype)
{
// LOT of copy pasted code from BorgSwitchableTypeSystem, but is probably necessary unless the upstream code
// is refactored
if (!borgSubtypePrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
return;
// get our required components
var (owner, _) = entity;
if (!TryComp<SpriteComponent>(entity, out var chassisSprite))
return;
// remove all existing layers
for (int i = chassisSprite.AllLayers.Count() - 1; i >= 0; i--)
{
_sprite.RemoveLayer((entity, chassisSprite), i);
}
for (int i = 0; i < borgSubtype.LayerData.Length; i++)
{
var layerData = borgSubtype.LayerData[i];
layerData.RsiPath = borgSubtype.SpritePath?.ToString();
if (borgSubtype.Offset != null)
layerData.Offset = borgSubtype.Offset;
_sprite.AddLayer((owner, chassisSprite), layerData, i);
}
if (TryComp<BorgChassisComponent>(entity, out var chassis))
{
_borg.SetMindStates(
(entity.Owner, chassis),
borgSubtype.SpriteHasMindState,
borgSubtype.SpriteNoMindState);
if (TryComp(entity, out AppearanceComponent? appearance))
{
// Queue update so state changes apply.
_appearance.QueueUpdate(entity, appearance);
}
}
if (borgSubtype.SpriteBodyMovementState is { } movementState)
{
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
spriteMovement.NoMovementLayers.Clear();
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
{
State = borgSubtype.SpriteBodyState,
};
spriteMovement.MovementLayers.Clear();
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
{
State = movementState,
};
}
else
{
RemComp<SpriteMovementComponent>(entity);
}
base.UpdateEntityAppearance(entity, borgSubtypePrototype);
}
}
@@ -1,23 +0,0 @@
<Control xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls">
<BoxContainer Name="MainContainer"
Orientation="Vertical"
SeparationOverride="4"
Visible="False">
<controls:StripeBack>
<Label Text="{Loc 'cd-borg-select-subtype-flavour-text'}"
StyleClasses="LabelSubText"
HorizontalAlignment="Center"
Margin="0 12"/>
</controls:StripeBack>
<ScrollContainer Name="OptionsScrollContainer"
HScrollEnabled="True"
VScrollEnabled="False"
MinHeight="96">
<BoxContainer Name="OptionsContainer"
Orientation="Horizontal"
SeparationOverride="4"/>
</ScrollContainer>
</BoxContainer>
</Control>
@@ -1,99 +0,0 @@
using Content.Shared.Silicons.Borgs;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes;
namespace Content.Client._CD.Silicons.Borgs.UI;
[GenerateTypedNameReferences]
public sealed partial class ChassisSpriteSelection : Control
{
[Dependency] private readonly IComponentFactory _componentFactory = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public EntityPrototype? SubtypePrototype;
public event Action? SubtypeSelected;
private const int PrototypeViewSize = 2;
private static readonly ProtoId<EntityCategoryPrototype> _borgSubtypeCategory = "BorgSubtype";
public ChassisSpriteSelection()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
}
public void Update(BorgTypePrototype borgTypePrototype)
{
MainContainer.Visible = true;
OptionsContainer.RemoveAllChildren();
var buttonGroup = new ButtonGroup();
List<Button> buttons = new List<Button>();
buttons.Add(CreateDefaultSubtypeButton(borgTypePrototype, buttonGroup));
foreach (var ent in _prototype.Categories.GetValueRefOrNullRef(_borgSubtypeCategory))
{
if (!ent.TryGetComponent<Shared._CD.Silicons.Borgs.BorgSubtypeDefinitionComponent>(out var subtype, _componentFactory))
continue;
// Only add subtypes of the current selected 'main' borg type (engineering, medical, etc.)
if (subtype.ParentType != borgTypePrototype.ID)
continue;
var button = new Button
{
ToolTip = Loc.GetString($"al-borg-{borgTypePrototype.ID}-subtype-{ent.Name.Replace(' ', '-').ToLower()}-name"),
Group = buttonGroup,
MinHeight = 32,
};
button.OnPressed += _ =>
{
SubtypePrototype = ent;
SubtypeSelected?.Invoke();
};
button.AddChild(CreateEntityPrototypeView(subtype.DummyPrototype));
buttons.Add(button);
}
foreach (var button in buttons)
{
OptionsContainer.AddChild(button);
}
}
private Button CreateDefaultSubtypeButton(BorgTypePrototype borgTypePrototype, ButtonGroup group)
{
var button = new Button
{
ToolTip = "default",
Group = group,
MinHeight = 32,
};
button.OnPressed += _ =>
{
SubtypePrototype = null;
SubtypeSelected?.Invoke();
};
button.AddChild(CreateEntityPrototypeView(borgTypePrototype.DummyPrototype));
return button;
}
private EntityPrototypeView CreateEntityPrototypeView(EntProtoId entProtoId)
{
var entPrototypeView = new EntityPrototypeView();
entPrototypeView.SetPrototype(entProtoId);
entPrototypeView.Scale *= PrototypeViewSize;
return entPrototypeView;
}
}
@@ -0,0 +1,104 @@
using System.Numerics;
using Content.Client.Graphics;
using Robust.Client.Graphics;
using Robust.Shared.Enums;
using Robust.Shared.Prototypes;
namespace Content.Client._DV.Overlays;
/// <summary>
/// Makes darkness visible, and bright lights painfully visible
/// Tweakable. Algo is max((light*gain)^exp, lightFloor)
/// </summary>
public sealed class DarkVisionOverlay : Overlay
{
[Dependency] private readonly IClyde _clyde = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public override OverlaySpace Space => OverlaySpace.WorldSpaceBelowWorld;
private readonly ProtoId<ShaderPrototype> _shaderProto = "DarkVision";
public float LightFloor = 0.5f;
public float LightGain = 2f;
public float LightExp = 1f;
private readonly ShaderInstance _copyShader;
private readonly ShaderInstance _remapShader;
private readonly OverlayResourceCache<CachedResources> _resources = new();
public DarkVisionOverlay()
{
IoCManager.InjectDependencies(this);
var proto = _prototype.Index<ShaderPrototype>(_shaderProto);
_remapShader = proto.InstanceUnique();
// With floor 0, gain 1, exp 1 the shader is an exact blend-mode-none copy.
_copyShader = proto.InstanceUnique();
_copyShader.SetParameter("lightFloor", 0f);
_copyShader.SetParameter("lightGain", 1f);
_copyShader.SetParameter("lightExp", 1f);
}
protected override void Draw(in OverlayDrawArgs args)
{
var viewport = args.Viewport;
var worldHandle = args.WorldHandle;
if (viewport.Eye == null)
return;
var lightTarget = viewport.LightRenderTarget;
var res = _resources.GetForViewport(viewport, static _ => new CachedResources());
if (res.ScratchTarget?.Size != lightTarget.Size)
{
res.ScratchTarget?.Dispose();
res.ScratchTarget = _clyde.CreateLightRenderTarget(lightTarget.Size, "darkvision-scratch", depthStencil: false);
}
var bounds = args.WorldBounds;
var lightScale = lightTarget.Size / (Vector2) viewport.Size;
var scale = viewport.RenderScale / (Vector2.One / lightScale);
var localMatrix = lightTarget.GetWorldToLocalMatrix(viewport.Eye, scale);
// Copy the light buffer aside first: a texture can't be sampled while it is also the
// render target being drawn into.
worldHandle.RenderInRenderTarget(res.ScratchTarget, () =>
{
worldHandle.UseShader(_copyShader);
worldHandle.SetTransform(localMatrix);
worldHandle.DrawTextureRect(lightTarget.Texture, bounds);
worldHandle.UseShader(null);
}, Color.Black);
// Then write it back through the remap.
_remapShader.SetParameter("lightFloor", LightFloor);
_remapShader.SetParameter("lightGain", LightGain);
_remapShader.SetParameter("lightExp", LightExp);
worldHandle.RenderInRenderTarget(lightTarget, () =>
{
worldHandle.UseShader(_remapShader);
worldHandle.SetTransform(localMatrix);
worldHandle.DrawTextureRect(res.ScratchTarget.Texture, bounds);
worldHandle.UseShader(null);
}, null);
}
protected override void DisposeBehavior()
{
_resources.Dispose();
base.DisposeBehavior();
}
private sealed class CachedResources : IDisposable
{
public IRenderTexture? ScratchTarget;
public void Dispose()
{
ScratchTarget?.Dispose();
}
}
}
@@ -0,0 +1,56 @@
using Content.Shared._DV.Overlays.Components;
using Robust.Client.Graphics;
using Robust.Shared.Player;
namespace Content.Client._DV.Overlays;
public sealed class DarkVisionSystem : EntitySystem
{
[Dependency] private readonly IOverlayManager _overlayMan = default!;
[Dependency] private readonly ISharedPlayerManager _playerMan = default!;
private DarkVisionOverlay _overlay = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<DarkVisionComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<DarkVisionComponent, ComponentShutdown>(OnShutdown);
SubscribeLocalEvent<DarkVisionComponent, LocalPlayerAttachedEvent>(OnPlayerAttached);
SubscribeLocalEvent<DarkVisionComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
_overlay = new();
}
private void OnInit(Entity<DarkVisionComponent> ent, ref ComponentInit args)
{
if (ent.Owner == _playerMan.LocalEntity)
EnableOverlay(ent.Comp);
}
private void OnShutdown(Entity<DarkVisionComponent> ent, ref ComponentShutdown args)
{
if (ent.Owner == _playerMan.LocalEntity)
_overlayMan.RemoveOverlay(_overlay);
}
private void OnPlayerAttached(Entity<DarkVisionComponent> ent, ref LocalPlayerAttachedEvent args)
{
EnableOverlay(ent.Comp);
}
private void OnPlayerDetached(Entity<DarkVisionComponent> ent, ref LocalPlayerDetachedEvent args)
{
_overlayMan.RemoveOverlay(_overlay);
}
private void EnableOverlay(DarkVisionComponent comp)
{
_overlay.LightFloor = comp.LightFloor;
_overlay.LightGain = comp.LightGain;
_overlay.LightExp = comp.LightExp;
if (!_overlayMan.HasOverlay<DarkVisionOverlay>())
_overlayMan.AddOverlay(_overlay);
}
}
@@ -1,4 +1,5 @@
using Content.Server.Administration.Managers;
using Content.Shared._DV.Administration.Components; // DeltaV - Unorbitable
using Content.Shared.Administration;
using Robust.Shared.Console;
using Robust.Shared.Utility;
@@ -6,7 +7,7 @@ using Robust.Shared.Utility;
namespace Content.Server.Administration.Commands;
[AdminCommand(AdminFlags.Stealth)]
public sealed class StealthminCommand : LocalizedCommands
public sealed class StealthminCommand : LocalizedEntityCommands // DeltaV - Unorbitable, LocalizedCommands to LocalizedEntityCommands
{
[Dependency] private readonly IAdminManager _adminManager = default!;
@@ -26,8 +27,20 @@ public sealed class StealthminCommand : LocalizedCommands
DebugTools.AssertNotNull(adminData);
if (!adminData!.Stealth)
{
_adminManager.Stealth(player);
// DeltaV - Unorbitable START
if (player.AttachedEntity is { } attachedEntity)
EntityManager.EnsureComponent<UnorbitableComponent>(attachedEntity);
// DeltaV END
}
else
{
_adminManager.UnStealth(player);
// DeltaV - Unorbitable START
if (player.AttachedEntity is { } attachedEntity)
EntityManager.RemoveComponent<UnorbitableComponent>(attachedEntity);
// DeltaV END
}
}
}
@@ -1,3 +1,4 @@
using Content.Server.RoundEnd; // DeltaV
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Server.GameTicking.Rules.Components;
@@ -43,4 +44,16 @@ public sealed partial class XenoborgsRuleComponent : Component
/// </summary>
[DataField]
public bool XenoborgShuttleCalled = false;
/// <summary>
/// DeltaV - The behavior of the round if the mothership core is deleted.
/// </summary>
[DataField]
public RoundEndBehavior XenoborgRoundEndBehavior = RoundEndBehavior.BecomeSurvival;
/// <summary>
/// DeltaV - The amount of time before the evac shuttle will arrive if the XenoborgRoundEndBehavior is set to ShuttleCall.
/// </summary>
[DataField]
public TimeSpan XenoborgShuttleDelay = TimeSpan.FromMinutes(10);
}
@@ -30,10 +30,20 @@ public sealed partial class ZombieRuleComponent : Component
/// <summary>
/// DeltaV - The behavior of the round if all zombies are defeated.
/// </summary>
[DataField]
public RoundEndBehavior ZombieRoundEndBehavior = RoundEndBehavior.BecomeSurvival;
/// <summary>
/// DeltaV - The amount of time before the evac shuttle will arrive if the ZombieRoundEndBehavior is set to ShuttleCall.
/// </summary>
[DataField]
public TimeSpan ZombieShuttleDelay = TimeSpan.FromMinutes(10);
/// <summary>
/// DeltaV - If true, ZombieRuleSystem will do the ZombieRoundEndBehavior if zombies are defeated.
/// This is needed because ZombieOutbreak uses the ZombieRuleComponent but the system won't know if
/// it was roundstart or not.
/// </summary>
[DataField]
public bool IsRoundStartZombies = false;
}
@@ -520,18 +520,17 @@ public sealed class NukeopsRuleSystem : GameRuleSystem<NukeopsRuleComponent>
// BEGIN DeltaV - Detect Nukie Failure Better
// We need to use a EntityQueryEnumerator instead of a EntityQuery, because we need the uid to check for cuffs
var operatives = new List<Entity<NukeOperativeComponent, MobStateComponent, TransformComponent>>();
var operativesEnumerator = EntityQueryEnumerator<NukeOperativeComponent, MobStateComponent, TransformComponent>();
while (operativesEnumerator.MoveNext(out var uid, out var nukeOp, out var mobState, out var transform))
var operatives = new List<Entity<NukeOperativeComponent, MobStateComponent>>();
var operativesEnumerator = EntityQueryEnumerator<NukeOperativeComponent, MobStateComponent>();
while (operativesEnumerator.MoveNext(out var uid, out var nukeOp, out var mobState))
{
operatives.Add((uid, nukeOp, mobState, transform));
operatives.Add((uid, nukeOp, mobState));
}
var operativesAlive = operatives
.Where(op => op.Comp3.MapID == shuttleMapId
|| op.Comp3.MapID == targetStationMap)
.Any(op => op.Comp2.CurrentState == MobState.Alive && op.Comp1.Running &&
!TryComp<CuffableComponent>(op, out _)); // in the case the crew keeps one alive
.Any(op => op.Comp1.Running
&& op.Comp2.CurrentState == MobState.Alive
&& TryComp<CuffableComponent>(op, out var cuffable) && cuffable.CuffedHandCount == 0); // in the case the crew keeps one alive
// END DeltaV
if (operativesAlive)
@@ -42,6 +42,14 @@ public sealed class XenoborgsRuleSystem : GameRuleSystem<XenoborgsRuleComponent>
colorOverride: AnnouncmentColor);
ent.Comp.MothershipCoreDeathAnnouncmentSent = true;
// BEGIN DeltaV - Convert to Survival
if (ent.Comp.XenoborgRoundEndBehavior != RoundEndBehavior.Nothing)
{
_roundEnd.DoRoundEndBehavior(ent.Comp.XenoborgRoundEndBehavior, ent.Comp.XenoborgShuttleDelay);
ent.Comp.XenoborgRoundEndBehavior = RoundEndBehavior.Nothing;
}
// END DeltaV
}
// TODO: Refactor the end of round text
@@ -115,29 +115,30 @@ public sealed class ZombieRuleSystem : GameRuleSystem<ZombieRuleComponent>
/// </summary>
private void CheckRoundEnd(ZombieRuleComponent zombieRuleComponent)
{
// BEGIN DeltaV - Change mode to survival if zombies die
// Zombies have failed to launch and the mode has been switched to survival
if (zombieRuleComponent.ZombieRoundEndBehavior == RoundEndBehavior.Nothing)
return;
// END DeltaV
var healthy = GetHealthyHumans();
if (healthy.Count == 1) // Only one human left. spooky
_popup.PopupEntity(Loc.GetString("zombie-alone"), healthy[0], healthy[0]);
// BEGIN DeltaV - Change mode to survival if zombies die
var anyInitialInfectedAlive = EntityQuery<InitialInfectedComponent, MobStateComponent>(false)
.Any(x => x.Item2.CurrentState != MobState.Dead);
var anyLivingZombies = EntityQuery<ZombieComponent, MobStateComponent>(false)
.Any(x => x.Item2.CurrentState != MobState.Dead);
var anyPendingZombies = EntityQuery<PendingZombieComponent>(false).Any();
// All II turned/dead, all entities that have turned are dead, and there are no more pending zombies
if (!anyInitialInfectedAlive && !anyLivingZombies && !anyPendingZombies)
if (zombieRuleComponent.IsRoundStartZombies)
{
_roundEnd.DoRoundEndBehavior(zombieRuleComponent.ZombieRoundEndBehavior, zombieRuleComponent.ZombieShuttleDelay);
zombieRuleComponent.ZombieRoundEndBehavior = RoundEndBehavior.Nothing; // stop this check in the future
// Zombies have failed to launch and the mode has been switched to survival
if (zombieRuleComponent.ZombieRoundEndBehavior == RoundEndBehavior.Nothing)
return;
// BEGIN DeltaV - Change mode to survival if zombies die
var anyInitialInfectedAlive = EntityQuery<InitialInfectedComponent, MobStateComponent>(false)
.Any(x => x.Item2.CurrentState != MobState.Dead);
var anyLivingZombies = EntityQuery<ZombieComponent, MobStateComponent>(false)
.Any(x => x.Item2.CurrentState != MobState.Dead);
var anyPendingZombies = EntityQuery<PendingZombieComponent>(false).Any();
// All II turned/dead, all entities that have turned are dead, and there are no more pending zombies
if (!anyInitialInfectedAlive && !anyLivingZombies && !anyPendingZombies)
{
_roundEnd.DoRoundEndBehavior(zombieRuleComponent.ZombieRoundEndBehavior, zombieRuleComponent.ZombieShuttleDelay);
zombieRuleComponent.ZombieRoundEndBehavior = RoundEndBehavior.Nothing; // stop this check in the future
}
}
// END DeltaV
+7
View File
@@ -29,6 +29,7 @@ using Content.Shared.Movement.Systems;
using Content.Shared.NameModifier.EntitySystems;
using Content.Shared.Popups;
using Content.Server.Preferences.Managers; // DeltaV
using Content.Shared._DV.Administration.EntitySystems; // DeltaV - Unorbitable
using Content.Shared.Storage.Components;
using Content.Shared.Tag;
using Content.Shared.Warps;
@@ -75,6 +76,7 @@ namespace Content.Server.Ghost
[Dependency] private readonly GhostSpriteStateSystem _ghostState = default!;
[Dependency] private readonly IServerPreferencesManager _preferencesManager = default!; // DeltaV
[Dependency] private readonly IAdminManager _admin = default!; // DeltaV
[Dependency] private readonly UnorbitableSystem _unorbitable = default!; // DeltaV - Unorbitable
private EntityQuery<GhostComponent> _ghostQuery;
private EntityQuery<PhysicsComponent> _physicsQuery;
@@ -341,6 +343,11 @@ namespace Content.Server.Ghost
return;
}
// DeltaV - Unorbitable START
if (!_unorbitable.CanFollow(attached, realTarget))
return;
// DeltaV END
WarpTo(attached, realTarget);
}
@@ -23,6 +23,7 @@ using Content.Server.Body.Systems;
// Begin DeltaV
using Content.Server._DV.MedicalRecords;
using Content.Shared._DV.MedicalRecords;
using Content.Shared.Chemistry.Components;
// End DeltaV
namespace Content.Server.Medical;
@@ -269,9 +270,11 @@ public sealed partial class HealthAnalyzerSystem : EntitySystem // DeltaV - Made
var bleeding = false;
var unrevivable = false;
Solution? bloodSolution = null; // DeltaV - Health Analyzer Plus
if (TryComp<BloodstreamComponent>(entity, out var bloodstream) &&
_solutionContainerSystem.ResolveSolution(entity, bloodstream.BloodSolutionName,
ref bloodstream.BloodSolution, out var bloodSolution))
ref bloodstream.BloodSolution, out bloodSolution)) // DeltaV - Health Analyzer Plus
{
bloodAmount = _bloodstreamSystem.GetBloodLevel(entity);
bleeding = bloodstream.BleedAmount > 0;
@@ -287,6 +290,7 @@ public sealed partial class HealthAnalyzerSystem : EntitySystem // DeltaV - Made
null,
bleeding,
unrevivable,
bloodSolution, // DeltaV - Health Analyzer Plus
_medicalRecords.GetMedicalRecords(entity) // DeltaV - Medical Records
);
}
@@ -125,12 +125,12 @@ public sealed class ProjectileSystem : SharedProjectileSystem
RaiseLocalEvent(projectile, ref pierceEv);
// If the object won't be destroyed, it "tanks" the penetration hit.
if (damage.GetTotal() < damageRequired)
if (damage.GetTotal() < damageRequired && !pierceEv.Pierced) // DeltaV - Addition of the NT-3
{
return false;
}
if (!projectile.Comp.ProjectileSpent)
if (!projectile.Comp.ProjectileSpent && !pierceEv.Pierced) // DeltaV - Addition of the NT-3
{
projectile.Comp.PenetrationAmount += damageRequired;
// The projectile has dealt enough damage to be spent.
@@ -139,7 +139,7 @@ public sealed class ProjectileSystem : SharedProjectileSystem
return false;
}
if (projectile.Comp.ProjectileSpent && pierceEv.Pierced) // DeltaV - Addition of the NT-3
if (projectile.Comp.ProjectileSpent)
{
return true;
}
@@ -41,7 +41,8 @@ namespace Content.Server.StationEvents
if (TryComp<NextEventComponent>(uid, out var nextEventComponent)
&& _event.TryGenerateRandomEvent(component.ScheduledGameRules, TimeSpan.FromSeconds(component.TimeUntilNextEvent)) is {} firstEvent)
{
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("seconds", (int)component.TimeUntilNextEvent)));
var nextEventTime = GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent);
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
_next.UpdateNextEvent(nextEventComponent, firstEvent, GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent));
}
// End DeltaV Additions
@@ -81,7 +82,7 @@ namespace Content.Server.StationEvents
if (_event.TryGenerateRandomEvent(eventScheduler.ScheduledGameRules, nextEventTime) is not {} generatedEvent)
continue;
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("seconds", (int)eventScheduler.TimeUntilNextEvent)));
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
// Cycle the stashed event with the new generated event and time.
var storedEvent = _next.UpdateNextEvent(nextEventComponent, generatedEvent, nextEventTime);
if (string.IsNullOrEmpty(storedEvent)) //If there was no stored event don't try to run it.
@@ -14,9 +14,12 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
[Dependency] private readonly IChatManager _chatManager = default!; // DeltaV
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly EventManagerSystem _event = default!;
#if DEBUG // DeltaV - Only used if built by Debug
[Dependency] private readonly GameTicker _gameTicker = default!;
#endif
[Dependency] private readonly NextEventSystem _next = default!; // DeltaV
[Dependency] private readonly IGameTiming _timing = default!; // DeltaV
/* DeltaV
/// <summary>
/// Returns the ChaosModifier which increases as round time increases to a point.
@@ -50,7 +53,8 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
if (TryComp<NextEventComponent>(uid, out var nextEventComponent)
&& _event.TryGenerateRandomEvent(component.ScheduledGameRules, TimeSpan.FromSeconds(component.TimeUntilNextEvent)) is {} firstEvent)
{
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("seconds", (int)component.TimeUntilNextEvent)));
var nextEventTime = GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent);
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", firstEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
_next.UpdateNextEvent(nextEventComponent, firstEvent, GameTicker.RoundDuration() + TimeSpan.FromSeconds(component.TimeUntilNextEvent));
}
// End DeltaV Additions: init NextEventComp
@@ -83,7 +87,7 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
if (_event.TryGenerateRandomEvent(scheduler.ScheduledGameRules, nextEventTime) is not {} generatedEvent)
continue;
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("seconds", (int)scheduler.TimeUntilNextEvent)));
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-run-event-delayed", ("eventName", generatedEvent), ("time", nextEventTime.ToString(@"hh\:mm\:ss"))));
// Cycle the stashed event with the new generated event and time.
string? storedEvent = _next.UpdateNextEvent(nextEventComponent, generatedEvent, nextEventTime);
if (string.IsNullOrEmpty(storedEvent)) //If there was no stored event don't try to run it.
@@ -114,13 +118,28 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem<RampingS
// Begin DeltaV Additions
var averageTimeUntilNextEvent = component.TimeKeyPoints[0].Y;
var timeUntilNextEventDeviation = _random.NextFloat(-1f, 1f) * component.TimeDeviation;
var roundTime = (float)_gameTicker.RoundDuration().TotalMinutes;
var absoluteTimePoint = 0f;
var ruleActivated = TimeSpan.FromSeconds(0);
if (TryComp<GameRuleComponent>(uid, out var gameRule))
{
ruleActivated = gameRule.ActivatedAt;
}
var ruleTime = _timing.CurTime.Subtract(ruleActivated);
#if DEBUG
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-debug-round-time", ("time", _gameTicker.RoundDuration())));
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-debug-ramping-time", ("time", ruleActivated)));
// This will be what the keypoint system looks at to determine where to start ramping
_chatManager.SendAdminAlert(Loc.GetString("station-event-system-debug-keypoint-time", ("time", ruleTime)));
_chatManager.SendAdminAlert("_______________"); // Easier to read
#endif
var absoluteTimePoint = 0f;
foreach (var point in component.TimeKeyPoints)
{
absoluteTimePoint += point.X;
if (roundTime >= absoluteTimePoint)
if (ruleTime.TotalMinutes >= absoluteTimePoint)
averageTimeUntilNextEvent = point.Y;
}
@@ -1,43 +0,0 @@
using Content.Shared._CD.Silicons.Borgs;
using Content.Shared.Inventory;
namespace Content.Server._CD.Silicons.Borgs;
/// <summary>
/// Server-side logic that shouldn't be exposed to the client.
/// </summary>
public sealed class BorgSwitchableSubstypeSystem : SharedBorgSwitchableSubtypeSystem
{
[Dependency] private readonly InventorySystem _inventorySystem = default!;
protected override void SelectBorgSubtype(Entity<BorgSwitchableSubtypeComponent> ent)
{
if (ent.Comp.BorgSubtype == null)
return;
if (!Prototypes.Index(ent.Comp.BorgSubtype.Value)
.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
return;
// Configure special components
if (Prototypes.TryIndex(ent.Comp.BorgSubtype, out var previousPrototype) &&
previousPrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var previousSubtype, ComponentFactory))
{
if (previousSubtype.AddComponents is { } removeComponents)
EntityManager.RemoveComponents(ent, removeComponents);
}
if (borgSubtype.AddComponents is { } addComponents)
{
EntityManager.AddComponents(ent, addComponents);
}
// inventory template configuration (hats spacing)
if (TryComp(ent, out InventoryComponent? inventory))
{
_inventorySystem.SetTemplateId((ent.Owner, inventory), borgSubtype.InventoryTemplateId);
}
base.SelectBorgSubtype(ent);
}
}
@@ -33,7 +33,7 @@ public sealed partial class GameTicker
public bool ConvertRoundToSurvival()
{
// Ramping scheduler is already added. Do nothing.
if (IsGameRuleActive(RampingSchedulerProto))
if (IsGameRuleAdded(RampingSchedulerProto))
{
_chatManager.SendAdminAlert("RampingStationEventScheduler detected. No rules added.");
return true;
@@ -44,7 +44,7 @@ public sealed partial class GameTicker
var rampingSchedulerStart = _gameTiming.CurTime.Add(GracePeriod);
EnsureComp<DelayedStartRuleComponent>(rampingScheduler).RuleStartTime = rampingSchedulerStart;
_chatManager.SendAdminAlert($"Major antag defeated. Converting to survival at {rampingSchedulerStart}.");
_chatManager.SendAdminAlert($"Major antag defeated. Converting to survival at {(RoundDuration() + GracePeriod).ToString(@"hh\:mm\:ss")}.");
// End Basic Rules
var basicRules = EntityQueryEnumerator<BasicStationEventSchedulerComponent>();
@@ -8,6 +8,7 @@ using Content.Server.NodeContainer.Nodes;
using Content.Shared._DV.NodeCrawl;
using Content.Shared.Atmos;
using Content.Shared.NodeContainer;
using Content.Shared.Polymorph;
using Content.Shared.Zombies;
using Robust.Shared.Reflection;
using Robust.Shared.Utility;
@@ -30,6 +31,7 @@ public sealed class NodeCrawlSystem : SharedNodeCrawlSystem
SubscribeLocalEvent<NodeCrawlerComponent, InhaleLocationEvent>(OnInhaleLocation);
SubscribeLocalEvent<NodeCrawlerComponent, ExhaleLocationEvent>(OnExhaleLocation);
SubscribeLocalEvent<NodeCrawlerComponent, AtmosExposedGetAirEvent>(OnGetAir);
SubscribeLocalEvent<NodeCrawlerComponent, PolymorphActionEvent>(OnPolymorph);
SubscribeLocalEvent<NodeCrawlerComponent, EntityZombifiedEvent>(OnZombify);
}
@@ -222,4 +224,15 @@ public sealed class NodeCrawlSystem : SharedNodeCrawlSystem
ent.Comp.EnterDelay = ent.Comp.ZombieEnterDelay;
Dirty(ent);
}
/// <summary>
/// Exit on polymorph or else the entity's movement bugs out.
/// </summary>
/// <param name="ent"></param>
/// <param name="args"></param>
private void OnPolymorph(Entity<NodeCrawlerComponent> ent, ref PolymorphActionEvent args)
{
if (ent.Comp.Mover.HasValue)
ExitNodeCrawl(ent);
}
}
@@ -1,4 +1,5 @@
using Content.Shared.Tag;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes;
namespace Content.Server._DV.Projectiles.Components;
@@ -21,10 +22,14 @@ public sealed partial class PiercingProjectileComponent : Component
public float PierceCounter;
/// <summary>
/// The tag that will cause the piercing bullet to increment it's <see cref="PierceCounter"/>.
/// The whitelist for checking what increments the <see cref="PierceCounter"/>.
/// </summary>
/// <example>
/// If this has the tag "Wall" in it, any entity with the tag "Wall" will increment <see cref="PierceCounter"/>
/// upon being hit.
/// </example>
[DataField]
public List<ProtoId<TagPrototype>> PierceBlockTag = ["Wall", "Window"];
public EntityWhitelist PierceCounterWhitelist;
/// <summary>
/// The number of entities it is allowed to pierce before being deleted.
@@ -3,7 +3,7 @@ using Content.Shared.FixedPoint;
namespace Content.Server._DV.Projectiles.Events;
/// <summary>
/// Raised when a piercing projectile hits an entity that doesn't follow upstream piercing rules.
/// Raised when a piercing projectile that doesn't follow upstream piercing rules hits an entity.
/// </summary>
[ByRefEvent]
public record struct ProjectilePierceEvent(EntityUid Target, FixedPoint2 RequiredDamage, bool Pierced = false);
@@ -1,29 +1,33 @@
using Content.Server._DV.Projectiles.Components;
using Content.Server._DV.Projectiles.Events;
using Content.Shared.Tag;
using Content.Shared.Whitelist;
namespace Content.Server._DV.Projectiles.Systems;
public sealed class PiercingProjectileSystem : EntitySystem
{
[Dependency] private readonly TagSystem _tagSystem = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
// Mobs return a required Damage amount of Float.MaxValue. Therefore, we need to check for absurdly high values.
private readonly int _indestructibleNumber = 20000000;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PiercingProjectileComponent, ProjectilePierceEvent>(OnPierce);
}
private void OnPierce(Entity<PiercingProjectileComponent> bullet, ref ProjectilePierceEvent args)
{
// If the target doesn't have any tags to stop the bullet from piercing, it's automatically true.
if (!_tagSystem.HasAnyTag(args.Target, bullet.Comp.PierceBlockTag))
if (_whitelist.IsWhitelistFail(bullet.Comp.PierceCounterWhitelist, args.Target))
{
args.Pierced = true;
return;
}
// If it does have the tag to stop it and enough health to count as "strongly armored", it'll block the bullet.
if (bullet.Comp.HealthThreshold < args.RequiredDamage)
if (bullet.Comp.HealthThreshold < args.RequiredDamage && args.RequiredDamage < _indestructibleNumber)
return;
if (bullet.Comp.Direction == null) // Get the direction of the bullet to determine which walls count.
@@ -19,6 +19,7 @@ using Content.Shared._Goobstation.Flashbang;
using Content.Shared._Starlight.Flash.Components;
using Content.Shared.Body.Components;
using Content.Shared.Flash; // Delta V - Flash Work
using Content.Shared._DV.Body.Components; // Delta V - Remove various comps related to breathing
namespace Content.Server._Starlight;
@@ -68,6 +69,8 @@ public sealed class ShadekinSystem : EntitySystem
{
UpdateAlert(uid, component, (short)component.CurrentState);
RemComp<InternalsComponent>(uid);
RemComp<RespiratorComponent>(uid);
RemComp<AffectedByCPRComponent>(uid); // No lungs = no CPR
}
private void OnEyeColorChange(EntityUid uid, ShadekinComponent component, EyeColorInitEvent args)
+1 -32
View File
@@ -1,9 +1,7 @@
using System.Linq;
using System.Numerics;
using Content.Shared._DV.Humanoid;
using Content.Shared._DV.Humanoid; // DeltaV
using Content.Shared.Humanoid.Markings;
using Content.Shared.Humanoid;
using Content.Shared.Sprite;
using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -18,7 +16,6 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly MarkingManager _marking = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly SharedScaleVisualsSystem _scaleVisualsSystem = default!;
public override void Initialize()
{
@@ -28,7 +25,6 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<OrganCopyAppearanceEvent>>(OnMarkingsOrganCopyAppearance);
SubscribeLocalEvent<VisualOrganComponent, BodyRelayedEvent<ApplyOrganProfileDataEvent>>(OnVisualOrganApplyProfile);
SubscribeLocalEvent<VisualOrganMarkingsComponent, BodyRelayedEvent<ApplyOrganMarkingsEvent>>(OnMarkingsOrganApplyMarkings);
SubscribeLocalEvent<HumanoidProfileComponent, ApplyOrganProfileDataEvent>(OnApplyOrganProfileData); // Delta V - Taking the solution from CD
InitializeModifiers();
InitializeInitial();
@@ -100,36 +96,9 @@ public abstract partial class SharedVisualBodySystem : EntitySystem
if (!other.Layer.Equals(ent.Comp.Layer))
return;
// Delta V - Begin Fix Height for Cloning
var height = other.Profile.Height;
if (TryComp<HumanoidProfileComponent>(args.Body.Owner, out var component))
ScaleBody((args.Body.Owner, component), height, height);
// Delta V - End
SetOrganAppearance(ent, other.Data);
}
// Delta V - BEGIN CD Solution
private void OnApplyOrganProfileData(Entity<HumanoidProfileComponent> entity, ref ApplyOrganProfileDataEvent args)
{
var speciesPrototype = _prototype.Index(entity.Comp.Species);
if (args.Base == null)
return;
var height = Math.Clamp(MathF.Round(args.Base.Value.Height, 2), speciesPrototype.MinHeight, speciesPrototype.MaxHeight);
ScaleBody(entity, speciesPrototype.ScaleHeight ? height : 1f, height);
}
private void ScaleBody(Entity<HumanoidProfileComponent> entity, float heightX, float heightY)
{
_scaleVisualsSystem.SetSpriteScale(
entity.Owner,
new Vector2(heightX, heightY)
);
}
// Delta V - END
private void OnMarkingsOrganCopyAppearance(Entity<VisualOrganMarkingsComponent> ent, ref BodyRelayedEvent<OrganCopyAppearanceEvent> args)
{
@@ -392,7 +392,6 @@ public abstract partial class SharedBuckleSystem
if (TryComp<PhysicsComponent>(buckle, out var physics))
_physics.ResetDynamics(buckle, physics);
// TOOD: DV - This fails when you try to buckle the entity you're carrying to something. Figure out why later.
DebugTools.AssertEqual(xform.ParentUid, strap.Owner);
}
+12
View File
@@ -1,5 +1,6 @@
using System.Linq;
using System.Numerics;
using Content.Shared._DV.Administration.EntitySystems; // DeltaV - Unorbitable
using Content.Shared.Administration.Managers;
using Content.Shared.Database;
using Content.Shared.Follower.Components;
@@ -33,6 +34,7 @@ public sealed class FollowerSystem : EntitySystem
[Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!;
[Dependency] private readonly INetManager _netMan = default!;
[Dependency] private readonly ISharedAdminManager _adminManager = default!;
[Dependency] private readonly UnorbitableSystem _unorbitable = default!; // DeltaV - Unorbitable
private static readonly ProtoId<TagPrototype> ForceableFollowTag = "ForceableFollow";
private static readonly ProtoId<TagPrototype> PreventGhostnadoWarpTag = "NotGhostnadoWarpable";
@@ -98,6 +100,11 @@ public sealed class FollowerSystem : EntitySystem
if (ev.User == ev.Target || IsClientSide(ev.Target))
return;
// DeltaV - Unorbitable START
if (!_unorbitable.CanFollow(ev.User, ev.Target))
return;
// DeltaV END
if (HasComp<GhostComponent>(ev.User))
{
var verb = new AlternativeVerb()
@@ -187,6 +194,11 @@ public sealed class FollowerSystem : EntitySystem
if (follower == entity || TerminatingOrDeleted(entity))
return;
// DeltaV - Unorbitable START
if (!_unorbitable.CanFollow(follower, entity))
return;
// DeltaV END
// No recursion for you
var targetXform = Transform(entity);
while (targetXform.ParentUid.IsValid())
@@ -2,8 +2,7 @@ using Content.Shared.Armor; // DeltaV - Addition of HandHeldArmor
using Content.Shared.Atmos;
using Content.Shared.Camera;
using Content.Shared.Cuffs;
using Content.Shared.Damage; // DeltaV End - Addition of HandHeldArmor
using Content.Shared.Damage.Systems; // DeltaV End - Addition of HandHeldArmor
using Content.Shared.Damage.Systems; // DeltaV - Addition of HandHeldArmor
using Content.Shared.Hands.Components;
using Content.Shared.Movement.Systems;
using Content.Shared.Projectiles;
@@ -1,7 +1,9 @@
using System.Numerics; // DeltaV
using Content.Shared.Examine;
using Content.Shared.Humanoid.Prototypes;
using Content.Shared.IdentityManagement;
using Content.Shared.Preferences;
using Content.Shared.Sprite; // DeltaV
using Robust.Shared.GameObjects.Components.Localization;
using Robust.Shared.Prototypes;
@@ -11,6 +13,7 @@ public sealed class HumanoidProfileSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly GrammarSystem _grammar = default!;
[Dependency] private readonly SharedScaleVisualsSystem _scale = default!; // DeltaV
public override void Initialize()
{
@@ -28,6 +31,7 @@ public sealed class HumanoidProfileSystem : EntitySystem
ent.Comp.Age = profile.Age;
ent.Comp.Species = profile.Species;
ent.Comp.Sex = profile.Sex;
ent.Comp.Height = profile.Height; // DeltaV
Dirty(ent);
var sexChanged = new SexChangedEvent(ent.Comp.Sex, profile.Sex);
@@ -37,6 +41,15 @@ public sealed class HumanoidProfileSystem : EntitySystem
{
_grammar.SetGender((ent, grammar), profile.Gender);
}
// START DeltaV - Apply profile/species size
// Assume 1.0 scale unless the original scale exists (blame Allulalo)
var scale = Vector2.One;
if (TryComp<ScaleVisualsComponent>(ent, out var scaledVisuals) && scaledVisuals.OriginalScale is { } originalScale)
scale = originalScale;
_scale.SetSpriteScale(ent, scale);
// END DeltaV
}
private void OnExamined(Entity<HumanoidProfileComponent> ent, ref ExaminedEvent args)
@@ -1,3 +1,4 @@
using System.Numerics; // DeltaV
using Content.Shared.Body;
using Content.Shared.Dataset;
using Content.Shared.Humanoid.Markings;
@@ -111,7 +112,7 @@ public sealed partial class SpeciesPrototype : IPrototype
/// The base height scale for this species
/// </summary>
[DataField("baseScale")]
public System.Numerics.Vector2 BaseScale = new(1f, 1f);
public Vector2 BaseScale = new(1f, 1f);
// End DV - CD Character Records shouldn't nuke species heights
// Begin CD - Character Records
@@ -119,13 +120,13 @@ public sealed partial class SpeciesPrototype : IPrototype
/// The minimum height for this species
/// </summary>
[DataField("minHeight")]
public float MinHeight = 0.9f; // DeltaV - less trolling with the heights
public float MinHeight = 0.8f; // DeltaV
/// <summary>
/// The maximum height for this species
/// </summary>
[DataField("maxHeight")]
public float MaxHeight = 1.1f; // DeltaV - less trolling with the heights
public float MaxHeight = 1.2f; // DeltaV
/// <summary>
/// The default height for this species
@@ -1,4 +1,4 @@
using Content.Shared._DV.Overlays;
using Content.Shared._DV.Overlays; // DeltaV
using Content.Shared._DV.Psionics.Events; // DeltaV
using Content.Shared.Armor;
using Content.Shared.Atmos;
@@ -85,13 +85,15 @@ public partial class InventorySystem
SubscribeLocalEvent<InventoryComponent, WieldAttemptEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, UnwieldAttemptEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, IngestionAttemptEvent>(RefRelayInventoryEvent);
// DeltaV Start - Psionic Events
// DeltaV Start
// Psionic Events
SubscribeLocalEvent<InventoryComponent, DispelledEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, PsionicPowerUseAttemptEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, TargetedByPsionicPowerEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, NoosphericFryEvent>(RefRelayInventoryEvent);
SubscribeLocalEvent<InventoryComponent, WeightlessnessChangedEvent>(RefRelayInventoryEvent); // Heavy Clothing
// DeltaV End - Psionic Events
// Heavy Clothing
SubscribeLocalEvent<InventoryComponent, WeightlessnessChangedEvent>(RefRelayInventoryEvent);
// DeltaV End
// Eye/vision events
SubscribeLocalEvent<InventoryComponent, CanSeeAttemptEvent>(RelayInventoryEvent);
@@ -1,4 +1,5 @@
using Content.Shared._DV.MedicalRecords; // DeltaV - Medical Records
using Content.Shared.Chemistry.Components; // DeltaV - Health Analyzer Plus
using Robust.Shared.Serialization;
namespace Content.Shared.MedicalScanner;
@@ -29,11 +30,12 @@ public struct HealthAnalyzerUiState
public bool? ScanMode;
public bool? Bleeding;
public bool? Unrevivable;
public readonly Solution? BloodSolution; // DeltaV - Health Analyzer Plus
public MedicalRecord? MedicalRecord; // DeltaV - Medical Records
public HealthAnalyzerUiState() {}
public HealthAnalyzerUiState(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, MedicalRecord? medicalRecord = null) // DeltaV - Medical Records
public HealthAnalyzerUiState(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode, bool? bleeding, bool? unrevivable, Solution? bloodSolution, MedicalRecord? medicalRecord = null) // DeltaV - Health Analyzer Plus, Medical Records
{
TargetEntity = targetEntity;
Temperature = temperature;
@@ -41,6 +43,7 @@ public struct HealthAnalyzerUiState
ScanMode = scanMode;
Bleeding = bleeding;
Unrevivable = unrevivable;
BloodSolution = bloodSolution; // DeltaV - Health Analyzer Plus
MedicalRecord = medicalRecord; // DeltaV - Medical Records
}
}
@@ -1,3 +1,5 @@
using Content.Shared._DV.Body.Components; // DeltaV
using Content.Shared._DV.Body.Systems; // DeltaV
using Content.Shared._ST.Interaction; // Stellar - interaction particles
using Content.Shared._Floof.OfferItem; // Floof
using Content.Shared.ActionBlocker;
@@ -10,6 +12,7 @@ using Content.Shared.Database;
using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Humanoid; // DeltaV
using Content.Shared.IdentityManagement;
using Content.Shared.Input;
using Content.Shared.Interaction;
@@ -55,6 +58,7 @@ public sealed class PullingSystem : EntitySystem
[Dependency] private readonly HeldSpeedModifierSystem _clothingMoveSpeed = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedVirtualItemSystem _virtual = default!;
[Dependency] private readonly SmallCharacterSystem _smallCharacter = default!; // DeltaV
public override void Initialize()
{
@@ -295,6 +299,14 @@ public sealed class PullingSystem : EntitySystem
private void OnRefreshMovespeed(EntityUid uid, PullerComponent component, RefreshMovementSpeedModifiersEvent args)
{
// BEGIN DeltaV - Slow if smaller puller
if (TryComp<SmallCharacterComponent>(uid, out var smol))
{
var sizePenalty = _smallCharacter.ApplyPullSpeedPenalty((uid, smol), component.Pulling);
args.ModifySpeed(sizePenalty, sizePenalty);
}
// END DeltaV
if (TryComp<HeldSpeedModifierComponent>(component.Pulling, out var heldMoveSpeed) && component.Pulling.HasValue)
{
var (walkMod, sprintMod) =
@@ -97,7 +97,7 @@ public sealed partial class ParcelWrappingSystem
if (target == user)
{
var selfMsg = Loc.GetString("parcel-wrap-popup-being-wrapped-self");
_popup.PopupClient(selfMsg, user, user);
_popup.PopupEntity(selfMsg, user, user);
}
else
{
@@ -143,7 +143,7 @@ public sealed partial class ParcelWrappingSystem
// Spawn the actual parcel entity.
var targetTransform = Transform(target);
var spawned = Spawn(GetParcelPrototype(wrapper, target), targetTransform.Coordinates);
var spawned = SpawnAtPosition(GetParcelPrototype(wrapper, target), targetTransform.Coordinates);
_transform.SetLocalRotation(spawned, targetTransform.LocalRotation);
// If the target is in a container, try to put the parcel in its place in the container.
@@ -177,7 +177,7 @@ namespace Content.Shared.Preferences
_traitPreferences = traitPreferences;
_loadouts = loadouts;
// Begin CD - Character Records
Height = height;
Height = height; // This is the user-set scale on the profile editor. Not actual height measurements.
CDCharacterRecords = cdCharacterRecords;
// End CD - Character Records
@@ -1,4 +1,5 @@
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems; // DeltaV
using Content.Shared.Administration.Logs;
using Content.Shared.Database;
using Content.Shared.Doors.Components;
@@ -19,6 +20,7 @@ namespace Content.Shared.Remotes.EntitySystems;
public abstract class SharedDoorRemoteSystem : EntitySystem
{
[Dependency] private readonly SharedAirlockSystem _airlock = default!;
[Dependency] private readonly AccessReaderSystem _accessReader = default!; // DeltaV
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedDoorSystem _doorSystem = default!;
[Dependency] private readonly SharedElectrocutionSystem _electrify = default!;
@@ -96,6 +98,19 @@ public abstract class SharedDoorRemoteSystem : EntitySystem
else if (entity.Comp.RequireTagWhitelist)
return;
// Begin DeltaV - Emergency access only bypasses open/close; bolting and toggling emergency access still require actual access.
if (entity.Comp.Mode != OperatingMode.OpenClose
&& accessComponent != null
&& !_accessReader.IsAllowed(accessTarget, args.Target.Value, accessComponent))
{
if (isAirlock)
_doorSystem.Deny(args.Target.Value, doorComp, user: args.User, predicted: true);
_popup.PopupClient(Loc.GetString("door-remote-denied"), args.User, args.User);
return;
}
// End DeltaV
switch (entity.Comp.Mode)
{
case OperatingMode.OpenClose:
@@ -1,4 +1,3 @@
using Content.Shared._CD.Silicons.Borgs; // CosmicDrift - borg subtypes
using Content.Shared.Actions;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Components;
@@ -97,10 +96,6 @@ public abstract partial class SharedBorgSwitchableTypeSystem : EntitySystem // D
_userInterface.CloseUi((ent.Owner, null), BorgSwitchableTypeUiKey.SelectBorgType);
UpdateEntityAppearance(ent);
// AL - event for subtype system, always runs at end of borg type code
var ev = new AfterBorgTypeSelectEvent();
RaiseLocalEvent(ent, ref ev);
}
protected void UpdateEntityAppearance(Entity<BorgSwitchableTypeComponent> entity)
@@ -125,25 +120,24 @@ public abstract partial class SharedBorgSwitchableTypeSystem : EntitySystem // D
{
footstepModifier.FootstepSoundCollection = prototype.FootstepCollection;
}
// Start CosmicDrift Changes - Moved to BorgSwitchableTypeSystem.cs
// if (prototype.SpriteBodyMovementState is { } movementState)
// {
// var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
// spriteMovement.NoMovementLayers.Clear();
// spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
// {
// State = prototype.SpriteBodyState,
// };
// spriteMovement.MovementLayers.Clear();
// spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
// {
// State = movementState,
// };
// }
// else
// {
// RemComp<SpriteMovementComponent>(entity);
// }
// End CosmicDrift Changes - Moved to BorgSwitchableTypeSystem.cs
if (prototype.SpriteBodyMovementState is { } movementState)
{
var spriteMovement = EnsureComp<SpriteMovementComponent>(entity);
spriteMovement.NoMovementLayers.Clear();
spriteMovement.NoMovementLayers["movement"] = new PrototypeLayerData
{
State = prototype.SpriteBodyState,
};
spriteMovement.MovementLayers.Clear();
spriteMovement.MovementLayers["movement"] = new PrototypeLayerData
{
State = movementState,
};
}
else
{
RemComp<SpriteMovementComponent>(entity);
}
}
}
+19 -3
View File
@@ -25,11 +25,27 @@ public sealed partial class ScaleVisualsComponent : Component
[ViewVariables]
public Vector2? OriginalScale;
// Delta V Addition
/// <summary>
/// Base Scale of the Species, which we use to set a new height relative to this.
/// DeltaV - Contains the species scale. Set dynamically by
/// baseScale in the Species prototype.
/// </summary>
[DataField, AutoNetworkedField]
[ViewVariables]
public Vector2 SpeciesScale = Vector2.One;
public Vector2 SpeciesScale = new(1f, 1f);
/// <summary>
/// DeltaV - Contains the user-defined scale from the character creation
/// screen.
/// </summary>
[DataField, AutoNetworkedField]
[ViewVariables]
public Vector2 ProfileScale = new(1f, 1f);
/// <summary>
/// DeltaV - Contains the computer scale from applying Scale, SpeciesScale, and ProfileScale.
/// This will contain the actual scale after all modifiers are applied.
/// </summary>
[DataField, AutoNetworkedField]
[ViewVariables]
public Vector2 ComputedScale;
}
@@ -1,4 +1,6 @@
using System.Numerics;
using Content.Shared.Humanoid; // DeltaV
using Robust.Shared.Prototypes; // DeltaV
using Robust.Shared.Serialization;
namespace Content.Shared.Sprite;
@@ -6,6 +8,7 @@ namespace Content.Shared.Sprite;
public abstract class SharedScaleVisualsSystem : EntitySystem
{
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly IPrototypeManager _proto = default!; // DeltaV
public override void Initialize()
{
@@ -39,15 +42,28 @@ public abstract class SharedScaleVisualsSystem : EntitySystem
{
var comp = EnsureComp<ScaleVisualsComponent>(uid);
comp.Scale = scale;
// BEGIN DeltaV - Apply species and profile height
// We have to ensure this is idempotent so that if it gets applied more than once
// the sprite size at the end is the same.
if (TryComp<HumanoidProfileComponent>(uid, out var profile))
{
var speciesProto = _proto.Index(profile.Species);
comp.SpeciesScale = speciesProto.BaseScale;
scale *= comp.SpeciesScale; // Apply both species scale and character-defined height
Vector2 profileHeight = new(profile.Height, profile.Height);
comp.ProfileScale = profileHeight;
scale *= comp.ProfileScale;
}
comp.ComputedScale = scale; // Nice to know what the computed size is in case of bugs
// END DeltaV
Dirty(uid, comp);
// Delta V - Begin Species Scaling
// 120% species scale => add 0.2 to scale
var newScale = scale + comp.SpeciesScale - Vector2.One;
// Delta V - End Species Scaling
var appearanceComponent = EnsureComp<AppearanceComponent>(uid);
_appearance.SetData(uid, ScaleVisuals.Scale, newScale /* Delta V - Custom Species Scale */, appearanceComponent);
_appearance.SetData(uid, ScaleVisuals.Scale, scale, appearanceComponent);
// Raise an event for content use.
var ev = new ScaleEntityEvent(uid, scale);
@@ -1,6 +1,5 @@
using Content.Shared.Examine;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Systems;
using Content.Shared.Stealth.Components;
using Robust.Shared.GameStates;
using Robust.Shared.Timing;
@@ -1,28 +0,0 @@
using Content.Shared.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CD.Prototypes;
public sealed class ALPrototypeSystem : EntitySystem
{
[Dependency] private readonly IComponentFactory _compFactory = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public IEnumerable<(EntityPrototype Prototype, T Component)> EnumerateComponents<T>() where T : IComponent, new()
{
foreach (var entity in _prototype.EnumeratePrototypes<EntityPrototype>())
{
if (entity.TryGetComponent(out T? comp, _compFactory))
yield return (entity, comp);
}
}
public IEnumerable<EntityPrototype> EnumerateEntities<T>() where T : IComponent, new()
{
foreach (var entity in _prototype.EnumeratePrototypes<EntityPrototype>())
{
if (entity.HasComponent<T>(_compFactory))
yield return entity;
}
}
}
@@ -1,77 +0,0 @@
using System.Numerics;
using Content.Shared.Inventory;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Shared._CD.Silicons.Borgs;
/// <summary>
/// Information relating to a borg's subtype. Should be mostly cosmetic.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
[EntityCategory("BorgSubtype")]
public sealed partial class BorgSubtypeDefinitionComponent : Component
{
private static ProtoId<SoundCollectionPrototype> DefaultFootsteps = new("FootstepBorg"); // DeltaV - Removed Readonly
/// <summary>
/// <inheritdoc cref="BorgTypePrototype.InventoryTemplateId"/>
/// </summary>
[DataField, AutoNetworkedField] public ProtoId<InventoryTemplatePrototype> InventoryTemplateId = "borgShort";
/// <summary>
/// The parent borg type of this subtype.
/// </summary>
[DataField(required: true), AutoNetworkedField]
public string ParentType;
/// <summary>
/// <inheritdoc cref="BorgTypePrototype.AddComponents"/>
/// </summary>
[DataField] public ComponentRegistry? AddComponents;
/// <summary>
/// Sprite path that the prototype's layer data will reference.
/// </summary>
[DataField, AutoNetworkedField] public ResPath? SpritePath;
/// <summary>
/// The visual layer data for the subtype.
/// At the minimum should have definitions for each value of <see cref="BorgVisualLayers"/>.
/// </summary>
[DataField(required: true), AutoNetworkedField]
public PrototypeLayerData[] LayerData;
[DataField(required: true), AutoNetworkedField]
public string SpriteHasMindState;
[DataField(required: true), AutoNetworkedField]
public string SpriteNoMindState;
[DataField, AutoNetworkedField] public string? SpriteBodyState;
[DataField, AutoNetworkedField] public Vector2? Offset;
[DataField(required: true), AutoNetworkedField]
public EntProtoId DummyPrototype;
[DataField, AutoNetworkedField] public string PetSuccessString = "petting-success-generic-cyborg";
[DataField, AutoNetworkedField] public string PetFailureString = "petting-failure-generic-cyborg";
/// <summary>
/// Sound specifier for footstep sounds created by this subtype.
/// </summary>
[DataField, AutoNetworkedField]
public SoundSpecifier FootstepCollection { get; set; } = new SoundCollectionSpecifier(DefaultFootsteps);
/// <summary>
/// <inheritdoc cref="BorgTypePrototype.SpriteBodyMovementState"/>
/// </summary>
[DataField, AutoNetworkedField]
public string? SpriteBodyMovementState { get; set; }
}
@@ -1,18 +0,0 @@
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared._CD.Silicons.Borgs;
/// <summary>
/// Component given to borgs that should be able to select subtypes inside of the borg type selection menu.
/// </summary>
[RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState(true)]
public sealed partial class BorgSwitchableSubtypeComponent : Component
{
/// <summary>
/// The <see cref="BorgSubtypeDefinitionComponent"/> of this chassis.
/// </summary>
[DataField, AutoNetworkedField]
public ProtoId<EntityPrototype>? BorgSubtype;
}
@@ -1,100 +0,0 @@
using Content.Shared.Interaction;
using Content.Shared.Interaction.Components;
using Content.Shared.Movement.Components;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Shared.Prototypes;
namespace Content.Shared._CD.Silicons.Borgs;
/// <summary>
/// Shared behaviour for borg switchable subtype logic.
/// Essentially a reimplementation of <see cref="SharedBorgSwitchableTypeSystem"/> specifically for cosmetic functions.
/// </summary>
public abstract class SharedBorgSwitchableSubtypeSystem : EntitySystem
{
[Dependency] private readonly InteractionPopupSystem _interactionPopup = default!;
[Dependency] protected readonly IPrototypeManager Prototypes = default!;
[Dependency] protected readonly IComponentFactory ComponentFactory = default!;
public override void Initialize()
{
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, MapInitEvent>(OnMapInit); // make sure that our subtype is selected first
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, AfterBorgTypeSelectEvent>(OnBorgTypeSelect);
SubscribeLocalEvent<BorgSwitchableSubtypeComponent, TypeTryingToUpdateVisualsEvent>(OnBorgTypeUpdatingVisuals);
Subs.BuiEvents<BorgSwitchableTypeComponent>(BorgSwitchableTypeUiKey.SelectBorgType,
sub =>
{
sub.Event<BorgSelectSubtypeMessage>(SelectSubtypeMessageHandler);
});
base.Initialize();
}
private void OnBorgTypeUpdatingVisuals(Entity<BorgSwitchableSubtypeComponent> ent, ref TypeTryingToUpdateVisualsEvent args)
{
if (!ent.Comp.BorgSubtype.HasValue)
return;
Dirty(ent);
SelectBorgSubtype(ent);
}
private void OnMapInit(Entity<BorgSwitchableSubtypeComponent> ent, ref MapInitEvent args)
{
if (ent.Comp.BorgSubtype != null)
{
SelectBorgSubtype(ent);
}
}
private void OnBorgTypeSelect(Entity<BorgSwitchableSubtypeComponent> ent, ref AfterBorgTypeSelectEvent args)
{
if (!ent.Comp.BorgSubtype.HasValue)
return;
UpdateEntityAppearance(ent);
Dirty(ent);
}
protected virtual void SelectBorgSubtype(Entity<BorgSwitchableSubtypeComponent> ent)
{
UpdateEntityAppearance(ent);
}
private void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity)
{
if (!Prototypes.TryIndex(entity.Comp.BorgSubtype, out var subtypePrototype))
return;
UpdateEntityAppearance(entity, subtypePrototype);
}
protected virtual void UpdateEntityAppearance(Entity<BorgSwitchableSubtypeComponent> entity,
EntityPrototype borgSubtypePrototype)
{
if (!borgSubtypePrototype.TryGetComponent<BorgSubtypeDefinitionComponent>(out var borgSubtype, ComponentFactory))
return;
if (TryComp(entity, out InteractionPopupComponent? popup))
{
_interactionPopup.SetInteractSuccessString((entity.Owner, popup), borgSubtype.PetSuccessString);
_interactionPopup.SetInteractFailureString((entity.Owner, popup), borgSubtype.PetFailureString);
}
if (TryComp(entity, out FootstepModifierComponent? footstepModifier))
{
footstepModifier.FootstepSoundCollection = borgSubtype.FootstepCollection;
}
}
private void SelectSubtypeMessageHandler(EntityUid uid, BorgSwitchableTypeComponent borgSwitchableTypeComponent, BorgSelectSubtypeMessage args)
{
if (!TryComp<BorgSwitchableSubtypeComponent>(uid, out var subtypeComp))
return;
subtypeComp.BorgSubtype = args.Subtype;
Dirty(uid, subtypeComp);
}
}
@@ -1,16 +0,0 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared._CD.Silicons.Borgs;
[Serializable, NetSerializable]
public sealed class BorgSelectSubtypeMessage(ProtoId<EntityPrototype>? subtype) : BoundUserInterfaceMessage
{
public ProtoId<EntityPrototype>? Subtype = subtype;
}
[ByRefEvent]
public record struct AfterBorgTypeSelectEvent;
[ByRefEvent]
public record struct TypeTryingToUpdateVisualsEvent;
@@ -0,0 +1,12 @@
using Robust.Shared.GameStates;
namespace Content.Shared._DV.Administration.Components;
/// This component prevents an entity from being followed by ghosts.
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class UnorbitableComponent : Component
{
/// Whether to allow adminned players to follow the entity.
[DataField, AutoNetworkedField]
public bool AllowAdmins = false;
}
@@ -0,0 +1,36 @@
using Content.Shared._DV.Administration.Components;
using Content.Shared.Administration.Managers;
using Content.Shared.Follower;
using Content.Shared.Follower.Components;
namespace Content.Shared._DV.Administration.EntitySystems;
public sealed class UnorbitableSystem : EntitySystem
{
[Dependency] private readonly FollowerSystem _followerSystem = default!;
[Dependency] private readonly ISharedAdminManager _admin = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<UnorbitableComponent, ComponentInit>(OnInit);
}
private void OnInit(Entity<UnorbitableComponent> ent, ref ComponentInit args)
{
if (!HasComp<FollowedComponent>(ent))
return;
_followerSystem.StopAllFollowers(ent);
}
public bool CanFollow(EntityUid follower, EntityUid target)
{
if (TryComp<UnorbitableComponent>(target, out var unorbitable))
{
return unorbitable.AllowAdmins && _admin.IsAdmin(follower);
}
return true;
}
}
@@ -0,0 +1,23 @@
using Content.Shared._DV.Body.Systems;
using Robust.Shared.GameStates;
namespace Content.Shared._DV.Body.Components;
/// <summary>
/// If an entity has this, if a small character has penalties (such as pull speed),
/// the small character will ignore the penalties associated with their size.
///
/// Mostly used for things like wheeled/floating objects.
/// </summary>
[RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState]
[Access(typeof(SmallCharacterSystem))]
public sealed partial class SmallCharacterComponent : Component
{
/// <summary>
/// The speed of which to scale the small character's pull speed by if the
/// object is big enough to warrant a pull-speed slowdown.
/// </summary>
[DataField, AutoNetworkedField]
public float PullSpeedPenalty = 1f;
}
@@ -0,0 +1,12 @@
namespace Content.Shared._DV.Body.Components;
/// <summary>
/// If an entity has this, if a small character has penalties (such as pull speed),
/// the small character will ignore the penalties associated with their size.
///
/// Mostly used for things like wheeled/floating objects.
///
/// See <see cref="Systems.SmallCharacterSystem"/>
/// </summary>
[RegisterComponent]
public sealed partial class UnaffectedBySizePenaltyComponent : Component;
+3 -1
View File
@@ -1,5 +1,6 @@
using Content.Shared._DV.Body.Components;
using Content.Shared._DV.Body.Events;
using Content.Shared.Buckle;
using Content.Shared.DoAfter;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
@@ -13,6 +14,7 @@ public sealed class CPRSystem : EntitySystem
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
[Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly SharedBuckleSystem _buckle = default!;
public override void Initialize()
{
@@ -85,7 +87,7 @@ public sealed class CPRSystem : EntitySystem
{
Act = () => StartCPR(user, target, cprComp.TimeLength),
Text = Loc.GetString("cpr-verb-start"),
Priority = 2,
Priority = _buckle.IsBuckled(target) ? 3 : 1, // Higher priority if they are buckled. Otherwise, this conflicts with trying to carry.
Disabled = alreadyAffected,
Message = alreadyAffected ? Loc.GetString("cpr-verb-disabled-description") : Loc.GetString("cpr-verb-description"),
};
@@ -0,0 +1,97 @@
using Content.Shared._DV.Body.Components;
using Content.Shared.GameTicking;
using Content.Shared.Humanoid;
using Content.Shared.Item;
using JetBrains.Annotations;
using Robust.Shared.Physics.Components;
namespace Content.Shared._DV.Body.Systems;
/// <summary>
/// Used to relay or subscribe to events if a character's scale is 1.0 or below.
/// This is only used for the height slider scale.
/// </summary>
public sealed partial class SmallCharacterSystem : EntitySystem
{
private const float NO_PENALTY = 1.0f;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(OnSpawn);
}
private void OnSpawn(PlayerSpawnCompleteEvent ev)
{
if (TryComp<HumanoidProfileComponent>(ev.Mob, out var profile))
ApplySmallCharacter(ev.Mob, profile.Height);
}
[PublicAPI]
public float ApplyPullSpeedPenalty(Entity<SmallCharacterComponent?> puller, EntityUid? pulledEntity)
{
// Ignore if they aren't pulling anything...
if (!pulledEntity.HasValue)
return NO_PENALTY;
// Ignore if they aren't a small character in the first place
if (!Resolve(puller, ref puller.Comp, false))
return NO_PENALTY;
// If the pulled entity has the component that ignores the penalty
if (HasComp<UnaffectedBySizePenaltyComponent>(pulledEntity))
return NO_PENALTY;
// Ignore if it's an item that can be held or stored. It would be weird to
// slow by X% from pulling a piece of paper or a gun when you can just hold it
// and not suffer from a penalty.
if (HasComp<ItemComponent>(pulledEntity))
return NO_PENALTY;
// Ignore if the object is floating in the air.
if (TryComp<PhysicsComponent>(pulledEntity, out var pulledPhysics)
&& pulledPhysics.BodyStatus == BodyStatus.InAir)
return NO_PENALTY;
return puller.Comp.PullSpeedPenalty;
}
#region Static Members
/// <summary>
/// Gets the move-speed penalty as a float. Should be applied multiplicatively.
/// Caps at 1 so we don't make bigger characters faster when pulling.
/// </summary>
/// <returns></returns>
[PublicAPI]
public static float GetPullSpeedPenaltyFromScale(float scale = 1.0f)
{
return Math.Min(scale * scale, 1);
}
/// <summary>
/// Calculates a well-formed display string of the pull speed penalty.
/// Used primarily in the character editor to get the well-formed percent
/// without having to duplicate formulas.
/// </summary>
/// <param name="scale"></param>
/// <returns></returns>
[PublicAPI]
public static string GetPullSpeedPenaltyDisplayFromScale(float scale = 1.0f)
{
return $"{Math.Round((1 - GetPullSpeedPenaltyFromScale(scale)) * 100)}%";
}
#endregion
#region Private Members
private void ApplySmallCharacter(EntityUid uid, float scale = 1)
{
if (scale >= 1)
return;
// The character scale is stored in the HumanoidProfileComponent if you ever
// need it.
var comp = EnsureComp<SmallCharacterComponent>(uid);
comp.PullSpeedPenalty = GetPullSpeedPenaltyFromScale(scale);
Dirty(uid, comp);
}
#endregion
}
+16 -5
View File
@@ -30,6 +30,7 @@ using System.Numerics;
using Content.Shared._DV.Polymorph;
using Content.Shared._Floof.OfferItem;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Buckle;
namespace Content.Shared._DV.Carrying;
@@ -70,7 +71,7 @@ public sealed class CarryingSystem : EntitySystem
SubscribeLocalEvent<BeingCarriedComponent, GettingInteractedWithAttemptEvent>(OnInteractedWith);
SubscribeLocalEvent<BeingCarriedComponent, PullAttemptEvent>(OnPullAttempt);
SubscribeLocalEvent<BeingCarriedComponent, StartClimbEvent>(OnDrop);
SubscribeLocalEvent<BeingCarriedComponent, BuckledEvent>(OnDrop);
SubscribeLocalEvent<BeingCarriedComponent, BuckledEvent>(OnBuckle);
SubscribeLocalEvent<BeingCarriedComponent, UnbuckledEvent>(OnDrop);
SubscribeLocalEvent<BeingCarriedComponent, StrappedEvent>(OnDrop);
SubscribeLocalEvent<BeingCarriedComponent, UnstrappedEvent>(OnDrop);
@@ -220,6 +221,13 @@ public sealed class CarryingSystem : EntitySystem
DropCarried(ent.Comp.Carrier, ent);
}
private void OnBuckle(Entity<BeingCarriedComponent> ent, ref BuckledEvent args)
{
// Buckling to a bed already handles the reparenting to the entity that the carried
// entity is buckled to, and then relays the BuckledEvent, so don't reparent to the grid.
DropCarried(ent.Comp.Carrier, ent, attachToGrid: false);
}
private void OnRemoved(Entity<BeingCarriedComponent> ent, ref ComponentRemove args)
{
/*
@@ -327,9 +335,9 @@ public sealed class CarryingSystem : EntitySystem
return true;
}
public void DropCarried(EntityUid carrier, EntityUid carried)
public void DropCarried(EntityUid carrier, EntityUid carried, bool attachToGrid = true)
{
Drop(carried);
Drop(carried, attachToGrid);
CleanupCarrier(carrier, carried);
}
@@ -341,12 +349,15 @@ public sealed class CarryingSystem : EntitySystem
_movementSpeed.RefreshMovementSpeedModifiers(carrier);
}
private void Drop(EntityUid carried)
private void Drop(EntityUid carried, bool attachToGrid = true)
{
RemComp<BeingCarriedComponent>(carried);
RemComp<KnockedDownComponent>(carried); // TODO SHITMED: make sure this doesnt let you make someone with no legs walk
_actionBlocker.UpdateCanMove(carried);
_transform.AttachToGridOrMap(carried);
// Some systems will handle re-parenting and then throw an event, and this changes the parent when it should not
if (attachToGrid)
_transform.AttachToGridOrMap(carried);
_standingState.Stand(carried);
}
@@ -70,13 +70,23 @@ public abstract class SharedLightReactiveSystem : EntitySystem
/// Avoid calling this too often, as it can be expensive.
/// </summary>
public float GetLightLevelForPoint(EntityUid uid, TransformComponent? xform = null)
{
return GetLightLevelAtPosition(uid, _transform.GetWorldPosition(uid), xform);
}
/// <summary>
/// Gets the light level at an arbitrary world position, using <paramref name="uid"/> for the
/// light lookup and map resolution. Lets callers sample somewhere other than the entity's
/// centre — e.g. a point just outside a wall, so the wall's own body can occlude the ray.
/// Avoid calling this too often, as it can be expensive.
/// </summary>
public float GetLightLevelAtPosition(EntityUid uid, Vector2 pos, TransformComponent? xform = null)
{
float val = 0.0f;
// Get the current map entity so we can get a MapLightComponent from it if it has one
var map = _transform.GetMap((uid, xform));
if (TryComp(map, out MapLightComponent? mapLight))
val += (mapLight.AmbientLightColor.R + mapLight.AmbientLightColor.G + mapLight.AmbientLightColor.B) / 3f;
var pos = _transform.GetWorldPosition(uid);
foreach (var (lightUid, lightComp) in GetLights(uid))
{
@@ -187,14 +187,14 @@ public abstract class SharedNodeCrawlSystem : EntitySystem
private void OnMovementShutdown(Entity<NodeCrawlerMovementComponent> ent, ref ComponentShutdown args)
{
if (ent.Comp.Node is { } node)
if (ent.Comp.Node is { } node && node.IsValid())
{
var nodeComp = Comp<CrawlableNodeComponent>(node);
nodeComp.Crawlers.Remove(ent);
Dirty(node, nodeComp);
}
if (ent.Comp.HeldCrawler is { } crawler && !TerminatingOrDeleted(crawler) && TryComp<NodeCrawlerComponent>(crawler, out var nodeCrawler))
if (ent.Comp.HeldCrawler is { } crawler && crawler.IsValid() && !TerminatingOrDeleted(crawler) && TryComp<NodeCrawlerComponent>(crawler, out var nodeCrawler))
{
ExitNodeCrawl((crawler, nodeCrawler));
}
@@ -0,0 +1,30 @@
using Robust.Shared.GameStates;
namespace Content.Shared._DV.Overlays.Components;
/// <summary>
/// Gives the owner darkvision: lighting still renders, but total darkness is raised to
/// <see cref="LightFloor"/> brightness instead of pitch black. Unlike night vision this keeps
/// the whole lighting gradient visible, so creatures like the Skia can judge what is and isn't dark enough for them.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class DarkVisionComponent : Component
{
/// <summary>
/// Brightness that full darkness renders at, 0-1. Rendered light is clamped to a minimum of this value.
/// </summary>
[DataField, AutoNetworkedField]
public float LightFloor = 0.2f;
/// <summary>
/// Multiplier applied to actual light on top of the floor. Values above 1 overbrighten lit areas so they are unmistakable next to the grey darkness floor.
/// </summary>
[DataField, AutoNetworkedField]
public float LightGain = 8f;
/// <summary>
/// Exponent applied to lights, to make brighter areas look notably brighter
/// </summary>
[DataField, AutoNetworkedField]
public float LightExp = 2f;
}
@@ -0,0 +1,36 @@
using Robust.Shared.GameStates;
using Robust.Shared.Timing;
namespace Content.Shared._DV.ShadowWalk;
/// <summary>
/// Lets this entity walk straight through solid static objects (walls, doors, windows...)
/// while the entity itself is bathed in darkness (the same light level it heals in.)
/// Mobs and projectiles always stay solid.
/// <para>
/// On collision, checks our light level. Objects we're stuck in are tagged in <see cref="PassableEntities"/>
/// </para>
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class ShadowWalkerComponent : Component
{
/// <summary>
/// Light level below which an object counts as bathed in darkness.
/// If the entity has a <c>LightLevelHealthComponent</c> its DarkThreshold is used
/// instead, so objects are passable exactly where the entity would heal.
/// </summary>
[DataField]
public float DarkThreshold = 0.3f;
/// <summary>
/// Objects we're currently in. Objects in this list are never solid until we fully leave.
/// </summary>
public HashSet<EntityUid> PassableEntities = new();
/// <summary>
/// Light level for this tick, to avoid re-calculating for more than one collision a tick.
/// </summary>
public GameTick LastLightCheckTick = GameTick.Zero;
public float LastLightLevel;
}
@@ -0,0 +1,139 @@
using Content.Shared._DV.Body;
using Content.Shared._DV.Light;
using Content.Shared.Projectiles;
using Robust.Shared.Map.Components;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Events;
using Robust.Shared.Timing;
namespace Content.Shared._DV.ShadowWalk;
/// <summary>
/// Can walk through darkness freely.
/// </summary>
public sealed partial class SharedShadowWalkSystem : EntitySystem
{
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly SharedLightReactiveSystem _lightReactive = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
/// <summary>
/// How far outside a tagged object's AABB the walker's centre must be before the object is untagged (and so becomes solid again on the next collision).
/// At least the walker's collision radius, so an object is never made solid while it still overlaps the walker.
/// </summary>
private const float UnstickMargin = 0.45f;
/// <summary>
/// Gamefeel. Non-walls get a bigger unstick margin so they stay unstick even if you clip into a wall. Prevents getting stuck in walls.
/// </summary>
private const float MovableUnstickMargin = 1f;
private EntityQuery<LightLevelHealthComponent> _lightHealthQuery;
private EntityQuery<PhysicsComponent> _physicsQuery;
private EntityQuery<ProjectileComponent> _projectileQuery;
private readonly List<EntityUid> _toRemove = [];
public override void Initialize()
{
base.Initialize();
_lightHealthQuery = GetEntityQuery<LightLevelHealthComponent>();
_physicsQuery = GetEntityQuery<PhysicsComponent>();
_projectileQuery = GetEntityQuery<ProjectileComponent>();
SubscribeLocalEvent<ShadowWalkerComponent, PreventCollideEvent>(OnPreventCollide);
}
public override void Update(float frameTime)
{
var query = EntityQueryEnumerator<ShadowWalkerComponent>();
while (query.MoveNext(out var uid, out var comp))
{
if (comp.PassableEntities.Count == 0)
continue;
var worldPos = _transform.GetWorldPosition(uid);
_toRemove.Clear();
foreach (var other in comp.PassableEntities)
{
// Untag anything we've deleted or fully walked clear of; the next collision with it will re-check the light level from scratch.
if (Deleted(other))
{
_toRemove.Add(other);
continue;
}
var margin = UnstickMargin;
// Non-statics get a bigger margin :)
if (_physicsQuery.TryComp(other, out var body) && body.BodyType != BodyType.Static)
margin += MovableUnstickMargin;
if (!_lookup.GetWorldAABB(other).Enlarged(margin).Contains(worldPos))
_toRemove.Add(other);
}
foreach (var other in _toRemove)
comp.PassableEntities.Remove(other);
}
}
private void OnPreventCollide(Entity<ShadowWalkerComponent> ent, ref PreventCollideEvent args)
{
if (args.Cancelled)
return;
// Only phase through hard blockers; sensor fixtures must keep triggering.
if (!args.OurFixture.Hard || !args.OtherFixture.Hard)
return;
// Already phasing through this one: keep it passable until we've left it (pruned in
// Update), so a light change mid-overlap can never trap us inside it.
if (ent.Comp.PassableEntities.Contains(args.OtherEntity))
{
args.Cancelled = true;
return;
}
if (!CanPhaseThrough(args.OtherEntity, args.OtherBody))
return;
// A fresh collision: only phase if the walker itself is currently in darkness.
if (!InDarkness(ent))
return;
args.Cancelled = true;
ent.Comp.PassableEntities.Add(args.OtherEntity);
}
private bool CanPhaseThrough(EntityUid other, PhysicsComponent otherBody)
{
if (otherBody.BodyType == BodyType.KinematicController)
return false;
// Bullets never pass or hit based on collision timing.
if (_projectileQuery.HasComp(other))
return false;
return true;
}
private bool InDarkness(Entity<ShadowWalkerComponent> ent)
{
// Darkness is whatever the walker heals in, if it heals in darkness at all.
var threshold = _lightHealthQuery.TryComp(ent, out var lightHealth)
? lightHealth.DarkThreshold
: ent.Comp.DarkThreshold;
var curTick = _timing.CurTick;
if (ent.Comp.LastLightCheckTick != curTick)
{
ent.Comp.LastLightLevel = _lightReactive.GetLightLevelForPoint(ent.Owner);
ent.Comp.LastLightCheckTick = curTick;
}
return ent.Comp.LastLightLevel < threshold;
}
}
@@ -0,0 +1,9 @@
- files: ["shadowkin_female_scream.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/AlesiaDavina/sounds/722718/"
- files: ["shadowkin_male_scream.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/AlesiaDavina/sounds/722718/"
@@ -0,0 +1,14 @@
- files: ["shadowkin_speak_say.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/JKata/sounds/632414/"
- files: ["shadowkin_speak_ask.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/templeofhades/sounds/95516/"
- files: ["shadowkin_speak_exclaim.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Edited and composited by MajorMoth. Re-encoded to Ogg Vorbis."
source: "https://freesound.org/people/taure/sounds/376392/"
@@ -0,0 +1,4 @@
- files: ["gnome_scream.ogg", "gnomedeath.ogg", "gnomelaugh.ogg", "gnome1.ogg"]
license: "CC-BY-SA-4.0"
copyright: "Audio recorded by Cepelinas and edited by rebe83"
source: "https://github.com/DeltaV-Station/Delta-v/pull/6027"
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+23
View File
@@ -348,5 +348,28 @@ Entries:
id: 38
time: '2026-07-19T16:18:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6317
- author: ShepardToTheStars
changes:
- message: '`entities` and a lot of other basic QUERY commare are now a DEBUG-level
commands.'
type: Tweak
id: 39
time: '2026-07-24T17:27:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6351
- author: ShepardToTheStars
changes:
- message: Curators, get off your lazy asses and help out the newbies.
type: Tweak
id: 40
time: '2026-08-09T18:14:15.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6374
- author: DisposableCrewmember42
changes:
- message: Added Unorbitable component, which prevents entities from being followed/warped
to.
type: Add
id: 41
time: '2026-08-22T16:18:32.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6435
Name: DeltaVAdmin
Order: 5
+454 -399
View File
@@ -1,403 +1,4 @@
Entries:
- author: ShepardToTheStars, foxcumberland
changes:
- message: Added fashionable longcoats for command, security, and crew. Find them
in the loadouts for command, security, and passengers, or in the ClothesMate
on station!
type: Add
id: 2089
time: '2026-01-21T16:23:14.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5235
- author: Apachito
changes:
- message: Made tide breaker actually craftable
type: Fix
id: 2090
time: '2026-01-21T16:28:54.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5239
- author: ShepardToTheStars
changes:
- message: Certain painkillers are more long-lasting than others, based on how strong
they are.
type: Tweak
- message: Players with the chronic pain trait start with ~5 minutes of suppressed
pain before they start feeling the effects.
type: Tweak
- message: Fixed chronic pain's effects from pulsing continuously.
type: Fix
id: 2091
time: '2026-01-23T10:24:32.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5180
- author: snowywinters
changes:
- message: Captain's armored winter coat a alternative to the carapace
type: Add
- message: Changed the defense of captain's EVA suit and carapace
type: Tweak
id: 2092
time: '2026-01-23T19:31:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5227
- author: pootslap
changes:
- message: Listening Post Operatives only have the ability to hear binary comms
now. They can no longer talk on binary.
type: Tweak
id: 2093
time: '2026-01-23T19:35:58.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5243
- author: MilonPL
changes:
- message: The traits points bar will now show up correctly.
type: Fix
id: 2094
time: '2026-01-24T20:55:31.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5275
- author: MilonPL
changes:
- message: The uncloneable trait no longer prevents your character from getting
revived by defibrillators.
type: Fix
id: 2095
time: '2026-01-24T21:29:58.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5273
- author: Halo3moth
changes:
- message: The energy magnums "magnum" rounds no longer pierce windows
type: Fix
id: 2096
time: '2026-01-25T13:48:54.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5270
- author: Toby222
changes:
- message: Added buttons for build info and credits to the escape menu
type: Tweak
id: 2097
time: '2026-01-25T14:42:09.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5260
- author: MilonPL
changes:
- message: Added the "Marked as Protected" trait which makes you immune to becoming
a target objective.
type: Add
id: 2098
time: '2026-01-25T16:30:18.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5274
- author: AeraAuling
changes:
- message: Shadow damage no longer removes all your blood immediately
type: Tweak
id: 2099
time: '2026-01-25T16:31:20.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5268
- author: ShepardToTheStars
changes:
- message: You can now toggle your hardsuit helmet on over your hat or beret!
type: Add
id: 2100
time: '2026-01-25T16:31:55.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5263
- author: Pharaz4
changes:
- message: Bingus can no longer drink the **ENTIRE** keg.
type: Fix
- message: You can eat rice dishes with chopsticks now.
type: Add
- message: Fixed Smartfridge visuals always showing their wire panels open.
type: Fix
- message: Projectiles and Mr. Butlertion are now insulated against wizardry.
type: Fix
- message: Wording fix to initial infected's prompt. It now states that they can
explicitly kill people.
type: Fix
id: 2101
time: '2026-01-25T16:31:39.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5278
- author: MantasDab360, whatston3, ShepardToTheStars
changes:
- message: Chemical Dispenser can now toggle between auto labeling!
type: Add
id: 2102
time: '2026-01-25T16:46:12.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5261
- author: keekee38
changes:
- message: a new compact submachine gun for security should be shipping in soon!
type: Add
- message: added machine pistol magazines to the security techfab's recipes.
type: Tweak
- message: added rubber SMG mags to the security techfab.
type: Tweak
id: 2103
time: '2026-01-26T10:46:23.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5212
- author: Halo3moth
changes:
- message: Security long coats have been resprited to be more in line with other
security gear. (we ran out of red dye)
type: Tweak
id: 2104
time: '2026-01-27T05:50:41.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5288
- author: EmberAstra
changes:
- message: Plasteel can now be printed at the Engineering Techfab.
type: Add
id: 2105
time: '2026-01-27T16:05:20.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5284
- author: Pharaz4
changes:
- message: Wizard has been disabled pending a balance update.
type: Remove
id: 2106
time: '2026-01-27T17:55:11.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5228
- author: Toby222
changes:
- message: Prevented the plasteel market from crashing and burning.
type: Fix
id: 2107
time: '2026-01-27T18:58:24.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5298
- author: BarryNorfolk
changes:
- message: Upstream's November updates are here!
type: Add
- message: Xenoborgs have arrived in DeltaV. Please report any foriegn borgs to
security!
type: Add
- message: APCs now trip when they are under high load.
type: Add
- message: Traitors can now find the iconic Mini Energy Crossbow in their uplink
for 5 TC.
type: Add
- message: Attorneys can find a new briefcase gun in their uplink.
type: Add
- message: Defibs will shock anyone interacting with the patient other than the
person using the defib.
type: Tweak
- message: Added mail cart.
type: Add
- message: Tourniquets can now fit in medical belts.
type: Tweak
- message: Make DAGD more likely but restrict it to 1 traitor per round.
type: Tweak
id: 2108
time: '2026-01-29T16:56:03.499291+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5087
- author: Pharaz4
changes:
- message: Lizards now get hardsuit tails
type: Add
id: 2109
time: '2026-01-29T16:55:44.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5293
- author: Pharaz4
changes:
- message: removed syndicate comms from refugees and guards
type: Remove
id: 2110
time: '2026-01-29T17:25:06.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5280
- author: Toby222, PureBreadBagel
changes:
- message: Added the ability to see if a patient is uncloneable via the Health Analyzer!
type: Add
- message: Medical doctor and Cloning entries have been changed to reflect the new
uncloneable trait, as uncloneable and unrevivable are no longer the same.
type: Tweak
id: 2111
time: '2026-01-30T16:18:07.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5310
- author: ShepardToTheStars
changes:
- message: The uncloneable alert in the health analyzer window only shows up when
its relevant (i.e. when the patient is dead).
type: Tweak
id: 2112
time: '2026-01-30T21:11:56.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5330
- author: verybigman311
changes:
- message: Wielding a guitar should no longer turn it invisible in your hands.
type: Fix
id: 2113
time: '2026-02-01T19:29:59.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5331
- author: verybigman311
changes:
- message: The Brigmed beret is now avaliable in the Corpsman loadout.
type: Add
id: 2114
time: '2026-02-01T19:30:27.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5333
- author: keekee38
changes:
- message: modified the bandolier slightly, and added a recipe for it in the sec
techfab
type: Tweak
id: 2115
time: '2026-02-01T19:32:36.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5313
- author: Pharaz4
changes:
- message: Changed the mapped enabled pumps from 310 to 300 kPa
type: Tweak
id: 2116
time: '2026-02-01T19:34:53.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5336
- author: makyo
changes:
- message: Rodentia! Now your sneak action has an icon showing your sneak status.
type: Add
id: 2117
time: '2026-02-01T19:39:29.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5308
- author: makyo
changes:
- message: Perma chefvends now get a few bowls!
type: Add
id: 2118
time: '2026-02-01T19:43:05.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5304
- author: verybigman311
changes:
- message: Feroxi can now waggy their tails.
type: Add
id: 2119
time: '2026-02-02T17:56:08.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5319
- author: Pharaz4
changes:
- message: Fixed harpy suits not displaying on some clothing.
type: Fix
- message: Added missing sprite for Lizards on multipe suits.
type: Add
- message: Removed upstream spawners from entity spawn panel.
type: Remove
id: 2120
time: '2026-02-05T20:04:40.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5325
- author: Pharaz4
changes:
- message: Shoko improved!
type: Tweak
id: 2121
time: '2026-02-10T11:26:42.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5334
- author: MantasDab360
changes:
- message: Gas condenser now uses 2kW instead of 10 kW!
type: Tweak
id: 2122
time: '2026-02-17T23:22:38.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5365
- author: Pharaz4
changes:
- message: Fixed pew sprites!
type: Fix
id: 2123
time: '2026-02-20T23:13:13.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5375
- author: Woljif
changes:
- message: Removed the slowdown penalty when wielding the Estoc DMR.
type: Tweak
id: 2124
time: '2026-02-24T04:26:44.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5242
- author: keekee38
changes:
- message: added a new cryogenics chemical, photoxadone, that heals both holy and
shadow damage. it even works on the dead!
type: Add
- message: added purifying salt to the med vend, as well as a recipe in the techfab.
type: Tweak
id: 2125
time: '2026-02-24T05:05:59.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5276
- author: IAmNotGray
changes:
- message: The maximum record length has been increased from 4096 to 8192. Remember
that these things exist?
type: Tweak
id: 2126
time: '2026-02-24T19:11:26.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5385
- author: HameyTychol
changes:
- message: removed ability for limbs to be placed in trash bag and recycled
type: Fix
id: 2127
time: '2026-02-24T19:11:40.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5416
- author: rebe83
changes:
- message: Skias can now emote. Harvest souls with some flavor. and spin.
type: Tweak
id: 2128
time: '2026-02-25T18:18:15.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5366
- author: BarryNorfolk
changes:
- message: Shrapnel Landmines are once again actually dangerous and will murder
you.
type: Fix
id: 2129
time: '2026-02-25T18:19:58.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5379
- author: Eternally-Confused
changes:
- message: Bluespace beakers and lead bottles can now only be obtained by emagging
the chemvend, instead of cutting the manager wire.
type: Tweak
id: 2130
time: '2026-02-25T18:20:57.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5392
- author: zelezniciar
changes:
- message: Added Engineering SOP, formalizing safety regs, building permits, hazard
areas, and more.
type: Add
- message: RCDs are now a controlled item, restricted to Engineering.
type: Tweak
id: 2131
time: '2026-02-25T20:35:40.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5282
- author: Stxcking
changes:
- message: Gun safes have new sprites!
type: Tweak
id: 2132
time: '2026-02-25T22:42:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5314
- author: zelezniciar, AraiMaia
changes:
- message: Added Engineering Tape for use by Engineers to mark off hazardous areas.
Danger, Keep Out!
type: Add
id: 2133
time: '2026-02-26T07:29:13.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5277
- author: AeraAuling
changes:
- message: certain tails no longer make skirts look like shorts
type: Tweak
id: 2134
time: '2026-02-26T20:00:49.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4548
- author: SuperGDPWYL, youtissoum, DisposableCrewmember42
changes:
- message: Conspirators have been ported from Harmony! Check the guidebook for more
details.
type: Add
- message: Conspirators are more likely to be chosen from different departments
type: Tweak
- message: Conspirators can use custom objective summaries
type: Tweak
id: 2135
time: '2026-02-27T18:24:44.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5218
- author: zelezniciar
changes:
- message: Added a generic Slavic accent that can be selected as a character trait.
@@ -4365,4 +3966,458 @@
id: 2589
time: '2026-07-21T00:05:09.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6201
- author: Stxcking
changes:
- message: Vulps can yip properly now.
type: Fix
id: 2590
time: '2026-07-21T02:20:30.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6354
- author: Coryler
changes:
- message: Shadekin meds working on them
type: Fix
- message: Shadekin emotes being available to other species
type: Fix
id: 2591
time: '2026-07-21T07:58:56.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6357
- author: Coryler
changes:
- message: Add back Felinid root ability
type: Add
id: 2592
time: '2026-07-21T18:44:49.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6358
- author: EmberAstra
changes:
- message: Cosmic Cult's Entropic Blades are now smaller (2x4 spaces)
type: Tweak
id: 2593
time: '2026-07-23T03:17:02.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6371
- author: turtlemutt
changes:
- message: Gave Lighthouse new doorbells and pagers. Have fun harassing departments!
type: Tweak
id: 2594
time: '2026-07-23T16:29:30.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6088
- author: ShepardToTheStars
changes:
- message: Buckling someone while they are being carried should work as intended
now.
type: Fix
- message: Picking someone up that is criticla will have priority over CPR unless
they are buckled to something.
type: Tweak
id: 2595
time: '2026-07-23T20:07:04.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6375
- author: ManuDemoen
changes:
- message: Emergency access no longer allows anyone with a remote to bolt the door
and checks if the remote has access to bolt.
type: Fix
id: 2596
time: '2026-07-24T17:28:01.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6141
- author: pootslap
changes:
- message: Monkeys now make sounds when using emotes!
type: Add
id: 2597
time: '2026-07-24T17:28:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5928
- author: keekee38
changes:
- message: The WT550 once again fires at 5.5 rounds a second and has 30-round magazines.
type: Tweak
id: 2598
time: '2026-07-24T17:34:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6364
- author: SirWarock
changes:
- message: The NT-3 cannot be parcel-wrapped anymore!
type: Tweak
- message: Adjusted the wielding sprites of the NT-3 to look less wrong.
type: Fix
- message: The NT-3 can pierce things again.
type: Fix
id: 2599
time: '2026-07-24T17:39:18.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5653
- author: ShepardToTheStars
changes:
- message: The additional borg chassis from Cosmic Drift has been reverted due to
implementation issues.
type: Remove
id: 2600
time: '2026-07-27T13:48:14.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6385
- author: JustAnOrange, Stxcking
changes:
- message: Added 6 departmental bomber jackets and 3 non-departmental ones, they're
zippable! They can be found in your loadout option or in the clothing drobes!
type: Add
id: 2601
time: '2026-07-27T16:43:20.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6220
- author: CalliganSierre
changes:
- message: Ported TheDen Shadowkin scream, laugh, and talk sounds for Shadekin.
(CC-BY-SA-3.0 MajorMoth)
type: Add
- message: Shadekin now use custom laughs and speech voice instead of Slime-person
sounds for those lines.
type: Tweak
- message: Shadekin are assigned Felinid Growl, Hiss, and Purr emotes as is consistent
with most other servers.
type: Tweak
id: 2602
time: '2026-07-27T19:26:38.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6370
- author: starabsurddark-png
changes:
- message: Increased the resistances of the Durathread Vest to 50% Blunt, Slash
and 20% Heat
type: Tweak
- message: Reduced the resistances of the Plate Carrier to 10% Blunt
type: Tweak
id: 2603
time: '2026-07-29T12:18:54.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6311
- author: ShepardToTheStars, rebe83
changes:
- message: Felinid's sink claws ability delay has been reduced from 3s to 0.5s.
type: Tweak
- message: Felinids now get a unique icon on their alert bar when they protract
their claws.
type: Add
id: 2604
time: '2026-07-29T15:42:01.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6376
- author: ShepardToTheStars
changes:
- message: Remote Medical Tracking has been added to the Biochemical research tree
as a T3 technology. It allows you to print crew monitors and crew monitoring
server boards!
type: Add
- message: The crew monitoring crate from Logistics now requires medical access
to unlock instead of epistemics.
type: Tweak
id: 2605
time: '2026-07-30T17:30:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6272
- author: ErhardSteinhauer, Stxcking
changes:
- message: 'Coming from Frontier: Added Construction Bags and Bag of Holding Variant
(T2) to the Engineering Techfab.'
type: Add
id: 2606
time: '2026-08-02T13:31:31.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5846
- author: TehFlaminTaco
changes:
- message: Removed Skia Ventcrawl
type: Remove
- message: Added Skia Shadowwalk
type: Add
- message: Replaced Skia NightVision with DarkVision
type: Tweak
id: 2607
time: '2026-08-03T02:45:12.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6346
- author: ShepardToTheStars
changes:
- message: The height slider on your profile now shows actual height measurements.
type: Tweak
- message: Characters now have a +/- 20% scale in the character creator for all
species.
type: Tweak
- message: In exchange for being harder to click on, characters that are smaller
than average for their species have pull speed penalties while pulling for being
so small. This effects only items that are not held in-hand, not in the air,
and do not have wheels.
type: Tweak
- message: Slightly reduced the density of Ovinia so they aren't as dense as an
Oni.
type: Tweak
- message: Increased the density of Thaven to slightly less than a normal human
player.
type: Tweak
id: 2608
time: '2026-08-04T16:27:56.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6320
- author: ShepardToTheStars
changes:
- message: Shadekin cannot receive CPR anymore due to them not breathing or having
lungs. They are still able to perform CPR.
type: Remove
- message: Shadekin should have an internal temperature now, so they can get cold
and hot.
type: Fix
id: 2609
time: '2026-08-04T16:41:14.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6381
- author: ShepardToTheStars
changes:
- message: Fixed changelog saying Shadekin can't perform CPR. Shadekin can still
perform CPR, but cannot receive it (as it would do nothing for them).
type: Fix
id: 2610
time: '2026-08-04T21:49:19.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6395
- author: Stxcking
changes:
- message: Mothroach and Mouse can emote again.
type: Fix
- message: Moproaches ghostrole can be raffled for properly now.
type: Fix
id: 2611
time: '2026-08-04T22:18:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6356
- author: ShepardToTheStars
changes:
- message: Nuclear operatives and ninjas will now be correctly scaled.
type: Fix
id: 2612
time: '2026-08-07T16:51:25.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6398
- author: ShepardToTheStars
changes:
- message: Parcel wrapping when buckled to a chair no longer will make you invisible
and uninteractable.
type: Fix
id: 2613
time: '2026-08-07T23:24:54.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6399
- author: ShepardToTheStars
changes:
- message: Polymorphing/jaunting while ventcrawling will no longer break movement
for the polymorphed/jaunting player.
type: Fix
id: 2614
time: '2026-08-09T16:57:32.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6400
- author: rebe83, cepelinas, ShepardtotheStars, einknusprigestoast, Sloppr
changes:
- message: Added gnomes! Remember to secure your valuables and be polite.
type: Add
- message: Added gnome hats, for when you butcher the gnome. This kills the gnome.
type: Add
- message: Gnome guidebook. All good gnomes know their fae laws! (They don't believe
in SOP)
type: Add
id: 2615
time: '2026-08-09T18:24:26.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6027
- author: Coryler
changes:
- message: Harpy Wing Layers on Hardsuits
type: Fix
id: 2616
time: '2026-08-10T16:14:56.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6406
- author: SumofThreeParts
changes:
- message: Universals are cheaper now.
type: Tweak
id: 2617
time: '2026-08-12T16:49:32.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6366
- author: keekee38
changes:
- message: the cowboy crate now has 2 rifles, 2 ammo boxes, 2 hats, and 2 pairs
of boots
type: Tweak
id: 2618
time: '2026-08-12T17:05:32.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6363
- author: sowelipililimute
changes:
- message: The set of ion laws has been refined to a smaller set of the best laws.
type: Tweak
id: 2619
time: '2026-08-12T17:34:12.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6390
- author: ShepardToTheStars
changes:
- message: Fixed some visitor shuttles (e.g. Asakim, Interdyne Chemists, Syndie
Recruiter, etc) not spawning.
type: Fix
- message: There should roughly be 1.5x as many random shuttle events per round.
type: Tweak
- message: Slightly increased the chances of Asakim, LoneOp and SRN events to happen.
type: Tweak
- message: Asakim and Hitman shuttles are now more likely to appear during survival
rounds.
type: Tweak
id: 2620
time: '2026-08-13T01:17:04.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6401
- author: ShepardToTheStars
changes:
- message: Onis should again be able to drink tea without getting poisoned.
type: Fix
id: 2621
time: '2026-08-13T15:01:47.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6409
- author: Stop-Signs
changes:
- message: Cosmic Censer no longer mindwipes people who were not cultists.
type: Tweak
id: 2622
time: '2026-08-14T04:30:57.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6414
- author: SirWarock
changes:
- message: Ejecting from a security belt now prioritizes the handgun instead of
the radio!
type: Tweak
id: 2623
time: '2026-08-16T14:07:46.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6418
- author: ShepardToTheStars
changes:
- message: Holy water now heals when injected into someone's bloodstream.
type: Fix
id: 2624
time: '2026-08-16T15:04:40.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6421
- author: ShepardToTheStars
changes:
- message: Kitsune can eat raw meat without getting poisoned again.
type: Fix
id: 2625
time: '2026-08-17T17:38:03.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6422
- author: ShepardToTheStars
changes:
- message: Traitors now have an average of 4 objectives, up from 2.
type: Tweak
- message: The max number of traitors per Traitor shift has been reduced slightly,
from 10 to 8.
type: Tweak
- message: Added the Logistic Officer's Golden Knuckledusters as a traitor objective.
type: Add
- message: Added a new steal objective to the CMO, the sensitive medical documents.
type: Add
- message: Traitors with DAGD can now roll steal objectives, otherwise they end
up rolling all killing objectives.
type: Tweak
- message: The syndicate surplus and the super surplus crates have had their costs
adjusted to 30 and 60 TC respectively.
type: Tweak
- message: The syndicate surplus and the super surplus crates have had the number
of items increased to account for the increased cost.
type: Tweak
id: 2626
time: '2026-08-17T19:14:31.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6389
- author: ShepardToTheStars
changes:
- message: The ramping scheduler will now look at when it was added to determine
event density, rather than overall round time. This will result in less events
and more time to recover after a major antag is defeated.
type: Tweak
- message: The Xenoborgs gamemode no longer has a ramping scheduler at round start.
Instead, it gets added when the mothership core dies (like other game modes).
type: Tweak
- message: Fixed a bug where the ramping scheduler would get added if a nukie died
on nukie planet.
type: Fix
- message: Fixed a bug where a ramping scheduler would get added if the crew defeated
midround zombies.
type: Fix
id: 2627
time: '2026-08-17T20:26:09.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6416
- author: rebe83
changes:
- message: Hristovs are now bulkier and require use of a bipod to aim properly,
but fire slightly faster when aimed.
type: Tweak
- message: .60 antimateriel bullets now pierce up to 3 regular walls, windows, and
airlocks. To shreds you say?
type: Tweak
id: 2628
time: '2026-08-18T16:39:08.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5905
- author: Coryler
changes:
- message: Vulpkanins have their own scream now.
type: Add
id: 2629
time: '2026-08-18T17:51:37.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6348
- author: starabsurddark-png
changes:
- message: Reduced ARCS slowdown to 10%
type: Tweak
- message: Increased ARCS explosion resist to 40%, Caustic Resist to 10%. Reduced
the Heat resist to 10% and removed ranged stamina resist to match upstream Riot
Suit
type: Tweak
- message: Replaced the ARCS with the Riot Suit in the Swat Crate
type: Tweak
id: 2630
time: '2026-08-18T18:14:44.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6353
- author: ShepardToTheStars
changes:
- message: Fixed missing locale strings on the cargo bounty request computer.
type: Fix
id: 2631
time: '2026-08-20T14:25:00.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6427
- author: ShepardToTheStars
changes:
- message: Hitmen can no longer get nuclear operatives nor characters with the marked
as protected trait as targets.
type: Fix
- message: SRN will no longer get command with unborgable as a 'Condemn them to
Metal' objective.
type: Fix
id: 2632
time: '2026-08-20T17:19:46.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6426
- author: Radezolid, FieldCommand
changes:
- message: The syndicate recruiter's ship no longer has AA on it's doors.
type: Fix
- message: The synthesis ship no longer has AA on it's doors.
type: Fix
- message: The synthesis ship is now power independent from the station, with a
17 kW generator.
type: Tweak
- message: New syndicate evacuation pod for the shuttle event
type: Add
- message: Most syndicate shuttles should now have a syndicate fax machine.
type: Tweak
id: 2633
time: '2026-08-21T02:38:46.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6094
- author: Radezolid
changes:
- message: Medkits now occupy a 2x3 in your bag, from 2x4.
type: Tweak
id: 2634
time: '2026-08-21T18:29:38.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6413
- author: ShepardToTheStars
changes:
- message: Removed suit coordinates for Arms Dealer, Asakim, and SRN ghost roles.
type: Fix
id: 2635
time: '2026-08-23T12:56:13.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6441
- author: ShepardToTheStars
changes:
- message: Syndicate and hitman business cards now embed if they are throwing at
someone.
type: Add
id: 2636
time: '2026-08-23T12:57:01.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/6439
Order: 1
+4 -1
View File
@@ -1,7 +1,10 @@
[game]
hostname = "[EN][MRP] Delta-v (Ψ) | Apoapsis [US East 1]"
hostname = "[EN][MRP] Delta-V (Ψ) | Apoapsis [NA East 1]"
soft_max_players = 100
[adminlogs]
server_name = "Apoapsis"
[hub]
tags = "lang:en-US,region:am_n_e,rp:med,no_tag_infer"
@@ -108,6 +108,7 @@ time = 600
[chat]
max_announcement_length = 512
rate_limit_announce_admins_delay = -1
[audio]
attenuation = 4 # inversedistanceclamped 1 << 2, see audioparams.cs
+4 -1
View File
@@ -1,7 +1,10 @@
[game]
hostname = "[EN][MRP] Delta-v (Ψ) | Horizon [US East 3]"
hostname = "[EN][MRP] Delta-V (Ψ) | Horizon [NA East 3]"
soft_max_players = 80
[adminlogs]
server_name = "Horizon"
[vote]
preset_enabled = true
map_enabled = true
@@ -1,7 +1,10 @@
[game]
hostname = "[EN][MRP] Delta-v (Ψ) | Inclination [EU West]"
hostname = "[EN][MRP] Delta-V (Ψ) | Inclination [EU West]"
soft_max_players = 50
[adminlogs]
server_name = "Inclination"
[server]
rules_file = "DeltaVRuleset"
+4 -1
View File
@@ -1,7 +1,10 @@
[game]
hostname = "[EN][MRP] Delta-v (Ψ) | Meridian [EU West]"
hostname = "[EN][MRP] Delta-V (Ψ) | Meridian [EU West]"
soft_max_players = 40
[adminlogs]
server_name = "Meridian"
[hub]
tags = "lang:en-US,region:eu_w,rp:med,no_tag_infer"
@@ -1,10 +1,14 @@
[game]
hostname = "[EN][MRP] Delta-v (Ψ) | Periapsis [US East 2]"
hostname = "[EN][MRP] Delta-V (Ψ) | Periapsis [NA East 2]"
soft_max_players = 60
desc = """\
A medium roleplay fork based around the mysterious Noösphere, featuring unique content, custom maps, new species and a revamped science department.\
This server focuses on calmer shifts.\
"""
fallbackpreset = "Extended"
[adminlogs]
server_name = "Periapsis"
[vote]
preset_enabled = true
File diff suppressed because one or more lines are too long
@@ -1,4 +0,0 @@
cd-borg-select-subtype-flavour-text = Available cosmetic subtypes
# medical
al-borg-medical-subtype-qualified-doctor-name = qualified doctor
@@ -1,2 +1,3 @@
humanoid-profile-editor-height-label = Height:
humanoid-profile-editor-height-label = Size - Height:
humanoid-profile-editor-height-pull-speed-penalty-label = Size - Pull Speed Reduction:
humanoid-profile-editor-reset-height-button = Reset
@@ -92,6 +92,7 @@ psionic-power-precognition-unknown-shuttle-disaster-evac-pod-result-message = Yo
psionic-power-precognition-syndicate-armsdealer-result-message = You see a vision of a ship lurking in the shadows, its cargo deadly.
psionic-power-precognition-rift-spawn-result-message = You see a small spark of energy, quickly expanding as it tears reality apart, twisting everything around it.
psionic-power-precognition-asakim-spawn-result-message = You smell stale air from a cryopod opening, and the faint echo of an intelligence far away but very near.
psionic-power-precognition-gnome-spawn-result-message = You hear laughter coming from the walls and quick footsteps when your back is turned.
psionic-power-precognition-pitbull-spawn-result-message = You see a vision of a hundred small creatures being torn apart by bloodthirsty beasts in a maze of steel.
psionic-power-precognition-hitman-spawn-result-message = You see a man in a business suit, a corpse at their feet.
@@ -0,0 +1,2 @@
cmd-stealthmin-desc = Toggle whether others can see you in adminwho and your current entity is followable by ghosts.
cmd-stealthmin-help = Usage: stealthmin\nUse stealthmin to toggle whether you appear in the output of the adminwho command and your current entity is followable by ghosts.

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