Demiplans expeditions (#523)

* simple expedition generation

* add simple test key

* expedition map component

* some funny procedural testing

* refactor expeditions from planetbiome to islanddungeons

* some work

* fix: grid dungeon, not map planet dungeon

* unhardcode map components

* finish T1 expedition generation

* Update preset.yml

* indestructable stone

* mob water occlusion

* caves T1 expedition

* Update CP14SpawnExpeditionJob.cs

* Delete shared MissionParams

* rename to demiplans

* pass mapid into job

* demiplan connections

* demiplan exits

* random entry points

* Update config.yml

* some cleanup and renaming

* radius one-time teleport

* rename connections to exitPoint

* merge entry and exit point into rift component

* demipan closing - all rifts deletion

* demiplanEEEEEE

* fixes

* delete floating visuals

* Update CP14DemiplaneTravelingSystem.cs

* intro and outro demiplan music

* rift cores and flashing

* pulling support

* pulling fix + generatordata fix?

* auto destrot demiplans??
This commit is contained in:
Ed
2024-10-31 19:13:44 +03:00
committed by GitHub
parent 16e23098db
commit 5c4b5d1572
54 changed files with 1929 additions and 95 deletions

View File

@@ -0,0 +1,118 @@
using Content.Shared._CP14.Demiplane.Components;
using Robust.Shared.Random;
namespace Content.Server._CP14.Demiplane;
public sealed partial class CP14DemiplaneSystem
{
private void InitConnections()
{
SubscribeLocalEvent<CP14DemiplaneRiftComponent, MapInitEvent>(OnRiftInit);
SubscribeLocalEvent<CP14DemiplaneRiftComponent, ComponentShutdown>(OnRiftShutdown);
}
private void OnRiftInit(Entity<CP14DemiplaneRiftComponent> rift, ref MapInitEvent args)
{
var map = Transform(rift).MapUid;
if (TryComp<CP14DemiplaneComponent>(map, out var demiplan)) // In demiplan
{
if (rift.Comp.TryAutoLinkToMap)
rift.Comp.Demiplan = (map.Value, demiplan);
if (rift.Comp.ActiveTeleport)
AddDemiplanRandomEntryPoint((map.Value, demiplan), rift);
}
else if (rift.Comp.Demiplan is not null) //We out of demiplan
{
if (rift.Comp.ActiveTeleport)
AddDemiplanRandomExitPoint(rift.Comp.Demiplan.Value, rift);
}
}
private void OnRiftShutdown(Entity<CP14DemiplaneRiftComponent> rift, ref ComponentShutdown args)
{
if (rift.Comp.Demiplan is null)
return;
RemoveDemiplanRandomEntryPoint(rift.Comp.Demiplan, rift);
RemoveDemiplanRandomExitPoint(rift.Comp.Demiplan, rift);
}
/// <summary>
///Add a position in the real world where you can get out of this demiplan
/// </summary>
private void AddDemiplanRandomExitPoint(Entity<CP14DemiplaneComponent> demiplan,
Entity<CP14DemiplaneRiftComponent> exitPoint)
{
if (demiplan.Comp.ExitPoints.Contains(exitPoint))
return;
demiplan.Comp.ExitPoints.Add(exitPoint);
exitPoint.Comp.Demiplan = demiplan;
}
/// <summary>
/// Removing the demiplan exit point, one of which the player can exit to
/// </summary>
private void RemoveDemiplanRandomExitPoint(Entity<CP14DemiplaneComponent>? demiplan,
Entity<CP14DemiplaneRiftComponent> exitPoint)
{
if (demiplan is not null && demiplan.Value.Comp.ExitPoints.Contains(exitPoint))
{
demiplan.Value.Comp.ExitPoints.Remove(exitPoint);
exitPoint.Comp.Demiplan = null;
}
if (exitPoint.Comp.DeleteAfterDisconnect)
QueueDel(exitPoint);
}
/// <summary>
/// Add a position within the demiplan that can be entered into the demiplan
/// </summary>
private void AddDemiplanRandomEntryPoint(Entity<CP14DemiplaneComponent> demiplan,
Entity<CP14DemiplaneRiftComponent> entryPoint)
{
if (demiplan.Comp.EntryPoints.Contains(entryPoint))
return;
demiplan.Comp.EntryPoints.Add(entryPoint);
entryPoint.Comp.Demiplan = demiplan;
}
private void RemoveDemiplanRandomEntryPoint(Entity<CP14DemiplaneComponent>? demiplan,
Entity<CP14DemiplaneRiftComponent> entryPoint)
{
if (demiplan is not null && demiplan.Value.Comp.EntryPoints.Contains(entryPoint))
{
demiplan.Value.Comp.EntryPoints.Remove(entryPoint);
entryPoint.Comp.Demiplan = null;
}
if (entryPoint.Comp.DeleteAfterDisconnect)
QueueDel(entryPoint);
}
public bool TryGetDemiplanEntryPoint(Entity<CP14DemiplaneComponent> demiplan, out Entity<CP14DemiplaneRiftComponent>? entryPoint)
{
entryPoint = null;
if (demiplan.Comp.EntryPoints.Count == 0)
return false;
entryPoint = _random.Pick(demiplan.Comp.EntryPoints);
return true;
}
public bool TryGetDemiplanExitPoint(Entity<CP14DemiplaneComponent> demiplan,
out Entity<CP14DemiplaneRiftComponent>? exitPoint)
{
exitPoint = null;
if (demiplan.Comp.ExitPoints.Count == 0)
return false;
exitPoint = _random.Pick(demiplan.Comp.ExitPoints);
return true;
}
}

View File

@@ -0,0 +1,121 @@
using System.Threading;
using Content.Server._CP14.Demiplane.Components;
using Content.Server._CP14.Demiplane.Jobs;
using Content.Shared._CP14.Demiplane.Components;
using Content.Shared._CP14.Demiplane.Prototypes;
using Content.Shared.Interaction.Events;
using Robust.Shared.CPUJob.JobQueues;
using Robust.Shared.CPUJob.JobQueues.Queues;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server._CP14.Demiplane;
public sealed partial class CP14DemiplaneSystem
{
private readonly JobQueue _expeditionQueue = new();
private readonly List<(CP14SpawnRandomDemiplaneJob Job, CancellationTokenSource CancelToken)> _expeditionJobs = new();
private const double JobMaxTime = 0.002;
private void InitGeneration()
{
SubscribeLocalEvent<CP14DemiplaneGeneratorDataComponent, MapInitEvent>(GeneratorMapInit);
SubscribeLocalEvent<CP14DemiplaneGeneratorDataComponent, UseInHandEvent>(GeneratorUsedInHand);
}
private void UpdateGeneration(float frameTime)
{
_expeditionQueue.Process();
foreach (var (job, cancelToken) in _expeditionJobs.ToArray())
{
switch (job.Status)
{
case JobStatus.Finished:
_expeditionJobs.Remove((job, cancelToken));
break;
}
}
}
/// <summary>
/// Generates a new random demiplane based on the specified parameters
/// </summary>
public void SpawnRandomDemiplane(ProtoId<CP14DemiplaneLocationPrototype> location, out Entity<CP14DemiplaneComponent> demiplan, out MapId mapId)
{
var mapUid = _mapSystem.CreateMap(out mapId, runMapInit: false);
var demiComp = EntityManager.EnsureComponent<CP14DemiplaneComponent>(mapUid);
demiplan = (mapUid, demiComp);
var cancelToken = new CancellationTokenSource();
var job = new CP14SpawnRandomDemiplaneJob(
JobMaxTime,
EntityManager,
_logManager,
_mapManager,
_proto,
_dungeon,
_metaData,
_mapSystem,
mapUid,
mapId,
location,
_random.Next(-10000, 10000),
cancelToken.Token);
_expeditionJobs.Add((job, cancelToken));
_expeditionQueue.EnqueueJob(job);
}
private void GeneratorUsedInHand(Entity<CP14DemiplaneGeneratorDataComponent> generator, ref UseInHandEvent args)
{
if (generator.Comp.LocationConfig is null)
return;
SpawnRandomDemiplane(generator.Comp.LocationConfig.Value, out var demiplane, out var mapId);
//TEST
EnsureComp<CP14DemiplaneDestroyWithoutPlayersComponent>(demiplane);
var tempRift = EntityManager.Spawn("CP14DemiplaneTimedRadiusPassway");
var tempRift2 = EntityManager.Spawn("CP14DemiplanRiftCore");
_transform.SetCoordinates(tempRift, Transform(args.User).Coordinates);
_transform.SetCoordinates(tempRift2, Transform(args.User).Coordinates);
var connection = EnsureComp<CP14DemiplaneRiftComponent>(tempRift);
var connection2 = EnsureComp<CP14DemiplaneRiftComponent>(tempRift2);
AddDemiplanRandomExitPoint(demiplane, (tempRift, connection));
AddDemiplanRandomExitPoint(demiplane, (tempRift2, connection2));
QueueDel(generator); //wtf its crash debug build?
}
private void GeneratorMapInit(Entity<CP14DemiplaneGeneratorDataComponent> generator, ref MapInitEvent args)
{
// Here, a unique Demiplan config should be generated based on the CP14DemiplanGeneratorDataComponent
//Location generation
HashSet<CP14DemiplaneLocationPrototype> suitableConfigs = new();
foreach (var locationConfig in _proto.EnumeratePrototypes<CP14DemiplaneLocationPrototype>())
{
suitableConfigs.Add(locationConfig);
}
if (suitableConfigs.Count == 0)
{
Log.Error("Expedition mission generation failed: No suitable location configs.");
QueueDel(generator);
return;
}
var selectedConfig = _random.Pick(suitableConfigs);
generator.Comp.LocationConfig = selectedConfig;
//Modifier generation
//Scenario generation
//ETC generation
}
}

View File

@@ -0,0 +1,124 @@
using Content.Server.Flash;
using Content.Server.Procedural;
using Content.Shared._CP14.Demiplane;
using Content.Shared._CP14.Demiplane.Components;
using Robust.Server.Audio;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server._CP14.Demiplane;
public sealed partial class CP14DemiplaneSystem : CP14SharedDemiplaneSystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly ILogManager _logManager = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly DungeonSystem _dungeon = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly SharedMapSystem _mapSystem = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly AudioSystem _audio = default!;
[Dependency] private readonly FlashSystem _flash = default!;
public override void Initialize()
{
base.Initialize();
InitGeneration();
InitConnections();
SubscribeLocalEvent<CP14DemiplaneComponent, ComponentShutdown>(OnDemiplanShutdown);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
UpdateGeneration(frameTime);
}
/// <summary>
/// Teleports the entity inside the demiplane, to one of the random entry points.
/// </summary>
/// <param name="demiplane">The demiplane the entity will be teleported to</param>
/// <param name="entity">The entity to be teleported</param>
/// <returns></returns>
public bool TryTeleportIntoDemiplane(Entity<CP14DemiplaneComponent> demiplane, EntityUid? entity)
{
if (entity is null)
return false;
if (!TryGetDemiplanEntryPoint(demiplane, out var entryPoint) || entryPoint is null)
{
Log.Error($"{entity} cant get in demiplane {demiplane}: no active entry points!");
return false;
}
var targetCoord = Transform(entryPoint.Value).Coordinates;
_flash.Flash(entity.Value, null, null, 3000f, 0.5f);
_transform.SetCoordinates(entity.Value, targetCoord);
_audio.PlayGlobal(demiplane.Comp.ArrivalSound, entity.Value);
var ev = new CP14DemiplanEntityEnterEvent(entity.Value);
RaiseLocalEvent(demiplane, ev);
return true;
}
/// <summary>
/// Teleports an entity from the demiplane to the real world, to one of the random exit points in the real world.
/// </summary>
/// <param name="demiplane">The demiplane from which the entity will be teleported</param>
/// <param name="entity">An entity that will be teleported into the real world. This entity must be in the demiplane, otherwise the function will not work.</param>
/// <returns></returns>
public bool TryTeleportOutDemiplane(Entity<CP14DemiplaneComponent> demiplane, EntityUid? entity)
{
if (entity is null)
return false;
if (Transform(entity.Value).MapUid != demiplane.Owner)
return false;
if (!TryGetDemiplanExitPoint(demiplane, out var connection) || connection is null)
{
Log.Error($"{entity} cant get out of demiplane {demiplane}: no active connections!");
return false;
}
var targetCoord = Transform(connection.Value).Coordinates;
_flash.Flash(entity.Value, null, null, 3000f, 0.5f);
_transform.SetCoordinates(entity.Value, targetCoord);
_audio.PlayGlobal(demiplane.Comp.DepartureSound, entity.Value);
var ev = new CP14DemiplanEntityLeaveEvent(entity.Value);
RaiseLocalEvent(demiplane, ev);
return true;
}
private void OnDemiplanShutdown(Entity<CP14DemiplaneComponent> demiplane, ref ComponentShutdown args)
{
//We stop asynchronous generation of a demiplane early if for some reason this demiplane is deleted before generation is complete
foreach (var (job, cancelToken) in _expeditionJobs.ToArray())
{
if (job.DemiplaneMapUid == demiplane.Owner)
{
cancelToken.Cancel();
_expeditionJobs.Remove((job, cancelToken));
}
}
foreach (var exit in demiplane.Comp.ExitPoints)
{
RemoveDemiplanRandomExitPoint(demiplane, exit);
}
foreach (var entry in demiplane.Comp.EntryPoints)
{
RemoveDemiplanRandomEntryPoint(demiplane, entry);
}
}
}

