diff --git a/Content.Server/_CP14/DungeonPortal/CP14AutoDungeonPortalComponent.cs b/Content.Server/_CP14/DungeonPortal/CP14AutoDungeonPortalComponent.cs
new file mode 100644
index 0000000000..b8bc554094
--- /dev/null
+++ b/Content.Server/_CP14/DungeonPortal/CP14AutoDungeonPortalComponent.cs
@@ -0,0 +1,13 @@
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._CP14.DungeonPortal;
+
+///
+/// Automatically creates a linked portal of a certain prototype on the opposite linked world, if it exists.
+///
+[RegisterComponent, Access(typeof(CP14AutoDungeonPortalSystem))]
+public sealed partial class CP14AutoDungeonPortalComponent : Component
+{
+ [DataField(required: true)]
+ public EntProtoId OtherSidePortal;
+}
diff --git a/Content.Server/_CP14/DungeonPortal/CP14AutoDungeonPortalSystem.cs b/Content.Server/_CP14/DungeonPortal/CP14AutoDungeonPortalSystem.cs
new file mode 100644
index 0000000000..6b9cbeff40
--- /dev/null
+++ b/Content.Server/_CP14/DungeonPortal/CP14AutoDungeonPortalSystem.cs
@@ -0,0 +1,78 @@
+using Content.Shared.Maps;
+using Content.Shared.Teleportation.Components;
+using Content.Shared.Teleportation.Systems;
+using Robust.Server.GameObjects;
+using Robust.Shared.Map;
+using Robust.Shared.Map.Components;
+using Robust.Shared.Random;
+
+namespace Content.Server._CP14.DungeonPortal;
+
+public sealed partial class CP14AutoDungeonPortalSystem : EntitySystem
+{
+ [Dependency] private readonly MapSystem _map = default!;
+ [Dependency] private readonly LinkedEntitySystem _linkedEntity = default!;
+ [Dependency] private readonly SharedTransformSystem _transform = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly ITileDefinitionManager _tileDefManager = default!;
+ [Dependency] private readonly TileSystem _tile = default!;
+ [Dependency] private readonly SharedMapSystem _maps = default!;
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnMapInit);
+ }
+
+ private void OnMapInit(Entity autoPortal, ref MapInitEvent args)
+ {
+ if (!TryComp(autoPortal, out var portalComp))
+ return;
+
+ var mapId = Transform(autoPortal).MapID;
+ _map.TryGetMap(mapId, out var mapUid);
+
+ if (mapUid == null)
+ return;
+
+ if (!TryComp(mapUid, out var link))
+ return;
+
+ if (link.LinkedEntities.Count > 1) //Bruh, we don't want more than 1 linked maps for now
+ return;
+
+ var targetMapUid = _random.Pick(link.LinkedEntities);
+ var targetMapId = Transform(targetMapUid).MapID;
+
+ var currentWorldPos = _transform.GetWorldPosition(autoPortal);
+ var targetMapPos = new MapCoordinates(currentWorldPos, targetMapId);
+
+ var otherSidePortal = Spawn(autoPortal.Comp.OtherSidePortal, targetMapPos);
+
+ if (_linkedEntity.TryLink(autoPortal, otherSidePortal, true))
+ RemComp(autoPortal);
+
+ ClearOtherSide(otherSidePortal, targetMapUid);
+ }
+
+ private void ClearOtherSide(EntityUid otherSidePortal, EntityUid targetMapUid)
+ {
+ var tiles = new List<(Vector2i Index, Tile Tile)>();
+ var originF = _transform.GetWorldPosition(otherSidePortal);
+ var origin = new Vector2i((int) originF.X, (int) originF.Y);
+ var tileDef = _tileDefManager["CP14FloorStonebricks"]; //TODO: Remove hardcode
+ var seed = _random.Next();
+ var random = new Random(seed);
+ var grid = Comp(targetMapUid);
+
+ for (var x = -2; x <= 2; x++) //TODO: Remove hardcode
+ {
+ for (var y = -2; y <= 2; y++)
+ {
+ tiles.Add((new Vector2i(x, y) + origin, new Tile(tileDef.TileId, variant: _tile.PickVariant((ContentTileDefinition) tileDef, random))));
+ }
+ }
+
+ _maps.SetTiles(targetMapUid, grid, tiles);
+ }
+}
diff --git a/Content.Server/_CP14/StationBiome/CP14StationBiomeComponent.cs b/Content.Server/_CP14/StationBiome/CP14StationBiomeComponent.cs
deleted file mode 100644
index 122759a35f..0000000000
--- a/Content.Server/_CP14/StationBiome/CP14StationBiomeComponent.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using Content.Shared.Parallax.Biomes;
-using Robust.Shared.Prototypes;
-
-namespace Content.Server._CP14.StationBiome;
-
-///
-/// allows you to initialize a planet on a specific map at initialization time.
-///
-
-[RegisterComponent, Access(typeof(CP14StationBiomeSystem))]
-public sealed partial class CP14StationBiomeComponent : Component
-{
- [DataField]
- public ProtoId Biome = "Grasslands";
-
- // If null, its random
- [DataField]
- public int? Seed = null;
-}
diff --git a/Content.Server/_CP14/StationBiome/CP14StationBiomeSystem.cs b/Content.Server/_CP14/StationBiome/CP14StationBiomeSystem.cs
deleted file mode 100644
index 188643f9a4..0000000000
--- a/Content.Server/_CP14/StationBiome/CP14StationBiomeSystem.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Content.Server.Parallax;
-using Content.Server.Station.Components;
-using Content.Server.Station.Events;
-using Content.Server.Station.Systems;
-using Robust.Shared.Map;
-using Robust.Shared.Prototypes;
-
-namespace Content.Server._CP14.StationBiome;
-public sealed partial class CP14StationBiomeSystem : EntitySystem
-{
- [Dependency] private readonly BiomeSystem _biome = default!;
- [Dependency] private readonly IMapManager _mapManager = default!;
- [Dependency] private readonly IPrototypeManager _proto = default!;
- [Dependency] private readonly StationSystem _station = default!;
-
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent(OnStationPostInit);
- }
-
- private void OnStationPostInit(Entity map, ref StationPostInitEvent args)
- {
- if (!TryComp(map, out StationDataComponent? dataComp))
- return;
-
- var station = _station.GetLargestGrid(dataComp);
- if (station == null) return;
-
- var mapId = Transform(station.Value).MapID;
- var mapUid = _mapManager.GetMapEntityId(mapId);
-
- _biome.EnsurePlanet(mapUid, _proto.Index(map.Comp.Biome), map.Comp.Seed);
- }
-}
diff --git a/Content.Server/_CP14/StationDungeonMap/CP14StationDungeonMapComponent.cs b/Content.Server/_CP14/StationDungeonMap/CP14StationDungeonMapComponent.cs
new file mode 100644
index 0000000000..e0a8fb8fca
--- /dev/null
+++ b/Content.Server/_CP14/StationDungeonMap/CP14StationDungeonMapComponent.cs
@@ -0,0 +1,27 @@
+using Content.Shared.Parallax.Biomes;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._CP14.StationDungeonMap;
+
+///
+/// Initializes a procedurally generated world with points of interest
+///
+[RegisterComponent, Access(typeof(CP14StationDungeonMapSystem))]
+public sealed partial class CP14StationDungeonMapComponent : Component
+{
+ [DataField(required: true)]
+ public ProtoId Biome = "Caves";
+
+ // If null, its random
+ [DataField]
+ public int? Seed = null;
+
+ [DataField]
+ public Color MapLightColor = Color.Black;
+
+ [DataField]
+ public string MapName = "Dungeon map";
+
+ [DataField(serverOnly: true)]
+ public ComponentRegistry Components = new();
+}
diff --git a/Content.Server/_CP14/StationDungeonMap/CP14StationDungeonMapSystem.cs b/Content.Server/_CP14/StationDungeonMap/CP14StationDungeonMapSystem.cs
new file mode 100644
index 0000000000..ff76df9e05
--- /dev/null
+++ b/Content.Server/_CP14/StationDungeonMap/CP14StationDungeonMapSystem.cs
@@ -0,0 +1,54 @@
+using Content.Server.Parallax;
+using Content.Server.Station.Components;
+using Content.Server.Station.Events;
+using Content.Server.Station.Systems;
+using Content.Shared.Teleportation.Systems;
+using Robust.Server.GameObjects;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._CP14.StationDungeonMap;
+
+public sealed partial class CP14StationDungeonMapSystem : EntitySystem
+{
+ [Dependency] private readonly BiomeSystem _biome = default!;
+ [Dependency] private readonly IPrototypeManager _proto = default!;
+ [Dependency] private readonly MapSystem _map = default!;
+ [Dependency] private readonly MetaDataSystem _metaData = default!;
+ [Dependency] private readonly LinkedEntitySystem _linkedEntity = default!;
+ [Dependency] private readonly StationSystem _station = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent(OnStationPostInit);
+ }
+
+ private void OnStationPostInit(Entity map, ref StationPostInitEvent args)
+ {
+ if (!TryComp(map, out StationDataComponent? dataComp))
+ return;
+
+ var mapUid = _map.CreateMap(out var mapId);
+ _metaData.SetEntityName(mapUid, map.Comp.MapName);
+
+ _biome.EnsurePlanet(mapUid, _proto.Index(map.Comp.Biome), map.Comp.Seed, mapLight: map.Comp.MapLightColor);
+
+ EntityManager.AddComponents(mapUid, map.Comp.Components);
+
+ TryLinkDungeonAndStationMaps(dataComp, mapUid);
+ }
+
+ private bool TryLinkDungeonAndStationMaps(StationDataComponent dataComp, EntityUid mapUid)
+ {
+ var station = _station.GetLargestGrid(dataComp);
+ if (station == null)
+ return false;
+
+ var stationMapId = Transform(station.Value).MapID;
+ _map.TryGetMap(stationMapId, out var stationMapUid);
+ if (stationMapUid == null)
+ return false;
+
+ return _linkedEntity.TryLink(mapUid, stationMapUid.Value);
+ }
+}
diff --git a/Resources/Audio/_CP14/Ambience/ambicreepy1.ogg b/Resources/Audio/_CP14/Ambience/ambicreepy1.ogg
new file mode 100644
index 0000000000..5048410249
Binary files /dev/null and b/Resources/Audio/_CP14/Ambience/ambicreepy1.ogg differ
diff --git a/Resources/Audio/_CP14/Ambience/ambicreepy2.ogg b/Resources/Audio/_CP14/Ambience/ambicreepy2.ogg
new file mode 100644
index 0000000000..ed8e147c85
Binary files /dev/null and b/Resources/Audio/_CP14/Ambience/ambicreepy2.ogg differ
diff --git a/Resources/Audio/_CP14/Ambience/ambicreepy3.ogg b/Resources/Audio/_CP14/Ambience/ambicreepy3.ogg
new file mode 100644
index 0000000000..9f2033e1c5
Binary files /dev/null and b/Resources/Audio/_CP14/Ambience/ambicreepy3.ogg differ
diff --git a/Resources/Audio/_CP14/Ambience/attributions.yml b/Resources/Audio/_CP14/Ambience/attributions.yml
index 8482f1f881..ad4a7a3dba 100644
--- a/Resources/Audio/_CP14/Ambience/attributions.yml
+++ b/Resources/Audio/_CP14/Ambience/attributions.yml
@@ -1,4 +1,24 @@
-- files: ["ambicave.ogg"]
+- files: ["ambicave1.ogg"]
license: "CC-BY-4.0"
copyright: 'by Rosanajurado of Freesound.org. Cropped and mixed from stereo to mono.'
- source: "https://freesound.org/people/Rosanajurado/sounds/667117/"
\ No newline at end of file
+ source: "https://freesound.org/people/Rosanajurado/sounds/667117/"
+
+- files: ["ambicreepy1.ogg"]
+ license: "CC-BY-SA-3.0"
+ copyright: 'by alextundra of Freesound.org. Mixed from stereo to mono.'
+ source: "https://freesound.org/people/alextundra/sounds/60893/"
+
+- files: ["ambicreepy2.ogg"]
+ license: "CC-BY-SA-3.0"
+ copyright: 'by alextundra of Freesound.org. Mixed from stereo to mono.'
+ source: "https://freesound.org/people/alextundra/sounds/60892/"
+
+- files: ["ambicreepy4.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by 7by7 of Freesound.org. Mixed from stereo to mono.'
+ source: "https://freesound.org/people/7by7/sounds/72849/"
+
+- files: ["weatherWindy.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/134699/"
\ No newline at end of file
diff --git a/Resources/Audio/_CP14/Ambience/weatherWindy.ogg b/Resources/Audio/_CP14/Ambience/weatherWindy.ogg
new file mode 100644
index 0000000000..9b1cb2e514
Binary files /dev/null and b/Resources/Audio/_CP14/Ambience/weatherWindy.ogg differ
diff --git a/Resources/Audio/_CP14/Animals/attributions.yml b/Resources/Audio/_CP14/Animals/attributions.yml
new file mode 100644
index 0000000000..2cb5224dce
--- /dev/null
+++ b/Resources/Audio/_CP14/Animals/attributions.yml
@@ -0,0 +1,44 @@
+- files: ["owl1.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Cropped and mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/64544/"
+
+- files: ["owl2.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Cropped and mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/64544/"
+
+- files: ["owl3.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Cropped and mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/64544/"
+
+- files: ["owl4.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Cropped and mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/64544/"
+
+- files: ["owl5.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Cropped and mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/64544/"
+
+- files: ["owl6.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Cropped and mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/64544/"
+
+- files: ["owl7.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Cropped and mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/64544/"
+
+- files: ["owl8.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Cropped and mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/64544/"
+
+- files: ["owl9.ogg"]
+ license: "CC-BY-4.0"
+ copyright: 'by Benboncan of Freesound.org. Cropped and mixed from stereo to mono.'
+ source: "https://freesound.org/people/Benboncan/sounds/64544/"
\ No newline at end of file
diff --git a/Resources/Audio/_CP14/Animals/owl1.ogg b/Resources/Audio/_CP14/Animals/owl1.ogg
new file mode 100644
index 0000000000..f558acd55b
Binary files /dev/null and b/Resources/Audio/_CP14/Animals/owl1.ogg differ
diff --git a/Resources/Audio/_CP14/Animals/owl2.ogg b/Resources/Audio/_CP14/Animals/owl2.ogg
new file mode 100644
index 0000000000..88fe453cb1
Binary files /dev/null and b/Resources/Audio/_CP14/Animals/owl2.ogg differ
diff --git a/Resources/Audio/_CP14/Animals/owl3.ogg b/Resources/Audio/_CP14/Animals/owl3.ogg
new file mode 100644
index 0000000000..0d0b14f1c2
Binary files /dev/null and b/Resources/Audio/_CP14/Animals/owl3.ogg differ
diff --git a/Resources/Audio/_CP14/Animals/owl4.ogg b/Resources/Audio/_CP14/Animals/owl4.ogg
new file mode 100644
index 0000000000..61e905a33c
Binary files /dev/null and b/Resources/Audio/_CP14/Animals/owl4.ogg differ
diff --git a/Resources/Audio/_CP14/Animals/owl5.ogg b/Resources/Audio/_CP14/Animals/owl5.ogg
new file mode 100644
index 0000000000..f65a13de9b
Binary files /dev/null and b/Resources/Audio/_CP14/Animals/owl5.ogg differ
diff --git a/Resources/Audio/_CP14/Animals/owl6.ogg b/Resources/Audio/_CP14/Animals/owl6.ogg
new file mode 100644
index 0000000000..601c7550c6
Binary files /dev/null and b/Resources/Audio/_CP14/Animals/owl6.ogg differ
diff --git a/Resources/Audio/_CP14/Animals/owl7.ogg b/Resources/Audio/_CP14/Animals/owl7.ogg
new file mode 100644
index 0000000000..bec41b9198
Binary files /dev/null and b/Resources/Audio/_CP14/Animals/owl7.ogg differ
diff --git a/Resources/Audio/_CP14/Animals/owl8.ogg b/Resources/Audio/_CP14/Animals/owl8.ogg
new file mode 100644
index 0000000000..367161a83e
Binary files /dev/null and b/Resources/Audio/_CP14/Animals/owl8.ogg differ
diff --git a/Resources/Audio/_CP14/Animals/owl9.ogg b/Resources/Audio/_CP14/Animals/owl9.ogg
new file mode 100644
index 0000000000..89eb1d702f
Binary files /dev/null and b/Resources/Audio/_CP14/Animals/owl9.ogg differ
diff --git a/Resources/Prototypes/Maps/debug.yml b/Resources/Prototypes/Maps/debug.yml
index 94907d6e36..d2bb42125f 100644
--- a/Resources/Prototypes/Maps/debug.yml
+++ b/Resources/Prototypes/Maps/debug.yml
@@ -27,7 +27,8 @@
- type: StationRandomTransform
enableStationRotation: false
maxStationOffset: null
- - type: CP14StationBiome
+ - type: StationBiome
+ biome: Snow
- type: StationNameSetup
mapNameTemplate: "Dev"
- type: StationJobs
@@ -35,6 +36,8 @@
- Adventurer #CrystallPunk Dev replacement
availableJobs:
Adventurer: [ -1, -1 ] #CrystallPunk Dev replacement
+ - type: CP14StationDungeonMap
+ biome: CP14CavesGeneric
#- type: gameMap
# id: TestTeg
diff --git a/Resources/Prototypes/_CP14/Entities/Structures/dungeon_entrance.yml b/Resources/Prototypes/_CP14/Entities/Structures/dungeon_entrance.yml
new file mode 100644
index 0000000000..fdceac744c
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Entities/Structures/dungeon_entrance.yml
@@ -0,0 +1,68 @@
+- type: entity
+ id: CP14DungeonEntrance
+ name: dungeon entrance
+ noSpawn: true
+ description: The dark depths of the underworld are calling you.
+ placement:
+ mode: SnapgridCenter
+ components:
+ - type: Transform
+ anchored: True
+ - type: InteractionOutline
+ - type: Clickable
+ - type: Physics
+ bodyType: Static
+ - type: Sprite
+ sprite: /Textures/_CP14/Structures/Dungeon/holes.rsi
+ drawdepth: FloorTiles
+ layers:
+ - state: hole_big
+ - state: ladder_big_top_part
+ - type: Fixtures
+ fixtures:
+ portalFixture:
+ shape:
+ !type:PhysShapeAabb
+ bounds: "-0.25,-0.48,0.25,0.48"
+ mask:
+ - FullTileMask
+ layer:
+ - WallLayer
+ hard: false
+ - type: Portal
+ canTeleportToOtherMaps: true
+ randomTeleport: false
+
+- type: entity
+ parent: PortalBlue
+ id: CP14DungeonEntranceAutolink
+ suffix: Autolink Dungeon
+ components:
+ - type: CP14AutoDungeonPortal
+ otherSidePortal: CP14DungeonExit
+
+- type: entity
+ parent: CP14DungeonEntrance
+ id: CP14DungeonExit
+ noSpawn: true
+ name: dungeon exit
+ description: A way out of the dark underworld into the overworld.
+ components:
+ - type: Sprite
+ sprite: /Textures/_CP14/Structures/Dungeon/holes.rsi
+ drawdepth: Mobs
+ layers:
+ - state: ladder_bottom_part
+ - type: PointLight
+ color: White
+ radius: 3
+ energy: 1
+ netsync: false
+
+- type: entity
+ parent: CP14DungeonExit
+ id: CP14DungeonExitAutolink
+ suffix: Autolink Dungeon
+ components:
+ - type: CP14AutoDungeonPortal
+ otherSidePortal: CP14DungeonEntrance
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Procedural/biome_template.yml b/Resources/Prototypes/_CP14/Procedural/biome_template.yml
new file mode 100644
index 0000000000..a91010445d
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Procedural/biome_template.yml
@@ -0,0 +1,110 @@
+- type: biomeTemplate
+ id: CP14SolidStone
+ layers:
+ - !type:BiomeTileLayer
+ threshold: -1.0
+ tile: CP14FloorBase
+ - !type:BiomeEntityLayer
+ threshold: -1.0
+ allowedTiles:
+ - CP14FloorBase
+ entities:
+ - CP14CaveStoneWall
+
+- type: biomeTemplate
+ id: CP14CavesGeneric
+ layers:
+ - !type:BiomeTileLayer
+ threshold: -1.0
+ tile: CP14FloorBase
+ #Entity
+ - !type:BiomeEntityLayer
+ threshold: 0.4
+ noise:
+ seed: 1
+ noiseType: OpenSimplex2
+ fractalType: FBm
+ frequency: 2
+ allowedTiles:
+ - CP14FloorBase
+ entities:
+ - FloraGreyStalagmite1
+ - FloraGreyStalagmite2
+ - FloraGreyStalagmite3
+ - FloraGreyStalagmite4
+ - FloraGreyStalagmite5
+ - FloraRockSolid01
+ - FloraRockSolid02
+ - FloraRockSolid03
+ - FloraGreyStalagmite1
+ - FloraGreyStalagmite2
+ - FloraGreyStalagmite3
+ - FloraGreyStalagmite4
+ - FloraGreyStalagmite5
+ - FloraRockSolid01
+ - FloraRockSolid02
+ - FloraRockSolid03
+ - FloraGreyStalagmite1
+ - FloraGreyStalagmite2
+ - FloraGreyStalagmite3
+ - FloraGreyStalagmite4
+ - FloraGreyStalagmite5
+ - FloraRockSolid01
+ - FloraRockSolid02
+ - FloraRockSolid03
+ - CP14CrystalRubiesSmall
+ - CP14CrystalRubiesMedium
+ - CP14CrystalRubiesBig
+ - CP14CrystalTopazesSmall
+ - CP14CrystalTopazesMedium
+ - CP14CrystalTopazesBig
+ - CP14CrystalEmeraldsSmall
+ - CP14CrystalEmeraldsMedium
+ - CP14CrystalEmeraldsBig
+ - CP14CrystalSapphiresSmall
+ - CP14CrystalSapphiresMedium
+ - CP14CrystalSapphiresBig
+ - CP14CrystalAmethystsSmall
+ - CP14CrystalAmethystsMedium
+ - CP14CrystalAmethystsBig
+ - CP14CrystalDiamondsSmall
+ - CP14CrystalDiamondsMedium
+ - CP14CrystalDiamondsBig
+ #Walls
+ - !type:BiomeEntityLayer
+ threshold: -0.75
+ invert: true
+ noise:
+ seed: 0
+ noiseType: Perlin
+ fractalType: Ridged
+ octaves: 1
+ frequency: 0.05
+ gain: 0.5
+ allowedTiles:
+ - CP14FloorBase
+ entities:
+ - CP14CaveStoneWall
+ #Ores
+ - !type:BiomeEntityLayer
+ threshold: 0.6
+ noise:
+ seed: 0
+ noiseType: OpenSimplex2
+ fractalType: FBm
+ frequency: 3
+ allowedTiles:
+ - CP14FloorBase
+ entities:
+ - CP14CaveStoneWallSilverOre
+ - !type:BiomeEntityLayer
+ threshold: 0.6
+ noise:
+ seed: 10
+ noiseType: OpenSimplex2
+ fractalType: FBm
+ frequency: 3
+ allowedTiles:
+ - CP14FloorBase
+ entities:
+ - CP14CaveStoneWallGoldOre
\ No newline at end of file
diff --git a/Resources/Prototypes/_CP14/Procedural/dungeon_loot.yml b/Resources/Prototypes/_CP14/Procedural/dungeon_loot.yml
new file mode 100644
index 0000000000..f721fe349c
--- /dev/null
+++ b/Resources/Prototypes/_CP14/Procedural/dungeon_loot.yml
@@ -0,0 +1,9 @@
+- type: salvageLoot
+ id: CP14DungeonLoot
+ loots:
+ - !type:RandomSpawnsLoot
+ entries:
+ - proto: CP14BaseThrowableSpear
+ prob: 0.5
+ - proto: CP14BaseDagger
+ prob: 0.5
\ No newline at end of file
diff --git a/Resources/Prototypes/audio.yml b/Resources/Prototypes/audio.yml
index a5a2dc9399..f941c2ae69 100644
--- a/Resources/Prototypes/audio.yml
+++ b/Resources/Prototypes/audio.yml
@@ -24,6 +24,9 @@
- /Audio/Ambience/ambiruin4.ogg
- /Audio/Ambience/maintambience.ogg
- /Audio/_CP14/Ambience/ambicave1.ogg
+ - /Audio/_CP14/Ambience/ambicreepy1.ogg
+ - /Audio/_CP14/Ambience/ambicreepy2.ogg
+ - /Audio/_CP14/Ambience/ambicreepy3.ogg
# Rules
- type: rules
diff --git a/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/hole_big.png b/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/hole_big.png
new file mode 100644
index 0000000000..d93b443e80
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/hole_big.png differ
diff --git a/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/ladder_big_top_part.png b/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/ladder_big_top_part.png
new file mode 100644
index 0000000000..7bf0e0232e
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/ladder_big_top_part.png differ
diff --git a/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/ladder_bottom_part.png b/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/ladder_bottom_part.png
new file mode 100644
index 0000000000..c9ceb5deaa
Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/ladder_bottom_part.png differ
diff --git a/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/meta.json b/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/meta.json
new file mode 100644
index 0000000000..8575d223a5
--- /dev/null
+++ b/Resources/Textures/_CP14/Structures/Dungeon/holes.rsi/meta.json
@@ -0,0 +1,22 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "by TheShuEd (discord)",
+ "size": {
+ "x": 64,
+ "y": 64
+ },
+ "states": [
+ {
+ "name": "hole_big",
+ "directions": 4
+ },
+ {
+ "name": "ladder_big_top_part",
+ "directions": 4
+ },
+ {
+ "name": "ladder_bottom_part"
+ }
+ ]
+}