Skip to content

updates to Core, other misc mapping#8

Merged
Cygnall merged 2 commits into
HardLightSector:masterfrom
Cygnall:vandanna
May 24, 2025
Merged

updates to Core, other misc mapping#8
Cygnall merged 2 commits into
HardLightSector:masterfrom
Cygnall:vandanna

Conversation

@Cygnall
Copy link
Copy Markdown

@Cygnall Cygnall commented May 24, 2025

see design document checklists for full changes to Core

flipped cargo depot sale values to high
enabled Valet

@Cygnall Cygnall merged commit ae159a7 into HardLightSector:master May 24, 2025
12 of 15 checks passed
Shajoisafrog pushed a commit to Shajoisafrog/HardLight that referenced this pull request Apr 2, 2026
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
…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant