IFF console (#10504)

* IFF console

* Silly

* Color

* a

* Const bool default

* Full stealth as well coz dork.

* Infiltrator update
This commit is contained in:
metalgearsloth
2022-08-12 02:58:44 +10:00
committed by GitHub
parent 6feb10502f
commit b4248482c5
20 changed files with 702 additions and 113 deletions

View File

@@ -0,0 +1,64 @@
using Content.Client.Shuttles.UI;
using Content.Shared.Shuttles.BUIStates;
using Content.Shared.Shuttles.Events;
using JetBrains.Annotations;
using Robust.Client.GameObjects;
namespace Content.Client.Shuttles.BUI;
[UsedImplicitly]
public sealed class IFFConsoleBoundUserInterface : BoundUserInterface
{
private IFFConsoleWindow? _window;
public IFFConsoleBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey)
{
}
protected override void Open()
{
base.Open();
_window = new IFFConsoleWindow();
_window.OnClose += Close;
_window.ShowIFF += SendIFFMessage;
_window.ShowVessel += SendVesselMessage;
_window.OpenCenteredLeft();
}
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);
if (state is not IFFConsoleBoundUserInterfaceState bState)
return;
_window?.UpdateState(bState);
}
private void SendIFFMessage(bool obj)
{
SendMessage(new IFFShowIFFMessage()
{
Show = obj,
});
}
private void SendVesselMessage(bool obj)
{
SendMessage(new IFFShowVesselMessage()
{
Show = obj,
});
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
_window?.Close();
_window = null;
}
}
}

View File

@@ -1,6 +1,6 @@
<userInterface:FancyWindow xmlns="https://spacestation14.io" <userInterface:FancyWindow xmlns="https://spacestation14.io"
xmlns:userInterface="clr-namespace:Content.Client.UserInterface" xmlns:userInterface="clr-namespace:Content.Client.UserInterface"
Title="Emergency Shuttle Console" Title="{Loc 'emergency-shuttle-console-window-title'}"
MinSize="400 400"> MinSize="400 400">
<BoxContainer Orientation="Vertical" <BoxContainer Orientation="Vertical"
Margin="5"> Margin="5">

View File

@@ -0,0 +1,20 @@
<userInterface:FancyWindow xmlns="https://spacestation14.io"
xmlns:userInterface="clr-namespace:Content.Client.UserInterface"
Title="{Loc 'iff-console-window-title'}"
MinSize="200 200">
<BoxContainer Orientation="Vertical" HorizontalExpand="True">
<GridContainer Margin="4 0 0 0" Columns="2">
<Label Name="ShowIFFLabel" Text="{Loc 'iff-console-show-iff-label'}" HorizontalExpand="True" StyleClasses="StatusFieldTitle" />
<BoxContainer Orientation="Horizontal" MinWidth="120">
<Button Name="ShowIFFOnButton" Text="{Loc 'iff-console-on'}" StyleClasses="OpenRight" />
<Button Name="ShowIFFOffButton" Text="{Loc 'iff-console-off'}" StyleClasses="OpenLeft" />
</BoxContainer>
<Label Name="ShowVesselLabel" Text="{Loc 'iff-console-show-vessel-label'}" HorizontalExpand="True" StyleClasses="StatusFieldTitle" />
<BoxContainer Orientation="Horizontal" MinWidth="120">
<Button Name="ShowVesselOnButton" Text="{Loc 'iff-console-on'}" StyleClasses="OpenRight" />
<Button Name="ShowVesselOffButton" Text="{Loc 'iff-console-off'}" StyleClasses="OpenLeft" />
</BoxContainer>
</GridContainer>
</BoxContainer>
</userInterface:FancyWindow>

View File