View File

@@ -0,0 +1,17 @@
using Content.Shared._CP14.Demiplane.Components;
using Content.Shared._CP14.Demiplane.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.Demiplane.Components;
/// <summary>
/// Stores the data needed to generate a new demiplane
/// </summary>
[RegisterComponent, Access(typeof(CP14DemiplaneSystem))]
public sealed partial class CP14DemiplaneGeneratorDataComponent : Component
{
[DataField]
public ProtoId<CP14DemiplaneLocationPrototype>? LocationConfig;
//Generation settings
}

View File

@@ -0,0 +1,104 @@
using System.Threading;
using System.Threading.Tasks;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Procedural;
using Content.Shared._CP14.Demiplane.Prototypes;
using Content.Shared.Atmos;
using Content.Shared.Gravity;
using Robust.Shared.CPUJob.JobQueues;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.Demiplane.Jobs;
public sealed class CP14SpawnRandomDemiplaneJob : Job<bool>
{
private readonly IEntityManager _entManager;
//private readonly IGameTiming _timing;
private readonly IMapManager _mapManager;
private readonly IPrototypeManager _prototypeManager;
//private readonly AnchorableSystem _anchorable;
private readonly DungeonSystem _dungeon;
private readonly MetaDataSystem _metaData;
//private readonly SharedTransformSystem _xforms;
private readonly SharedMapSystem _map;
private readonly ProtoId<CP14DemiplaneLocationPrototype> _config;
private readonly int _seed;
public readonly EntityUid DemiplaneMapUid;
private readonly MapId _demiplaneMapId;
private readonly ISawmill _sawmill;
public CP14SpawnRandomDemiplaneJob(
double maxTime,
IEntityManager entManager,
ILogManager logManager,
IMapManager mapManager,
IPrototypeManager protoManager,
DungeonSystem dungeon,
MetaDataSystem metaData,
SharedMapSystem map,
EntityUid demiplaneMapUid,
MapId demiplaneMapId,
ProtoId<CP14DemiplaneLocationPrototype> config,
int seed,
CancellationToken cancellation = default) : base(maxTime, cancellation)
{
_entManager = entManager;
_mapManager = mapManager;
_prototypeManager = protoManager;
_dungeon = dungeon;
_metaData = metaData;
_map = map;
DemiplaneMapUid = demiplaneMapUid;
_demiplaneMapId = demiplaneMapId;
_config = config;
_seed = seed;
_sawmill = logManager.GetSawmill("cp14_expedition_job");
}
protected override async Task<bool> Process()
{
_sawmill.Debug("cp14_expedition", $"Spawning expedition mission with seed {0}");
var grid = _mapManager.CreateGridEntity(DemiplaneMapUid);
MetaDataComponent? metadata = null;
_metaData.SetEntityName(DemiplaneMapUid, "TODO: MAP Expedition name generation");
_metaData.SetEntityName(grid, "TODO: GRID Expedition name generation");
//Spawn island config
var expeditionConfig = _prototypeManager.Index(_config);
var locationConfig = _prototypeManager.Index(expeditionConfig.LocationConfig);
_dungeon.GenerateDungeon(locationConfig,
grid,
grid,
Vector2i.Zero,
_seed); //Not async, because dont work with biomespawner boilerplate
//Add map components
_entManager.AddComponents(DemiplaneMapUid, expeditionConfig.Components);
//Setup gravity
var gravity = _entManager.EnsureComponent<GravityComponent>(DemiplaneMapUid);
gravity.Enabled = true;
_entManager.Dirty(DemiplaneMapUid, gravity, metadata);
// Setup default atmos
var moles = new float[Atmospherics.AdjustedNumberOfGases];
moles[(int) Gas.Oxygen] = 21.824779f;
moles[(int) Gas.Nitrogen] = 82.10312f;
var mixture = new GasMixture(moles, Atmospherics.T20C);
_entManager.System<AtmosphereSystem>().SetMapAtmosphere(DemiplaneMapUid, false, mixture);
_mapManager.DoMapInitialize(_demiplaneMapId);
_mapManager.SetMapPaused(_demiplaneMapId, false);
//Dungeon
return true;
}
}

