diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs
index 210720c45d..1b6041cdd8 100644
--- a/Content.Client/Entry/EntryPoint.cs
+++ b/Content.Client/Entry/EntryPoint.cs
@@ -122,7 +122,11 @@ namespace Content.Client.Entry
_prototypeManager.RegisterIgnore("alertLevels");
_prototypeManager.RegisterIgnore("nukeopsRole");
_prototypeManager.RegisterIgnore("ghostRoleRaffleDecider");
- _prototypeManager.RegisterIgnore("candyFlavor"); // Delta-V
+ // Begin DeltaV Additions
+ _prototypeManager.RegisterIgnore("candyFlavor");
+ _prototypeManager.RegisterIgnore("mappingCategory");
+ _prototypeManager.RegisterIgnore("mapCategories");
+ // End DeltaV Additions
_componentFactory.GenerateNetIds();
_adminManager.Initialize();
diff --git a/Content.IntegrationTests/Tests/_DV/MappingCategoryTest.cs b/Content.IntegrationTests/Tests/_DV/MappingCategoryTest.cs
new file mode 100644
index 0000000000..d55f4ff881
--- /dev/null
+++ b/Content.IntegrationTests/Tests/_DV/MappingCategoryTest.cs
@@ -0,0 +1,100 @@
+using Content.Server._DV.Mapping;
+using Robust.Shared.ContentPack;
+using Robust.Shared.EntitySerialization;
+using Robust.Shared.EntitySerialization.Systems;
+using Robust.Shared.GameObjects;
+using Robust.Shared.Log;
+using Robust.Shared.Map;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.Markdown.Mapping;
+using Robust.Shared.Serialization.Markdown.Value;
+using Robust.Shared.Utility;
+using System.Linq;
+
+namespace Content.IntegrationTests.Tests._DV;
+
+///
+/// Checks that every mapped entity with is allowed to be mapped.
+///
+public sealed class MappingCategoryTest
+{
+ private const string MapsPath = "/Maps";
+ // dev map doesn't matter and don't want to change it
+ private const string TestMapsPath = "/Maps/Test/";
+
+ [Test]
+ public async Task NonGameMapsLoadableTest()
+ {
+ await using var pair = await PoolManager.GetServerClient();
+ var server = pair.Server;
+ var entMan = server.ResolveDependency();
+ var resMan = server.ResolveDependency();
+ var mapLoader = entMan.System();
+ var catSys = entMan.System(); // meow
+ var mapSys = entMan.System();
+ var sawmill = server.ResolveDependency().GetSawmill("mapping_categories");
+
+ await server.WaitPost(() =>
+ {
+ Assert.Multiple(() =>
+ {
+ var mapFolder = new ResPath(MapsPath);
+ foreach (var map in resMan.ContentFindFiles(mapFolder))
+ {
+ if (map.Extension != "yml" || map.Filename.StartsWith(".", StringComparison.Ordinal))
+ continue;
+
+ var rootedPath = map.ToRootedPath().ToString();
+ if (rootedPath.StartsWith(TestMapsPath, StringComparison.Ordinal))
+ continue;
+
+ if (GetCategory(map, mapLoader) is not {} category)
+ {
+ sawmill.Warning($"Map {map} is missing a category, skipping it.");
+ continue;
+ }
+
+ var mapUid = mapSys.CreateMap(out var mapId);
+ var opts = new MapLoadOptions
+ {
+ MergeMap = category == FileCategory.Map
+ ? null // don't try to reparent maps
+ : mapId // needed or else grids will be de-orphaned which is bad
+ };
+ Assert.That(mapLoader.TryLoadGeneric(map, out var maps, out _, opts), $"Failed to load map {rootedPath}");
+ maps.Add(mapUid);
+
+ var allowed = catSys.GetAllowedCategories(rootedPath);
+ var query = entMan.EntityQueryEnumerator();
+ while (query.MoveNext(out var uid, out var comp))
+ {
+ var ent = (uid, comp);
+ Assert.That(catSys.CanMap(ent, allowed), $"Entity {entMan.ToPrettyString(uid)} cannot be mapped on {rootedPath}");
+ }
+
+ foreach (var uid in maps)
+ {
+ entMan.DeleteEntity(uid);
+ }
+ }
+ });
+ });
+
+ await server.WaitRunTicks(1);
+
+ await pair.CleanReturnAsync();
+ }
+
+ // me when engine doesnt have this
+ private FileCategory? GetCategory(ResPath path, MapLoaderSystem mapLoader)
+ {
+ Assert.That(mapLoader.TryReadFile(path, out var data), $"Failed to read map file {path}");
+ var meta = data.Get("meta");
+ if (!meta.TryGet("category", out var node))
+ return null;
+
+ var valid = Enum.TryParse(node.Value, out var cat);
+ Assert.That(valid, $"Category for {path} is invalid");
+ return cat;
+ }
+}
diff --git a/Content.Server/_DV/Mapping/MapCategoriesPrototype.cs b/Content.Server/_DV/Mapping/MapCategoriesPrototype.cs
new file mode 100644
index 0000000000..6be70775f3
--- /dev/null
+++ b/Content.Server/_DV/Mapping/MapCategoriesPrototype.cs
@@ -0,0 +1,25 @@
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._DV.Mapping;
+
+///
+/// Defines what entity can be added to a certain map.
+///
+[Prototype]
+public sealed partial class MapCategoriesPrototype : IPrototype
+{
+ [IdDataField]
+ public string ID { get; set; } = default!;
+
+ ///
+ /// The map path to apply these categories for.
+ ///
+ [DataField(required: true)]
+ public string Map = string.Empty;
+
+ ///
+ /// The categories that are allowed for the defined map.
+ ///
+ [DataField(required: true)]
+ public HashSet> Allowed = new();
+}
diff --git a/Content.Server/_DV/Mapping/MappingCategoriesComponent.cs b/Content.Server/_DV/Mapping/MappingCategoriesComponent.cs
new file mode 100644
index 0000000000..ff62ad89da
--- /dev/null
+++ b/Content.Server/_DV/Mapping/MappingCategoriesComponent.cs
@@ -0,0 +1,16 @@
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._DV.Mapping;
+
+///
+/// Component added to prototypes to prevent them being mapped on stations that do not allow them.
+///
+[RegisterComponent, Access(typeof(MappingCategoriesSystem))]
+public sealed partial class MappingCategoriesComponent : Component
+{
+ ///
+ /// The categories this prototype has.
+ ///
+ [DataField(required: true)]
+ public List> Categories = new();
+}
diff --git a/Content.Server/_DV/Mapping/MappingCategoriesSystem.cs b/Content.Server/_DV/Mapping/MappingCategoriesSystem.cs
new file mode 100644
index 0000000000..104c1cb23b
--- /dev/null
+++ b/Content.Server/_DV/Mapping/MappingCategoriesSystem.cs
@@ -0,0 +1,89 @@
+using Robust.Shared.Containers;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._DV.Mapping;
+
+public sealed class MappingCategoriesSystem : EntitySystem
+{
+ [Dependency] private readonly IPrototypeManager _proto = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+
+ private readonly HashSet> _ignoreInsideContainers = new();
+ private readonly HashSet> _emptyCategories = new();
+ private readonly Dictionary _maps = new();
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnPrototypesReloaded);
+
+ CacheCategories();
+ CacheMaps();
+ }
+
+ ///
+ /// Returns whether a category is ignored when inside a container.
+ ///
+ public bool IsIgnoredInsideContainer(ProtoId id)
+ {
+ return _ignoreInsideContainers.Contains(id);
+ }
+
+ ///
+ /// Get the allowed categories for a given map path.
+ ///
+ public HashSet> GetAllowedCategories(string mapPath)
+ {
+ if (_maps.TryGetValue(mapPath, out var proto))
+ return proto.Allowed;
+
+ return _emptyCategories;
+ }
+
+ ///
+ /// Returns true if an entity can be mapped.
+ ///
+ public bool CanMap(Entity ent, HashSet> allowed)
+ {
+ var insideContainer = _container.IsEntityInContainer(ent);
+ foreach (var id in ent.Comp.Categories)
+ {
+ if (insideContainer && IsIgnoredInsideContainer(id))
+ continue;
+
+ if (!allowed.Contains(id))
+ return false;
+ }
+
+ // all categories were skipped or allowed by the map
+ return true;
+ }
+
+ private void OnPrototypesReloaded(PrototypesReloadedEventArgs args)
+ {
+ if (args.WasModified())
+ CacheCategories();
+ if (args.WasModified())
+ CacheMaps();
+ }
+
+ private void CacheCategories()
+ {
+ _ignoreInsideContainers.Clear();
+ foreach (var proto in _proto.EnumeratePrototypes())
+ {
+ if (proto.IgnoreInsideContainer)
+ _ignoreInsideContainers.Add(proto.ID);
+ }
+ }
+
+ private void CacheMaps()
+ {
+ _maps.Clear();
+ foreach (var proto in _proto.EnumeratePrototypes())
+ {
+ _maps.Add(proto.Map, proto);
+ }
+ }
+}
diff --git a/Content.Server/_DV/Mapping/MappingCategoryPrototype.cs b/Content.Server/_DV/Mapping/MappingCategoryPrototype.cs
new file mode 100644
index 0000000000..ebb1d4a1f6
--- /dev/null
+++ b/Content.Server/_DV/Mapping/MappingCategoryPrototype.cs
@@ -0,0 +1,21 @@
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._DV.Mapping;
+
+///
+/// A mapping category that can be applied to items.
+/// Maps can specify what categories they allow.
+///
+[Prototype]
+public sealed partial class MappingCategoryPrototype : IPrototype
+{
+ [IdDataField]
+ public string ID { get; set; } = default!;
+
+ ///
+ /// Ignores checking items that are inside containers for this category.
+ /// Useful for stamps which are not allowed to be mapped directly, but spawn in head lockers.
+ ///
+ [DataField]
+ public bool IgnoreInsideContainer;
+}
diff --git a/Resources/Maps/_DV/Salvage/DV-asteroid-mining-chemlab.yml b/Resources/Maps/_DV/Salvage/DV-asteroid-mining-chemlab.yml
index 1d207871e7..c8eca523e4 100644
--- a/Resources/Maps/_DV/Salvage/DV-asteroid-mining-chemlab.yml
+++ b/Resources/Maps/_DV/Salvage/DV-asteroid-mining-chemlab.yml
@@ -5486,7 +5486,7 @@ entities:
- type: Transform
pos: 8.5,9.5
parent: 1
-- proto: ToolboxElectricalTurretFilled
+- proto: ToolboxElectricalFilled
entities:
- uid: 334
components:
diff --git a/Resources/Maps/_DV/centcomm.yml b/Resources/Maps/_DV/centcomm.yml
index 1954f561fb..31bc69bc6e 100644
--- a/Resources/Maps/_DV/centcomm.yml
+++ b/Resources/Maps/_DV/centcomm.yml
@@ -1,6 +1,17 @@
meta:
- format: 6
- postmapinit: false
+ format: 7
+ category: Grid
+ engineVersion: 247.2.0
+ forkId: ""
+ forkVersion: ""
+ time: 03/04/2025 18:40:52
+ entityCount: 7224
+maps: []
+grids:
+- 1668
+orphans:
+- 1668
+nullspace: []
tilemap:
0: Space
7: FloorAsteroidSand
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml b/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml
index 1b191d90f7..d7c5a4aaf7 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/syndicate.yml
@@ -6,6 +6,9 @@
components:
- type: SurplusBundle
totalPrice: 50
+ - type: MappingCategories # DeltaV
+ categories:
+ - Syndicate
- type: entity
id: CrateCybersunJuggernautBundle
@@ -21,6 +24,9 @@
- id: ClothingHandsGlovesCombat
- id: DoubleEmergencyOxygenTankFilled
- id: DoubleEmergencyNitrogenTankFilled
+ - type: MappingCategories # DeltaV
+ categories:
+ - Syndicate
- type: entity
id: CrateSyndicateSuperSurplusBundle
@@ -30,3 +36,6 @@
components:
- type: SurplusBundle
totalPrice: 125
+ - type: MappingCategories # DeltaV
+ categories:
+ - Syndicate
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
index 30bf24a43a..f9541634df 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
@@ -568,6 +568,9 @@
- Hardsuit
- WhitelistChameleon
- HidesHarpyWings
+ - type: MappingCategories # DeltaV
+ categories:
+ - Syndicate
# Syndicate Medic Hardsuit
- type: entity
@@ -662,6 +665,9 @@
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitSyndieCommander
+ - type: MappingCategories # DeltaV
+ categories:
+ - Syndicate
#Cybersun Juggernaut Hardsuit
- type: entity
@@ -701,6 +707,9 @@
newItem: ClothingOuterHardsuitJuggernautReverseEngineered
recipes:
- ClothingOuterHardsuitJuggernautReverseEngineered
+ - type: MappingCategories # DeltaV
+ categories:
+ - Syndicate
#Wizard Hardsuit
- type: entity
@@ -733,6 +742,9 @@
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitWizard
+ - type: MappingCategories # DeltaV
+ categories:
+ - Wizard
#Ling Space Suit
- type: entity
@@ -763,6 +775,9 @@
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitLing
+ - type: MappingCategories # DeltaV
+ categories:
+ - Changeling
#Pirate EVA Suit (Deep Space EVA Suit)
#Despite visually appearing like a softsuit, it functions exactly like a hardsuit would (parents off of base hardsuit, has resistances and toggleable clothing, etc.) so it goes here.
@@ -795,6 +810,9 @@
clothingPrototype: ClothingHeadHelmetHardsuitPirateEVA
- type: StaticPrice
price: 0
+ - type: MappingCategories # DeltaV
+ categories:
+ - Pirate
#Pirate Captain Hardsuit
- type: entity
@@ -828,6 +846,9 @@
clothingPrototype: ClothingHeadHelmetHardsuitPirateCap
- type: StaticPrice
price: 0
+ - type: MappingCategories # DeltaV
+ categories:
+ - Pirate
#CENTCOMM / ERT HARDSUITS
#ERT Leader Hardsuit
diff --git a/Resources/Prototypes/Entities/Debugging/clicktest.yml b/Resources/Prototypes/Entities/Debugging/clicktest.yml
index 7eb0a06330..b830922b04 100644
--- a/Resources/Prototypes/Entities/Debugging/clicktest.yml
+++ b/Resources/Prototypes/Entities/Debugging/clicktest.yml
@@ -17,6 +17,9 @@
- type: Sprite
noRot: false
sprite: Effects/clicktest.rsi
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
- type: entity
diff --git a/Resources/Prototypes/Entities/Debugging/debug_sweps.yml b/Resources/Prototypes/Entities/Debugging/debug_sweps.yml
index 9ba7c85e1e..00e32710c5 100644
--- a/Resources/Prototypes/Entities/Debugging/debug_sweps.yml
+++ b/Resources/Prototypes/Entities/Debugging/debug_sweps.yml
@@ -40,6 +40,9 @@
whitelist:
tags:
- CartridgePistol
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
- type: entity
id: MagazinePistolDebug
@@ -55,6 +58,9 @@
capacity: 1000
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Magazine/Pistol/pistol_mag.rsi
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
- type: entity
id: BulletDebug
@@ -70,6 +76,9 @@
damage:
types:
Blunt: 20000
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
- type: entity
id: CartridgeDebug
@@ -82,6 +91,9 @@
- Debug
- type: CartridgeAmmo
proto: BulletDebug
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
- type: entity
name: bang stick gibber
@@ -103,6 +115,9 @@
- type: Item
size: Tiny
sprite: Objects/Weapons/Melee/debug.rsi
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
- type: entity
name: bang stick 100dmg
@@ -116,6 +131,9 @@
damage:
types:
Blunt: 100
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
- type: entity
name: bang stick 200dmg
@@ -129,3 +147,6 @@
damage:
types:
Blunt: 200
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
diff --git a/Resources/Prototypes/Entities/Debugging/item.yml b/Resources/Prototypes/Entities/Debugging/item.yml
index e3c8ffddd2..2af4449985 100644
--- a/Resources/Prototypes/Entities/Debugging/item.yml
+++ b/Resources/Prototypes/Entities/Debugging/item.yml
@@ -19,3 +19,6 @@
- 1, 4, 6, 4
- 6, 2, 6, 2
- 5, 3, 5, 5
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
diff --git a/Resources/Prototypes/Entities/Debugging/options_visualizer.yml b/Resources/Prototypes/Entities/Debugging/options_visualizer.yml
index 229ffa00cc..d720f4ab63 100644
--- a/Resources/Prototypes/Entities/Debugging/options_visualizer.yml
+++ b/Resources/Prototypes/Entities/Debugging/options_visualizer.yml
@@ -21,4 +21,7 @@
data: { state: motion }
- options: [Test, ReducedMotion]
data: { state: both }
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
diff --git a/Resources/Prototypes/Entities/Debugging/spanisharmyknife.yml b/Resources/Prototypes/Entities/Debugging/spanisharmyknife.yml
index 023ba8c08a..d96733089d 100644
--- a/Resources/Prototypes/Entities/Debugging/spanisharmyknife.yml
+++ b/Resources/Prototypes/Entities/Debugging/spanisharmyknife.yml
@@ -38,3 +38,6 @@
- behavior: Anchoring
useSound: /Audio/Items/drill_use.ogg
changeSound: /Audio/Items/change_drill.ogg
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
diff --git a/Resources/Prototypes/Entities/Debugging/stress_test.yml b/Resources/Prototypes/Entities/Debugging/stress_test.yml
index 72651cdaee..4f6c870d28 100644
--- a/Resources/Prototypes/Entities/Debugging/stress_test.yml
+++ b/Resources/Prototypes/Entities/Debugging/stress_test.yml
@@ -10,3 +10,6 @@
sprite: Effects/explosion.rsi
state: explosion
- type: StressTestMovement
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
diff --git a/Resources/Prototypes/Entities/Debugging/tippy.yml b/Resources/Prototypes/Entities/Debugging/tippy.yml
index 7f149c3b5d..0ffc3ae0a5 100644
--- a/Resources/Prototypes/Entities/Debugging/tippy.yml
+++ b/Resources/Prototypes/Entities/Debugging/tippy.yml
@@ -28,3 +28,6 @@
backgroundPatchMargin: 16.0, 16.0, 16.0, 16.0
backgroundModulate: "#ffffcc"
fontAccentColor: "#000000"
+ - type: MappingCategories # DeltaV
+ categories:
+ - Debug
diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml
index ecc57a03bd..7d73335ba3 100644
--- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml
+++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml
@@ -75,6 +75,9 @@
- type: Prayable
sentMessage: prayer-popup-notify-syndicate-sent
notificationPrefix: prayer-chat-notify-syndicate
+ - type: MappingCategories # DeltaV
+ categories:
+ - Syndicate
- type: entity
parent: BaseHandheldInstrument
diff --git a/Resources/Prototypes/Entities/Objects/Misc/rubber_stamp.yml b/Resources/Prototypes/Entities/Objects/Misc/rubber_stamp.yml
index d3f6088699..dfb8589a21 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/rubber_stamp.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/rubber_stamp.yml
@@ -21,6 +21,9 @@
size: Tiny
- type: StealTarget
stealGroup: Stamp
+ - type: MappingCategories # DeltaV
+ categories:
+ - Stamps
- type: entity
name: alternate rubber stamp
@@ -36,6 +39,8 @@
params:
volume: -2
maxDistance: 5
+ - type: MappingCategories # DeltaV - approved/denied are fine
+ categories: []
- type: entity
name: captain's rubber stamp
@@ -177,12 +182,12 @@
id: RubberStampQm
categories: [ DoNotMap ]
components:
- - type: Stamp
- stampedName: stamp-component-stamped-name-qm
- stampedColor: "#a23e3e"
- stampState: "paper_stamp-qm"
- - type: Sprite
- state: stamp-qm
+ - type: Stamp
+ stampedName: stamp-component-stamped-name-qm
+ stampedColor: "#a23e3e"
+ stampState: "paper_stamp-qm"
+ - type: Sprite
+ state: stamp-qm
- type: entity
name: mystagogue's rubber stamp # DeltaV - Epistemics Department replacing Science
@@ -190,12 +195,12 @@
id: RubberStampRd
categories: [ DoNotMap ]
components:
- - type: Stamp
- stampedName: stamp-component-stamped-name-rd
- stampedColor: "#1f66a0"
- stampState: "paper_stamp-rd"
- - type: Sprite
- state: stamp-rd
+ - type: Stamp
+ stampedName: stamp-component-stamped-name-rd
+ stampedColor: "#1f66a0"
+ stampState: "paper_stamp-rd"
+ - type: Sprite
+ state: stamp-rd
- type: entity
name: trader's rubber stamp
diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml
index dd1f41e571..d45881110d 100644
--- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml
+++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml
@@ -99,6 +99,9 @@
max: 1
- type: StaticPrice
price: 1350
+ - type: MappingCategories # DeltaV
+ categories:
+ - Syndicate
- type: entity
name: artistic toolbox
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml
index 8b4cbe5b96..2d127869f9 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/armblade.yml
@@ -28,3 +28,6 @@
- type: SurgeryTool # Shitmed
startSound:
path: /Audio/_Shitmed/Medical/Surgery/saw.ogg
+ - type: MappingCategories # DeltaV
+ categories:
+ - Changeling
diff --git a/Resources/Prototypes/Entities/Objects/base_contraband.yml b/Resources/Prototypes/Entities/Objects/base_contraband.yml
index 3ad8d80492..dfbf29f2a5 100644
--- a/Resources/Prototypes/Entities/Objects/base_contraband.yml
+++ b/Resources/Prototypes/Entities/Objects/base_contraband.yml
@@ -48,6 +48,9 @@
components:
- type: Contraband
allowedDepartments: [ CentralCommand ]
+ - type: MappingCategories # DeltaV
+ categories:
+ - Centcomm
- type: entity
id: BaseCommandContraband
diff --git a/Resources/Prototypes/_DV/Mapping/categories.yml b/Resources/Prototypes/_DV/Mapping/categories.yml
new file mode 100644
index 0000000000..04ea3f5005
--- /dev/null
+++ b/Resources/Prototypes/_DV/Mapping/categories.yml
@@ -0,0 +1,28 @@
+# Stuff like bang stick that should NEVER be mapped
+- type: mappingCategory
+ id: Debug
+
+# Only centcomm gets centcomm gear
+- type: mappingCategory
+ id: Centcomm
+
+# Changeling stuff should probably never be mapped anywhere
+- type: mappingCategory
+ id: Changeling
+
+# Pirate gear for the pirate ship
+- type: mappingCategory
+ id: Pirate
+
+# Serious syndicate gear that stations should not have, like blood-reds.
+- type: mappingCategory
+ id: Syndicate
+
+# Only the wizard shuttle gets wizard gear
+- type: mappingCategory
+ id: Wizard
+
+# Stamps should not be mapped directly, their lockers should instead.
+- type: mappingCategory
+ id: Stamps
+ ignoreInsideContainer: true
diff --git a/Resources/Prototypes/_DV/Mapping/maps.yml b/Resources/Prototypes/_DV/Mapping/maps.yml
new file mode 100644
index 0000000000..7dfcbd82d5
--- /dev/null
+++ b/Resources/Prototypes/_DV/Mapping/maps.yml
@@ -0,0 +1,109 @@
+# Central Command
+
+- type: mapCategories
+ id: Centcomm
+ map: /Maps/_DV/centcomm.yml
+ allowed:
+ - Centcomm
+ - Stamps # no CC official locker to put the btamp in
+
+# Stations
+
+- type: mapCategories
+ id: Chibi
+ map: /Maps/chibi.yml
+ allowed:
+ - Stamps # tiny station doesn't have lockers for everyone
+
+- type: mapCategories
+ id: Shoukou
+ map: /Maps/shoukou.yml
+ allowed:
+ - Stamps # greytide stamp is mapped on shoukou
+
+# Dungeons
+
+- type: mapCategories
+ id: SnowyLabs
+ map: /Maps/Dungeon/snowy_labs.yml
+ allowed:
+ - Centcomm # CC pen gamer loot
+
+# Nonstations
+
+- type: mapCategories
+ id: NukiePlanet
+ map: /Maps/Nonstations/nukieplanet.yml
+ allowed:
+ - Syndicate # obviously nukies can have syndicate gear
+
+- type: mapCategories
+ id: ListeningPost
+ map: /Maps/_DV/Nonstations/listening_post.yml
+ allowed:
+ - Syndicate
+
+# Shuttles
+
+- type: mapCategories
+ id: Dart
+ map: /Maps/Shuttles/dart.yml
+ allowed:
+ - Centcomm
+
+- type: mapCategories
+ id: Infiltrator
+ map: /Maps/Shuttles/infiltrator.yml
+ allowed:
+ - Syndicate
+
+- type: mapCategories
+ id: Instigator
+ map: /Maps/Shuttles/ShuttleEvent/instigator.yml
+ allowed:
+ - Syndicate
+
+- type: mapCategories
+ id: PirateShip
+ map: /Maps/Shuttles/pirate.yml
+ allowed:
+ - Pirate
+ - Syndicate # it has 2 turret toolboxes for some reason
+
+- type: mapCategories
+ id: RoboNeuroticistShip
+ map: /Maps/Shuttles/roboneuroticist_ship.yml
+ allowed:
+ - Syndicate
+
+- type: mapCategories
+ id: Striker
+ map: /Maps/Shuttles/ShuttleEvent/striker.yml
+ allowed:
+ - Syndicate
+
+- type: mapCategories
+ id: TravelingChinaCuisine
+ map: /Maps/Shuttles/ShuttleEvent/traveling_china_cuisine.yml
+ allowed:
+ - Stamps # Trader stamp
+
+- type: mapCategories
+ id: WizardShuttle
+ map: /Maps/Shuttles/wizard.yml
+ allowed:
+ - Wizard
+
+# Ruins
+
+- type: mapCategories
+ id: OldAiSat
+ map: /Maps/Ruins/old_ai_sat.yml
+ allowed:
+ - Centcomm # CC officer's jumpsuit
+
+- type: mapCategories
+ id: OldAiSatDV
+ map: /Maps/_DV/Ruins/old_ai_sat.yml
+ allowed:
+ - Centcomm # CC officer's jumpsuit