@@ -0,0 +1,86 @@
using Content.Client.Computer;
using Content.Client.UserInterface;
using Content.Shared.Shuttles.BUIStates;
using Content.Shared.Shuttles.Components;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.Shuttles.UI;
[GenerateTypedNameReferences]
public sealed partial class IFFConsoleWindow : FancyWindow,
IComputerWindow<IFFConsoleBoundUserInterfaceState>
{
private readonly ButtonGroup _showIFFButtonGroup = new();
private readonly ButtonGroup _showVesselButtonGroup = new();
public event Action<bool>? ShowIFF;
public event Action<bool>? ShowVessel;
public IFFConsoleWindow()
{
RobustXamlLoader.Load(this);
ShowIFFOffButton.Group = _showIFFButtonGroup;
ShowIFFOnButton.Group = _showIFFButtonGroup;
ShowIFFOnButton.OnPressed += args => ShowIFFPressed(true);
ShowIFFOffButton.OnPressed += args => ShowIFFPressed(false);
ShowVesselOffButton.Group = _showVesselButtonGroup;
ShowVesselOnButton.Group = _showVesselButtonGroup;
ShowVesselOnButton.OnPressed += args => ShowVesselPressed(true);
ShowVesselOffButton.OnPressed += args => ShowVesselPressed(false);
}
private void ShowIFFPressed(bool pressed)
{
ShowIFF?.Invoke(pressed);
}
private void ShowVesselPressed(bool pressed)
{
ShowVessel?.Invoke(pressed);
}
public void UpdateState(IFFConsoleBoundUserInterfaceState state)
{
if ((state.AllowedFlags & IFFFlags.HideLabel) != 0x0)
{
ShowIFFOffButton.Disabled = false;
ShowIFFOnButton.Disabled = false;
if ((state.Flags & IFFFlags.HideLabel) != 0x0)
{
ShowIFFOffButton.Pressed = true;
}
else
{
ShowIFFOnButton.Pressed = true;
}
}
else
{
ShowIFFOffButton.Disabled = true;
ShowIFFOnButton.Disabled = true;
}
if ((state.AllowedFlags & IFFFlags.Hide) != 0x0)
{
ShowVesselOffButton.Disabled = false;
ShowVesselOnButton.Disabled = false;
if ((state.Flags & IFFFlags.Hide) != 0x0)
{
ShowVesselOffButton.Pressed = true;
}
else
{
ShowVesselOnButton.Pressed = true;
}
}
else
{
ShowVesselOffButton.Disabled = true;
ShowVesselOnButton.Disabled = true;
}
}
}

View File

@@ -1,5 +1,6 @@
using Content.Client.Stylesheets; using Content.Client.Stylesheets;
using Content.Shared.Shuttles.BUIStates; using Content.Shared.Shuttles.BUIStates;
using Content.Shared.Shuttles.Components;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
@@ -210,6 +211,15 @@ public sealed class RadarControl : Control
continue; continue;
} }
_entManager.TryGetComponent<IFFComponent>(grid.GridEntityId, out var iff);
// Hide it entirely.
if (iff != null &&
(iff.Flags & IFFFlags.Hide) != 0x0)
{
continue;
}
shown.Add(grid.GridEntityId); shown.Add(grid.GridEntityId);
var name = metaQuery.GetComponent(grid.GridEntityId).EntityName; var name = metaQuery.GetComponent(grid.GridEntityId).EntityName;
@@ -220,8 +230,11 @@ public sealed class RadarControl : Control
var gridFixtures = fixturesQuery.GetComponent(grid.GridEntityId); var gridFixtures = fixturesQuery.GetComponent(grid.GridEntityId);
var gridMatrix = gridXform.WorldMatrix; var gridMatrix = gridXform.WorldMatrix;
Matrix3.Multiply(in gridMatrix, in offsetMatrix, out var matty); Matrix3.Multiply(in gridMatrix, in offsetMatrix, out var matty);
var color = iff?.Color ?? IFFComponent.IFFColor;
if (ShowIFF) if (ShowIFF &&
(iff == null && IFFComponent.ShowIFFDefault ||
(iff.Flags & IFFFlags.HideLabel) == 0x0))
{ {
var gridBounds = grid.LocalAABB; var gridBounds = grid.LocalAABB;
Label label; Label label;
@@ -231,7 +244,6 @@ public sealed class RadarControl : Control
label = new Label() label = new Label()
{ {
HorizontalAlignment = HAlignment.Left, HorizontalAlignment = HAlignment.Left,
FontColorOverride = Color.Aquamarine,
}; };
_iffControls[grid.GridEntityId] = label; _iffControls[grid.GridEntityId] = label;
@@ -242,6 +254,7 @@ public sealed class RadarControl : Control
label = (Label) control; label = (Label) control;
} }
label.FontColorOverride = color;
var gridCentre = matty.Transform(gridBody.LocalCenter); var gridCentre = matty.Transform(gridBody.LocalCenter);
gridCentre.Y = -gridCentre.Y; gridCentre.Y = -gridCentre.Y;
var distance = gridCentre.Length; var distance = gridCentre.Length;
@@ -267,7 +280,7 @@ public sealed class RadarControl : Control
} }
// Detailed view // Detailed view
DrawGrid(handle, matty, gridFixtures, Color.Aquamarine); DrawGrid(handle, matty, gridFixtures, color);
DrawDocks(handle, grid.GridEntityId, matty); DrawDocks(handle, grid.GridEntityId, matty);
} }

View File