View File

@@ -0,0 +1,133 @@
using Content.Server._CP14.Demiplane;
using Content.Server.Mind;
using Content.Shared._CP14.Demiplane;
using Content.Shared._CP14.Demiplane.Components;
using Content.Shared._CP14.DemiplaneTraveling;
using Content.Shared.Ghost;
using Content.Shared.Movement.Pulling.Components;
using Robust.Shared.Random;
using Robust.Shared.Timing;
namespace Content.Server._CP14.DemiplaneTraveling;
public sealed partial class CP14DemiplaneTravelingSystem : EntitySystem
{
[Dependency] private readonly CP14DemiplaneSystem _demiplan = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly MindSystem _mind = default!;
[Dependency] private readonly IRobustRandom _random = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14DemiplaneRadiusTimedPasswayComponent, MapInitEvent>(RadiusMapInit);
SubscribeLocalEvent<CP14DemiplaneRiftOpenedComponent, CP14DemiplanPasswayUseDoAfter>(OnOpenRiftInteractDoAfter);
}
public override void Update(float frameTime)
{
base.Update(frameTime);
//Radius passway
var query = EntityQueryEnumerator<CP14DemiplaneRadiusTimedPasswayComponent, CP14DemiplaneRiftComponent>();
while (query.MoveNext(out var uid, out var passway, out var rift))
{
if (_timing.CurTime < passway.NextTimeTeleport)
continue;
passway.NextTimeTeleport = _timing.CurTime + passway.Delay;
HashSet<EntityUid> teleportedEnts = new();
var nearestEnts = _lookup.GetEntitiesInRange(uid, passway.Radius);
foreach (var ent in nearestEnts)
{
if (HasComp<GhostComponent>(ent))
continue;
if (!_mind.TryGetMind(ent, out var mindId, out var mind))
continue;
teleportedEnts.Add(ent);
}
while (teleportedEnts.Count > passway.MaxEntities)
{
teleportedEnts.Remove(_random.Pick(teleportedEnts));
}
var map = Transform(uid).MapUid;
if (TryComp<CP14DemiplaneComponent>(map, out var demiplan))
{
if (!_demiplan.TryGetDemiplanExitPoint((map.Value, demiplan), out _))
break;
foreach (var ent in teleportedEnts) //We in demiplan, tp OUT
{
if (TryComp<PullerComponent>(ent, out var puller))
_demiplan.TryTeleportOutDemiplane((map.Value, demiplan), puller.Pulling);
_demiplan.TryTeleportOutDemiplane((map.Value, demiplan), ent);
}
}
else
{
if (rift.Demiplan is not null)
{
if (!_demiplan.TryGetDemiplanEntryPoint(rift.Demiplan.Value, out _))
break;
foreach (var ent in teleportedEnts) //We out demiplan, tp IN
{
if (TryComp<PullerComponent>(ent, out var puller))
_demiplan.TryTeleportIntoDemiplane(rift.Demiplan.Value, puller.Pulling);
_demiplan.TryTeleportIntoDemiplane(rift.Demiplan.Value, ent);
}
}
}
QueueDel(uid);
}
}
private void RadiusMapInit(Entity<CP14DemiplaneRadiusTimedPasswayComponent> radiusPassWay, ref MapInitEvent args)
{
radiusPassWay.Comp.NextTimeTeleport = _timing.CurTime + radiusPassWay.Comp.Delay;
}
private void OnOpenRiftInteractDoAfter(Entity<CP14DemiplaneRiftOpenedComponent> passWay, ref CP14DemiplanPasswayUseDoAfter args)
{
if (args.Cancelled || args.Handled)
return;
var used = false;
var map = Transform(passWay).MapUid;
if (TryComp<CP14DemiplaneComponent>(map, out var demiplan))
{
if (TryComp<PullerComponent>(args.User, out var puller))
_demiplan.TryTeleportOutDemiplane((map.Value, demiplan), puller.Pulling);
used = _demiplan.TryTeleportOutDemiplane((map.Value, demiplan), args.User);
}
else
{
if (TryComp<CP14DemiplaneRiftComponent>(passWay, out var exitPoint) && exitPoint.Demiplan is not null)
{
if (TryComp<PullerComponent>(args.User, out var puller))
_demiplan.TryTeleportIntoDemiplane(exitPoint.Demiplan.Value, puller.Pulling);
used = _demiplan.TryTeleportIntoDemiplane(exitPoint.Demiplan.Value, args.User);
}
}
if (passWay.Comp.MaxUse > 0 && used)
{
passWay.Comp.MaxUse--;
if (passWay.Comp.MaxUse == 0)
QueueDel(passWay);
}
args.Handled = true;
}
}

View File

