Shuttle Priority Docking#39
Merged
Cygnall merged 17 commits intoMay 30, 2025
Merged
Conversation
|
I still can't get the workflows to run with the button that's supposed to run them, so I closed and reopened the PR to get them to run |
fenndragon
added a commit
that referenced
this pull request
May 19, 2026
* chore(sanitization): port cleanup and content removals from fork plan
* chore(engine): bump RobustToolbox to v276.0.0
Update RobustToolbox submodule pin from 4b04081 to 46a56ce (v276.0.0).
This matches the engine commit referenced by upstream Wizden content.
Engine-only change; no VRS code modifications in this commit.
Notable upstream items in this range (fixes/perf/platform):
- Fix cross-grid collisions (#6542)
- Fix SetCoordinates causing unexpected reparenting (#6533)
- Fix BUI EntitySystem injection (#6515)
- Fix TryGetEntitySystem/GetEntitySystemOrNull on uninitialized manager (#6512)
- Fix bad cast syntax with IRobustCloneable field deltas (#6536)
- Catch NetEncryption exceptions (#6498)
- Always clean up render handle state after overlay draws (#6508)
- Fix ScrollContainer measure invariant (#6494)
- HRTF support through openal-soft (#6511)
- Allow hex colour input (#6485)
- Allow static abstract through the sandbox + INumber (#6432)
- Make IDependencyCollection constructable (#6466)
- Expose more fields on AudioComponent (#6510)
- record bandwidth usage on release (#6545)
- More comprehensively tag auto-generated code (#6541)
- Add parent check debug assert in SharedContainerSystem.Insert (#6532)
- Fully remove obsolete methods in MapGridComponent (#6476)
* chore(engine): cherry-pick wizden #41855 — v269.0.0 RT update + .NET 10
Cherry-picked from space-wizards/space-station-14 commit 787330f5c6
to bring VRS in line with upstream's v269+ build system (required for
RobustToolbox v276.0.0 already pinned on this branch).
Includes:
- New MSBuild/Content.props imported by all content csprojs.
- Switched all content csprojs from direct ProjectReference of Robust
components to upstream's Imports/*.props mechanism.
- Replaced SpaceStation14.sln with SpaceStation14.slnx.
- Various small content code adjustments to align with new RT APIs
taken verbatim from upstream.
- Added DepsHandler for ServerPackaging.
VRS-specific resolutions:
- Sanitization-deleted upstream files (Codewords, EdiblePrototype,
SmartFridgeComponent, ObjectiveCommandsTest) kept deleted.
- Preserved VRS-only csproj items (Folder Includes, .CM14 globs,
Goobstation Compile Includes, Configurations/Platforms, DebugOpt).
VRS:
* fix(content): satisfy RT v276 analyzers (RA0017/RA0020/RA0032)
Mechanical fixes for analyzers that became stricter under RobustToolbox v276:
- RA0017 (DataDefinition must be partial): added 'partial' modifier to 22
prototype/component types across DV/Mono/Funky/Goob/NF/RMC/Emberfall/Shitmed
and core (RCDPrototype, PsionicsRecord, NanoTask*, NanoChat*).
- RA0020 (DataField property needs setter): added '{ get; private set; }'
(or replaced 'init;' with 'set;') on prototype ID/Parents/Abstract/etc.
across Cargo, DV, Goob, NF, Silicons, StatusIcon, Roles, InteractionVerbs,
Nyanotrasen Kitchen, BorgType.
- RA0032 (duplicate [Dependency] field): in SharedBodySystem partials,
removed Shitmed-side duplicate _gameTiming/_prototypeManager/_damageable
declarations and rewired call sites to use the upstream-side
_timing/Prototypes/Damageable fields. VRS comments mark the rewires.
VRS:
* wip(content): MapGrid migration (8 files) + sanitization-fallout fixes (8 files)
Snapshot before pivoting to upstream merge strategy. Not for upstream PR.
MapGrid: ported instance methods to SharedMapSystem on Entity<MapGridComponent>
in Content.Shared (TurfHelpers, Anchorable, Anomaly, Interaction,
MoverController, Biome, Construction, NearbyTilesPercent).
Sanitization-fallout: removed dead 'using Serilog/Linguini/FloofStation' and
dead VoreSystem dep; switched JobWhitelistManager to ISawmill and
PlantSpeciesChange to Robust Logger.
* fix(content): remove dead Client-side imports (OpenToolkit, Serilog)
Phase 2A cleanup. v269 build system no longer transitively pulls these
packages, but the imports were never actually used.
- Content.Client/_Crescent/PointCannons/TargetingConsoleBUI.cs: drop unused
'using OpenToolkit.GraphicsLibraryFramework;'
- Content.Client/_Floof/Examine/CustomExaminePart.xaml.cs: drop unused
'using Serilog;'
Content.Client now compiles clean.
* fix(build): add OpenTK.Mathematics central package version
* fix(server): resolve remaining RA0017/RA0020 prototype/datarecord errors
* fix(content): complete RT v276 Phase 2B compatibility migration
- add compatibility shims for removed MapGridComponent instance APIs
(TileIndicesFor, GridTileToLocal, TryGetTileRef, GetAnchoredEntities,
GetAnchoredEntitiesEnumerator, GetLocalTilesIntersecting, WorldToLocal)
- add compatibility shims for removed EntityUid timer helpers and
ContainerManager.TryGetContainer
- resolve remaining RA0032 duplicate [Dependency] fields across partials
- fix final map-component using/import callsites
Build status after this commit:
- Content.Server: 0 errors
- Content.Shared: 0 errors
- Content.Client: 0 errors
- Content.Replay: 0 errors
* fix(tests): add missing Serilog and JetBrains.Annotations refs
* fix(prototypes): remove duplicate PlushieCarp tag in _HL/tags.yml
* fix(prototypes): cleanup orphan refs and broken sprites after RT v276 + main merge
- Remove duplicate PlushieCarp keys in cuddlycritter vending inventory
- Remove orphan trait block (no id) referencing HornyMoodsTarget
- Delete Floof/Catalog/Fills/Crates/lewd.yml (parent CrateLewd missing)
- Truncate hellspawn.yml dangling Fatkid component bleed
- Convert _CM14 base UserInterface.interfaces to dict form (RT v276)
- Delete ActionLewdLayEgg (event type missing)
- Repoint Meditech PDAs to Objects/Devices/pda.rsi
- Delete _HL neuralyzer.yml (Brainwasher component missing)
- Remove orphan Brainwasher block in base_borg_chassis.yml
- Drop ClothingEyesNeuralyzer from passiondrobe contraband
- Remove ClothingNeckMantleMeditech (sprite missing); fix sectorenclave->duskenclave mantle ref
* fix(prototypes): bulk cleanup HL Meditech/SectorEnclave per FORK_PLAN/07; fix Timer/Drakeborn; restore minimal companies.yml
- Remove 39 Meditech/SectorEnclave entity blocks (FORK_PLAN/07 says cut)
- Remove orphan ClothingOuterHardsuitInderdyne* hardsuits
- Clean construction graph nodes/edges for deleted posters
- Add migration aliases PosterContrabandMeditech -> PosterContrabandFreeTonto, PosterSectorEnclave -> PosterContrabandFreeTonto so existing maps load
- Fix BorgModuleTopicaks -> BorgModuleTopicals typo in hl_migration.yml
- Remove '- type: Timer' lines (TimerComponent removed in RT v276)
- Remove DrakebornComponentOnSpawn override rule (HLDrakeborn component missing)
- Restore minimal companies.yml (None + admin + canon vanilla) so lobby UI doesn't crash with empty CompanyButton
* fix(prototypes): clean orphan NSFW refs to make YAML linter pass
- Remove SexEmotes/LewdSounds component from base species (parent fix; -43 errors)
- Restore Floof alcohol reagent locale (.ftl) deleted by NSFW cleanup but with surviving reagent prototypes
- Restore minimal consentToggle stubs (Aphrodisiacs, NSFWDescriptions, NonconIcon) referenced by C# code
- Strip orphan Lewd*/Whip*/Spank*/Dildo* refs from misc lockers, passiondrobe inventory, boozeomat, food/fun crates, drink spawners
- Strip orphan PlushieVytian, PlushieRemiie, PlushieCarp variants
- Redirect HL Quad borg jobs to PlayerBorgBattery (custom borg entities deleted)
- Replace _HL borg_types.yml BorgChassisSecurity ref with BorgChassisQuadSec
- Drop MobDragonDrakeborn polymorph entry
- Delete _HL character_override_rules.yml (HL-personal community refs to deleted entities)
- Replace Abysslaser hitscan ref with NFRedLaserPractice in NPC misc
- Drop FuckRock/BirthdaySuit ThavenMood conflicts in yes_and / no_and
YAML Linter: 0 errors.
* fix(rsi): rename meditech states -> interdyne in interdyne_id/pda meta.json
PNG files were renamed during NSFW cleanup but meta.json kept the old
'meditech' state names, breaking RSI validation. Validate RSIs now passes.
* Fix gun upgrades not immediately updating gun effects (#43856)
* Update Credits (#43847)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
* Fix gibbing aghost (#43177)
Update MindSystem.cs
* Change chemical dispenser and ChemMaster increments (#43829)
change increments
* chore(sanitization): debrand remaining meditech surfaces
* chore(sanitization): remove remaining PassionDrobe and lewd leftovers
* fix(server): correct PullController command bind type; rename Roboisseur.yaml -> .yml (#8)
- PullController.Initialize() was registering binds under PullingSystem instead
of PullController, causing a duplicate-binds warning on every server boot.
Upstream wizden fixed this in #36161; align VRS accordingly.
- Roboisseur.yaml had a .yaml extension which the prototype loader silently
ignores; renamed to .yml so the DV NPC prototype is actually loaded.
* chore(locale): reconcile en-US locale with upstream wizden (#9)
Adds 162 missing locale files from wizden/master (commands, features, UI strings)
and resolves 6 duplicate-key conflicts caused by upstream reorganizing ftl paths.
New files (upstream locale files missing from VRS):
- 76x commands/ - admin, toolshed, and dev command descriptions
- ~86x feature locale files (accents, atmos, chat, changeling, guidebook, etc.)
Conflict resolutions (duplicate key fixes):
- guidebook/chemistry/healthchange.ftl: deleted (key moved to entity-effects/healthchange.ftl)
- _DV/smartfridge/smartfridge.ftl: deleted (pure subset of upstream smartfridge/smartfridge.ftl)
- commands/toolshed-commands.ftl: stripped 47 duplicated keys; kept 4 VRS-unique hscale commands
- commands/mapping-client-side-setup-command.ftl: deleted (renamed to mappingclientsidesetup-command.ftl)
- commands/eye-commands.ftl: deleted (keys renamed; C# already uses new key names)
- commands/persistence-save-command.ftl: deleted (upstream subset; existing persistence/command.ftl is complete)
- guidebook/chemistry/effects.ftl: removed 3 terms duplicated in entity-effects/effects.ftl; kept 50 chem-specific keys
- chat/highlights/highlights.ftl: deleted; upstream chat/highlights.ftl is strictly superset
- accent/scottish.ftl (new): deleted; conflicts with _DV/accent/scottish.ftl which has VRS-extended word list
- salvage/job-board.ftl (new): merged 19 unique keys into cargo/bounties.ftl; deleted source
Build: 0 errors. YAML linter: exit 0.
* docs(changelog): add player-visible entries for wizden sync 2026-05-06 (#11)
- ChemMaster/chem dispenser new volume increments (wizden #43829)
- Gun upgrades immediately apply effects on insertion (wizden #43856)
* fix(guns): gun upgrades now immediately update gun effects (wizden #43856) (#10)
Cherry-pick of upstream wizden commit f53c7d6a9d. Move args.Handled
assignment to after RefreshModifiers so gun effects update immediately
when an upgrade is inserted.
* chore: promote dev to main — wizden sync 2026-05-06 (#12)
* chore(engine): bump RobustToolbox to v276.0.0
Update RobustToolbox submodule pin from 4b04081 to 46a56ce (v276.0.0).
This matches the engine commit referenced by upstream Wizden content.
Engine-only change; no VRS code modifications in this commit.
Notable upstream items in this range (fixes/perf/platform):
- Fix cross-grid collisions (#6542)
- Fix SetCoordinates causing unexpected reparenting (#6533)
- Fix BUI EntitySystem injection (#6515)
- Fix TryGetEntitySystem/GetEntitySystemOrNull on uninitialized manager (#6512)
- Fix bad cast syntax with IRobustCloneable field deltas (#6536)
- Catch NetEncryption exceptions (#6498)
- Always clean up render handle state after overlay draws (#6508)
- Fix ScrollContainer measure invariant (#6494)
- HRTF support through openal-soft (#6511)
- Allow hex colour input (#6485)
- Allow static abstract through the sandbox + INumber (#6432)
- Make IDependencyCollection constructable (#6466)
- Expose more fields on AudioComponent (#6510)
- record bandwidth usage on release (#6545)
- More comprehensively tag auto-generated code (#6541)
- Add parent check debug assert in SharedContainerSystem.Insert (#6532)
- Fully remove obsolete methods in MapGridComponent (#6476)
* chore(engine): cherry-pick wizden #41855 — v269.0.0 RT update + .NET 10
Cherry-picked from space-wizards/space-station-14 commit 787330f5c6
to bring VRS in line with upstream's v269+ build system (required for
RobustToolbox v276.0.0 already pinned on this branch).
Includes:
- New MSBuild/Content.props imported by all content csprojs.
- Switched all content csprojs from direct ProjectReference of Robust
components to upstream's Imports/*.props mechanism.
- Replaced SpaceStation14.sln with SpaceStation14.slnx.
- Various small content code adjustments to align with new RT APIs
taken verbatim from upstream.
- Added DepsHandler for ServerPackaging.
VRS-specific resolutions:
- Sanitization-deleted upstream files (Codewords, EdiblePrototype,
SmartFridgeComponent, ObjectiveCommandsTest) kept deleted.
- Preserved VRS-only csproj items (Folder Includes, .CM14 globs,
Goobstation Compile Includes, Configurations/Platforms, DebugOpt).
VRS:
* fix(content): satisfy RT v276 analyzers (RA0017/RA0020/RA0032)
Mechanical fixes for analyzers that became stricter under RobustToolbox v276:
- RA0017 (DataDefinition must be partial): added 'partial' modifier to 22
prototype/component types across DV/Mono/Funky/Goob/NF/RMC/Emberfall/Shitmed
and core (RCDPrototype, PsionicsRecord, NanoTask*, NanoChat*).
- RA0020 (DataField property needs setter): added '{ get; private set; }'
(or replaced 'init;' with 'set;') on prototype ID/Parents/Abstract/etc.
across Cargo, DV, Goob, NF, Silicons, StatusIcon, Roles, InteractionVerbs,
Nyanotrasen Kitchen, BorgType.
- RA0032 (duplicate [Dependency] field): in SharedBodySystem partials,
removed Shitmed-side duplicate _gameTiming/_prototypeManager/_damageable
declarations and rewired call sites to use the upstream-side
_timing/Prototypes/Damageable fields. VRS comments mark the rewires.
VRS:
* wip(content): MapGrid migration (8 files) + sanitization-fallout fixes (8 files)
Snapshot before pivoting to upstream merge strategy. Not for upstream PR.
MapGrid: ported instance methods to SharedMapSystem on Entity<MapGridComponent>
in Content.Shared (TurfHelpers, Anchorable, Anomaly, Interaction,
MoverController, Biome, Construction, NearbyTilesPercent).
Sanitization-fallout: removed dead 'using Serilog/Linguini/FloofStation' and
dead VoreSystem dep; switched JobWhitelistManager to ISawmill and
PlantSpeciesChange to Robust Logger.
* fix(content): remove dead Client-side imports (OpenToolkit, Serilog)
Phase 2A cleanup. v269 build system no longer transitively pulls these
packages, but the imports were never actually used.
- Content.Client/_Crescent/PointCannons/TargetingConsoleBUI.cs: drop unused
'using OpenToolkit.GraphicsLibraryFramework;'
- Content.Client/_Floof/Examine/CustomExaminePart.xaml.cs: drop unused
'using Serilog;'
Content.Client now compiles clean.
* fix(build): add OpenTK.Mathematics central package version
* fix(server): resolve remaining RA0017/RA0020 prototype/datarecord errors
* fix(content): complete RT v276 Phase 2B compatibility migration
- add compatibility shims for removed MapGridComponent instance APIs
(TileIndicesFor, GridTileToLocal, TryGetTileRef, GetAnchoredEntities,
GetAnchoredEntitiesEnumerator, GetLocalTilesIntersecting, WorldToLocal)
- add compatibility shims for removed EntityUid timer helpers and
ContainerManager.TryGetContainer
- resolve remaining RA0032 duplicate [Dependency] fields across partials
- fix final map-component using/import callsites
Build status after this commit:
- Content.Server: 0 errors
- Content.Shared: 0 errors
- Content.Client: 0 errors
- Content.Replay: 0 errors
* fix(tests): add missing Serilog and JetBrains.Annotations refs
* fix(prototypes): remove duplicate PlushieCarp tag in _HL/tags.yml
* fix(prototypes): cleanup orphan refs and broken sprites after RT v276 + main merge
- Remove duplicate PlushieCarp keys in cuddlycritter vending inventory
- Remove orphan trait block (no id) referencing HornyMoodsTarget
- Delete Floof/Catalog/Fills/Crates/lewd.yml (parent CrateLewd missing)
- Truncate hellspawn.yml dangling Fatkid component bleed
- Convert _CM14 base UserInterface.interfaces to dict form (RT v276)
- Delete ActionLewdLayEgg (event type missing)
- Repoint Meditech PDAs to Objects/Devices/pda.rsi
- Delete _HL neuralyzer.yml (Brainwasher component missing)
- Remove orphan Brainwasher block in base_borg_chassis.yml
- Drop ClothingEyesNeuralyzer from passiondrobe contraband
- Remove ClothingNeckMantleMeditech (sprite missing); fix sectorenclave->duskenclave mantle ref
* fix(prototypes): bulk cleanup HL Meditech/SectorEnclave per FORK_PLAN/07; fix Timer/Drakeborn; restore minimal companies.yml
- Remove 39 Meditech/SectorEnclave entity blocks (FORK_PLAN/07 says cut)
- Remove orphan ClothingOuterHardsuitInderdyne* hardsuits
- Clean construction graph nodes/edges for deleted posters
- Add migration aliases PosterContrabandMeditech -> PosterContrabandFreeTonto, PosterSectorEnclave -> PosterContrabandFreeTonto so existing maps load
- Fix BorgModuleTopicaks -> BorgModuleTopicals typo in hl_migration.yml
- Remove '- type: Timer' lines (TimerComponent removed in RT v276)
- Remove DrakebornComponentOnSpawn override rule (HLDrakeborn component missing)
- Restore minimal companies.yml (None + admin + canon vanilla) so lobby UI doesn't crash with empty CompanyButton
* fix(prototypes): clean orphan NSFW refs to make YAML linter pass
- Remove SexEmotes/LewdSounds component from base species (parent fix; -43 errors)
- Restore Floof alcohol reagent locale (.ftl) deleted by NSFW cleanup but with surviving reagent prototypes
- Restore minimal consentToggle stubs (Aphrodisiacs, NSFWDescriptions, NonconIcon) referenced by C# code
- Strip orphan Lewd*/Whip*/Spank*/Dildo* refs from misc lockers, passiondrobe inventory, boozeomat, food/fun crates, drink spawners
- Strip orphan PlushieVytian, PlushieRemiie, PlushieCarp variants
- Redirect HL Quad borg jobs to PlayerBorgBattery (custom borg entities deleted)
- Replace _HL borg_types.yml BorgChassisSecurity ref with BorgChassisQuadSec
- Drop MobDragonDrakeborn polymorph entry
- Delete _HL character_override_rules.yml (HL-personal community refs to deleted entities)
- Replace Abysslaser hitscan ref with NFRedLaserPractice in NPC misc
- Drop FuckRock/BirthdaySuit ThavenMood conflicts in yes_and / no_and
YAML Linter: 0 errors.
* fix(rsi): rename meditech states -> interdyne in interdyne_id/pda meta.json
PNG files were renamed during NSFW cleanup but meta.json kept the old
'meditech' state names, breaking RSI validation. Validate RSIs now passes.
* Fix gun upgrades not immediately updating gun effects (#43856)
* Update Credits (#43847)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
* Fix gibbing aghost (#43177)
Update MindSystem.cs
* Change chemical dispenser and ChemMaster increments (#43829)
change increments
* chore(sanitization): debrand remaining meditech surfaces
* chore(sanitization): remove remaining PassionDrobe and lewd leftovers
* fix(server): correct PullController command bind type; rename Roboisseur.yaml -> .yml (#8)
- PullController.Initialize() was registering binds under PullingSystem instead
of PullController, causing a duplicate-binds warning on every server boot.
Upstream wizden fixed this in #36161; align VRS accordingly.
- Roboisseur.yaml had a .yaml extension which the prototype loader silently
ignores; renamed to .yml so the DV NPC prototype is actually loaded.
* chore(locale): reconcile en-US locale with upstream wizden (#9)
Adds 162 missing locale files from wizden/master (commands, features, UI strings)
and resolves 6 duplicate-key conflicts caused by upstream reorganizing ftl paths.
New files (upstream locale files missing from VRS):
- 76x commands/ - admin, toolshed, and dev command descriptions
- ~86x feature locale files (accents, atmos, chat, changeling, guidebook, etc.)
Conflict resolutions (duplicate key fixes):
- guidebook/chemistry/healthchange.ftl: deleted (key moved to entity-effects/healthchange.ftl)
- _DV/smartfridge/smartfridge.ftl: deleted (pure subset of upstream smartfridge/smartfridge.ftl)
- commands/toolshed-commands.ftl: stripped 47 duplicated keys; kept 4 VRS-unique hscale commands
- commands/mapping-client-side-setup-command.ftl: deleted (renamed to mappingclientsidesetup-command.ftl)
- commands/eye-commands.ftl: deleted (keys renamed; C# already uses new key names)
- commands/persistence-save-command.ftl: deleted (upstream subset; existing persistence/command.ftl is complete)
- guidebook/chemistry/effects.ftl: removed 3 terms duplicated in entity-effects/effects.ftl; kept 50 chem-specific keys
- chat/highlights/highlights.ftl: deleted; upstream chat/highlights.ftl is strictly superset
- accent/scottish.ftl (new): deleted; conflicts with _DV/accent/scottish.ftl which has VRS-extended word list
- salvage/job-board.ftl (new): merged 19 unique keys into cargo/bounties.ftl; deleted source
Build: 0 errors. YAML linter: exit 0.
* docs(changelog): add player-visible entries for wizden sync 2026-05-06 (#11)
- ChemMaster/chem dispenser new volume increments (wizden #43829)
- Gun upgrades immediately apply effects on insertion (wizden #43856)
* fix(guns): gun upgrades now immediately update gun effects (wizden #43856) (#10)
Cherry-pick of upstream wizden commit f53c7d6a9d. Move args.Handled
assignment to after RefreshModifiers so gun effects update immediately
when an upgrade is inserted.
---------
Co-authored-by: VRS Sync <sync@vrs.local>
Co-authored-by: Centronias <charlie.t.santos@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com>
Co-authored-by: rumaks <me@rumaks.xyz>
* fix(maps,items,physics): fix 5 inherited HL bugs (batch 1) (#13)
- fix(physics): conveyor belts now move all items, not just 1 per tile (HL #1328)
Removed _selected dict filter that capped items per conveyor to 1
- fix(prototypes): advanced jet injector now fits in medical bag (HL #1585)
Added Injector to whitelist.components in _NF medical_bag
- fix(prototypes): IPC gloves now visible in strip menu (HL #1593)
Moved gloves strippingWindowPos from 2,0 to 2,2 (collision with ears slot)
- fix(maps): ColComm evac docking arm firelocks added (HL #1305)
Added Firelock at each evac emergency airlock interior tile to prevent
decompression when emergency shuttle despawns
- fix(maps): ColComm cloning wing now has body scanner (HL #1434)
Added computerBodyScanner at 11.5,56.5 adjacent to cloning console
* perf(worldgen): preload chunks ahead of ship velocity (Mono #3882) (#14)
* perf(worldgen): preload chunks ahead of ship velocity (Mono #3882)
Prevents asteroids from spawning on top of fast-moving ships by offsetting
the chunk-load origin by one second of map-linear velocity before computing
the radius of chunks to load.
Also promotes the per-tick chunksToLoad dict to a class-level field and
calls .Clear() instead of allocating a new dictionary every frame.
Port of Monolith-Station/Monolith#3882 (by Ilya246).
VRS: non-design perf/bug fix; auto-include per sync policy.
* fix(ui): show localized job name in loadout window title (Mono #3878)
The loadout window title was constructed as `jobProto?.ID + "-loadout"` which
produced raw strings like "Passenger-loadout" instead of "Passenger loadout".
Port of Monolith-Station/Monolith#3878 (by kasature90).
VRS: UI bug fix; auto-include per sync policy.
* feat(content): port Mono #3899 organ harvesting machine
* feat(visuals): port Mono #3902 silicon CRT/VHS shader system
* feat(rcd): port Mono #3919 RCD corner plating and lattice tiles
* feat(structures): port Mono #3881 heavy-duty airlock
* fix(structures): fix YAML linter failures in heavy airlock port
- Replace type: AirlockGroup with type: paintableGroup (VRS uses spray-paint system)
- Replace type: PaintableAirlock with type: Paintable, remove Monolith-only department field
- Add HeavyStandard/HeavyGlass paintableGroups to Airlocks spray-paint category
- Remove 3 entities needing missing electronics (TsfEngineer, PdvCommand, GrandVizier)
- Remove name/description/icon from ConstructionPrototype (LocId validation)
- Fix construction graph door-electronics step name to use loc key
* fix(chat): refactor SubtleOOC as proper OOC channel with LOS filtering (#18)
Port of Triad #27 (commit 71eede6), adapted for VRS ObserverType enum.
Changes:
- Remove InGameICChatType.SubtleOOC; add InGameOOCChatType.SubtleLOOC
- Remove HardLight SubtleOOC-in-IC hack from TrySendInGameICMessage
- Add SendSubtleLOOC() method routed from TrySendInGameOOCMessage
- Add ICChatRecipientData.InLOS field computed via ExamineSystemShared
- Subtle messages now skip players without LOS (unless observer/admin)
- Move SubtleCommand and SubtleOOCCommand to Content.Server/_Floof/Chat/Commands/
- Rename subtleooc command to sooc
- Fix ghost players unable to filter/see Subtle/SubtleOOC channels
- Add FocusSubtle (Minus) and FocusSubtleOOC (Shift+LBracket) keybinds
- Add color entries for Subtle/SubtleOOC in ChannelSelectorButton
- Add locale keys for subtle-looc wrap message and keybind labels
* feat(content): port three Triad Sector QoL fixes (sinks/drains, bounty access, spray paint persistence) (#17)
- Add ShipRepairable to SinkEmpty (repairTime: 4, cost: 15) and FloorDrain
(repairTime: 5, cost: 20) so SRD can repair sinks and drains on ships.
Ported from Triad #34 (6967322).
- Broaden Command bounty board writeAccess/deleteAccess from HeadOfPersonnel
+ HeadOfSecurity to the 'Command' access group so any command-level crew
can manage command bounties. Ported from Triad #16 (65ee57b).
- Add spray paint persistence system (SprayPaintPersistenceSystem):
when a PaintableComponent entity is spray painted, stores the style in
SprayPaintOnMapInitComponent; on next MapInit (ship save/load) the style
is re-applied so painted entities keep their appearance across saves.
Renamed from Triad's SharedSprayPainterSystem to avoid collision with
the existing abstract class of the same name in Content.Shared.SprayPainter.
Ported from Triad #20 (76477fc).
Build: 0 errors. YAML linter: clean.
* fix(chat): move ChatChannel.Subtle/SubtleOOC to high bit positions to avoid future upstream collisions (#16)
* perf(worldgen): preload chunks ahead of ship velocity (Mono #3882)
Prevents asteroids from spawning on top of fast-moving ships by offsetting
the chunk-load origin by one second of map-linear velocity before computing
the radius of chunks to load.
Also promotes the per-tick chunksToLoad dict to a class-level field and
calls .Clear() instead of allocating a new dictionary every frame.
Port of Monolith-Station/Monolith#3882 (by Ilya246).
VRS: non-design perf/bug fix; auto-include per sync policy.
* fix(ui): show localized job name in loadout window title (Mono #3878)
The loadout window title was constructed as `jobProto?.ID + "-loadout"` which
produced raw strings like "Passenger-loadout" instead of "Passenger loadout".
Port of Monolith-Station/Monolith#3878 (by kasature90).
VRS: UI bug fix; auto-include per sync policy.
* feat(content): port Mono #3899 organ harvesting machine
* feat(visuals): port Mono #3902 silicon CRT/VHS shader system
* feat(rcd): port Mono #3919 RCD corner plating and lattice tiles
* feat(structures): port Mono #3881 heavy-duty airlock
* fix(structures): fix YAML linter failures in heavy airlock port
- Replace type: AirlockGroup with type: paintableGroup (VRS uses spray-paint system)
- Replace type: PaintableAirlock with type: Paintable, remove Monolith-only department field
- Add HeavyStandard/HeavyGlass paintableGroups to Airlocks spray-paint category
- Remove 3 entities needing missing electronics (TsfEngineer, PdvCommand, GrandVizier)
- Remove name/description/icon from ConstructionPrototype (LocId validation)
- Fix construction graph door-electronics step name to use loc key
* fix(prototypes): resolve activation-key conflicts on PDA, handheld computers, and cryopod
- Remove ToggleableGhostRole from BasePDA; the wipe-verb ghost role was
the only use and the component's ActivationVerb subscription conflicts
with PDA UI opening when the player presses E. Ported from Triad #21.
- Add onActivate: false to ItemToggle on BaseHandheldComputer so the
activation key routes to the UI rather than toggling the item.
Ported from Triad #23.
- Add onUse: false + onActivate: false to ItemToggle on CryoPod so the
health analyzer UI opens correctly on interaction. Ported from Triad #23.
No gameplay behavior changes; this only fixes activation-key routing.
VRS: Triad Sector refs: 2f12722 (PDA), 9439202 (handheld/cryo)
* fix(chat): move Subtle/SubtleOOC ChatChannel bits to top of uint range
Subtle and SubtleOOC were at bits 15 and 17, immediately above the last
upstream Wizden channel (Unspecified = 1<<14). Any new upstream channel
addition risks a silent bitmask collision.
Move both to 1u<<31 and 1u<<30 to leave the middle range free for future
upstream additions. All callers reference by name; no behavior change.
VRS: Triad Sector ref: 71eede6 (partial - bit position fix only; full
subtle chat refactor deferred pending VRS ObserverType adaptation)
* fix(activation): remove ToggleableGhostRole from BasePDA; fix ItemToggle onActivate for handheld/cryo (#15)
* perf(worldgen): preload chunks ahead of ship velocity (Mono #3882)
Prevents asteroids from spawning on top of fast-moving ships by offsetting
the chunk-load origin by one second of map-linear velocity before computing
the radius of chunks to load.
Also promotes the per-tick chunksToLoad dict to a class-level field and
calls .Clear() instead of allocating a new dictionary every frame.
Port of Monolith-Station/Monolith#3882 (by Ilya246).
VRS: non-design perf/bug fix; auto-include per sync policy.
* fix(ui): show localized job name in loadout window title (Mono #3878)
The loadout window title was constructed as `jobProto?.ID + "-loadout"` which
produced raw strings like "Passenger-loadout" instead of "Passenger loadout".
Port of Monolith-Station/Monolith#3878 (by kasature90).
VRS: UI bug fix; auto-include per sync policy.
* feat(content): port Mono #3899 organ harvesting machine
* feat(visuals): port Mono #3902 silicon CRT/VHS shader system
* feat(rcd): port Mono #3919 RCD corner plating and lattice tiles
* feat(structures): port Mono #3881 heavy-duty airlock
* fix(structures): fix YAML linter failures in heavy airlock port
- Replace type: AirlockGroup with type: paintableGroup (VRS uses spray-paint system)
- Replace type: PaintableAirlock with type: Paintable, remove Monolith-only department field
- Add HeavyStandard/HeavyGlass paintableGroups to Airlocks spray-paint category
- Remove 3 entities needing missing electronics (TsfEngineer, PdvCommand, GrandVizier)
- Remove name/description/icon from ConstructionPrototype (LocId validation)
- Fix construction graph door-electronics step name to use loc key
* fix(prototypes): resolve activation-key conflicts on PDA, handheld computers, and cryopod
- Remove ToggleableGhostRole from BasePDA; the wipe-verb ghost role was
the only use and the component's ActivationVerb subscription conflicts
with PDA UI opening when the player presses E. Ported from Triad #21.
- Add onActivate: false to ItemToggle on BaseHandheldComputer so the
activation key routes to the UI rather than toggling the item.
Ported from Triad #23.
- Add onUse: false + onActivate: false to ItemToggle on CryoPod so the
health analyzer UI opens correctly on interaction. Ported from Triad #23.
No gameplay behavior changes; this only fixes activation-key routing.
VRS: Triad Sector refs: 2f12722 (PDA), 9439202 (handheld/cryo)
* feat(gameplay): port Triad bugfixes and perf optimizations (#19)
- fix(docking): gas docks bypass PreventPilotComponent so meteors can dock
even when shuttle is under combat lockdown; also validate target shuttle
(Triad #3817, b9bdf2b4ed)
- perf(pathfinding): lazy-init PathPoly.Neighbors to avoid HashSet alloc
for every tile that never gains NPC neighbors; add HasNeighbors guard in
ClearPoly; remove unused Stopwatch in BuildBreadcrumbs (Triad #3853,
05462c43cb)
- perf(pathfinding): stop boxing PathfindingBreadcrumbFlag in IsEquivalent
and Equals comparisons (Triad #3853)
- fix(jetpack): auto-disable jetpack when player with active magboots lands
on a grid; prevent re-enabling jetpack on a gravity grid; guard
EntParentChanged handler with IsWeightless check (Triad #3781,
c512b27aa8)
* feat(radar): port Triad radar/gunnery UI enhancements (#21)
Port 4 Triad Sector commits:
- 5d71a166eb: remove gunnery thermal-signature YAML (reduces runtime spam)
- 6d6926858a: add NoRotate / RelativePanning fields to RadarConsoleComponent;
remove RotateWithEntity from NavInterfaceState; refactor
ShuttleNavControl & FireControlNavControl rotation logic
- 5a097d96db: compass ring and azimuth display in BaseShuttleControl
- a6599bcb8a: radar mode toggle buttons (azimuth/rotation/anchor/reset)
in ShuttleNavControl/NavScreen, with locale strings
Co-authored-by: Triad Sector contributors
* feat(triad): port 4 Triad commits (shipguns repairable, gun damage modifier, turret shootthrough, machine frame sizing) (#20)
Ports:
- 51797e0933: Add Climbable/ExaminableDamage/Repairable to ship artillery base entities (Triad #3387)
- a54a4193e6: GunComponent DamageModifier field + server apply + examine text (Triad #3731)
- f3c8c50d23: NPC turret shootthrough via GunTargetGoodCon + InRangeGoodTarget (Triad #3732)
- d14d180e3c: MachineFrame/MachineBoardComponent FrameSize field + size-check on board insertion (Triad #3703, C# only — YAML entities deferred pending RSI assets)
* feat(content): Triad shield balance retweaks + bunkbeds (#22)
* feat(content): port Triad shield balance retweaks + bunkbeds
From Triad Sector commits:
- 4984429f45 (#3860): Retweaks Shield Balance
- ShieldGeneratorTSFCapital: damageLimit 85000 (was 215000)
- ShieldGenerator (Titan): damageLimit 75000 (was 215000)
- ShieldGeneratorMedium (Aegis): damageLimit 180000 (was 168000)
- Add descriptions to POI, TSFCapital, Titan, Aegis, Sentinel generators
- 2374fb9bfc (#3859): Bunkbeds
- Add BunkBottom + BunkTop entities (parent: Bed)
- Add bunk.rsi sprites (bottom_bunk, top_bunk, top_bunk_posts, top_bunk_ladder)
Skipped: 72a8e6ea5d (#3854) T2-T5 rad blocking — targets Triad-specific
_Mono tiered wall prototypes (WallT1-T4) that don't exist in VRS.
* revert(shields): restore VRS damageLimit values; keep descriptions only
* feat(construction): port Mono 2x2 machine frame system for ThrusterLarge (#23)
- Add Machine2x2 construction graph (ported from Triad d14d180e3c)
- Add UnfinishedMachineFrame2x2/MachineFrame2x2/MachineFrameDestroyed2x2 entities
- Add frame_2x2.rsi and frame_2x2_icon.rsi sprites
- Override ThrusterLarge construction graph to Machine2x2
- Add frameSize: 2x2 + Capacitor/Steel requirements to CivBigThrusterBoard
- Preserve VRS thrust values (2000 base, upgradeable) and HP (1800)
- Thruster now deconstructs to machineFrame (recoverable) instead of full destroy
* feat(freelancer): port Triad freelancer content to VRS (#24)
* feat(construction): port Mono 2x2 machine frame system for ThrusterLarge
- Add Machine2x2 construction graph (ported from Triad d14d180e3c)
- Add UnfinishedMachineFrame2x2/MachineFrame2x2/MachineFrameDestroyed2x2 entities
- Add frame_2x2.rsi and frame_2x2_icon.rsi sprites
- Override ThrusterLarge construction graph to Machine2x2
- Add frameSize: 2x2 + Capacitor/Steel requirements to CivBigThrusterBoard
- Preserve VRS thrust values (2000 base, upgradeable) and HP (1800)
- Thruster now deconstructs to machineFrame (recoverable) instead of full destroy
* feat(freelancer): port Triad freelancer systems to VRS
C# Systems:
- NoHack/NoDeconstruct components (gates on wires + construction)
- GatherableHitscan: hitscan weapons trigger gatherable logic
- HitscanDamageDealtEvent: new shared event raised by GunSystem
- GridRaider: raider zone component + system
- BlankRule/AutoExtendRule: station event helpers
- DriftingPrice: economy commodity price drift
- ScuttleDevice: grid self-destruct with do-after
- ClaimableGrid/GridClaimer: player grid claiming
- GridModifier: data-driven grid entity replacement
- RoundEndTimeRule: override round end time via game rule
YAML Prototypes:
- USSP bounties (10 new entries)
- Pirate bounty rebalance (7 new entries, dedup RTG/Techfab/Cybernetics)
- GridModifier presets
- Monolithic event scheduler + fragment spawn rules
- Round end / portstrike announce timing rules (stubs for faction ships)
- POI prototypes: Sevastopol, DerelictDrillsite, USSPCamelot, AnomalousLab, Lancelot, Polaris, AutomatedTanker
- Base POI abstracts: BaseMobilePOI, BaseRepairablePOI
- RecordsFrontierOutpostCargo station
- Monolithic event table
Maps:
- 3x Monolithic arena/spindle/ship maps (copied from Triad)
- 7x POI maps: sevastopol, derelictdrillsite, camelot, anomalouslab, lancelot, polaris, ruin_tanker
Locale (en-US):
- scuttle-device, grid-claimer, events/monolithic, gamerules/announcement
- Pirate bounty strings (updated), USSP bounty strings (new)
* fix(freelancer): remove round-end timing rules from timings.yml
VRS does not use forced round restarts at 3 hours.
Removed RoundEndRuleHour3 and RoundEndRuleMinute2 entries.
Portstrike announce rules retained.
* fix(poi): delete POI grids at round end; clean up server rules
NfAdventureRuleSystem: on RoundRestartCleanupEvent, QueueDel all grid
UIDs in CargoDepots, MarketStations, RequiredPois, OptionalPois, and
UniquePois. POIs without a GameMapPrototype are not station-owned and
were previously orphaned on the map between rounds.
Rules.txt: reformatted for VRS. Changes:
- Updated branding (Frontier -> VRS)
- Fixed typos (Implimentation, recieving, 'with with')
- Removed Section 9 (ERP) — not applicable to VRS
- Removed unexplained footnote markers (*1/*2/*3)
- Consistent color coding and spacing throughout
- Clear enforcement-tier explanation in header
- Table of contents reflects section removal
* feat(planet): landgrab plot cartridge, biome preview, and ambient procedural spawner (#25)
* feat(planet): landgrab plot cartridge, biome preview, and ambient procedural spawner
Adds three integrated systems for persistent planet gameplay:
1. Landgrab PDA cartridge (Content.{Shared,Server,Client}/_VRS/Planet/*):
purchase a 32x32 plot grid at the player's current location, save/load
to per-player YAML under UserData/planet_plots/{ckey}/, autosave on
round restart, and engrave a held coord-disk with a saved offset so
shuttle pilots can land precisely on the spot later.
2. Shuttle console biome preview overlay (Content.Client/Shuttles/UI/
ShuttleMapControl.PlanetOverlay.cs): when targeting a biome planet,
draws coloured tile sample quads (rock/grass/snow/lava/etc.) and
gold rings + labels for any inserted Landgrab disks so pilots can
see free landing zones before FTL. Frame-cached and stride-floored
for negligible client cost.
3. Procedural planet spawner (Content.Server/_VRS/Planet/
PlanetSpawner*): registers wandering mob marker layers (xenos,
explorers, salvage carps) on map init, then periodically rolls
dungeons in regions clear of player plots and shuttles. Defaults
tuned conservatively (5 min interval, max 6 dungeons, 4000-tile
exclusion radius) and exclusion sources are snapshotted once per
roll instead of re-queried per candidate.
* feat(planet): VRSPersistentPlanet game rule auto-spawns the planet at round start
Adds a game rule that, on Started, creates a fresh map, calls
BiomeSystem.EnsurePlanet with a configurable biome template (default
Continental for grass/snow/lava/caves variety), attaches the
PlanetPlotRegistryComponent + PlanetSpawnerComponent, sets a green IFF
colour, picks a random name from a configurable pool (Aetheria, New
Eden, Frontier-7, ...), and drops an FTLPoint beacon at the planet
origin so any shuttle console finds it as a destination automatically.
Wired into the NFAdventure preset so a planet appears every round
without admin intervention. Map size is unbounded — biome chunks
generate lazily 8x8 tiles at a time as players approach, so 20k+ tile
exploration costs the same as standing at origin.
* feat(planet): show plot footprints and dungeon markers on shuttle console preview
- New shared PlanetDungeonRegistryComponent on the planet map mirrors the
spawner's dungeon list over the network so clients can draw markers even
for dungeons in unloaded biome chunks.
- DrawLandgrabPlotMarkers: cyan footprint outline + owner name for every
LandgrabPlot grid on the viewed map.
- DrawDungeonMarkers: red diamond + dungeon-config name for every entry
in the dungeon registry on the viewed map.
Pilots can now see, before clicking, where every player plot sits and
where every spawned dungeon is — independent of which biome chunks the
client has loaded.
* feat(planet): block shuttle console FTL within 1000m of dungeons
Reads the target map's PlanetDungeonRegistryComponent and rejects any
ConsoleFTL whose target position is within 1000m of a spawned dungeon.
Pilots get a yellow popup explaining the abort. Prevents shuttles from
landing directly on top of (or adjacent to) procedurally-spawned hostile
sites.
* feat(planet): prune cleared dungeons so new ones can spawn
Before each spawn roll the planet spawner scans every previously-spawned
dungeon's clearance radius (default 600 tiles) for live HTN-driven mobs.
Dungeons whose radius is empty are removed from both the spawn list and
the networked PlanetDungeonRegistryComponent (so client preview markers
also disappear). This keeps the dungeon cap a measure of *active* world
load rather than a permanent one, letting fresh sites appear elsewhere
once players (or anything else) have wiped the original garrison.
---------
Co-authored-by: Kronyxxx <kronyxxx@users.noreply.github.com>
* fix(migration): remap removed PlushieDrakeborn to PlushieCarp for colcomm.yml (#27)
Without the migration entry, colcomm.yml fails to load entirely because it references a deleted PlushieDrakeborn prototype.
Note: the original draft of this PR also added a server-only DockingArmGenerator component to the shared Gateway entity prototype, which crashed clients during prototype deserialization (unknown component on the client). That change has been dropped; docking-arm work will land in a follow-up that places the component on a server-only entity prototype.
* fix(planet): FTL destination + biome grid cleanup + PlushieDrakeborn migration (#28)
* fix(client): wrap Task.WhenAll args in array to avoid sandbox violation
C# 13 binds Task.WhenAll(t1, t2) to the new params ReadOnlySpan<Task>
overload, causing the compiler to emit <>y__InlineArray2 + Unsafe.As +
MemoryMarshal.CreateReadOnlySpan helpers in <PrivateImplementationDetails>.
All three are on the SS14 sandbox blocklist, so Content.Client failed type
checks at startup with:
System.AggregateException: Assembly Content.Client failed type checks.
Wrapping the args in 'new[] { ... }' forces the legacy params Task[] overload
and emits no banned helpers.
* fix(planet): register FTL destination, prevent biome grid cleanup, add PlushieDrakeborn migration
- VRSPersistentPlanetRuleSystem: use TryAddFTLDestination() instead of raw
EnsureComp so shuttle consoles are refreshed and the planet appears in the
FTL scan. Also add MapGridComponent + PVS global overrides on the map and
beacon so clients receive the entities before any tiles are loaded.
- OrphanedGridCleanupSystem: skip cleanup for grids with BiomeComponent.
Biome planets start with 0 tiles (lazy generation), causing the cleanup
system to delete them shortly after spawn.
- migration.yml: remap PlushieDrakeborn -> PlushieCarp to fix Colcomm map
load failure caused by a missing prototype reference.
* feat(planet): plot border overlay and free-FTL anywhere on planet (#29)
* feat(planet): plot border overlay and free-FTL anywhere on planet
- Remove beaconsOnly restriction so ships can FTL to any coordinate on
the planet map, not just to the beacon
- Network LandgrabPlotComponent (OwnerCKey, OwnerName, PlotSize) so
client-side overlay has correct ownership data
- Add LandgrabPlotBorderOverlay: in-world WorldSpaceBelowEntities overlay
that draws white rectangle borders around owned plots (own = white,
others = muted teal), only active when on a PlanetPlotRegistry map
- Add LandgrabPlotBorderSystem: registers/unregisters the overlay on
player attach/detach
- Update ShuttleMapControl.DrawLandgrabPlotMarkers: own plot now drawn
in bright white on the FTL console map, other plots remain cyan
* fix(planet): network registry component; reduce dungeon spawn distances
- Add [NetworkedComponent] to PlanetPlotRegistryComponent so the client
can detect it in BeforeDraw and the plot border overlay actually renders
- Reduce MinDistFromActivity 4000→300 and MinDistBetweenDungeons 2000→600
so dungeons and roaming spawns appear at 300-1000 tile range
* fix(planet): reduce roaming AI spawn spacing to 150-200 tiles
radius 600-800 → 150-200, size 256 → 64 so wandering packs are
encountered much more frequently as players explore the planet
* feat(planet): garrison-populated preseed dungeons, ramping mob density, landgrab overlay, MAP tab fix (#30)
* fix(shuttles): seed map list on first MAP tab open
Avoids requiring a manual scan click to populate sector objects when the
shuttle console MAP tab is opened for the first time in a round.
* feat(landgrab): always-visible plot overlay with PVS global override
- Render plot borders in WorldSpace as filled rects so biome floors no
longer hide them; own plot gets a soft white fill, others get cyan
borders.
- Refactor LandgrabPlotBorderSystem to register the overlay both on
LocalPlayerAttachedEvent and immediately at Initialize() if the player
was already attached (fixes overlay never appearing if Initialize ran
late).
- Add PVS global override for every LandgrabPlotComponent on the server
so plot data reaches all clients regardless of distance, including
newly purchased and save-loaded plots.
* tune(planet): densify wandering mob marker layers
Tightens spacing radii and increases pack sizes / max counts for the
six wandering factions so a freshly-loaded planet feels populated long
before the dungeon spawner ramps up.
* feat(planet): preseed dungeons with garrisons, FTL beacons, and ramping mob density
Three changes to the persistent-planet spawner so a fresh planet feels
alive before any chunk-driven roll fires:
- Pre-seed N (default 4) dungeons in a configurable ring at planet
creation, each with a placed FTLPoint beacon so the shuttle console
surfaces them as selectable destinations.
- Spawn a garrison (default 25) of mobs in a small ring around every
pre-seeded dungeon center. DungeonSystem.GenerateDungeon only places
terrain, so dungeons would otherwise be empty.
- Add a time-scaled ambient mob spawner that picks a random player on
the planet and spawns a small pack nearby; pack size and interval
ramp from 1 mob / 60 s at round start to ~5 mobs / 8 s after one hour
of elapsed planet time. Hard cap at 80 live ramp mobs so the planet
never melts the tick rate.
Also lowers ambient roll cadence (RollInterval 5 min -> 45 s) and the
minimum distance from player activity (300 -> 96 tiles) so chunk-driven
rolls actually succeed on the small loaded biome footprint around a
single explorer.
* feat(planet): planet combat event system with FTL restrictions and optimizations (#31)
- Implement planet combat contract events spawning roaming mob groups and dungeon assaults
- Add difficulty-based briefcase rewards (Easy: 5k, Moderate: 10k, Hard: 20k SpaceCash)
- Mark contract locations on FTL map; only allow landing outside 50m no-landing radius
- Contract mob packs spawn as single species to prevent infighting; include boss mob
- Global announcements on contract start and completion
- Throttle contract member completion scans from per-tick to 1-second interval with clamping
- Add interval sanitization to prevent misconfiguration from degrading to per-tick polling
- Use world-space position checks for FTL radius validation (correct regardless of grid origin)
- Add PlanetEventFTLOverrideComponent to tag contract beacons with no-landing zones
- Create briefcase prototypes for contract rewards
- Localization for contract announcements and FTL restriction messages
Perf: O(active_contracts × members) scans reduced to interval-based polling (~14μs max on typical configs)
* chore(locale): align planet contract announcements with event tone (#32)
* feat(machines): port Goobstation ItemMiner / PowerConsumerMiner / PlanetMiner (#34)
Ports the passive item-mining component framework from Triad_Sector
(originally Goobstation). These power machines such as the Mono tech
disk printer, crypto datafarm and laser drill, which are introduced
by the hostile shuttle event content port (#33).
Components:
- ItemMinerComponent (shared): periodically spawns a configured proto
while powered/anchored, with optional sound and chance.
- PowerConsumerMinerComponent (server): gates an ItemMiner on having
enough HV/MV power draw via PowerConsumerComponent.
- PlanetMinerComponent (server): gates an ItemMiner on being on a
planet grid (optionally an expedition planet, optionally lattice).
Systems:
- ItemMinerSystem: per-tick check + spawn loop, uses ApcPower by
default, plays mining/mined audio, merges into nearby stacks.
- PowerConsumerMinerSystem / PlanetMinerSystem: subscribe to the
ItemMinerCheckEvent to add their respective gating conditions.
This PR ports only the system code. Wiring these components onto
the Mono machine prototypes (TechDiskPrinter, DatafarmCrypto,
LaserDrill...) will follow once the events PR (#33) lands; those
prototypes are introduced by that PR with the component refs stripped
for buildability.
* feat(radiation): port ChainRadiationSystem from Mono (#35)
Adds the cascading-radiation reactor mechanic from Triad/Mono. Entities
with this component re-emit incoming radiation amplified by a coefficient
and detonate once they cross a configurable threshold, optionally
gathering nearby chain entities for a combined explosion.
Adapted for VRS:
- Mono originally mutated ExplosiveComponent fields directly to
configure the explosion. ExplosiveComponent has been locked to
SharedExplosionSystem access in upstream, so the explosion type,
intensity, slope and max intensity are now stored on
ChainRadiationComponent itself and dispatched via QueueExplosion.
- Default ExplosionType is 'Default' (override per-prototype).
Code-only port. Wiring onto Mono outpost powercores follows once the
events PR (#33) lands; that PR currently strips the ChainRadiation
component refs for buildability.
* feat(shipyard): port SavingContraband 'do not save' marker from Triad (#36)
Adds the SavingContraband component/system from Triad_Sector. Entities
tagged with this component are removed from a grid before the
ShipyardGridSaveSystem serializes it, and announce themselves on
examine with class-1/2/3 contraband flavor text.
Used by Mono datafarms, faction servers, outpost powercores, the
crypto datafarm and similar machines that are either illegal to own
or break ship saving (introduced by #33).
Changes:
- Content.Shared/_Triad/Shipyard/SavingContrabandComponent.cs (new)
- Content.Shared/_Triad/Shipyard/SavingContrabandSystem.cs (new)
- ShipyardGridSaveSystem: new RemoveSavingContrabandEntitiesOnGrid
pass invoked alongside the existing serialization-cleanup pass.
- Locale: ship-saving-contraband-{1,2,3}-text strings ported.
This PR ports infrastructure only. Wiring SavingContraband onto the
Mono machine prototypes follows once #33 lands; that PR currently
strips the component refs for buildability.
* feat(combat): port ArmorThickness + ArmorPiercing from Mono (#37)
Adds the wall-piercing projectile mechanic from Triad_Sector (originally
Mono):
- ArmorThicknessComponent: marks an entity (typically a hull wall) with
a thickness value and whether it can be pierced at all.
- ArmorPiercingComponent: marks a projectile with a piercing thickness;
on collision with an Impassable wall whose ArmorThickness can be
pierced, the collision is cancelled (the projectile passes through)
and the projectile's piercing budget is halved. Already-pierced
entities are skipped silently.
All shared, networked, hooked into the existing PreventCollideEvent —
no upstream-system modifications. Behaviour-neutral until prototypes
opt in.
This is Phase 5 of the Mono hostile shuttle event content port. The
nanolaminate hull walls introduced by #33 currently omit ArmorThickness
for buildability; once this PR lands they can be re-armed with
'thickness: 10'.
* feat(events): port Mono hostile shuttle station events (v2 rebased) (#33)
* feat(events): port Mono hostile shuttle station events from Triad_Sector
Brings VRS up to parity with Triad/Mono on procedural enemy-ship
encounters. Until now the three faction rule files
(damaged_ai/chimera/asakim) shipped fully commented-out because their
maps + entity dependencies had never been ported, so no enemy ships ever
actually spawned during NFAdventure rounds.
This PR ports the full chain end-to-end:
* New base+schedulers in _Mono/GameRules/base.yml:
- BaseRandomShuttleRule (parent, RuleGrids + LoadMapRule)
- MonoAISTCShuttleSpawnerScheduler (T1, 1h start, 90-120m cadence)
- MonoAISTCShuttleSpawnerSchedulerTier2 (3h start, 60m cadence)
- MonoAsakimSTCShuttleSpawnerScheduler (1h start, 60-120m)
- MonoChimeraSTCShuttleSpawnerScheduler (1h start, 40-80m)
- Round-restart/portstrike timing rules intentionally NOT touched.
* Uncommented damaged_ai.yml / chimera.yml / asakim.yml so the
UnknownShuttle* rules and entityTables actually load.
* Wired the four schedulers into the NFAdventure preset.
* Copied 12 ship maps to Resources/Maps/_Mono/ShuttleEvent/
(asakim_small/medium, zenith/_e, wyrm, wyvern, razorn, nebula,
sakuratsu/olympus/tethys/legionnaire chimera).
* Copied 20 source prototype YAMLs the maps depend on:
Iridite/fissile/depleted-uranium materials, Monolithic crystals,
Chimera flesh kudzu, redacted Station-AI silicon, Outpost power core,
rogue thrusters, Mono nanolaminate/plastitanium-capital walls,
Drake Industries emblem, RMC14 semiotic signs, redacted borg modules,
RogueSilicon research disks, ScuttleDeviceRazorN/Wyvern,
PowerCellCombat lathe recipe, ghost-role spawners
(Asakim Warriors, Chimera ghostroles, Redacted Borg).
* Copied 23 sprite directories (.rsi) backing those entities.
* Appended BaseMonolithContrabandT1/T2/T3 abstract parents to
base_contraband.yml without disturbing existing VRS contraband
customizations.
Gameplay impact: NFAdventure rounds will start broadcasting
'AI shuttle / Chimera shuttle / Asakim shuttle detected' announcements
~1-3 hours in, then on cadence. Crews can engage and salvage; new ghost
roles (Asakim Warriors, Chimera, Redacted Borg) become available to
ghosts on those grids; new lootable materials (Iridite, fissile uranium,
Monolithic crystals) leak into the salvage economy. Largest ships gated
behind 32-60+ playercount.
* fix(events): adapt mono hostile shuttle port for VRS components
* feat(events): port hostile shuttle event prototype dependencies (Phase 1)
Adds the prototypes referenced by the Mono hostile shuttle event POI
maps that were missing in VRS. With these the ported ship POIs load
without unknown-prototype warnings.
Prototypes added (parented to existing VRS bases where possible):
- WeaponLauncherRocketEmp (EMP RPG variant)
- PoweredStrobeRedEnabled (pre-on red strobe)
- WeaponTurretLaserSyndicateNF + SpawnMobWeaponTurretLaserSyndicateNF
- AirlockExternalGlassRogueLocked, AirlockShuttleSyndicateRogueLocked,
AirlockHatchRogueLocked (Rogue-named aliases of VRS's Pirate-locked
airlocks; preserves Triad map IDs without map edits)
- AirlockShuttleSyndicateCapital + AirlockGlassShuttleSyndicateCapital
(capital-class buffed docking airlocks)
- RogueSiliconResearchDisk25000 / 50000 (boss/elite loot disks)
- AirAlarmXeno (alien-styled air alarm)
- RadarEdgeMarkerCenter (central grid edge marker variant)
Sprite assets copied from Triad_Sector:
- Resources/Textures/_Mono/Objects/Specific/Research/researchdisk.rsi
- Resources/Textures/Structures/Wallmounts/air_monitors_xeno.rsi
Outstanding: WallNanolaminate(Diagonal) intentionally deferred until
ArmorThickness component port (Phase 5).
* feat(events): stub WallNanolaminate(Diagonal) for capital event ships
The wyrm/wyvern hostile shuttle event POI maps reference Mono's
nanolaminate hull walls. The original Mono prototype carries an
ArmorThickness component (armor-piercing damage modifier) that has not
been ported to VRS yet.
These stub variants replicate HP, density, sprites and construction
behaviour so the maps load and behave as standard reinforced hull
plating. ArmorThickness damage modifiers will be layered on in a
follow-up PR alongside the component port.
* fix(walls): substitute WallLayer for missing DiagonalWallLayer enum
VRS's CollisionGroup enum does not yet define DiagonalWallLayer (Mono
addition). Use the standard WallLayer to match existing VRS diagonal
walls (Resources/Prototypes/Entities/Structures/Walls/walls.yml) and
unblock the YAML linter on the events PR.
If the Mono-style diagonal-wall collision profile (Opaque |
HighImpassable | MidImpassable | LowImpassable | BulletImpassable, no
InteractImpassable) is wanted later, the enum value can be added in a
small Content.Shared follow-up.
* fix(events): trim Mono hostile-ship event prototypes to satisfy YAML linter
Resolves the ~155 YAML Linter errors on PR #33 by:
* Trimming each Mono prototype file to only the IDs actually referenced
by event ship maps (PlayerStationAiRedacted, BorgModuleRedactedRCD,
SpawnLootTechDisksT3Fracture, SpawnLootTechDisksPrinterT4,
SpawnRedactedBorg{,Playtime}, SpawnChimeraGhostrole,
SpawnMobWeaponTurretLaserSilicon, MonolithContrabandT{1,2,3}, etc.).
* Substituting unported circuitboards with VRS equivalents
(ThrusterRogueMachineCircuitboard -> ThrusterMachineCircuitboard;
EliteRadarCircuitboard / StationRadarCircuitboard ->
RadarConsoleCircuitboard).
* Substituting WeaponTurretLaserSilicon with WeaponTurretLaserSyndicateNF.
* Porting required Mono primitives missing from VRS:
- Tags WallT4 + CartridgeRocketEmp
- Stacks Pyrogel/Iridite/UraniumFissile/UraniumDepleted
(Plastitanium dropped — already defined in HL).
- ContrabandSeverity MonolithContrabandT1/T2/T3
- Reagent NaturalLetoferol (stub; full chimera deps not ported).
- AccessLevel/Group GrandVizier, PDVCommand, TsfmcEngineering,
TsfGeneralNoBrig.
- Mono Datasets/Names + matching localizedDatasets for the AI core
nameSegments (LocalizedDatasetPrototype required by VRS RandomMetadata).
- Locale strings: stack-pyrogel, contraband-examine-text-monolith-loot-{1,2,3},
scuttle-device-razor-announcement-sender, dataset-mono-remnant-*.
* Removing duplicates that crashed prototype loading
(PlushieDrakeborn migration entry; FactionGear/OtherFactionGear
contrabandSeverity already in NF; Plastitanium stack/loc already in HL).
* Deleting orphan Mono debug.sweps.yml (uses unported BallisticAmmoProvider
field 'ignoreWhitelist') and the borg_chassis.yml / Recipes/Lathes/
powercells.yml prototypes whose dependents (Mono borg roster, Smilodon
battery cells) are not yet ported.
* Carrying ChainRadiationComponent/System.cs sources so the rewire PR can
bind ChainRadiation onto SheetUraniumFissile cleanly.
Verified locally: dotnet run --project Content.YAMLLinter reports
'No errors found'.
---------
Co-authored-by: Kronyxxx <kronyxxx@users.noreply.github.com>
Co-authored-by: copilot <copilot@vrs.local>
* feat(events): rewire ported Mono components onto stripped prototypes (#38)
Re-attaches the four Mono components that PR #33 stripped for
buildability, now that the underlying systems have been ported in
follow-up PRs:
- ChainRadiation on SheetUraniumFissile (ported in #35).
Uses the new VRS-side 'explosionType: Radioactive' field on
ChainRadiationComponent (Mono originally read this from
ExplosiveComponent, which is now locked to SharedExplosionSystem).
- ItemMiner + PowerConsumerMiner on the Mono disk printer
(ported in #34).
- SavingContraband on outpost powercores (ported in #36).
- ArmorThickness on BaseWallTier{One..Four}, BaseWallOutpost, and
WallNanolaminate / WallNanolaminateDiagonal (ported in #37).
Components that remain stripped (their systems are still deferred):
AdvancedPilot, ShuttleBoostingPilot (Phase 3), Scrammer (not yet
ported), CollectiveMind (Phase 2a), LanguageKnowledge (Phase 2b).
* feat(mono): port Scrammer random-teleport action system (#39)
Ports the Mono ScramActionSystem from Triad. Grants entities with the
ScrammerComponent an instant action that random-teleports them within a
configurable radius. Used by Mono silicon mob templates (and reusable
for any future mob/borg port that needs a panic-teleport action).
Includes:
- Content.Shared/_Mono/Teleportation/TeleportSpecifier.cs: configuration
block consumed by RandomTeleport.
- Content.Shared/_Mono/Teleportation/ScrammerComponent.cs: component +
ScrammerScramEvent (instant action event).
- Content.Server/_Mono/Teleportation/ScramActionSystem.cs: action grant/
remove on map-init/component-remove + scram event handler. Honors
ItemToggle when ItemToggleToggle is set (so EMP-disabled borgs lose
the action).
- Resources/Prototypes/_Mono/Actions/scram.yml: ActionScrammerScram and
ActionScrammerScramADM (charged variant) action prototypes.
- Resources/Locale/en-US/_Mono/actions/scram.ftl: disabled-popup string.
- Adds RandomTeleport(EntityUid, TeleportSpecifier) overload to the
existing Goobstation TeleportSystem; degrades MinRadiusFraction /
AvoidSpace / ForceSafe to current radius/sound/attempts behavior
(documented in source).
* feat(mono): port AdvancedPilot + CrewedShuttle dual-console gating (#40)
Ports the Mono crewed-shuttle dual-console restriction system from Triad.
On grids with CrewedShuttleComponent, a single user cannot have both a
shuttle console and a gunnery console open at the same time on that grid;
the AdvancedPilotComponent marker overrides the restriction per-user.
Includes:
- Content.Shared/_Mono/Ships/Components/AdvancedPilotComponent.cs:
marker component granting dual-console capability.
- Content.Shared/_Mono/Ships/Components/CrewedShuttleComponent.cs:
marker component flagging a shuttle as crewed.
- Content.Server/_Mono/Ships/Systems/CrewedShuttleSystem.cs:
AnyShuttle/GunneryConsoleActiveByPlayer queries used by the gates.
- Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs:
OnConsoleUIOpenAttempt gates shuttle-console open against any open
gunnery console on the same grid.
- Content.Server/_Mono/FireControl/FireControlSystem.Console.cs:
symmetric gate on the fire-control console open path. Adds the
ActivatableUIOpenAttemptEvent subscription.
- Resources/Locale/en-US/_Mono/shuttles/shuttle-console.ftl:
shuttle-console-crewed popup string.
The CrewedShuttle tag (Resources/Prototypes/_Mono/tags.yml) is already
present in VRS but unused. Vessels can now opt in by declaring
CrewedShuttleComponent directly via the vessel's AddComponents block,
or via prototype on the grid template. A future PR can wire a tag
check during shipyard purchase to EnsureComp automatically.
* feat(mono): port ShuttleBoostingPilot system + per-pilot motion multipliers (#41)
Ports the Mono ShuttleBoostingPilotComponent/System from Triad and the
minimal MoverController plumbing it needs. Pilots can now contribute
per-pilot multipliers to their shuttle's angular thrust and linear
acceleration via GetShuttleInputsEvent; multipliers are averaged across
active pilots each frame and stored on ShuttleComponent for consumption
by torque/thrust calculations.
Includes:
- Content.Server/_Mono/Shuttles/Components/ShuttleBoostingPilotComponent.cs
- Content.Server/_Mono/Shuttles/Systems/ShuttleBoostingPilotSystem.cs
Plumbing changes:
- Content.Server/Physics/Controllers/MoverEvents.cs: extends
GetShuttleInputsEvent with AngularMul / AccelMul (default 1f).
- Content.Server/Shuttles/Components/ShuttleComponent.cs: adds
AngularMultiplier / AccelerationMultiplier (default 1f).
- Content.Server/Physics/Controllers/MoverController.cs:
* accumulates per-pilot AngularMul/AccelMul during HandleShuttleMovement,
averages by active pilot count, writes to shuttle.AngularMultiplier /
.AccelerationMultiplier; resets to 1f when no pilots.
* GetAngularAcceleration multiplies AngularThrust by AngularMultiplier.
* GetDirectionThrust multiplies result by AccelerationMultiplier.
* Direct AngularThrust torque sites in brake / steer paths multiply
by AngularMultiplier as well.
No prototype currently consumes ShuttleBoostingPilotComponent; mob/borg
consumers (e.g. ADM silicon) will land in their own ports. This PR…
fenndragon
added a commit
that referenced
this pull request
May 19, 2026
* chore(sanitization): port cleanup and content removals from fork plan
* chore(engine): bump RobustToolbox to v276.0.0
Update RobustToolbox submodule pin from 4b04081 to 46a56ce (v276.0.0).
This matches the engine commit referenced by upstream Wizden content.
Engine-only change; no VRS code modifications in this commit.
Notable upstream items in this range (fixes/perf/platform):
- Fix cross-grid collisions (#6542)
- Fix SetCoordinates causing unexpected reparenting (#6533)
- Fix BUI EntitySystem injection (#6515)
- Fix TryGetEntitySystem/GetEntitySystemOrNull on uninitialized manager (#6512)
- Fix bad cast syntax with IRobustCloneable field deltas (#6536)
- Catch NetEncryption exceptions (#6498)
- Always clean up render handle state after overlay draws (#6508)
- Fix ScrollContainer measure invariant (#6494)
- HRTF support through openal-soft (#6511)
- Allow hex colour input (#6485)
- Allow static abstract through the sandbox + INumber (#6432)
- Make IDependencyCollection constructable (#6466)
- Expose more fields on AudioComponent (#6510)
- record bandwidth usage on release (#6545)
- More comprehensively tag auto-generated code (#6541)
- Add parent check debug assert in SharedContainerSystem.Insert (#6532)
- Fully remove obsolete methods in MapGridComponent (#6476)
* chore(engine): cherry-pick wizden #41855 — v269.0.0 RT update + .NET 10
Cherry-picked from space-wizards/space-station-14 commit 787330f5c6
to bring VRS in line with upstream's v269+ build system (required for
RobustToolbox v276.0.0 already pinned on this branch).
Includes:
- New MSBuild/Content.props imported by all content csprojs.
- Switched all content csprojs from direct ProjectReference of Robust
components to upstream's Imports/*.props mechanism.
- Replaced SpaceStation14.sln with SpaceStation14.slnx.
- Various small content code adjustments to align with new RT APIs
taken verbatim from upstream.
- Added DepsHandler for ServerPackaging.
VRS-specific resolutions:
- Sanitization-deleted upstream files (Codewords, EdiblePrototype,
SmartFridgeComponent, ObjectiveCommandsTest) kept deleted.
- Preserved VRS-only csproj items (Folder Includes, .CM14 globs,
Goobstation Compile Includes, Configurations/Platforms, DebugOpt).
VRS:
* fix(content): satisfy RT v276 analyzers (RA0017/RA0020/RA0032)
Mechanical fixes for analyzers that became stricter under RobustToolbox v276:
- RA0017 (DataDefinition must be partial): added 'partial' modifier to 22
prototype/component types across DV/Mono/Funky/Goob/NF/RMC/Emberfall/Shitmed
and core (RCDPrototype, PsionicsRecord, NanoTask*, NanoChat*).
- RA0020 (DataField property needs setter): added '{ get; private set; }'
(or replaced 'init;' with 'set;') on prototype ID/Parents/Abstract/etc.
across Cargo, DV, Goob, NF, Silicons, StatusIcon, Roles, InteractionVerbs,
Nyanotrasen Kitchen, BorgType.
- RA0032 (duplicate [Dependency] field): in SharedBodySystem partials,
removed Shitmed-side duplicate _gameTiming/_prototypeManager/_damageable
declarations and rewired call sites to use the upstream-side
_timing/Prototypes/Damageable fields. VRS comments mark the rewires.
VRS:
* wip(content): MapGrid migration (8 files) + sanitization-fallout fixes (8 files)
Snapshot before pivoting to upstream merge strategy. Not for upstream PR.
MapGrid: ported instance methods to SharedMapSystem on Entity<MapGridComponent>
in Content.Shared (TurfHelpers, Anchorable, Anomaly, Interaction,
MoverController, Biome, Construction, NearbyTilesPercent).
Sanitization-fallout: removed dead 'using Serilog/Linguini/FloofStation' and
dead VoreSystem dep; switched JobWhitelistManager to ISawmill and
PlantSpeciesChange to Robust Logger.
* fix(content): remove dead Client-side imports (OpenToolkit, Serilog)
Phase 2A cleanup. v269 build system no longer transitively pulls these
packages, but the imports were never actually used.
- Content.Client/_Crescent/PointCannons/TargetingConsoleBUI.cs: drop unused
'using OpenToolkit.GraphicsLibraryFramework;'
- Content.Client/_Floof/Examine/CustomExaminePart.xaml.cs: drop unused
'using Serilog;'
Content.Client now compiles clean.
* fix(build): add OpenTK.Mathematics central package version
* fix(server): resolve remaining RA0017/RA0020 prototype/datarecord errors
* fix(content): complete RT v276 Phase 2B compatibility migration
- add compatibility shims for removed MapGridComponent instance APIs
(TileIndicesFor, GridTileToLocal, TryGetTileRef, GetAnchoredEntities,
GetAnchoredEntitiesEnumerator, GetLocalTilesIntersecting, WorldToLocal)
- add compatibility shims for removed EntityUid timer helpers and
ContainerManager.TryGetContainer
- resolve remaining RA0032 duplicate [Dependency] fields across partials
- fix final map-component using/import callsites
Build status after this commit:
- Content.Server: 0 errors
- Content.Shared: 0 errors
- Content.Client: 0 errors
- Content.Replay: 0 errors
* fix(tests): add missing Serilog and JetBrains.Annotations refs
* fix(prototypes): remove duplicate PlushieCarp tag in _HL/tags.yml
* fix(prototypes): cleanup orphan refs and broken sprites after RT v276 + main merge
- Remove duplicate PlushieCarp keys in cuddlycritter vending inventory
- Remove orphan trait block (no id) referencing HornyMoodsTarget
- Delete Floof/Catalog/Fills/Crates/lewd.yml (parent CrateLewd missing)
- Truncate hellspawn.yml dangling Fatkid component bleed
- Convert _CM14 base UserInterface.interfaces to dict form (RT v276)
- Delete ActionLewdLayEgg (event type missing)
- Repoint Meditech PDAs to Objects/Devices/pda.rsi
- Delete _HL neuralyzer.yml (Brainwasher component missing)
- Remove orphan Brainwasher block in base_borg_chassis.yml
- Drop ClothingEyesNeuralyzer from passiondrobe contraband
- Remove ClothingNeckMantleMeditech (sprite missing); fix sectorenclave->duskenclave mantle ref
* fix(prototypes): bulk cleanup HL Meditech/SectorEnclave per FORK_PLAN/07; fix Timer/Drakeborn; restore minimal companies.yml
- Remove 39 Meditech/SectorEnclave entity blocks (FORK_PLAN/07 says cut)
- Remove orphan ClothingOuterHardsuitInderdyne* hardsuits
- Clean construction graph nodes/edges for deleted posters
- Add migration aliases PosterContrabandMeditech -> PosterContrabandFreeTonto, PosterSectorEnclave -> PosterContrabandFreeTonto so existing maps load
- Fix BorgModuleTopicaks -> BorgModuleTopicals typo in hl_migration.yml
- Remove '- type: Timer' lines (TimerComponent removed in RT v276)
- Remove DrakebornComponentOnSpawn override rule (HLDrakeborn component missing)
- Restore minimal companies.yml (None + admin + canon vanilla) so lobby UI doesn't crash with empty CompanyButton
* fix(prototypes): clean orphan NSFW refs to make YAML linter pass
- Remove SexEmotes/LewdSounds component from base species (parent fix; -43 errors)
- Restore Floof alcohol reagent locale (.ftl) deleted by NSFW cleanup but with surviving reagent prototypes
- Restore minimal consentToggle stubs (Aphrodisiacs, NSFWDescriptions, NonconIcon) referenced by C# code
- Strip orphan Lewd*/Whip*/Spank*/Dildo* refs from misc lockers, passiondrobe inventory, boozeomat, food/fun crates, drink spawners
- Strip orphan PlushieVytian, PlushieRemiie, PlushieCarp variants
- Redirect HL Quad borg jobs to PlayerBorgBattery (custom borg entities deleted)
- Replace _HL borg_types.yml BorgChassisSecurity ref with BorgChassisQuadSec
- Drop MobDragonDrakeborn polymorph entry
- Delete _HL character_override_rules.yml (HL-personal community refs to deleted entities)
- Replace Abysslaser hitscan ref with NFRedLaserPractice in NPC misc
- Drop FuckRock/BirthdaySuit ThavenMood conflicts in yes_and / no_and
YAML Linter: 0 errors.
* fix(rsi): rename meditech states -> interdyne in interdyne_id/pda meta.json
PNG files were renamed during NSFW cleanup but meta.json kept the old
'meditech' state names, breaking RSI validation. Validate RSIs now passes.
* Fix gun upgrades not immediately updating gun effects (#43856)
* Update Credits (#43847)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
* Fix gibbing aghost (#43177)
Update MindSystem.cs
* Change chemical dispenser and ChemMaster increments (#43829)
change increments
* chore(sanitization): debrand remaining meditech surfaces
* chore(sanitization): remove remaining PassionDrobe and lewd leftovers
* fix(server): correct PullController command bind type; rename Roboisseur.yaml -> .yml (#8)
- PullController.Initialize() was registering binds under PullingSystem instead
of PullController, causing a duplicate-binds warning on every server boot.
Upstream wizden fixed this in #36161; align VRS accordingly.
- Roboisseur.yaml had a .yaml extension which the prototype loader silently
ignores; renamed to .yml so the DV NPC prototype is actually loaded.
* chore(locale): reconcile en-US locale with upstream wizden (#9)
Adds 162 missing locale files from wizden/master (commands, features, UI strings)
and resolves 6 duplicate-key conflicts caused by upstream reorganizing ftl paths.
New files (upstream locale files missing from VRS):
- 76x commands/ - admin, toolshed, and dev command descriptions
- ~86x feature locale files (accents, atmos, chat, changeling, guidebook, etc.)
Conflict resolutions (duplicate key fixes):
- guidebook/chemistry/healthchange.ftl: deleted (key moved to entity-effects/healthchange.ftl)
- _DV/smartfridge/smartfridge.ftl: deleted (pure subset of upstream smartfridge/smartfridge.ftl)
- commands/toolshed-commands.ftl: stripped 47 duplicated keys; kept 4 VRS-unique hscale commands
- commands/mapping-client-side-setup-command.ftl: deleted (renamed to mappingclientsidesetup-command.ftl)
- commands/eye-commands.ftl: deleted (keys renamed; C# already uses new key names)
- commands/persistence-save-command.ftl: deleted (upstream subset; existing persistence/command.ftl is complete)
- guidebook/chemistry/effects.ftl: removed 3 terms duplicated in entity-effects/effects.ftl; kept 50 chem-specific keys
- chat/highlights/highlights.ftl: deleted; upstream chat/highlights.ftl is strictly superset
- accent/scottish.ftl (new): deleted; conflicts with _DV/accent/scottish.ftl which has VRS-extended word list
- salvage/job-board.ftl (new): merged 19 unique keys into cargo/bounties.ftl; deleted source
Build: 0 errors. YAML linter: exit 0.
* docs(changelog): add player-visible entries for wizden sync 2026-05-06 (#11)
- ChemMaster/chem dispenser new volume increments (wizden #43829)
- Gun upgrades immediately apply effects on insertion (wizden #43856)
* fix(guns): gun upgrades now immediately update gun effects (wizden #43856) (#10)
Cherry-pick of upstream wizden commit f53c7d6a9d. Move args.Handled
assignment to after RefreshModifiers so gun effects update immediately
when an upgrade is inserted.
* chore: promote dev to main — wizden sync 2026-05-06 (#12)
* chore(engine): bump RobustToolbox to v276.0.0
Update RobustToolbox submodule pin from 4b04081 to 46a56ce (v276.0.0).
This matches the engine commit referenced by upstream Wizden content.
Engine-only change; no VRS code modifications in this commit.
Notable upstream items in this range (fixes/perf/platform):
- Fix cross-grid collisions (#6542)
- Fix SetCoordinates causing unexpected reparenting (#6533)
- Fix BUI EntitySystem injection (#6515)
- Fix TryGetEntitySystem/GetEntitySystemOrNull on uninitialized manager (#6512)
- Fix bad cast syntax with IRobustCloneable field deltas (#6536)
- Catch NetEncryption exceptions (#6498)
- Always clean up render handle state after overlay draws (#6508)
- Fix ScrollContainer measure invariant (#6494)
- HRTF support through openal-soft (#6511)
- Allow hex colour input (#6485)
- Allow static abstract through the sandbox + INumber (#6432)
- Make IDependencyCollection constructable (#6466)
- Expose more fields on AudioComponent (#6510)
- record bandwidth usage on release (#6545)
- More comprehensively tag auto-generated code (#6541)
- Add parent check debug assert in SharedContainerSystem.Insert (#6532)
- Fully remove obsolete methods in MapGridComponent (#6476)
* chore(engine): cherry-pick wizden #41855 — v269.0.0 RT update + .NET 10
Cherry-picked from space-wizards/space-station-14 commit 787330f5c6
to bring VRS in line with upstream's v269+ build system (required for
RobustToolbox v276.0.0 already pinned on this branch).
Includes:
- New MSBuild/Content.props imported by all content csprojs.
- Switched all content csprojs from direct ProjectReference of Robust
components to upstream's Imports/*.props mechanism.
- Replaced SpaceStation14.sln with SpaceStation14.slnx.
- Various small content code adjustments to align with new RT APIs
taken verbatim from upstream.
- Added DepsHandler for ServerPackaging.
VRS-specific resolutions:
- Sanitization-deleted upstream files (Codewords, EdiblePrototype,
SmartFridgeComponent, ObjectiveCommandsTest) kept deleted.
- Preserved VRS-only csproj items (Folder Includes, .CM14 globs,
Goobstation Compile Includes, Configurations/Platforms, DebugOpt).
VRS:
* fix(content): satisfy RT v276 analyzers (RA0017/RA0020/RA0032)
Mechanical fixes for analyzers that became stricter under RobustToolbox v276:
- RA0017 (DataDefinition must be partial): added 'partial' modifier to 22
prototype/component types across DV/Mono/Funky/Goob/NF/RMC/Emberfall/Shitmed
and core (RCDPrototype, PsionicsRecord, NanoTask*, NanoChat*).
- RA0020 (DataField property needs setter): added '{ get; private set; }'
(or replaced 'init;' with 'set;') on prototype ID/Parents/Abstract/etc.
across Cargo, DV, Goob, NF, Silicons, StatusIcon, Roles, InteractionVerbs,
Nyanotrasen Kitchen, BorgType.
- RA0032 (duplicate [Dependency] field): in SharedBodySystem partials,
removed Shitmed-side duplicate _gameTiming/_prototypeManager/_damageable
declarations and rewired call sites to use the upstream-side
_timing/Prototypes/Damageable fields. VRS comments mark the rewires.
VRS:
* wip(content): MapGrid migration (8 files) + sanitization-fallout fixes (8 files)
Snapshot before pivoting to upstream merge strategy. Not for upstream PR.
MapGrid: ported instance methods to SharedMapSystem on Entity<MapGridComponent>
in Content.Shared (TurfHelpers, Anchorable, Anomaly, Interaction,
MoverController, Biome, Construction, NearbyTilesPercent).
Sanitization-fallout: removed dead 'using Serilog/Linguini/FloofStation' and
dead VoreSystem dep; switched JobWhitelistManager to ISawmill and
PlantSpeciesChange to Robust Logger.
* fix(content): remove dead Client-side imports (OpenToolkit, Serilog)
Phase 2A cleanup. v269 build system no longer transitively pulls these
packages, but the imports were never actually used.
- Content.Client/_Crescent/PointCannons/TargetingConsoleBUI.cs: drop unused
'using OpenToolkit.GraphicsLibraryFramework;'
- Content.Client/_Floof/Examine/CustomExaminePart.xaml.cs: drop unused
'using Serilog;'
Content.Client now compiles clean.
* fix(build): add OpenTK.Mathematics central package version
* fix(server): resolve remaining RA0017/RA0020 prototype/datarecord errors
* fix(content): complete RT v276 Phase 2B compatibility migration
- add compatibility shims for removed MapGridComponent instance APIs
(TileIndicesFor, GridTileToLocal, TryGetTileRef, GetAnchoredEntities,
GetAnchoredEntitiesEnumerator, GetLocalTilesIntersecting, WorldToLocal)
- add compatibility shims for removed EntityUid timer helpers and
ContainerManager.TryGetContainer
- resolve remaining RA0032 duplicate [Dependency] fields across partials
- fix final map-component using/import callsites
Build status after this commit:
- Content.Server: 0 errors
- Content.Shared: 0 errors
- Content.Client: 0 errors
- Content.Replay: 0 errors
* fix(tests): add missing Serilog and JetBrains.Annotations refs
* fix(prototypes): remove duplicate PlushieCarp tag in _HL/tags.yml
* fix(prototypes): cleanup orphan refs and broken sprites after RT v276 + main merge
- Remove duplicate PlushieCarp keys in cuddlycritter vending inventory
- Remove orphan trait block (no id) referencing HornyMoodsTarget
- Delete Floof/Catalog/Fills/Crates/lewd.yml (parent CrateLewd missing)
- Truncate hellspawn.yml dangling Fatkid component bleed
- Convert _CM14 base UserInterface.interfaces to dict form (RT v276)
- Delete ActionLewdLayEgg (event type missing)
- Repoint Meditech PDAs to Objects/Devices/pda.rsi
- Delete _HL neuralyzer.yml (Brainwasher component missing)
- Remove orphan Brainwasher block in base_borg_chassis.yml
- Drop ClothingEyesNeuralyzer from passiondrobe contraband
- Remove ClothingNeckMantleMeditech (sprite missing); fix sectorenclave->duskenclave mantle ref
* fix(prototypes): bulk cleanup HL Meditech/SectorEnclave per FORK_PLAN/07; fix Timer/Drakeborn; restore minimal companies.yml
- Remove 39 Meditech/SectorEnclave entity blocks (FORK_PLAN/07 says cut)
- Remove orphan ClothingOuterHardsuitInderdyne* hardsuits
- Clean construction graph nodes/edges for deleted posters
- Add migration aliases PosterContrabandMeditech -> PosterContrabandFreeTonto, PosterSectorEnclave -> PosterContrabandFreeTonto so existing maps load
- Fix BorgModuleTopicaks -> BorgModuleTopicals typo in hl_migration.yml
- Remove '- type: Timer' lines (TimerComponent removed in RT v276)
- Remove DrakebornComponentOnSpawn override rule (HLDrakeborn component missing)
- Restore minimal companies.yml (None + admin + canon vanilla) so lobby UI doesn't crash with empty CompanyButton
* fix(prototypes): clean orphan NSFW refs to make YAML linter pass
- Remove SexEmotes/LewdSounds component from base species (parent fix; -43 errors)
- Restore Floof alcohol reagent locale (.ftl) deleted by NSFW cleanup but with surviving reagent prototypes
- Restore minimal consentToggle stubs (Aphrodisiacs, NSFWDescriptions, NonconIcon) referenced by C# code
- Strip orphan Lewd*/Whip*/Spank*/Dildo* refs from misc lockers, passiondrobe inventory, boozeomat, food/fun crates, drink spawners
- Strip orphan PlushieVytian, PlushieRemiie, PlushieCarp variants
- Redirect HL Quad borg jobs to PlayerBorgBattery (custom borg entities deleted)
- Replace _HL borg_types.yml BorgChassisSecurity ref with BorgChassisQuadSec
- Drop MobDragonDrakeborn polymorph entry
- Delete _HL character_override_rules.yml (HL-personal community refs to deleted entities)
- Replace Abysslaser hitscan ref with NFRedLaserPractice in NPC misc
- Drop FuckRock/BirthdaySuit ThavenMood conflicts in yes_and / no_and
YAML Linter: 0 errors.
* fix(rsi): rename meditech states -> interdyne in interdyne_id/pda meta.json
PNG files were renamed during NSFW cleanup but meta.json kept the old
'meditech' state names, breaking RSI validation. Validate RSIs now passes.
* Fix gun upgrades not immediately updating gun effects (#43856)
* Update Credits (#43847)
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
* Fix gibbing aghost (#43177)
Update MindSystem.cs
* Change chemical dispenser and ChemMaster increments (#43829)
change increments
* chore(sanitization): debrand remaining meditech surfaces
* chore(sanitization): remove remaining PassionDrobe and lewd leftovers
* fix(server): correct PullController command bind type; rename Roboisseur.yaml -> .yml (#8)
- PullController.Initialize() was registering binds under PullingSystem instead
of PullController, causing a duplicate-binds warning on every server boot.
Upstream wizden fixed this in #36161; align VRS accordingly.
- Roboisseur.yaml had a .yaml extension which the prototype loader silently
ignores; renamed to .yml so the DV NPC prototype is actually loaded.
* chore(locale): reconcile en-US locale with upstream wizden (#9)
Adds 162 missing locale files from wizden/master (commands, features, UI strings)
and resolves 6 duplicate-key conflicts caused by upstream reorganizing ftl paths.
New files (upstream locale files missing from VRS):
- 76x commands/ - admin, toolshed, and dev command descriptions
- ~86x feature locale files (accents, atmos, chat, changeling, guidebook, etc.)
Conflict resolutions (duplicate key fixes):
- guidebook/chemistry/healthchange.ftl: deleted (key moved to entity-effects/healthchange.ftl)
- _DV/smartfridge/smartfridge.ftl: deleted (pure subset of upstream smartfridge/smartfridge.ftl)
- commands/toolshed-commands.ftl: stripped 47 duplicated keys; kept 4 VRS-unique hscale commands
- commands/mapping-client-side-setup-command.ftl: deleted (renamed to mappingclientsidesetup-command.ftl)
- commands/eye-commands.ftl: deleted (keys renamed; C# already uses new key names)
- commands/persistence-save-command.ftl: deleted (upstream subset; existing persistence/command.ftl is complete)
- guidebook/chemistry/effects.ftl: removed 3 terms duplicated in entity-effects/effects.ftl; kept 50 chem-specific keys
- chat/highlights/highlights.ftl: deleted; upstream chat/highlights.ftl is strictly superset
- accent/scottish.ftl (new): deleted; conflicts with _DV/accent/scottish.ftl which has VRS-extended word list
- salvage/job-board.ftl (new): merged 19 unique keys into cargo/bounties.ftl; deleted source
Build: 0 errors. YAML linter: exit 0.
* docs(changelog): add player-visible entries for wizden sync 2026-05-06 (#11)
- ChemMaster/chem dispenser new volume increments (wizden #43829)
- Gun upgrades immediately apply effects on insertion (wizden #43856)
* fix(guns): gun upgrades now immediately update gun effects (wizden #43856) (#10)
Cherry-pick of upstream wizden commit f53c7d6a9d. Move args.Handled
assignment to after RefreshModifiers so gun effects update immediately
when an upgrade is inserted.
---------
Co-authored-by: VRS Sync <sync@vrs.local>
Co-authored-by: Centronias <charlie.t.santos@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com>
Co-authored-by: Pok <113675512+Pok27@users.noreply.github.com>
Co-authored-by: rumaks <me@rumaks.xyz>
* fix(maps,items,physics): fix 5 inherited HL bugs (batch 1) (#13)
- fix(physics): conveyor belts now move all items, not just 1 per tile (HL #1328)
Removed _selected dict filter that capped items per conveyor to 1
- fix(prototypes): advanced jet injector now fits in medical bag (HL #1585)
Added Injector to whitelist.components in _NF medical_bag
- fix(prototypes): IPC gloves now visible in strip menu (HL #1593)
Moved gloves strippingWindowPos from 2,0 to 2,2 (collision with ears slot)
- fix(maps): ColComm evac docking arm firelocks added (HL #1305)
Added Firelock at each evac emergency airlock interior tile to prevent
decompression when emergency shuttle despawns
- fix(maps): ColComm cloning wing now has body scanner (HL #1434)
Added computerBodyScanner at 11.5,56.5 adjacent to cloning console
* perf(worldgen): preload chunks ahead of ship velocity (Mono #3882) (#14)
* perf(worldgen): preload chunks ahead of ship velocity (Mono #3882)
Prevents asteroids from spawning on top of fast-moving ships by offsetting
the chunk-load origin by one second of map-linear velocity before computing
the radius of chunks to load.
Also promotes the per-tick chunksToLoad dict to a class-level field and
calls .Clear() instead of allocating a new dictionary every frame.
Port of Monolith-Station/Monolith#3882 (by Ilya246).
VRS: non-design perf/bug fix; auto-include per sync policy.
* fix(ui): show localized job name in loadout window title (Mono #3878)
The loadout window title was constructed as `jobProto?.ID + "-loadout"` which
produced raw strings like "Passenger-loadout" instead of "Passenger loadout".
Port of Monolith-Station/Monolith#3878 (by kasature90).
VRS: UI bug fix; auto-include per sync policy.
* feat(content): port Mono #3899 organ harvesting machine
* feat(visuals): port Mono #3902 silicon CRT/VHS shader system
* feat(rcd): port Mono #3919 RCD corner plating and lattice tiles
* feat(structures): port Mono #3881 heavy-duty airlock
* fix(structures): fix YAML linter failures in heavy airlock port
- Replace type: AirlockGroup with type: paintableGroup (VRS uses spray-paint system)
- Replace type: PaintableAirlock with type: Paintable, remove Monolith-only department field
- Add HeavyStandard/HeavyGlass paintableGroups to Airlocks spray-paint category
- Remove 3 entities needing missing electronics (TsfEngineer, PdvCommand, GrandVizier)
- Remove name/description/icon from ConstructionPrototype (LocId validation)
- Fix construction graph door-electronics step name to use loc key
* fix(chat): refactor SubtleOOC as proper OOC channel with LOS filtering (#18)
Port of Triad #27 (commit 71eede6), adapted for VRS ObserverType enum.
Changes:
- Remove InGameICChatType.SubtleOOC; add InGameOOCChatType.SubtleLOOC
- Remove HardLight SubtleOOC-in-IC hack from TrySendInGameICMessage
- Add SendSubtleLOOC() method routed from TrySendInGameOOCMessage
- Add ICChatRecipientData.InLOS field computed via ExamineSystemShared
- Subtle messages now skip players without LOS (unless observer/admin)
- Move SubtleCommand and SubtleOOCCommand to Content.Server/_Floof/Chat/Commands/
- Rename subtleooc command to sooc
- Fix ghost players unable to filter/see Subtle/SubtleOOC channels
- Add FocusSubtle (Minus) and FocusSubtleOOC (Shift+LBracket) keybinds
- Add color entries for Subtle/SubtleOOC in ChannelSelectorButton
- Add locale keys for subtle-looc wrap message and keybind labels
* feat(content): port three Triad Sector QoL fixes (sinks/drains, bounty access, spray paint persistence) (#17)
- Add ShipRepairable to SinkEmpty (repairTime: 4, cost: 15) and FloorDrain
(repairTime: 5, cost: 20) so SRD can repair sinks and drains on ships.
Ported from Triad #34 (6967322).
- Broaden Command bounty board writeAccess/deleteAccess from HeadOfPersonnel
+ HeadOfSecurity to the 'Command' access group so any command-level crew
can manage command bounties. Ported from Triad #16 (65ee57b).
- Add spray paint persistence system (SprayPaintPersistenceSystem):
when a PaintableComponent entity is spray painted, stores the style in
SprayPaintOnMapInitComponent; on next MapInit (ship save/load) the style
is re-applied so painted entities keep their appearance across saves.
Renamed from Triad's SharedSprayPainterSystem to avoid collision with
the existing abstract class of the same name in Content.Shared.SprayPainter.
Ported from Triad #20 (76477fc).
Build: 0 errors. YAML linter: clean.
* fix(chat): move ChatChannel.Subtle/SubtleOOC to high bit positions to avoid future upstream collisions (#16)
* perf(worldgen): preload chunks ahead of ship velocity (Mono #3882)
Prevents asteroids from spawning on top of fast-moving ships by offsetting
the chunk-load origin by one second of map-linear velocity before computing
the radius of chunks to load.
Also promotes the per-tick chunksToLoad dict to a class-level field and
calls .Clear() instead of allocating a new dictionary every frame.
Port of Monolith-Station/Monolith#3882 (by Ilya246).
VRS: non-design perf/bug fix; auto-include per sync policy.
* fix(ui): show localized job name in loadout window title (Mono #3878)
The loadout window title was constructed as `jobProto?.ID + "-loadout"` which
produced raw strings like "Passenger-loadout" instead of "Passenger loadout".
Port of Monolith-Station/Monolith#3878 (by kasature90).
VRS: UI bug fix; auto-include per sync policy.
* feat(content): port Mono #3899 organ harvesting machine
* feat(visuals): port Mono #3902 silicon CRT/VHS shader system
* feat(rcd): port Mono #3919 RCD corner plating and lattice tiles
* feat(structures): port Mono #3881 heavy-duty airlock
* fix(structures): fix YAML linter failures in heavy airlock port
- Replace type: AirlockGroup with type: paintableGroup (VRS uses spray-paint system)
- Replace type: PaintableAirlock with type: Paintable, remove Monolith-only department field
- Add HeavyStandard/HeavyGlass paintableGroups to Airlocks spray-paint category
- Remove 3 entities needing missing electronics (TsfEngineer, PdvCommand, GrandVizier)
- Remove name/description/icon from ConstructionPrototype (LocId validation)
- Fix construction graph door-electronics step name to use loc key
* fix(prototypes): resolve activation-key conflicts on PDA, handheld computers, and cryopod
- Remove ToggleableGhostRole from BasePDA; the wipe-verb ghost role was
the only use and the component's ActivationVerb subscription conflicts
with PDA UI opening when the player presses E. Ported from Triad #21.
- Add onActivate: false to ItemToggle on BaseHandheldComputer so the
activation key routes to the UI rather than toggling the item.
Ported from Triad #23.
- Add onUse: false + onActivate: false to ItemToggle on CryoPod so the
health analyzer UI opens correctly on interaction. Ported from Triad #23.
No gameplay behavior changes; this only fixes activation-key routing.
VRS: Triad Sector refs: 2f12722 (PDA), 9439202 (handheld/cryo)
* fix(chat): move Subtle/SubtleOOC ChatChannel bits to top of uint range
Subtle and SubtleOOC were at bits 15 and 17, immediately above the last
upstream Wizden channel (Unspecified = 1<<14). Any new upstream channel
addition risks a silent bitmask collision.
Move both to 1u<<31 and 1u<<30 to leave the middle range free for future
upstream additions. All callers reference by name; no behavior change.
VRS: Triad Sector ref: 71eede6 (partial - bit position fix only; full
subtle chat refactor deferred pending VRS ObserverType adaptation)
* fix(activation): remove ToggleableGhostRole from BasePDA; fix ItemToggle onActivate for handheld/cryo (#15)
* perf(worldgen): preload chunks ahead of ship velocity (Mono #3882)
Prevents asteroids from spawning on top of fast-moving ships by offsetting
the chunk-load origin by one second of map-linear velocity before computing
the radius of chunks to load.
Also promotes the per-tick chunksToLoad dict to a class-level field and
calls .Clear() instead of allocating a new dictionary every frame.
Port of Monolith-Station/Monolith#3882 (by Ilya246).
VRS: non-design perf/bug fix; auto-include per sync policy.
* fix(ui): show localized job name in loadout window title (Mono #3878)
The loadout window title was constructed as `jobProto?.ID + "-loadout"` which
produced raw strings like "Passenger-loadout" instead of "Passenger loadout".
Port of Monolith-Station/Monolith#3878 (by kasature90).
VRS: UI bug fix; auto-include per sync policy.
* feat(content): port Mono #3899 organ harvesting machine
* feat(visuals): port Mono #3902 silicon CRT/VHS shader system
* feat(rcd): port Mono #3919 RCD corner plating and lattice tiles
* feat(structures): port Mono #3881 heavy-duty airlock
* fix(structures): fix YAML linter failures in heavy airlock port
- Replace type: AirlockGroup with type: paintableGroup (VRS uses spray-paint system)
- Replace type: PaintableAirlock with type: Paintable, remove Monolith-only department field
- Add HeavyStandard/HeavyGlass paintableGroups to Airlocks spray-paint category
- Remove 3 entities needing missing electronics (TsfEngineer, PdvCommand, GrandVizier)
- Remove name/description/icon from ConstructionPrototype (LocId validation)
- Fix construction graph door-electronics step name to use loc key
* fix(prototypes): resolve activation-key conflicts on PDA, handheld computers, and cryopod
- Remove ToggleableGhostRole from BasePDA; the wipe-verb ghost role was
the only use and the component's ActivationVerb subscription conflicts
with PDA UI opening when the player presses E. Ported from Triad #21.
- Add onActivate: false to ItemToggle on BaseHandheldComputer so the
activation key routes to the UI rather than toggling the item.
Ported from Triad #23.
- Add onUse: false + onActivate: false to ItemToggle on CryoPod so the
health analyzer UI opens correctly on interaction. Ported from Triad #23.
No gameplay behavior changes; this only fixes activation-key routing.
VRS: Triad Sector refs: 2f12722 (PDA), 9439202 (handheld/cryo)
* feat(gameplay): port Triad bugfixes and perf optimizations (#19)
- fix(docking): gas docks bypass PreventPilotComponent so meteors can dock
even when shuttle is under combat lockdown; also validate target shuttle
(Triad #3817, b9bdf2b4ed)
- perf(pathfinding): lazy-init PathPoly.Neighbors to avoid HashSet alloc
for every tile that never gains NPC neighbors; add HasNeighbors guard in
ClearPoly; remove unused Stopwatch in BuildBreadcrumbs (Triad #3853,
05462c43cb)
- perf(pathfinding): stop boxing PathfindingBreadcrumbFlag in IsEquivalent
and Equals comparisons (Triad #3853)
- fix(jetpack): auto-disable jetpack when player with active magboots lands
on a grid; prevent re-enabling jetpack on a gravity grid; guard
EntParentChanged handler with IsWeightless check (Triad #3781,
c512b27aa8)
* feat(radar): port Triad radar/gunnery UI enhancements (#21)
Port 4 Triad Sector commits:
- 5d71a166eb: remove gunnery thermal-signature YAML (reduces runtime spam)
- 6d6926858a: add NoRotate / RelativePanning fields to RadarConsoleComponent;
remove RotateWithEntity from NavInterfaceState; refactor
ShuttleNavControl & FireControlNavControl rotation logic
- 5a097d96db: compass ring and azimuth display in BaseShuttleControl
- a6599bcb8a: radar mode toggle buttons (azimuth/rotation/anchor/reset)
in ShuttleNavControl/NavScreen, with locale strings
Co-authored-by: Triad Sector contributors
* feat(triad): port 4 Triad commits (shipguns repairable, gun damage modifier, turret shootthrough, machine frame sizing) (#20)
Ports:
- 51797e0933: Add Climbable/ExaminableDamage/Repairable to ship artillery base entities (Triad #3387)
- a54a4193e6: GunComponent DamageModifier field + server apply + examine text (Triad #3731)
- f3c8c50d23: NPC turret shootthrough via GunTargetGoodCon + InRangeGoodTarget (Triad #3732)
- d14d180e3c: MachineFrame/MachineBoardComponent FrameSize field + size-check on board insertion (Triad #3703, C# only — YAML entities deferred pending RSI assets)
* feat(content): Triad shield balance retweaks + bunkbeds (#22)
* feat(content): port Triad shield balance retweaks + bunkbeds
From Triad Sector commits:
- 4984429f45 (#3860): Retweaks Shield Balance
- ShieldGeneratorTSFCapital: damageLimit 85000 (was 215000)
- ShieldGenerator (Titan): damageLimit 75000 (was 215000)
- ShieldGeneratorMedium (Aegis): damageLimit 180000 (was 168000)
- Add descriptions to POI, TSFCapital, Titan, Aegis, Sentinel generators
- 2374fb9bfc (#3859): Bunkbeds
- Add BunkBottom + BunkTop entities (parent: Bed)
- Add bunk.rsi sprites (bottom_bunk, top_bunk, top_bunk_posts, top_bunk_ladder)
Skipped: 72a8e6ea5d (#3854) T2-T5 rad blocking — targets Triad-specific
_Mono tiered wall prototypes (WallT1-T4) that don't exist in VRS.
* revert(shields): restore VRS damageLimit values; keep descriptions only
* feat(construction): port Mono 2x2 machine frame system for ThrusterLarge (#23)
- Add Machine2x2 construction graph (ported from Triad d14d180e3c)
- Add UnfinishedMachineFrame2x2/MachineFrame2x2/MachineFrameDestroyed2x2 entities
- Add frame_2x2.rsi and frame_2x2_icon.rsi sprites
- Override ThrusterLarge construction graph to Machine2x2
- Add frameSize: 2x2 + Capacitor/Steel requirements to CivBigThrusterBoard
- Preserve VRS thrust values (2000 base, upgradeable) and HP (1800)
- Thruster now deconstructs to machineFrame (recoverable) instead of full destroy
* feat(freelancer): port Triad freelancer content to VRS (#24)
* feat(construction): port Mono 2x2 machine frame system for ThrusterLarge
- Add Machine2x2 construction graph (ported from Triad d14d180e3c)
- Add UnfinishedMachineFrame2x2/MachineFrame2x2/MachineFrameDestroyed2x2 entities
- Add frame_2x2.rsi and frame_2x2_icon.rsi sprites
- Override ThrusterLarge construction graph to Machine2x2
- Add frameSize: 2x2 + Capacitor/Steel requirements to CivBigThrusterBoard
- Preserve VRS thrust values (2000 base, upgradeable) and HP (1800)
- Thruster now deconstructs to machineFrame (recoverable) instead of full destroy
* feat(freelancer): port Triad freelancer systems to VRS
C# Systems:
- NoHack/NoDeconstruct components (gates on wires + construction)
- GatherableHitscan: hitscan weapons trigger gatherable logic
- HitscanDamageDealtEvent: new shared event raised by GunSystem
- GridRaider: raider zone component + system
- BlankRule/AutoExtendRule: station event helpers
- DriftingPrice: economy commodity price drift
- ScuttleDevice: grid self-destruct with do-after
- ClaimableGrid/GridClaimer: player grid claiming
- GridModifier: data-driven grid entity replacement
- RoundEndTimeRule: override round end time via game rule
YAML Prototypes:
- USSP bounties (10 new entries)
- Pirate bounty rebalance (7 new entries, dedup RTG/Techfab/Cybernetics)
- GridModifier presets
- Monolithic event scheduler + fragment spawn rules
- Round end / portstrike announce timing rules (stubs for faction ships)
- POI prototypes: Sevastopol, DerelictDrillsite, USSPCamelot, AnomalousLab, Lancelot, Polaris, AutomatedTanker
- Base POI abstracts: BaseMobilePOI, BaseRepairablePOI
- RecordsFrontierOutpostCargo station
- Monolithic event table
Maps:
- 3x Monolithic arena/spindle/ship maps (copied from Triad)
- 7x POI maps: sevastopol, derelictdrillsite, camelot, anomalouslab, lancelot, polaris, ruin_tanker
Locale (en-US):
- scuttle-device, grid-claimer, events/monolithic, gamerules/announcement
- Pirate bounty strings (updated), USSP bounty strings (new)
* fix(freelancer): remove round-end timing rules from timings.yml
VRS does not use forced round restarts at 3 hours.
Removed RoundEndRuleHour3 and RoundEndRuleMinute2 entries.
Portstrike announce rules retained.
* fix(poi): delete POI grids at round end; clean up server rules
NfAdventureRuleSystem: on RoundRestartCleanupEvent, QueueDel all grid
UIDs in CargoDepots, MarketStations, RequiredPois, OptionalPois, and
UniquePois. POIs without a GameMapPrototype are not station-owned and
were previously orphaned on the map between rounds.
Rules.txt: reformatted for VRS. Changes:
- Updated branding (Frontier -> VRS)
- Fixed typos (Implimentation, recieving, 'with with')
- Removed Section 9 (ERP) — not applicable to VRS
- Removed unexplained footnote markers (*1/*2/*3)
- Consistent color coding and spacing throughout
- Clear enforcement-tier explanation in header
- Table of contents reflects section removal
* feat(planet): landgrab plot cartridge, biome preview, and ambient procedural spawner (#25)
* feat(planet): landgrab plot cartridge, biome preview, and ambient procedural spawner
Adds three integrated systems for persistent planet gameplay:
1. Landgrab PDA cartridge (Content.{Shared,Server,Client}/_VRS/Planet/*):
purchase a 32x32 plot grid at the player's current location, save/load
to per-player YAML under UserData/planet_plots/{ckey}/, autosave on
round restart, and engrave a held coord-disk with a saved offset so
shuttle pilots can land precisely on the spot later.
2. Shuttle console biome preview overlay (Content.Client/Shuttles/UI/
ShuttleMapControl.PlanetOverlay.cs): when targeting a biome planet,
draws coloured tile sample quads (rock/grass/snow/lava/etc.) and
gold rings + labels for any inserted Landgrab disks so pilots can
see free landing zones before FTL. Frame-cached and stride-floored
for negligible client cost.
3. Procedural planet spawner (Content.Server/_VRS/Planet/
PlanetSpawner*): registers wandering mob marker layers (xenos,
explorers, salvage carps) on map init, then periodically rolls
dungeons in regions clear of player plots and shuttles. Defaults
tuned conservatively (5 min interval, max 6 dungeons, 4000-tile
exclusion radius) and exclusion sources are snapshotted once per
roll instead of re-queried per candidate.
* feat(planet): VRSPersistentPlanet game rule auto-spawns the planet at round start
Adds a game rule that, on Started, creates a fresh map, calls
BiomeSystem.EnsurePlanet with a configurable biome template (default
Continental for grass/snow/lava/caves variety), attaches the
PlanetPlotRegistryComponent + PlanetSpawnerComponent, sets a green IFF
colour, picks a random name from a configurable pool (Aetheria, New
Eden, Frontier-7, ...), and drops an FTLPoint beacon at the planet
origin so any shuttle console finds it as a destination automatically.
Wired into the NFAdventure preset so a planet appears every round
without admin intervention. Map size is unbounded — biome chunks
generate lazily 8x8 tiles at a time as players approach, so 20k+ tile
exploration costs the same as standing at origin.
* feat(planet): show plot footprints and dungeon markers on shuttle console preview
- New shared PlanetDungeonRegistryComponent on the planet map mirrors the
spawner's dungeon list over the network so clients can draw markers even
for dungeons in unloaded biome chunks.
- DrawLandgrabPlotMarkers: cyan footprint outline + owner name for every
LandgrabPlot grid on the viewed map.
- DrawDungeonMarkers: red diamond + dungeon-config name for every entry
in the dungeon registry on the viewed map.
Pilots can now see, before clicking, where every player plot sits and
where every spawned dungeon is — independent of which biome chunks the
client has loaded.
* feat(planet): block shuttle console FTL within 1000m of dungeons
Reads the target map's PlanetDungeonRegistryComponent and rejects any
ConsoleFTL whose target position is within 1000m of a spawned dungeon.
Pilots get a yellow popup explaining the abort. Prevents shuttles from
landing directly on top of (or adjacent to) procedurally-spawned hostile
sites.
* feat(planet): prune cleared dungeons so new ones can spawn
Before each spawn roll the planet spawner scans every previously-spawned
dungeon's clearance radius (default 600 tiles) for live HTN-driven mobs.
Dungeons whose radius is empty are removed from both the spawn list and
the networked PlanetDungeonRegistryComponent (so client preview markers
also disappear). This keeps the dungeon cap a measure of *active* world
load rather than a permanent one, letting fresh sites appear elsewhere
once players (or anything else) have wiped the original garrison.
---------
Co-authored-by: Kronyxxx <kronyxxx@users.noreply.github.com>
* fix(migration): remap removed PlushieDrakeborn to PlushieCarp for colcomm.yml (#27)
Without the migration entry, colcomm.yml fails to load entirely because it references a deleted PlushieDrakeborn prototype.
Note: the original draft of this PR also added a server-only DockingArmGenerator component to the shared Gateway entity prototype, which crashed clients during prototype deserialization (unknown component on the client). That change has been dropped; docking-arm work will land in a follow-up that places the component on a server-only entity prototype.
* fix(planet): FTL destination + biome grid cleanup + PlushieDrakeborn migration (#28)
* fix(client): wrap Task.WhenAll args in array to avoid sandbox violation
C# 13 binds Task.WhenAll(t1, t2) to the new params ReadOnlySpan<Task>
overload, causing the compiler to emit <>y__InlineArray2 + Unsafe.As +
MemoryMarshal.CreateReadOnlySpan helpers in <PrivateImplementationDetails>.
All three are on the SS14 sandbox blocklist, so Content.Client failed type
checks at startup with:
System.AggregateException: Assembly Content.Client failed type checks.
Wrapping the args in 'new[] { ... }' forces the legacy params Task[] overload
and emits no banned helpers.
* fix(planet): register FTL destination, prevent biome grid cleanup, add PlushieDrakeborn migration
- VRSPersistentPlanetRuleSystem: use TryAddFTLDestination() instead of raw
EnsureComp so shuttle consoles are refreshed and the planet appears in the
FTL scan. Also add MapGridComponent + PVS global overrides on the map and
beacon so clients receive the entities before any tiles are loaded.
- OrphanedGridCleanupSystem: skip cleanup for grids with BiomeComponent.
Biome planets start with 0 tiles (lazy generation), causing the cleanup
system to delete them shortly after spawn.
- migration.yml: remap PlushieDrakeborn -> PlushieCarp to fix Colcomm map
load failure caused by a missing prototype reference.
* feat(planet): plot border overlay and free-FTL anywhere on planet (#29)
* feat(planet): plot border overlay and free-FTL anywhere on planet
- Remove beaconsOnly restriction so ships can FTL to any coordinate on
the planet map, not just to the beacon
- Network LandgrabPlotComponent (OwnerCKey, OwnerName, PlotSize) so
client-side overlay has correct ownership data
- Add LandgrabPlotBorderOverlay: in-world WorldSpaceBelowEntities overlay
that draws white rectangle borders around owned plots (own = white,
others = muted teal), only active when on a PlanetPlotRegistry map
- Add LandgrabPlotBorderSystem: registers/unregisters the overlay on
player attach/detach
- Update ShuttleMapControl.DrawLandgrabPlotMarkers: own plot now drawn
in bright white on the FTL console map, other plots remain cyan
* fix(planet): network registry component; reduce dungeon spawn distances
- Add [NetworkedComponent] to PlanetPlotRegistryComponent so the client
can detect it in BeforeDraw and the plot border overlay actually renders
- Reduce MinDistFromActivity 4000→300 and MinDistBetweenDungeons 2000→600
so dungeons and roaming spawns appear at 300-1000 tile range
* fix(planet): reduce roaming AI spawn spacing to 150-200 tiles
radius 600-800 → 150-200, size 256 → 64 so wandering packs are
encountered much more frequently as players explore the planet
* feat(planet): garrison-populated preseed dungeons, ramping mob density, landgrab overlay, MAP tab fix (#30)
* fix(shuttles): seed map list on first MAP tab open
Avoids requiring a manual scan click to populate sector objects when the
shuttle console MAP tab is opened for the first time in a round.
* feat(landgrab): always-visible plot overlay with PVS global override
- Render plot borders in WorldSpace as filled rects so biome floors no
longer hide them; own plot gets a soft white fill, others get cyan
borders.
- Refactor LandgrabPlotBorderSystem to register the overlay both on
LocalPlayerAttachedEvent and immediately at Initialize() if the player
was already attached (fixes overlay never appearing if Initialize ran
late).
- Add PVS global override for every LandgrabPlotComponent on the server
so plot data reaches all clients regardless of distance, including
newly purchased and save-loaded plots.
* tune(planet): densify wandering mob marker layers
Tightens spacing radii and increases pack sizes / max counts for the
six wandering factions so a freshly-loaded planet feels populated long
before the dungeon spawner ramps up.
* feat(planet): preseed dungeons with garrisons, FTL beacons, and ramping mob density
Three changes to the persistent-planet spawner so a fresh planet feels
alive before any chunk-driven roll fires:
- Pre-seed N (default 4) dungeons in a configurable ring at planet
creation, each with a placed FTLPoint beacon so the shuttle console
surfaces them as selectable destinations.
- Spawn a garrison (default 25) of mobs in a small ring around every
pre-seeded dungeon center. DungeonSystem.GenerateDungeon only places
terrain, so dungeons would otherwise be empty.
- Add a time-scaled ambient mob spawner that picks a random player on
the planet and spawns a small pack nearby; pack size and interval
ramp from 1 mob / 60 s at round start to ~5 mobs / 8 s after one hour
of elapsed planet time. Hard cap at 80 live ramp mobs so the planet
never melts the tick rate.
Also lowers ambient roll cadence (RollInterval 5 min -> 45 s) and the
minimum distance from player activity (300 -> 96 tiles) so chunk-driven
rolls actually succeed on the small loaded biome footprint around a
single explorer.
* feat(planet): planet combat event system with FTL restrictions and optimizations (#31)
- Implement planet combat contract events spawning roaming mob groups and dungeon assaults
- Add difficulty-based briefcase rewards (Easy: 5k, Moderate: 10k, Hard: 20k SpaceCash)
- Mark contract locations on FTL map; only allow landing outside 50m no-landing radius
- Contract mob packs spawn as single species to prevent infighting; include boss mob
- Global announcements on contract start and completion
- Throttle contract member completion scans from per-tick to 1-second interval with clamping
- Add interval sanitization to prevent misconfiguration from degrading to per-tick polling
- Use world-space position checks for FTL radius validation (correct regardless of grid origin)
- Add PlanetEventFTLOverrideComponent to tag contract beacons with no-landing zones
- Create briefcase prototypes for contract rewards
- Localization for contract announcements and FTL restriction messages
Perf: O(active_contracts × members) scans reduced to interval-based polling (~14μs max on typical configs)
* chore(locale): align planet contract announcements with event tone (#32)
* feat(machines): port Goobstation ItemMiner / PowerConsumerMiner / PlanetMiner (#34)
Ports the passive item-mining component framework from Triad_Sector
(originally Goobstation). These power machines such as the Mono tech
disk printer, crypto datafarm and laser drill, which are introduced
by the hostile shuttle event content port (#33).
Components:
- ItemMinerComponent (shared): periodically spawns a configured proto
while powered/anchored, with optional sound and chance.
- PowerConsumerMinerComponent (server): gates an ItemMiner on having
enough HV/MV power draw via PowerConsumerComponent.
- PlanetMinerComponent (server): gates an ItemMiner on being on a
planet grid (optionally an expedition planet, optionally lattice).
Systems:
- ItemMinerSystem: per-tick check + spawn loop, uses ApcPower by
default, plays mining/mined audio, merges into nearby stacks.
- PowerConsumerMinerSystem / PlanetMinerSystem: subscribe to the
ItemMinerCheckEvent to add their respective gating conditions.
This PR ports only the system code. Wiring these components onto
the Mono machine prototypes (TechDiskPrinter, DatafarmCrypto,
LaserDrill...) will follow once the events PR (#33) lands; those
prototypes are introduced by that PR with the component refs stripped
for buildability.
* feat(radiation): port ChainRadiationSystem from Mono (#35)
Adds the cascading-radiation reactor mechanic from Triad/Mono. Entities
with this component re-emit incoming radiation amplified by a coefficient
and detonate once they cross a configurable threshold, optionally
gathering nearby chain entities for a combined explosion.
Adapted for VRS:
- Mono originally mutated ExplosiveComponent fields directly to
configure the explosion. ExplosiveComponent has been locked to
SharedExplosionSystem access in upstream, so the explosion type,
intensity, slope and max intensity are now stored on
ChainRadiationComponent itself and dispatched via QueueExplosion.
- Default ExplosionType is 'Default' (override per-prototype).
Code-only port. Wiring onto Mono outpost powercores follows once the
events PR (#33) lands; that PR currently strips the ChainRadiation
component refs for buildability.
* feat(shipyard): port SavingContraband 'do not save' marker from Triad (#36)
Adds the SavingContraband component/system from Triad_Sector. Entities
tagged with this component are removed from a grid before the
ShipyardGridSaveSystem serializes it, and announce themselves on
examine with class-1/2/3 contraband flavor text.
Used by Mono datafarms, faction servers, outpost powercores, the
crypto datafarm and similar machines that are either illegal to own
or break ship saving (introduced by #33).
Changes:
- Content.Shared/_Triad/Shipyard/SavingContrabandComponent.cs (new)
- Content.Shared/_Triad/Shipyard/SavingContrabandSystem.cs (new)
- ShipyardGridSaveSystem: new RemoveSavingContrabandEntitiesOnGrid
pass invoked alongside the existing serialization-cleanup pass.
- Locale: ship-saving-contraband-{1,2,3}-text strings ported.
This PR ports infrastructure only. Wiring SavingContraband onto the
Mono machine prototypes follows once #33 lands; that PR currently
strips the component refs for buildability.
* feat(combat): port ArmorThickness + ArmorPiercing from Mono (#37)
Adds the wall-piercing projectile mechanic from Triad_Sector (originally
Mono):
- ArmorThicknessComponent: marks an entity (typically a hull wall) with
a thickness value and whether it can be pierced at all.
- ArmorPiercingComponent: marks a projectile with a piercing thickness;
on collision with an Impassable wall whose ArmorThickness can be
pierced, the collision is cancelled (the projectile passes through)
and the projectile's piercing budget is halved. Already-pierced
entities are skipped silently.
All shared, networked, hooked into the existing PreventCollideEvent —
no upstream-system modifications. Behaviour-neutral until prototypes
opt in.
This is Phase 5 of the Mono hostile shuttle event content port. The
nanolaminate hull walls introduced by #33 currently omit ArmorThickness
for buildability; once this PR lands they can be re-armed with
'thickness: 10'.
* feat(events): port Mono hostile shuttle station events (v2 rebased) (#33)
* feat(events): port Mono hostile shuttle station events from Triad_Sector
Brings VRS up to parity with Triad/Mono on procedural enemy-ship
encounters. Until now the three faction rule files
(damaged_ai/chimera/asakim) shipped fully commented-out because their
maps + entity dependencies had never been ported, so no enemy ships ever
actually spawned during NFAdventure rounds.
This PR ports the full chain end-to-end:
* New base+schedulers in _Mono/GameRules/base.yml:
- BaseRandomShuttleRule (parent, RuleGrids + LoadMapRule)
- MonoAISTCShuttleSpawnerScheduler (T1, 1h start, 90-120m cadence)
- MonoAISTCShuttleSpawnerSchedulerTier2 (3h start, 60m cadence)
- MonoAsakimSTCShuttleSpawnerScheduler (1h start, 60-120m)
- MonoChimeraSTCShuttleSpawnerScheduler (1h start, 40-80m)
- Round-restart/portstrike timing rules intentionally NOT touched.
* Uncommented damaged_ai.yml / chimera.yml / asakim.yml so the
UnknownShuttle* rules and entityTables actually load.
* Wired the four schedulers into the NFAdventure preset.
* Copied 12 ship maps to Resources/Maps/_Mono/ShuttleEvent/
(asakim_small/medium, zenith/_e, wyrm, wyvern, razorn, nebula,
sakuratsu/olympus/tethys/legionnaire chimera).
* Copied 20 source prototype YAMLs the maps depend on:
Iridite/fissile/depleted-uranium materials, Monolithic crystals,
Chimera flesh kudzu, redacted Station-AI silicon, Outpost power core,
rogue thrusters, Mono nanolaminate/plastitanium-capital walls,
Drake Industries emblem, RMC14 semiotic signs, redacted borg modules,
RogueSilicon research disks, ScuttleDeviceRazorN/Wyvern,
PowerCellCombat lathe recipe, ghost-role spawners
(Asakim Warriors, Chimera ghostroles, Redacted Borg).
* Copied 23 sprite directories (.rsi) backing those entities.
* Appended BaseMonolithContrabandT1/T2/T3 abstract parents to
base_contraband.yml without disturbing existing VRS contraband
customizations.
Gameplay impact: NFAdventure rounds will start broadcasting
'AI shuttle / Chimera shuttle / Asakim shuttle detected' announcements
~1-3 hours in, then on cadence. Crews can engage and salvage; new ghost
roles (Asakim Warriors, Chimera, Redacted Borg) become available to
ghosts on those grids; new lootable materials (Iridite, fissile uranium,
Monolithic crystals) leak into the salvage economy. Largest ships gated
behind 32-60+ playercount.
* fix(events): adapt mono hostile shuttle port for VRS components
* feat(events): port hostile shuttle event prototype dependencies (Phase 1)
Adds the prototypes referenced by the Mono hostile shuttle event POI
maps that were missing in VRS. With these the ported ship POIs load
without unknown-prototype warnings.
Prototypes added (parented to existing VRS bases where possible):
- WeaponLauncherRocketEmp (EMP RPG variant)
- PoweredStrobeRedEnabled (pre-on red strobe)
- WeaponTurretLaserSyndicateNF + SpawnMobWeaponTurretLaserSyndicateNF
- AirlockExternalGlassRogueLocked, AirlockShuttleSyndicateRogueLocked,
AirlockHatchRogueLocked (Rogue-named aliases of VRS's Pirate-locked
airlocks; preserves Triad map IDs without map edits)
- AirlockShuttleSyndicateCapital + AirlockGlassShuttleSyndicateCapital
(capital-class buffed docking airlocks)
- RogueSiliconResearchDisk25000 / 50000 (boss/elite loot disks)
- AirAlarmXeno (alien-styled air alarm)
- RadarEdgeMarkerCenter (central grid edge marker variant)
Sprite assets copied from Triad_Sector:
- Resources/Textures/_Mono/Objects/Specific/Research/researchdisk.rsi
- Resources/Textures/Structures/Wallmounts/air_monitors_xeno.rsi
Outstanding: WallNanolaminate(Diagonal) intentionally deferred until
ArmorThickness component port (Phase 5).
* feat(events): stub WallNanolaminate(Diagonal) for capital event ships
The wyrm/wyvern hostile shuttle event POI maps reference Mono's
nanolaminate hull walls. The original Mono prototype carries an
ArmorThickness component (armor-piercing damage modifier) that has not
been ported to VRS yet.
These stub variants replicate HP, density, sprites and construction
behaviour so the maps load and behave as standard reinforced hull
plating. ArmorThickness damage modifiers will be layered on in a
follow-up PR alongside the component port.
* fix(walls): substitute WallLayer for missing DiagonalWallLayer enum
VRS's CollisionGroup enum does not yet define DiagonalWallLayer (Mono
addition). Use the standard WallLayer to match existing VRS diagonal
walls (Resources/Prototypes/Entities/Structures/Walls/walls.yml) and
unblock the YAML linter on the events PR.
If the Mono-style diagonal-wall collision profile (Opaque |
HighImpassable | MidImpassable | LowImpassable | BulletImpassable, no
InteractImpassable) is wanted later, the enum value can be added in a
small Content.Shared follow-up.
* fix(events): trim Mono hostile-ship event prototypes to satisfy YAML linter
Resolves the ~155 YAML Linter errors on PR #33 by:
* Trimming each Mono prototype file to only the IDs actually referenced
by event ship maps (PlayerStationAiRedacted, BorgModuleRedactedRCD,
SpawnLootTechDisksT3Fracture, SpawnLootTechDisksPrinterT4,
SpawnRedactedBorg{,Playtime}, SpawnChimeraGhostrole,
SpawnMobWeaponTurretLaserSilicon, MonolithContrabandT{1,2,3}, etc.).
* Substituting unported circuitboards with VRS equivalents
(ThrusterRogueMachineCircuitboard -> ThrusterMachineCircuitboard;
EliteRadarCircuitboard / StationRadarCircuitboard ->
RadarConsoleCircuitboard).
* Substituting WeaponTurretLaserSilicon with WeaponTurretLaserSyndicateNF.
* Porting required Mono primitives missing from VRS:
- Tags WallT4 + CartridgeRocketEmp
- Stacks Pyrogel/Iridite/UraniumFissile/UraniumDepleted
(Plastitanium dropped — already defined in HL).
- ContrabandSeverity MonolithContrabandT1/T2/T3
- Reagent NaturalLetoferol (stub; full chimera deps not ported).
- AccessLevel/Group GrandVizier, PDVCommand, TsfmcEngineering,
TsfGeneralNoBrig.
- Mono Datasets/Names + matching localizedDatasets for the AI core
nameSegments (LocalizedDatasetPrototype required by VRS RandomMetadata).
- Locale strings: stack-pyrogel, contraband-examine-text-monolith-loot-{1,2,3},
scuttle-device-razor-announcement-sender, dataset-mono-remnant-*.
* Removing duplicates that crashed prototype loading
(PlushieDrakeborn migration entry; FactionGear/OtherFactionGear
contrabandSeverity already in NF; Plastitanium stack/loc already in HL).
* Deleting orphan Mono debug.sweps.yml (uses unported BallisticAmmoProvider
field 'ignoreWhitelist') and the borg_chassis.yml / Recipes/Lathes/
powercells.yml prototypes whose dependents (Mono borg roster, Smilodon
battery cells) are not yet ported.
* Carrying ChainRadiationComponent/System.cs sources so the rewire PR can
bind ChainRadiation onto SheetUraniumFissile cleanly.
Verified locally: dotnet run --project Content.YAMLLinter reports
'No errors found'.
---------
Co-authored-by: Kronyxxx <kronyxxx@users.noreply.github.com>
Co-authored-by: copilot <copilot@vrs.local>
* feat(events): rewire ported Mono components onto stripped prototypes (#38)
Re-attaches the four Mono components that PR #33 stripped for
buildability, now that the underlying systems have been ported in
follow-up PRs:
- ChainRadiation on SheetUraniumFissile (ported in #35).
Uses the new VRS-side 'explosionType: Radioactive' field on
ChainRadiationComponent (Mono originally read this from
ExplosiveComponent, which is now locked to SharedExplosionSystem).
- ItemMiner + PowerConsumerMiner on the Mono disk printer
(ported in #34).
- SavingContraband on outpost powercores (ported in #36).
- ArmorThickness on BaseWallTier{One..Four}, BaseWallOutpost, and
WallNanolaminate / WallNanolaminateDiagonal (ported in #37).
Components that remain stripped (their systems are still deferred):
AdvancedPilot, ShuttleBoostingPilot (Phase 3), Scrammer (not yet
ported), CollectiveMind (Phase 2a), LanguageKnowledge (Phase 2b).
* feat(mono): port Scrammer random-teleport action system (#39)
Ports the Mono ScramActionSystem from Triad. Grants entities with the
ScrammerComponent an instant action that random-teleports them within a
configurable radius. Used by Mono silicon mob templates (and reusable
for any future mob/borg port that needs a panic-teleport action).
Includes:
- Content.Shared/_Mono/Teleportation/TeleportSpecifier.cs: configuration
block consumed by RandomTeleport.
- Content.Shared/_Mono/Teleportation/ScrammerComponent.cs: component +
ScrammerScramEvent (instant action event).
- Content.Server/_Mono/Teleportation/ScramActionSystem.cs: action grant/
remove on map-init/component-remove + scram event handler. Honors
ItemToggle when ItemToggleToggle is set (so EMP-disabled borgs lose
the action).
- Resources/Prototypes/_Mono/Actions/scram.yml: ActionScrammerScram and
ActionScrammerScramADM (charged variant) action prototypes.
- Resources/Locale/en-US/_Mono/actions/scram.ftl: disabled-popup string.
- Adds RandomTeleport(EntityUid, TeleportSpecifier) overload to the
existing Goobstation TeleportSystem; degrades MinRadiusFraction /
AvoidSpace / ForceSafe to current radius/sound/attempts behavior
(documented in source).
* feat(mono): port AdvancedPilot + CrewedShuttle dual-console gating (#40)
Ports the Mono crewed-shuttle dual-console restriction system from Triad.
On grids with CrewedShuttleComponent, a single user cannot have both a
shuttle console and a gunnery console open at the same time on that grid;
the AdvancedPilotComponent marker overrides the restriction per-user.
Includes:
- Content.Shared/_Mono/Ships/Components/AdvancedPilotComponent.cs:
marker component granting dual-console capability.
- Content.Shared/_Mono/Ships/Components/CrewedShuttleComponent.cs:
marker component flagging a shuttle as crewed.
- Content.Server/_Mono/Ships/Systems/CrewedShuttleSystem.cs:
AnyShuttle/GunneryConsoleActiveByPlayer queries used by the gates.
- Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs:
OnConsoleUIOpenAttempt gates shuttle-console open against any open
gunnery console on the same grid.
- Content.Server/_Mono/FireControl/FireControlSystem.Console.cs:
symmetric gate on the fire-control console open path. Adds the
ActivatableUIOpenAttemptEvent subscription.
- Resources/Locale/en-US/_Mono/shuttles/shuttle-console.ftl:
shuttle-console-crewed popup string.
The CrewedShuttle tag (Resources/Prototypes/_Mono/tags.yml) is already
present in VRS but unused. Vessels can now opt in by declaring
CrewedShuttleComponent directly via the vessel's AddComponents block,
or via prototype on the grid template. A future PR can wire a tag
check during shipyard purchase to EnsureComp automatically.
* feat(mono): port ShuttleBoostingPilot system + per-pilot motion multipliers (#41)
Ports the Mono ShuttleBoostingPilotComponent/System from Triad and the
minimal MoverController plumbing it needs. Pilots can now contribute
per-pilot multipliers to their shuttle's angular thrust and linear
acceleration via GetShuttleInputsEvent; multipliers are averaged across
active pilots each frame and stored on ShuttleComponent for consumption
by torque/thrust calculations.
Includes:
- Content.Server/_Mono/Shuttles/Components/ShuttleBoostingPilotComponent.cs
- Content.Server/_Mono/Shuttles/Systems/ShuttleBoostingPilotSystem.cs
Plumbing changes:
- Content.Server/Physics/Controllers/MoverEvents.cs: extends
GetShuttleInputsEvent with AngularMul / AccelMul (default 1f).
- Content.Server/Shuttles/Components/ShuttleComponent.cs: adds
AngularMultiplier / AccelerationMultiplier (default 1f).
- Content.Server/Physics/Controllers/MoverController.cs:
* accumulates per-pilot AngularMul/AccelMul during HandleShuttleMovement,
averages by active pilot count, writes to shuttle.AngularMultiplier /
.AccelerationMultiplier; resets to 1f when no pilots.
* GetAngularAcceleration multiplies AngularThrust by AngularMultiplier.
* GetDirectionThrust multiplies result by AccelerationMultiplier.
* Direct AngularThrust torque sites in brake / steer paths multiply
by AngularMultiplier as well.
No prototype currently consumes ShuttleBoostingPilotComponent; mob/borg
consumers (e.g. ADM silicon) will land in their own ports. This PR
…
fenndragon
added a commit
that referenced
this pull request
May 21, 2026
* Merge pull request #3 from AU-14/weapons M41 + Smartgun * Merge pull request #39 from troytroy400/equipment-rework PvE Hat/Helmet Ports * Merge pull request #43 from troytroy400/pvearmor PvE Marine Armor * Merge pull request #44 from troytroy400/evenmoreclothing Port PvE Clothing * Merge pull request #45 from troytroy400/goggles Port PvE Goggles * Merge pull request #47 from troytroy400/glasses Port PvE Glasses * rmc weapons * bezoar * fix * Update Bezoar.yml * Update Bezoar.yml * Update base_pistol.yml * Update base_sniper.yml * Update base_gun.yml * Update Bezoar.yml * fix * fixes * Update tags.yml * tweak * damage rebalance * Update grenades.yml --------- Co-authored-by: Peptide90 <78795277+Peptide90@users.noreply.github.com> Co-authored-by: Orion <58231741+troytroy400@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
About the PR
Adds priority docking doors, some examples to the tags section and sets the pathfinder to prio dock with the tag "MercDock" for testing purposes
Why / Balance
Technical details
How to test
Media
Requirements
Breaking changes
Changelog