@@ -0,0 +1,14 @@
using Content.Server.Shuttles.Systems;
using Content.Shared.Shuttles.Components;
namespace Content.Server.Shuttles.Components;
[RegisterComponent, Access(typeof(ShuttleSystem))]
public sealed class IFFConsoleComponent : Component
{
/// <summary>
/// Flags that this console is allowed to set.
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField("allowedFlags")]
public IFFFlags AllowedFlags = IFFFlags.HideLabel;
}

View File

@@ -0,0 +1,91 @@
using Content.Server.Shuttles.Components;
using Content.Shared.Shuttles.BUIStates;
using Content.Shared.Shuttles.Components;
using Content.Shared.Shuttles.Events;
namespace Content.Server.Shuttles.Systems;
public sealed partial class ShuttleSystem
{
private void InitializeIFF()
{
SubscribeLocalEvent<IFFConsoleComponent, AnchorStateChangedEvent>(OnIFFConsoleAnchor);
SubscribeLocalEvent<IFFConsoleComponent, IFFShowIFFMessage>(OnIFFShow);
SubscribeLocalEvent<IFFConsoleComponent, IFFShowVesselMessage>(OnIFFShowVessel);
}
private void OnIFFShow(EntityUid uid, IFFConsoleComponent component, IFFShowIFFMessage args)
{
if (!TryComp<TransformComponent>(uid, out var xform) || xform.GridUid == null ||
(component.AllowedFlags & IFFFlags.HideLabel) == 0x0)
{
return;
}
if (!args.Show)
{
AddIFFFlag(xform.GridUid.Value, IFFFlags.HideLabel);
}
else
{
RemoveIFFFlag(xform.GridUid.Value, IFFFlags.HideLabel);
}
}
private void OnIFFShowVessel(EntityUid uid, IFFConsoleComponent component, IFFShowVesselMessage args)
{
if (!TryComp<TransformComponent>(uid, out var xform) || xform.GridUid == null ||
(component.AllowedFlags & IFFFlags.Hide) == 0x0)
{
return;
}
if (!args.Show)
{
AddIFFFlag(xform.GridUid.Value, IFFFlags.Hide);
}
else
{
RemoveIFFFlag(xform.GridUid.Value, IFFFlags.Hide);
}
}
private void OnIFFConsoleAnchor(EntityUid uid, IFFConsoleComponent component, ref AnchorStateChangedEvent args)
{
// If we anchor / re-anchor then make sure flags up to date.
if (!args.Anchored ||
!TryComp<TransformComponent>(uid, out var xform) ||
!TryComp<IFFComponent>(xform.GridUid, out var iff))
{
_uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
{
AllowedFlags = component.AllowedFlags,
Flags = IFFFlags.None,
});
}
else
{
_uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
{
AllowedFlags = component.AllowedFlags,
Flags = iff.Flags,
});
}
}
protected override void UpdateIFFInterfaces(EntityUid gridUid, IFFComponent component)
{
base.UpdateIFFInterfaces(gridUid, component);
foreach (var (comp, xform) in EntityQuery<IFFConsoleComponent, TransformComponent>(true))
{
if (xform.GridUid != gridUid)
continue;
_uiSystem.TrySetUiState(comp.Owner, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
{
AllowedFlags = comp.AllowedFlags,
Flags = component.Flags,
});
}
}
}

View File

@@ -32,6 +32,7 @@ namespace Content.Server.Shuttles.Systems
InitializeEmergencyConsole(); InitializeEmergencyConsole();
InitializeEscape(); InitializeEscape();
InitializeFTL(); InitializeFTL();
InitializeIFF();
SubscribeLocalEvent<ShuttleComponent, ComponentAdd>(OnShuttleAdd); SubscribeLocalEvent<ShuttleComponent, ComponentAdd>(OnShuttleAdd);
SubscribeLocalEvent<ShuttleComponent, ComponentStartup>(OnShuttleStartup); SubscribeLocalEvent<ShuttleComponent, ComponentStartup>(OnShuttleStartup);

View File

@@ -0,0 +1,17 @@
using Content.Shared.Shuttles.Components;
using Robust.Shared.Serialization;
namespace Content.Shared.Shuttles.BUIStates;
[Serializable, NetSerializable]
public sealed class IFFConsoleBoundUserInterfaceState : BoundUserInterfaceState
{
public IFFFlags AllowedFlags;
public IFFFlags Flags;
}
[Serializable, NetSerializable]
public enum IFFConsoleUiKey : byte
{
Key,
}

View File