@@ -47,6 +47,12 @@ public sealed partial class CP14DayCycleComponent : Component
[DataDefinition, NetSerializable, Serializable]
public readonly partial record struct DayCycleEntry()
{
public DayCycleEntry(Color _color, TimeSpan _duration, string _period) : this()
{
Color = _color;
Duration = _duration;
Period = _period;
}
/// <summary>
/// The color of the world's lights at the beginning of this time of day
/// </summary>

View File

@@ -0,0 +1,92 @@
using Content.Shared._CP14.Demiplane.Components;
using Content.Shared._CP14.DemiplaneTraveling;
using Content.Shared.DoAfter;
using Content.Shared.Interaction;
using Robust.Shared.Player;
using Robust.Shared.Serialization;
namespace Content.Shared._CP14.Demiplane;
public abstract partial class CP14SharedDemiplaneSystem : EntitySystem
{
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14DemiplaneRiftOpenedComponent, InteractHandEvent>(OnDemiplanPasswayInteract);
SubscribeLocalEvent<CP14DemiplaneDestroyWithoutPlayersComponent, CP14DemiplanEntityEnterEvent>(OnEntityEnter);
SubscribeLocalEvent<CP14DemiplaneDestroyWithoutPlayersComponent, CP14DemiplanEntityLeaveEvent>(OnEntityLeave);
}
private void OnEntityLeave(Entity<CP14DemiplaneDestroyWithoutPlayersComponent> ent, ref CP14DemiplanEntityLeaveEvent args)
{
//это можно легко абузить, если игроки найдут способ выходить из
//демиплана другим способом. Лучше добавлять на игроков компонент, и тречить все смены карт у этого компонента
if (ent.Comp.Players.Contains(args.Player))
{
ent.Comp.Players.Remove(args.Player);
if (ent.Comp.Players.Count == 0)
{
QueueDel(ent);
}
}
}
private void OnEntityEnter(Entity<CP14DemiplaneDestroyWithoutPlayersComponent> ent, ref CP14DemiplanEntityEnterEvent args)
{
if (!TryComp<ActorComponent>(args.Player, out var actor))
return;
ent.Comp.Players.Add(args.Player);
}
private void OnDemiplanPasswayInteract(Entity<CP14DemiplaneRiftOpenedComponent> passway, ref InteractHandEvent args)
{
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager,
args.User,
passway.Comp.DoAfter,
new CP14DemiplanPasswayUseDoAfter(),
args.Target,
args.Target)
{
BreakOnDamage = true,
BreakOnMove = true,
BreakOnHandChange = true,
NeedHand = true,
MovementThreshold = 0.2f,
});
}
}
[Serializable, NetSerializable]
public sealed partial class CP14DemiplanPasswayUseDoAfter : SimpleDoAfterEvent
{
}
/// <summary>
/// Is invoked on the demiplane when new players enter. This only applies to rift entrances, any other methods will not be taken into account.
/// </summary>
public sealed class CP14DemiplanEntityEnterEvent : EntityEventArgs
{
public EntityUid Player;
public CP14DemiplanEntityEnterEvent(EntityUid player)
{
Player = player;
}
}
/// <summary>
/// Is invoked on the demiplane when some players left. This only applies to rift entrances, any other methods will not be taken into account.
/// </summary>
public sealed class CP14DemiplanEntityLeaveEvent : EntityEventArgs
{
public EntityUid Player;
public CP14DemiplanEntityLeaveEvent(EntityUid player)
{
Player = player;
}
}

View File

@@ -0,0 +1,38 @@
using Robust.Shared.Audio;
namespace Content.Shared._CP14.Demiplane.Components;
/// <summary>
/// Designates this entity as holding a demiplane.
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
public sealed partial class CP14DemiplaneComponent : Component
{
/// <summary>
/// All entities in the real world that are connected to this demiplane
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public HashSet<Entity<CP14DemiplaneRiftComponent>> ExitPoints = new();
/// <summary>
/// All entities in the demiplane in which the objects entered in the demiplane appear
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public HashSet<Entity<CP14DemiplaneRiftComponent>> EntryPoints = new();
/// <summary>
/// The sound of entering a demiplane, played locally to the player who entered it.
/// Consider more as an intro sound “You have entered the demiplane. Good luck.”
/// </summary>
[DataField("arrivalSound")]
public SoundSpecifier ArrivalSound = new SoundCollectionSpecifier("CP14DemiplaneIntro");
/// <summary>
/// The sound of exiting the demiplane, played locally to the player who exited the demiplane.
/// Consider it more as an ending sound
/// </summary>
[DataField("departureSound")]
public SoundSpecifier DepartureSound = new SoundCollectionSpecifier("CP14DemiplaneIntro");
}

View File

@@ -0,0 +1,11 @@
namespace Content.Shared._CP14.Demiplane.Components;
/// <summary>
/// Automatically deletes the demiplane if everyone who entered it, exited back out, or died.
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
public sealed partial class CP14DemiplaneDestroyWithoutPlayersComponent : Component
{
[DataField]
public HashSet<EntityUid> Players = new();
}

View File

@@ -0,0 +1,29 @@
namespace Content.Shared._CP14.Demiplane.Components;
/// <summary>
/// An entity that is the link between the demiplane and the real world. Depending on whether it is in the real world or in the demiplane
/// </summary>
[RegisterComponent, Access(typeof(CP14SharedDemiplaneSystem))]
public sealed partial class CP14DemiplaneRiftComponent : Component
{
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public Entity<CP14DemiplaneComponent>? Demiplan;
/// <summary>
/// Checks if the map on which this rift is initialized is a demiplane to automatically bind to it. QoL thing.
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public bool TryAutoLinkToMap = true;
/// <summary>
/// will this rift become one of the random entry or exit points of the demiplane
/// </summary>
[ViewVariables(VVAccess.ReadOnly)]
[DataField]
public bool ActiveTeleport = true;
[DataField]
public bool DeleteAfterDisconnect = true;
}

View File

@@ -0,0 +1,25 @@
using Content.Shared.Procedural;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Demiplane.Prototypes;
/// <summary>
/// procedural location template. The answer to the question “Where” as far as the combinatorics of the expedition is concerned.
/// </summary>
[Prototype("cp14DemiplaneLocation")]
public sealed partial class CP14DemiplaneLocationPrototype : IPrototype
{
[IdDataField] public string ID { get; } = default!;
[DataField(required: true)]
public ProtoId<DungeonConfigPrototype> LocationConfig;
[DataField]
public ComponentRegistry Components = new();
//Player faced description
//Tier restriction
//Some abstract restriction?
}

View File

@@ -0,0 +1,20 @@
namespace Content.Shared._CP14.DemiplaneTraveling;
/// <summary>
/// teleports a certain number of entities between demiplanes with a delay
/// </summary>
[RegisterComponent]
public sealed partial class CP14DemiplaneRadiusTimedPasswayComponent : Component
{
[DataField]
public int MaxEntities = 3;
[DataField]
public TimeSpan Delay = TimeSpan.FromSeconds(10f);
[DataField]
public float Radius = 3f;
[DataField]
public TimeSpan NextTimeTeleport = TimeSpan.Zero;
}

View File

@@ -0,0 +1,17 @@
namespace Content.Shared._CP14.DemiplaneTraveling;
/// <summary>
/// if located on an entity with a CP14DemiplanRiftComponent, allows users to move through that rift via an interaction with doAfter
/// </summary>
[RegisterComponent]
public sealed partial class CP14DemiplaneRiftOpenedComponent : Component
{
/// <summary>
/// The number of teleportations this teleporter can make before disappearing. Use the negative number to make infinite.
/// </summary>
[DataField]
public int MaxUse = -1;
[DataField]
public float DoAfter = 4f;
}

View File

