diff --git a/Content.Client/Imperial/Medieval/MagicDungeon/DungeonPortalSystem.cs b/Content.Client/Imperial/Medieval/MagicDungeon/DungeonPortalSystem.cs new file mode 100644 index 00000000000..73494d6a786 --- /dev/null +++ b/Content.Client/Imperial/Medieval/MagicDungeon/DungeonPortalSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.Imperial.Medieval.MagicDungeon; + +namespace Content.Server.Imperial.Medieval.MagicDungeon; + +public sealed class DungeonPortalSystem : SharedDungeonPortalSystem +{ +} diff --git a/Content.Server/Imperial/Medieval/MagicDungeon/DungeonPortalSystem.cs b/Content.Server/Imperial/Medieval/MagicDungeon/DungeonPortalSystem.cs new file mode 100644 index 00000000000..f5bd18d3a53 --- /dev/null +++ b/Content.Server/Imperial/Medieval/MagicDungeon/DungeonPortalSystem.cs @@ -0,0 +1,18 @@ +using Content.Server.Imperial.Medieval.Procedural; +using Content.Shared.Imperial.Medieval.MagicDungeon; + +namespace Content.Server.Imperial.Medieval.MagicDungeon; + +public sealed class DungeonPortalSystem : SharedDungeonPortalSystem +{ + [Dependency] private readonly DungeonGenerationSystem _generationSystem = default!; + + protected override void SpawnPortal(Entity portalFrame) + { + base.SpawnPortal(portalFrame); + + var generationSize = portalFrame.Comp.BaseSize; + _generationSystem.GenerateDungeon(generationSize.X, generationSize.Y, out portalFrame.Comp.DungeonMap, out portalFrame.Comp.CoordForSpawnList); + Dirty(portalFrame); + } +} diff --git a/Content.Server/Imperial/Medieval/Procedural/DungeonGenerationSystem.MazeLogic.cs b/Content.Server/Imperial/Medieval/Procedural/DungeonGenerationSystem.MazeLogic.cs new file mode 100644 index 00000000000..9e4297a56e0 --- /dev/null +++ b/Content.Server/Imperial/Medieval/Procedural/DungeonGenerationSystem.MazeLogic.cs @@ -0,0 +1,201 @@ +using System.Linq; + +namespace Content.Server.Imperial.Medieval.Procedural; + +public sealed partial class DungeonGenerationSystem +{ + // Структура данных + public struct DungeonLayout + { + public bool[,] HorizontalDoors; + public bool[,] VerticalDoors; + public List StartRooms; + public List<(Vector2i Room, Vector2i DoorIdx, bool IsHor)> SpecialPairs; + } + + private DungeonLayout GenerateLogicalLayout(int width, int height, Random random) + { + var layout = new DungeonLayout + { + HorizontalDoors = new bool[width - 1, height], + VerticalDoors = new bool[width, height - 1], + StartRooms = new List(), + SpecialPairs = new List<(Vector2i Room, Vector2i DoorIdx, bool IsHor)>() + }; + + GenerateMaze(width, height, random, ref layout); + AddLoops(width, height, random, ref layout); + ChooseStartRooms(width, height, random, ref layout); + FindSpecialPairs(width, height, random, ref layout); + + return layout; + } + + private void GenerateMaze(int width, int height, Random random, ref DungeonLayout layout) + { + var visited = new bool[width, height]; + var stack = new Stack(); + stack.Push(new Vector2i(0, 0)); + visited[0, 0] = true; + + var directions = new Vector2i[] { new(0, 1), new(0, -1), new(1, 0), new(-1, 0) }; + + while (stack.Count > 0) + { + var current = stack.Peek(); + var unvisited = new List(); + foreach (var dir in directions) + { + var n = current + dir; + if (n.X >= 0 && n.X < width && n.Y >= 0 && n.Y < height && !visited[n.X, n.Y]) + unvisited.Add(n); + } + + if (unvisited.Count > 0) + { + var next = unvisited[random.Next(unvisited.Count)]; + if (next.X > current.X) layout.HorizontalDoors[current.X, current.Y] = true; + else if (next.X < current.X) layout.HorizontalDoors[next.X, current.Y] = true; + else if (next.Y > current.Y) layout.VerticalDoors[current.X, current.Y] = true; + else if (next.Y < current.Y) layout.VerticalDoors[current.X, next.Y] = true; + + visited[next.X, next.Y] = true; + stack.Push(next); + } + else stack.Pop(); + } + } + + private void AddLoops(int width, int height, Random random, ref DungeonLayout layout) + { + var potentialWalls = new List<(Vector2i CellA, Vector2i CellB, bool IsHorizontal)>(); + + for (var x = 0; x < width - 1; x++) + for (var y = 0; y < height; y++) + if (!layout.HorizontalDoors[x, y]) + potentialWalls.Add((new Vector2i(x, y), new Vector2i(x + 1, y), true)); + + for (var x = 0; x < width; x++) + for (var y = 0; y < height - 1; y++) + if (!layout.VerticalDoors[x, y]) + potentialWalls.Add((new Vector2i(x, y), new Vector2i(x, y + 1), false)); + + var walls = potentialWalls.OrderBy(_ => random.Next()).ToList(); + + foreach (var (a, b, isHor) in walls) + { + if (CountDoors(a, width, height, layout) >= 3 || CountDoors(b, width, height, layout) >= 3) + continue; + + if (random.NextDouble() < 0.20) + { + if (isHor) layout.HorizontalDoors[Math.Min(a.X, b.X), a.Y] = true; + else layout.VerticalDoors[a.X, Math.Min(a.Y, b.Y)] = true; + } + } + } + + private int CountDoors(Vector2i cell, int w, int h, DungeonLayout layout) + { + int count = 0; + if (cell.X > 0 && layout.HorizontalDoors[cell.X - 1, cell.Y]) count++; + if (cell.X < w - 1 && layout.HorizontalDoors[cell.X, cell.Y]) count++; + if (cell.Y > 0 && layout.VerticalDoors[cell.X, cell.Y - 1]) count++; + if (cell.Y < h - 1 && layout.VerticalDoors[cell.X, cell.Y]) count++; + return count; + } + + private void ChooseStartRooms(int width, int height, Random random, ref DungeonLayout layout) + { + var allRooms = new List(); + for (var x = 0; x < width; x++) + for (var y = 0; y < height; y++) + allRooms.Add(new Vector2i(x, y)); + + for (int i = 0; i < 4 && allRooms.Count > 0; i++) + { + var idx = random.Next(allRooms.Count); + layout.StartRooms.Add(allRooms[idx]); + allRooms.RemoveAt(idx); + } + } + + private void FindSpecialPairs(int width, int height, Random random, ref DungeonLayout layout) + { + var targetCount = width * height / 5; + if (targetCount < 1) targetCount = 1; + + var candidateDoors = new List<(Vector2i Idx, bool IsHor)>(); + for (var x = 0; x < width - 1; x++) + for (var y = 0; y < height; y++) + if (layout.HorizontalDoors[x, y]) candidateDoors.Add((new Vector2i(x, y), true)); + + for (var x = 0; x < width; x++) + for (var y = 0; y < height - 1; y++) + if (layout.VerticalDoors[x, y]) candidateDoors.Add((new Vector2i(x, y), false)); + + candidateDoors = candidateDoors.OrderBy(_ => random.Next()).ToList(); + var lockedDoorsSet = new HashSet<(Vector2i, bool)>(); + + foreach (var (doorIdx, isHor) in candidateDoors) + { + if (layout.SpecialPairs.Count >= targetCount) break; + + lockedDoorsSet.Add((doorIdx, isHor)); + var reachableRooms = GetReachableRooms(layout.StartRooms, lockedDoorsSet, width, height, layout); + + if (reachableRooms.Count > 0) + { + var triggerRoom = reachableRooms[random.Next(reachableRooms.Count)]; + layout.SpecialPairs.Add((triggerRoom, doorIdx, isHor)); + } + else + { + lockedDoorsSet.Remove((doorIdx, isHor)); + } + } + } + + private List GetReachableRooms(List starts, HashSet<(Vector2i, bool)> lockedDoors, int w, int h, DungeonLayout layout) + { + var visited = new HashSet(); + var queue = new Queue(); + var result = new List(); + + foreach (var start in starts) + { + if (visited.Add(start)) + { + queue.Enqueue(start); + result.Add(start); + } + } + + while (queue.Count > 0) + { + var curr = queue.Dequeue(); + + if (curr.Y < h - 1 && layout.VerticalDoors[curr.X, curr.Y] && !lockedDoors.Contains((new Vector2i(curr.X, curr.Y), false))) + { + var next = new Vector2i(curr.X, curr.Y + 1); + if (visited.Add(next)) { queue.Enqueue(next); result.Add(next); } + } + if (curr.Y > 0 && layout.VerticalDoors[curr.X, curr.Y - 1] && !lockedDoors.Contains((new Vector2i(curr.X, curr.Y - 1), false))) + { + var next = new Vector2i(curr.X, curr.Y - 1); + if (visited.Add(next)) { queue.Enqueue(next); result.Add(next); } + } + if (curr.X < w - 1 && layout.HorizontalDoors[curr.X, curr.Y] && !lockedDoors.Contains((new Vector2i(curr.X, curr.Y), true))) + { + var next = new Vector2i(curr.X + 1, curr.Y); + if (visited.Add(next)) { queue.Enqueue(next); result.Add(next); } + } + if (curr.X > 0 && layout.HorizontalDoors[curr.X - 1, curr.Y] && !lockedDoors.Contains((new Vector2i(curr.X - 1, curr.Y), true))) + { + var next = new Vector2i(curr.X - 1, curr.Y); + if (visited.Add(next)) { queue.Enqueue(next); result.Add(next); } + } + } + return result; + } +} diff --git a/Content.Server/Imperial/Medieval/Procedural/DungeonGenerationSystem.cs b/Content.Server/Imperial/Medieval/Procedural/DungeonGenerationSystem.cs new file mode 100644 index 00000000000..53400de9968 --- /dev/null +++ b/Content.Server/Imperial/Medieval/Procedural/DungeonGenerationSystem.cs @@ -0,0 +1,310 @@ +using System.Linq; +using System.Diagnostics.CodeAnalysis; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Console; +using Content.Shared.Maps; +using Content.Shared.Parallax.Biomes; +using Content.Server.Parallax; +using Robust.Server.GameObjects; +using Robust.Shared.Random; +using Content.Server.Storage.EntitySystems; +using Content.Shared.Tag; +using Content.Shared.Storage.Components; + +namespace Content.Server.Imperial.Medieval.Procedural; + +public sealed partial class DungeonGenerationSystem : EntitySystem +{ + [Dependency] private readonly MapSystem _mapSys = default!; + [Dependency] private readonly BiomeSystem _biome = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly ITileDefinitionManager _tileDefMan = default!; + [Dependency] private readonly TileSystem _tileSys = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly EntityStorageSystem _entityStorage = default!; + [Dependency] private readonly TagSystem _tag = default!; + + // --- Прототипы --- + private readonly ProtoId _biomeProtoId = "Empty"; + private readonly ProtoId _floorProtoId = "MedievalFloorStone9"; + private readonly EntProtoId _defaultDoorProtoId = "MedievalAirlock"; + private readonly EntProtoId _centerEntityProtoId = "MedievalDungeonRoomMarker"; + + // Тег для поиска сундуков + private readonly ProtoId _chestTag = "MedievalChest"; + + private readonly EntProtoId[] _wallProtoIds = + [ + "MedievalStoneBrickWallIndestructable", + "WallReinforced", //here I need to replace with other 2 walls, which are not sprited now + "WallReinforcedRust" + ]; + + private readonly Vector2i _size = new Vector2i(15, 15); + + public void GenerateDungeon(int width, int height, out MapId mapId, out List toSpawn) + { + toSpawn = new(); + var random = new Random(); + var layout = GenerateLogicalLayout(width, height, random); + var totalPixelWidth = width * (_size.X - 1) + 1; + var totalPixelHeight = height * (_size.Y - 1) + 1; + var dungeonBox = new Box2i(-totalPixelWidth / 2, -totalPixelHeight / 2, -totalPixelWidth / 2 + totalPixelWidth, -totalPixelHeight / 2 + totalPixelHeight); + + if (!PrepareDungeonBase(dungeonBox, random, out var dungeonGrid, out mapId)) + return; + + var gridUid = dungeonGrid.Value.Owner; + var gridComp = dungeonGrid.Value.Comp; + + BuildInternalStructure(gridUid, gridComp, layout, dungeonBox.BottomLeft, width, height); + + SpawnRoomDecoration(gridUid, gridComp, dungeonBox.BottomLeft, width, height); + + SpawnKeysInExistingChests(gridUid, gridComp, dungeonBox.BottomLeft, layout.SpecialPairs); + + GetPlayerSpawns(gridUid, gridComp, dungeonBox.BottomLeft, layout.StartRooms, out toSpawn); + } + + private bool PrepareDungeonBase(Box2i box, Random random, [NotNullWhen(true)] out Entity? dungeonGrid, out MapId mapId) + { + dungeonGrid = null; + var mapEntity = _mapSys.CreateMap(out mapId); + + if (_proto.TryIndex(_biomeProtoId, out var biomeProto)) + _biome.EnsurePlanet(mapEntity, biomeProto); + + if (!TryComp(mapEntity, out var gridComp)) + { + mapId = MapId.Nullspace; + return false; + } + + dungeonGrid = (mapEntity, gridComp); + var tileDef = (ContentTileDefinition)_tileDefMan[_floorProtoId]; + var tilesToSet = new List<(Vector2i, Tile)>(); + + for (var x = box.Left; x < box.Right; x++) + { + for (var y = box.Bottom; y < box.Top; y++) + { + var tile = _tileSys.GetVariantTile(tileDef, random); + tilesToSet.Add((new Vector2i(x, y), tile)); + } + } + _mapSys.SetTiles(mapEntity, gridComp, tilesToSet); + + var minX = box.Left; var minY = box.Bottom; + var maxX = box.Right - 1; var maxY = box.Top - 1; + + for (var x = minX; x <= maxX; x++) { SpawnWall(mapEntity, gridComp, new Vector2i(x, minY)); SpawnWall(mapEntity, gridComp, new Vector2i(x, maxY)); } + for (var y = minY; y <= maxY; y++) { SpawnWall(mapEntity, gridComp, new Vector2i(minX, y)); SpawnWall(mapEntity, gridComp, new Vector2i(maxX, y)); } + + return true; + } + + private void BuildInternalStructure(EntityUid gridUid, MapGridComponent grid, DungeonLayout layout, Vector2i startPos, int width, int height) + { + var stepX = _size.X - 1; + var stepY = _size.Y - 1; + + var specialDoorLookup = new Dictionary<(Vector2i, bool), int>(); + for (int i = 0; i < layout.SpecialPairs.Count; i++) + { + var pair = layout.SpecialPairs[i]; + specialDoorLookup[(pair.DoorIdx, pair.IsHor)] = i; + } + + for (var i = 1; i < width; i++) + { + var wallX = startPos.X + (i * stepX); + for (var y = 0; y < height; y++) + { + var roomStartY = startPos.Y + (y * stepY); + var doorPos = roomStartY + (stepY / 2); + bool isConnected = layout.HorizontalDoors[i - 1, y]; + int? specialIndex = null; + if (specialDoorLookup.TryGetValue((new Vector2i(i - 1, y), true), out var idx)) specialIndex = idx; + + for (var wy = roomStartY; wy <= roomStartY + stepY; wy++) + { + var pos = new Vector2i(wallX, wy); + if (isConnected && wy == doorPos) + { + var proto = _defaultDoorProtoId; + if (specialIndex.HasValue) proto = $"MedievalAirlockDungeon{GetLetter(specialIndex.Value)}"; + Spawn(proto, _mapSys.ToCoordinates(gridUid, pos, grid)); + } + else SpawnWall(gridUid, grid, pos); + } + } + } + + for (var j = 1; j < height; j++) + { + var wallY = startPos.Y + (j * stepY); + for (var x = 0; x < width; x++) + { + var roomStartX = startPos.X + (x * stepX); + var doorPos = roomStartX + (stepX / 2); + bool isConnected = layout.VerticalDoors[x, j - 1]; + int? specialIndex = null; + if (specialDoorLookup.TryGetValue((new Vector2i(x, j - 1), false), out var idx)) specialIndex = idx; + + for (var wx = roomStartX; wx <= roomStartX + stepX; wx++) + { + var pos = new Vector2i(wx, wallY); + if (isConnected && wx == doorPos) + { + var proto = _defaultDoorProtoId; + if (specialIndex.HasValue) proto = $"MedievalAirlockDungeon{GetLetter(specialIndex.Value)}"; + Spawn(proto, _mapSys.ToCoordinates(gridUid, pos, grid)); + } + else SpawnWall(gridUid, grid, pos); + } + } + } + } + + private void SpawnRoomDecoration(EntityUid gridUid, MapGridComponent grid, Vector2i startPos, int width, int height) + { + var stepX = _size.X - 1; + var stepY = _size.Y - 1; + var halfX = _size.X / 2; + var halfY = _size.Y / 2; + + for (var x = 0; x < width; x++) + { + for (var y = 0; y < height; y++) + { + var roomCenterX = startPos.X + (x * stepX) + halfX; + var roomCenterY = startPos.Y + (y * stepY) + halfY; + + Spawn(_centerEntityProtoId, _mapSys.ToCoordinates(gridUid, new Vector2i(roomCenterX, roomCenterY), grid)); + } + } + } + + private void SpawnKeysInExistingChests(EntityUid gridUid, MapGridComponent grid, Vector2i startPos, List<(Vector2i Room, Vector2i DoorIdx, bool IsHor)> specialPairs) + { + var stepX = _size.X - 1; + var stepY = _size.Y - 1; + var halfX = _size.X / 2; + var halfY = _size.Y / 2; + + for (int i = 0; i < specialPairs.Count; i++) + { + var pair = specialPairs[i]; + var letter = GetLetter(i); + var keyProto = $"MedievalKeyDungeon{letter}"; + + var roomIdx = pair.Room; + var roomStartX = startPos.X + roomIdx.X * stepX + 1; + var roomStartY = startPos.Y + roomIdx.Y * stepY + 1; + var roomEndX = roomStartX + stepX - 2; + var roomEndY = roomStartY + stepY - 2; + + EntityUid? targetChest = null; + var validTiles = new List(); + + // Сканируем комнату + for (var x = roomStartX; x <= roomEndX; x++) + { + for (var y = roomStartY; y <= roomEndY; y++) + { + var posCoords = new Vector2i(startPos.X + roomIdx.X * stepX + x, startPos.Y + roomIdx.Y * stepY + y); + var pos = _mapSys.ToCoordinates(gridUid, posCoords, grid); + var entities = _mapSys.GetAnchoredEntities(gridUid, grid, pos); + if (!entities.Any()) + { + validTiles.Add(posCoords); + continue; + } + + foreach (var ent in entities) + { + if (HasComp(ent) && _tag.HasTag(ent, _chestTag)) + { + targetChest = ent; + break; + } + } + if (targetChest != null) break; + } + if (targetChest != null) break; + } + + if (targetChest != null && TryComp(targetChest, out var storage)) + { + // Вариант 1: Сундук найден, кладем ключ внутрь + var keyUid = Spawn(keyProto, Transform(targetChest.Value).Coordinates); + _entityStorage.Insert(keyUid, targetChest.Value, storage); + } + else + { + // Вариант 2: Сундука нет, спавним на случайном тайле + var spawnPos = new Vector2i(startPos.X + roomIdx.X * stepX + halfX, startPos.Y + roomIdx.Y * stepY + halfY); // По дефолту центр + + if (validTiles.Count > 0) + { + spawnPos = _random.Pick(validTiles); + } + + Spawn(keyProto, _mapSys.ToCoordinates(gridUid, spawnPos, grid)); + } + } + } + + private void GetPlayerSpawns(EntityUid gridUid, MapGridComponent grid, Vector2i startPos, List roomCoords, out List toSpawn) + { + toSpawn = new(); + + var stepX = _size.X - 1; + var stepY = _size.Y - 1; + var halfX = _size.X / 2; + var halfY = _size.Y / 2; + + foreach (var roomIdx in roomCoords) + { + var roomStartX = startPos.X + roomIdx.X * stepX + 1; + var roomStartY = startPos.Y + roomIdx.Y * stepY + 1; + var roomEndX = roomStartX + stepX - 2; + var roomEndY = roomStartY + stepY - 2; + + var validTiles = new List(); + + for (var x = roomStartX; x <= roomEndX; x++) + { + for (var y = roomStartY; y <= roomEndY; y++) + { + var posCoords = new Vector2i(startPos.X + roomIdx.X * stepX + x, startPos.Y + roomIdx.Y * stepY + y); + var pos = _mapSys.ToCoordinates(gridUid, posCoords, grid); + var entities = _mapSys.GetAnchoredEntities(gridUid, grid, pos); + if (!entities.Any()) + { + validTiles.Add(posCoords); + } + } + } + var spawnPos = new Vector2i(startPos.X + roomIdx.X * stepX + halfX, startPos.Y + roomIdx.Y * stepY + halfY); + if (validTiles.Count > 0) + { + spawnPos = _random.Pick(validTiles); + } + + var spawnCoords = _mapSys.ToCoordinates(gridUid, spawnPos, grid); + toSpawn.Add(spawnCoords); + } + } + + private void SpawnWall(EntityUid gridUid, MapGridComponent grid, Vector2i pos) + { + if (_mapSys.GetAnchoredEntities(gridUid, grid, pos).Any()) return; + var wallProto = _random.Pick(_wallProtoIds); + Spawn(wallProto, _mapSys.ToCoordinates(gridUid, pos, grid)); + } + + private char GetLetter(int index) => (char)('A' + (index % 26)); +} diff --git a/Content.Server/Imperial/Medieval/Procedural/dock.md b/Content.Server/Imperial/Medieval/Procedural/dock.md new file mode 100644 index 00000000000..ee6ffb7fa1d --- /dev/null +++ b/Content.Server/Imperial/Medieval/Procedural/dock.md @@ -0,0 +1,14 @@ +## Моё творение - генерация. +Я угрохал сюда неимоверное количество времени, весь январь, как я помню, даже чуть-чуть февраля.
+Система всё еще немного недоделана, сюда осталось добавить спавн выхода, но это не страшно, там логика схожа с добавлением спавнов игроков.
+ +Основная логика работы содержится в `DungeonGenerationSystem.cs` Публичный метод ровно один - `GenerateDungeon`, отвечает за генерацию самого данжа поэтапно. Давайте на его логике и будем рассматривать её. + +Сначала мы генерируем Layout нашего данжа. Здесь код вы можете видеть весь реализован в файле `DungeonGenerationSystem.MazeLogic.cs`. Мы сначала генерируем сам данж со всеми стенами, используя математику в виде векторов и Box2. Потом мы должны в каждую комнату вставить дверь так, чтобы она была досягаяема из любой другой комнаты. Также мы должны еще выбрать комнаты старта для игроков. Потом часть дверей мы делаем запертыми на ключ, причем так, чтобы игроки могли каким-то нереальным образом достичь друг друга, используя эти ключи. В теории может сгенерироваться данж-головоломка, который заставит игроков думать (сложная вещь это ваше думать). + +После всех этих сложных матопераций обхода графов мы строим внешнюю и внутренню оболочку данжа, используя стены, двери и прочее. Далее спавним нужные нам ключи в нужных нам комнатах. А потом еще передаем в основную функцию `GenerateDungeon` список координат спавна игроков. + + В принципе, по описанию, несложно, но жуть как мне надоело делать. + +### TODO +Осталось вам только выбрать комнату (или сразу конкретные координаты) спавна портала выхода, тут логику можете тоже скопипастить, думаю разберетесь и оно несложно будет для вас, я сам забыл это сделать в январе). diff --git a/Content.Shared/Imperial/Medieval/MagicDungeon/DungeonPortalFrameComponent.cs b/Content.Shared/Imperial/Medieval/MagicDungeon/DungeonPortalFrameComponent.cs new file mode 100644 index 00000000000..5c6d3644677 --- /dev/null +++ b/Content.Shared/Imperial/Medieval/MagicDungeon/DungeonPortalFrameComponent.cs @@ -0,0 +1,59 @@ +using Content.Shared.Containers.ItemSlots; +using Robust.Shared.GameStates; +using Robust.Shared.Map; +using Robust.Shared.Serialization; + +namespace Content.Shared.Imperial.Medieval.MagicDungeon; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class DungeonPortalFrameComponent : Component +{ + [ViewVariables] + public bool IsActive; + + [ViewVariables] + public bool IsOpened; + + [ViewVariables] + public HashSet PlayersInside; + + [ViewVariables, AutoNetworkedField] + public MapId DungeonMap; + + [ViewVariables, AutoNetworkedField] + public List CoordForSpawnList = new(); + + [ViewVariables] + public EntityUid? PortalId; + + [DataField] + public Vector2i BaseSize = (6, 6); + + [DataField("shardSlot1")] + public string ShardSlotId1 = "shard1"; + + [ViewVariables(VVAccess.ReadWrite)] + public ItemSlot ShardSlot1 = default!; + + [DataField("shardSlot2")] + public string ShardSlotId2 = "shard2"; + + [ViewVariables(VVAccess.ReadWrite)] + public ItemSlot ShardSlot2 = default!; +} + +[Serializable, NetSerializable] +public enum DungeonPortalVisualLayers : byte +{ + IsOpened, + LeftPart, + RightPart +} + +[Serializable, NetSerializable] +public enum DungeonPortalVisuals : byte +{ + LeftState, + RightState, + OpenState +} diff --git a/Content.Shared/Imperial/Medieval/MagicDungeon/DungeonShardComponent.cs b/Content.Shared/Imperial/Medieval/MagicDungeon/DungeonShardComponent.cs new file mode 100644 index 00000000000..2ee93fd78b8 --- /dev/null +++ b/Content.Shared/Imperial/Medieval/MagicDungeon/DungeonShardComponent.cs @@ -0,0 +1,13 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Imperial.Medieval.MagicDungeon; + +[RegisterComponent, NetworkedComponent] +public sealed partial class DungeonShardComponent : Component +{ + [ViewVariables] + public Vector2i SizeModifier = (0, 0); + + [DataField] + public int ColorInt; +} diff --git a/Content.Shared/Imperial/Medieval/MagicDungeon/SharedDungeonPortalSystem.Escape.cs b/Content.Shared/Imperial/Medieval/MagicDungeon/SharedDungeonPortalSystem.Escape.cs new file mode 100644 index 00000000000..8dd894698ff --- /dev/null +++ b/Content.Shared/Imperial/Medieval/MagicDungeon/SharedDungeonPortalSystem.Escape.cs @@ -0,0 +1,37 @@ +using System.Linq; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; + +namespace Content.Shared.Imperial.Medieval.MagicDungeon; + +public abstract partial class SharedDungeonPortalSystem +{ + private void InitEscape() + { + SubscribeLocalEvent(OnMobStateChanged); + } + + private void OnMobStateChanged(EntityUid uid, MobStateComponent mobStateComponent, MobStateChangedEvent args) + { + if (args.NewMobState != MobState.Dead) + return; + + var map = Transform(uid).MapID; + var query = EntityQueryEnumerator(); + Entity? portalFrame = null; + + while (query.MoveNext(out var portal, out var comp)) + { + if (map == comp.DungeonMap) + { + portalFrame = (portal, comp); + break; + } + } + + if (portalFrame == null || CheckPortalShouldBeDeactivated(portalFrame.Value)) + return; + + DeactivatePortal(portalFrame.Value); + } +} diff --git a/Content.Shared/Imperial/Medieval/MagicDungeon/SharedDungeonPortalSystem.cs b/Content.Shared/Imperial/Medieval/MagicDungeon/SharedDungeonPortalSystem.cs new file mode 100644 index 00000000000..41194f44662 --- /dev/null +++ b/Content.Shared/Imperial/Medieval/MagicDungeon/SharedDungeonPortalSystem.cs @@ -0,0 +1,142 @@ +using System.Linq; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Materials; +using Content.Shared.Mind; +using Content.Shared.Verbs; +using Robust.Shared.Containers; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Shared.Imperial.Medieval.MagicDungeon; + +public abstract partial class SharedDungeonPortalSystem : EntitySystem +{ + [Dependency] private readonly SharedPointLightSystem _pointLightSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly SharedMindSystem _mindSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnShardInserted); + SubscribeLocalEvent(OnShardInsertAttempt); + SubscribeLocalEvent(OnPortalInit); + SubscribeLocalEvent(OnMapInit); + + InitEscape(); + } + + private void OnMapInit(Entity shard, ref MapInitEvent args) + { + var x = _robustRandom.Next(-1, 3); + var y = _robustRandom.Next(-1, 3); + shard.Comp.SizeModifier = (x, y); + Dirty(shard); + } + + private void OnPortalInit(EntityUid uid, DungeonPortalFrameComponent component, ComponentInit args) + { + if (!TryComp(uid, out var itemSlots)) + return; + + if (_itemSlots.TryGetSlot(uid, component.ShardSlotId1, out var slot1, itemSlots)) + component.ShardSlot1 = slot1; + else + _itemSlots.AddItemSlot(uid, component.ShardSlotId1, component.ShardSlot1, itemSlots); + + if (_itemSlots.TryGetSlot(uid, component.ShardSlotId2, out var slot2, itemSlots)) + component.ShardSlot2 = slot2; + else + _itemSlots.AddItemSlot(uid, component.ShardSlotId2, component.ShardSlot2, itemSlots); + } + + private void OnShardInsertAttempt(Entity portalFrame, ref ContainerIsInsertingAttemptEvent args) + { + if (portalFrame.Comp.IsActive) + return; + + args.Cancel(); + } + + private void OnShardInserted(Entity portalFrame, ref EntInsertedIntoContainerMessage args) + { + if (args.Container.ID != portalFrame.Comp.ShardSlotId1 && args.Container.ID != portalFrame.Comp.ShardSlotId2) + return; + + if (!TryComp(portalFrame, out var itemSlots)) + return; + + if (_itemSlots.TryGetSlot(portalFrame, args.Container.ID, out var shardSlot, itemSlots) || shardSlot == null) + return; + + var shard = args.Entity; + var shardComp = EnsureComp(shard); + portalFrame.Comp.BaseSize += shardComp.SizeModifier; + Dirty(portalFrame); + + _itemSlots.SetLock(portalFrame, shardSlot, true, itemSlots); + ChangeShardHolesAppearance(portalFrame); + if (!_itemSlots.CanInsert(portalFrame, shard, null, portalFrame.Comp.ShardSlot1) && !_itemSlots.CanInsert(portalFrame, shard, null, portalFrame.Comp.ShardSlot2)) + { + OpenPortal(portalFrame); + } + } + + private void OpenPortal(Entity portalFrame) + { + SpawnPortal(portalFrame); + portalFrame.Comp.IsOpened = true; + ChangePortalAppearance(portalFrame); + Dirty(portalFrame); + } + + private void ClosePortal(Entity portalFrame) + { + portalFrame.Comp.IsOpened = false; + ChangePortalAppearance(portalFrame); + } + + private void DeactivatePortal(Entity portalFrame) + { + portalFrame.Comp.IsActive = false; + portalFrame.Comp.IsOpened = false; + ChangePortalAppearance(portalFrame); + } + + protected virtual void SpawnPortal(Entity portalFrame) + { + portalFrame.Comp.IsActive = true; + } + + private bool CheckPortalShouldBeDeactivated(Entity portalFrame) + { + if (_mindSystem.GetAliveHumans().Any(c => Transform(c).MapID == portalFrame.Comp.DungeonMap)) + return false; + return true; + } + + private void ChangeShardHolesAppearance(Entity portalFrame) + { + if (portalFrame.Comp.ShardSlot1.Item is { } shard1) + { + var shardComp = EnsureComp(shard1); + _appearanceSystem.SetData(portalFrame, DungeonPortalVisuals.LeftState, shardComp.ColorInt); + } + if (portalFrame.Comp.ShardSlot1.Item is { } shard2) + { + var shardComp = EnsureComp(shard2); + _appearanceSystem.SetData(portalFrame, DungeonPortalVisuals.RightState, shardComp.ColorInt); + } + } + + private void ChangePortalAppearance(Entity portalFrame) + { + int value = !portalFrame.Comp.IsActive ? 0 + : !portalFrame.Comp.IsOpened ? 1 + : 2; + _appearanceSystem.SetData(portalFrame, DungeonPortalVisuals.OpenState, value); + } +} diff --git a/Content.Shared/Imperial/Medieval/MagicDungeon/dock.md b/Content.Shared/Imperial/Medieval/MagicDungeon/dock.md new file mode 100644 index 00000000000..b031f5d807f --- /dev/null +++ b/Content.Shared/Imperial/Medieval/MagicDungeon/dock.md @@ -0,0 +1,12 @@ +## Что делать дальше? + +### Lethal Company + +- Сделать сам интерфейс вот этой штуки на корабле из леталки на основе консоли мониторинга экипажа из ванильной сборки, добавив туда на необходимые координаты кнопки деактивации ловушек. В принципе система несложная, у вас есть буквально референс как надо делать лично от виззардов. +- Сделать ловушки, желательно сделать их универсальными, чтобы создание ловушек поддавалось дальнейшему расширению. Как пример: PressurePlateComponent и PressurePlateRecieverComponent будут задаваься для всех ловушек, активирующихся по нажатии на нажимную плиту; ProjectileShooterComponent будет работать над тем, чтобы выстреливать проджектайл. Эти два компонента являются разными по типу: первый - триггер, второй - действие. Триггер-компоненты должны иметь отдельную абстрактную систему работы, у которой будет одинаковый для всех механ отправки триггер ивента на все компоненты-действия. Соответственно компоненты-действия принимают общим для всех методом триггер и триггерятся. В принципе универсализация - залог успеха, если это сделать, то прототиперы даже сами смогут ловушки ставить, лол. + +### Остальное, что я не успел доделать + +- Необходимо закончить систему входа-выхода из данжа, закрытия данжа, а также проработать момент с тем, как и в каком состоянии люди туда будут попадать. +- Необходимо сделать рандомный спавн шардов/сделать им руду/что-то такое, чтобы их можно было найти.
+ diff --git a/Resources/Maps/Dungeon/govno.yml b/Resources/Maps/Dungeon/govno.yml new file mode 100644 index 00000000000..be511b40206 --- /dev/null +++ b/Resources/Maps/Dungeon/govno.yml @@ -0,0 +1,735 @@ +meta: + format: 7 + category: Map + engineVersion: 267.1.0 + forkId: "" + forkVersion: "" + time: 02/07/2026 10:13:21 + entityCount: 127 +maps: +- 1 +grids: +- 1 +orphans: [] +nullspace: [] +tilemap: + 0: Space + 22: FloorCave + 23: FloorCaveDrought + 40: FloorDirt + 4: FloorGrayConcrete + 3: FloorGrayConcreteMono + 66: FloorMining + 68: FloorMiningLight + 71: FloorOldConcreteMono + 72: FloorOldConcreteSmooth + 1: FloorPlanetDirt + 82: FloorShuttleOrange + 2: FloorShuttlePurple + 118: FloorWood + 5: MedievalFloorStone1 + 7: MedievalFloorStone3 + 9: MedievalFloorStone5 + 6: MedievalFloorStone6 + 8: MedievalFloorStone9 + 121: Plating + 124: PlatingDamaged +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + - type: Transform + - type: Map + mapPaused: True + - type: GridTree + - type: Broadphase + - type: OccluderTree + - type: MapGrid + chunks: + -1,-1: + ind: -1,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAA== + version: 7 + -1,0: + ind: -1,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + version: 7 + 3,0: + ind: 3,0 + tiles: AgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + version: 7 + 3,-1: + ind: 3,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + version: 7 + 2,-1: + ind: 2,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAA== + version: 7 + 2,0: + ind: 2,0 + tiles: AgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + version: 7 + 1,0: + ind: 1,0 + tiles: AQAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAAIAAAAAAAAAQAAAAAAAAEAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAAIAAAAAAAACAAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAQAAAAAAAAEAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAAIAAAAAAAAAQAAAAAAAAgAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAIAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + version: 7 + 1,-1: + ind: 1,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAA== + version: 7 + 0,0: + ind: 0,0 + tiles: AQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAIAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAgAAAAAAAACAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAQAAAAAAAAgAAAAAAAAIAAAAAAAAAgAAAAAAAAEAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAIAAAAAAAABAAAAAAAAAQAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAACAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAABAAAAAAAACAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAgAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAIAAAAAAAABAAAAAAAAAQAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAAIAAAAAAAAAQAAAAAAAAgAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAACAAAAAAAACAAAAAAAAAEAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAEAAAAAAAAIAAAAAAAAAgAAAAAAAAgAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAABAAAAAAAACAAAAAAAAAIAAAAAAAAIAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAABAAAAAAAAAQAAAAAAAAgAAAAAAAACAAAAAAAACAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAQAAAAAAAAEAAAAAAAAIAAAAAAAAAgAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAIAAAAAAAABAAAAAAAAAQAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + version: 7 + 0,-1: + ind: 0,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAAIAAAAAAAACAAAAAAAAAgAAAAAAAA== + version: 7 + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: [] + - type: SpreaderGrid + - type: GridPathfinding + - type: RadiationGridResistance +- proto: MedievalChest4 + entities: + - uid: 38 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: 16.5,11.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: 21.5,6.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: 16.5,6.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: 9.5,9.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: 10.5,3.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: 23.5,10.5 + parent: 1 +- proto: MedievalStoneBrickWallIndestructable + entities: + - uid: 2 + components: + - type: Transform + pos: 5.5,0.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: 5.5,1.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 8 + components: + - type: Transform + pos: 5.5,9.5 + parent: 1 + - uid: 9 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 8.5,7.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: 8.5,8.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: 4.5,11.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 8.5,10.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 8.5,11.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 8.5,9.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 3.5,8.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 3.5,7.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: 15.5,5.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: 8.5,5.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: 9.5,2.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 9.5,3.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: 7.5,4.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: 11.5,4.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: 10.5,1.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 11.5,3.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: 11.5,2.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 7.5,2.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 10.5,5.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 17.5,1.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 21.5,0.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 22.5,2.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: 25.5,3.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: 25.5,1.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: 25.5,2.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 18.5,1.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 15.5,1.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 19.5,1.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 17.5,5.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 17.5,3.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: 17.5,4.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 15.5,7.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: 25.5,4.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: 25.5,5.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: 19.5,0.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: 21.5,2.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: 23.5,3.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 21.5,1.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 23.5,2.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 25.5,6.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 16.5,1.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 16.5,7.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 17.5,7.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: 22.5,6.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 22.5,11.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 21.5,11.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 19.5,11.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 20.5,11.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 22.5,5.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: 20.5,6.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: 20.5,7.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 21.5,5.5 + parent: 1 + - uid: 79 + components: + - type: Transform + pos: 20.5,5.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 16.5,10.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 15.5,11.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: 17.5,11.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: 15.5,10.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 25.5,9.5 + parent: 1 + - uid: 85 + components: + - type: Transform + pos: 25.5,8.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: 24.5,7.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: 22.5,7.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: 9.5,5.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 9.5,11.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: 10.5,11.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: 22.5,9.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 22.5,10.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 23.5,9.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 11.5,5.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: 15.5,6.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: 10.5,2.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 25.5,7.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 17.5,2.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 17.5,10.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 23.5,7.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: 18.5,11.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: 24.5,9.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: 11.5,8.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: 9.5,8.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: 12.5,11.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: 11.5,11.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: 7.5,11.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: 11.5,9.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: 15.5,2.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: 22.5,12.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: 14.5,5.5 + parent: 1 + - uid: 122 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: 10.5,8.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: 4.5,1.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: 17.5,6.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: 20.5,10.5 + parent: 1 +... diff --git a/Resources/Prototypes/Imperial/Medieval/MagicDungeon/portal.yml b/Resources/Prototypes/Imperial/Medieval/MagicDungeon/portal.yml new file mode 100644 index 00000000000..6c12b8a7e71 --- /dev/null +++ b/Resources/Prototypes/Imperial/Medieval/MagicDungeon/portal.yml @@ -0,0 +1,97 @@ +- type: entity + id: MagicPortalFrame + parent: BaseStructure + name: magic portal + description: This portal can send you somewhere. But what's inside? + components: + - type: Sprite + sprite: Imperial/Medieval/MagicDungeon/frame.rsi + layers: + - state: frame + - map: ["enum.DungeonPortalVisualLayers.IsOpened"] + visible: false + shader: unshaded + - visible: false + map: ["enum.DungeonPortalVisualLayers.LeftPart"] + shader: unshaded + - visible: false + map: ["enum.DungeonPortalVisualLayers.RightPart"] + shader: unshaded + - type: GenericVisualizer + visuals: + enum.DungeonPortalVisuals.OpenState: + enum.DungeonPortalVisualLayers.IsOpened: + 0: { visible: false } + 1: { visible: true, state: red_state } + 2: { visible: true, state: blue_state } + enum.DungeonPortalVisuals.LeftState: + enum.DungeonPortalVisualLayers.LeftPart: + 0: { visible: false } + 1: { visible: true, state: left_crystal_blue } + 2: { visible: true, state: left_crystal_green } + 3: { visible: true, state: left_crystal_pink } + 4: { visible: true, state: left_crystal_purple } + 5: { visible: true, state: left_crystal_red } + 6: { visible: true, state: left_crystal_yellow } + enum.DungeonPortalVisuals.RightState: + enum.DungeonPortalVisualLayers.RightPart: + 0: { visible: false } + 1: { visible: true, state: right_crystal_blue } + 2: { visible: true, state: right_crystal_green } + 3: { visible: true, state: right_crystal_pink } + 4: { visible: true, state: right_crystal_purple } + 5: { visible: true, state: right_crystal_red } + 6: { visible: true, state: right_crystal_yellow } + - type: Physics + bodyType: Static + - type: Transform + noRot: true + - type: Fixtures + fixtures: + portalFixture: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.48,0.25,0.48" + mask: + - FullTileMask + layer: + - WallLayer + hard: false + - type: Appearance + - type: ItemSlots + slots: + shard1: + name: ShardSlot1 + insertSound: + path: /Audio/Machines/terminal_insert_disc.ogg + ejectSound: + path: /Audio/Machines/terminal_insert_disc.ogg + whitelist: + components: + - DungeonShard + shard2: + name: ShardSlot2 + insertSound: + path: /Audio/Machines/terminal_insert_disc.ogg + ejectSound: + path: /Audio/Machines/terminal_insert_disc.ogg + whitelist: + components: + - DungeonShard + - type: ContainerContainer + containers: + shard1: !type:ContainerSlot {} + shard2: !type:ContainerSlot {} + +- type: entity + parent: BaseItem + id: BaseShard + abstract: true + name: base shard + description: This shiny shard of magic looks so beatiful... + components: + - type: Item + sprite: Imperial/Medieval/MagicDungeon/shard.rsi + size: Tiny + - type: Sprite + sprite: Imperial/Medieval/MagicDungeon/shard.rsi diff --git a/Resources/Prototypes/Imperial/Medieval/Procedural/rooms.yml b/Resources/Prototypes/Imperial/Medieval/Procedural/rooms.yml new file mode 100644 index 00000000000..093da779b66 --- /dev/null +++ b/Resources/Prototypes/Imperial/Medieval/Procedural/rooms.yml @@ -0,0 +1,30 @@ +- type: entity + id: MedievalDungeonRoomMarker + parent: BaseRoomMarker + name: marker + components: + - type: RoomFill + minSize: 13,13 + maxSize: 13,13 + roomWhitelist: + tags: + - MedievalDungeonRoom + +# add room prototypes here under this comment and add MedievalDungeonRoom tag to them +- type: dungeonRoom + id: MedievalDungeon13x13a + ignoreTile: FloorShuttlePurple + size: 13,13 + atlas: /Maps/Dungeon/govno.yml + offset: 0,0 + tags: + - MedievalDungeonRoom + +- type: dungeonRoom + id: MedievalDungeon13x13b + ignoreTile: FloorShuttlePurple + size: 13,13 + atlas: /Maps/Dungeon/govno.yml + offset: 14,0 + tags: + - MedievalDungeonRoom diff --git a/Resources/Prototypes/Imperial/Medieval/decor.yml b/Resources/Prototypes/Imperial/Medieval/decor.yml index ac20c5c72c3..d53f05f9b26 100644 --- a/Resources/Prototypes/Imperial/Medieval/decor.yml +++ b/Resources/Prototypes/Imperial/Medieval/decor.yml @@ -259,6 +259,9 @@ node: cratelivestock containers: - entity_storage + - type: Tag + tags: + - MedievalChest - type: entity parent: CrateGeneric @@ -308,6 +311,9 @@ node: cratelivestock containers: - entity_storage + - type: Tag + tags: + - MedievalChest - type: entity parent: CrateGeneric @@ -357,6 +363,9 @@ node: cratelivestock containers: - entity_storage + - type: Tag + tags: + - MedievalChest - type: entity parent: CrateGeneric @@ -404,6 +413,9 @@ - type: Construction graph: MedievalChest4 node: MedievalChest4 + - type: Tag + tags: + - MedievalChest - type: construction id: MedievalChest4 diff --git a/Resources/Prototypes/Imperial/Medieval/doors.yml b/Resources/Prototypes/Imperial/Medieval/doors.yml index 3ef793fe09c..c2e9dee8f3e 100644 --- a/Resources/Prototypes/Imperial/Medieval/doors.yml +++ b/Resources/Prototypes/Imperial/Medieval/doors.yml @@ -461,6 +461,73 @@ accessLists: - RebelTavern8 +# Procedural generated doors start +- type: entity + parent: MedievalAirlock + id: MedievalAirlockDungeonA + name: dungeon door + components: + - type: DoorBolt + boltsDown: True + - type: LockDoor + accessLists: + - DungeonA + +- type: entity + parent: MedievalAirlock + id: MedievalAirlockDungeonB + name: dungeon door + components: + - type: DoorBolt + boltsDown: True + - type: LockDoor + accessLists: + - DungeonB + +- type: entity + parent: MedievalAirlock + id: MedievalAirlockDungeonC + name: dungeon door + components: + - type: DoorBolt + boltsDown: True + - type: LockDoor + accessLists: + - DungeonC + +- type: entity + parent: MedievalAirlock + id: MedievalAirlockDungeonD + name: dungeon door + components: + - type: DoorBolt + boltsDown: True + - type: LockDoor + accessLists: + - DungeonD + +- type: entity + parent: MedievalAirlock + id: MedievalAirlockDungeonE + name: dungeon door + components: + - type: DoorBolt + boltsDown: True + - type: LockDoor + accessLists: + - DungeonE + +- type: entity + parent: MedievalAirlock + id: MedievalAirlockDungeonF + name: dungeon door + components: + - type: DoorBolt + boltsDown: True + - type: LockDoor + accessLists: + - DungeonF +# Procedural generated doors end - type: entity id: MedievalAirlock diff --git a/Resources/Prototypes/Imperial/Medieval/keys.yml b/Resources/Prototypes/Imperial/Medieval/keys.yml index 65ee3708598..870ab6a17a8 100644 --- a/Resources/Prototypes/Imperial/Medieval/keys.yml +++ b/Resources/Prototypes/Imperial/Medieval/keys.yml @@ -842,6 +842,104 @@ tags: - LegionnaireKey +# Procedural generated doorkeys start +- type: entity + parent: MedievalKeyBase + id: MedievalKeyDungeonA + name: dungeon key + components: + - type: Sprite + sprite: Imperial/Medieval/Misc/keys.rsi + state: doorA + - type: Key + accesses: + - DungeonA + - type: Tag + tags: + - MedievalKey + - ProceduralDoorKey + +- type: entity + parent: MedievalKeyBase + id: MedievalKeyDungeonB + name: dungeon key + components: + - type: Sprite + sprite: Imperial/Medieval/Misc/keys.rsi + state: doorB + - type: Key + accesses: + - DungeonB + - type: Tag + tags: + - MedievalKey + - ProceduralDoorKey + +- type: entity + parent: MedievalKeyBase + id: MedievalKeyDungeonC + name: dungeon key + components: + - type: Sprite + sprite: Imperial/Medieval/Misc/keys.rsi + state: doorC + - type: Key + accesses: + - DungeonC + - type: Tag + tags: + - MedievalKey + - ProceduralDoorKey + +- type: entity + parent: MedievalKeyBase + id: MedievalKeyDungeonD + name: dungeon key + components: + - type: Sprite + sprite: Imperial/Medieval/Misc/keys.rsi + state: doorD + - type: Key + accesses: + - DungeonD + - type: Tag + tags: + - MedievalKey + - ProceduralDoorKey + +- type: entity + parent: MedievalKeyBase + id: MedievalKeyDungeonE + name: dungeon key + components: + - type: Sprite + sprite: Imperial/Medieval/Misc/keys.rsi + state: doorE + - type: Key + accesses: + - DungeonE + - type: Tag + tags: + - MedievalKey + - ProceduralDoorKey + +- type: entity + parent: MedievalKeyBase + id: MedievalKeyDungeonF + name: dungeon key + components: + - type: Sprite + sprite: Imperial/Medieval/Misc/keys.rsi + state: doorF + - type: Key + accesses: + - DungeonF + - type: Tag + tags: + - MedievalKey + - ProceduralDoorKey +# Procedural generated doorkeys end + - type: playTimeTracker id: Medieval1 diff --git a/Resources/Prototypes/Imperial/Medieval/medieval.yml b/Resources/Prototypes/Imperial/Medieval/medieval.yml index 24186e75664..04f021efc02 100644 --- a/Resources/Prototypes/Imperial/Medieval/medieval.yml +++ b/Resources/Prototypes/Imperial/Medieval/medieval.yml @@ -25,6 +25,25 @@ - type: ExplosionResistance damageCoefficient: 19 +- type: entity + parent: BaseWall + id: MedievalStoneBrickWallIndestructable + name: stone wall + components: + - type: Tag + tags: + - Wall + - type: Sprite + sprite: Imperial/Medieval/Walls/stone_brick.rsi + - type: Icon + sprite: Imperial/Medieval/Walls/stone_brick.rsi + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: StructuralMetallicStrong + - type: IconSmooth + key: walls + base: brick + - type: entity parent: BarricadeMedieval id: MedievalStockade diff --git a/Resources/Prototypes/Imperial/Medieval/tags.yml b/Resources/Prototypes/Imperial/Medieval/tags.yml index e4552eb1ea7..a4ac8612c64 100644 --- a/Resources/Prototypes/Imperial/Medieval/tags.yml +++ b/Resources/Prototypes/Imperial/Medieval/tags.yml @@ -131,4 +131,13 @@ id: CultConductor - type: Tag - id: CultConductorRod \ No newline at end of file + id: CultConductorRod + +- type: Tag + id: ProceduralDoorKey + +- type: Tag + id: MedievalDungeonRoom + +- type: Tag + id: MedievalChest diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/blue_state.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/blue_state.png new file mode 100644 index 00000000000..7dfbe9564ce Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/blue_state.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/frame.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/frame.png new file mode 100644 index 00000000000..2adab06467f Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/frame.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_blue.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_blue.png new file mode 100644 index 00000000000..5daac79b199 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_blue.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_green.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_green.png new file mode 100644 index 00000000000..90ebab5317d Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_green.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_pink.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_pink.png new file mode 100644 index 00000000000..88e039c0736 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_pink.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_purple.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_purple.png new file mode 100644 index 00000000000..c16c96f0f84 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_purple.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_red.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_red.png new file mode 100644 index 00000000000..4ba1bb568c6 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_red.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_yellow.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_yellow.png new file mode 100644 index 00000000000..d72ebf7f84c Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/left_crystal_yellow.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/meta.json b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/meta.json new file mode 100644 index 00000000000..4bc74a7e086 --- /dev/null +++ b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/meta.json @@ -0,0 +1,74 @@ +{ + "version": 1, + "license": "this content is under ICLA licence, read more on https://wiki.imperialspace.net/icla", + "copyright": "sprited by @gag08984", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "blue_state", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "frame" + }, + { + "name": "left_crystal_blue" + }, + { + "name": "left_crystal_green" + }, + { + "name": "left_crystal_pink" + }, + { + "name": "left_crystal_purple" + }, + { + "name": "left_crystal_red" + }, + { + "name": "left_crystal_yellow" + }, + { + "name": "red_state", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "right_crystal_blue" + }, + { + "name": "right_crystal_green" + }, + { + "name": "right_crystal_pink" + }, + { + "name": "right_crystal_purple" + }, + { + "name": "right_crystal_red" + }, + { + "name": "right_crystal_yellow" + } + ] + } diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/red_state.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/red_state.png new file mode 100644 index 00000000000..3aec8efbbd6 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/red_state.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_blue.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_blue.png new file mode 100644 index 00000000000..f0c31f304ba Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_blue.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_green.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_green.png new file mode 100644 index 00000000000..a9ad2057b21 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_green.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_pink.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_pink.png new file mode 100644 index 00000000000..04cb5f2c6d5 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_pink.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_purple.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_purple.png new file mode 100644 index 00000000000..63888f44b2b Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_purple.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_red.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_red.png new file mode 100644 index 00000000000..b6e7dadfe1e Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_red.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_yellow.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_yellow.png new file mode 100644 index 00000000000..ec8e3f76018 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/frame.rsi/right_crystal_yellow.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/meta.json b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/meta.json new file mode 100644 index 00000000000..76e26a6e9a1 --- /dev/null +++ b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "this content is under ICLA licence, read more on https://wiki.imperialspace.net/icla", + "copyright": "sprited by @gag08984", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "shard_blue" + }, + { + "name": "shard_green" + }, + { + "name": "shard_red" + }, + { + "name": "shard_pink" + }, + { + "name": "shard_purple" + }, + { + "name": "shard_yellow" + } + ] + } diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_blue.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_blue.png new file mode 100644 index 00000000000..5db69199367 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_blue.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_green.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_green.png new file mode 100644 index 00000000000..e2f1a9b1904 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_green.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_pink.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_pink.png new file mode 100644 index 00000000000..3e83ad404a0 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_pink.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_purple.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_purple.png new file mode 100644 index 00000000000..399b19e9583 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_purple.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_red.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_red.png new file mode 100644 index 00000000000..79c9a18a99b Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_red.png differ diff --git a/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_yellow.png b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_yellow.png new file mode 100644 index 00000000000..2dca08dba8e Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/MagicDungeon/shard.rsi/shard_yellow.png differ diff --git a/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorA.png b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorA.png new file mode 100644 index 00000000000..898533e72c7 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorA.png differ diff --git a/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorB.png b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorB.png new file mode 100644 index 00000000000..e33a9b613e0 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorB.png differ diff --git a/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorC.png b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorC.png new file mode 100644 index 00000000000..ca5f10c5ced Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorC.png differ diff --git a/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorD.png b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorD.png new file mode 100644 index 00000000000..1ef8927f7c1 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorD.png differ diff --git a/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorE.png b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorE.png new file mode 100644 index 00000000000..a24b4dc8893 Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorE.png differ diff --git a/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorF.png b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorF.png new file mode 100644 index 00000000000..1b24f7f94cf Binary files /dev/null and b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/doorF.png differ diff --git a/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/meta.json b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/meta.json index a886f9a07b3..846235ef358 100644 --- a/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/meta.json +++ b/Resources/Textures/Imperial/Medieval/Misc/keys.rsi/meta.json @@ -60,6 +60,24 @@ }, { "name": "archivist" + }, + { + "name": "doorA" + }, + { + "name": "doorB" + }, + { + "name": "doorC" + }, + { + "name": "doorD" + }, + { + "name": "doorE" + }, + { + "name": "doorF" } ] }