@@ -0,0 +1,49 @@
using Content.Shared.Shuttles.Systems;
using Robust.Shared.GameStates;
namespace Content.Shared.Shuttles.Components;
/// <summary>
/// Handles what a grid should look like on radar.
/// </summary>
[RegisterComponent, NetworkedComponent, Access(typeof(SharedShuttleSystem))]
public sealed class IFFComponent : Component
{
/// <summary>
/// Should we show IFF by default?
/// </summary>
public const bool ShowIFFDefault = true;
/// <summary>
/// Default color to use for IFF if no component is found.
/// </summary>
public static readonly Color IFFColor = Color.Aquamarine;
[ViewVariables(VVAccess.ReadWrite), DataField("flags")]
public IFFFlags Flags = IFFFlags.None;
/// <summary>
/// Color for this to show up on IFF.
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField("color")]
public Color Color = IFFColor;
}
[Flags]
public enum IFFFlags : byte
{
None = 0,
/// <summary>
/// Should the label for this grid be hidden at all ranges.
/// </summary>
HideLabel,
/// <summary>
/// Should the grid hide entirely (AKA full stealth).
/// Will also hide the label if that is not set.
/// </summary>
Hide,
// TODO: Need one that hides its outline, just replace it with a bunch of triangles or lines or something.
}

View File

@@ -0,0 +1,12 @@
using Robust.Shared.Serialization;
namespace Content.Shared.Shuttles.Events;
/// <summary>
/// Raised on a client IFF console when it wishes to show IFF.
/// </summary>
[Serializable, NetSerializable]
public sealed class IFFShowIFFMessage : BoundUserInterfaceMessage
{
public bool Show;
}

View File

@@ -0,0 +1,9 @@
using Robust.Shared.Serialization;
namespace Content.Shared.Shuttles.Events;
[Serializable, NetSerializable]
public sealed class IFFShowVesselMessage : BoundUserInterfaceMessage
{
public bool Show;
}

View File

@@ -0,0 +1,89 @@
using Content.Shared.Shuttles.Components;
using JetBrains.Annotations;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Shuttles.Systems;
public abstract partial class SharedShuttleSystem
{
/*
* Handles the label visibility on radar controls. This can be hiding the label or applying other effects.
*/
private void InitializeIFF()
{
SubscribeLocalEvent<IFFComponent, ComponentGetState>(OnIFFGetState);
SubscribeLocalEvent<IFFComponent, ComponentHandleState>(OnIFFHandleState);
}
protected virtual void UpdateIFFInterfaces(EntityUid gridUid, IFFComponent component) {}
/// <summary>
/// Sets the color for this grid to appear as on radar.
/// </summary>
[PublicAPI]
public void SetIFFColor(EntityUid gridUid, Color color, IFFComponent? component = null)
{
component ??= EnsureComp<IFFComponent>(gridUid);
if (component.Color.Equals(color))
return;
component.Color = color;
Dirty(component);
UpdateIFFInterfaces(gridUid, component);
}
[PublicAPI]
public void AddIFFFlag(EntityUid gridUid, IFFFlags flags, IFFComponent? component = null)
{
component ??= EnsureComp<IFFComponent>(gridUid);
if ((component.Flags & flags) == flags)
return;
component.Flags |= flags;
Dirty(component);
UpdateIFFInterfaces(gridUid, component);
}
[PublicAPI]
public void RemoveIFFFlag(EntityUid gridUid, IFFFlags flags, IFFComponent? component = null)
{
if (!Resolve(gridUid, ref component, false))
return;
if ((component.Flags & flags) == 0x0)
return;
component.Flags &= ~flags;
Dirty(component);
UpdateIFFInterfaces(gridUid, component);
}
private void OnIFFHandleState(EntityUid uid, IFFComponent component, ref ComponentHandleState args)
{
if (args.Current is not IFFComponentState state)
return;
component.Flags = state.Flags;
component.Color = state.Color;
}
private void OnIFFGetState(EntityUid uid, IFFComponent component, ref ComponentGetState args)
{
args.State = new IFFComponentState()
{
Flags = component.Flags,
Color = component.Color,
};
}
[Serializable, NetSerializable]
private sealed class IFFComponentState : ComponentState
{
public IFFFlags Flags;
public Color Color;
}
}

View File

@@ -2,7 +2,11 @@ namespace Content.Shared.Shuttles.Systems;
public abstract partial class SharedShuttleSystem : EntitySystem public abstract partial class SharedShuttleSystem : EntitySystem
{ {
public override void Initialize()
{
base.Initialize();
InitializeIFF();
}
} }
[Flags] [Flags]

View File