@@ -666,6 +666,8 @@ public $TYPE$ $NAME$;</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Cooldowns/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Cryostorage/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Deadminned/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=demiplan/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=demiplane/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Dentification/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Diethylamine/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=doafter/@EntryIndexedValue">True</s:Boolean>

View File

@@ -0,0 +1,14 @@
- files: ["intro1.ogg"]
license: "CC-BY-4.0"
copyright: 'by PatrickLieberkind of Freesound.org'
source: "https://freesound.org/people/PatrickLieberkind/sounds/414266/"
- files: ["intro2.ogg"]
license: "CC0-1.0"
copyright: 'by DneproMan of Freesound.org.'
source: "https://freesound.org/people/DneproMan/sounds/256830/"
- files: ["intro3.ogg", "intro4.ogg"]
license: "CC0-1.0"
copyright: 'by Lumamorph of Freesound.org.'
source: "https://freesound.org/people/Lumamorph/sounds/634320/"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,319 @@
meta:
format: 6
postmapinit: false
tilemap:
0: Space
9: CP14FloorFoundation
13: CP14FloorGrass
14: CP14FloorGrassLight
15: CP14FloorGrassTall
10: CP14FloorOakWoodPlanksBig
12: CP14FloorOakWoodPlanksBroken
11: CP14FloorOakWoodPlanksCruciform
2: FloorAsteroidSand
6: FloorAsteroidSandUnvariantized
5: FloorAsteroidTile
8: FloorBrokenWood
82: FloorShuttleOrange
1: FloorShuttlePurple
89: FloorSteel
7: FloorWood
3: Plating
4: PlatingAsteroid
entities:
- proto: ""
entities:
- uid: 1
components:
- type: MetaData
- type: Transform
- type: Map
mapPaused: True
- type: PhysicsMap
- type: GridTree
- type: MovedGrids
- type: Broadphase
- type: OccluderTree
- type: MapGrid
chunks:
-1,-1:
ind: -1,-1
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA
version: 6
0,0:
ind: 0,0
tiles: CQAAAAAACQAAAAAACQAAAAAACQAAAAAACQAAAAAADQAAAAAADQAAAAAADQAAAAAADQAAAAAADQAAAAAADgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACQAAAAAACwAAAAAACgAAAAAACwAAAAAACQAAAAAADgAAAAAADgAAAAAADgAAAAAADQAAAAAADQAAAAAADQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACQAAAAAACgAAAAAACgAAAAAACgAAAAAADAAAAAAADwAAAAAADwAAAAAADgAAAAAADgAAAAAADgAAAAAADQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACQAAAAAACgAAAAAACwAAAAAACwAAAAAACQAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAADQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACQAAAAAACQAAAAAACQAAAAAACQAAAAAACQAAAAAADgAAAAAADgAAAAAADgAAAAAADQAAAAAADQAAAAAADgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAA
version: 6
0,1:
ind: 0,1
tiles: CgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA
version: 6
0,-1:
ind: 0,-1
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA
version: 6
-1,0:
ind: -1,0
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA
version: 6
-1,1:
ind: -1,1
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAA
version: 6
1,-1:
ind: 1,-1
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA
version: 6
1,0:
ind: 1,0
tiles: CgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA
version: 6
1,1:
ind: 1,1
tiles: CgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAA
version: 6
-1,2:
ind: -1,2
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
0,2:
ind: 0,2
tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
1,2:
ind: 1,2
tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
2,-1:
ind: 2,-1
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
2,0:
ind: 2,0
tiles: CgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAAAACgAAAAAACgAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
2,1:
ind: 2,1
tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
2,2:
ind: 2,2
tiles: AQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
- type: Gravity
gravityShakeSound: !type:SoundPathSpecifier
path: /Audio/Effects/alert.ogg
- type: DecalGrid
chunkCollection:
version: 2
nodes: []
- type: LoadedMap
- type: SpreaderGrid
- type: GridPathfinding
- type: RadiationGridResistance
- proto: CP14BarrelWater
entities:
- uid: 12
components:
- type: Transform
pos: 1.5020437,1.6221794
parent: 1
- proto: CP14FenceWoodSmallCorner
entities:
- uid: 26
components:
- type: Transform
pos: 10.5,0.5
parent: 1
- uid: 33
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 10.5,4.5
parent: 1
- proto: CP14FenceWoodSmallStraight
entities:
- uid: 21
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 6.5,4.5
parent: 1
- uid: 22
components:
- type: Transform
pos: 6.5,0.5
parent: 1
- uid: 23
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 5.5,4.5
parent: 1
- uid: 24
components:
- type: Transform
pos: 5.5,0.5
parent: 1
- uid: 25
components:
- type: Transform
pos: 7.5,0.5
parent: 1
- uid: 28
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 10.5,1.5
parent: 1
- proto: CP14SpawnerExpeditionLootCommon
entities:
- uid: 2
components:
- type: Transform
pos: 9.5,3.5
parent: 1
- uid: 5
components:
- type: Transform
pos: 2.5,3.5
parent: 1
- uid: 32
components:
- type: Transform
pos: 1.5,3.5
parent: 1
- uid: 34
components:
- type: Transform
pos: 6.5,1.5
parent: 1
- proto: CP14TableWooden
entities:
- uid: 4
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 1.5,3.5
parent: 1
- uid: 19
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 2.5,3.5
parent: 1
- proto: CP14TableWoodenFrame
entities:
- uid: 3
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 3.5,3.5
parent: 1
- proto: CP14WallmountTorch
entities:
- uid: 30
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 5.5,3.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 35
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 3.5,1.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: CP14WallWooden
entities:
- uid: 6
components:
- type: Transform
pos: 4.5,4.5
parent: 1
- uid: 7
components:
- type: Transform
pos: 4.5,0.5
parent: 1
- uid: 8
components:
- type: Transform
pos: 0.5,0.5
parent: 1
- uid: 9
components:
- type: Transform
pos: 0.5,3.5
parent: 1
- uid: 11
components:
- type: Transform
pos: 0.5,4.5
parent: 1
- uid: 14
components:
- type: Transform
pos: 0.5,1.5
parent: 1
- uid: 15
components:
- type: Transform
pos: 3.5,0.5
parent: 1
- uid: 16
components:
- type: Transform
pos: 4.5,1.5
parent: 1
- uid: 17
components:
- type: Transform
pos: 1.5,0.5
parent: 1
- uid: 27
components:
- type: Transform
pos: 0.5,2.5
parent: 1
- uid: 29
components:
- type: Transform
pos: 2.5,0.5
parent: 1
- uid: 31
components:
- type: Transform
pos: 4.5,3.5
parent: 1
- proto: CP14WindowWooden
entities:
- uid: 10
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 1.5,4.5
parent: 1
- uid: 13
components:
- type: Transform
pos: 3.5,4.5
parent: 1
- uid: 18
components:
- type: Transform
pos: 2.5,4.5
parent: 1
- proto: CP14WoodenDoor
entities:
- uid: 20
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 4.5,2.5
parent: 1
...

View File

@@ -84229,7 +84229,7 @@ entities:
- type: Transform
pos: 31.23764,34.036747
parent: 1
- proto: WallPlastitaniumIndestructible
- proto: CP14WallStoneIndestructable
entities:
- uid: 4
components:

View File