@@ -24,6 +24,7 @@ emergency-shuttle-console-auth-revoked = Early launch authorization revoked, {$r
emergency-shuttle-console-denied = Access denied emergency-shuttle-console-denied = Access denied
# UI # UI
emergency-shuttle-console-window-title = Emergency Shuttle Console
emergency-shuttle-ui-engines = ENGINES: emergency-shuttle-ui-engines = ENGINES:
emergency-shuttle-ui-idle = Idle emergency-shuttle-ui-idle = Idle
emergency-shuttle-ui-repeal-all = Repeal All emergency-shuttle-ui-repeal-all = Repeal All

View File

@@ -0,0 +1,5 @@
iff-console-window-title = IFF console
iff-console-show-iff-label = Show IFF
iff-console-show-vessel-label = Show vessel
iff-console-on = On
iff-console-off = Off

View File

@@ -8,75 +8,76 @@ tilemap:
1: FloorArcadeBlue 1: FloorArcadeBlue
2: FloorArcadeBlue2 2: FloorArcadeBlue2
3: FloorArcadeRed 3: FloorArcadeRed
4: FloorAsteroidIronsand1 4: FloorAsteroidCoarseSand0
5: FloorAsteroidIronsand2 5: FloorAsteroidCoarseSandDug
6: FloorAsteroidIronsand3 6: FloorAsteroidIronsand1
7: FloorAsteroidIronsand4 7: FloorAsteroidIronsand2
8: FloorBoxing 8: FloorAsteroidIronsand3
9: FloorCarpetClown 9: FloorAsteroidIronsand4
10: FloorCarpetOffice 10: FloorAsteroidSand
11: FloorCave 11: FloorAsteroidTile
12: FloorCaveDrought 12: FloorBar
13: FloorEighties 13: FloorBlue
14: FloorGrassJungle 14: FloorBlueCircuit
15: FloorGym 15: FloorBoxing
16: FloorMetalDiamond 16: FloorCarpetClown
17: FloorShuttleBlue 17: FloorCarpetOffice
18: FloorShuttleOrange 18: FloorCave
19: FloorShuttlePurple 19: FloorCaveDrought
20: FloorShuttleRed 20: FloorClown
21: FloorShuttleWhite 21: FloorDark
22: FloorAsteroidCoarseSand0 22: FloorDirt
23: FloorAsteroidCoarseSand1 23: FloorEighties
24: FloorAsteroidCoarseSand2 24: FloorElevatorShaft
25: FloorAsteroidCoarseSandDug 25: FloorFreezer
26: FloorAsteroidSand 26: FloorGlass
27: FloorAsteroidTile 27: FloorGold
28: FloorBar 28: FloorGrass
29: FloorBlue 29: FloorGrassDark
30: FloorBlueCircuit 30: FloorGrassJungle
31: FloorClown 31: FloorGrassLight
32: FloorDark 32: FloorGreenCircuit
33: FloorElevatorShaft 33: FloorGym
34: FloorFreezer 34: FloorHydro
35: FloorGlass 35: FloorKitchen
36: FloorGold 36: FloorLaundry
37: FloorGrass 37: FloorLino
38: FloorGreenCircuit 38: FloorMetalDiamond
39: FloorHydro 39: FloorMime
40: FloorKitchen 40: FloorMono
41: FloorLaundry 41: FloorRGlass
42: FloorLino 42: FloorReinforced
43: FloorMime 43: FloorRockVault
44: FloorMono 44: FloorShowroom
45: FloorReinforced 45: FloorShuttleBlue
46: FloorRGlass 46: FloorShuttleOrange
47: FloorRockVault 47: FloorShuttlePurple
48: FloorShowroom 48: FloorShuttleRed
49: FloorSilver 49: FloorShuttleWhite
50: FloorSnow 50: FloorSilver
51: FloorSteel 51: FloorSnow
52: FloorSteelDirty 52: FloorSteel
53: FloorTechMaint 53: FloorSteelDirty
54: FloorWhite 54: FloorTechMaint
55: FloorWood 55: FloorWhite
56: Lattice 56: FloorWood
57: Plating 57: Lattice
58: Plating
grids: grids:
- settings: - settings:
chunksize: 16 chunksize: 16
tilesize: 1 tilesize: 1
chunks: chunks:
- ind: -1,-1 - ind: -1,-1
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADkAAAA5AAAAOQAAADkAAAAgAAAAIAAAACAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA5AAAAOQAAADkAAAA5AAAAIAAAACAAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADkAAAA5AAAAOQAAABQAAAAgAAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA5AAAAOQAAADkAAAAgAAAAIAAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAOQAAADkAAAA5AAAAOQAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAOAAAADkAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADkAAAA5AAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADkAAAA5AAAAOQAAADkAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADkAAAA5AAAAOQAAACAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADkAAAAVAAAAFQAAABUAAAAgAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA5AAAAFQAAABUAAAAVAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAOQAAADkAAAAVAAAAFQAAACAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA5AAAAOQAAADkAAAAUAAAAFAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA5AAAAOQAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA4AAAAOAAAAA== tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAADoAAAA6AAAAOgAAADoAAAAVAAAAFQAAABUAAAAVAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADoAAAA6AAAAOgAAADoAAAA6AAAAOgAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA6AAAAOgAAADoAAAA6AAAAFQAAABUAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAADoAAAA6AAAAOgAAADAAAAAVAAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAA6AAAAOgAAADoAAAAVAAAAFQAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOgAAADoAAAA6AAAAOgAAABUAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOQAAADoAAAAVAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADoAAAA6AAAAFQAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADoAAAA6AAAAOgAAADoAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAADoAAAA6AAAAOgAAABUAAAAVAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADoAAAAxAAAAMQAAADEAAAAVAAAAFQAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA6AAAAMQAAADEAAAAxAAAAFQAAABUAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOgAAADoAAAAxAAAAMQAAABUAAAAVAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA6AAAAOgAAADoAAAAwAAAAMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA6AAAAOgAAADoAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA5AAAAOQAAAA==
- ind: 0,-1 - ind: 0,-1
tiles: IAAAACAAAAAgAAAAIAAAADkAAAA5AAAAOQAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAADkAAAA5AAAAOQAAADkAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAA5AAAAOQAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAOQAAADkAAAA5AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAOQAAADkAAAA5AAAAOQAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADkAAAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA5AAAAOQAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOQAAADkAAAA5AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAA3AAAAOQAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAANwAAADcAAAA3AAAAOQAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAADcAAAA3AAAANwAAADkAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABQAAAA5AAAANgAAADkAAAA5AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAOQAAADkAAAA5AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOQAAADkAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== tiles: FQAAABUAAAAVAAAAFQAAADoAAAA6AAAAOgAAADoAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAA6AAAAOgAAADoAAAA6AAAAOgAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAFQAAADoAAAA6AAAAOgAAADoAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAABUAAAA6AAAAOgAAADoAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAAVAAAAOgAAADoAAAA6AAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAOgAAADoAAAA6AAAAOgAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAADoAAAA5AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAA6AAAAOgAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAOgAAADoAAAA6AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAABUAAAA4AAAAOgAAADoAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAAVAAAAOAAAADgAAAA4AAAAOgAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAMAAAADgAAAA4AAAAOAAAADoAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAADAAAAA6AAAANwAAADoAAAA6AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAwAAAAOgAAADoAAAA6AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAOgAAADoAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- ind: -1,0 - ind: -1,0
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
- ind: -1,-2 - ind: -1,-2
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA4AAAAOQAAADkAAAA5AAAAOAAAADgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOQAAADkAAAA5AAAAOQAAADgAAAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAACAAAAAgAAAAIAAAADkAAAA4AAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAAgAAAAOQAAACAAAAA5AAAAOAAAADgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAIAAAADkAAAAgAAAAOQAAADkAAAA5AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAACAAAAA5AAAAIAAAACAAAAA5AAAAOQAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAAgAAAAOQAAACAAAAAgAAAAOQAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAIAAAACAAAAAgAAAAIAAAADkAAAA5AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADkAAAAgAAAAIAAAABQAAAA5AAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA5AAAAIAAAACAAAAAUAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAOQAAABQAAAAgAAAAFAAAADkAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADkAAAA5AAAAOQAAADkAAAA5AAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOQAAADkAAAA5AAAAOQAAACAAAAAgAAAAIAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADkAAAA5AAAAOQAAADkAAAAgAAAAIAAAACAAAAA5AAAAOQAAAA== tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA5AAAAOgAAADoAAAA6AAAAOQAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAOgAAADoAAAA6AAAAOgAAADkAAAA5AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAABUAAAAVAAAAFQAAADoAAAA5AAAAOQAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAAVAAAAOgAAABUAAAA6AAAAOQAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAFQAAADoAAAAVAAAAOgAAADoAAAA6AAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAABUAAAA6AAAAFQAAABUAAAA6AAAAOgAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAAVAAAAOgAAABUAAAAVAAAAOgAAADoAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAFQAAABUAAAAVAAAAFQAAADoAAAA6AAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAADoAAAAVAAAAFQAAADAAAAA6AAAAFQAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAA6AAAAFQAAABUAAAAwAAAAFQAAABUAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOgAAADAAAAAVAAAAMAAAADoAAAAVAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADoAAAA6AAAAOgAAADoAAAA6AAAAFQAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAOgAAADoAAAA6AAAAOgAAABUAAAAVAAAAFQAAABUAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAADoAAAA6AAAAOgAAADoAAAAVAAAAFQAAABUAAAA6AAAAOgAAAA==
- ind: 0,-2 - ind: 0,-2
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAOAAAADkAAAA5AAAAOQAAADgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAA5AAAAOQAAADkAAAA5AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAA4AAAAOQAAAC0AAAA5AAAALQAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAOAAAADkAAAAtAAAAOQAAAC0AAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADkAAAA5AAAALQAAADkAAAAtAAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADkAAAA5AAAAIAAAADkAAAA5AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAIAAAACAAAAAgAAAAOQAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAAAgAAAAIAAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAIAAAACAAAAA5AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA5AAAAOQAAADkAAAA5AAAAOQAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAAAgAAAAOQAAADkAAAA5AAAAOQAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAACAAAAAgAAAAIAAAADkAAAA5AAAAOQAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA5AAAAOQAAADkAAAA5AAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOQAAADoAAAA6AAAAOgAAADkAAAA5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOQAAADkAAAA6AAAAOgAAADoAAAA6AAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADkAAAA5AAAAOgAAACoAAAA6AAAAKgAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5AAAAOQAAADoAAAAqAAAAOgAAACoAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAADoAAAA6AAAAKgAAADoAAAAqAAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoAAAA6AAAAOgAAADoAAAA6AAAAOgAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6AAAAOgAAADoAAAA6AAAAOgAAADoAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAADoAAAA6AAAAFQAAADoAAAA6AAAAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAAVAAAAFQAAABUAAAAVAAAAOgAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAFQAAABUAAAAVAAAAFQAAADoAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFQAAABUAAAAVAAAAFQAAABUAAAA6AAAAOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAAA6AAAAOgAAADoAAAA6AAAAOgAAADkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAFQAAABUAAAAVAAAAOgAAADoAAAA6AAAAOgAAADoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAABUAAAAVAAAAFQAAADoAAAA6AAAAOgAAADoAAAA6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
entities: entities:
- uid: 0 - uid: 0
type: WallReinforced type: WallReinforced
@@ -526,6 +527,8 @@ entities:
- pos: -6.4711375,-22.477419 - pos: -6.4711375,-22.477419
parent: 73 parent: 73
type: Transform type: Transform
- canCollide: False
type: Physics
- uid: 71 - uid: 71
type: WallReinforced type: WallReinforced
components: components:
@@ -1195,6 +1198,9 @@ entities:
id: QuarterTileOverlayGreyscale90 id: QuarterTileOverlayGreyscale90
coordinates: 0,-12 coordinates: 0,-12
type: DecalGrid type: DecalGrid
- color: '#FFC000FF'
flags: Hide
type: IFF
- uid: 74 - uid: 74
type: WallReinforced type: WallReinforced
components: components:
@@ -4694,6 +4700,17 @@ entities:
type: Transform type: Transform
- enabled: False - enabled: False
type: AmbientSound type: AmbientSound
- uid: 563
type: ComputerIFFSyndicate
components:
- rot: -1.5707963267948966 rad
pos: 1.5,-4.5
parent: 73
type: Transform
- containers:
board: !type:Container
ents: []
type: ContainerContainer
- uid: 564 - uid: 564
type: DoubleEmergencyOxygenTankFilled type: DoubleEmergencyOxygenTankFilled
components: components:

View File

@@ -45,22 +45,22 @@
description: Used to pilot a shuttle. description: Used to pilot a shuttle.
abstract: true abstract: true
components: components:
- type: ShuttleConsole - type: ShuttleConsole
- type: ActivatableUI - type: ActivatableUI
key: enum.ShuttleConsoleUiKey.Key key: enum.ShuttleConsoleUiKey.Key
- type: ActivatableUIRequiresPower - type: ActivatableUIRequiresPower
- type: UserInterface - type: UserInterface
interfaces: interfaces:
- key: enum.ShuttleConsoleUiKey.Key - key: enum.ShuttleConsoleUiKey.Key
type: ShuttleConsoleBoundUserInterface type: ShuttleConsoleBoundUserInterface
- type: RadarConsole - type: RadarConsole
- type: ExtensionCableReceiver - type: ExtensionCableReceiver
- type: PointLight - type: PointLight
radius: 1.5 radius: 1.5
energy: 1.6 energy: 1.6
color: "#43ccb5" color: "#43ccb5"
- type: Rotatable - type: Rotatable
rotateWhileAnchored: true rotateWhileAnchored: true
- type: entity - type: entity
parent: BaseComputerShuttle parent: BaseComputerShuttle
@@ -68,13 +68,13 @@
name: shuttle console name: shuttle console
description: Used to pilot a shuttle. description: Used to pilot a shuttle.
components: components:
- type: Appearance - type: Appearance
visuals: visuals:
- type: ComputerVisualizer - type: ComputerVisualizer
key: generic_key key: generic_key
screen: shuttle screen: shuttle
- type: Computer - type: Computer
board: ShuttleConsoleCircuitboard board: ShuttleConsoleCircuitboard
- type: entity - type: entity
parent: BaseComputerShuttle parent: BaseComputerShuttle
@@ -82,20 +82,20 @@
name: syndicate shuttle console name: syndicate shuttle console
description: Used to pilot a syndicate shuttle. description: Used to pilot a syndicate shuttle.
components: components:
- type: Tag - type: Tag
tags: tags:
- Syndicate - Syndicate
- type: Appearance - type: Appearance
visuals: visuals:
- type: ComputerVisualizer - type: ComputerVisualizer
key: syndie_key key: syndie_key
screen: syndishuttle screen: syndishuttle
- type: RadarConsole - type: RadarConsole
maxRange: 1536 maxRange: 1536
- type: PointLight - type: PointLight
radius: 1.5 radius: 1.5
energy: 1.6 energy: 1.6
color: "#c94242" color: "#c94242"
- type: entity - type: entity
parent: BaseComputerShuttle parent: BaseComputerShuttle
@@ -103,18 +103,82 @@
name: cargo shuttle console name: cargo shuttle console
description: Used to pilot the cargo shuttle. description: Used to pilot the cargo shuttle.
components: components:
- type: Appearance - type: Appearance
visuals: visuals:
- type: ComputerVisualizer - type: ComputerVisualizer
key: generic_key key: generic_key
screen: shuttle screen: shuttle
- type: CargoPilotConsole - type: CargoPilotConsole
- type: RadarConsole - type: RadarConsole
maxRange: 256 maxRange: 256
- type: PointLight - type: PointLight
radius: 1.5 radius: 1.5
energy: 1.6 energy: 1.6
color: "#c94242" color: "#c94242"
- type: entity
parent: BaseComputer
id: ComputerIFF
name: IFF computer
description: Allows you to control the IFF characteristics of this vessel.
components:
- type: IFFConsole
- type: Sprite
layers:
- map: [ "enum.ComputerVisualizer+Layers.KeyboardOn" ]
visible: false
- map: [ "enum.ComputerVisualizer+Layers.Keyboard" ]
visible: false
- map: [ "enum.ComputerVisualizer+Layers.Body" ]
state: computer
- map: [ "enum.ComputerVisualizer+Layers.Screen" ]
sprite: Structures/Shuttles/iff.rsi
state: helm
shader: unshaded
- type: Appearance
visuals:
- type: ComputerVisualizer
screen: helm
- type: ActivatableUI
key: enum.IFFConsoleUiKey.Key
- type: UserInterface
interfaces:
- key: enum.IFFConsoleUiKey.Key
type: IFFConsoleBoundUserInterface
- type: entity
parent: ComputerIFF
id: ComputerIFFSyndicate
name: IFF computer
suffix: Syndicate
description: Allows you to control the IFF and stealth characteristics of this vessel.
components:
- type: IFFConsole
allowedFlags:
- Hide
- HideLabel
- type: Sprite
layers:
- map: [ "enum.ComputerVisualizer+Layers.KeyboardOn" ]
visible: false
- map: [ "enum.ComputerVisualizer+Layers.Keyboard" ]
visible: false
- map: [ "enum.ComputerVisualizer+Layers.Body" ]
state: computer
- map: [ "enum.ComputerVisualizer+Layers.Screen" ]
sprite: Structures/Shuttles/iff.rsi
state: helm
shader: unshaded
- type: Appearance
visuals:
- type: ComputerVisualizer
screen: helm
- type: ActivatableUI
key: enum.IFFConsoleUiKey.Key
- type: UserInterface
interfaces:
- key: enum.IFFConsoleUiKey.Key
type: IFFConsoleBoundUserInterface
- type: entity - type: entity
parent: BaseComputer parent: BaseComputer

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,33 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "https://github.com/Citadel-Station-13/Citadel-Station-13-RP/tree/9d6d74d9da4fb39bc722bc7f7b36c54665695ead",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "helm",
"directions": 4,
"delays": [
[
1,
1
],
[
1,
1
],
[
1,
1
],
[
1,
1
]
]
}
]
}