@@ -0,0 +1,110 @@
- type: entity
parent: MarkerBase
id: CP14SpawnerExpeditionLootCommon
name: Expedition common loot spawner
categories: [ ForkFiltered ]
components:
- type: Sprite
layers:
- state: green
- sprite: _CP14/Objects/Materials/copper_bar.rsi
state: bar_3
- type: EntityTableSpawner
table: !type:NestedSelector
prob: 1.0
tableId: CP14TableExpeditionLootCommon
- type: entityTable
id: CP14TableExpeditionLootCommon
table: !type:GroupSelector
children:
# Common
- !type:GroupSelector
weight: 75
children:
- id: CP14Wallet
- !type:GroupSelector
children:
- id: CP14SilverCoin1
weight: 0.1
- id: CP14CopperCoin
weight: 0.1
- id: CP14CopperCoin5
weight: 0.5
- id: CP14CopperCoin1
weight: 1
- id: CP14Wheat
- !type:GroupSelector
children:
- id: CP14DyeRed
- id: CP14DyeYellow
- id: CP14DyeBlue
- id: CP14DyeGreen
- id: CP14DyePurple
- id: CP14DyeBlack
- !type:GroupSelector
children:
- id: CP14SeedWheat
- id: CP14SeedPumpkin
- id: CP14SeedCabbage
- id: CP14SeedCucumber
- id: CP14SeedTomato
- !type:GroupSelector
children:
- id: CP14BloodFlower
- id: CP14AgaricMushroom
- id: CP14WildSage
- id: CP14QuartzShard
- id: CP14BlueAmanita
- id: CP14Dayflin
- id: CP14CopperBar1
- id: CP14IronBar1
- id: CP14EnergyCrystalSmall
- id: CP14Bucket
- id: CP14OldLantern
- id: CP14Scissors
- id: CP14BaseSharpeningStone
- id: CP14Rope
weight: 2
# Rare
- !type:GroupSelector
weight: 25
children:
- !type:GroupSelector
children:
- id: CP14VialSmallBloodFlowerSap
- id: CP14VialSmallAgaricMushroom
- id: CP14VialSmallGroundQuartz
- id: CP14VialSmallWildSage
- id: CP14VialSmallBlueAmanita
- id: CP14VialTinyChromiumSlime
- id: CP14VialTinyLumiMushroom
- !type:GroupSelector
children:
- id: CP14ChromiumSlime
- id: CP14LumiMushroom
- id: CP14SilverCoin5
- id: CP14GoldBar1
- id: CP14EnergyCrystalMedium
- type: entityTable
id: CP14TableBureaucracy
table: !type:GroupSelector
children:
# Common
- !type:GroupSelector
weight: 75
children:
- id: CP14Paper
# Rare
- !type:GroupSelector
weight: 20
children:
- id: CP14PaperFolderBlue
- id: CP14PaperFolderRed
- id: CP14PenFeather
# Very rare
- !type:GroupSelector
weight: 5
children:
- id: CP14Inkwell

View File

@@ -88,3 +88,4 @@
volume: -8
variation: 0.125
- type: SoundWhileAlive
- type: FloorOcclusion

View File

@@ -95,6 +95,7 @@
type: StrippableBoundUserInterface
- type: InventorySlots
- type: ContainerContainer
- type: FloorOcclusion
- type: Inventory
templateId: CP14Partial
femaleDisplacements:

View File

@@ -3,6 +3,7 @@
description: A small wallet, handy for storing coins.
id: CP14Wallet
parent: BaseStorageItem
suffix: Empty
categories: [ ForkFiltered ]
components:
- type: Sprite

View File

@@ -32,6 +32,20 @@
min: 2
max: 3
- type: entity
id: CP14WallStoneIndestructable
name: dense rock
parent: CP14BaseWall
suffix: Undestructable
description: An extremely durable stone. Your tools don't seem to be enough to break through it.
components:
- type: Sprite
sprite: _CP14/Structures/Walls/Natural/cave_stone_strong.rsi
- type: Icon
sprite: _CP14/Structures/Walls/Natural/cave_stone_strong.rsi
- type: IconSmooth
base: wall
- type: entity
id: CP14WallDirt
name: earth wall

View File

@@ -0,0 +1,105 @@
- type: entity
parent: BaseItem
id: CP14BaseSubdimensionalKey
abstract: true
categories: [ ForkFiltered ]
name: demiplan key
description: The core that connects the real world to the demiplane. Use it to open a temporary passage to the other world.
components:
- type: Sprite
drawdepth: Effects
sprite: /Textures/_CP14/Structures/Dungeon/demiplan_rift_core.rsi
layers:
- state: core
shader: unshaded
- type: entity
id: CP14SubdimensionalKey
parent: CP14BaseSubdimensionalKey
components:
- type: CP14DemiplaneGeneratorData
- type: CP14DemiplaneRift
- type: Sprite
state: key1
- type: entity
id: CP14DemiplanRiftCore
categories: [ ForkFiltered ]
name: demiplan rift core
description: A subtle connection between the real world and the demiplane where the adventurers went. Sooner or later they will return from there.
components:
- type: CP14DemiplaneRift
- type: Transform
anchored: True
- type: Clickable
- type: Physics
canCollide: false
bodyType: Static
- type: Sprite
drawdepth: Effects
sprite: /Textures/_CP14/Structures/Dungeon/demiplan_rift_core.rsi
layers:
- state: core
shader: unshaded
- state: pulse
shader: unshaded
- type: PointLight
radius: 2
energy: 2
color: "#371c5c"
netsync: false
- type: entity
id: CP14DemiplaneTimedRadiusPassway
parent: CP14DemiplanRiftCore
name: pulsating demiplane rift
description: This rift is gaining strength, and will trap all nearby creatures in a demiplane in a second!
components:
- type: CP14DemiplaneRift
activeTeleport: false
- type: CP14DemiplaneRadiusTimedPassway
maxEntities: 3
delay: 4
- type: Sprite
drawdepth: Effects
sprite: /Textures/_CP14/Structures/Dungeon/demiplan_rift.rsi
layers:
- state: pulse
shader: unshaded
- type: PointLight
radius: 8
- type: SingularityDistortion
falloffPower: 1.5
intensity: 50
- type: entity
id: CP14DemiplanePassway
parent: CP14DemiplanRiftCore
name: demiplane rift
description: A gap in space that allows you to travel between world and demiplanes.
components:
- type: CP14DemiplaneRiftOpened
- type: CP14DemiplaneRift
activeTeleport: false
- type: Sprite
drawdepth: Effects
sprite: /Textures/_CP14/Structures/Dungeon/demiplan_rift.rsi
layers:
- state: anom
shader: unshaded
- type: SingularityDistortion
falloffPower: 1.5
intensity: 50
- type: entity
parent: MarkerBase
id: CP14DemiplaneEntryPointMarker
name: demiplane entry point
categories: [ ForkFiltered ]
components:
- type: Sprite
layers:
- state: green
- sprite: /Textures/_CP14/Structures/Dungeon/demiplan_rift.rsi
state: pulse
- type: CP14DemiplaneRift

View File

@@ -0,0 +1,159 @@
- type: cp14DemiplaneLocation
id: T1Caves
locationConfig: CP14ExpeditionCaves
components:
- type: CP14WeatherController
entries:
- visuals: CP14Mist
- type: dungeonConfig
id: CP14ExpeditionCaves
layers:
# Masks (from center to border!)
- !type:PrototypeDunGen
proto: CP14ExpeditionCavesFloorMaskBorder
- !type:PrototypeDunGen
proto: CP14ExpeditionCavesFloorMaskStone
- !type:PrototypeDunGen
proto: CP14ExpeditionCavesFloorMaskAir
# Exterior rooms
#here
# Biome Spawner fills (from border to center!) order is very important! For inexplicable reasons, only a certain sequence works!
- !type:PrototypeDunGen
proto: CP14ExpeditionCavesFillBorder
- !type:PrototypeDunGen
proto: CP14ExpeditionCavesFillAir
- !type:PrototypeDunGen
proto: CP14ExpeditionCavesFillCave
# Ore and resources
- !type:OreDunGen
replacement: CP14WallStone
entity: CP14WallStoneGoldOre
count: 10
minGroupSize: 10
maxGroupSize: 15
- !type:OreDunGen
replacement: CP14WallStone
entity: CP14WallStoneIronOre
count: 10
minGroupSize: 10
maxGroupSize: 15
- !type:OreDunGen
replacement: CP14WallStone
entity: CP14WallStoneCopperOre
count: 10
minGroupSize: 10
maxGroupSize: 15
# Mobs
- !type:MobsDunGen
minCount: 5
maxCount: 10
groups:
- id: CP14SpawnMobUndeadZombie
amount: 1
# Enter and Exit
- !type:MobsDunGen
minCount: 1
maxCount: 2
groups:
- id: CP14DemiplaneEntryPointMarker
amount: 1
- !type:MobsDunGen
minCount: 2
maxCount: 2
groups:
- id: CP14DemiplanePassway
amount: 1
# Loot
- !type:EntityTableDunGen
minCount: 10
maxCount: 25
table: !type:NestedSelector
tableId: CP14TableExpeditionLootCommon
- type: dungeonConfig
id: CP14ExpeditionCavesFloorMaskAir
layers:
- !type:NoiseDistanceDunGen
size: 80, 80
distanceConfig: !type:DunGenEuclideanSquaredDistance
blendWeight: 0.5
layers:
- tile: CP14FloorGrass
threshold: 0.50
noise:
frequency: 0.030
noiseType: OpenSimplex2
fractalType: FBm
octaves: 5
lacunarity: 2
gain: 0.5
- type: dungeonConfig
id: CP14ExpeditionCavesFloorMaskStone
layers:
- !type:NoiseDistanceDunGen
size: 120, 120
distanceConfig: !type:DunGenEuclideanSquaredDistance
blendWeight: 0.9
layers:
- tile: CP14FloorSand
threshold: 0.50
noise:
frequency: 0.010
noiseType: OpenSimplex2
fractalType: FBm
octaves: 5
lacunarity: 2
gain: 0.5
- type: dungeonConfig
id: CP14ExpeditionCavesFloorMaskBorder
layers:
- !type:NoiseDistanceDunGen
size: 130, 130
distanceConfig: !type:DunGenEuclideanSquaredDistance
blendWeight: 1
layers:
- tile: CP14FloorBase
threshold: 0.50
noise:
frequency: 0.010
noiseType: OpenSimplex2
fractalType: FBm
octaves: 5
lacunarity: 2
gain: 0.5
- type: dungeonConfig
id: CP14ExpeditionCavesFillAir
reserveTiles: true
data:
entities:
Fill: CP14BiomeSpawnerCaveEmpty
layers:
- !type:FillGridDunGen
allowedTiles:
- CP14FloorGrass
- type: dungeonConfig
id: CP14ExpeditionCavesFillCave
reserveTiles: true
data:
entities:
Fill: CP14BiomeSpawnerCave
layers:
- !type:FillGridDunGen
allowedTiles:
- CP14FloorSand
- type: dungeonConfig
id: CP14ExpeditionCavesFillBorder
reserveTiles: true
data:
entities:
Fill: CP14WallStoneIndestructable
layers:
- !type:FillGridDunGen
allowedTiles:
- CP14FloorBase

View File

@@ -0,0 +1,179 @@
- type: cp14DemiplaneLocation
id: T1GrasslandIsland
locationConfig: CP14ExpeditionGrasslandIsland
components:
- type: MapLight
ambientLightColor: "#BFEEFFFF"
- type: CP14MapFloorOccluder
- type: Parallax
parallax: CP14Ocean
- type: CP14WeatherController
entries:
- visuals: CP14Rain
- visuals: CP14Storm
- visuals: CP14Mist
- type: CP14DayCycle
timeEntries:
- duration: 80
color: '#754A4AFF'
- duration: 80
color: '#E0BA87FF'
- duration: 80
color: '#BFEEFFFF'
- period: Night
duration: 80
color: '#385163FF'
- period: Night
duration: 80
color: '#060D12FF'
- period: Night
duration: 80
color: '#000000FF'
- period: Night
duration: 80
color: '#000000FF'
- duration: 80
color: '#120906FF'
- type: dungeonConfig
id: CP14ExpeditionGrasslandIsland
layers:
# Masks (from center to border!)
- !type:PrototypeDunGen
proto: CP14ExpeditionGrasslandIslandFloorMaskSand
- !type:PrototypeDunGen
proto: CP14ExpeditionGrasslandIslandFloorMaskGrass
- !type:PrototypeDunGen
proto: CP14ExpeditionGrasslandIslandFloorMaskStone
# Exterior rooms
- !type:EntityTableDunGen
minCount: 1
maxCount: 2
table:
id: CP14GrasslandIslandExteriorRoomSpawner
# Biome Spawner fills (from border to center!) order is very important! For inexplicable reasons, only a certain sequence works!
- !type:PrototypeDunGen
proto: CP14ExpeditionGrasslandIslandFillGrassland
- !type:PrototypeDunGen
proto: CP14ExpeditionGrasslandIslandFillCave
# Ore and resources
- !type:OreDunGen
replacement: CP14WallStone
entity: CP14WallStoneGoldOre
count: 10
minGroupSize: 10
maxGroupSize: 15
- !type:OreDunGen
replacement: CP14WallStone
entity: CP14WallStoneIronOre
count: 10
minGroupSize: 10
maxGroupSize: 15
- !type:OreDunGen
replacement: CP14WallStone
entity: CP14WallStoneCopperOre
count: 10
minGroupSize: 10
maxGroupSize: 15
# Mobs
- !type:MobsDunGen
minCount: 2
maxCount: 5
groups:
- id: CP14SpawnMobDinoYumkaraptor
amount: 1
# Enter and Exit
- !type:MobsDunGen
minCount: 1
maxCount: 2
groups:
- id: CP14DemiplaneEntryPointMarker
amount: 1
- !type:MobsDunGen
minCount: 2
maxCount: 2
groups:
- id: CP14DemiplanePassway
amount: 1
# Loot
- !type:EntityTableDunGen
minCount: 5
maxCount: 20
table: !type:NestedSelector
tableId: CP14TableExpeditionLootCommon
- type: dungeonConfig
id: CP14ExpeditionGrasslandIslandFloorMaskStone
layers:
- !type:NoiseDistanceDunGen
size: 80, 80
distanceConfig: !type:DunGenEuclideanSquaredDistance
blendWeight: 0.5
layers:
- tile: CP14FloorBase
threshold: 0.50
noise:
frequency: 0.010
noiseType: OpenSimplex2
fractalType: FBm
octaves: 5
lacunarity: 2
gain: 0.5
- type: dungeonConfig
id: CP14ExpeditionGrasslandIslandFloorMaskGrass
layers:
- !type:NoiseDistanceDunGen
size: 120, 120
distanceConfig: !type:DunGenEuclideanSquaredDistance
blendWeight: 0.6
layers:
- tile: CP14FloorGrass
threshold: 0.50
noise:
frequency: 0.010
noiseType: OpenSimplex2
fractalType: FBm
octaves: 5
lacunarity: 2
gain: 0.5
- type: dungeonConfig
id: CP14ExpeditionGrasslandIslandFloorMaskSand
layers:
- !type:NoiseDistanceDunGen
size: 130, 130
distanceConfig: !type:DunGenEuclideanSquaredDistance
blendWeight: 0.7
layers:
- tile: CP14FloorSand
threshold: 0.50
noise:
frequency: 0.010
noiseType: OpenSimplex2
fractalType: FBm
octaves: 5
lacunarity: 2
gain: 0.5
- type: dungeonConfig
id: CP14ExpeditionGrasslandIslandFillGrassland
reserveTiles: true
data:
entities:
Fill: CP14BiomeSpawnerGrassland
layers:
- !type:FillGridDunGen
allowedTiles:
- CP14FloorGrass
- type: dungeonConfig
id: CP14ExpeditionGrasslandIslandFillCave
reserveTiles: true
data:
entities:
Fill: CP14BiomeSpawnerCave
layers:
- !type:FillGridDunGen
allowedTiles:
- CP14FloorBase

View File

@@ -0,0 +1,23 @@
- type: Tag
id: CP14GrasslandIsland
- type: entity
id: CP14GrasslandIslandExteriorRoomSpawner
categories: [ ForkFiltered ]
parent: BaseRoomMarker
name: Grassland island exterior room spawner
components:
- type: RoomFill
size: 11,5
roomWhitelist:
tags:
- CP14GrasslandIsland
# 11x5
- type: dungeonRoom
id: CP14GrasslandIslandExterior_11x5_a
size: 11,5
atlas: /Maps/_CP14/Dungeon/grassland_island_exterior.yml
offset: 0,0
tags:
- CP14GrasslandIsland

View File

@@ -3,7 +3,7 @@
layers:
- !type:BiomeTileLayer
threshold: -1.0
tile: CP14FloorBase
tile: CP14FloorBase
- type: biomeTemplate
id: CP14CavesFloor
@@ -46,20 +46,6 @@
layers:
- !type:BiomeMetaLayer
template: CP14CavesFloor
# Lakes start
- !type:BiomeEntityLayer
allowedTiles:
- CP14FloorBase
threshold: 0.8
noise:
seed: 14
noiseType: OpenSimplex2
fractalType: FBm
frequency: 0.01
domainWarpType: OpenSimplex2
domainWarpAmp: 150
entities:
- CP14FloorWater
#Walls
- !type:BiomeEntityLayer
threshold: -0.75
@@ -75,37 +61,17 @@
- CP14FloorBase
entities:
- CP14WallStone
#Ores
# Lakes
- !type:BiomeEntityLayer
threshold: 0.7
noise:
seed: 10
noiseType: OpenSimplex2
fractalType: FBm
frequency: 3
allowedTiles:
- CP14FloorBase
entities:
- CP14WallStoneGoldOre
- !type:BiomeEntityLayer
threshold: 0.6
threshold: 0.8
noise:
seed: 15
seed: 14
noiseType: OpenSimplex2
fractalType: FBm
frequency: 3
allowedTiles:
- CP14FloorBase
frequency: 0.01
domainWarpType: OpenSimplex2
domainWarpAmp: 150
entities:
- CP14WallStoneIronOre
- !type:BiomeEntityLayer
threshold: 0.5
noise:
seed: 20
noiseType: OpenSimplex2
fractalType: FBm
frequency: 3
allowedTiles:
- CP14FloorBase
entities:
- CP14WallStoneCopperOre
- CP14FloorWater

View File

@@ -314,49 +314,6 @@
seed: 14
frequency: 0.02
fractalType: None
# River start
- !type:BiomeTileLayer
tile: CP14FloorDirt
threshold: 0.93
noise:
seed: 3
noiseType: OpenSimplex2
frequency: 0.003
lacunarity: 1.50
gain: 0.12
fractalType: Ridged
octaves: 1
- !type:BiomeEntityLayer
allowedTiles:
- CP14FloorDirt
- CP14FloorGrass
threshold: 0.91
noise:
seed: 3
noiseType: OpenSimplex2
frequency: 0.003
lacunarity: 1.50
gain: 0.12
fractalType: Ridged
octaves: 1
entities:
- CP14RandomSpawnerGatherAgaricShroom
- !type:BiomeEntityLayer
allowedTiles:
- CP14FloorDirt
- CP14FloorSand
threshold: 0.93
noise:
seed: 3
noiseType: OpenSimplex2
frequency: 0.003
lacunarity: 1.50
gain: 0.12
fractalType: Ridged
octaves: 1
entities:
- CP14FloorWater
# River end
# Lakes start
- !type:BiomeTileLayer
tile: CP14FloorSand

View File

@@ -1,6 +0,0 @@
- type: soundCollection
id: CP14LobbyMusic
files:
- /Audio/_CP14/Lobby/crystal.ogg
- /Audio/_CP14/Lobby/eldermourne.ogg
- /Audio/_CP14/Lobby/arcane_winds.ogg

View File

@@ -0,0 +1,14 @@
- type: soundCollection
id: CP14LobbyMusic
files:
- /Audio/_CP14/Lobby/crystal.ogg
- /Audio/_CP14/Lobby/eldermourne.ogg
- /Audio/_CP14/Lobby/arcane_winds.ogg
- type: soundCollection
id: CP14DemiplaneIntro
files:
- /Audio/_CP14/Ambience/Demiplane/intro1.ogg
- /Audio/_CP14/Ambience/Demiplane/intro2.ogg
- /Audio/_CP14/Ambience/Demiplane/intro3.ogg
- /Audio/_CP14/Ambience/Demiplane/intro4.ogg

View File

@@ -1,12 +1,12 @@
# 4 Priority - Special
- type: ambientMusic
id: CP14Ritual
id: CP14Magic
sound:
params:
volume: -12
collection: CP14AmbienceMagic
rules: NearRitual
rules: NearMagic
priority: 4
# 3 Priority - Departments
@@ -76,7 +76,7 @@
- !type:AlwaysTrueRule
- type: rules
id: NearRitual
id: NearMagic
rules:
- !type:NearbyEntitiesRule
count: 1
@@ -84,6 +84,7 @@
components:
- CP14MagicRitualPhase
- CP14MagicRitual
- CP14DemiplanPassway
range: 6
- type: rules

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,34 @@
{
"version": 1,
"license": "CC0-1.0",
"copyright": "Created by TheShuEd (github) for ss14",
"size": {
"x": 32,
"y": 48
},
"states": [
{
"name": "anom",
"delays": [
[
0.25625,
0.25625,
0.25625
]
]
},
{
"name": "pulse",
"delays": [
[
0.15625,
0.15625,
0.15625,
0.15625,
0.15625,
0.15625
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

View File

@@ -0,0 +1,25 @@
{
"version": 1,
"license": "CC0-1.0",
"copyright": "Created by TheShuEd (github) for ss14",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "core"
},
{
"name": "pulse",
"delays": [
[
0.15625,
0.15625,
0.15625,
0.15625
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CLA",
"copyright": "by TheShuEd (discord)",
"size": {
"x": 48,
"y": 48
},
"states": [
{
"name": "rift"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@@ -0,0 +1,46 @@
{
"version": 1,
"size": {
"x": 32,
"y": 64
},
"license": "CLA",
"copyright": "Created by TheShuEd (Discord) for CrystallPunk14",
"states": [
{
"name": "wall0",
"directions": 4
},
{
"name": "wall1",
"directions": 4
},
{
"name": "wall2",
"directions": 4
},
{
"name": "wall3",
"directions": 4
},
{
"name": "wall4",
"directions": 4
},
{
"name": "wall5",
"directions": 4
},
{
"name": "wall6",
"directions": 4
},
{
"name": "wall7",
"directions": 4
},
{
"name": "full"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB