From 48d5b9c4fd808e2e485aba8f38a77f893346e201 Mon Sep 17 00:00:00 2001 From: Aaron Mahan Date: Sun, 12 Sep 2021 09:23:30 -0600 Subject: [PATCH] Refactor & fix bugs. Player: - Fix some player state machine bugs preventing player from transitioning to the correct state due to having multiple valid triggers, which in turn is caused by not being specific enough when specifying trigger conditions during state machine initialization. This reduces strange bugs where the player gets stuck in a specific state or won't take a valid action like reading a sign, or the player doesn't respond to a specific valid input. - Remove player idle back animation delay when finished reading a sign, at least for now. It looked a bit awkward when finished reading a sign from too far off center. Editor / Scenes: - Simplify main scene by combining upper & lower cliffs to reduce level complexity and duplication by almost 50%. Merge lower cliffs into upper cliffs and rename upper cliffs to cliffs. - Restructure the ground colliders to make them more reliable & way less buggy. - Reorganize & rename many nodes in Godot editor for simplicity & readability, which was made possible by the merging of upper and lower cliffs. - Reorganize the 10 waterfall sections so that section 1 is the very top and section 10 is the very bottom, respectively, which is a much more intuitive layout. - Lock some nodes in the editor to prevent them from being accidentally modified. Tiles: - Heavily rework tile intersection code in Tools.cs to improve accuracy and eliminate bugs. Allow units per tile aka cell size to vary from 1 to 16 for precise placement of tiles without affecting collision and overlap detection. - Greatly simplify player updates in Cliff.cs for detecting both cliff enclosing & ice intersection code. Signals: - Move ground detection signal callbacks for the player from Cliffs.cs to Player.cs which greatly simplifies everything, including not having to add duplicate callbacks in both classes. - Block more signals while changing player's animation-based collision shape to prevent signal callbacks from being triggered more than they should be. This is an ongoing workaround for https://github.com/godotengine/godot/issues/14578 "Changing node parent produces Area2D/3D signal duplicates". - Improve naming of some signal callback methods. Player.cs refactoring: - Remove the use of delta from Player.cs, where it mainly a hack; awaiting a certain amount of idle frames has been more efficient. - Add more private convenience methods for energy meter management to simplify the code & increase readability. - Add more private convenience methods for sign reading management to simplify the code & increase readability. General refactoring: - Move more GetNode calls into _Ready methods and assign them to fields for efficiency, code simplicity, readability, & less possibilities for bugs. Tools: - Don't throw an exception in Tools when checking if any arrow key is pressed except the specified one, when the specified input is invalid; just return false to decrease game crashes. Extensions: - Add a string extension method for allowing the use of the null coalescing operator to work with empty strings, which greatly simplifies string-handling code, e.g., when using the ternary operator to return strings from methods. Cleanup: - Remove unused & obsolete classes. - Remove unused & obsolete methods. - Remove outdated & unnecessary comments. - Suppress unnecessary compiler warnings with comments for increased readability. - Remove obsolete compiler warning suppression comments. - Rename some outdated variables for increased clarity on their purpose. - Rename some methods for simplicity. - Reorganize order of some fields for increased readability> - Remove obsolete formatter-disabling tags for code blocks. - Add formatter-disabling tags where necessary. - Add some TODO's. - Improve many log messages. - Improve code formatting. --- AbstractPerch.cs | 1 + Butterfly.cs | 69 ++- Cliffs.cs | 69 +-- PerchablesFactory.cs | 17 +- Player.cs | 267 +++++----- StateMachine.cs | 13 +- StringExtensions.cs | 4 + TestPerchableImpl.cs | 10 - Tools.cs | 82 +-- asesprite/klas.aseprite | Bin 8401 -> 8401 bytes cliffs.tres | 72 +-- klas.png | Bin 3590 -> 3605 bytes main.tscn | 1115 +++++++++++++++++++-------------------- ui.tscn | 6 + 14 files changed, 816 insertions(+), 909 deletions(-) create mode 100644 StringExtensions.cs delete mode 100644 TestPerchableImpl.cs diff --git a/AbstractPerch.cs b/AbstractPerch.cs index 3c99093..f282999 100644 --- a/AbstractPerch.cs +++ b/AbstractPerch.cs @@ -73,6 +73,7 @@ public Vector2 RandomPoint (RandomNumberGenerator rng, GetGlobalScale getGlobalS public bool Contains (Vector2 globalPosition) => _perchableAreasInGlobalSpace.Any (x => AlmostHasPoint (x, globalPosition, _positionEpsilon)); public virtual bool HasParentName (string name) => false; public bool Is (string name, Vector2 globalOrigin) => Name == name && AreAlmostEqual (GlobalOrigin, globalOrigin, _positionEpsilon); + // ReSharper disable once MemberCanBePrivate.Global public bool Equals (IPerchable other) => !ReferenceEquals (null, other) && (ReferenceEquals (this, other) || Is (other.Name, other.GlobalOrigin)); public override bool Equals (object obj) => !ReferenceEquals (null, obj) && (ReferenceEquals (this, obj) || obj.GetType() == GetType() && Equals ((IPerchable)obj)); // @formatter:on diff --git a/Butterfly.cs b/Butterfly.cs index d420e1c..5818cf2 100644 --- a/Butterfly.cs +++ b/Butterfly.cs @@ -6,6 +6,7 @@ // TODO Adjust idle position to synchronize with sprite animation for KinematicPerch. // TODO Use nonlinear interpolation to accelerate / decelerate. +// TODO Test without custom position epsilon. public class Butterfly : AnimatedSprite { @@ -126,16 +127,18 @@ public bool DrawPerchPointFilled private DrawRect _drawRect; private IPerchable _perch; private Vector2 _perchPoint; - private Node _perchingBody; + private Node _perchableNode; + private Area2D _perchingColliderArea; + private CollisionShape2D _perchingCollider; private float _maxOscillationAngleVariation; private readonly RandomNumberGenerator _rng = new(); private readonly List _path = new(); - private readonly float _ninety = Mathf.Deg2Rad (90); private readonly List _perches = new(); private readonly List _perchesUnvisited = new(); private readonly List _unperchablePerches = new(); private readonly List _perchableNodes = new(); private readonly PerchableDrawPrefs _perchableDrawPrefs = new(); + private readonly float _ninety = Mathf.Deg2Rad (90); private Log _log; private enum State @@ -160,6 +163,8 @@ public override void _Ready() _log = new Log (Name) { CurrentLevel = LogLevel }; _rng.Randomize(); Animation = FlyingAnimation; + _perchingColliderArea = GetNode ("PerchingCollider"); + _perchingCollider = _perchingColliderArea.GetNode ("CollisionShape2D"); _maxOscillationAngleVariation = Mathf.Deg2Rad (MaxOscillationAngleVariationDegrees); _drawPrimitive = delegate (Vector2[] points, Color[] colors, Vector2[] uvs) { DrawPrimitive (points, colors, uvs); }; _drawRect = delegate (Rect2 rect, Color color, bool filled) { DrawRect (rect, color, filled); }; @@ -199,13 +204,11 @@ public override void _Process (float delta) perch.GlobalOrigin = node.GlobalPosition; } - // @formatter:off // x & y are intentionally reversed here, see: https://github.com/godotengine/godot/issues/17405 if (Mathf.Sign (((Node2D)sprite.GetParent()).Scale.y) == -1 && !perch.FlippedHorizontally) perch.FlipHorizontally(); if (Mathf.Sign (((Node2D)sprite.GetParent()).Scale.x) == -1 && !perch.FlippedVertically) perch.FlipVertically(); if (Mathf.Sign (((Node2D)sprite.GetParent()).Scale.y) == 1 && perch.FlippedHorizontally) perch.FlipHorizontally(); if (Mathf.Sign (((Node2D)sprite.GetParent()).Scale.x) == 1 && perch.FlippedVertically) perch.FlipVertically(); - // @formatter:on if (!perch.Disabled) continue; @@ -249,40 +252,40 @@ public override void _Draw() } // ReSharper disable once UnusedMember.Global - public void _OnPerchingBodyColliderEntered (Node body) + public void _OnPerchingColliderAreaEntered (Area2D area) { - if (!body.IsInGroup ("Perchable")) return; + if (area.GetParent() is not AnimatedSprite sprite || !sprite.IsInGroup ("Perchable")) return; - _log.All ($"Entering body perch: {NameOf (body, Position)}."); - _perchingBody = body; + _log.All ($"Entering animated sprite perch: {NameOf (sprite)}."); + _perchableNode = sprite; } // ReSharper disable once UnusedMember.Global - public void _OnPerchingAreaColliderEntered (Area2D area) + public void _OnPerchingColliderBodyEntered (Node body) { - if (!area.IsInGroup ("Player") || area.GetParent() is not AnimatedSprite sprite) return; + if (body is not TileMap tileMap || !tileMap.IsInGroup ("Perchable")) return; - _log.All ($"Entering area perch: {NameOf (sprite, Position)}."); - _perchingBody = sprite; + _log.All ($"Entering tile perch: {NameOf (tileMap)}."); + _perchableNode = tileMap; } // @formatter:off // ReSharper disable once UnusedMember.Global - public void _OnObstacleColliderEntered (Node body) + public void _OnObstacleColliderBodyEntered (Node body) { if (body is StaticBody2D || body.IsInGroup ("Perchable") || body.IsInGroup ("Perchable Parent") || body.IsInGroup ("Ground")) return; - _log.Debug ($"Encountered obstacle: {NameOf (body, Position)}."); + _log.Debug ($"Encountered obstacle: {NameOf (body)}"); _stateMachine.To (State.Evading); } // ReSharper disable once UnusedMember.Global - public void _OnObstacleColliderExited (Node body) + public void _OnObstacleColliderBodyExited (Node body) { if (body is StaticBody2D || body.IsInGroup ("Perchable") || body.IsInGroup ("Perchable Parent") || body.IsInGroup ("Ground")) return; - _log.Debug ($"Evaded obstacle: {NameOf (body, Position)}."); + _log.Debug ($"Evaded obstacle: {NameOf (body)}."); _stateMachine.To (State.Flying); } @@ -310,8 +313,8 @@ private void Perch (float delta) { if (!_perch.Contains (Position) || !AreAlmostEqual (Position, _perchPoint, PositionEpsilon)) { - _log.All ( - $"Found correct perch: {NameOf (_perchingBody, Position)}. Continuing perching along same path from position {Position} to reach perch point {_perchPoint}."); + _log.All ($"Found correct perch: {NameOf (_perchableNode)}." + + $"Continuing perching along same path from position {Position} to reach perch point {_perchPoint}."); Move (PerchingSpeed, delta); @@ -352,26 +355,24 @@ private void Move (float speed, float delta) private bool ArrivedAtPerch() { - if (_perchingBody == null) return false; + if (_perchableNode == null) return false; IPerchable perch = null; var position = Vector2.Zero; - var cell = Vector2.Zero; - switch (_perchingBody) + switch (_perchableNode) { case TileMap tileMap: { - cell = GetIntersectingTileCell (Position, tileMap); - position = GetIntersectingTileCellGlobalPosition (Position, tileMap); - perch = _perchesUnvisited.FirstOrDefault (x => x.Is (GetIntersectingTileName (Position, tileMap), position)); + position = GetIntersectingTileCellGlobalPosition (_perchingColliderArea, _perchingCollider, tileMap); + perch = _perchesUnvisited.FirstOrDefault (x => x.Is (NameOf (tileMap), position)); break; } case AnimatedSprite sprite: { position = sprite.GlobalPosition; - perch = _perchesUnvisited.FirstOrDefault (x => x.Is (sprite.Animation, position)); + perch = _perchesUnvisited.FirstOrDefault (x => x.Is (NameOf (sprite), position)); break; } @@ -379,10 +380,10 @@ private bool ArrivedAtPerch() if (_perch.Equals (perch)) return true; - _log.All ($"Found wrong perch: {NameOf (_perchingBody, Position)} at position {position}, cell {cell}."); - _log.All ($"_perch: {_perch}, perch: {perch}, _perchingBody: {_perchingBody}"); + _log.All ($"Found wrong perch: {NameOf (_perchableNode)} at position {position}."); + _log.All ($"_perch: {_perch}, perch: {perch}, _perchingBody: {_perchableNode}"); _log.Debug ($"Continuing flying along same path toward correct perch:\n{_perch}."); - _perchingBody = null; + _perchableNode = null; return false; } @@ -479,4 +480,16 @@ private void ChangeDestination() _perchesUnvisited.Remove (_perch); StartMoving(); } + + // @formatter:off + + private string NameOf (Node node) => + node switch + { + TileMap tileMap => GetIntersectingTileName (_perchingColliderArea, _perchingCollider, tileMap).NullIfEmpty() ?? node.Name, + AnimatedSprite sprite => sprite.Animation, + _ => node.Name + }; + + // @formatter:on } \ No newline at end of file diff --git a/Cliffs.cs b/Cliffs.cs index 52dac7e..fe4b4de 100644 --- a/Cliffs.cs +++ b/Cliffs.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Godot; using static Tools; @@ -21,7 +22,6 @@ public enum Season private AnimatedSprite _playerSprite; private Area2D _playerArea; private Rect2 _playerRect; - private Vector2 _playerExtents; private Vector2 _playerPosition; private string _playerAnimation; private CollisionShape2D _playerAnimationCollider; @@ -30,10 +30,6 @@ public enum Season private AudioStreamPlayer _ambiencePlayer; private AudioStreamPlayer _musicPlayer; private TileMap _iceTileMap; - private Vector2 _topLeft; - private Vector2 _bottomRight; - private Vector2 _topRight; - private Vector2 _bottomLeft; private readonly Dictionary _waterfallZIndex = new(); private readonly Dictionary _music = new(); private readonly Dictionary _ambience = new(); @@ -69,19 +65,12 @@ public override void _Ready() _ambiencePlayer = GetNode ("../AmbiencePlayer"); _musicPlayer = GetNode ("../MusicPlayer"); _iceTileMap = GetNode ("Ice"); - _colliders.Add (GetNode ("Extents 1")); + for (var i = 1; i <= 5; ++i) _colliders.Add (GetNode ("Extents " + i)); _player = GetNode ("../Player"); _playerSprite = _player.GetNode ("AnimatedSprite"); _playerArea = _playerSprite.GetNode ("Area2D"); _playerAnimation = _playerSprite.Animation; _playerAnimationCollider = _playerArea.GetNode (_playerAnimation); - - if (Name == "Upper Cliffs") - { - _colliders.Add (GetNode ("Extents 2")); - _colliders.Add (GetNode ("Extents 3")); - } - InitializeSeasons(); } @@ -95,7 +84,7 @@ public override void _Process (float delta) public override void _UnhandledInput (InputEvent @event) { if (IsReleased (Tools.Input.Season, @event) && !_seasonChangeInProgress) NextSeason(); - if (IsReleased (Tools.Input.Music, @event) && Name == "Upper Cliffs") ToggleMusic(); + if (IsReleased (Tools.Input.Music, @event)) ToggleMusic(); } // ReSharper disable once UnusedMember.Global @@ -103,7 +92,7 @@ public void _OnWaterfallEntered (Area2D area) { if (!area.IsInGroup ("Player")) return; - _log.Info ($"{area.GetParent().Name} entered waterfall."); + _log.Info ($"Player entered waterfall."); _isPlayerInWaterfall = true; _player.IsInFrozenWaterfall = CurrentSeason == Season.Winter; } @@ -113,7 +102,7 @@ public void _OnWaterfallExited (Area2D area) { if (!area.IsInGroup ("Player")) return; - _log.Info ($"{area.GetParent().Name} exited waterfall."); + _log.Info ($"Player exited waterfall."); _isPlayerInWaterfall = false; _player.IsInFrozenWaterfall = false; } @@ -137,24 +126,6 @@ public void _OnCliffsExited (Area2D area) _log.Debug ($"Player exited {Name}."); } - // ReSharper disable once UnusedMember.Global - public void _OnUpperCliffsGroundEntered (Area2D area) - { - if (!area.IsInGroup ("Player") || Name != "Upper Cliffs") return; - - _log.Debug ($"Player entered ground of {Name}."); - _player.IsInGround = true; - } - - // ReSharper disable once UnusedMember.Global - public void _OnUpperCliffsGroundExited (Area2D area) - { - if (!area.IsInGroup ("Player") || Name != "Upper Cliffs") return; - - _log.Debug ($"Player exited ground of {Name}."); - _player.IsInGround = false; - } - private void InitializeSeasons() { foreach (Season season in Enum.GetValues (typeof (Season))) @@ -180,8 +151,6 @@ private void ChangeSeasonTo (Season season) private void UpdateWaterfall (Season season, float delta) { - if (Name != "Upper Cliffs") return; - var isWinter = season == Season.Winter; var waterfall = GetNode ("Waterfall"); waterfall.Visible = true; @@ -212,8 +181,8 @@ private async void UpdateFrozenWaterfallTopGround (PhysicsBody2D waterSurfaceCol var isWinter = season == Season.Winter; waterSurfaceCollider.SetCollisionMaskBit (0, isWinter); waterSurfaceCollider.SetCollisionLayerBit (1, isWinter); - GetNode ("../Upper Cliffs/Upper Cliffs Top Ground Static Collider 3/CollisionShape2D").Disabled = isWinter; - GetNode ("../Upper Cliffs/Cliff Edge 3/CollisionShape2D").Disabled = isWinter; + GetNode ("Ground 3/CollisionShape2D").Disabled = isWinter; + GetNode ("Edge 3/CollisionShape2D").Disabled = isWinter; await ToSignal (GetTree().CreateTimer (delta, false), "timeout"); foreach (int shapeOwnerId in waterSurfaceCollider.GetShapeOwners()) @@ -292,31 +261,13 @@ private void UpdatePlayer() AreAlmostEqual (_playerAnimationCollider.GlobalPosition, _playerPosition, 0.001f)) return; _playerAnimation = _playerSprite.Animation; - _playerExtents = GetExtents (_playerArea, _playerAnimation); _playerAnimationCollider = _playerArea.GetNode (_playerAnimation); _playerPosition = _playerAnimationCollider.GlobalPosition; - _playerRect.Position = _playerPosition - _playerExtents; - _playerRect.Size = _playerExtents * 2; + _playerRect = GetAreaColliderRect (_playerArea, _playerAnimationCollider); _cliffRects.Clear(); - - foreach (var collider in _colliders) - { - var extents = (collider.Shape as RectangleShape2D)?.Extents ?? Vector2.Zero; - _cliffRects.Add (new Rect2 (collider.GlobalPosition - extents, extents * 2)); - } - + _cliffRects.AddRange (_colliders.Select (x => GetAreaColliderRect (this, x))); _player.IsInCliffs = _isPlayerIntersectingCliffs && IsEnclosedBy (_playerRect, _cliffRects); - _topLeft = _playerArea.GlobalPosition - _playerExtents; - _bottomRight = _playerArea.GlobalPosition + _playerExtents; - _topRight.x = _playerArea.GlobalPosition.x + _playerExtents.x; - _topRight.y = _playerArea.GlobalPosition.y - _playerExtents.y; - _bottomLeft.x = _playerArea.GlobalPosition.x - _playerExtents.x; - _bottomLeft.y = _playerArea.GlobalPosition.y + _playerExtents.y; - - _player.IsTouchingCliffIce = _iceTileMap.Visible && (IsIntersectingAnyTile (_topLeft, _iceTileMap) || - IsIntersectingAnyTile (_bottomRight, _iceTileMap) || - IsIntersectingAnyTile (_topRight, _iceTileMap) || - IsIntersectingAnyTile (_bottomLeft, _iceTileMap)); + _player.IsTouchingCliffIce = _iceTileMap.Visible && IsIntersectingAnyTile (_playerArea, _playerAnimationCollider, _iceTileMap); } private void ToggleMusic() => _musicPlayer.Playing = !_musicPlayer.Playing; diff --git a/PerchablesFactory.cs b/PerchablesFactory.cs index 4ca5f81..fa28f2a 100644 --- a/PerchablesFactory.cs +++ b/PerchablesFactory.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.Linq; using Godot; @@ -7,6 +6,7 @@ public static class PerchablesFactory { // @formatter:off + private static readonly Dictionary > NamesToPerchableAreas = new() { { "flowers-pink-pair-left", new List { @@ -18,12 +18,12 @@ public static class PerchablesFactory new(new Vector2 (64, 32), new Vector2 (24, 24))}}, { "flowers-pink-single-left", new List { new(new Vector2 (48, 40), new Vector2 (24, 24))}}, - { "cliffs-sign", new List { + { "sign", new List { new(new Vector2 (8, 24), new Vector2 (8, 8)), new(new Vector2 (16, 16), new Vector2 (8, 8)), new(new Vector2 (24, 8), new Vector2 (72, 8)), new(new Vector2 (96, 16), new Vector2 (24, 8))}}, - { "cliffs-sign-arrow-left", new List { + { "sign-arrow-left", new List { new(new Vector2 (0, 32), new Vector2 (8, 8)), new(new Vector2 (8, 24), new Vector2 (8, 8)), new(new Vector2 (16, 16), new Vector2 (8, 8)), @@ -31,7 +31,7 @@ public static class PerchablesFactory new(new Vector2 (32, 0), new Vector2 (16, 8)), new(new Vector2 (48, 16), new Vector2 (72, 8)), new(new Vector2 (120, 24), new Vector2 (8, 8))}}, - { "cliffs-sign-arrow-right", new List { + { "sign-arrow-right", new List { new(new Vector2 (0, 24), new Vector2 (8, 8)), new(new Vector2 (8, 16), new Vector2 (72, 8)), new(new Vector2 (80, 0), new Vector2 (16, 8)), @@ -51,6 +51,7 @@ public static class PerchablesFactory new(new Vector2 (-16, -56), new Vector2 (24, 8)), new(new Vector2 (8, -64), new Vector2 (24, 8))}} }; + // @formatter:on public static IEnumerable Create (Node2D node, PerchableDrawPrefs drawPrefs, float positionEpsilon) @@ -62,10 +63,10 @@ where NamesToPerchableAreas.ContainsKey (animationName) select new AnimatedSpritePerch (animationName, new Vector2 (node.GlobalPosition), drawPrefs, new List (NamesToPerchableAreas[animationName]), positionEpsilon)), TileMap tileMap => new List (tileMap.GetUsedCells().Cast () - .Select (cell => new { cell, tileName = GetTileCellName (cell, tileMap) }).Select (@t => - new TilePerch (tileMap.Name, @t.tileName, GetTileCellGlobalPosition (@t.cell, tileMap), @t.cell, drawPrefs, - new List (NamesToPerchableAreas[@t.tileName]), positionEpsilon))), - _ => throw new InvalidOperationException ($"Unsupported node type: {node}.") + .Select (cell => new { cell, tileName = GetTileName (cell, tileMap) }).Select (@t => new TilePerch (tileMap.Name, @t.tileName, + GetTileCellGlobalPosition (@t.cell, tileMap), @t.cell, drawPrefs, new List (NamesToPerchableAreas[@t.tileName]), + positionEpsilon))), + _ => new List () }; } diff --git a/Player.cs b/Player.cs index 93b23bd..6e025ad 100644 --- a/Player.cs +++ b/Player.cs @@ -18,8 +18,6 @@ // Free falling: Moving down, without cliff arresting, can also be coming down from a jump. public class Player : KinematicBody2D { - // @formatter:off - // Godot-configurable options [Export] public float HorizontalWalkingSpeed = 20.0f; [Export] public float HorizontalRunningSpeed = 40.0f; [Export] public float TraverseSpeed = 200.0f; @@ -53,31 +51,18 @@ public class Player : KinematicBody2D [Export] public float CliffArrestingSoundVelocityPitchScaleModulation = 4.0f; [Export] public float CliffArrestingSoundMinPitchScale = 2.0f; [Export] public float ClimbingUpToNewLevelRestTimeSeconds = 1.0f; - [Export] public float FinishedReadingSignAnimationDelaySeconds = 0.5f; [Export] public int EnergyMeterUnits = 20; [Export] public int EnergyMeterReplenishTimeSeconds = 10; [Export] public int EnergyMeterDepletionTimeSeconds = 3; [Export] public State InitialState = State.Idle; - // @formatter:on // Field must be publicly accessible from Cliffs.cs - // ReSharper disable once MemberCanBePrivate.Global - // ReSharper disable once UnassignedField.Global public bool IsInCliffs; // Field must be publicly accessible from Cliffs.cs - // ReSharper disable once MemberCanBePrivate.Global - // ReSharper disable once UnassignedField.Global - public bool IsInGround; - - // Field must be publicly accessible from Cliffs.cs - // ReSharper disable once MemberCanBePrivate.Global - // ReSharper disable once UnassignedField.Global public bool IsTouchingCliffIce; // Field must be publicly accessible from Cliffs.cs - // ReSharper disable once MemberCanBePrivate.Global - // ReSharper disable once UnassignedField.Global public bool IsInFrozenWaterfall; public enum State @@ -99,6 +84,7 @@ public enum State private Vector2 _velocity; private RichTextLabel _label = null!; private AnimatedSprite _sprite = null!; + private Area2D _area = null!; private TextureProgress _energyMeter = null!; private AudioStreamPlayer _audio = null!; private Timer _energyTimer = null!; @@ -115,6 +101,7 @@ public enum State private uint _lastTotalFallingTimeMs; private float _highestVerticalVelocity; private bool _isDroppingDown; + private bool _isInGround; private bool _isResting; private bool _wasRunning; private bool _wasInCliffEdge; @@ -124,34 +111,35 @@ public enum State private RayCast2D _rayFeet; private Sprite _readableSign; private TileMap _signsTileMap; + private Cliffs _cliffs; + private Area2D _waterfall; private string _currentAnimation; private bool _isInSign; - private float _delta; private Log _log; // @formatter:off private static readonly Dictionary TileNamesToDropdownFrames = new() { - { "cliffs-sign", 16 }, - { "cliffs-sign-arrow-right", 17 }, - { "cliffs-sign-arrow-left", 17 } + { "sign", 16 }, + { "sign-arrow-right", 17 }, + { "sign-arrow-left", 17 } }; private static readonly Dictionary TransitionTable = new() { - { State.Idle, new[] { State.Walking, State.Running, State.Jumping, State.ClimbingPrep, State.ClimbingUp, State.ClimbingDown, State.FreeFalling, State.ReadingSign } }, - { State.Walking, new[] { State.Idle, State.Running, State.Jumping, State.FreeFalling, State.ClimbingPrep, State.ReadingSign } }, - { State.Running, new[] { State.Idle, State.Walking, State.Jumping, State.FreeFalling, State.ClimbingPrep, State.ReadingSign } }, - { State.Jumping, new[] { State.Idle, State.FreeFalling, State.Walking } }, - { State.ClimbingPrep, new[] { State.ClimbingUp, State.Idle, State.Walking, State.Jumping } }, - { State.ClimbingUp, new[] { State.ClimbingDown, State.CliffHanging, State.FreeFalling } }, - { State.ClimbingDown, new[] { State.ClimbingUp, State.CliffHanging, State.FreeFalling, State.Idle } }, - { State.CliffHanging, new[] { State.ClimbingUp, State.ClimbingDown, State.Traversing, State.FreeFalling } }, - { State.Traversing, new[] { State.CliffHanging, State.FreeFalling } }, - { State.CliffArresting, new[] { State.CliffHanging, State.FreeFalling, State.Idle } }, - { State.FreeFalling, new[] { State.CliffArresting, State.CliffHanging, State.Idle, State.Walking, State.Running, State.Jumping } }, - { State.ReadingSign, new[] { State.Idle, State.Walking, State.Running } } + { State.Idle, new[] { State.Walking, State.Running, State.Jumping, State.ClimbingPrep, State.ClimbingUp, State.ClimbingDown, State.FreeFalling, State.ReadingSign }}, + { State.Walking, new[] { State.Idle, State.Running, State.Jumping, State.FreeFalling, State.ClimbingPrep, State.ReadingSign }}, + { State.Running, new[] { State.Idle, State.Walking, State.Jumping, State.FreeFalling, State.ClimbingPrep, State.ReadingSign }}, + { State.Jumping, new[] { State.Idle, State.FreeFalling, State.Walking }}, + { State.ClimbingPrep, new[] { State.ClimbingUp, State.Idle, State.Walking, State.Jumping }}, + { State.ClimbingUp, new[] { State.ClimbingDown, State.CliffHanging, State.FreeFalling, State.Idle }}, + { State.ClimbingDown, new[] { State.ClimbingUp, State.CliffHanging, State.FreeFalling, State.Idle }}, + { State.CliffHanging, new[] { State.ClimbingUp, State.ClimbingDown, State.Traversing, State.FreeFalling }}, + { State.Traversing, new[] { State.CliffHanging, State.FreeFalling }}, + { State.CliffArresting, new[] { State.CliffHanging, State.FreeFalling, State.Idle }}, + { State.FreeFalling, new[] { State.CliffArresting, State.CliffHanging, State.Idle, State.Walking, State.Running, State.Jumping }}, + { State.ReadingSign, new[] { State.Idle, State.Walking, State.Running }} }; // @formatter:on @@ -163,27 +151,29 @@ public override void _Ready() _camera = GetNode ("Camera2D"); _rayChest = GetNode ("Chest"); _rayFeet = GetNode ("Feet"); + _cliffs = GetNode ("../Cliffs"); + _waterfall = _cliffs.GetNode ("Waterfall"); _audio = GetNode ("PlayerSoundEffectsPlayer"); _audio.Stream = ResourceLoader.Load (CliffArrestingSoundFile); - LoopAudio (_audio.Stream, CliffArrestingSoundLoopBeginSeconds, CliffArrestingSoundLoopEndSeconds); _label = GetNode ("../UI/Control/Debugging Text"); _label.Visible = false; _sprite = GetNode ("AnimatedSprite"); + _area = _sprite.GetNode ("Area2D"); _energyMeter = GetNode ("../UI/Control/Energy Meter"); _energyMeter.Value = MaxEnergy; + _energy = MaxEnergy; _energyTimer = GetNode ("EnergyTimer"); _climbingPrepTimer = GetNode ("ClimbingReadyTimer"); - _energy = MaxEnergy; _energyMeterReplenishRatePerUnit = (float)EnergyMeterReplenishTimeSeconds / EnergyMeterUnits; _energyMeterDepletionRatePerUnit = (float)EnergyMeterDepletionTimeSeconds / EnergyMeterUnits; _sprite.Animation = IdleLeftAnimation; _sprite.Play(); InitializeStateMachine(); + LoopAudio (_audio.Stream, CliffArrestingSoundLoopBeginSeconds, CliffArrestingSoundLoopEndSeconds); } public override void _PhysicsProcess (float delta) { - _delta = delta; _stateMachine.Update(); HorizontalVelocity(); VerticalVelocity(); @@ -196,13 +186,13 @@ public override void _PhysicsProcess (float delta) PrintLine (DumpState()); Print(); - if (_stateMachine.Is (State.ClimbingUp) && IsEnergyKeyPressed() && _energy > 0 && + if (_stateMachine.Is (State.ClimbingUp) && IsDepletingEnergy() && !Mathf.IsEqualApprox (_energyTimer.WaitTime, _energyMeterDepletionRatePerUnit)) { _energyTimer.Start (_energyMeterDepletionRatePerUnit); } - if (_stateMachine.Is (State.ClimbingUp) && !IsEnergyKeyPressed() && _energy < MaxEnergy && + if (_stateMachine.Is (State.ClimbingUp) && IsReplenishingEnergy() && !Mathf.IsEqualApprox (_energyTimer.WaitTime, _energyMeterReplenishRatePerUnit)) { _energyTimer.Start (_energyMeterReplenishRatePerUnit); @@ -226,7 +216,7 @@ public void _OnEnergyTimerTimeout() return; } - if ((_stateMachine.Is (State.Running) || IsSpeedClimbing()) && _energy > 0) + if (IsDepletingEnergy() && (_stateMachine.Is (State.Running) || _stateMachine.Is (State.Jumping) || IsSpeedClimbing())) { _energy -= 1; _energyMeter.Value = _energy; @@ -234,20 +224,29 @@ public void _OnEnergyTimerTimeout() return; } - if ((_stateMachine.Is (State.Running) || IsSpeedClimbing()) && _energy == MaxEnergy) return; + if (_energy == MaxEnergy && (_stateMachine.Is (State.Running) || IsSpeedClimbing())) return; _energy += 1; _energyMeter.Value = _energy; } // ReSharper disable once UnusedMember.Global - public void _OnCliffsGroundExited (Area2D area) + public void _OnGroundEntered (Area2D area) { - if (!area.IsInGroup ("Player") || !_stateMachine.Is (State.ClimbingUp)) return; + if (!area.IsInGroup ("Player")) return; - _log.Debug ("Cliff grounds exited"); + _log.Debug ($"Player entered ground."); + _isInGround = true; + } - RestAfterClimbingToNewLevel(); + // ReSharper disable once UnusedMember.Global + public void _OnGroundExited (Area2D area) + { + if (!area.IsInGroup ("Player")) return; + + _log.Debug ($"Player exited ground."); + _isInGround = false; + if (_stateMachine.Is (State.ClimbingUp)) RestAfterClimbingUp(); } // ReSharper disable once UnusedMember.Global @@ -256,12 +255,11 @@ public void _OnCliffEdgeExited (Node body) if (!body.IsInGroup ("Player") || !_stateMachine.Is (State.FreeFalling) || _justRespawned) return; _log.Debug ("Cliff edge exited"); - _wasInCliffEdge = true; } // ReSharper disable once UnusedMember.Global - public void _OnPlayerAreaColliderEntered (Node body) + public void _OnPlayerAreaColliderBodyEntered (Node body) { if (body is not TileMap { Name: "Signs" } tileMap) return; @@ -270,7 +268,7 @@ public void _OnPlayerAreaColliderEntered (Node body) } // ReSharper disable once UnusedMember.Global - public void _OnPlayerAreaColliderExited (Node body) + public void _OnPlayerAreaColliderBodyExited (Node body) { if (body is not TileMap { Name: "Signs" }) return; @@ -297,7 +295,7 @@ private void CheckDropDownThrough() } case TileMap tileMap: { - DropDownThrough (tileMap, collision.Position); + DropDownThrough (tileMap); break; } @@ -310,49 +308,41 @@ private async void DropDownThrough (PhysicsBody2D body) _isDroppingDown = true; body.SetCollisionMaskBit (0, false); SetCollisionMaskBit (1, false); - await ToSignal (GetTree().CreateTimer (_delta * 2, false), "timeout"); + await ToSignal (GetTree(), "idle_frame"); body.SetCollisionMaskBit (0, true); SetCollisionMaskBit (1, true); _isDroppingDown = false; } - private async void DropDownThrough (TileMap tileMap, Vector2 collisionPosition) + private async void DropDownThrough (TileMap tileMap) { _isDroppingDown = true; tileMap.SetCollisionMaskBit (0, false); SetCollisionMaskBit (1, false); - await ToSignal (GetTree().CreateTimer (SecondsToDropDownThroughTile (collisionPosition, tileMap), false), "timeout"); + + for (var i = 0; i < TileNamesToDropdownFrames[GetIntersectingTileName (_area, _sprite.Animation, tileMap)]; ++i) + { + await ToSignal (GetTree(), "idle_frame"); + } + tileMap.SetCollisionMaskBit (0, true); SetCollisionMaskBit (1, true); _isDroppingDown = false; } - private float SecondsToDropDownThroughTile (Vector2 collisionPosition, TileMap tileMap) => - TileNamesToDropdownFrames[GetIntersectingTileName (collisionPosition, tileMap)] * _delta; - - private async void RestAfterClimbingToNewLevel() + private async void RestAfterClimbingUp() { _isResting = true; await ToSignal (GetTree().CreateTimer (ClimbingUpToNewLevelRestTimeSeconds, false), "timeout"); _isResting = false; } - private bool SignExists() - { - if (_signsTileMap == null || !IsIntersectingAnyTile (Position, _signsTileMap)) return false; - - var cell = GetIntersectingTileCell (Position, _signsTileMap); - var name = "(" + cell.x + "," + cell.y + ")"; - - return _signsTileMap.HasNode ("../" + name); - } - private void ReadSign() { - var cell = GetIntersectingTileCell (Position, _signsTileMap); - var name = "(" + cell.x + "," + cell.y + ")"; + var cell = GetTileCellAtCenterOf (_area, _sprite.Animation, _signsTileMap); + var name = GetReadableSignName (cell); - if (!_signsTileMap.HasNode ("../" + name)) + if (!HasReadableSign (name)) { _log.Warn ($"Attempting to read non-existent sign: {name}."); _stateMachine.To (State.Idle); @@ -360,13 +350,13 @@ private void ReadSign() return; } - var readableSign = _signsTileMap.GetNode ("../" + name); - GetNode ("../Upper Cliffs/Waterfall/waterfall 1/AudioStreamPlayer2D").Attenuation = 4.0f; - GetNode ("../Upper Cliffs/Waterfall/waterfall 2/AudioStreamPlayer2D").Attenuation = 4.0f; + var readableSign = GetReadableSign (name); + _waterfall.GetNode ("Water 9/AudioStreamPlayer2D").Attenuation = 4.0f; + _waterfall.GetNode ("Water 10/AudioStreamPlayer2D").Attenuation = 4.0f; - for (var i = 1; i < 4; ++i) + for (var i = 1; i <= 3; ++i) { - var mist = GetNode ("../Upper Cliffs/Waterfall/waterfall mist " + i); + var mist = _waterfall.GetNode ("Mist " + i); mist.ZIndex = 4; mist.Modulate = new Color (Modulate.r, Modulate.g, Modulate.b, Modulate.a * 0.2f); } @@ -389,20 +379,17 @@ private void StopReadingSign() Visible = true; _readableSign.Visible = false; _signsTileMap.Visible = true; - - _signsTileMap.GetNode ("../Signs Winter Layer").Visible = - GetNode ("../Upper Cliffs").CurrentSeason == Cliffs.Season.Winter; - + _signsTileMap.GetNode ("../Signs Winter Layer").Visible = _cliffs.CurrentSeason == Cliffs.Season.Winter; _camera.Zoom = Vector2.One; _camera.Position = new Vector2 (0, -355); _camera.ForceUpdateScroll(); _camera.Position = new Vector2 (0, 0); - GetNode ("../Upper Cliffs/Waterfall/waterfall 1/AudioStreamPlayer2D").Attenuation = 8.28f; - GetNode ("../Upper Cliffs/Waterfall/waterfall 2/AudioStreamPlayer2D").Attenuation = 8.28f; + _waterfall.GetNode ("Water 9/AudioStreamPlayer2D").Attenuation = 8.28f; + _waterfall.GetNode ("Water 10/AudioStreamPlayer2D").Attenuation = 8.28f; - for (var i = 1; i < 4; ++i) + for (var i = 1; i <= 3; ++i) { - var mist = GetNode ("../Upper Cliffs/Waterfall/waterfall mist " + i); + var mist = _waterfall.GetNode ("Mist " + i); mist.ZIndex = 1; mist.Modulate = new Color (Modulate.r, Modulate.g, Modulate.b); } @@ -416,13 +403,25 @@ private void Respawn() _justRespawned = true; } + // @formatter:off + private bool HasReadableSign() => HasReadableSign (GetReadableSignName()); + private bool HasReadableSign (string name) => _signsTileMap?.HasNode ("../" + name) ?? false; + private string GetReadableSignName() => GetReadableSignName (GetIntersectingTileCell (_area, _sprite.Animation, _signsTileMap)); + private static string GetReadableSignName (Vector2 tileSignCell) => "Readable Sign (" + tileSignCell.x + ", " + tileSignCell.y + ")"; + private Sprite GetReadableSign (string name) => _signsTileMap?.GetNode ("../" + name); private bool IsSpeedClimbing() => _stateMachine.Is (State.ClimbingUp) && IsEnergyKeyPressed(); private static int GetClimbingSpeedBoost() => IsEnergyKeyPressed() ? 2 : 1; + private bool IsDepletingEnergy() => _energy > 0 && IsEnergyKeyPressed(); + private bool JustDepletedAllEnergy() => _energy == 0 && IsEnergyKeyPressed(); + private bool IsReplenishingEnergy() => _energy < MaxEnergy && !IsEnergyKeyPressed(); private bool IsMoving() => IsMovingHorizontally() || IsMovingVertically(); private bool IsMovingVertically() => Mathf.Abs (_velocity.y) > VelocityEpsilon; private bool IsMovingHorizontally() => Mathf.Abs (_velocity.x) > VelocityEpsilon; private bool IsMovingUp() => _velocity.y + VelocityEpsilon < 0.0f; private bool IsMovingDown() => _velocity.y - VelocityEpsilon > 0.0f; + private float GetFallingTimeSeconds() => _elapsedFallingTimeMs > 0 ? _elapsedFallingTimeMs / 1000.0f : _lastTotalFallingTimeMs / 1000.0f; + private void PrintLine (string line) => _printLines.Add (line); + // @formatter:on private void HorizontalVelocity() { @@ -487,11 +486,9 @@ private void HorizontalVelocity() // TODO Check if walking/running or jumping // TODO Get rid of else if // Friction - // @formatter:off if (!IsAnyHorizontalArrowPressed()) _velocity.x *= HorizontalRunJumpStoppingFriction; else if (_stateMachine.Is (State.Traversing)) _velocity.x *= TraverseFriction; else _velocity.x *= HorizontalRunJumpFriction; - // @formatter:on } private void VerticalVelocity() @@ -509,6 +506,7 @@ private void VerticalVelocity() if (_stateMachine.Is (State.CliffHanging)) _velocity.y = 0.0f; // @formatter:on + // ReSharper disable once InvertIf if (_stateMachine.Is (State.CliffArresting)) { _velocity.y -= CliffArrestingSpeed; @@ -542,16 +540,12 @@ private async void Animations() // Workaround for https://github.com/godotengine/godot/issues/14578 "Changing node parent produces Area2D/3D signal duplicates" await ToSignal (GetTree(), "idle_frame"); - GetNode ("../Upper Cliffs/Upper Cliffs Top Ground Static Collider 1/Area2D").SetBlockSignals (true); - GetNode ("../Upper Cliffs/Upper Cliffs Top Ground Static Collider 2/Area2D").SetBlockSignals (true); - GetNode ("../Upper Cliffs/Upper Cliffs Top Ground Static Collider 3/Area2D").SetBlockSignals (true); - GetNode ("../Upper Cliffs/Upper Cliffs Top Ground Static Collider 4/Area2D").SetBlockSignals (true); - GetNode ("../Upper Cliffs/Upper Cliffs Bottom Ground Static Collider/Area2D").SetBlockSignals (true); + for (var i = 1; i <= 6; ++i) _cliffs.GetNode ("Ground " + i + "/Area2D").SetBlockSignals (true); await ToSignal (GetTree(), "idle_frame"); _sprite.GetNode ("Area2D").SetBlockSignals (true); - GetNode ("../Upper Cliffs").SetBlockSignals (true); - GetNode ("../Upper Cliffs/Waterfall").SetBlockSignals (true); - GetNode ("../Lower Cliffs").SetBlockSignals (true); + _cliffs.SetBlockSignals (true); + _cliffs.GetNode ("Signs").SetBlockSignals (true); + _waterfall.SetBlockSignals (true); // End workaround foreach (var node in _sprite.GetNode ("Area2D").GetChildren()) @@ -563,16 +557,12 @@ private async void Animations() // Workaround for https://github.com/godotengine/godot/issues/14578 "Changing node parent produces Area2D/3D signal duplicates" await ToSignal (GetTree(), "idle_frame"); - GetNode ("../Upper Cliffs/Upper Cliffs Top Ground Static Collider 1/Area2D").SetBlockSignals (false); - GetNode ("../Upper Cliffs/Upper Cliffs Top Ground Static Collider 2/Area2D").SetBlockSignals (false); - GetNode ("../Upper Cliffs/Upper Cliffs Top Ground Static Collider 3/Area2D").SetBlockSignals (false); - GetNode ("../Upper Cliffs/Upper Cliffs Top Ground Static Collider 4/Area2D").SetBlockSignals (false); - GetNode ("../Upper Cliffs/Upper Cliffs Bottom Ground Static Collider/Area2D").SetBlockSignals (false); + for (var i = 1; i <= 6; ++i) _cliffs.GetNode ("Ground " + i + "/Area2D").SetBlockSignals (false); await ToSignal (GetTree(), "idle_frame"); _sprite.GetNode ("Area2D").SetBlockSignals (false); - GetNode ("../Upper Cliffs").SetBlockSignals (false); - GetNode ("../Upper Cliffs/Waterfall").SetBlockSignals (false); - GetNode ("../Lower Cliffs").SetBlockSignals (false); + _cliffs.SetBlockSignals (false); + _cliffs.GetNode ("Signs").SetBlockSignals (false); + _waterfall.SetBlockSignals (false); // End workaround } @@ -605,14 +595,6 @@ private void CalculateFallingStats() } } - private async void AnimationDelay (string toAnimation, State toState, float delaySeconds) - { - await ToSignal (GetTree().CreateTimer (delaySeconds, false), "timeout"); - if (_stateMachine.Is (toState)) _sprite.Animation = toAnimation; - } - - private void PrintLine (string line) => _printLines.Add (line); - private void Print() { _label.Text = ""; @@ -621,13 +603,11 @@ private void Print() _printLines.Clear(); } - private float GetFallingTimeSeconds() => - _elapsedFallingTimeMs > 0 ? _elapsedFallingTimeMs / 1000.0f : _lastTotalFallingTimeMs / 1000.0f; - // @formatter:off + private string DumpState() => "\nState: " + _stateMachine.GetState() + - "\nSeason: " + GetNode ("../Upper Cliffs").CurrentSeason + + "\nSeason: " + _cliffs.CurrentSeason + "\nIdle: " + _stateMachine.Is (State.Idle) + "\nWalking: " + _stateMachine.Is (State.Walking) + "\nRunning: " + _stateMachine.Is (State.Running) + @@ -648,7 +628,7 @@ private string DumpState() => "\nIsOnFloor(): " + IsOnFloor() + "\nIsHittingWall(): " + IsHittingWall() + "\nIsInCliffs: " + IsInCliffs + - "\nIsInGround: " + IsInGround + + "\nIsInGround: " + _isInGround + "\n_isInSign: " + _isInSign + "\n_isResting: " + _isResting + "\n_wasRunning: " + _wasRunning + @@ -674,18 +654,25 @@ private string DumpState() => "\nHighest vertical velocity: " + _highestVerticalVelocity + "\nHighest vertical velocity (mph): " + _highestVerticalVelocity * 0.028334573333333 + "\nFalling time (sec): " + GetFallingTimeSeconds(); + // @formatter:on private void InitializeStateMachine() { + // @formatter:off _stateMachine = new StateMachine (TransitionTable, InitialState); - _stateMachine.OnTransitionFrom (State.ClimbingPrep, () => _climbingPrepTimer.Stop()); - _stateMachine.OnTransitionTo (State.Traversing, () => _sprite.Animation = TraversingAnimation); _stateMachine.OnTransition (State.Walking, State.Idle, () => _sprite.Animation = IdleLeftAnimation); _stateMachine.OnTransition (State.Running, State.Idle, () => _sprite.Animation = IdleLeftAnimation); + _stateMachine.OnTransition (State.CliffArresting, State.Idle, () => _sprite.Animation = IdleLeftAnimation); + _stateMachine.OnTransition (State.ClimbingDown, State.Idle, () => _sprite.Animation = IdleLeftAnimation); _stateMachine.OnTransition (State.FreeFalling, State.Idle, () => _sprite.Animation = IdleLeftAnimation); + _stateMachine.OnTransition (State.ReadingSign, State.Idle, () => _sprite.Animation = IdleLeftAnimation); + _stateMachine.OnTransitionFrom (State.ReadingSign, StopReadingSign); + _stateMachine.OnTransitionTo (State.ReadingSign, ReadSign); + _stateMachine.OnTransitionFrom (State.ClimbingPrep, () => _climbingPrepTimer.Stop()); + _stateMachine.OnTransitionTo (State.Traversing, () => _sprite.Animation = TraversingAnimation); _stateMachine.OnTransitionTo (State.FreeFalling, () => _sprite.Animation = FreeFallingAnimation); - _stateMachine.OnTransition (State.CliffArresting, State.Idle, () => _sprite.Animation = IdleLeftAnimation); + // @formatter:on _stateMachine.OnTransitionFrom (State.Idle, () => { @@ -757,6 +744,15 @@ private void InitializeStateMachine() _climbingPrepTimer.Start(); }); + // TODO Add state machine method OnTransitionExceptFrom (State.ReadingSign, State.Idle, () => _sprite.Animation = IdleLeftAnimation); + // TODO This eliminates transition repetition when an exception is needed (all transitions to a state, except from a specific state). + // TODO Catch-all OnTransitionFrom (State.Running) replenishes the energy meter before the running => jumping transition has a chance to start depleting it. + // TODO Running and jumping uses energy energy meter while jumping. + _stateMachine.OnTransition (State.Running, State.Jumping, () => + { + _energyTimer.Start (_energyMeterDepletionRatePerUnit); + }); + _stateMachine.OnTransitionFrom (State.Running, () => { if (_energy < MaxEnergy) _energyTimer.Start (_energyMeterReplenishRatePerUnit); @@ -794,57 +790,54 @@ private void InitializeStateMachine() // @formatter:off - _stateMachine.OnTransitionFrom (State.ReadingSign, StopReadingSign); - _stateMachine.OnTransitionTo (State.ReadingSign, ReadSign); - _stateMachine.OnTransition (State.ReadingSign, State.Idle, () => AnimationDelay (IdleLeftAnimation, State.Idle, FinishedReadingSignAnimationDelaySeconds)); - // TODO Move conditions into state machine conditions, leaving only input for triggers. - _stateMachine.AddTrigger (State.Idle, State.Walking, () => IsOneActiveOf (Input.Horizontal) && !IsEnergyKeyPressed()); - _stateMachine.AddTrigger (State.Idle, State.Running, () => IsOneActiveOf (Input.Horizontal) && IsEnergyKeyPressed() && _energy > 0 && !IsHittingWall()); + _stateMachine.AddTrigger (State.Idle, State.Walking, () => IsOneActiveOf (Input.Horizontal) && !IsDepletingEnergy()); + _stateMachine.AddTrigger (State.Idle, State.Running, () => IsOneActiveOf (Input.Horizontal) && IsDepletingEnergy() && !IsHittingWall()); _stateMachine.AddTrigger (State.Idle, State.Jumping, WasJumpKeyPressed); _stateMachine.AddTrigger (State.Idle, State.ClimbingPrep, () => IsUpArrowPressed() && IsInCliffs && !_isInSign && !_isResting); _stateMachine.AddTrigger (State.Idle, State.ClimbingDown, () => IsDownArrowPressed() && IsMovingDown() && !IsOnFloor() && IsInCliffs && !_isDroppingDown); _stateMachine.AddTrigger (State.Idle, State.FreeFalling, () => !IsDownArrowPressed() && IsMovingDown() && !IsOnFloor()); - _stateMachine.AddTrigger (State.Idle, State.ReadingSign, ()=> IsUpArrowPressed() && _isInSign && SignExists() && !_isResting); - _stateMachine.AddTrigger (State.Walking, State.Idle, () => !IsOneActiveOf (Input.Horizontal) && !IsMovingHorizontally()); - _stateMachine.AddTrigger (State.Walking, State.Running, () => IsOneActiveOf (Input.Horizontal) && IsEnergyKeyPressed() && _energy > 0 && IsMovingHorizontally()); + _stateMachine.AddTrigger (State.Idle, State.ReadingSign, ()=> IsUpArrowPressed() && _isInSign && HasReadableSign() && !_isResting); + _stateMachine.AddTrigger (State.Walking, State.Idle, () => !IsOneActiveOf (Input.Horizontal) && !IsMovingHorizontally() && !(_isInSign && IsUpArrowPressed())); + _stateMachine.AddTrigger (State.Walking, State.Running, () => IsOneActiveOf (Input.Horizontal) && IsMovingHorizontally() && IsDepletingEnergy()); _stateMachine.AddTrigger (State.Walking, State.Jumping, WasJumpKeyPressed); _stateMachine.AddTrigger (State.Walking, State.FreeFalling, () => IsMovingDown() && !IsOnFloor() && !IsHittingWall()); _stateMachine.AddTrigger (State.Walking, State.ClimbingPrep, () => IsUpArrowPressed() && IsInCliffs && !_isInSign); - _stateMachine.AddTrigger (State.Walking, State.ReadingSign, ()=> IsUpArrowPressed() && _isInSign && SignExists()); + _stateMachine.AddTrigger (State.Walking, State.ReadingSign, ()=> IsUpArrowPressed() && _isInSign && HasReadableSign()); _stateMachine.AddTrigger (State.Running, State.Idle, () => !IsOneActiveOf (Input.Horizontal) && !IsMovingHorizontally()); - _stateMachine.AddTrigger (State.Running, State.Walking, () => IsOneActiveOf (Input.Horizontal) && (!IsEnergyKeyPressed() || _energy == 0)); + _stateMachine.AddTrigger (State.Running, State.Walking, () => IsOneActiveOf (Input.Horizontal) && !IsDepletingEnergy() || JustDepletedAllEnergy()); _stateMachine.AddTrigger (State.Running, State.Jumping, WasJumpKeyPressed); _stateMachine.AddTrigger (State.Running, State.FreeFalling, () => IsMovingDown() && !IsOnFloor() && !IsHittingWall()); _stateMachine.AddTrigger (State.Running, State.ClimbingPrep, () => IsUpArrowPressed() && IsInCliffs && !_isInSign); - _stateMachine.AddTrigger (State.Running, State.ReadingSign, ()=> IsUpArrowPressed() && _isInSign && SignExists()); + _stateMachine.AddTrigger (State.Running, State.ReadingSign, ()=> IsUpArrowPressed() && _isInSign && HasReadableSign()); _stateMachine.AddTrigger (State.Jumping, State.FreeFalling, () => IsMovingDown() && !IsOnFloor()); _stateMachine.AddTrigger (State.ClimbingPrep, State.Idle, WasUpArrowReleased); _stateMachine.AddTrigger (State.ClimbingPrep, State.ClimbingUp, () => IsUpArrowPressed() && _climbingPrepTimer.TimeLeft == 0 && !IsTouchingCliffIce && !IsInFrozenWaterfall); - _stateMachine.AddTrigger (State.ClimbingUp, State.FreeFalling, () => WasJumpKeyPressed() || !IsInCliffs && !IsInGround || IsTouchingCliffIce || IsInFrozenWaterfall || _isResting || IsEnergyKeyPressed() && _energy == 0); - _stateMachine.AddTrigger (State.ClimbingUp, State.CliffHanging, () => WasUpArrowReleased() && !IsDownArrowPressed() && (IsInCliffs || IsInGround)); - _stateMachine.AddTrigger (State.ClimbingUp, State.ClimbingDown, () => WasUpArrowReleased() && IsDownArrowPressed() && (IsInCliffs || IsInGround)); - _stateMachine.AddTrigger (State.ClimbingDown, State.CliffHanging, () => WasDownArrowReleased() && !IsUpArrowPressed() && (IsInCliffs || IsInGround)); + _stateMachine.AddTrigger (State.ClimbingUp, State.FreeFalling, () => (WasJumpKeyPressed() || !IsInCliffs && !_isInGround || IsTouchingCliffIce || IsInFrozenWaterfall || JustDepletedAllEnergy()) && !_isResting); + _stateMachine.AddTrigger (State.ClimbingUp, State.Idle, () => _isResting); + _stateMachine.AddTrigger (State.ClimbingUp, State.CliffHanging, () => WasUpArrowReleased() && !IsDownArrowPressed() && (IsInCliffs || _isInGround)); + _stateMachine.AddTrigger (State.ClimbingUp, State.ClimbingDown, () => WasUpArrowReleased() && IsDownArrowPressed() && (IsInCliffs || _isInGround)); + _stateMachine.AddTrigger (State.ClimbingDown, State.CliffHanging, () => WasDownArrowReleased() && !IsUpArrowPressed() && (IsInCliffs || _isInGround)); _stateMachine.AddTrigger (State.ClimbingDown, State.Idle, IsOnFloor); - _stateMachine.AddTrigger (State.ClimbingDown, State.ClimbingUp, () => WasDownArrowReleased() && IsUpArrowPressed() && (IsInCliffs || IsInGround)); - _stateMachine.AddTrigger (State.ClimbingDown, State.FreeFalling, () => WasJumpKeyPressed() || !IsInCliffs && !IsInGround || IsTouchingCliffIce || IsInFrozenWaterfall || _isResting); + _stateMachine.AddTrigger (State.ClimbingDown, State.ClimbingUp, () => WasDownArrowReleased() && IsUpArrowPressed() && (IsInCliffs || _isInGround)); + _stateMachine.AddTrigger (State.ClimbingDown, State.FreeFalling, () => WasJumpKeyPressed() || !IsInCliffs && !_isInGround || IsTouchingCliffIce || IsInFrozenWaterfall || _isResting); _stateMachine.AddTrigger (State.FreeFalling, State.Idle, () => !IsOneActiveOf (Input.Horizontal) && IsOnFloor() && !IsMovingHorizontally()); - _stateMachine.AddTrigger (State.FreeFalling, State.Walking, () => IsOneActiveOf (Input.Horizontal) && !IsEnergyKeyPressed() && IsOnFloor()); - _stateMachine.AddTrigger (State.FreeFalling, State.Running, () => IsOneActiveOf (Input.Horizontal) && IsEnergyKeyPressed() && _energy > 0 && IsOnFloor()); + _stateMachine.AddTrigger (State.FreeFalling, State.Walking, () => IsOneActiveOf (Input.Horizontal) && IsOnFloor() && !IsDepletingEnergy() ); + _stateMachine.AddTrigger (State.FreeFalling, State.Running, () => IsOneActiveOf (Input.Horizontal) && IsOnFloor() && IsDepletingEnergy()); _stateMachine.AddTrigger (State.FreeFalling, State.CliffArresting, () => IsItemKeyPressed() && IsInCliffs && _velocity.y >= CliffArrestingActivationVelocity); - _stateMachine.AddTrigger (State.FreeFalling, State.CliffHanging, () => _wasInCliffEdge && (IsInCliffs || IsInGround)); + _stateMachine.AddTrigger (State.FreeFalling, State.CliffHanging, () => _wasInCliffEdge && (IsInCliffs || _isInGround)); _stateMachine.AddTrigger (State.CliffHanging, State.ClimbingUp, IsUpArrowPressed); _stateMachine.AddTrigger (State.CliffHanging, State.ClimbingDown, IsDownArrowPressed); _stateMachine.AddTrigger (State.CliffHanging, State.FreeFalling, WasJumpKeyPressed); _stateMachine.AddTrigger (State.CliffHanging, State.Traversing, () => IsOneActiveOf (Input.Horizontal)); - _stateMachine.AddTrigger (State.Traversing, State.FreeFalling, () => WasJumpKeyPressed() || !IsInCliffs && !IsInGround || IsTouchingCliffIce || IsInFrozenWaterfall); + _stateMachine.AddTrigger (State.Traversing, State.FreeFalling, () => WasJumpKeyPressed() || !IsInCliffs && !_isInGround || IsTouchingCliffIce || IsInFrozenWaterfall); _stateMachine.AddTrigger (State.Traversing, State.CliffHanging, () => !IsOneActiveOf (Input.Horizontal) && !IsMovingHorizontally()); _stateMachine.AddTrigger (State.CliffArresting, State.FreeFalling, WasItemKeyReleased); _stateMachine.AddTrigger (State.CliffArresting, State.CliffHanging, () => !IsOnFloor() && !IsMoving() && IsInCliffs); _stateMachine.AddTrigger (State.CliffArresting, State.Idle, IsOnFloor); _stateMachine.AddTrigger (State.ReadingSign, State.Idle, ()=> IsDownArrowPressed() && !IsUpArrowPressed() && _isInSign); - _stateMachine.AddTrigger (State.ReadingSign, State.Walking, ()=> IsOneActiveOf (Input.Horizontal) && !IsAnyActiveOf (Input.Vertical) && !IsEnergyKeyPressed() && _isInSign); - _stateMachine.AddTrigger (State.ReadingSign, State.Running, ()=> IsOneActiveOf (Input.Horizontal) && !IsAnyActiveOf (Input.Vertical) && IsEnergyKeyPressed() && _energy > 0 && _isInSign); + _stateMachine.AddTrigger (State.ReadingSign, State.Walking, ()=> IsOneActiveOf (Input.Horizontal) && !IsAnyActiveOf (Input.Vertical) && !IsDepletingEnergy() && _isInSign); + _stateMachine.AddTrigger (State.ReadingSign, State.Running, ()=> IsOneActiveOf (Input.Horizontal) && !IsAnyActiveOf (Input.Vertical) && IsDepletingEnergy() && _isInSign); // @formatter:on } diff --git a/StateMachine.cs b/StateMachine.cs index 8e83076..ad2881b 100644 --- a/StateMachine.cs +++ b/StateMachine.cs @@ -4,6 +4,7 @@ using System.Runtime.CompilerServices; // TODO Implement per-frame delegate actions that repeat while in a specific state. +// TODO Implement Godot callback triggers or allow the state machine to register / listen for emitted signals. // 1. Child states can be pushed and popped from a parent state. // 2. Child state can transition to new parent state. // 3. Parent states cannot be pushed / popped. @@ -14,7 +15,7 @@ public class StateMachine : IStateMachine where T : struct, Enum private T _currentState; private T _parentState; private readonly T _initialState; - private static readonly T AnyState = (T) (object) -1; + private static readonly T AnyState = (T)(object)-1; private readonly Dictionary > _transitionTable; private readonly Stack _childStates = new(); private readonly Dictionary .TransitionAction>> _actions = new(); @@ -232,15 +233,11 @@ private bool ShouldExecuteChangeState (T to) return false; } - // ReSharper disable once InvertIf - if (!CanTransitionTo (to)) - { - _log.Warn ($"Ignoring invalid transition from {ToString (_currentState)} to {ToString (to)}."); + if (CanTransitionTo (to)) return true; - return false; - } + _log.Warn ($"Ignoring invalid transition from {ToString (_currentState)} to {ToString (to)}."); - return true; + return false; } private void ExecuteChangeState (T to) diff --git a/StringExtensions.cs b/StringExtensions.cs new file mode 100644 index 0000000..a8a9b31 --- /dev/null +++ b/StringExtensions.cs @@ -0,0 +1,4 @@ +public static class StringExtensions +{ + public static string NullIfEmpty (this string s) => string.IsNullOrEmpty (s) ? null : s; +} \ No newline at end of file diff --git a/TestPerchableImpl.cs b/TestPerchableImpl.cs deleted file mode 100644 index 2ce1ba2..0000000 --- a/TestPerchableImpl.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; -using Godot; - -public class TestPerchableImpl : AbstractPerch -{ - public TestPerchableImpl (string name, Vector2 globalOrigin, PerchableDrawPrefs drawPrefs, List perchableAreasInLocalSpace, - float positionEpsilon) : base (name, globalOrigin, drawPrefs, perchableAreasInLocalSpace, positionEpsilon) - { - } -} \ No newline at end of file diff --git a/Tools.cs b/Tools.cs index 2f96955..d9d3e84 100644 --- a/Tools.cs +++ b/Tools.cs @@ -40,10 +40,7 @@ public enum Input { Input.Energy, new[] { "energy" } } }; - // ReSharper disable once InconsistentNaming public delegate void DrawPrimitive (Vector2[] points, Color[] colors, Vector2[] uvs); - - // ReSharper disable once InconsistentNaming public delegate void DrawRect (Rect2 rect, Color color, bool filled); public delegate Transform GetLocalTransform(); public delegate Vector2 Transform (Vector2 point); @@ -85,7 +82,6 @@ public static bool IsAnyArrowKeyPressedExcept (Input arrow) var left = IsLeftArrowPressed(); var right = IsRightArrowPressed(); - // ReSharper disable once SwitchExpressionHandlesSomeKnownEnumValuesWithExceptionInDefault return arrow switch { Input.Horizontal => up || down, @@ -94,7 +90,7 @@ public static bool IsAnyArrowKeyPressedExcept (Input arrow) Input.Down => left || right || up, Input.Left => right || up || down, Input.Right => left || up || down, - _ => throw new ArgumentOutOfRangeException ($"Unsupported arrow input type: {nameof (arrow)}") + _ => false }; } @@ -193,21 +189,6 @@ public static void LoopAudio (AudioStream stream, float loopBeginSeconds, float } } - public static Vector2 GetExtents (Area2D area, string colliderName) - { - var collisionShape = area.GetNode (colliderName); - - // ReSharper disable once InvertIf - if (collisionShape.Shape is not RectangleShape2D collisionRect) - { - OnWrongCollisionShape (area, collisionShape.Shape); - - return Vector2.Zero; - } - - return collisionRect.Extents * area.GlobalScale.Abs(); - } - public static Vector2 RandomPointIn (Rect2 rect, RandomNumberGenerator rng, Vector2 multiple) { var p = rect.Position - Vector2.One; @@ -220,36 +201,67 @@ public static Vector2 RandomPointIn (Rect2 rect, RandomNumberGenerator rng, Vect return p; } - public static string GetIntersectingTileName (Vector2 pos, TileMap t) + public static Rect2 GetAreaColliderRect (Area2D area, CollisionShape2D collider) + { + if (!area.HasNode (collider.Name) || collider.Shape is not RectangleShape2D rect) return new Rect2(); + + var extents = rect.Extents * area.GlobalScale.Abs(); + + return new Rect2 (collider.GlobalPosition - extents, extents * 2); + } + + public static string GetTileName (Vector2 cell, TileMap t) { - var id = GetIntersectingTileId (pos, t); + var id = t.GetCellv (cell); return id != -1 ? t.TileSet.TileGetName (id) : ""; } - public static string NameOf (Node body, Vector2 pos) + public static Vector2 GetTileCellAtCenterOf (Area2D area, CollisionShape2D collider, TileMap t) + { + var rect = GetAreaColliderRect (area, collider); + + return GetTileCellAtAnyOf (new List { t.WorldToMap (t.ToLocal (rect.Position + rect.Size / 2)) }, t); + } + + public static Vector2 GetIntersectingTileCell (Area2D area, CollisionShape2D collider, TileMap t) { - var tileName = body is TileMap tileMap ? GetIntersectingTileName (pos, tileMap) : ""; + var rect = GetAreaColliderRect (area, collider); - return tileName.Empty() ? body?.Name : tileName; + var cornerCells = new List + { + t.WorldToMap (t.ToLocal (rect.Position)), + t.WorldToMap (t.ToLocal (new Vector2 (rect.End.x - 1, rect.Position.y))), + t.WorldToMap (t.ToLocal (new Vector2 (rect.Position.x, rect.End.y - 1))), + t.WorldToMap (t.ToLocal (rect.End - Vector2.One)) + }; + + return GetTileCellAtAnyOf (cornerCells, t); } // @formatter:off - public static Vector2 GetCellCenterOffset (TileMap t) => t.CellSize * t.GlobalScale / 2; - public static bool IsIntersectingAnyTile (Vector2 pos, TileMap t) => GetIntersectingTileId (pos, t) != -1; - public static int GetIntersectingTileId (Vector2 pos, TileMap t) => t.GetCellv (GetIntersectingTileCell (pos, t)); - public static Vector2 GetIntersectingTileCell (Vector2 pos, TileMap t) => t.WorldToMap (t.ToLocal (pos)); - public static Vector2 GetTileCellGlobalPosition (Vector2 cell, TileMap t) => t.ToGlobal (t.MapToWorld (cell)); - public static string GetTileCellName (Vector2 cell, TileMap t) => GetIntersectingTileName (GetTileCellGlobalPosition (cell, t), t); - public static Vector2 GetIntersectingTileCellGlobalPosition (Vector2 pos, TileMap t) => t.ToGlobal (t.MapToWorld (t.WorldToMap (t.ToLocal (pos)))); - public static bool IsPositionInRange (Vector2 pos1, Vector2 pos2, Vector2 range) => Mathf.Abs(pos1.x - pos2.x) <= range.Abs().x && Mathf.Abs(pos1.y - pos2.y) <= range.Abs().y; - public static Vector2 RandomizeRange (RandomNumberGenerator rng, Vector2 range) => new(rng.RandiRange ((int)-range.x, (int)range.x), rng.RandiRange ((int)-range.y, (int)range.y)); - private static void OnWrongCollisionShape (Node node, Shape2D shape) => GD.PrintErr (node.Name + " collision shape must be a " + typeof (RectangleShape2D) + ", not a " + shape.GetType()); + public static bool LessThan (Vector2 v1, Vector2 v2) => v1.x < v2.x && v1.y < v2.y; + public static bool GreaterThan (Vector2 v1, Vector2 v2) => v1.x > v2.x && v1.y > v2.y; + public static bool LessThanOrEqual (Vector2 v1, Vector2 v2) => v1.x <= v2.x && v1.y <= v2.y; + public static bool GreaterThanOrEqual (Vector2 v1, Vector2 v2) => v1.x >= v2.x && v1.y >= v2.y; public static bool IsEnclosedBy (Rect2 original, IReadOnlyCollection overlaps) => overlaps.Aggregate (new List { original }, (x, _) => GetUncoveredRects (x, overlaps)).Count == 0; public static bool IsEnclosedBy (Rect2 rect1, Rect2 rect2) => rect1.Position.x >= rect2.Position.x && rect1.End.x <= rect2.End.x && rect1.Position.y >= rect2.Position.y && rect1.End.y <= rect2.End.y; + public static Vector2 GetTileCellAtCenterOf (Area2D area, string colliderName, TileMap t) => GetTileCellAtCenterOf (area, area.GetNode (colliderName), t); + public static bool IsIntersectingAnyTile (Area2D area, string colliderName, TileMap t) => IsIntersectingAnyTile (area, area.GetNode (colliderName), t); + public static bool IsIntersectingAnyTile (Area2D area, CollisionShape2D collider, TileMap t) => GetIntersectingTileId (area, collider, t) != -1; + public static int GetIntersectingTileId (Area2D area, CollisionShape2D collider, TileMap t) => t.GetCellv (GetIntersectingTileCell (area, collider, t)); + public static string GetIntersectingTileName (Area2D area, CollisionShape2D collider, TileMap t) => GetTileName (GetIntersectingTileCell (area, collider, t), t); + public static string GetIntersectingTileName (Area2D area, string colliderName, TileMap t) => GetIntersectingTileName (area, area.GetNode (colliderName), t); + public static Vector2 GetIntersectingTileCell (Area2D area, string colliderName, TileMap t) => GetIntersectingTileCell (area, area.GetNode (colliderName), t); + public static Vector2 GetTileCellGlobalPosition (Vector2 cell, TileMap t) => t.ToGlobal (t.MapToWorld (cell)); + public static Vector2 GetIntersectingTileCellGlobalPosition (Area2D area, CollisionShape2D collider, TileMap t) => GetTileCellGlobalPosition (GetIntersectingTileCell (area, collider, t), t); public static string ToString (IEnumerable e, string sep = ", ", Func f = null) => e.Select (f ?? (s => s.ToString())).DefaultIfEmpty (string.Empty).Aggregate ((a, b) => a + sep + b); // @formatter:on + private static Vector2 GetTileCellAtAnyOf (IReadOnlyCollection cells, TileMap t) => + t.GetUsedCells().Cast ().FirstOrDefault (a => + cells.Any (b => GreaterThanOrEqual (b, a) && LessThan (b - a, (t.CellSize.Inverse() * 16.0f).Round()))); + private static List GetUncoveredRects (IEnumerable originals, IReadOnlyCollection overlaps) { return originals.Where (x => !overlaps.Any (y => IsEnclosedBy (x, y))).Aggregate (new List (), diff --git a/asesprite/klas.aseprite b/asesprite/klas.aseprite index 1ba5d12c7aaedce6abe2656a0e4e470d7b8c3d35..ec7c98e70bf3b14e2460d4f9bf0d2d7b1230cfed 100644 GIT binary patch delta 1208 zcmccUc+qh}1Ebr<#z{;D@(c_NEDFp(5(fSQ8SD%`iIu5E3Whs?90>(Bm>dJ+WC!Nu zjCUr_XOpf^PH6Ku;fGisvQC{`ICiOR?oF6ef59I5|x;$|L1#y7#@drKYmy> z@$2IY+|Qc7G-L=kY`Z?IpWA2l%$bU>nOD0XFO>^Q_^WqmQ9<>EuZ;$0Vhz@uKg)Qn zc?rK|&xSVcGrb0TcN_}x2;_LfF2I}I{H5v3!kxU%@+V^AoP!h%*fu&QRlH&DZoG2n z4BJiCq{BxXBxc)9s7@&RFKHQj(sKA8~hV>GAzfbOC)2VNr zxRHy=kf+VME9qbpN9jj1^TL;pUOl*W*Y(ANfqyRw&KA?pFCcB7VQ*k)LxkmtIMFS!=)H*ZJfl-nKuuPNy4uFi0%icSH5}qV*H2 z)?Pnr%ssioVj&T_o|cUtJpiz)g~>%v-c-(D*1OK+GS@k8QqJm2?q=lfbE zcJ8cO;mZ5WP5;QG=B)p1+dceW>;C@4AGNndTXnPPjK=lbKNa+l#yGhN7}aW%rfcidN$3{3)w%4#qRpVCwI!*rS8FWzgvYm zHA0v6sGRL7u9wv`DL*gcsp;8M*fn*_=g9YU$=N;|KkbnXnSb4O^ON&;gK{|*K2k8) zV3DH#JNI3(#o6suG1aH1TA#3czQ}KN>o?Pwt*49h=Lo(D;P?A;@%8P*m(8r#ZyfD# zzWen-=m){suiIm;x#|Dtapd)To_K!U`zxP%*Zn)Eyl#bNkLZ7&;(j-?Yc}z33l3F2 zLG#oVP$C279R;pG?uS~QBxe1Sx2gE>|H{hX!k2&TLt{AlwtI3en*GsUQL*OZBtZ<*{1&q-(D0K z|0$m+c2s(rf<1>OSEFGE@8$NR{sp%1q-S}A?Plk3yA3uTx@U4G#44Db&=KH0wByUc zH%}%%V!mu(pVX-@vezT+&|wbEKO0{;9)6J&!N~9+W2?gELXI=6E{|YIxb3C;W`1XR z58e}h7Z^0$WENshj45P4r11IYk{<_5s$>!_GGCj%Y+;9P?t`n%&b)TtA2L_GWoB3| zb*OW5Bi~$J)_^aKXV@ky%UJW?zjDOzIyA6SCZFXwx7kuQm6@@2@_Yq7mMuz$<^TZx Cdn9K7 delta 1255 zcmccUc+qh}1EcH4#z{>2G7Jn1EDFp(5(fSQ87vGwsp-W#fGi0GHkbrRd~zbQ=;SEo z35@q9ui=%hZ=Gn!_s-H$DUy;dH-^m$iuZQS-l*Y;ZJ+&}oBntfJ|e_hCVhC8`%!XD3(h%+zt#BT19omo9mvi0rTpnD+?+|M`hi_Mv}_Thx? zU8fhPA9R1?Zr`UEp0!xKrqfYOeYab!xXk=x|9{UCw7gors{BeK*Xp!|zw7>-)_6H1 zQ`oBb*#BohZ~gkn$Z!HkGXn9o$@AEy>uaGNv+hbd*u+tKQMd!@uP+KPZ!P-79`xyx z5VO6f^F9@Q{g%#BRqgd_x5rBTdUAF}?%JPo<3rjTqyAVsMT6AlkdCkpUc|2`$J!XsQGUDZ=T2NU7UEt=G@9Xv{0<} z`g0ejo;&j^r#S0=Kc;hJPP0y5e(yg+_fNm>M_Yd?@0e96-9E8=Yu;PKhwO{|_aAwT z=Ap|#KC1!)0}}%?!+$0q2MqWaco-_?Bqum9{_i~S;=%urLPdjnYN{Pg{Bkxw>g!)! zS-IoOzxmQj8IG+NJHB`ZWAOYbQ(AoWXYgNQUgXFSx!zP>JmSuoGdz*<5w=$AK2P{1 zzgUUcj5$qjmtD$##oLR|pZ$2>HA=);*GT$_n4+tq0o%sJUl-mud=&T4JrNV<3=(iG zOWMf4jz2}uL-$P1gjfZ$6FLIChi-gnJfqNh^Q8Jw_GK3zGkDiDe^r{T)Os^lV)IRLaCc@YB7vX}?wbyH7^3{Mz$2pKRUk{$xyGpmjp zK2c&XUMzM_sM*A?toM8Emp8ZT6TWuLd1k%U+Gxhaw^hK*_2YEOtK?O+jM`IA1#T|n zIK%2v$3F9Pwg$^F1v4M}S+x?s9I_nVv9~gwk((gF@wm%cfNkb^Xl!@OZP;hR>zb3v zyk1Tw>%&fd`2*SV48JT6o!{KZH&C5(BU z%9;$~($TQ3Y=z*FKpvvEvOSdG!qNsd7|F}DhrkRXo11kRZW#EX>F8XVK)rfd8x7mc ztsGK&k&TqZmSv@mIeU=K@wr#`&pG$Vw!G*AVOi4ee82O3-+%ee@BWcA)U0MTt661? zl>TblfG6B@&EkL6@wVHxI<~6u^b$WOj&9>^)%#9!5#e7AwN$f`*(HOR{?{yC-^@gs z{ZoHCsi{?41C_O%6zfWxUH$D8s|0`P4KE(n0RXXd*3*VrK|Ds=o7o%v^LIqYU}Gub zfeNpmcvvSuaer=t1)6fBp_e+nbR( z^;Yr4(}NgoZx$Yd`c}Yu=Fj8J>xb`!n~X2c|MVaxUVIt7Z@h_kNyPAT@_=`Z0nc%4 zYz)a{k_jjg{`_a+@i=;VdXRkOh$lQuYgiU<7SOW!vv{qV`iHBSwS9vSXqqN6Mj4dW zL@XAgK7SmAC}8AIYa$wrGQ8ygzkjt00Pxb`DE|EOzw(0s0FE6yMn#0xMC=H_M8FCw zr#NaZ`~e#QWlDf8cC@`2sdcT`0D606j)FGkAb$i^#(|pT5v(eIWxP}U za01q8Je4z;w)K}f^_GZ#TmFLev#I<=*57D*Gk+T1ewS@P+!}HeO^y3?EMLzu0YWz* zuXq67{g>)*U|@i4f^K;F#G!tvxr#>*{Ec`E|8#yr{wsh_Jh2BoJw52{?L{mWbHkU# z&y45H5^t413I4A67r_I-^7Smt{g;1F$iGGYMdM$!{cl~v$=ew>0b|LZ;wN5w*(-nc zntz-AaMKTCV`HobK4Rtl`0y-VIvhpY(F9K3&LFkE;iE4Uz|hbT4jedO!yWLw5Q6W8 z5PtldmylZ5kXqL;+TM&T*|(#tPbQO?n3w?Gc+=@)W&TIon}31RgA7|LDA7X*wt=Niy@k}eCW~iA`S-jt zA`4Z*oAXC47K>qMXlSE3S ze~0x)`2Uly9AWjx=Rnv_44SaCk0@k@`A>=6_Q7@Gox* z*WX~E`1efiK2F}wAUk~n)0Zx?UPIp(HFNxA1pxIg+drs)QRzP;^>sMZ*@m=69D6Nq zgMngwoypxtq>ixOpG+pv7YYc+&m4a*^FP$t<{1wd1(fUo9F4!%1HfwRe-tocy?ly7>!kAKCux9=CgaLfg| zVRXYjS6F5IW$eGt??&NoOE`HugW=r`GI-nk;d;Rke>VYa&L2=b3v+lb3r*8-;J^Wl zkB^sOo$Bw(mka2(ylU*uKl0fs4tBJ%1?Xf}{3CTliT^Kit2o%%R@MM`qZ=5t?DP#x z8|%-tel<-)Unl_o*nbK_Na4fj8(W3fmak_C0DNb61N@B*0D!Jwke{og|FtGSkLWa=n4igo68}QNI;M1SZi`(&cfwOlklNCQ@~lR9%oAeDt|nc#AJ(4B!0~J_)G9F z=k5W2CU+laJKK=Waf z?jf?`?!@0tKe*n*02GhrUoQ<(ntr|{`#jCf1*cpbY}{z0ng@g2onvHEk0yZ?$>|$f<0GQ zMVM$<+t-6#Q%S0R9r64ImevTuM8n=6{RGpOE(+s6y0?NurDCD{0Z94xH#T5(d4+Kh z#RJy)qXNV&{&xAhc4G|y*aGAhuu%O0LiHkvQ>DXRD)@aK;QcmveP#ZCK_J#`-J>A?$`13=LLiR*<23k zZ}^4p-xyvsuK(};@TYk9gLkpk%y2q-Rs ztnL>QK&k?Y$5R2K?|lk0i!+}5tMZq`16!9rTYmxbOoI=%+KNK%@r6821UE#b$R@gt z`~iU2@lQOl$8G)EZeTL`vl1YJ^;mNya)>wk!)vuJH<#22OdYyGNGx_<5aClvTw%-{0t zEdYD|?(4UB87UM{uHUX;5SU9L6bxc@c|{VfhM#Qlp*yp}4gw}6YoGdG`Q#e9Jn}ck zZ^m8xl=-i!_zB!QY4)!Yzipa7+t|zUxADHPe}4V~cqSaSqyO>0QzY2`Z091-|9|W* zMa%R*v$6P%)Yl33KmI0Y0u-;~F5X>6_pUv7`tt%7?=G`zw~Kd|?VK~C`0suFIVHST z{{R(G#j*U24eZ*xuz)k+={+$5c)VHa6J5a|LUXC&LgZc-wb@(_OC1rzB`7cWv?l%K zF95~`EMs=_7c{nk)A+YGHOk}-~kjj@qa$L&cu%lKCKahe=lpuWBjyiDvQY$pTWPx z*^i3gf%5ptm}>mY{AD?);sK@lSMndJBiqscv{*XJzNO{T|6I>t+4Ie#PcMF5rg zN9u@M|1q!1@MLq+^c}5pYxD^jWz(j z{($1560Ki5|0jY09C@(5nScBZTq*xsZ2|1ME42QYS>;bsfM{2j@}4(PReX1*fNUzu z98Q9K{N?o2@r>pgzVc)S-=!B;{+ zdGQ}hXVE`@$F2Xl=F)5bII%AR0EYenl=VNmVs`9*)I@#|(kuV-xqm$R=kK`nKl>kP zEd5-%;Smq(WVF3m<H_U!g=DPEPoM?9+)KK}Fp$@qubLo9a^cyeN2q^t%-u~zj%A2RDeh5s`R zKCk@Q7=59DO8yOFZGQvaJYQ)%H-D@DUGe7nSH#O&CGkLcJYDgs@v9=dr~E1SXFeVJ z-)8g=tMSYF2iIFH$8hR@)xe+Y?e@-1lN16~37*8mdf5gbvGJJwd%*+MwE(wz0apZX zwTa8r0jzW9y6{X7D?UQ}twfZ>7!~I)y9P~T$mXwXyd8#jYJa3&{Hfw)ZQJosjNe0y zcRYX*T*qGfhbuRMaU2gI1$*F@@-O=ajOjgM^I1Cw4>R6s94})$%y_FDSdA&eK@=l0 z*8e;I8eZMDo9}kxYv#?|)_f)U&}Q0B=U=m$)vRVUt69xz_Hfw$01+Rx+x;`liU0rr M07*qoM6N<$f*}w#F8}}l delta 3575 zcmVZqeS z&?`T+8t`@Ica8J6-|=dV?T)SAc&fzDO{3R%+x5PiFCzMPLN3)&fzxE@oMY7}D%%CC zep#*6@c&+kl@q>h8;A^?=Ko$nHS|kwc{pww3BFe?`#T9cwf>2& zDdGLQkw+$z1pvtggVR61tf$jyOiWB*czBo?5pAF}&hf1Zs7-(W{Ibl1R>gly0dV`Q z6KdIj_|@;5&pEbT4Y=d{bM!cl!8vwM>9;fhLi0y#)qj%TKfjF8_GaXczhN9aF@(|f zX5lf2Z6ADP{VdR| z>}S&HG`hRHk$vf~5+9Z|EX%hx(6aN#IkuDPhs?>p`3+r%rfDK$*r+5YQmGWN;o67- z_WirNyMG&feSMVA9pH~I?*Rb3aHtP|{ng)TVIeqjc-<8QD5a2msr&-ziB1l|}%0oc@x0?^YVa~4F$P&k9KX&{h1gY~Q5H{T(F z{p62K1MZqX0`?vCTNZFl^o!*GXnQl7-h7*GK!3~{c5Rv>`{P)>TA&RG*??5}0MzYQ z@^4^ZfNp|beDaG+{t|dLj|%$De2#tMpOF13@H3C>MR#{MdU|@0N~OH`w)k2347hyW z{7LBdoPQBM0IXguz*>LV_k`?o=3g}aJGTC9YB+W?@72I?^%MTY^DnCEr^med53l`u zY=3Nw*1!jN){mZ>#S4e}ka#77V>k22ZECcm?Tv;oJUoo2pMKgwI}ms-iokPG{PcG( zQ0{1ZGg7G(hKGl7U26$8h2k z|5K?H>w_b**(@d|CViXZ&>f9z(S&c6(wG%#%brQ2xZA`bri3t=bLzucyV)ItGA zj~?~p^Yjxw0M+`Z0b>1!+x~r^qZNI9eN=;RVj^b0KP58%*T z0lm=>F0ZUR8Ws^C(?C7-+aJ;31Ah?NKpgdxMoiarQvhW6x~^0Iv)Qa`43Z7HtpLcv zPXS;zu)uRsCHq8wCXCSGMhn2@m366S0S2zm;M|m0@gep}ycYHcsE<9pzXr~wJg9d;Hh=8XwEIuo`6z=CXG1cm8qm^SC1XZ~uMhTdoh!Lc<&k;4bm*S3qV ztzIqY0PwxtO-8K(uzx2UW_@+FzYzoC$vBWN<6vh3d%|JN7K_MaGKeSR*oe6)r{mN0 ze>xVz^i&o-Jw2igfQdiSnZRtZhz*JLLw*@)Y`~>27I8WjQsNWr35PLTnFFueHybfv z5&?AO%Q&Sq;#8%9YMaVpvLzrAKMFSf68i1h75FEMcW|mRfqz1=i0P>;swwqxrb0JO#;rV}_0-%!cj{K9ACV$Aw|9CQvu6&sm;MrmkZMufZmH-Ml@B6=O!k#Xd(57qHc(fb4rn01Y zbmg-f*n*~`P1msRCqKjVh4aGv4{xvGU?o|IegIPTgOMhbR@bNoQ9i)WAJTv@_n)Qm z=gPGW0H6zSi}Gj7^53t1&ib|5*CYGm*mVoYf1WqZe}8=6;~2O;Bm5jqZ!|>n9{^T5 zlH0`xDml2I>4@)p9EIs?Xwx;k91IBAkL-`*iO z7QnNwSioKN6L=IsSN=QSc?K6RUUcPK8z8_~1ci7|r~&fZK(Tz%fW-Gbj+vzyCHsE$ zOY(sokUvj01#lx_G;$9wu46EKx2Y7_L~E!Y0Dp8R{h3GhdaYl_4NPYKcnyeP{#K38 z>MyOXDcOJQ*&pIR|9D5L0dUHH(FTCA8(jGxU-9G1^yn92ez0dE3>*<#UDz-0CN@&8P5otwY{`J(~QdHlg}2=6@gU107a`&kw`xy0NW zi{SIh{I`A?k;)$@{e$5UGCuTk{O4Z11%KeI-+TQUw~?YD-}$>I90ulch=#)`t*%M3 z{qZMT0_e)G(UX8l$=oOQ*FL_2J&O9R@tg5(er)!4RQv=UU9j5s6TceyPd9ek{M~(D z*gosO0G~DvwWxpW|0xoze~!Kg)IXaU9b zuUG2Co^Tk^xty^Ond73EEf%rTku=?cQsFOX(qH}pU|zs7aPnUebOR^z-x`aE<_`sr zf2O#OHNgg!o&UpMZBm~E=HF5OnSbKCFa3ab{*!M{_{m=a#rXpO?efYx-E<_czEpz` zz}Uq9_24FLeq{Iynr^bMvW67nrxkJqOtu6}_9d=&8_{x7} z`^g3!$p*a^^-oJJ6zI3KJnEn46)Y$F1J`GSz6hY|KZ&15{WIw|eG6=~y?+_2R|~k2 z2x01rDNMEmFc=QuFAF+8Su5j{wX$0Pd^ZrI?af?134jQn=zss8@5}1<>pxIQBwhg! z{XaN<8>njVdHMzUj{XbqO&hpE152Tpe;Rqfkez?PSXd(YPZl@N{$MzS!(VM~rGArE zqW?xBgk85Fn!f<}^Do(eXn&Vi)|EF&lnqxa#qvVEHQW!>>jIrDDH-ei{Aq%U<=*b1qfu$Kaz$ z05H`Lz*hg9lG(NX5s3UlNLBr>-Y%hke%Y)3IscQ!%D+oDz0z%Q_J6n=^wIWa9maiR zJ=z}C<4J={j(dzj?fB)Z>i5Z~IYL>xMR50 zzn!3;sqN0jElvuN$Y;}Saa#eFY#^%1m(^blKCrVE;C3(Is_=Q6xJ(|Bmqhby;#ofH zweW4@@R}%zF{-X#b`4m@kexrOz1#958>bHFZ#`2!-@L4AV_cNb2j>;JKGoLpHyfI}oh;l^6`nv0{^ZldNdTY(E xLk(VQz8ZCCD{-&uucMAS>ZqfRI_kJT@PCzzz6aMoG-?0<002ovPDHLkV1nh!PsIQL diff --git a/main.tscn b/main.tscn index b866915..5e8b055 100644 --- a/main.tscn +++ b/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=139 format=2] +[gd_scene load_steps=141 format=2] [ext_resource path="res://Player.cs" type="Script" id=1] [ext_resource path="res://waterfall2.png" type="Texture" id=2] @@ -21,364 +21,361 @@ [sub_resource type="AtlasTexture" id=1] atlas = ExtResource( 7 ) -region = Rect2( 480, 0, 16, 16 ) +region = Rect2( 80, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=2] atlas = ExtResource( 7 ) -region = Rect2( 496, 0, 16, 16 ) +region = Rect2( 96, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=3] atlas = ExtResource( 7 ) -region = Rect2( 512, 0, 16, 16 ) +region = Rect2( 112, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=4] atlas = ExtResource( 7 ) -region = Rect2( 528, 0, 16, 16 ) +region = Rect2( 128, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=5] atlas = ExtResource( 7 ) -region = Rect2( 544, 0, 16, 16 ) +region = Rect2( 144, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=6] atlas = ExtResource( 7 ) -region = Rect2( 560, 0, 16, 16 ) +region = Rect2( 256, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=7] atlas = ExtResource( 7 ) -region = Rect2( 160, 0, 16, 16 ) +region = Rect2( 272, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=8] atlas = ExtResource( 7 ) -region = Rect2( 176, 0, 16, 16 ) +region = Rect2( 288, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=9] atlas = ExtResource( 7 ) -region = Rect2( 192, 0, 16, 16 ) +region = Rect2( 304, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=10] atlas = ExtResource( 7 ) -region = Rect2( 208, 0, 16, 16 ) +region = Rect2( 320, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=11] atlas = ExtResource( 7 ) -region = Rect2( 224, 0, 16, 16 ) +region = Rect2( 336, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=12] atlas = ExtResource( 7 ) -region = Rect2( 240, 0, 16, 16 ) +region = Rect2( 352, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=13] atlas = ExtResource( 7 ) -region = Rect2( 256, 0, 16, 16 ) +region = Rect2( 368, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=14] atlas = ExtResource( 7 ) -region = Rect2( 272, 0, 16, 16 ) +region = Rect2( 384, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=15] atlas = ExtResource( 7 ) -region = Rect2( 288, 0, 16, 16 ) +region = Rect2( 400, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=16] atlas = ExtResource( 7 ) -region = Rect2( 304, 0, 16, 16 ) +region = Rect2( 416, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=17] atlas = ExtResource( 7 ) -region = Rect2( 320, 0, 16, 16 ) +region = Rect2( 432, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=18] atlas = ExtResource( 7 ) -region = Rect2( 336, 0, 16, 16 ) +region = Rect2( 448, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=19] atlas = ExtResource( 7 ) -region = Rect2( 352, 0, 16, 16 ) +region = Rect2( 464, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=20] atlas = ExtResource( 7 ) -region = Rect2( 368, 0, 16, 16 ) +region = Rect2( 256, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=21] atlas = ExtResource( 7 ) -region = Rect2( 384, 0, 16, 16 ) +region = Rect2( 272, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=22] atlas = ExtResource( 7 ) -region = Rect2( 400, 0, 16, 16 ) +region = Rect2( 288, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=23] atlas = ExtResource( 7 ) -region = Rect2( 80, 0, 16, 16 ) +region = Rect2( 304, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=24] atlas = ExtResource( 7 ) -region = Rect2( 96, 0, 16, 16 ) +region = Rect2( 320, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=25] atlas = ExtResource( 7 ) -region = Rect2( 112, 0, 16, 16 ) +region = Rect2( 336, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=26] atlas = ExtResource( 7 ) -region = Rect2( 128, 0, 16, 16 ) +region = Rect2( 352, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=27] atlas = ExtResource( 7 ) -region = Rect2( 144, 0, 16, 16 ) +region = Rect2( 368, 0, 16, 16 ) -[sub_resource type="AtlasTexture" id=121] +[sub_resource type="AtlasTexture" id=28] atlas = ExtResource( 7 ) -region = Rect2( 416, 0, 16, 16 ) +region = Rect2( 384, 0, 16, 16 ) -[sub_resource type="AtlasTexture" id=122] +[sub_resource type="AtlasTexture" id=29] atlas = ExtResource( 7 ) -region = Rect2( 432, 0, 16, 16 ) +region = Rect2( 400, 0, 16, 16 ) -[sub_resource type="AtlasTexture" id=123] +[sub_resource type="AtlasTexture" id=30] atlas = ExtResource( 7 ) -region = Rect2( 448, 0, 16, 16 ) +region = Rect2( 416, 0, 16, 16 ) -[sub_resource type="AtlasTexture" id=124] +[sub_resource type="AtlasTexture" id=31] atlas = ExtResource( 7 ) -region = Rect2( 464, 0, 16, 16 ) +region = Rect2( 432, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=32] atlas = ExtResource( 7 ) -region = Rect2( 256, 0, 16, 16 ) +region = Rect2( 448, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=33] atlas = ExtResource( 7 ) -region = Rect2( 272, 0, 16, 16 ) +region = Rect2( 464, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=34] atlas = ExtResource( 7 ) -region = Rect2( 288, 0, 16, 16 ) +region = Rect2( 416, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=35] atlas = ExtResource( 7 ) -region = Rect2( 304, 0, 16, 16 ) +region = Rect2( 432, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=36] atlas = ExtResource( 7 ) -region = Rect2( 320, 0, 16, 16 ) +region = Rect2( 448, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=37] atlas = ExtResource( 7 ) -region = Rect2( 336, 0, 16, 16 ) +region = Rect2( 464, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=38] atlas = ExtResource( 7 ) -region = Rect2( 352, 0, 16, 16 ) +region = Rect2( 16, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=39] atlas = ExtResource( 7 ) -region = Rect2( 368, 0, 16, 16 ) +region = Rect2( 32, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=40] atlas = ExtResource( 7 ) -region = Rect2( 384, 0, 16, 16 ) +region = Rect2( 48, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=41] atlas = ExtResource( 7 ) -region = Rect2( 400, 0, 16, 16 ) +region = Rect2( 64, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=42] atlas = ExtResource( 7 ) -region = Rect2( 416, 0, 16, 16 ) +region = Rect2( 16, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=43] atlas = ExtResource( 7 ) -region = Rect2( 432, 0, 16, 16 ) +region = Rect2( 32, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=44] atlas = ExtResource( 7 ) -region = Rect2( 448, 0, 16, 16 ) +region = Rect2( 48, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=45] atlas = ExtResource( 7 ) -region = Rect2( 464, 0, 16, 16 ) +region = Rect2( 64, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=46] atlas = ExtResource( 7 ) -region = Rect2( 416, 0, 16, 16 ) +region = Rect2( 480, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=47] atlas = ExtResource( 7 ) -region = Rect2( 432, 0, 16, 16 ) +region = Rect2( 496, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=48] atlas = ExtResource( 7 ) -region = Rect2( 448, 0, 16, 16 ) +region = Rect2( 512, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=49] atlas = ExtResource( 7 ) -region = Rect2( 464, 0, 16, 16 ) +region = Rect2( 528, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=50] atlas = ExtResource( 7 ) -region = Rect2( 0, 0, 16, 16 ) +region = Rect2( 544, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=51] atlas = ExtResource( 7 ) -region = Rect2( 16, 0, 16, 16 ) +region = Rect2( 560, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=52] atlas = ExtResource( 7 ) -region = Rect2( 32, 0, 16, 16 ) +region = Rect2( 160, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=53] atlas = ExtResource( 7 ) -region = Rect2( 48, 0, 16, 16 ) +region = Rect2( 176, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=54] atlas = ExtResource( 7 ) -region = Rect2( 64, 0, 16, 16 ) +region = Rect2( 192, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=55] atlas = ExtResource( 7 ) -region = Rect2( 0, 0, 16, 16 ) +region = Rect2( 208, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=56] atlas = ExtResource( 7 ) -region = Rect2( 16, 0, 16, 16 ) +region = Rect2( 224, 0, 16, 16 ) [sub_resource type="AtlasTexture" id=57] atlas = ExtResource( 7 ) -region = Rect2( 32, 0, 16, 16 ) - -[sub_resource type="AtlasTexture" id=58] -atlas = ExtResource( 7 ) -region = Rect2( 48, 0, 16, 16 ) - -[sub_resource type="AtlasTexture" id=59] -atlas = ExtResource( 7 ) -region = Rect2( 64, 0, 16, 16 ) +region = Rect2( 240, 0, 16, 16 ) -[sub_resource type="SpriteFrames" id=60] +[sub_resource type="SpriteFrames" id=58] animations = [ { -"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ), SubResource( 6 ) ], -"loop": true, -"name": "player_running", -"speed": 10.0 -}, { -"frames": [ SubResource( 7 ), SubResource( 8 ), SubResource( 9 ), SubResource( 10 ), SubResource( 11 ), SubResource( 12 ) ], +"frames": [ SubResource( 1 ), SubResource( 2 ), SubResource( 3 ), SubResource( 4 ), SubResource( 5 ) ], "loop": true, -"name": "player_walking", -"speed": 8.0 +"name": "player_idle_back", +"speed": 5.0 }, { -"frames": [ SubResource( 13 ), SubResource( 14 ), SubResource( 15 ), SubResource( 16 ), SubResource( 17 ), SubResource( 18 ), SubResource( 19 ), SubResource( 20 ), SubResource( 21 ), SubResource( 22 ) ], +"frames": [ SubResource( 6 ), SubResource( 7 ), SubResource( 8 ), SubResource( 9 ), SubResource( 10 ), SubResource( 11 ), SubResource( 12 ), SubResource( 13 ), SubResource( 14 ), SubResource( 15 ) ], "loop": true, "name": "player_climbing_up", "speed": 8.0 }, { -"frames": [ SubResource( 23 ), SubResource( 24 ), SubResource( 25 ), SubResource( 26 ), SubResource( 27 ) ], -"loop": true, -"name": "player_idle_back", -"speed": 5.0 -}, { -"frames": [ SubResource( 121 ), SubResource( 122 ), SubResource( 123 ), SubResource( 124 ) ], +"frames": [ SubResource( 16 ), SubResource( 17 ), SubResource( 18 ), SubResource( 19 ) ], "loop": true, "name": "player_cliff_hanging", "speed": 5.0 }, { -"frames": [ SubResource( 32 ), SubResource( 33 ), SubResource( 34 ), SubResource( 35 ), SubResource( 36 ), SubResource( 37 ), SubResource( 38 ), SubResource( 39 ), SubResource( 40 ), SubResource( 41 ) ], +"frames": [ SubResource( 20 ), SubResource( 21 ), SubResource( 22 ), SubResource( 23 ), SubResource( 24 ), SubResource( 25 ), SubResource( 26 ), SubResource( 27 ), SubResource( 28 ), SubResource( 29 ) ], "loop": true, "name": "player_climbing_down", "speed": 8.0 }, { -"frames": [ SubResource( 42 ), SubResource( 43 ), SubResource( 44 ), SubResource( 45 ) ], +"frames": [ SubResource( 30 ), SubResource( 31 ), SubResource( 32 ), SubResource( 33 ) ], "loop": true, "name": "player_traversing", "speed": 5.0 }, { -"frames": [ SubResource( 46 ), SubResource( 47 ), SubResource( 48 ), SubResource( 49 ) ], +"frames": [ SubResource( 34 ), SubResource( 35 ), SubResource( 36 ), SubResource( 37 ) ], "loop": true, "name": "player_cliff_arresting", "speed": 5.0 }, { -"frames": [ SubResource( 50 ), SubResource( 51 ), SubResource( 52 ), SubResource( 53 ), SubResource( 54 ) ], +"frames": [ SubResource( 38 ), SubResource( 39 ), SubResource( 40 ), SubResource( 41 ) ], "loop": true, "name": "player_falling", "speed": 5.0 }, { -"frames": [ SubResource( 55 ), SubResource( 56 ), SubResource( 57 ), SubResource( 58 ), SubResource( 59 ) ], +"frames": [ SubResource( 42 ), SubResource( 43 ), SubResource( 44 ), SubResource( 45 ) ], "loop": true, "name": "player_idle_left", "speed": 5.0 +}, { +"frames": [ SubResource( 46 ), SubResource( 47 ), SubResource( 48 ), SubResource( 49 ), SubResource( 50 ), SubResource( 51 ) ], +"loop": true, +"name": "player_running", +"speed": 10.0 +}, { +"frames": [ SubResource( 52 ), SubResource( 53 ), SubResource( 54 ), SubResource( 55 ), SubResource( 56 ), SubResource( 57 ) ], +"loop": true, +"name": "player_walking", +"speed": 8.0 } ] -[sub_resource type="RectangleShape2D" id=61] +[sub_resource type="RectangleShape2D" id=59] extents = Vector2( 7.5, 7 ) -[sub_resource type="RectangleShape2D" id=62] +[sub_resource type="RectangleShape2D" id=60] extents = Vector2( 7, 7 ) -[sub_resource type="RectangleShape2D" id=63] +[sub_resource type="RectangleShape2D" id=61] extents = Vector2( 7, 7 ) -[sub_resource type="RectangleShape2D" id=64] +[sub_resource type="RectangleShape2D" id=62] extents = Vector2( 5.5, 7.5 ) -[sub_resource type="RectangleShape2D" id=65] +[sub_resource type="RectangleShape2D" id=63] extents = Vector2( 5.5, 7.5 ) -[sub_resource type="RectangleShape2D" id=66] +[sub_resource type="RectangleShape2D" id=64] extents = Vector2( 4.5, 7 ) -[sub_resource type="RectangleShape2D" id=67] +[sub_resource type="RectangleShape2D" id=65] extents = Vector2( 4.5, 7 ) -[sub_resource type="RectangleShape2D" id=68] +[sub_resource type="RectangleShape2D" id=66] extents = Vector2( 4.5, 7 ) -[sub_resource type="RectangleShape2D" id=69] +[sub_resource type="RectangleShape2D" id=67] extents = Vector2( 7, 7 ) -[sub_resource type="RectangleShape2D" id=70] +[sub_resource type="RectangleShape2D" id=68] extents = Vector2( 4.5, 7 ) -[sub_resource type="RectangleShape2D" id=71] +[sub_resource type="RectangleShape2D" id=69] extents = Vector2( 24, 56 ) -[sub_resource type="AtlasTexture" id=72] +[sub_resource type="AtlasTexture" id=70] atlas = ExtResource( 5 ) region = Rect2( 64, 80, 16, 16 ) -[sub_resource type="AtlasTexture" id=73] +[sub_resource type="AtlasTexture" id=71] atlas = ExtResource( 5 ) region = Rect2( 80, 80, 16, 16 ) -[sub_resource type="AtlasTexture" id=74] +[sub_resource type="AtlasTexture" id=72] atlas = ExtResource( 5 ) region = Rect2( 64, 80, 16, 16 ) -[sub_resource type="AtlasTexture" id=75] +[sub_resource type="AtlasTexture" id=73] atlas = ExtResource( 5 ) region = Rect2( 80, 80, 16, 16 ) -[sub_resource type="AtlasTexture" id=76] +[sub_resource type="AtlasTexture" id=74] atlas = ExtResource( 5 ) region = Rect2( 64, 80, 16, 16 ) -[sub_resource type="AtlasTexture" id=77] +[sub_resource type="AtlasTexture" id=75] atlas = ExtResource( 5 ) region = Rect2( 80, 80, 16, 16 ) -[sub_resource type="AtlasTexture" id=78] +[sub_resource type="AtlasTexture" id=76] atlas = ExtResource( 5 ) region = Rect2( 64, 80, 16, 16 ) -[sub_resource type="AtlasTexture" id=79] +[sub_resource type="AtlasTexture" id=77] atlas = ExtResource( 5 ) region = Rect2( 80, 80, 16, 16 ) -[sub_resource type="SpriteFrames" id=80] +[sub_resource type="SpriteFrames" id=78] animations = [ { +"frames": [ SubResource( 70 ), SubResource( 71 ) ], +"loop": true, +"name": "butterfly_perching", +"speed": 12.0 +}, { "frames": [ SubResource( 72 ), SubResource( 73 ) ], "loop": true, -"name": "butterfly_flying", -"speed": 8.5 +"name": "butterfly_evading", +"speed": 12.0 }, { "frames": [ SubResource( 74 ), SubResource( 75 ) ], "loop": true, @@ -387,22 +384,17 @@ animations = [ { }, { "frames": [ SubResource( 76 ), SubResource( 77 ) ], "loop": true, -"name": "butterfly_evading", -"speed": 12.0 -}, { -"frames": [ SubResource( 78 ), SubResource( 79 ) ], -"loop": true, -"name": "butterfly_perching", -"speed": 12.0 +"name": "butterfly_flying", +"speed": 8.5 } ] -[sub_resource type="RectangleShape2D" id=81] +[sub_resource type="RectangleShape2D" id=79] extents = Vector2( 0.5, 0.5 ) -[sub_resource type="CircleShape2D" id=82] +[sub_resource type="CircleShape2D" id=80] radius = 7.0 -[sub_resource type="TileSet" id=83] +[sub_resource type="TileSet" id=81] 0/name = "A" 0/texture = ExtResource( 16 ) 0/tex_offset = Vector2( 0, 0 ) @@ -1384,15 +1376,21 @@ radius = 7.0 69/shapes = [ ] 69/z_index = 0 -[sub_resource type="RectangleShape2D" id=84] +[sub_resource type="RectangleShape2D" id=82] extents = Vector2( 952, 1896 ) -[sub_resource type="RectangleShape2D" id=85] +[sub_resource type="RectangleShape2D" id=83] extents = Vector2( 632, 64 ) -[sub_resource type="RectangleShape2D" id=86] +[sub_resource type="RectangleShape2D" id=84] extents = Vector2( 120, 64 ) +[sub_resource type="RectangleShape2D" id=85] +extents = Vector2( 960, 1980 ) + +[sub_resource type="RectangleShape2D" id=86] +extents = Vector2( 960, 148 ) + [sub_resource type="RectangleShape2D" id=87] extents = Vector2( 172, 4 ) @@ -1468,53 +1466,59 @@ extents = Vector2( 172, 4 ) extents = Vector2( 96, 4 ) [sub_resource type="RectangleShape2D" id=105] -extents = Vector2( 72, 64 ) +extents = Vector2( 960, 4 ) [sub_resource type="RectangleShape2D" id=106] -extents = Vector2( 72, 64 ) +extents = Vector2( 960, 4 ) [sub_resource type="RectangleShape2D" id=107] -extents = Vector2( 608, 64 ) +extents = Vector2( 72, 64 ) [sub_resource type="RectangleShape2D" id=108] -extents = Vector2( 608, 64 ) +extents = Vector2( 72, 64 ) [sub_resource type="RectangleShape2D" id=109] -extents = Vector2( 172, 64 ) +extents = Vector2( 608, 64 ) [sub_resource type="RectangleShape2D" id=110] -extents = Vector2( 172, 64 ) +extents = Vector2( 608, 64 ) [sub_resource type="RectangleShape2D" id=111] -extents = Vector2( 96, 64.0054 ) +extents = Vector2( 172, 64 ) [sub_resource type="RectangleShape2D" id=112] -extents = Vector2( 96, 64 ) +extents = Vector2( 172, 64 ) [sub_resource type="RectangleShape2D" id=113] -extents = Vector2( 960, 24 ) +extents = Vector2( 96, 64.0054 ) [sub_resource type="RectangleShape2D" id=114] -extents = Vector2( 960, 4 ) +extents = Vector2( 96, 64 ) [sub_resource type="RectangleShape2D" id=115] -extents = Vector2( 960, 1980 ) +extents = Vector2( 960, 24 ) [sub_resource type="RectangleShape2D" id=116] -extents = Vector2( 960, 4 ) +extents = Vector2( 960, 24 ) [sub_resource type="RectangleShape2D" id=117] -extents = Vector2( 960, 4 ) +extents = Vector2( 960, 24 ) [sub_resource type="RectangleShape2D" id=118] -extents = Vector2( 64, 4352 ) +extents = Vector2( 960, 24 ) [sub_resource type="RectangleShape2D" id=119] extents = Vector2( 64, 4352 ) [sub_resource type="RectangleShape2D" id=120] +extents = Vector2( 64, 4352 ) + +[sub_resource type="RectangleShape2D" id=121] extents = Vector2( 63.9966, 960 ) +[sub_resource type="RectangleShape2D" id=122] +extents = Vector2( 63.9966, 1088 ) + [node name="Main Scene" type="Node2D"] __meta__ = { "_edit_horizontal_guides_": [ 4096.0, -3840.0 ], @@ -1533,13 +1537,16 @@ position = Vector2( 384, -208 ) collision_mask = 6 collision/safe_margin = 0.6 script = ExtResource( 1 ) +__meta__ = { +"_edit_lock_": true +} [node name="AnimatedSprite" type="AnimatedSprite" parent="Player" groups=[ "Perchable", "Player", ]] scale = Vector2( 8, 8 ) -frames = SubResource( 60 ) +frames = SubResource( 58 ) animation = "player_idle_left" [node name="Area2D" type="Area2D" parent="Player/AnimatedSprite" groups=[ @@ -1553,7 +1560,7 @@ collision_mask = 6 ]] visible = false position = Vector2( 0.5, 0 ) -shape = SubResource( 61 ) +shape = SubResource( 59 ) disabled = true [node name="player_walking" type="CollisionShape2D" parent="Player/AnimatedSprite/Area2D" groups=[ @@ -1561,7 +1568,7 @@ disabled = true ]] visible = false position = Vector2( 1, 0 ) -shape = SubResource( 62 ) +shape = SubResource( 60 ) disabled = true [node name="player_idle_left" type="CollisionShape2D" parent="Player/AnimatedSprite/Area2D" groups=[ @@ -1569,14 +1576,14 @@ disabled = true ]] visible = false position = Vector2( 1, 0 ) -shape = SubResource( 63 ) +shape = SubResource( 61 ) [node name="player_climbing_down" type="CollisionShape2D" parent="Player/AnimatedSprite/Area2D" groups=[ "Player", ]] visible = false position = Vector2( -0.5, -0.5 ) -shape = SubResource( 64 ) +shape = SubResource( 62 ) disabled = true [node name="player_climbing_up" type="CollisionShape2D" parent="Player/AnimatedSprite/Area2D" groups=[ @@ -1584,7 +1591,7 @@ disabled = true ]] visible = false position = Vector2( -0.5, -0.5 ) -shape = SubResource( 65 ) +shape = SubResource( 63 ) disabled = true [node name="player_cliff_arresting" type="CollisionShape2D" parent="Player/AnimatedSprite/Area2D" groups=[ @@ -1592,7 +1599,7 @@ disabled = true ]] visible = false position = Vector2( -0.5, -1 ) -shape = SubResource( 66 ) +shape = SubResource( 64 ) disabled = true [node name="player_traversing" type="CollisionShape2D" parent="Player/AnimatedSprite/Area2D" groups=[ @@ -1600,7 +1607,7 @@ disabled = true ]] visible = false position = Vector2( -0.5, -1 ) -shape = SubResource( 67 ) +shape = SubResource( 65 ) disabled = true [node name="player_idle_back" type="CollisionShape2D" parent="Player/AnimatedSprite/Area2D" groups=[ @@ -1608,7 +1615,7 @@ disabled = true ]] visible = false position = Vector2( -0.5, 0 ) -shape = SubResource( 68 ) +shape = SubResource( 66 ) disabled = true [node name="player_falling" type="CollisionShape2D" parent="Player/AnimatedSprite/Area2D" groups=[ @@ -1616,7 +1623,7 @@ disabled = true ]] visible = false position = Vector2( 1, 0 ) -shape = SubResource( 69 ) +shape = SubResource( 67 ) disabled = true [node name="player_cliff_hanging" type="CollisionShape2D" parent="Player/AnimatedSprite/Area2D" groups=[ @@ -1624,7 +1631,7 @@ disabled = true ]] visible = false position = Vector2( -0.5, -1 ) -shape = SubResource( 70 ) +shape = SubResource( 68 ) disabled = true [node name="Camera2D" type="Camera2D" parent="Player" groups=[ @@ -1648,7 +1655,7 @@ drag_margin_bottom = 0.59 ]] visible = false position = Vector2( -8, 0 ) -shape = SubResource( 71 ) +shape = SubResource( 69 ) [node name="Chest" type="RayCast2D" parent="Player"] visible = false @@ -1684,29 +1691,33 @@ stream = ExtResource( 11 ) ]] position = Vector2( 252, -12 ) scale = Vector2( 8, 8 ) -frames = SubResource( 80 ) +frames = SubResource( 78 ) animation = "butterfly_idle" offset = Vector2( 1, -1 ) script = ExtResource( 10 ) +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} FlightPathColor = Color( 1, 0, 0, 1 ) [node name="PerchingCollider" type="Area2D" parent="Butterfly 1"] visible = false -position = Vector2( -0.5, -0.5 ) +position = Vector2( 0.5, 0.5 ) collision_layer = 4 collision_mask = 47 [node name="CollisionShape2D" type="CollisionShape2D" parent="Butterfly 1/PerchingCollider"] -shape = SubResource( 81 ) +shape = SubResource( 79 ) [node name="ObstacleCollider" type="Area2D" parent="Butterfly 1"] visible = false -position = Vector2( -0.5, -1 ) +position = Vector2( 0.5, 0 ) collision_layer = 4 collision_mask = 47 [node name="CollisionShape2D" type="CollisionShape2D" parent="Butterfly 1/ObstacleCollider"] -shape = SubResource( 82 ) +shape = SubResource( 80 ) [node name="FlightTimer" type="Timer" parent="Butterfly 1"] one_shot = true @@ -1719,29 +1730,33 @@ one_shot = true ]] position = Vector2( 360, -3896 ) scale = Vector2( 8, 8 ) -frames = SubResource( 80 ) +frames = SubResource( 78 ) animation = "butterfly_idle" offset = Vector2( 1, -1 ) script = ExtResource( 10 ) -FlightPathColor = Color( 0, 1, 0, 1 ) +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} +FlightPathColor = Color( 0, 1, 0, 1 ) [node name="PerchingCollider" type="Area2D" parent="Butterfly 2"] visible = false -position = Vector2( -0.5, -0.5 ) +position = Vector2( 0.5, 0.5 ) collision_layer = 4 collision_mask = 47 [node name="CollisionShape2D" type="CollisionShape2D" parent="Butterfly 2/PerchingCollider"] -shape = SubResource( 81 ) +shape = SubResource( 79 ) [node name="ObstacleCollider" type="Area2D" parent="Butterfly 2"] visible = false -position = Vector2( -0.5, -1 ) +position = Vector2( 0.5, 0 ) collision_layer = 4 collision_mask = 47 [node name="CollisionShape2D" type="CollisionShape2D" parent="Butterfly 2/ObstacleCollider"] -shape = SubResource( 82 ) +shape = SubResource( 80 ) [node name="FlightTimer" type="Timer" parent="Butterfly 2"] one_shot = true @@ -1752,31 +1767,35 @@ one_shot = true [node name="Butterfly 3" type="AnimatedSprite" parent="." groups=[ "Summer", ]] -position = Vector2( 1273.73, 3953.35 ) +position = Vector2( 1272, 3952 ) scale = Vector2( 8, 8 ) -frames = SubResource( 80 ) +frames = SubResource( 78 ) animation = "butterfly_idle" offset = Vector2( 1, -1 ) script = ExtResource( 10 ) +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} FlightPathColor = Color( 0, 0, 1, 1 ) [node name="PerchingCollider" type="Area2D" parent="Butterfly 3"] visible = false -position = Vector2( -0.5, -0.5 ) +position = Vector2( 0.5, 0.5 ) collision_layer = 4 collision_mask = 47 [node name="CollisionShape2D" type="CollisionShape2D" parent="Butterfly 3/PerchingCollider"] -shape = SubResource( 81 ) +shape = SubResource( 79 ) [node name="ObstacleCollider" type="Area2D" parent="Butterfly 3"] visible = false -position = Vector2( -0.5, -1 ) +position = Vector2( 0.5, 0 ) collision_layer = 4 collision_mask = 47 [node name="CollisionShape2D" type="CollisionShape2D" parent="Butterfly 3/ObstacleCollider"] -shape = SubResource( 82 ) +shape = SubResource( 80 ) [node name="FlightTimer" type="Timer" parent="Butterfly 3"] one_shot = true @@ -1784,7 +1803,7 @@ one_shot = true [node name="IdleTimer" type="Timer" parent="Butterfly 3"] one_shot = true -[node name="Upper Cliffs" type="Area2D" parent="." groups=[ +[node name="Cliffs" type="Area2D" parent="." groups=[ "Cliffs", ]] z_index = -2 @@ -1792,7 +1811,7 @@ collision_layer = 2 collision_mask = 13 script = ExtResource( 4 ) -[node name="Rock" type="TileMap" parent="Upper Cliffs" groups=[ +[node name="Rock" type="TileMap" parent="Cliffs" groups=[ "Cliffs", ]] scale = Vector2( 8, 8 ) @@ -1801,9 +1820,9 @@ cell_size = Vector2( 16, 16 ) cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) collision_use_parent = true format = 1 -tile_data = PoolIntArray( -1966079, 21, 0, -1966078, 21, 1, -1966077, 21, 1, -1966076, 21, 1, -1966075, 21, 1, -1966074, 21, 1, -1966073, 21, 1, -1966072, 21, 1, -1966071, 21, 1, -1966070, 21, 2, -1966067, 21, 0, -1966066, 21, 2, -1900544, 21, 65536, -1900543, 21, 65537, -1900542, 21, 65537, -1900541, 21, 65537, -1900540, 21, 65537, -1900539, 21, 65537, -1900538, 21, 65537, -1900537, 21, 65537, -1900536, 21, 65537, -1900535, 21, 65537, -1900534, 21, 65537, -1900533, 21, 65537, -1900532, 21, 1, -1900531, 21, 1, -1900530, 21, 2, -1835008, 21, 65536, -1835007, 21, 65537, -1835006, 21, 65537, -1835005, 21, 65537, -1835004, 21, 65537, -1835003, 21, 65537, -1835002, 21, 65537, -1835001, 21, 65537, -1835000, 21, 65537, -1834999, 21, 65537, -1834998, 21, 65537, -1834997, 21, 65537, -1834996, 21, 65537, -1834995, 21, 65537, -1834994, 21, 65538, -1769472, 21, 65536, -1769471, 21, 65537, -1769470, 21, 65537, -1769469, 21, 65537, -1769468, 21, 65537, -1769467, 21, 65537, -1769466, 21, 65537, -1769465, 21, 65537, -1769464, 21, 65537, -1769463, 21, 65537, -1769462, 21, 65537, -1769461, 21, 65537, -1769460, 21, 65537, -1769459, 21, 65537, -1769458, 21, 65538, -1703936, 21, 65536, -1703935, 21, 65537, -1703934, 21, 65537, -1703933, 21, 65537, -1703932, 21, 65537, -1703931, 21, 65537, -1703930, 21, 65537, -1703929, 21, 65537, -1703928, 21, 65537, -1703927, 21, 65537, -1703926, 21, 65537, -1703925, 21, 65537, -1703924, 21, 65537, -1703923, 21, 65537, -1703922, 21, 65538, -1638400, 21, 65536, -1638399, 21, 65537, -1638398, 21, 65537, -1638397, 21, 65537, -1638396, 21, 65537, -1638395, 21, 65537, -1638394, 21, 65537, -1638393, 21, 65537, -1638392, 21, 65537, -1638391, 21, 65537, -1638390, 21, 65537, -1638389, 21, 65537, -1638388, 21, 65537, -1638387, 21, 65537, -1638386, 21, 65538, -1572864, 21, 65536, -1572863, 21, 65537, -1572862, 21, 65537, -1572861, 21, 65537, -1572860, 21, 65537, -1572859, 21, 65537, -1572858, 21, 65537, -1572857, 21, 65537, -1572856, 21, 65537, -1572855, 21, 65537, -1572854, 21, 65537, -1572853, 21, 65537, -1572852, 21, 65537, -1572851, 21, 65537, -1572850, 21, 65538, -1507328, 21, 65536, -1507327, 21, 65537, -1507326, 21, 65537, -1507325, 21, 65537, -1507324, 21, 65537, -1507323, 21, 65537, -1507322, 21, 65537, -1507321, 21, 65537, -1507320, 21, 65537, -1507319, 21, 65537, -1507318, 21, 65537, -1507317, 21, 65537, -1507316, 21, 65537, -1507315, 21, 65537, -1507314, 21, 65538, -1441792, 21, 65536, -1441791, 21, 65537, -1441790, 21, 65537, -1441789, 21, 65537, -1441788, 21, 65537, -1441787, 21, 65537, -1441786, 21, 65537, -1441785, 21, 65537, -1441784, 21, 65537, -1441783, 21, 65537, -1441782, 21, 65537, -1441781, 21, 65537, -1441780, 21, 65537, -1441779, 21, 65537, -1441778, 21, 65538, -1376256, 21, 65536, -1376255, 21, 65537, -1376254, 21, 65537, -1376253, 21, 65537, -1376252, 21, 65537, -1376251, 21, 65537, -1376250, 21, 65537, -1376249, 21, 65537, -1376248, 21, 65537, -1376247, 21, 65537, -1376246, 21, 65537, -1376245, 21, 65537, -1376244, 21, 65537, -1376243, 21, 65537, -1376242, 21, 65538, -1310720, 21, 65536, -1310719, 21, 65537, -1310718, 21, 65537, -1310717, 21, 65537, -1310716, 21, 65537, -1310715, 21, 65537, -1310714, 21, 65537, -1310713, 21, 65537, -1310712, 21, 65537, -1310711, 21, 65537, -1310710, 21, 65537, -1310709, 21, 65537, -1310708, 21, 65537, -1310707, 21, 65537, -1310706, 21, 65538, -1245184, 21, 65536, -1245183, 21, 65537, -1245182, 21, 65537, -1245181, 21, 65537, -1245180, 21, 65537, -1245179, 21, 65537, -1245178, 21, 65537, -1245177, 21, 65537, -1245176, 21, 65537, -1245175, 21, 65537, -1245174, 21, 65537, -1245173, 21, 65537, -1245172, 21, 65537, -1245171, 21, 65537, -1245170, 21, 65538, -1179648, 21, 65536, -1179647, 21, 65537, -1179646, 21, 65537, -1179645, 21, 65537, -1179644, 21, 65537, -1179643, 21, 65537, -1179642, 21, 65537, -1179641, 21, 65537, -1179640, 21, 65537, -1179639, 21, 65537, -1179638, 21, 65537, -1179637, 21, 65537, -1179636, 21, 65537, -1179635, 21, 65537, -1179634, 21, 65538, -1114112, 21, 65536, -1114111, 21, 65537, -1114110, 21, 65537, -1114109, 21, 65537, -1114108, 21, 65537, -1114107, 21, 65537, -1114106, 21, 65537, -1114105, 21, 65537, -1114104, 21, 65537, -1114103, 21, 65537, -1114102, 21, 65537, -1114101, 21, 65537, -1114100, 21, 65537, -1114099, 21, 65537, -1114098, 21, 65538, -1048576, 21, 65536, -1048575, 21, 65537, -1048574, 21, 65537, -1048573, 21, 65537, -1048572, 21, 65537, -1048571, 21, 65537, -1048570, 21, 65537, -1048569, 21, 65537, -1048568, 21, 65537, -1048567, 21, 65537, -1048566, 21, 65537, -1048565, 21, 65537, -1048564, 21, 65537, -1048563, 21, 65537, -1048562, 21, 65538, -983040, 21, 65536, -983039, 21, 65537, -983038, 21, 65537, -983037, 21, 65537, -983036, 21, 65537, -983035, 21, 65537, -983034, 21, 65537, -983033, 21, 65537, -983032, 21, 65537, -983031, 21, 65537, -983030, 21, 65537, -983029, 21, 65537, -983028, 21, 65537, -983027, 21, 65537, -983026, 21, 65538, -917504, 21, 65536, -917503, 21, 65537, -917502, 21, 65537, -917501, 21, 65537, -917500, 21, 65537, -917499, 21, 65537, -917498, 21, 65537, -917497, 21, 65537, -917496, 21, 65537, -917495, 21, 65537, -917494, 21, 65537, -917493, 21, 65537, -917492, 21, 65537, -917491, 21, 65537, -917490, 21, 65538, -851968, 21, 65536, -851967, 21, 65537, -851966, 21, 65537, -851965, 21, 65537, -851964, 21, 65537, -851963, 21, 65537, -851962, 21, 65537, -851961, 21, 65537, -851960, 21, 65537, -851959, 21, 65537, -851958, 21, 65537, -851957, 21, 65537, -851956, 21, 65537, -851955, 21, 65537, -851954, 21, 65538, -786432, 21, 65536, -786431, 21, 65537, -786430, 21, 65537, -786429, 21, 65537, -786428, 21, 65537, -786427, 21, 65537, -786426, 21, 65537, -786425, 21, 65537, -786424, 21, 65537, -786423, 21, 65537, -786422, 21, 65537, -786421, 21, 65537, -786420, 21, 65537, -786419, 21, 65537, -786418, 21, 65538, -720896, 21, 65536, -720895, 21, 65537, -720894, 21, 65537, -720893, 21, 65537, -720892, 21, 65537, -720891, 21, 65537, -720890, 21, 65537, -720889, 21, 65537, -720888, 21, 65537, -720887, 21, 65537, -720886, 21, 65537, -720885, 21, 65537, -720884, 21, 65537, -720883, 21, 65537, -720882, 21, 65538, -655360, 21, 65536, -655359, 21, 65537, -655358, 21, 65537, -655357, 21, 65537, -655356, 21, 65537, -655355, 21, 65537, -655354, 21, 65537, -655353, 21, 65537, -655352, 21, 65537, -655351, 21, 65537, -655350, 21, 65537, -655349, 21, 65537, -655348, 21, 65537, -655347, 21, 65537, -655346, 21, 65538, -589824, 21, 65536, -589823, 21, 65537, -589822, 21, 65537, -589821, 21, 65537, -589820, 21, 65537, -589819, 21, 65537, -589818, 21, 65537, -589817, 21, 65537, -589816, 21, 65537, -589815, 21, 65537, -589814, 21, 65537, -589813, 21, 65537, -589812, 21, 65537, -589811, 21, 65537, -589810, 21, 65538, -524288, 21, 65536, -524287, 21, 65537, -524286, 21, 65537, -524285, 21, 65537, -524284, 21, 65537, -524283, 21, 65537, -524282, 21, 65537, -524281, 21, 65537, -524280, 21, 65537, -524279, 21, 65537, -524278, 21, 65537, -524277, 21, 65537, -524276, 21, 65537, -524275, 21, 65537, -524274, 21, 65538, -458752, 21, 65536, -458751, 21, 65537, -458750, 21, 65537, -458749, 21, 65537, -458748, 21, 65537, -458747, 21, 65537, -458746, 21, 65537, -458745, 21, 65537, -458744, 21, 65537, -458743, 21, 65537, -458742, 21, 65537, -458741, 21, 65537, -458740, 21, 65537, -458739, 21, 65537, -458738, 21, 65538, -393216, 21, 65536, -393215, 21, 65537, -393214, 21, 65537, -393213, 21, 65537, -393212, 21, 65537, -393211, 21, 65537, -393210, 21, 65537, -393209, 21, 65537, -393208, 21, 65537, -393207, 21, 65537, -393206, 21, 65537, -393205, 21, 65537, -393204, 21, 65537, -393203, 21, 65537, -393202, 21, 65538, -327680, 21, 65536, -327679, 21, 65537, -327678, 21, 65537, -327677, 21, 65537, -327676, 21, 65537, -327675, 21, 65537, -327674, 21, 65537, -327673, 21, 65537, -327672, 21, 65537, -327671, 21, 65537, -327670, 21, 65537, -327669, 21, 65537, -327668, 21, 65537, -327667, 21, 65537, -327666, 21, 65538, -262144, 21, 65536, -262143, 21, 65537, -262142, 21, 65537, -262141, 21, 65537, -262140, 21, 65537, -262139, 21, 65537, -262138, 21, 65537, -262137, 21, 65537, -262136, 21, 65537, -262135, 21, 65537, -262134, 21, 65537, -262133, 21, 65537, -262132, 21, 65537, -262131, 21, 65537, -262130, 21, 65538, -196608, 21, 65536, -196607, 21, 65537, -196606, 21, 65537, -196605, 21, 65537, -196604, 21, 65537, -196603, 21, 65537, -196602, 21, 65537, -196601, 21, 65537, -196600, 21, 65537, -196599, 21, 65537, -196598, 21, 65537, -196597, 21, 65537, -196596, 21, 65537, -196595, 21, 65537, -196594, 21, 65538, -131072, 21, 65536, -131071, 21, 65537, -131070, 21, 65537, -131069, 21, 65537, -131068, 21, 65537, -131067, 21, 65537, -131066, 21, 65537, -131065, 21, 65537, -131064, 21, 65537, -131063, 21, 65537, -131062, 21, 65537, -131061, 21, 65537, -131060, 21, 65537, -131059, 21, 65537, -131058, 21, 65538, -65536, 21, 0, -65535, 21, 131073, -65534, 21, 131073, -65533, 21, 131073, -65532, 21, 131073, -65531, 21, 131073, -65530, 21, 131073, -65529, 21, 131073, -65528, 21, 131073, -65527, 21, 131073, -65526, 21, 131073, -65525, 21, 131073, -65524, 21, 131073, -65523, 21, 131073, -65522, 21, 131074, 0, 35, 0, 1, 35, 0, 2, 35, 0, 3, 35, 0, 4, 35, 0, 5, 35, 0, 6, 35, 0, 7, 35, 0, 8, 35, 0, 9, 35, 0, 10, 35, 0, 11, 35, 0, 12, 35, 0, 13, 35, 0, 14, 35, 0 ) +tile_data = PoolIntArray( -1966079, 50, 0, -1966078, 50, 1, -1966077, 50, 1, -1966076, 50, 1, -1966075, 50, 1, -1966074, 50, 1, -1966073, 50, 1, -1966072, 50, 1, -1966071, 50, 1, -1966070, 50, 2, -1966067, 50, 0, -1966066, 50, 2, -1900544, 50, 0, -1900543, 50, 1, -1900542, 50, 65537, -1900541, 50, 65537, -1900540, 50, 65537, -1900539, 50, 65537, -1900538, 50, 65537, -1900537, 50, 65537, -1900536, 50, 65537, -1900535, 50, 65537, -1900534, 50, 1, -1900533, 50, 1, -1900532, 50, 1, -1900531, 50, 1, -1900530, 50, 65538, -1835008, 50, 65536, -1835007, 50, 65537, -1835006, 50, 65537, -1835005, 50, 65537, -1835004, 50, 65537, -1835003, 50, 65537, -1835002, 50, 65537, -1835001, 50, 65537, -1835000, 50, 65537, -1834999, 50, 65537, -1834998, 50, 65537, -1834997, 50, 65537, -1834996, 50, 65537, -1834995, 50, 65537, -1834994, 50, 65538, -1769472, 50, 65536, -1769471, 50, 65537, -1769470, 50, 65537, -1769469, 50, 65537, -1769468, 50, 65537, -1769467, 50, 65537, -1769466, 50, 65537, -1769465, 50, 65537, -1769464, 50, 65537, -1769463, 50, 65537, -1769462, 50, 65537, -1769461, 50, 65537, -1769460, 50, 65537, -1769459, 50, 65537, -1769458, 50, 65538, -1703936, 50, 65536, -1703935, 50, 65537, -1703934, 50, 65537, -1703933, 50, 65537, -1703932, 50, 65537, -1703931, 50, 65537, -1703930, 50, 65537, -1703929, 50, 65537, -1703928, 50, 65537, -1703927, 50, 65537, -1703926, 50, 65537, -1703925, 50, 65537, -1703924, 50, 65537, -1703923, 50, 65537, -1703922, 50, 65538, -1638400, 50, 65536, -1638399, 50, 65537, -1638398, 50, 65537, -1638397, 50, 65537, -1638396, 50, 65537, -1638395, 50, 65537, -1638394, 50, 65537, -1638393, 50, 65537, -1638392, 50, 65537, -1638391, 50, 65537, -1638390, 50, 65537, -1638389, 50, 65537, -1638388, 50, 65537, -1638387, 50, 65537, -1638386, 50, 65538, -1572864, 50, 65536, -1572863, 50, 65537, -1572862, 50, 65537, -1572861, 50, 65537, -1572860, 50, 65537, -1572859, 50, 65537, -1572858, 50, 65537, -1572857, 50, 65537, -1572856, 50, 65537, -1572855, 50, 65537, -1572854, 50, 65537, -1572853, 50, 65537, -1572852, 50, 65537, -1572851, 50, 65537, -1572850, 50, 65538, -1507328, 50, 65536, -1507327, 50, 65537, -1507326, 50, 65537, -1507325, 50, 65537, -1507324, 50, 65537, -1507323, 50, 65537, -1507322, 50, 65537, -1507321, 50, 65537, -1507320, 50, 65537, -1507319, 50, 65537, -1507318, 50, 65537, -1507317, 50, 65537, -1507316, 50, 65537, -1507315, 50, 65537, -1507314, 50, 65538, -1441792, 50, 65536, -1441791, 50, 65537, -1441790, 50, 65537, -1441789, 50, 65537, -1441788, 50, 65537, -1441787, 50, 65537, -1441786, 50, 65537, -1441785, 50, 65537, -1441784, 50, 65537, -1441783, 50, 65537, -1441782, 50, 65537, -1441781, 50, 65537, -1441780, 50, 65537, -1441779, 50, 65537, -1441778, 50, 65538, -1376256, 50, 65536, -1376255, 50, 65537, -1376254, 50, 65537, -1376253, 50, 65537, -1376252, 50, 65537, -1376251, 50, 65537, -1376250, 50, 65537, -1376249, 50, 65537, -1376248, 50, 65537, -1376247, 50, 65537, -1376246, 50, 65537, -1376245, 50, 65537, -1376244, 50, 65537, -1376243, 50, 65537, -1376242, 50, 65538, -1310720, 50, 65536, -1310719, 50, 65537, -1310718, 50, 65537, -1310717, 50, 65537, -1310716, 50, 65537, -1310715, 50, 65537, -1310714, 50, 65537, -1310713, 50, 65537, -1310712, 50, 65537, -1310711, 50, 65537, -1310710, 50, 65537, -1310709, 50, 65537, -1310708, 50, 65537, -1310707, 50, 65537, -1310706, 50, 65538, -1245184, 50, 65536, -1245183, 50, 65537, -1245182, 50, 65537, -1245181, 50, 65537, -1245180, 50, 65537, -1245179, 50, 65537, -1245178, 50, 65537, -1245177, 50, 65537, -1245176, 50, 65537, -1245175, 50, 65537, -1245174, 50, 65537, -1245173, 50, 65537, -1245172, 50, 65537, -1245171, 50, 65537, -1245170, 50, 65538, -1179648, 50, 65536, -1179647, 50, 65537, -1179646, 50, 65537, -1179645, 50, 65537, -1179644, 50, 65537, -1179643, 50, 65537, -1179642, 50, 65537, -1179641, 50, 65537, -1179640, 50, 65537, -1179639, 50, 65537, -1179638, 50, 65537, -1179637, 50, 65537, -1179636, 50, 65537, -1179635, 50, 65537, -1179634, 50, 65538, -1114112, 50, 65536, -1114111, 50, 65537, -1114110, 50, 65537, -1114109, 50, 65537, -1114108, 50, 65537, -1114107, 50, 65537, -1114106, 50, 65537, -1114105, 50, 65537, -1114104, 50, 65537, -1114103, 50, 65537, -1114102, 50, 65537, -1114101, 50, 65537, -1114100, 50, 65537, -1114099, 50, 65537, -1114098, 50, 65538, -1048576, 50, 65536, -1048575, 50, 65537, -1048574, 50, 65537, -1048573, 50, 65537, -1048572, 50, 65537, -1048571, 50, 65537, -1048570, 50, 65537, -1048569, 50, 65537, -1048568, 50, 65537, -1048567, 50, 65537, -1048566, 50, 65537, -1048565, 50, 65537, -1048564, 50, 65537, -1048563, 50, 65537, -1048562, 50, 65538, -983040, 50, 65536, -983039, 50, 65537, -983038, 50, 65537, -983037, 50, 65537, -983036, 50, 65537, -983035, 50, 65537, -983034, 50, 65537, -983033, 50, 65537, -983032, 50, 65537, -983031, 50, 65537, -983030, 50, 65537, -983029, 50, 65537, -983028, 50, 65537, -983027, 50, 65537, -983026, 50, 65538, -917504, 50, 65536, -917503, 50, 65537, -917502, 50, 65537, -917501, 50, 65537, -917500, 50, 65537, -917499, 50, 65537, -917498, 50, 65537, -917497, 50, 65537, -917496, 50, 65537, -917495, 50, 65537, -917494, 50, 65537, -917493, 50, 65537, -917492, 50, 65537, -917491, 50, 65537, -917490, 50, 65538, -851968, 50, 65536, -851967, 50, 65537, -851966, 50, 65537, -851965, 50, 65537, -851964, 50, 65537, -851963, 50, 65537, -851962, 50, 65537, -851961, 50, 65537, -851960, 50, 65537, -851959, 50, 65537, -851958, 50, 65537, -851957, 50, 65537, -851956, 50, 65537, -851955, 50, 65537, -851954, 50, 65538, -786432, 50, 65536, -786431, 50, 65537, -786430, 50, 65537, -786429, 50, 65537, -786428, 50, 65537, -786427, 50, 65537, -786426, 50, 65537, -786425, 50, 65537, -786424, 50, 65537, -786423, 50, 65537, -786422, 50, 65537, -786421, 50, 65537, -786420, 50, 65537, -786419, 50, 65537, -786418, 50, 65538, -720896, 50, 65536, -720895, 50, 65537, -720894, 50, 65537, -720893, 50, 65537, -720892, 50, 65537, -720891, 50, 65537, -720890, 50, 65537, -720889, 50, 65537, -720888, 50, 65537, -720887, 50, 65537, -720886, 50, 65537, -720885, 50, 65537, -720884, 50, 65537, -720883, 50, 65537, -720882, 50, 65538, -655360, 50, 65536, -655359, 50, 65537, -655358, 50, 65537, -655357, 50, 65537, -655356, 50, 65537, -655355, 50, 65537, -655354, 50, 65537, -655353, 50, 65537, -655352, 50, 65537, -655351, 50, 65537, -655350, 50, 65537, -655349, 50, 65537, -655348, 50, 65537, -655347, 50, 65537, -655346, 50, 65538, -589824, 50, 65536, -589823, 50, 65537, -589822, 50, 65537, -589821, 50, 65537, -589820, 50, 65537, -589819, 50, 65537, -589818, 50, 65537, -589817, 50, 65537, -589816, 50, 65537, -589815, 50, 65537, -589814, 50, 65537, -589813, 50, 65537, -589812, 50, 65537, -589811, 50, 65537, -589810, 50, 65538, -524288, 50, 65536, -524287, 50, 65537, -524286, 50, 65537, -524285, 50, 65537, -524284, 50, 65537, -524283, 50, 65537, -524282, 50, 65537, -524281, 50, 65537, -524280, 50, 65537, -524279, 50, 65537, -524278, 50, 65537, -524277, 50, 65537, -524276, 50, 65537, -524275, 50, 65537, -524274, 50, 65538, -458752, 50, 65536, -458751, 50, 65537, -458750, 50, 65537, -458749, 50, 65537, -458748, 50, 65537, -458747, 50, 65537, -458746, 50, 65537, -458745, 50, 65537, -458744, 50, 65537, -458743, 50, 65537, -458742, 50, 65537, -458741, 50, 65537, -458740, 50, 65537, -458739, 50, 65537, -458738, 50, 65538, -393216, 50, 65536, -393215, 50, 65537, -393214, 50, 65537, -393213, 50, 65537, -393212, 50, 65537, -393211, 50, 65537, -393210, 50, 65537, -393209, 50, 65537, -393208, 50, 65537, -393207, 50, 65537, -393206, 50, 65537, -393205, 50, 65537, -393204, 50, 65537, -393203, 50, 65537, -393202, 50, 65538, -327680, 50, 65536, -327679, 50, 65537, -327678, 50, 65537, -327677, 50, 65537, -327676, 50, 65537, -327675, 50, 65537, -327674, 50, 65537, -327673, 50, 65537, -327672, 50, 65537, -327671, 50, 65537, -327670, 50, 65537, -327669, 50, 65537, -327668, 50, 65537, -327667, 50, 65537, -327666, 50, 65538, -262144, 50, 65536, -262143, 50, 65537, -262142, 50, 65537, -262141, 50, 65537, -262140, 50, 65537, -262139, 50, 65537, -262138, 50, 65537, -262137, 50, 65537, -262136, 50, 65537, -262135, 50, 65537, -262134, 50, 65537, -262133, 50, 65537, -262132, 50, 65537, -262131, 50, 65537, -262130, 50, 65538, -196608, 50, 65536, -196607, 50, 65537, -196606, 50, 65537, -196605, 50, 65537, -196604, 50, 65537, -196603, 50, 65537, -196602, 50, 65537, -196601, 50, 65537, -196600, 50, 65537, -196599, 50, 65537, -196598, 50, 65537, -196597, 50, 65537, -196596, 50, 65537, -196595, 50, 65537, -196594, 50, 65538, -131072, 50, 65536, -131071, 50, 65537, -131070, 50, 65537, -131069, 50, 65537, -131068, 50, 65537, -131067, 50, 65537, -131066, 50, 65537, -131065, 50, 65537, -131064, 50, 65537, -131063, 50, 65537, -131062, 50, 65537, -131061, 50, 65537, -131060, 50, 65537, -131059, 50, 65537, -131058, 50, 65538, -65536, 50, 131072, -65535, 50, 131073, -65534, 50, 131073, -65533, 50, 131073, -65532, 50, 131073, -65531, 50, 131073, -65530, 50, 131073, -65529, 50, 131073, -65528, 50, 131073, -65527, 50, 131073, -65526, 50, 131073, -65525, 50, 131073, -65524, 50, 131073, -65523, 50, 131073, -65522, 50, 131074, 0, 35, 0, 1, 35, 0, 2, 35, 0, 3, 35, 0, 4, 35, 0, 5, 35, 0, 6, 35, 0, 7, 35, 0, 8, 35, 0, 9, 35, 0, 10, 35, 0, 11, 35, 0, 12, 35, 0, 13, 35, 0, 14, 35, 0, 131071, 50, 0, 65536, 50, 1, 65537, 50, 1, 65538, 50, 1, 65539, 50, 1, 65540, 50, 1, 65541, 50, 1, 65542, 50, 1, 65543, 50, 1, 65544, 50, 1, 65545, 50, 1, 65546, 50, 1, 65547, 50, 1, 65548, 50, 1, 65549, 50, 1, 65550, 50, 1, 65551, 50, 2, 196607, 50, 65536, 131072, 50, 65537, 131073, 50, 65537, 131074, 50, 65537, 131075, 50, 65537, 131076, 50, 65537, 131077, 50, 65537, 131078, 50, 65537, 131079, 50, 65537, 131080, 50, 65537, 131081, 50, 65537, 131082, 50, 65537, 131083, 50, 65537, 131084, 50, 65537, 131085, 50, 65537, 131086, 50, 65537, 131087, 50, 65538, 262143, 50, 65536, 196608, 50, 65537, 196609, 50, 65537, 196610, 50, 65537, 196611, 50, 65537, 196612, 50, 65537, 196613, 50, 65537, 196614, 50, 65537, 196615, 50, 65537, 196616, 50, 65537, 196617, 50, 65537, 196618, 50, 65537, 196619, 50, 65537, 196620, 50, 65537, 196621, 50, 65537, 196622, 50, 65537, 196623, 50, 65538, 327679, 50, 65536, 262144, 50, 65537, 262145, 50, 65537, 262146, 50, 65537, 262147, 50, 65537, 262148, 50, 65537, 262149, 50, 65537, 262150, 50, 65537, 262151, 50, 65537, 262152, 50, 65537, 262153, 50, 65537, 262154, 50, 65537, 262155, 50, 65537, 262156, 50, 65537, 262157, 50, 65537, 262158, 50, 65537, 262159, 50, 65538, 393215, 50, 65536, 327680, 50, 65537, 327681, 50, 65537, 327682, 50, 65537, 327683, 50, 65537, 327684, 50, 65537, 327685, 50, 65537, 327686, 50, 65537, 327687, 50, 65537, 327688, 50, 65537, 327689, 50, 65537, 327690, 50, 65537, 327691, 50, 65537, 327692, 50, 65537, 327693, 50, 65537, 327694, 50, 65537, 327695, 50, 65538, 458751, 50, 65536, 393216, 50, 65537, 393217, 50, 65537, 393218, 50, 65537, 393219, 50, 65537, 393220, 50, 65537, 393221, 50, 65537, 393222, 50, 65537, 393223, 50, 65537, 393224, 50, 65537, 393225, 50, 65537, 393226, 50, 65537, 393227, 50, 65537, 393228, 50, 65537, 393229, 50, 65537, 393230, 50, 65537, 393231, 50, 65538, 524287, 50, 65536, 458752, 50, 65537, 458753, 50, 65537, 458754, 50, 65537, 458755, 50, 65537, 458756, 50, 65537, 458757, 50, 65537, 458758, 50, 65537, 458759, 50, 65537, 458760, 50, 65537, 458761, 50, 65537, 458762, 50, 65537, 458763, 50, 65537, 458764, 50, 65537, 458765, 50, 65537, 458766, 50, 65537, 458767, 50, 65538, 589823, 50, 65536, 524288, 50, 65537, 524289, 50, 65537, 524290, 50, 65537, 524291, 50, 65537, 524292, 50, 65537, 524293, 50, 65537, 524294, 50, 65537, 524295, 50, 65537, 524296, 50, 65537, 524297, 50, 65537, 524298, 50, 65537, 524299, 50, 65537, 524300, 50, 65537, 524301, 50, 65537, 524302, 50, 65537, 524303, 50, 65538, 655359, 50, 65536, 589824, 50, 65537, 589825, 50, 65537, 589826, 50, 65537, 589827, 50, 65537, 589828, 50, 65537, 589829, 50, 65537, 589830, 50, 65537, 589831, 50, 65537, 589832, 50, 65537, 589833, 50, 65537, 589834, 50, 65537, 589835, 50, 65537, 589836, 50, 65537, 589837, 50, 65537, 589838, 50, 65537, 589839, 50, 65538, 720895, 50, 65536, 655360, 50, 65537, 655361, 50, 65537, 655362, 50, 65537, 655363, 50, 65537, 655364, 50, 65537, 655365, 50, 65537, 655366, 50, 65537, 655367, 50, 65537, 655368, 50, 65537, 655369, 50, 65537, 655370, 50, 65537, 655371, 50, 65537, 655372, 50, 65537, 655373, 50, 65537, 655374, 50, 65537, 655375, 50, 65538, 786431, 50, 65536, 720896, 50, 65537, 720897, 50, 65537, 720898, 50, 65537, 720899, 50, 65537, 720900, 50, 65537, 720901, 50, 65537, 720902, 50, 65537, 720903, 50, 65537, 720904, 50, 65537, 720905, 50, 65537, 720906, 50, 65537, 720907, 50, 65537, 720908, 50, 65537, 720909, 50, 65537, 720910, 50, 65537, 720911, 50, 65538, 851967, 50, 65536, 786432, 50, 65537, 786433, 50, 65537, 786434, 50, 65537, 786435, 50, 65537, 786436, 50, 65537, 786437, 50, 65537, 786438, 50, 65537, 786439, 50, 65537, 786440, 50, 65537, 786441, 50, 65537, 786442, 50, 65537, 786443, 50, 65537, 786444, 50, 65537, 786445, 50, 65537, 786446, 50, 65537, 786447, 50, 65538, 917503, 50, 65536, 851968, 50, 65537, 851969, 50, 65537, 851970, 50, 65537, 851971, 50, 65537, 851972, 50, 65537, 851973, 50, 65537, 851974, 50, 65537, 851975, 50, 65537, 851976, 50, 65537, 851977, 50, 65537, 851978, 50, 65537, 851979, 50, 65537, 851980, 50, 65537, 851981, 50, 65537, 851982, 50, 65537, 851983, 50, 65538, 983039, 50, 65536, 917504, 50, 65537, 917505, 50, 65537, 917506, 50, 65537, 917507, 50, 65537, 917508, 50, 65537, 917509, 50, 65537, 917510, 50, 65537, 917511, 50, 65537, 917512, 50, 65537, 917513, 50, 65537, 917514, 50, 65537, 917515, 50, 65537, 917516, 50, 65537, 917517, 50, 65537, 917518, 50, 65537, 917519, 50, 65538, 1048575, 50, 65536, 983040, 50, 65537, 983041, 50, 65537, 983042, 50, 65537, 983043, 50, 65537, 983044, 50, 65537, 983045, 50, 65537, 983046, 50, 65537, 983047, 50, 65537, 983048, 50, 65537, 983049, 50, 65537, 983050, 50, 65537, 983051, 50, 65537, 983052, 50, 65537, 983053, 50, 65537, 983054, 50, 65537, 983055, 50, 65538, 1114111, 50, 65536, 1048576, 50, 65537, 1048577, 50, 65537, 1048578, 50, 65537, 1048579, 50, 65537, 1048580, 50, 65537, 1048581, 50, 65537, 1048582, 50, 65537, 1048583, 50, 65537, 1048584, 50, 65537, 1048585, 50, 65537, 1048586, 50, 65537, 1048587, 50, 65537, 1048588, 50, 65537, 1048589, 50, 65537, 1048590, 50, 65537, 1048591, 50, 65538, 1179647, 50, 65536, 1114112, 50, 65537, 1114113, 50, 65537, 1114114, 50, 65537, 1114115, 50, 65537, 1114116, 50, 65537, 1114117, 50, 65537, 1114118, 50, 65537, 1114119, 50, 65537, 1114120, 50, 65537, 1114121, 50, 65537, 1114122, 50, 65537, 1114123, 50, 65537, 1114124, 50, 65537, 1114125, 50, 65537, 1114126, 50, 65537, 1114127, 50, 65538, 1245183, 50, 65536, 1179648, 50, 65537, 1179649, 50, 65537, 1179650, 50, 65537, 1179651, 50, 65537, 1179652, 50, 65537, 1179653, 50, 65537, 1179654, 50, 65537, 1179655, 50, 65537, 1179656, 50, 65537, 1179657, 50, 65537, 1179658, 50, 65537, 1179659, 50, 65537, 1179660, 50, 65537, 1179661, 50, 65537, 1179662, 50, 65537, 1179663, 50, 65538, 1310719, 50, 65536, 1245184, 50, 65537, 1245185, 50, 65537, 1245186, 50, 65537, 1245187, 50, 65537, 1245188, 50, 65537, 1245189, 50, 65537, 1245190, 50, 65537, 1245191, 50, 65537, 1245192, 50, 65537, 1245193, 50, 65537, 1245194, 50, 65537, 1245195, 50, 65537, 1245196, 50, 65537, 1245197, 50, 65537, 1245198, 50, 65537, 1245199, 50, 65538, 1376255, 50, 65536, 1310720, 50, 65537, 1310721, 50, 65537, 1310722, 50, 65537, 1310723, 50, 65537, 1310724, 50, 65537, 1310725, 50, 65537, 1310726, 50, 65537, 1310727, 50, 65537, 1310728, 50, 65537, 1310729, 50, 65537, 1310730, 50, 65537, 1310731, 50, 65537, 1310732, 50, 65537, 1310733, 50, 65537, 1310734, 50, 65537, 1310735, 50, 65538, 1441791, 50, 65536, 1376256, 50, 65537, 1376257, 50, 65537, 1376258, 50, 65537, 1376259, 50, 65537, 1376260, 50, 65537, 1376261, 50, 65537, 1376262, 50, 65537, 1376263, 50, 65537, 1376264, 50, 65537, 1376265, 50, 65537, 1376266, 50, 65537, 1376267, 50, 65537, 1376268, 50, 65537, 1376269, 50, 65537, 1376270, 50, 65537, 1376271, 50, 65538, 1507327, 50, 65536, 1441792, 50, 65537, 1441793, 50, 65537, 1441794, 50, 65537, 1441795, 50, 65537, 1441796, 50, 65537, 1441797, 50, 65537, 1441798, 50, 65537, 1441799, 50, 65537, 1441800, 50, 65537, 1441801, 50, 65537, 1441802, 50, 65537, 1441803, 50, 65537, 1441804, 50, 65537, 1441805, 50, 65537, 1441806, 50, 65537, 1441807, 50, 65538, 1572863, 50, 65536, 1507328, 50, 65537, 1507329, 50, 65537, 1507330, 50, 65537, 1507331, 50, 65537, 1507332, 50, 65537, 1507333, 50, 65537, 1507334, 50, 65537, 1507335, 50, 65537, 1507336, 50, 65537, 1507337, 50, 65537, 1507338, 50, 65537, 1507339, 50, 65537, 1507340, 50, 65537, 1507341, 50, 65537, 1507342, 50, 65537, 1507343, 50, 65538, 1638399, 50, 65536, 1572864, 50, 65537, 1572865, 50, 65537, 1572866, 50, 65537, 1572867, 50, 65537, 1572868, 50, 65537, 1572869, 50, 65537, 1572870, 50, 65537, 1572871, 50, 65537, 1572872, 50, 65537, 1572873, 50, 65537, 1572874, 50, 65537, 1572875, 50, 65537, 1572876, 50, 65537, 1572877, 50, 65537, 1572878, 50, 65537, 1572879, 50, 65538, 1703935, 50, 65536, 1638400, 50, 65537, 1638401, 50, 65537, 1638402, 50, 65537, 1638403, 50, 65537, 1638404, 50, 65537, 1638405, 50, 65537, 1638406, 50, 65537, 1638407, 50, 65537, 1638408, 50, 65537, 1638409, 50, 65537, 1638410, 50, 65537, 1638411, 50, 65537, 1638412, 50, 65537, 1638413, 50, 65537, 1638414, 50, 65537, 1638415, 50, 65538, 1769471, 50, 65536, 1703936, 50, 65537, 1703937, 50, 65537, 1703938, 50, 65537, 1703939, 50, 65537, 1703940, 50, 65537, 1703941, 50, 65537, 1703942, 50, 65537, 1703943, 50, 65537, 1703944, 50, 65537, 1703945, 50, 65537, 1703946, 50, 65537, 1703947, 50, 65537, 1703948, 50, 65537, 1703949, 50, 65537, 1703950, 50, 65537, 1703951, 50, 65538, 1835007, 50, 65536, 1769472, 50, 65537, 1769473, 50, 65537, 1769474, 50, 65537, 1769475, 50, 65537, 1769476, 50, 65537, 1769477, 50, 65537, 1769478, 50, 65537, 1769479, 50, 65537, 1769480, 50, 65537, 1769481, 50, 65537, 1769482, 50, 65537, 1769483, 50, 65537, 1769484, 50, 65537, 1769485, 50, 65537, 1769486, 50, 65537, 1769487, 50, 65538, 1900543, 50, 65536, 1835008, 50, 65537, 1835009, 50, 65537, 1835010, 50, 65537, 1835011, 50, 65537, 1835012, 50, 65537, 1835013, 50, 65537, 1835014, 50, 65537, 1835015, 50, 65537, 1835016, 50, 65537, 1835017, 50, 65537, 1835018, 50, 65537, 1835019, 50, 65537, 1835020, 50, 65537, 1835021, 50, 65537, 1835022, 50, 65537, 1835023, 50, 65538, 1966079, 50, 65536, 1900544, 50, 65537, 1900545, 50, 65537, 1900546, 50, 65537, 1900547, 50, 65537, 1900548, 50, 65537, 1900549, 50, 65537, 1900550, 50, 65537, 1900551, 50, 65537, 1900552, 50, 65537, 1900553, 50, 65537, 1900554, 50, 65537, 1900555, 50, 65537, 1900556, 50, 65537, 1900557, 50, 65537, 1900558, 50, 65537, 1900559, 50, 65538, 2031615, 50, 131072, 1966080, 50, 131073, 1966081, 50, 131073, 1966082, 50, 131073, 1966083, 50, 131073, 1966084, 50, 131073, 1966085, 50, 131073, 1966086, 50, 131073, 1966087, 50, 131073, 1966088, 50, 131073, 1966089, 50, 131073, 1966090, 50, 131073, 1966091, 50, 131073, 1966092, 50, 131073, 1966093, 50, 131073, 1966094, 50, 131073, 1966095, 50, 131074, 2031616, 35, 0, 2031617, 35, 0, 2031618, 35, 0, 2031619, 35, 0, 2031620, 35, 0, 2031621, 35, 0, 2031622, 35, 0, 2031623, 35, 0, 2031624, 35, 0, 2031625, 35, 0, 2031626, 35, 0, 2031627, 35, 0, 2031628, 35, 0, 2031629, 35, 0, 2031630, 35, 0, 2162687, 50, 0, 2097152, 50, 1, 2097153, 50, 1, 2097154, 50, 1, 2097155, 50, 1, 2097156, 50, 1, 2097157, 50, 1, 2097158, 50, 1, 2097159, 50, 1, 2097160, 50, 1, 2097161, 50, 1, 2097162, 50, 1, 2097163, 50, 1, 2097164, 50, 1, 2097165, 50, 1, 2097166, 50, 1, 2097167, 50, 2, 2228223, 50, 131072, 2162688, 50, 131073, 2162689, 50, 131073, 2162690, 50, 131073, 2162691, 50, 131073, 2162692, 50, 131073, 2162693, 50, 131073, 2162694, 50, 131073, 2162695, 50, 131073, 2162696, 50, 131073, 2162697, 50, 131073, 2162698, 50, 131073, 2162699, 50, 131073, 2162700, 50, 131073, 2162701, 50, 131073, 2162702, 50, 131073, 2162703, 50, 131074 ) -[node name="Grass" type="TileMap" parent="Upper Cliffs" groups=[ +[node name="Grass" type="TileMap" parent="Cliffs" groups=[ "Cliffs", "Foliage", "Summer", @@ -1814,15 +1833,14 @@ cell_size = Vector2( 16, 16 ) cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) collision_use_parent = true format = 1 -tile_data = PoolIntArray( -1966079, 23, 0, -1966078, 22, 0, -1966077, 22, 0, -1966076, 22, 0, -1966075, 22, 0, -1966074, 22, 0, -1966073, 22, 0, -1966072, 22, 0, -1966071, 22, 0, -1966070, 24, 0, -1966067, 23, 0, -1966066, 30, 0, -1900544, 23, 0, -1900543, 21, 0, -1900542, 21, 1, -1900541, 21, 1, -1900540, 21, 1, -1900539, 21, 1, -1900538, 21, 1, -1900537, 21, 1, -1900536, 21, 1, -1900535, 21, 1, -1900534, 23, 0, -1900533, 21, 1, -1900532, 21, 1, -1900531, 30, 0, -1900530, 21, 2, -1835008, 21, 0, -1835007, 21, 0, -1835006, 21, 65537, -1835005, 21, 65537, -1835004, 21, 65537, -1835003, 21, 65537, -1835002, 21, 65537, -1835001, 21, 65537, -1835000, 21, 65537, -1834999, 21, 65537, -1834998, 21, 65537, -1834997, 21, 65537, -1834996, 21, 65537, -1834995, 21, 65537, -1834994, 21, 65538, -1769472, 21, 65536, -1769471, 21, 65537, -1769470, 21, 65537, -1769469, 21, 65537, -1769468, 21, 65537, -1769467, 21, 65537, -1769466, 21, 65537, -1769465, 21, 65537, -1769464, 21, 65537, -1769463, 21, 65537, -1769462, 21, 65537, -1769461, 21, 65537, -1769460, 21, 65537, -1769459, 21, 65537, -1769458, 21, 65538, -1703936, 21, 65536, -1703935, 21, 65537, -1703934, 21, 65537, -1703933, 21, 65537, -1703932, 21, 65537, -1703931, 21, 65537, -1703930, 21, 65537, -1703929, 21, 65537, -1703928, 21, 65537, -1703927, 21, 65537, -1703926, 21, 65537, -1703925, 21, 65537, -1703924, 21, 65537, -1703923, 21, 65537, -1703922, 21, 65538, -1638400, 21, 65536, -1638399, 21, 65537, -1638398, 21, 65537, -1638397, 21, 65537, -1638396, 21, 65537, -1638395, 21, 65537, -1638394, 21, 65537, -1638393, 21, 65537, -1638392, 21, 65537, -1638391, 21, 65537, -1638390, 21, 65537, -1638389, 21, 65537, -1638388, 21, 65537, -1638387, 21, 65537, -1638386, 21, 65538, -1572864, 21, 65536, -1572863, 21, 65537, -1572862, 21, 65537, -1572861, 21, 65537, -1572860, 21, 65537, -1572859, 21, 65537, -1572858, 21, 65537, -1572857, 21, 65537, -1572856, 21, 65537, -1572855, 21, 65537, -1572854, 21, 65537, -1572853, 21, 65537, -1572852, 21, 65537, -1572851, 21, 65537, -1572850, 21, 65538, -1507328, 21, 65536, -1507327, 21, 65537, -1507326, 21, 65537, -1507325, 21, 65537, -1507324, 21, 65537, -1507323, 21, 65537, -1507322, 21, 65537, -1507321, 21, 65537, -1507320, 21, 65537, -1507319, 21, 65537, -1507318, 21, 65537, -1507317, 21, 65537, -1507316, 21, 65537, -1507315, 21, 65537, -1507314, 21, 65538, -1441792, 21, 65536, -1441791, 21, 65537, -1441790, 21, 65537, -1441789, 21, 65537, -1441788, 21, 65537, -1441787, 21, 65537, -1441786, 21, 65537, -1441785, 21, 65537, -1441784, 21, 65537, -1441783, 21, 65537, -1441782, 21, 65537, -1441781, 21, 65537, -1441780, 21, 65537, -1441779, 21, 65537, -1441778, 21, 65538, -1376256, 21, 65536, -1376255, 21, 65537, -1376254, 21, 65537, -1376253, 21, 65537, -1376252, 21, 65537, -1376251, 21, 65537, -1376250, 21, 65537, -1376249, 21, 65537, -1376248, 21, 65537, -1376247, 21, 65537, -1376246, 21, 65537, -1376245, 21, 65537, -1376244, 21, 65537, -1376243, 21, 65537, -1376242, 21, 65538, -1310720, 21, 65536, -1310719, 21, 65537, -1310718, 21, 65537, -1310717, 21, 65537, -1310716, 21, 65537, -1310715, 21, 65537, -1310714, 21, 65537, -1310713, 21, 65537, -1310712, 21, 65537, -1310711, 21, 65537, -1310710, 21, 65537, -1310709, 21, 65537, -1310708, 21, 65537, -1310707, 21, 65537, -1310706, 21, 65538, -1245184, 21, 65536, -1245183, 21, 65537, -1245182, 21, 65537, -1245181, 21, 65537, -1245180, 21, 65537, -1245179, 21, 65537, -1245178, 21, 65537, -1245177, 21, 65537, -1245176, 21, 65537, -1245175, 21, 65537, -1245174, 21, 65537, -1245173, 21, 65537, -1245172, 21, 65537, -1245171, 21, 65537, -1245170, 21, 65538, -1179648, 21, 65536, -1179647, 21, 65537, -1179646, 21, 65537, -1179645, 21, 65537, -1179644, 21, 65537, -1179643, 21, 65537, -1179642, 21, 65537, -1179641, 21, 65537, -1179640, 21, 65537, -1179639, 21, 65537, -1179638, 21, 65537, -1179637, 21, 65537, -1179636, 21, 65537, -1179635, 21, 65537, -1179634, 21, 65538, -1114112, 21, 65536, -1114111, 21, 65537, -1114110, 21, 65537, -1114109, 21, 65537, -1114108, 21, 65537, -1114107, 21, 65537, -1114106, 21, 65537, -1114105, 21, 65537, -1114104, 21, 65537, -1114103, 21, 65537, -1114102, 21, 65537, -1114101, 21, 65537, -1114100, 21, 65537, -1114099, 21, 65537, -1114098, 21, 65538, -1048576, 21, 65536, -1048575, 21, 65537, -1048574, 21, 65537, -1048573, 21, 65537, -1048572, 21, 65537, -1048571, 21, 65537, -1048570, 21, 65537, -1048569, 21, 65537, -1048568, 21, 65537, -1048567, 21, 65537, -1048566, 21, 65537, -1048565, 21, 65537, -1048564, 21, 65537, -1048563, 21, 65537, -1048562, 21, 65538, -983040, 21, 65536, -983039, 21, 65537, -983038, 21, 65537, -983037, 21, 65537, -983036, 21, 65537, -983035, 21, 65537, -983034, 21, 65537, -983033, 21, 65537, -983032, 21, 65537, -983031, 21, 65537, -983030, 21, 65537, -983029, 21, 65537, -983028, 21, 65537, -983027, 21, 65537, -983026, 21, 65538, -917504, 21, 65536, -917503, 21, 65537, -917502, 21, 65537, -917501, 21, 65537, -917500, 21, 65537, -917499, 21, 65537, -917498, 21, 65537, -917497, 21, 65537, -917496, 21, 65537, -917495, 21, 65537, -917494, 21, 65537, -917493, 21, 65537, -917492, 21, 65537, -917491, 21, 65537, -917490, 21, 65538, -851968, 21, 65536, -851967, 21, 65537, -851966, 21, 65537, -851965, 21, 65537, -851964, 21, 65537, -851963, 21, 65537, -851962, 21, 65537, -851961, 21, 65537, -851960, 21, 65537, -851959, 21, 65537, -851958, 21, 65537, -851957, 21, 65537, -851956, 21, 65537, -851955, 21, 65537, -851954, 21, 65538, -786432, 21, 65536, -786431, 21, 65537, -786430, 21, 65537, -786429, 21, 65537, -786428, 21, 65537, -786427, 21, 65537, -786426, 21, 65537, -786425, 21, 65537, -786424, 21, 65537, -786423, 21, 65537, -786422, 21, 65537, -786421, 21, 65537, -786420, 21, 65537, -786419, 21, 65537, -786418, 21, 65538, -720896, 21, 65536, -720895, 21, 65537, -720894, 21, 65537, -720893, 21, 65537, -720892, 21, 65537, -720891, 21, 65537, -720890, 21, 65537, -720889, 21, 65537, -720888, 21, 65537, -720887, 21, 65537, -720886, 21, 65537, -720885, 21, 65537, -720884, 21, 65537, -720883, 21, 65537, -720882, 21, 65538, -655360, 21, 65536, -655359, 21, 65537, -655358, 21, 65537, -655357, 21, 65537, -655356, 21, 65537, -655355, 21, 65537, -655354, 21, 65537, -655353, 21, 65537, -655352, 21, 65537, -655351, 21, 65537, -655350, 21, 65537, -655349, 21, 65537, -655348, 21, 65537, -655347, 21, 65537, -655346, 21, 65538, -589824, 21, 65536, -589823, 21, 65537, -589822, 21, 65537, -589821, 21, 65537, -589820, 21, 65537, -589819, 21, 65537, -589818, 21, 65537, -589817, 21, 65537, -589816, 21, 65537, -589815, 21, 65537, -589814, 21, 65537, -589813, 21, 65537, -589812, 21, 65537, -589811, 21, 65537, -589810, 21, 65538, -524288, 21, 65536, -524287, 21, 65537, -524286, 21, 65537, -524285, 21, 65537, -524284, 21, 65537, -524283, 21, 65537, -524282, 21, 65537, -524281, 21, 65537, -524280, 21, 65537, -524279, 21, 65537, -524278, 21, 65537, -524277, 21, 65537, -524276, 21, 65537, -524275, 21, 65537, -524274, 21, 65538, -458752, 21, 65536, -458751, 21, 65537, -458750, 21, 65537, -458749, 21, 65537, -458748, 21, 65537, -458747, 21, 65537, -458746, 21, 65537, -458745, 21, 65537, -458744, 21, 65537, -458743, 21, 65537, -458742, 21, 65537, -458741, 21, 65537, -458740, 21, 65537, -458739, 21, 65537, -458738, 21, 65538, -393216, 21, 65536, -393215, 21, 65537, -393214, 21, 65537, -393213, 21, 65537, -393212, 21, 65537, -393211, 21, 65537, -393210, 21, 65537, -393209, 21, 65537, -393208, 21, 65537, -393207, 21, 65537, -393206, 21, 65537, -393205, 21, 65537, -393204, 21, 65537, -393203, 21, 65537, -393202, 21, 65538, -327680, 21, 65536, -327679, 21, 65537, -327678, 21, 65537, -327677, 21, 65537, -327676, 21, 65537, -327675, 21, 65537, -327674, 21, 65537, -327673, 21, 65537, -327672, 21, 65537, -327671, 21, 65537, -327670, 21, 65537, -327669, 21, 65537, -327668, 21, 65537, -327667, 21, 65537, -327666, 21, 65538, -262144, 21, 65536, -262143, 21, 65537, -262142, 21, 65537, -262141, 21, 65537, -262140, 21, 65537, -262139, 21, 65537, -262138, 21, 65537, -262137, 21, 65537, -262136, 21, 65537, -262135, 21, 65537, -262134, 21, 65537, -262133, 21, 65537, -262132, 21, 65537, -262131, 21, 65537, -262130, 21, 65538, -196608, 21, 65536, -196607, 21, 65537, -196606, 21, 65537, -196605, 21, 65537, -196604, 21, 65537, -196603, 21, 65537, -196602, 21, 65537, -196601, 21, 65537, -196600, 21, 65537, -196599, 21, 65537, -196598, 21, 65537, -196597, 21, 65537, -196596, 21, 65537, -196595, 21, 65537, -196594, 21, 65538, -131072, 21, 65536, -131071, 21, 65537, -131070, 21, 65537, -131069, 21, 65537, -131068, 21, 65537, -131067, 21, 65537, -131066, 21, 65537, -131065, 21, 65537, -131064, 21, 65537, -131063, 21, 65537, -131062, 21, 65537, -131061, 21, 65537, -131060, 21, 65537, -131059, 21, 65537, -131058, 21, 65538, -65536, 21, 131072, -65535, 21, 131073, -65534, 21, 131073, -65533, 21, 131073, -65532, 21, 131073, -65531, 21, 131073, -65530, 21, 131073, -65529, 21, 131073, -65528, 21, 131073, -65527, 21, 131073, -65526, 21, 131073, -65525, 21, 131073, -65524, 21, 131073, -65523, 21, 131073, -65522, 21, 131074 ) +tile_data = PoolIntArray( -1966079, 23, 0, -1966078, 22, 0, -1966077, 22, 0, -1966076, 22, 0, -1966075, 22, 0, -1966074, 22, 0, -1966073, 22, 0, -1966072, 22, 0, -1966071, 22, 0, -1966070, 30, 0, -1966067, 23, 0, -1966066, 30, 0, -1900544, 23, 0, -1900543, 21, 0, -1900542, 21, 1, -1900541, 21, 1, -1900540, 21, 1, -1900539, 21, 1, -1900538, 21, 1, -1900537, 21, 1, -1900536, 21, 1, -1900535, 21, 0, -1900534, 23, 0, -1900533, 21, 0, -1900532, 21, 1, -1900531, 30, 0, -1900530, 21, 2, -1835008, 21, 0, -1835007, 21, 0, -1835006, 21, 65537, -1835005, 21, 65537, -1835004, 21, 65537, -1835003, 21, 65537, -1835002, 21, 65537, -1835001, 21, 65537, -1835000, 21, 65537, -1834999, 21, 65537, -1834998, 21, 65537, -1834997, 21, 65537, -1834996, 21, 65537, -1834995, 21, 65537, -1834994, 21, 65538, -1769472, 21, 65536, -1769471, 21, 65537, -1769470, 21, 65537, -1769469, 21, 65537, -1769468, 21, 65537, -1769467, 21, 65537, -1769466, 21, 65537, -1769465, 21, 65537, -1769464, 21, 65537, -1769463, 21, 65537, -1769462, 21, 65537, -1769461, 21, 65537, -1769460, 21, 65537, -1769459, 21, 65537, -1769458, 21, 65538, -1703936, 21, 65536, -1703935, 21, 65537, -1703934, 21, 65537, -1703933, 21, 65537, -1703932, 21, 65537, -1703931, 21, 65537, -1703930, 21, 65537, -1703929, 21, 65537, -1703928, 21, 65537, -1703927, 21, 65537, -1703926, 21, 65537, -1703925, 21, 65537, -1703924, 21, 65537, -1703923, 21, 65537, -1703922, 21, 65538, -1638400, 21, 65536, -1638399, 21, 65537, -1638398, 21, 65537, -1638397, 21, 65537, -1638396, 21, 65537, -1638395, 21, 65537, -1638394, 21, 65537, -1638393, 21, 65537, -1638392, 21, 65537, -1638391, 21, 65537, -1638390, 21, 65537, -1638389, 21, 65537, -1638388, 21, 65537, -1638387, 21, 65537, -1638386, 21, 65538, -1572864, 21, 65536, -1572863, 21, 65537, -1572862, 21, 65537, -1572861, 21, 65537, -1572860, 21, 65537, -1572859, 21, 65537, -1572858, 21, 65537, -1572857, 21, 65537, -1572856, 21, 65537, -1572855, 21, 65537, -1572854, 21, 65537, -1572853, 21, 65537, -1572852, 21, 65537, -1572851, 21, 65537, -1572850, 21, 65538, -1507328, 21, 65536, -1507327, 21, 65537, -1507326, 21, 65537, -1507325, 21, 65537, -1507324, 21, 65537, -1507323, 21, 65537, -1507322, 21, 65537, -1507321, 21, 65537, -1507320, 21, 65537, -1507319, 21, 65537, -1507318, 21, 65537, -1507317, 21, 65537, -1507316, 21, 65537, -1507315, 21, 65537, -1507314, 21, 65538, -1441792, 21, 65536, -1441791, 21, 65537, -1441790, 21, 65537, -1441789, 21, 65537, -1441788, 21, 65537, -1441787, 21, 65537, -1441786, 21, 65537, -1441785, 21, 65537, -1441784, 21, 65537, -1441783, 21, 65537, -1441782, 21, 65537, -1441781, 21, 65537, -1441780, 21, 65537, -1441779, 21, 65537, -1441778, 21, 65538, -1376256, 21, 65536, -1376255, 21, 65537, -1376254, 21, 65537, -1376253, 21, 65537, -1376252, 21, 65537, -1376251, 21, 65537, -1376250, 21, 65537, -1376249, 21, 65537, -1376248, 21, 65537, -1376247, 21, 65537, -1376246, 21, 65537, -1376245, 21, 65537, -1376244, 21, 65537, -1376243, 21, 65537, -1376242, 21, 65538, -1310720, 21, 65536, -1310719, 21, 65537, -1310718, 21, 65537, -1310717, 21, 65537, -1310716, 21, 65537, -1310715, 21, 65537, -1310714, 21, 65537, -1310713, 21, 65537, -1310712, 21, 65537, -1310711, 21, 65537, -1310710, 21, 65537, -1310709, 21, 65537, -1310708, 21, 65537, -1310707, 21, 65537, -1310706, 21, 65538, -1245184, 21, 65536, -1245183, 21, 65537, -1245182, 21, 65537, -1245181, 21, 65537, -1245180, 21, 65537, -1245179, 21, 65537, -1245178, 21, 65537, -1245177, 21, 65537, -1245176, 21, 65537, -1245175, 21, 65537, -1245174, 21, 65537, -1245173, 21, 65537, -1245172, 21, 65537, -1245171, 21, 65537, -1245170, 21, 65538, -1179648, 21, 65536, -1179647, 21, 65537, -1179646, 21, 65537, -1179645, 21, 65537, -1179644, 21, 65537, -1179643, 21, 65537, -1179642, 21, 65537, -1179641, 21, 65537, -1179640, 21, 65537, -1179639, 21, 65537, -1179638, 21, 65537, -1179637, 21, 65537, -1179636, 21, 65537, -1179635, 21, 65537, -1179634, 21, 65538, -1114112, 21, 65536, -1114111, 21, 65537, -1114110, 21, 65537, -1114109, 21, 65537, -1114108, 21, 65537, -1114107, 21, 65537, -1114106, 21, 65537, -1114105, 21, 65537, -1114104, 21, 65537, -1114103, 21, 65537, -1114102, 21, 65537, -1114101, 21, 65537, -1114100, 21, 65537, -1114099, 21, 65537, -1114098, 21, 65538, -1048576, 21, 65536, -1048575, 21, 65537, -1048574, 21, 65537, -1048573, 21, 65537, -1048572, 21, 65537, -1048571, 21, 65537, -1048570, 21, 65537, -1048569, 21, 65537, -1048568, 21, 65537, -1048567, 21, 65537, -1048566, 21, 65537, -1048565, 21, 65537, -1048564, 21, 65537, -1048563, 21, 65537, -1048562, 21, 65538, -983040, 21, 65536, -983039, 21, 65537, -983038, 21, 65537, -983037, 21, 65537, -983036, 21, 65537, -983035, 21, 65537, -983034, 21, 65537, -983033, 21, 65537, -983032, 21, 65537, -983031, 21, 65537, -983030, 21, 65537, -983029, 21, 65537, -983028, 21, 65537, -983027, 21, 65537, -983026, 21, 65538, -917504, 21, 65536, -917503, 21, 65537, -917502, 21, 65537, -917501, 21, 65537, -917500, 21, 65537, -917499, 21, 65537, -917498, 21, 65537, -917497, 21, 65537, -917496, 21, 65537, -917495, 21, 65537, -917494, 21, 65537, -917493, 21, 65537, -917492, 21, 65537, -917491, 21, 65537, -917490, 21, 65538, -851968, 21, 65536, -851967, 21, 65537, -851966, 21, 65537, -851965, 21, 65537, -851964, 21, 65537, -851963, 21, 65537, -851962, 21, 65537, -851961, 21, 65537, -851960, 21, 65537, -851959, 21, 65537, -851958, 21, 65537, -851957, 21, 65537, -851956, 21, 65537, -851955, 21, 65537, -851954, 21, 65538, -786432, 21, 65536, -786431, 21, 65537, -786430, 21, 65537, -786429, 21, 65537, -786428, 21, 65537, -786427, 21, 65537, -786426, 21, 65537, -786425, 21, 65537, -786424, 21, 65537, -786423, 21, 65537, -786422, 21, 65537, -786421, 21, 65537, -786420, 21, 65537, -786419, 21, 65537, -786418, 21, 65538, -720896, 21, 65536, -720895, 21, 65537, -720894, 21, 65537, -720893, 21, 65537, -720892, 21, 65537, -720891, 21, 65537, -720890, 21, 65537, -720889, 21, 65537, -720888, 21, 65537, -720887, 21, 65537, -720886, 21, 65537, -720885, 21, 65537, -720884, 21, 65537, -720883, 21, 65537, -720882, 21, 65538, -655360, 21, 65536, -655359, 21, 65537, -655358, 21, 65537, -655357, 21, 65537, -655356, 21, 65537, -655355, 21, 65537, -655354, 21, 65537, -655353, 21, 65537, -655352, 21, 65537, -655351, 21, 65537, -655350, 21, 65537, -655349, 21, 65537, -655348, 21, 65537, -655347, 21, 65537, -655346, 21, 65538, -589824, 21, 65536, -589823, 21, 65537, -589822, 21, 65537, -589821, 21, 65537, -589820, 21, 65537, -589819, 21, 65537, -589818, 21, 65537, -589817, 21, 65537, -589816, 21, 65537, -589815, 21, 65537, -589814, 21, 65537, -589813, 21, 65537, -589812, 21, 65537, -589811, 21, 65537, -589810, 21, 65538, -524288, 21, 65536, -524287, 21, 65537, -524286, 21, 65537, -524285, 21, 65537, -524284, 21, 65537, -524283, 21, 65537, -524282, 21, 65537, -524281, 21, 65537, -524280, 21, 65537, -524279, 21, 65537, -524278, 21, 65537, -524277, 21, 65537, -524276, 21, 65537, -524275, 21, 65537, -524274, 21, 65538, -458752, 21, 65536, -458751, 21, 65537, -458750, 21, 65537, -458749, 21, 65537, -458748, 21, 65537, -458747, 21, 65537, -458746, 21, 65537, -458745, 21, 65537, -458744, 21, 65537, -458743, 21, 65537, -458742, 21, 65537, -458741, 21, 65537, -458740, 21, 65537, -458739, 21, 65537, -458738, 21, 65538, -393216, 21, 65536, -393215, 21, 65537, -393214, 21, 65537, -393213, 21, 65537, -393212, 21, 65537, -393211, 21, 65537, -393210, 21, 65537, -393209, 21, 65537, -393208, 21, 65537, -393207, 21, 65537, -393206, 21, 65537, -393205, 21, 65537, -393204, 21, 65537, -393203, 21, 65537, -393202, 21, 65538, -327680, 21, 65536, -327679, 21, 65537, -327678, 21, 65537, -327677, 21, 65537, -327676, 21, 65537, -327675, 21, 65537, -327674, 21, 65537, -327673, 21, 65537, -327672, 21, 65537, -327671, 21, 65537, -327670, 21, 65537, -327669, 21, 65537, -327668, 21, 65537, -327667, 21, 65537, -327666, 21, 65538, -262144, 21, 65536, -262143, 21, 65537, -262142, 21, 65537, -262141, 21, 65537, -262140, 21, 65537, -262139, 21, 65537, -262138, 21, 65537, -262137, 21, 65537, -262136, 21, 65537, -262135, 21, 65537, -262134, 21, 65537, -262133, 21, 65537, -262132, 21, 65537, -262131, 21, 65537, -262130, 21, 65538, -196608, 21, 65536, -196607, 21, 65537, -196606, 21, 65537, -196605, 21, 65537, -196604, 21, 65537, -196603, 21, 65537, -196602, 21, 65537, -196601, 21, 65537, -196600, 21, 65537, -196599, 21, 65537, -196598, 21, 65537, -196597, 21, 65537, -196596, 21, 65537, -196595, 21, 65537, -196594, 21, 65538, -131072, 21, 65536, -131071, 21, 65537, -131070, 21, 65537, -131069, 21, 65537, -131068, 21, 65537, -131067, 21, 65537, -131066, 21, 65537, -131065, 21, 65537, -131064, 21, 65537, -131063, 21, 65537, -131062, 21, 65537, -131061, 21, 65537, -131060, 21, 65537, -131059, 21, 65537, -131058, 21, 65538, -65536, 21, 131072, -65535, 21, 131073, -65534, 21, 131073, -65533, 21, 131073, -65532, 21, 131073, -65531, 21, 131073, -65530, 21, 131073, -65529, 21, 131073, -65528, 21, 131073, -65527, 21, 131073, -65526, 21, 131073, -65525, 21, 131073, -65524, 21, 131073, -65523, 21, 131073, -65522, 21, 131074, 131071, 23, 0, 65537, 23, 0, 65538, 22, 0, 65539, 24, 0, 65543, 23, 0, 65544, 30, 0, 65547, 23, 0, 65548, 22, 0, 65549, 22, 0, 65550, 22, 0, 65551, 30, 0, 2162687, 23, 0, 2097152, 22, 0, 2097153, 22, 0, 2097154, 22, 0, 2097155, 22, 0, 2097156, 22, 0, 2097157, 22, 0, 2097158, 22, 0, 2097159, 22, 0, 2097160, 22, 0, 2097161, 22, 0, 2097162, 22, 0, 2097163, 22, 0, 2097164, 22, 0, 2097165, 22, 0, 2097166, 22, 0, 2097167, 30, 0 ) -[node name="Ice" type="TileMap" parent="Upper Cliffs" groups=[ +[node name="Ice" type="TileMap" parent="Cliffs" groups=[ "Cliffs", "Ice", "Winter", ]] visible = false -position = Vector2( 0, -128 ) scale = Vector2( 8, 8 ) tile_set = ExtResource( 3 ) cell_size = Vector2( 16, 16 ) @@ -1830,9 +1848,9 @@ cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) collision_layer = 2 collision_mask = 13 format = 1 -tile_data = PoolIntArray( -1900543, 31, 0, -1900541, 31, 0, -1900540, 31, 2, -1900538, 31, 0, -1900536, 31, 0, -1900535, 31, 0, -1900531, 31, 0, -1900530, 34, 0, -1835007, 31, 0, -1835006, 31, 0, -1835005, 31, 131072, -1835004, 31, 131074, -1835003, 31, 0, -1835002, 31, 0, -1835001, 31, 1, -1835000, 31, 2, -1834995, 31, 0, -1834994, 34, 0, -1769470, 31, 0, -1769466, 31, 131072, -1769465, 31, 131073, -1769464, 31, 131074, -1769463, 31, 0, -1769462, 31, 0, -1769460, 31, 0, -1769458, 34, 0, -1703931, 31, 0, -1703930, 31, 0, -1703926, 31, 0, -1703924, 31, 0, -1638386, 34, 0, -1572862, 31, 0, -1572861, 31, 0, -1572852, 31, 0, -1572850, 34, 0, -1507326, 31, 0, -1507324, 31, 0, -1507323, 31, 1, -1507322, 31, 2, -1507318, 31, 0, -1507316, 31, 0, -1507314, 34, 0, -1441790, 31, 0, -1441789, 31, 0, -1441788, 31, 131072, -1441787, 31, 131073, -1441786, 31, 0, -1441785, 31, 2, -1441784, 31, 0, -1441783, 31, 0, -1441778, 34, 0, -1376253, 31, 0, -1376250, 31, 131072, -1376249, 31, 131074, -1376242, 34, 0, -1310720, 32, 0, -1310712, 31, 0, -1310710, 31, 0, -1245184, 32, 0, -1245174, 31, 0, -1245173, 31, 2, -1245172, 31, 0, -1179648, 31, 0, -1179638, 31, 131072, -1179637, 31, 131074, -1114109, 31, 0, -1114108, 31, 1, -1114107, 31, 2, -1114102, 31, 0, -1048573, 31, 65536, -1048572, 31, 65537, -1048571, 31, 65538, -1048570, 31, 0, -1048566, 31, 0, -983037, 31, 131072, -983036, 31, 0, -983035, 31, 65538, -917500, 31, 131072, -917499, 31, 131074, -851963, 31, 0, -851959, 31, 0, -851958, 31, 0, -720895, 31, 0, -720886, 33, 0, -655358, 31, 0, -655357, 31, 2, -589824, 31, 0, -589823, 31, 1, -589822, 31, 0, -589821, 31, 131074, -589819, 31, 0, -524288, 31, 131072, -524287, 31, 131073, -524286, 31, 131074, -524284, 31, 0, -524283, 31, 0, -524282, 31, 2, -458747, 31, 131072, -458746, 31, 131074, -458742, 33, 0, -327670, 31, 0, -262134, 31, 0, -262130, 34, 0, -131063, 31, 0, -131062, 31, 2, -131059, 31, 0, -65527, 31, 65536, -65526, 31, 65538, -65523, 31, 0, 7, 31, 0, 8, 31, 0, 9, 31, 131072, 10, 31, 131074 ) +tile_data = PoolIntArray( -1966079, 31, 0, -1966077, 31, 0, -1966076, 31, 2, -1966074, 31, 0, -1966072, 31, 0, -1966071, 31, 0, -1966067, 31, 0, -1966066, 31, 2, -1900543, 31, 0, -1900542, 31, 0, -1900541, 31, 131072, -1900540, 31, 131074, -1900539, 31, 0, -1900538, 31, 0, -1900537, 31, 1, -1900536, 31, 2, -1900531, 31, 131072, -1900530, 31, 131074, -1835006, 31, 0, -1835002, 31, 131072, -1835001, 31, 131073, -1835000, 31, 131074, -1834999, 31, 0, -1834998, 31, 0, -1834996, 31, 0, -1834994, 34, 0, -1769467, 31, 0, -1769466, 31, 0, -1769462, 31, 0, -1769460, 31, 0, -1703922, 34, 0, -1638398, 31, 0, -1638397, 31, 0, -1638388, 31, 0, -1638386, 34, 0, -1572862, 31, 0, -1572860, 31, 0, -1572859, 31, 1, -1572858, 31, 2, -1572854, 31, 0, -1572852, 31, 0, -1572850, 34, 0, -1507326, 31, 0, -1507325, 31, 0, -1507324, 31, 131072, -1507323, 31, 131073, -1507322, 31, 0, -1507321, 31, 2, -1507320, 31, 0, -1507319, 31, 0, -1507314, 34, 0, -1441789, 31, 0, -1441786, 31, 131072, -1441785, 31, 131074, -1441778, 34, 0, -1376256, 31, 0, -1376248, 31, 0, -1376246, 31, 0, -1310720, 31, 0, -1310710, 31, 0, -1310709, 31, 2, -1310708, 31, 0, -1245184, 31, 0, -1245174, 31, 131072, -1245173, 31, 131074, -1179645, 31, 0, -1179644, 31, 1, -1179643, 31, 2, -1179638, 31, 0, -1114109, 31, 65536, -1114108, 31, 65537, -1114107, 31, 65538, -1114106, 31, 0, -1114102, 31, 0, -1048573, 31, 131072, -1048572, 31, 0, -1048571, 31, 65538, -983036, 31, 131072, -983035, 31, 131074, -917499, 31, 0, -917495, 31, 0, -917494, 31, 0, -786431, 31, 0, -786422, 33, 0, -720894, 31, 0, -720893, 31, 2, -655360, 31, 0, -655359, 31, 1, -655358, 31, 0, -655357, 31, 131074, -655355, 31, 0, -589824, 31, 131072, -589823, 31, 131073, -589822, 31, 131074, -589820, 31, 0, -589819, 31, 0, -589818, 31, 2, -524283, 31, 131072, -524282, 31, 131074, -524278, 33, 0, -393206, 31, 0, -327670, 31, 0, -327666, 34, 0, -196599, 31, 0, -196598, 31, 2, -196595, 31, 0, -131063, 31, 65536, -131062, 31, 65538, -131059, 31, 0, -65529, 31, 0, -65528, 31, 0, -65527, 31, 131072, -65526, 31, 131074, 131071, 31, 0, 65538, 31, 0, 65540, 31, 0, 65541, 31, 1, 65542, 31, 1, 65543, 31, 1, 65544, 31, 2, 65546, 31, 0, 65547, 31, 0, 65548, 31, 0, 65549, 31, 0, 65550, 31, 0, 65551, 34, 0, 131072, 31, 0, 131076, 31, 131072, 131077, 31, 131073, 131078, 31, 131073, 131079, 31, 131073, 131080, 31, 131074, 131083, 31, 0, 131085, 31, 0, 196608, 31, 0, 196609, 31, 2, 196617, 31, 0, 196620, 31, 0, 196622, 34, 0, 262144, 31, 131072, 262145, 31, 131074, 262152, 31, 0, 262153, 31, 2, 327680, 31, 0, 327685, 31, 0, 327688, 31, 131072, 327689, 31, 0, 327690, 31, 2, 393218, 31, 0, 393225, 31, 65536, 393226, 31, 65538, 458753, 31, 0, 458756, 31, 0, 458757, 31, 2, 458761, 31, 131072, 458762, 31, 131074, 524292, 31, 131072, 524293, 31, 131074, 524296, 31, 0, 524297, 31, 2, 524301, 31, 0, 524302, 31, 2, 589824, 31, 0, 589832, 31, 131072, 589833, 31, 131074, 589837, 31, 65536, 589838, 31, 65538, 655360, 31, 0, 655361, 31, 0, 655362, 31, 2, 655373, 31, 65536, 655374, 31, 65538, 720897, 31, 131072, 720898, 31, 131074, 720909, 31, 131072, 720910, 31, 131074, 786436, 31, 0, 786437, 31, 1, 786438, 31, 2, 786444, 31, 0, 786445, 31, 2, 851972, 31, 65536, 851973, 31, 65537, 851974, 31, 0, 851975, 31, 2, 851976, 31, 0, 851977, 31, 0, 851980, 31, 131072, 851981, 31, 0, 851982, 31, 2, 917507, 31, 0, 917508, 31, 0, 917509, 31, 131073, 917510, 31, 131073, 917511, 31, 131074, 917513, 31, 0, 917514, 31, 2, 917517, 31, 131072, 917518, 31, 131074, 983042, 31, 0, 983043, 31, 131072, 983044, 31, 131074, 983048, 31, 0, 983049, 31, 0, 983050, 31, 131074, 983053, 31, 0, 1048579, 31, 0, 1048584, 31, 65536, 1048585, 31, 65538, 1048589, 31, 0, 1114120, 31, 131072, 1114121, 31, 131074, 1376266, 31, 0, 1376270, 31, 0, 1441797, 31, 0, 1441805, 31, 0, 1441806, 31, 2, 1507341, 31, 131072, 1507342, 31, 131074, 1572866, 31, 0, 1638411, 31, 0, 1703947, 31, 0, 2162687, 31, 0, 2097152, 33, 0, 2097153, 34, 0, 2097163, 31, 0, 2162690, 31, 0, 2162702, 34, 0 ) -[node name="Snow" type="TileMap" parent="Upper Cliffs" groups=[ +[node name="Snow" type="TileMap" parent="Cliffs" groups=[ "Cliffs", "Winter", ]] @@ -1843,70 +1861,66 @@ cell_size = Vector2( 16, 16 ) cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) collision_use_parent = true format = 1 -tile_data = PoolIntArray( -1966079, 27, 0, -1966078, 28, 0, -1966077, 28, 0, -1966076, 28, 0, -1966075, 28, 0, -1966074, 28, 0, -1966073, 28, 0, -1966072, 28, 0, -1966071, 28, 0, -1966070, 29, 0, -1966067, 27, 0, -1966066, 29, 0, -1900544, 27, 0, -1900543, 28, 0, -1900534, 27, 0, -1900531, 29, 0, 131072, 2, 0, 131073, 0, 0, 131074, 0, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, 0, 131080, 0, 0, 131081, 0, 0, 131082, 0, 0, 131083, 0, 0, 131084, 0, 0, 131085, 0, 0, 131086, 1, 0 ) +tile_data = PoolIntArray( -1966079, 27, 0, -1966078, 28, 0, -1966077, 28, 0, -1966076, 28, 0, -1966075, 28, 0, -1966074, 28, 0, -1966073, 28, 0, -1966072, 28, 0, -1966071, 28, 0, -1966070, 29, 0, -1966067, 27, 0, -1966066, 29, 0, -1900544, 27, 0, -1900543, 28, 0, -1900534, 27, 0, -1900531, 29, 0, 131071, 27, 0, 65536, 28, 0, 65537, 28, 0, 65538, 28, 0, 65539, 28, 0, 65540, 28, 0, 65541, 28, 0, 65542, 28, 0, 65543, 28, 0, 65544, 28, 0, 65545, 28, 0, 65546, 28, 0, 65547, 28, 0, 65548, 28, 0, 65549, 28, 0, 65550, 28, 0, 65551, 29, 0, 131072, 2, 0, 131073, 0, 0, 131074, 0, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, 0, 131080, 0, 0, 131081, 0, 0, 131082, 0, 0, 131083, 0, 0, 131084, 0, 0, 131085, 0, 0, 131086, 1, 0, 2162687, 27, 0, 2097152, 28, 0, 2097153, 28, 0, 2097154, 28, 0, 2097155, 28, 0, 2097156, 28, 0, 2097157, 28, 0, 2097158, 28, 0, 2097159, 28, 0, 2097160, 28, 0, 2097161, 28, 0, 2097162, 28, 0, 2097163, 28, 0, 2097164, 28, 0, 2097165, 28, 0, 2097166, 28, 0, 2097167, 29, 0 ) -[node name="Flowers" type="TileMap" parent="Upper Cliffs" groups=[ +[node name="Flowers" type="TileMap" parent="Cliffs" groups=[ "Cliffs", "Foliage", "Perchable", "Summer", ]] -position = Vector2( -112, -56 ) scale = Vector2( 8, 8 ) z_index = 1 tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) +cell_size = Vector2( 1, 1 ) cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) collision_layer = 32 collision_mask = 4 format = 1 -tile_data = PoolIntArray( -1966078, 38, 0, -1966069, 37, 0, -1966066, 36, 0, -1966065, 37, 0, -1900543, 37, 0, 3, 36, 0 ) +tile_data = PoolIntArray( -31916014, 38, 0, -31915870, 37, 0, -31915822, 36, 0, -31915806, 37, 0, -30867454, 37, 0, -458718, 36, 0, 32047154, 38, 0, 32047218, 38, 0, 32047234, 36, 0, 32047298, 38, 0, 32047314, 36, 0, 32047330, 37, 0, 33095682, 38, 0, 33095746, 36, 0, 33095762, 38, 0, 33095906, 38, 0 ) -[node name="Signs" type="TileMap" parent="Upper Cliffs" groups=[ +[node name="Signs" type="TileMap" parent="Cliffs" groups=[ "Cliffs", "Dropdownable", "Perchable", -"Walls", ]] -position = Vector2( 368, 24 ) scale = Vector2( 8, 8 ) tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) +cell_size = Vector2( 1, 1 ) cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) collision_layer = 2 collision_mask = 29 format = 1 -tile_data = PoolIntArray( -2031606, 42, 0 ) +tile_data = PoolIntArray( -32309037, 42, 0, -589816, 45, 0, -458531, 42, 0, 31916056, 46, 0, 32047288, 42, 0 ) -[node name="Signs Winter Layer" type="TileMap" parent="Upper Cliffs" groups=[ +[node name="Signs Winter Layer" type="TileMap" parent="Cliffs" groups=[ "Cliffs", "Winter", ]] visible = false -position = Vector2( 368, 24 ) scale = Vector2( 8, 8 ) z_index = 1 tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) +cell_size = Vector2( 1, 1 ) cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) collision_use_parent = true format = 1 -tile_data = PoolIntArray( -2031606, 47, 0, 131072, 2, 0, 131073, 0, 0, 131074, 0, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, 0, 131080, 0, 0, 131081, 0, 0, 131082, 0, 0, 131083, 0, 0, 131084, 0, 0, 131085, 0, 0, 131086, 1, 0 ) +tile_data = PoolIntArray( -32309037, 47, 0, -589816, 48, 0, -458531, 47, 0, 131072, 2, 0, 131073, 0, 0, 131074, 0, 0, 131075, 0, 0, 131076, 0, 0, 131077, 0, 0, 131078, 0, 0, 131079, 0, 0, 131080, 0, 0, 131081, 0, 0, 131082, 0, 0, 131083, 0, 0, 131084, 0, 0, 131085, 0, 0, 131086, 1, 0, 31916056, 49, 0, 32047288, 47, 0 ) -[node name="(10,-31)" type="Sprite" parent="Upper Cliffs" groups=[ +[node name="Readable Sign (211, -493)" type="Sprite" parent="Cliffs" groups=[ "Cliffs", ]] visible = false -position = Vector2( 1728, -3904 ) +position = Vector2( 1752, -3904 ) scale = Vector2( 0.8, 1.2 ) z_index = 4 texture = ExtResource( 15 ) -[node name="Sign Font" type="TileMap" parent="Upper Cliffs/(10,-31)"] +[node name="Text" type="TileMap" parent="Cliffs/Readable Sign (211, -493)"] position = Vector2( -2145, 3500 ) scale = Vector2( 1.25027, 0.892843 ) z_index = 4 -tile_set = SubResource( 83 ) +tile_set = SubResource( 81 ) cell_size = Vector2( 1, 1 ) cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) collision_layer = 0 @@ -1914,205 +1928,300 @@ collision_mask = 0 format = 1 tile_data = PoolIntArray( -258275705, 19, 0, -258275696, 7, 0, -258275686, 4, 0, -258275670, 2, 0, -258275662, 11, 0, -258275654, 8, 0, -258275646, 5, 0, -258275637, 5, 0, -258275628, 18, 0, -256833905, 14, 0, -256833895, 5, 0, -256833878, 0, 0, -256833869, 10, 0, -256833860, 0, 0, -256833851, 8, 0, -256833843, 0, 0 ) -[node name="Extents 1" type="CollisionShape2D" parent="Upper Cliffs" groups=[ +[node name="Readable Sign (8, -9)" type="Sprite" parent="Cliffs" groups=[ +"Cliffs", +]] +visible = false +position = Vector2( 120, -28 ) +scale = Vector2( 0.8, 1.2 ) +z_index = 4 +texture = ExtResource( 14 ) + +[node name="Text" type="TileMap" parent="Cliffs/Readable Sign (8, -9)"] +position = Vector2( -5, 0 ) +tile_set = SubResource( 81 ) +cell_size = Vector2( 1, 1 ) +cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) +collision_layer = 0 +collision_mask = 0 +format = 1 +tile_data = PoolIntArray( -64618078, 19, 0, -524330, 0, 0, -458804, 18, 0, -458785, 2, 0, -458777, 17, 0, -458767, 4, 0, -458757, 3, 0, -524274, 5, 0, -524265, 0, 0, -524256, 11, 0, -524248, 11, 0, -524240, 18, 0 ) + +[node name="Readable Sign (221, -7)" type="Sprite" parent="Cliffs" groups=[ +"Cliffs", +]] +visible = false +position = Vector2( 1832, -16 ) +scale = Vector2( 0.8, 1.2 ) +z_index = 4 +texture = ExtResource( 15 ) + +[node name="Text" type="TileMap" parent="Cliffs/Readable Sign (221, -7)"] +position = Vector2( 4, -4 ) +tile_set = SubResource( 81 ) +cell_size = Vector2( 1, 1 ) +cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) +collision_layer = 0 +collision_mask = 0 +format = 1 +tile_data = PoolIntArray( -544075464, 2, 0, -544075456, 11, 0, -544075448, 8, 0, -544075439, 12, 0, -544075428, 1, 0, -64618078, 19, 0, -17301410, -1610612729, 0, -17301409, -1610612729, 0, -17235873, -1610612729, 0, -17170336, -1610612729, 0, -17170335, -1610612729, 0, -17104799, -1610612729, 0, -17039263, -1610612729, 0, -16973726, -1610612729, 0, -16973725, -1610612729, 0, -16908188, -1610612729, 0, -16842652, -1610612729, 0, -16842651, -1610612729, 0, -16777114, -1610612729, 0, -16711577, -1610612729, 0, -16646040, -1610612729, 0, -16646039, -1610612729, 0, -16580502, -1610612729, 0, -16514966, -1610612729, 0, -16449429, -1610612729, 0, -16383892, -1610612729, 0, -16383891, -1610612729, 0, -16383890, 7, 0, -16318355, -1610612729, 0, -16252818, -1610612729, 0, -16187281, -1610612729, 0, -16121744, -1610612729, 0, -16121743, -1610612729, 0, -16056206, -1610612729, 0, -15990669, -1610612729, 0, -15925132, -1610612729, 0, -15859595, -1610612729, 0, -15794058, -1610612729, 0, -15794057, -1610612729, 0, -15728520, -1610612729, 0, -15662984, -1610612729, 0, -15662983, -1610612729, 0, -15597446, -1610612729, 0, -15531909, -1610612729, 0, -15466372, -1610612729, 0, -14811005, -1610612729, 0, -1179647, 13, 0, -1179636, 14, 0, 196584, 2, 0, 196592, 11, 0, 196600, 8, 0, 131073, 12, 0, 131083, 1, 0, 131093, 8, 0, 131101, 13, 0, 131111, 6, 0 ) + +[node name="GOE Seal" type="Sprite" parent="Cliffs/Readable Sign (221, -7)"] +position = Vector2( -40, 0 ) +texture = ExtResource( 13 ) + +[node name="Readable Sign (24, 487)" type="Sprite" parent="Cliffs" groups=[ +"Cliffs", +]] +visible = false +position = Vector2( 264, 3940 ) +scale = Vector2( 0.8, 1.2 ) +z_index = 4 +texture = ExtResource( 17 ) + +[node name="Text" type="TileMap" parent="Cliffs/Readable Sign (24, 487)"] +position = Vector2( -10, -3.22583 ) +scale = Vector2( 1.2, 1.2 ) +tile_set = SubResource( 81 ) +cell_size = Vector2( 1, 1 ) +cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) +collision_layer = 0 +collision_mask = 0 +format = 1 +tile_data = PoolIntArray( -544075464, 2, 0, -544075456, 11, 0, -544075448, 8, 0, -544075439, 12, 0, -544075428, 1, 0, -524327, 0, 0, -524318, 10, 0, -524309, 0, 0, -524300, 8, 0, -524292, 0, 0, -589814, 2, 0, -589806, 8, 0, -589797, 19, 0, -589788, 24, 0 ) + +[node name="Text 2" type="TileMap" parent="Cliffs/Readable Sign (24, 487)"] +position = Vector2( -10, 6.45215 ) +scale = Vector2( 0.5, 0.4 ) +tile_set = SubResource( 81 ) +cell_size = Vector2( 1, 1 ) +cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) +collision_layer = 0 +collision_mask = 0 +format = 1 +tile_data = PoolIntArray( -544075464, 2, 0, -544075456, 11, 0, -544075448, 8, 0, -544075439, 12, 0, -544075428, 1, 0, 655311, 44, 0, 655320, 30, 0, 655340, 5, 0, 655350, 20, 0, 589824, 17, 0, 589834, 11, 0, 589843, 14, 0, 589853, 13, 0, 589863, 6, 0, 589873, 18, 0, 589883, 45, 0 ) + +[node name="Readable Sign (184, 489)" type="Sprite" parent="Cliffs" groups=[ +"Cliffs", +]] +visible = false +position = Vector2( 1536, 3952 ) +scale = Vector2( 0.8, 1.2 ) +z_index = 4 +texture = ExtResource( 15 ) + +[node name="Extents 1" type="CollisionShape2D" parent="Cliffs" groups=[ "Cliffs", ]] visible = false position = Vector2( 960, -1816 ) -shape = SubResource( 84 ) +shape = SubResource( 82 ) -[node name="Extents 2" type="CollisionShape2D" parent="Upper Cliffs" groups=[ +[node name="Extents 2" type="CollisionShape2D" parent="Cliffs" groups=[ "Cliffs", ]] visible = false position = Vector2( 768, -3776 ) -shape = SubResource( 85 ) +shape = SubResource( 83 ) -[node name="Extents 3" type="CollisionShape2D" parent="Upper Cliffs" groups=[ +[node name="Extents 3" type="CollisionShape2D" parent="Cliffs" groups=[ "Cliffs", ]] visible = false position = Vector2( 1792, -3776 ) +shape = SubResource( 84 ) + +[node name="Extents 4" type="CollisionShape2D" parent="Cliffs" groups=[ +"Cliffs", +]] +visible = false +position = Vector2( 960, 2068 ) +shape = SubResource( 85 ) + +[node name="Extents 5" type="CollisionShape2D" parent="Cliffs" groups=[ +"Cliffs", +]] +visible = false +position = Vector2( 960, 4204 ) shape = SubResource( 86 ) -[node name="Waterfall" type="Area2D" parent="Upper Cliffs"] +[node name="Waterfall" type="Area2D" parent="Cliffs"] +visible = false +position = Vector2( 1532, -3544 ) z_index = 1 collision_layer = 34 collision_mask = 5 -[node name="StaticBody2D" type="StaticBody2D" parent="Upper Cliffs/Waterfall" groups=[ +[node name="Frozen Ground" type="StaticBody2D" parent="Cliffs/Waterfall" groups=[ "Dropdownable", "Ground", "Winter", ]] -position = Vector2( 1524, -3544 ) +visible = false +position = Vector2( 0, -212 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Waterfall/StaticBody2D" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Waterfall/Frozen Ground" groups=[ "Dropdownable", "Ground", "Winter", ]] -position = Vector2( 8, -212 ) shape = SubResource( 87 ) -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -1840 ) +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Waterfall"] +visible = false +position = Vector2( 0, 1704 ) shape = SubResource( 88 ) one_way_collision = true -[node name="waterfall 1" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -88 ) -scale = Vector2( 8.16667, 7 ) +[node name="Water 1" type="AnimatedSprite" parent="Cliffs/Waterfall"] +scale = Vector2( 8.16667, 9 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 1"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 1"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = 24.0 +volume_db = 20.437 pitch_scale = 0.6 -max_distance = 1000.0 +max_distance = 100.0 attenuation = 8.28211 -[node name="waterfall 2" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -448 ) +[node name="Water 2" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 0, 408 ) scale = Vector2( 8.16667, 8 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 2"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 2"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = 19.0 +volume_db = -16.0 pitch_scale = 0.6 -max_distance = 1000.0 attenuation = 8.28211 -[node name="waterfall 3" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -832 ) +[node name="Water 3" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 0, 792 ) scale = Vector2( 8.16667, 8 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 3"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 3"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = 14.0 +volume_db = -11.0 pitch_scale = 0.6 -max_distance = 1000.0 +max_distance = 3000.0 attenuation = 8.28211 -[node name="waterfall 4" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -1216 ) +[node name="Water 4" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 0, 1176 ) scale = Vector2( 8.16667, 8 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 4"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 4"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = 9.0 +volume_db = -6.0 pitch_scale = 0.6 -max_distance = 7000.0 +max_distance = 4000.0 attenuation = 8.28211 -[node name="waterfall 5" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -1600 ) +[node name="Water 5" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 0, 1560 ) scale = Vector2( 8.16667, 8 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 5"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 5"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = 4.0 +volume_db = -1.0 pitch_scale = 0.6 -max_distance = 6000.0 +max_distance = 5000.0 attenuation = 8.28211 -[node name="waterfall 6" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -1984 ) +[node name="Water 6" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 0, 1944 ) scale = Vector2( 8.16667, 8 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 6"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 6"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = -1.0 +volume_db = 4.0 pitch_scale = 0.6 -max_distance = 5000.0 +max_distance = 6000.0 attenuation = 8.28211 -[node name="waterfall 7" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -2368 ) +[node name="Water 7" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 0, 2328 ) scale = Vector2( 8.16667, 8 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 7"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 7"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = -6.0 +volume_db = 9.0 pitch_scale = 0.6 -max_distance = 4000.0 +max_distance = 7000.0 attenuation = 8.28211 -[node name="waterfall 8" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -2752 ) +[node name="Water 8" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 0, 2712 ) scale = Vector2( 8.16667, 8 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 8"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 8"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = -11.0 +volume_db = 14.0 pitch_scale = 0.6 -max_distance = 3000.0 +max_distance = 1000.0 attenuation = 8.28211 -[node name="waterfall 9" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -3136 ) +[node name="Water 9" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 0, 3096 ) scale = Vector2( 8.16667, 8 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 9"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 9"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = -16.0 +volume_db = 19.0 pitch_scale = 0.6 +max_distance = 1000.0 attenuation = 8.28211 -[node name="waterfall 10" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -position = Vector2( 1532, -3544 ) -scale = Vector2( 8.16667, 9 ) +[node name="Water 10" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 0, 3456 ) +scale = Vector2( 8.167, 7 ) frames = SubResource( 94 ) -[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Upper Cliffs/Waterfall/waterfall 10"] +[node name="AudioStreamPlayer2D" type="AudioStreamPlayer2D" parent="Cliffs/Waterfall/Water 10"] scale = Vector2( 0.125, 0.125 ) stream = ExtResource( 8 ) -volume_db = 20.437 +volume_db = 24.0 pitch_scale = 0.6 -max_distance = 100.0 +max_distance = 1000.0 attenuation = 8.28211 -[node name="waterfall mist 1" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -visible = false -position = Vector2( 1312, -96 ) +[node name="Mist 1" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( -220, 3488 ) scale = Vector2( 16, 16 ) z_index = 1 frames = SubResource( 100 ) -[node name="waterfall mist 2" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -visible = false -position = Vector2( 1704, -96 ) +[node name="Mist 2" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( -12, 3464 ) scale = Vector2( 16, 16 ) z_index = 1 frames = SubResource( 100 ) -[node name="waterfall mist 3" type="AnimatedSprite" parent="Upper Cliffs/Waterfall"] -visible = false -position = Vector2( 1520, -80 ) +[node name="Mist 3" type="AnimatedSprite" parent="Cliffs/Waterfall"] +position = Vector2( 172, 3488 ) scale = Vector2( 16, 16 ) z_index = 1 frames = SubResource( 100 ) -[node name="Cliff Edge 1" type="Area2D" parent="Upper Cliffs" groups=[ +[node name="Edge 1" type="Area2D" parent="Cliffs" groups=[ "Cliffs", ]] visible = false @@ -2120,12 +2229,12 @@ position = Vector2( 768, -3860 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Cliff Edge 1" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Edge 1" groups=[ "Cliffs", ]] shape = SubResource( 101 ) -[node name="Cliff Edge 2" type="Area2D" parent="Upper Cliffs" groups=[ +[node name="Edge 2" type="Area2D" parent="Cliffs" groups=[ "Cliffs", ]] visible = false @@ -2133,12 +2242,12 @@ position = Vector2( 100, -3732 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Cliff Edge 2" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Edge 2" groups=[ "Cliffs", ]] shape = SubResource( 102 ) -[node name="Cliff Edge 3" type="Area2D" parent="Upper Cliffs" groups=[ +[node name="Edge 3" type="Area2D" parent="Cliffs" groups=[ "Cliffs", ]] visible = false @@ -2146,12 +2255,12 @@ position = Vector2( 1532, -3732 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Cliff Edge 3" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Edge 3" groups=[ "Cliffs", ]] shape = SubResource( 103 ) -[node name="Cliff Edge 4" type="Area2D" parent="Upper Cliffs" groups=[ +[node name="Edge 4" type="Area2D" parent="Cliffs" groups=[ "Cliffs", ]] visible = false @@ -2159,88 +2268,80 @@ position = Vector2( 1792, -3860 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Cliff Edge 4" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Edge 4" groups=[ "Cliffs", ]] shape = SubResource( 104 ) -[node name="Upper Cliffs Top Ground Static Collider 1" type="StaticBody2D" parent="Upper Cliffs" groups=[ +[node name="Edge 5" type="Area2D" parent="Cliffs" groups=[ "Cliffs", -"Dropdownable", -"Ground", ]] visible = false -position = Vector2( 104, -3648 ) +position = Vector2( 960, 100 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 1" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Edge 5" groups=[ "Cliffs", -"Dropdownable", -"Ground", ]] -visible = false shape = SubResource( 105 ) -one_way_collision = true -[node name="Area2D" type="Area2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 1" groups=[ +[node name="Edge 6" type="Area2D" parent="Cliffs" groups=[ "Cliffs", -"Ground", ]] +visible = false +position = Vector2( 1920, 200 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 1/Area2D" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Edge 6" groups=[ "Cliffs", -"Ground", ]] +position = Vector2( -960, 3868 ) shape = SubResource( 106 ) -[node name="Upper Cliffs Top Ground Static Collider 2" type="StaticBody2D" parent="Upper Cliffs" groups=[ +[node name="Ground 1" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", "Dropdownable", "Ground", ]] visible = false -position = Vector2( 764, -3776 ) +position = Vector2( 104, -3648 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 2" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 1" groups=[ "Cliffs", "Dropdownable", "Ground", ]] -position = Vector2( 4, 0 ) shape = SubResource( 107 ) one_way_collision = true -[node name="Area2D" type="Area2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 2" groups=[ +[node name="Area2D" type="Area2D" parent="Cliffs/Ground 1" groups=[ "Cliffs", "Ground", ]] -visible = false collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 2/Area2D" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 1/Area2D" groups=[ "Cliffs", "Ground", ]] -position = Vector2( 4, 0 ) shape = SubResource( 108 ) -[node name="Upper Cliffs Top Ground Static Collider 3" type="StaticBody2D" parent="Upper Cliffs" groups=[ +[node name="Ground 2" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", "Dropdownable", "Ground", ]] visible = false -position = Vector2( 1532, -3648 ) +position = Vector2( 768, -3776 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 3" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 2" groups=[ "Cliffs", "Dropdownable", "Ground", @@ -2248,390 +2349,216 @@ collision_mask = 29 shape = SubResource( 109 ) one_way_collision = true -[node name="Area2D" type="Area2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 3" groups=[ +[node name="Area2D" type="Area2D" parent="Cliffs/Ground 2" groups=[ "Cliffs", "Ground", ]] collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 3/Area2D" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 2/Area2D" groups=[ "Cliffs", "Ground", ]] shape = SubResource( 110 ) -[node name="Upper Cliffs Top Ground Static Collider 4" type="StaticBody2D" parent="Upper Cliffs" groups=[ +[node name="Ground 3" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", "Dropdownable", "Ground", ]] visible = false -position = Vector2( 1788, -3776 ) +position = Vector2( 1532, -3648 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 4" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 3" groups=[ "Cliffs", "Dropdownable", "Ground", ]] -position = Vector2( 4, 0 ) shape = SubResource( 111 ) one_way_collision = true -[node name="Area2D" type="Area2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 4" groups=[ +[node name="Area2D" type="Area2D" parent="Cliffs/Ground 3" groups=[ "Cliffs", "Ground", ]] -visible = false collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Top Ground Static Collider 4/Area2D" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 3/Area2D" groups=[ "Cliffs", "Ground", ]] -position = Vector2( 4, 0 ) shape = SubResource( 112 ) -[node name="Upper Cliffs Top Ground Rock End Cap Static Collider 1" type="StaticBody2D" parent="Upper Cliffs" groups=[ +[node name="Ground 4" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", "Dropdownable", "Ground", -"Walls", ]] visible = false -position = Vector2( 152, -3776 ) +position = Vector2( 1784, -3776 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Upper Cliffs/Upper Cliffs Top Ground Rock End Cap Static Collider 1" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 4" groups=[ "Cliffs", "Dropdownable", "Ground", ]] -polygon = PoolVector2Array( 8, -64, 0, -56, -8, -48, -16, -24, -16, 8, -8, 16, 0, 40, 8, 56, 16, 64 ) +shape = SubResource( 113 ) +one_way_collision = true -[node name="Upper Cliffs Top Ground Rock End Cap Static Collider 2" type="StaticBody2D" parent="Upper Cliffs" groups=[ +[node name="Area2D" type="Area2D" parent="Cliffs/Ground 4" groups=[ "Cliffs", -"Dropdownable", "Ground", -"Walls", ]] -visible = false -position = Vector2( 1380, -3776 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Upper Cliffs/Upper Cliffs Top Ground Rock End Cap Static Collider 2" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 4/Area2D" groups=[ "Cliffs", -"Dropdownable", "Ground", ]] -polygon = PoolVector2Array( -4, -64, 4, -56, 12, -48, 20, -40, 20, 8, 12, 24, 4, 40, -4, 48, -12, 56, -20, 64 ) +shape = SubResource( 114 ) -[node name="Upper Cliffs Top Ground Rock End Cap Static Collider 3" type="StaticBody2D" parent="Upper Cliffs" groups=[ +[node name="Ground 5" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", "Dropdownable", "Ground", -"Walls", ]] visible = false -position = Vector2( 1688, -3776 ) +position = Vector2( 960, 104 ) +z_index = 1 collision_layer = 2 collision_mask = 29 -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Upper Cliffs/Upper Cliffs Top Ground Rock End Cap Static Collider 3" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 5" groups=[ "Cliffs", "Dropdownable", "Ground", ]] -polygon = PoolVector2Array( 8, -64, 0, -56, -8, -48, -16, -24, -16, 8, -8, 16, 0, 40, 8, 56, 16, 64 ) +rotation = 6.28319 +shape = SubResource( 115 ) +one_way_collision = true -[node name="Upper Cliffs Top Ground Rock End Cap Static Collider 4" type="StaticBody2D" parent="Upper Cliffs" groups=[ +[node name="Area2D" type="Area2D" parent="Cliffs/Ground 5" groups=[ "Cliffs", -"Dropdownable", "Ground", -"Walls", ]] -visible = false -position = Vector2( 1892, -3776 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Upper Cliffs/Upper Cliffs Top Ground Rock End Cap Static Collider 4" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 5/Area2D" groups=[ "Cliffs", -"Dropdownable", "Ground", ]] -polygon = PoolVector2Array( 4, -56, 12, -48, 20, -40, 20, 8, 12, 24, 4, 40, -4, 48, -12, 56, -20, 64, -4, -64 ) +shape = SubResource( 116 ) -[node name="Upper Cliffs Bottom Ground Static Collider" type="StaticBody2D" parent="Upper Cliffs" groups=[ +[node name="Ground 6" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", -"Dropdownable", "Ground", ]] visible = false -position = Vector2( 296, 84 ) -z_index = 1 +position = Vector2( 960, 4052 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Bottom Ground Static Collider" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 6" groups=[ "Cliffs", -"Dropdownable", "Ground", ]] -position = Vector2( 664, 20 ) -rotation = 6.28319 -shape = SubResource( 113 ) +position = Vector2( 0, 20 ) +shape = SubResource( 117 ) one_way_collision = true -[node name="Area2D" type="Area2D" parent="Upper Cliffs/Upper Cliffs Bottom Ground Static Collider" groups=[ +[node name="Area2D" type="Area2D" parent="Cliffs/Ground 6" groups=[ "Cliffs", "Ground", ]] -visible = false -position = Vector2( 664, -4 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Upper Cliffs/Upper Cliffs Bottom Ground Static Collider/Area2D" groups=[ +[node name="CollisionShape2D" type="CollisionShape2D" parent="Cliffs/Ground 6/Area2D" groups=[ "Cliffs", "Ground", ]] -position = Vector2( 0, 4 ) -shape = SubResource( 114 ) - -[node name="Lower Cliffs" type="Area2D" parent="." groups=[ -"Cliffs", -]] -z_index = -2 -collision_layer = 2 -collision_mask = 13 -script = ExtResource( 4 ) - -[node name="Rock" type="TileMap" parent="Lower Cliffs" groups=[ -"Cliffs", -]] -position = Vector2( 0, -128 ) -scale = Vector2( 8, 8 ) -tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) -collision_use_parent = true -format = 1 -tile_data = PoolIntArray( 196607, 21, 0, 131072, 21, 1, 131073, 21, 1, 131074, 21, 1, 131075, 21, 1, 131076, 21, 1, 131077, 21, 1, 131078, 21, 1, 131079, 21, 1, 131080, 21, 1, 131081, 21, 1, 131082, 21, 1, 131083, 21, 1, 131084, 21, 1, 131085, 21, 1, 131086, 21, 1, 131087, 21, 2, 262143, 21, 65536, 196608, 21, 65537, 196609, 21, 65537, 196610, 21, 65537, 196611, 21, 65537, 196612, 21, 65537, 196613, 21, 65537, 196614, 21, 65537, 196615, 21, 65537, 196616, 21, 65537, 196617, 21, 65537, 196618, 21, 65537, 196619, 21, 65537, 196620, 21, 65537, 196621, 21, 65537, 196622, 21, 65537, 196623, 21, 65538, 327679, 21, 65536, 262144, 21, 65537, 262145, 21, 65537, 262146, 21, 65537, 262147, 21, 65537, 262148, 21, 65537, 262149, 21, 65537, 262150, 21, 65537, 262151, 21, 65537, 262152, 21, 65537, 262153, 21, 65537, 262154, 21, 65537, 262155, 21, 65537, 262156, 21, 65537, 262157, 21, 65537, 262158, 21, 65537, 262159, 21, 65538, 393215, 21, 65536, 327680, 21, 65537, 327681, 21, 65537, 327682, 21, 65537, 327683, 21, 65537, 327684, 21, 65537, 327685, 21, 65537, 327686, 21, 65537, 327687, 21, 65537, 327688, 21, 65537, 327689, 21, 65537, 327690, 21, 65537, 327691, 21, 65537, 327692, 21, 65537, 327693, 21, 65537, 327694, 21, 65537, 327695, 21, 65538, 458751, 21, 65536, 393216, 21, 65537, 393217, 21, 65537, 393218, 21, 65537, 393219, 21, 65537, 393220, 21, 65537, 393221, 21, 65537, 393222, 21, 65537, 393223, 21, 65537, 393224, 21, 65537, 393225, 21, 65537, 393226, 21, 65537, 393227, 21, 65537, 393228, 21, 65537, 393229, 21, 65537, 393230, 21, 65537, 393231, 21, 65538, 524287, 21, 65536, 458752, 21, 65537, 458753, 21, 65537, 458754, 21, 65537, 458755, 21, 65537, 458756, 21, 65537, 458757, 21, 65537, 458758, 21, 65537, 458759, 21, 65537, 458760, 21, 65537, 458761, 21, 65537, 458762, 21, 65537, 458763, 21, 65537, 458764, 21, 65537, 458765, 21, 65537, 458766, 21, 65537, 458767, 21, 65538, 589823, 21, 65536, 524288, 21, 65537, 524289, 21, 65537, 524290, 21, 65537, 524291, 21, 65537, 524292, 21, 65537, 524293, 21, 65537, 524294, 21, 65537, 524295, 21, 65537, 524296, 21, 65537, 524297, 21, 65537, 524298, 21, 65537, 524299, 21, 65537, 524300, 21, 65537, 524301, 21, 65537, 524302, 21, 65537, 524303, 21, 65538, 655359, 21, 65536, 589824, 21, 65537, 589825, 21, 65537, 589826, 21, 65537, 589827, 21, 65537, 589828, 21, 65537, 589829, 21, 65537, 589830, 21, 65537, 589831, 21, 65537, 589832, 21, 65537, 589833, 21, 65537, 589834, 21, 65537, 589835, 21, 65537, 589836, 21, 65537, 589837, 21, 65537, 589838, 21, 65537, 589839, 21, 65538, 720895, 21, 65536, 655360, 21, 65537, 655361, 21, 65537, 655362, 21, 65537, 655363, 21, 65537, 655364, 21, 65537, 655365, 21, 65537, 655366, 21, 65537, 655367, 21, 65537, 655368, 21, 65537, 655369, 21, 65537, 655370, 21, 65537, 655371, 21, 65537, 655372, 21, 65537, 655373, 21, 65537, 655374, 21, 65537, 655375, 21, 65538, 786431, 21, 65536, 720896, 21, 65537, 720897, 21, 65537, 720898, 21, 65537, 720899, 21, 65537, 720900, 21, 65537, 720901, 21, 65537, 720902, 21, 65537, 720903, 21, 65537, 720904, 21, 65537, 720905, 21, 65537, 720906, 21, 65537, 720907, 21, 65537, 720908, 21, 65537, 720909, 21, 65537, 720910, 21, 65537, 720911, 21, 65538, 851967, 21, 65536, 786432, 21, 65537, 786433, 21, 65537, 786434, 21, 65537, 786435, 21, 65537, 786436, 21, 65537, 786437, 21, 65537, 786438, 21, 65537, 786439, 21, 65537, 786440, 21, 65537, 786441, 21, 65537, 786442, 21, 65537, 786443, 21, 65537, 786444, 21, 65537, 786445, 21, 65537, 786446, 21, 65537, 786447, 21, 65538, 917503, 21, 65536, 851968, 21, 65537, 851969, 21, 65537, 851970, 21, 65537, 851971, 21, 65537, 851972, 21, 65537, 851973, 21, 65537, 851974, 21, 65537, 851975, 21, 65537, 851976, 21, 65537, 851977, 21, 65537, 851978, 21, 65537, 851979, 21, 65537, 851980, 21, 65537, 851981, 21, 65537, 851982, 21, 65537, 851983, 21, 65538, 983039, 21, 65536, 917504, 21, 65537, 917505, 21, 65537, 917506, 21, 65537, 917507, 21, 65537, 917508, 21, 65537, 917509, 21, 65537, 917510, 21, 65537, 917511, 21, 65537, 917512, 21, 65537, 917513, 21, 65537, 917514, 21, 65537, 917515, 21, 65537, 917516, 21, 65537, 917517, 21, 65537, 917518, 21, 65537, 917519, 21, 65538, 1048575, 21, 65536, 983040, 21, 65537, 983041, 21, 65537, 983042, 21, 65537, 983043, 21, 65537, 983044, 21, 65537, 983045, 21, 65537, 983046, 21, 65537, 983047, 21, 65537, 983048, 21, 65537, 983049, 21, 65537, 983050, 21, 65537, 983051, 21, 65537, 983052, 21, 65537, 983053, 21, 65537, 983054, 21, 65537, 983055, 21, 65538, 1114111, 21, 65536, 1048576, 21, 65537, 1048577, 21, 65537, 1048578, 21, 65537, 1048579, 21, 65537, 1048580, 21, 65537, 1048581, 21, 65537, 1048582, 21, 65537, 1048583, 21, 65537, 1048584, 21, 65537, 1048585, 21, 65537, 1048586, 21, 65537, 1048587, 21, 65537, 1048588, 21, 65537, 1048589, 21, 65537, 1048590, 21, 65537, 1048591, 21, 65538, 1179647, 21, 65536, 1114112, 21, 65537, 1114113, 21, 65537, 1114114, 21, 65537, 1114115, 21, 65537, 1114116, 21, 65537, 1114117, 21, 65537, 1114118, 21, 65537, 1114119, 21, 65537, 1114120, 21, 65537, 1114121, 21, 65537, 1114122, 21, 65537, 1114123, 21, 65537, 1114124, 21, 65537, 1114125, 21, 65537, 1114126, 21, 65537, 1114127, 21, 65538, 1245183, 21, 65536, 1179648, 21, 65537, 1179649, 21, 65537, 1179650, 21, 65537, 1179651, 21, 65537, 1179652, 21, 65537, 1179653, 21, 65537, 1179654, 21, 65537, 1179655, 21, 65537, 1179656, 21, 65537, 1179657, 21, 65537, 1179658, 21, 65537, 1179659, 21, 65537, 1179660, 21, 65537, 1179661, 21, 65537, 1179662, 21, 65537, 1179663, 21, 65538, 1310719, 21, 65536, 1245184, 21, 65537, 1245185, 21, 65537, 1245186, 21, 65537, 1245187, 21, 65537, 1245188, 21, 65537, 1245189, 21, 65537, 1245190, 21, 65537, 1245191, 21, 65537, 1245192, 21, 65537, 1245193, 21, 65537, 1245194, 21, 65537, 1245195, 21, 65537, 1245196, 21, 65537, 1245197, 21, 65537, 1245198, 21, 65537, 1245199, 21, 65538, 1376255, 21, 65536, 1310720, 21, 65537, 1310721, 21, 65537, 1310722, 21, 65537, 1310723, 21, 65537, 1310724, 21, 65537, 1310725, 21, 65537, 1310726, 21, 65537, 1310727, 21, 65537, 1310728, 21, 65537, 1310729, 21, 65537, 1310730, 21, 65537, 1310731, 21, 65537, 1310732, 21, 65537, 1310733, 21, 65537, 1310734, 21, 65537, 1310735, 21, 65538, 1441791, 21, 65536, 1376256, 21, 65537, 1376257, 21, 65537, 1376258, 21, 65537, 1376259, 21, 65537, 1376260, 21, 65537, 1376261, 21, 65537, 1376262, 21, 65537, 1376263, 21, 65537, 1376264, 21, 65537, 1376265, 21, 65537, 1376266, 21, 65537, 1376267, 21, 65537, 1376268, 21, 65537, 1376269, 21, 65537, 1376270, 21, 65537, 1376271, 21, 65538, 1507327, 21, 65536, 1441792, 21, 65537, 1441793, 21, 65537, 1441794, 21, 65537, 1441795, 21, 65537, 1441796, 21, 65537, 1441797, 21, 65537, 1441798, 21, 65537, 1441799, 21, 65537, 1441800, 21, 65537, 1441801, 21, 65537, 1441802, 21, 65537, 1441803, 21, 65537, 1441804, 21, 65537, 1441805, 21, 65537, 1441806, 21, 65537, 1441807, 21, 65538, 1572863, 21, 65536, 1507328, 21, 65537, 1507329, 21, 65537, 1507330, 21, 65537, 1507331, 21, 65537, 1507332, 21, 65537, 1507333, 21, 65537, 1507334, 21, 65537, 1507335, 21, 65537, 1507336, 21, 65537, 1507337, 21, 65537, 1507338, 21, 65537, 1507339, 21, 65537, 1507340, 21, 65537, 1507341, 21, 65537, 1507342, 21, 65537, 1507343, 21, 65538, 1638399, 21, 65536, 1572864, 21, 65537, 1572865, 21, 65537, 1572866, 21, 65537, 1572867, 21, 65537, 1572868, 21, 65537, 1572869, 21, 65537, 1572870, 21, 65537, 1572871, 21, 65537, 1572872, 21, 65537, 1572873, 21, 65537, 1572874, 21, 65537, 1572875, 21, 65537, 1572876, 21, 65537, 1572877, 21, 65537, 1572878, 21, 65537, 1572879, 21, 65538, 1703935, 21, 65536, 1638400, 21, 65537, 1638401, 21, 65537, 1638402, 21, 65537, 1638403, 21, 65537, 1638404, 21, 65537, 1638405, 21, 65537, 1638406, 21, 65537, 1638407, 21, 65537, 1638408, 21, 65537, 1638409, 21, 65537, 1638410, 21, 65537, 1638411, 21, 65537, 1638412, 21, 65537, 1638413, 21, 65537, 1638414, 21, 65537, 1638415, 21, 65538, 1769471, 21, 65536, 1703936, 21, 65537, 1703937, 21, 65537, 1703938, 21, 65537, 1703939, 21, 65537, 1703940, 21, 65537, 1703941, 21, 65537, 1703942, 21, 65537, 1703943, 21, 65537, 1703944, 21, 65537, 1703945, 21, 65537, 1703946, 21, 65537, 1703947, 21, 65537, 1703948, 21, 65537, 1703949, 21, 65537, 1703950, 21, 65537, 1703951, 21, 65538, 1835007, 21, 65536, 1769472, 21, 65537, 1769473, 21, 65537, 1769474, 21, 65537, 1769475, 21, 65537, 1769476, 21, 65537, 1769477, 21, 65537, 1769478, 21, 65537, 1769479, 21, 65537, 1769480, 21, 65537, 1769481, 21, 65537, 1769482, 21, 65537, 1769483, 21, 65537, 1769484, 21, 65537, 1769485, 21, 65537, 1769486, 21, 65537, 1769487, 21, 65538, 1900543, 21, 65536, 1835008, 21, 65537, 1835009, 21, 65537, 1835010, 21, 65537, 1835011, 21, 65537, 1835012, 21, 65537, 1835013, 21, 65537, 1835014, 21, 65537, 1835015, 21, 65537, 1835016, 21, 65537, 1835017, 21, 65537, 1835018, 21, 65537, 1835019, 21, 65537, 1835020, 21, 65537, 1835021, 21, 65537, 1835022, 21, 65537, 1835023, 21, 65538, 1966079, 21, 65536, 1900544, 21, 65537, 1900545, 21, 65537, 1900546, 21, 65537, 1900547, 21, 65537, 1900548, 21, 65537, 1900549, 21, 65537, 1900550, 21, 65537, 1900551, 21, 65537, 1900552, 21, 65537, 1900553, 21, 65537, 1900554, 21, 65537, 1900555, 21, 65537, 1900556, 21, 65537, 1900557, 21, 65537, 1900558, 21, 65537, 1900559, 21, 65538, 2031615, 21, 65536, 1966080, 21, 65537, 1966081, 21, 65537, 1966082, 21, 65537, 1966083, 21, 65537, 1966084, 21, 65537, 1966085, 21, 65537, 1966086, 21, 65537, 1966087, 21, 65537, 1966088, 21, 65537, 1966089, 21, 65537, 1966090, 21, 65537, 1966091, 21, 65537, 1966092, 21, 65537, 1966093, 21, 65537, 1966094, 21, 65537, 1966095, 21, 65538, 2097151, 21, 131072, 2031616, 21, 131073, 2031617, 21, 131073, 2031618, 21, 131073, 2031619, 21, 131073, 2031620, 21, 131073, 2031621, 21, 131073, 2031622, 21, 131073, 2031623, 21, 131073, 2031624, 21, 131073, 2031625, 21, 131073, 2031626, 21, 131073, 2031627, 21, 131073, 2031628, 21, 131073, 2031629, 21, 131073, 2031630, 21, 131073, 2031631, 21, 131074, 2097152, 35, 0, 2097153, 35, 0, 2097154, 35, 0, 2097155, 35, 0, 2097156, 35, 0, 2097157, 35, 0, 2097158, 35, 0, 2097159, 35, 0, 2097160, 35, 0, 2097161, 35, 0, 2097162, 35, 0, 2097163, 35, 0, 2097164, 35, 0, 2097165, 35, 0, 2097166, 35, 0, 2228223, 21, 0, 2162688, 21, 1, 2162689, 21, 1, 2162690, 21, 1, 2162691, 21, 1, 2162692, 21, 1, 2162693, 21, 1, 2162694, 21, 1, 2162695, 21, 1, 2162696, 21, 1, 2162697, 21, 1, 2162698, 21, 1, 2162699, 21, 1, 2162700, 21, 1, 2162701, 21, 1, 2162702, 21, 1, 2162703, 21, 2, 2293759, 21, 131072, 2228224, 21, 131073, 2228225, 21, 131073, 2228226, 21, 131073, 2228227, 21, 131073, 2228228, 21, 131073, 2228229, 21, 131073, 2228230, 21, 131073, 2228231, 21, 131073, 2228232, 21, 131073, 2228233, 21, 131073, 2228234, 21, 131073, 2228235, 21, 131073, 2228236, 21, 131073, 2228237, 21, 131073, 2228238, 21, 131073, 2228239, 21, 131074 ) - -[node name="Grass" type="TileMap" parent="Lower Cliffs" groups=[ -"Cliffs", -"Foliage", -"Summer", -]] -scale = Vector2( 8, 8 ) -tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) -cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) -collision_use_parent = true -collision_layer = 66 -collision_mask = 13 -format = 1 -tile_data = PoolIntArray( 131071, 23, 0, 65537, 22, 0, 65538, 22, 0, 65543, 22, 0, 65544, 22, 0, 65547, 22, 0, 65549, 22, 0, 65550, 22, 0, 65551, 30, 0, 2162687, 23, 0, 2097152, 22, 0, 2097153, 22, 0, 2097154, 22, 0, 2097155, 22, 0, 2097156, 22, 0, 2097157, 22, 0, 2097158, 22, 0, 2097159, 22, 0, 2097160, 22, 0, 2097161, 22, 0, 2097162, 22, 0, 2097163, 22, 0, 2097164, 22, 0, 2097165, 22, 0, 2097166, 22, 0, 2097167, 24, 0 ) +position = Vector2( 0, 20 ) +shape = SubResource( 118 ) -[node name="Ice" type="TileMap" parent="Lower Cliffs" groups=[ +[node name="Rock 1" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", -"Ice", -"Winter", +"Dropdownable", +"Ground", +"Walls", ]] visible = false -position = Vector2( 0, -128 ) -scale = Vector2( 8, 8 ) -tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) -cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) +position = Vector2( 152, -3776 ) collision_layer = 2 -collision_mask = 13 -format = 1 -tile_data = PoolIntArray( 196607, 31, 0, 131074, 31, 0, 131076, 31, 0, 131077, 31, 1, 131078, 31, 1, 131079, 31, 1, 131080, 31, 2, 131082, 31, 0, 131083, 31, 0, 131084, 31, 0, 131085, 33, 0, 131086, 31, 0, 131087, 34, 0, 196608, 31, 0, 196612, 31, 131072, 196613, 31, 131073, 196614, 31, 131073, 196615, 31, 131073, 196616, 31, 131074, 196619, 31, 0, 196621, 31, 0, 262144, 31, 0, 262145, 31, 2, 262153, 31, 0, 262156, 31, 0, 262158, 34, 0, 327680, 31, 131072, 327681, 31, 131074, 327688, 31, 0, 327689, 31, 2, 393216, 31, 0, 393221, 31, 0, 393224, 31, 131072, 393225, 31, 0, 393226, 31, 2, 458754, 31, 0, 458761, 31, 65536, 458762, 31, 65538, 524289, 31, 0, 524292, 31, 0, 524293, 31, 2, 524297, 31, 131072, 524298, 31, 131074, 589828, 31, 131072, 589829, 31, 131074, 589832, 31, 0, 589833, 31, 2, 589837, 31, 0, 589838, 31, 2, 655360, 31, 0, 655368, 31, 131072, 655369, 31, 131074, 655373, 31, 65536, 655374, 31, 65538, 720896, 31, 0, 720897, 31, 0, 720898, 31, 2, 720909, 31, 65536, 720910, 31, 65538, 786433, 31, 131072, 786434, 31, 131074, 786445, 31, 131072, 786446, 31, 131074, 851972, 31, 0, 851973, 31, 1, 851974, 31, 2, 851980, 31, 0, 851981, 31, 2, 917508, 31, 65536, 917509, 31, 65537, 917510, 31, 0, 917511, 31, 2, 917512, 31, 0, 917513, 31, 0, 917516, 31, 131072, 917517, 31, 0, 917518, 31, 2, 983043, 31, 0, 983044, 31, 0, 983045, 31, 131073, 983046, 31, 131073, 983047, 31, 131074, 983049, 31, 0, 983050, 31, 2, 983053, 31, 131072, 983054, 31, 131074, 1048578, 31, 0, 1048579, 31, 131072, 1048580, 31, 131074, 1048584, 31, 0, 1048585, 31, 0, 1048586, 31, 131074, 1048589, 31, 0, 1114115, 31, 0, 1114120, 31, 65536, 1114121, 31, 65538, 1114125, 31, 0, 1179656, 31, 131072, 1179657, 31, 131074, 1441802, 31, 0, 1441806, 34, 0, 1507333, 31, 0, 1507341, 31, 0, 1507342, 31, 2, 1572877, 31, 131072, 1572878, 31, 131074, 1638402, 31, 0, 1703947, 31, 0, 1769483, 31, 0, 2228223, 32, 0, 2162688, 31, 0, 2162689, 31, 0, 2162698, 31, 0, 2228226, 31, 0, 2228238, 34, 0 ) - -[node name="Snow" type="TileMap" parent="Lower Cliffs" groups=[ -"Cliffs", -"Winter", -]] -visible = false -position = Vector2( 0, -128 ) -scale = Vector2( 8, 8 ) -tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) -collision_use_parent = true -format = 1 -tile_data = PoolIntArray( -3735549, 2, 0, 196607, 27, 0, 131072, 28, 0, 131073, 28, 0, 131074, 28, 0, 131075, 28, 0, 131076, 28, 0, 131077, 28, 0, 131078, 28, 0, 131079, 28, 0, 131080, 28, 0, 131081, 28, 0, 131082, 28, 0, 131083, 28, 0, 131084, 28, 0, 131085, 28, 0, 131086, 28, 0, 131087, 29, 0, 2228223, 27, 0, 2162688, 28, 0, 2162689, 28, 0, 2162690, 28, 0, 2162691, 28, 0, 2162692, 28, 0, 2162693, 28, 0, 2162694, 28, 0, 2162695, 28, 0, 2162696, 28, 0, 2162697, 28, 0, 2162698, 28, 0, 2162699, 28, 0, 2162700, 28, 0, 2162701, 28, 0, 2162702, 28, 0, 2162703, 29, 0 ) +collision_mask = 29 -[node name="Flowers" type="TileMap" parent="Lower Cliffs" groups=[ +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Cliffs/Rock 1" groups=[ "Cliffs", -"Foliage", -"Perchable", -"Summer", +"Dropdownable", +"Ground", ]] -position = Vector2( -112, -56 ) -scale = Vector2( 8, 8 ) -z_index = 1 -tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) -cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) -collision_layer = 32 -collision_mask = 4 -format = 1 -tile_data = PoolIntArray( 2031620, 38, 0, 2031624, 38, 0, 2031625, 36, 0, 2031629, 38, 0, 2031630, 36, 0, 2031631, 37, 0, 2097153, 38, 0, 2097157, 36, 0, 2097158, 38, 0, 2097167, 38, 0 ) +polygon = PoolVector2Array( 8, -64, 0, -56, -8, -48, -16, -24, -16, 8, -8, 16, 0, 40, 8, 56, 16, 64 ) -[node name="Signs" type="TileMap" parent="Lower Cliffs" groups=[ +[node name="Rock 2" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", "Dropdownable", -"Perchable", +"Ground", "Walls", ]] -position = Vector2( 64, -48 ) -scale = Vector2( 8, 8 ) -tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) -cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) +visible = false +position = Vector2( 1380, -3776 ) collision_layer = 2 collision_mask = 29 -format = 1 -tile_data = PoolIntArray( 0, 45, 0, 13, 42, 0, 2031616, 46, 0, 2031627, 42, 0 ) - -[node name="Signs Winter Layer" type="TileMap" parent="Lower Cliffs" groups=[ -"Cliffs", -"Winter", -]] -visible = false -position = Vector2( 64, -48 ) -scale = Vector2( 8, 8 ) -z_index = 1 -tile_set = ExtResource( 3 ) -cell_size = Vector2( 16, 16 ) -cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) -collision_use_parent = true -format = 1 -tile_data = PoolIntArray( -3735549, 2, 0, 0, 48, 0, 13, 47, 0, 2031616, 49, 0, 2031627, 47, 0 ) - -[node name="(0,0)" type="Sprite" parent="Lower Cliffs" groups=[ -"Cliffs", -]] -visible = false -position = Vector2( 128, 0 ) -scale = Vector2( 0.8, 1.2 ) -z_index = 4 -texture = ExtResource( 14 ) - -[node name="Sign Font" type="TileMap" parent="Lower Cliffs/(0,0)"] -position = Vector2( -5, 0 ) -tile_set = SubResource( 83 ) -cell_size = Vector2( 1, 1 ) -cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) -collision_layer = 0 -collision_mask = 0 -format = 1 -tile_data = PoolIntArray( -64618078, 19, 0, -524330, 0, 0, -458804, 18, 0, -458785, 2, 0, -458777, 17, 0, -458767, 4, 0, -458757, 3, 0, -524274, 5, 0, -524265, 0, 0, -524256, 11, 0, -524248, 11, 0, -524240, 18, 0 ) - -[node name="(13,0)" type="Sprite" parent="Lower Cliffs" groups=[ -"Cliffs", -]] -visible = false -position = Vector2( 1792, 0 ) -scale = Vector2( 0.8, 1.2 ) -z_index = 4 -texture = ExtResource( 15 ) - -[node name="Sign Font" type="TileMap" parent="Lower Cliffs/(13,0)"] -position = Vector2( 4, -4 ) -tile_set = SubResource( 83 ) -cell_size = Vector2( 1, 1 ) -cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) -collision_layer = 0 -collision_mask = 0 -format = 1 -tile_data = PoolIntArray( -544075464, 2, 0, -544075456, 11, 0, -544075448, 8, 0, -544075439, 12, 0, -544075428, 1, 0, -64618078, 19, 0, -17301410, -1610612729, 0, -17301409, -1610612729, 0, -17235873, -1610612729, 0, -17170336, -1610612729, 0, -17170335, -1610612729, 0, -17104799, -1610612729, 0, -17039263, -1610612729, 0, -16973726, -1610612729, 0, -16973725, -1610612729, 0, -16908188, -1610612729, 0, -16842652, -1610612729, 0, -16842651, -1610612729, 0, -16777114, -1610612729, 0, -16711577, -1610612729, 0, -16646040, -1610612729, 0, -16646039, -1610612729, 0, -16580502, -1610612729, 0, -16514966, -1610612729, 0, -16449429, -1610612729, 0, -16383892, -1610612729, 0, -16383891, -1610612729, 0, -16383890, 7, 0, -16318355, -1610612729, 0, -16252818, -1610612729, 0, -16187281, -1610612729, 0, -16121744, -1610612729, 0, -16121743, -1610612729, 0, -16056206, -1610612729, 0, -15990669, -1610612729, 0, -15925132, -1610612729, 0, -15859595, -1610612729, 0, -15794058, -1610612729, 0, -15794057, -1610612729, 0, -15728520, -1610612729, 0, -15662984, -1610612729, 0, -15662983, -1610612729, 0, -15597446, -1610612729, 0, -15531909, -1610612729, 0, -15466372, -1610612729, 0, -14811005, -1610612729, 0, -1179647, 13, 0, -1179636, 14, 0, 196584, 2, 0, 196592, 11, 0, 196600, 8, 0, 131073, 12, 0, 131083, 1, 0, 131093, 8, 0, 131101, 13, 0, 131111, 6, 0 ) - -[node name="GOE" type="Sprite" parent="Lower Cliffs/(13,0)"] -position = Vector2( -40, 0 ) -texture = ExtResource( 13 ) - -[node name="(0,31)" type="Sprite" parent="Lower Cliffs" groups=[ -"Cliffs", -]] -visible = false -position = Vector2( 128, 3968 ) -scale = Vector2( 0.8, 1.2 ) -z_index = 4 -texture = ExtResource( 17 ) -[node name="Sign Font" type="TileMap" parent="Lower Cliffs/(0,31)"] -position = Vector2( -10, -3.22583 ) -scale = Vector2( 1.2, 1.2 ) -tile_set = SubResource( 83 ) -cell_size = Vector2( 1, 1 ) -cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) -collision_layer = 0 -collision_mask = 0 -format = 1 -tile_data = PoolIntArray( -544075464, 2, 0, -544075456, 11, 0, -544075448, 8, 0, -544075439, 12, 0, -544075428, 1, 0, -64618078, 19, 0, -17301410, -1610612729, 0, -17301409, -1610612729, 0, -17235873, -1610612729, 0, -17170336, -1610612729, 0, -17170335, -1610612729, 0, -17104799, -1610612729, 0, -17039263, -1610612729, 0, -16973726, -1610612729, 0, -16973725, -1610612729, 0, -16908188, -1610612729, 0, -16842652, -1610612729, 0, -16842651, -1610612729, 0, -16777114, -1610612729, 0, -16711577, -1610612729, 0, -16646040, -1610612729, 0, -16646039, -1610612729, 0, -16580502, -1610612729, 0, -16514966, -1610612729, 0, -16449429, -1610612729, 0, -16383892, -1610612729, 0, -16383891, -1610612729, 0, -16383890, 7, 0, -16318355, -1610612729, 0, -16252818, -1610612729, 0, -16187281, -1610612729, 0, -16121744, -1610612729, 0, -16121743, -1610612729, 0, -16056206, -1610612729, 0, -15990669, -1610612729, 0, -15925132, -1610612729, 0, -15859595, -1610612729, 0, -15794058, -1610612729, 0, -15794057, -1610612729, 0, -15728520, -1610612729, 0, -15662984, -1610612729, 0, -15662983, -1610612729, 0, -15597446, -1610612729, 0, -15531909, -1610612729, 0, -15466372, -1610612729, 0, -14811005, -1610612729, 0, -524327, 0, 0, -524318, 10, 0, -524309, 0, 0, -524300, 8, 0, -524292, 0, 0, -589814, 2, 0, -589806, 8, 0, -589797, 19, 0, -589788, 24, 0 ) - -[node name="Sign Font 2" type="TileMap" parent="Lower Cliffs/(0,31)"] -position = Vector2( -10, 6.45215 ) -scale = Vector2( 0.5, 0.4 ) -tile_set = SubResource( 83 ) -cell_size = Vector2( 1, 1 ) -cell_custom_transform = Transform2D( 0, 0, 0, 0, 0, 0 ) -collision_layer = 0 -collision_mask = 0 -format = 1 -tile_data = PoolIntArray( -544075464, 2, 0, -544075456, 11, 0, -544075448, 8, 0, -544075439, 12, 0, -544075428, 1, 0, -64618078, 19, 0, -17301410, -1610612729, 0, -17301409, -1610612729, 0, -17235873, -1610612729, 0, -17170336, -1610612729, 0, -17170335, -1610612729, 0, -17104799, -1610612729, 0, -17039263, -1610612729, 0, -16973726, -1610612729, 0, -16973725, -1610612729, 0, -16908188, -1610612729, 0, -16842652, -1610612729, 0, -16842651, -1610612729, 0, -16777114, -1610612729, 0, -16711577, -1610612729, 0, -16646040, -1610612729, 0, -16646039, -1610612729, 0, -16580502, -1610612729, 0, -16514966, -1610612729, 0, -16449429, -1610612729, 0, -16383892, -1610612729, 0, -16383891, -1610612729, 0, -16383890, 7, 0, -16318355, -1610612729, 0, -16252818, -1610612729, 0, -16187281, -1610612729, 0, -16121744, -1610612729, 0, -16121743, -1610612729, 0, -16056206, -1610612729, 0, -15990669, -1610612729, 0, -15925132, -1610612729, 0, -15859595, -1610612729, 0, -15794058, -1610612729, 0, -15794057, -1610612729, 0, -15728520, -1610612729, 0, -15662984, -1610612729, 0, -15662983, -1610612729, 0, -15597446, -1610612729, 0, -15531909, -1610612729, 0, -15466372, -1610612729, 0, -14811005, -1610612729, 0, 655311, 44, 0, 655320, 30, 0, 655340, 5, 0, 655350, 20, 0, 589824, 17, 0, 589834, 11, 0, 589843, 14, 0, 589853, 13, 0, 589863, 6, 0, 589873, 18, 0, 589883, 45, 0 ) - -[node name="(11,31)" type="Sprite" parent="Lower Cliffs" groups=[ -"Cliffs", -]] -visible = false -position = Vector2( 1536, 3968 ) -scale = Vector2( 0.8, 1.2 ) -z_index = 4 -texture = ExtResource( 15 ) - -[node name="Extents 1" type="CollisionShape2D" parent="Lower Cliffs" groups=[ +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Cliffs/Rock 2" groups=[ "Cliffs", +"Dropdownable", +"Ground", ]] -visible = false -position = Vector2( 960, 2068 ) -shape = SubResource( 115 ) +polygon = PoolVector2Array( -4, -64, 4, -56, 12, -48, 20, -40, 20, 8, 12, 24, 4, 40, -4, 48, -12, 56, -20, 64 ) -[node name="Cliff Edge" type="Area2D" parent="Lower Cliffs" groups=[ +[node name="Rock 3" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", +"Dropdownable", +"Ground", +"Walls", ]] visible = false -position = Vector2( 296, 84 ) +position = Vector2( 1688, -3776 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Lower Cliffs/Cliff Edge" groups=[ +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Cliffs/Rock 3" groups=[ "Cliffs", +"Dropdownable", +"Ground", ]] -position = Vector2( 664, 16 ) -shape = SubResource( 116 ) +polygon = PoolVector2Array( 8, -64, 0, -56, -8, -48, -16, -24, -16, 8, -8, 16, 0, 40, 8, 56, 16, 64 ) -[node name="Lower Cliffs Bottom Ground Static Collider" type="StaticBody2D" parent="Lower Cliffs" groups=[ +[node name="Rock 4" type="StaticBody2D" parent="Cliffs" groups=[ "Cliffs", +"Dropdownable", "Ground", +"Walls", ]] visible = false -position = Vector2( 960, 4052 ) +position = Vector2( 1892, -3776 ) collision_layer = 2 collision_mask = 29 -[node name="CollisionShape2D" type="CollisionShape2D" parent="Lower Cliffs/Lower Cliffs Bottom Ground Static Collider" groups=[ +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Cliffs/Rock 4" groups=[ "Cliffs", +"Dropdownable", "Ground", ]] -shape = SubResource( 117 ) +polygon = PoolVector2Array( 4, -56, 12, -48, 20, -40, 20, 8, 12, 24, 4, 40, -4, 48, -12, 56, -20, 64, -4, -64 ) [node name="Scene Boundary - Left" type="StaticBody2D" parent="." groups=[ "Walls", @@ -2646,7 +2573,7 @@ __meta__ = { } [node name="CollisionShape2D" type="CollisionShape2D" parent="Scene Boundary - Left"] -shape = SubResource( 118 ) +shape = SubResource( 119 ) __meta__ = { "_edit_group_": true, "_edit_lock_": true @@ -2665,7 +2592,7 @@ __meta__ = { } [node name="CollisionShape2D" type="CollisionShape2D" parent="Scene Boundary - Right"] -shape = SubResource( 119 ) +shape = SubResource( 120 ) __meta__ = { "_edit_group_": true, "_edit_lock_": true @@ -2676,10 +2603,36 @@ visible = false position = Vector2( 960, -4288 ) collision_layer = 2 collision_mask = 9 +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} [node name="CollisionShape2D" type="CollisionShape2D" parent="Scene Boundary - Top"] rotation = 1.5708 -shape = SubResource( 120 ) +shape = SubResource( 121 ) +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} + +[node name="Scene Boundary - Bottom" type="StaticBody2D" parent="."] +visible = false +position = Vector2( 960, 4416 ) +collision_layer = 2 +collision_mask = 9 +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Scene Boundary - Bottom"] +rotation = 1.5708 +shape = SubResource( 122 ) +__meta__ = { +"_edit_group_": true, +"_edit_lock_": true +} [node name="AmbiencePlayer" type="AudioStreamPlayer" parent="."] stream = ExtResource( 6 ) @@ -2689,40 +2642,40 @@ volume_db = -10.156 stream = ExtResource( 9 ) volume_db = -15.273 -[connection signal="body_entered" from="Player/AnimatedSprite/Area2D" to="Player" method="_OnPlayerAreaColliderEntered"] -[connection signal="body_exited" from="Player/AnimatedSprite/Area2D" to="Player" method="_OnPlayerAreaColliderExited"] +[connection signal="body_entered" from="Player/AnimatedSprite/Area2D" to="Player" method="_OnPlayerAreaColliderBodyEntered"] +[connection signal="body_exited" from="Player/AnimatedSprite/Area2D" to="Player" method="_OnPlayerAreaColliderBodyExited"] [connection signal="timeout" from="Player/EnergyTimer" to="Player" method="_OnEnergyTimerTimeout"] -[connection signal="area_entered" from="Butterfly 1/PerchingCollider" to="Butterfly 1" method="_OnPerchingAreaColliderEntered"] -[connection signal="body_entered" from="Butterfly 1/PerchingCollider" to="Butterfly 1" method="_OnPerchingBodyColliderEntered"] -[connection signal="body_entered" from="Butterfly 1/ObstacleCollider" to="Butterfly 1" method="_OnObstacleColliderEntered"] -[connection signal="body_exited" from="Butterfly 1/ObstacleCollider" to="Butterfly 1" method="_OnObstacleColliderExited"] -[connection signal="area_entered" from="Butterfly 2/PerchingCollider" to="Butterfly 2" method="_OnPerchingAreaColliderEntered"] -[connection signal="body_entered" from="Butterfly 2/PerchingCollider" to="Butterfly 2" method="_OnPerchingBodyColliderEntered"] -[connection signal="body_entered" from="Butterfly 2/ObstacleCollider" to="Butterfly 2" method="_OnObstacleColliderEntered"] -[connection signal="body_exited" from="Butterfly 2/ObstacleCollider" to="Butterfly 2" method="_OnObstacleColliderExited"] -[connection signal="area_entered" from="Butterfly 3/PerchingCollider" to="Butterfly 3" method="_OnPerchingAreaColliderEntered"] -[connection signal="body_entered" from="Butterfly 3/PerchingCollider" to="Butterfly 3" method="_OnPerchingBodyColliderEntered"] -[connection signal="body_entered" from="Butterfly 3/ObstacleCollider" to="Butterfly 3" method="_OnObstacleColliderEntered"] -[connection signal="body_exited" from="Butterfly 3/ObstacleCollider" to="Butterfly 3" method="_OnObstacleColliderExited"] -[connection signal="area_entered" from="Upper Cliffs" to="Upper Cliffs" method="_OnCliffsEntered"] -[connection signal="area_exited" from="Upper Cliffs" to="Upper Cliffs" method="_OnCliffsExited"] -[connection signal="area_entered" from="Upper Cliffs/Waterfall" to="Upper Cliffs" method="_OnWaterfallEntered"] -[connection signal="area_exited" from="Upper Cliffs/Waterfall" to="Upper Cliffs" method="_OnWaterfallExited"] -[connection signal="body_exited" from="Upper Cliffs/Cliff Edge 1" to="Player" method="_OnCliffEdgeExited"] -[connection signal="body_exited" from="Upper Cliffs/Cliff Edge 2" to="Player" method="_OnCliffEdgeExited"] -[connection signal="body_exited" from="Upper Cliffs/Cliff Edge 3" to="Player" method="_OnCliffEdgeExited"] -[connection signal="body_exited" from="Upper Cliffs/Cliff Edge 4" to="Player" method="_OnCliffEdgeExited"] -[connection signal="area_entered" from="Upper Cliffs/Upper Cliffs Top Ground Static Collider 1/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundEntered"] -[connection signal="area_exited" from="Upper Cliffs/Upper Cliffs Top Ground Static Collider 1/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundExited"] -[connection signal="area_entered" from="Upper Cliffs/Upper Cliffs Top Ground Static Collider 2/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundEntered"] -[connection signal="area_exited" from="Upper Cliffs/Upper Cliffs Top Ground Static Collider 2/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundExited"] -[connection signal="area_entered" from="Upper Cliffs/Upper Cliffs Top Ground Static Collider 3/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundEntered"] -[connection signal="area_exited" from="Upper Cliffs/Upper Cliffs Top Ground Static Collider 3/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundExited"] -[connection signal="area_entered" from="Upper Cliffs/Upper Cliffs Top Ground Static Collider 4/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundEntered"] -[connection signal="area_exited" from="Upper Cliffs/Upper Cliffs Top Ground Static Collider 4/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundExited"] -[connection signal="area_entered" from="Upper Cliffs/Upper Cliffs Bottom Ground Static Collider/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundEntered"] -[connection signal="area_exited" from="Upper Cliffs/Upper Cliffs Bottom Ground Static Collider/Area2D" to="Player" method="_OnCliffsGroundExited"] -[connection signal="area_exited" from="Upper Cliffs/Upper Cliffs Bottom Ground Static Collider/Area2D" to="Upper Cliffs" method="_OnUpperCliffsGroundExited"] -[connection signal="area_entered" from="Lower Cliffs" to="Lower Cliffs" method="_OnCliffsEntered"] -[connection signal="area_exited" from="Lower Cliffs" to="Lower Cliffs" method="_OnCliffsExited"] -[connection signal="body_exited" from="Lower Cliffs/Cliff Edge" to="Player" method="_OnCliffEdgeExited"] +[connection signal="area_entered" from="Butterfly 1/PerchingCollider" to="Butterfly 1" method="_OnPerchingColliderAreaEntered"] +[connection signal="body_entered" from="Butterfly 1/PerchingCollider" to="Butterfly 1" method="_OnPerchingColliderBodyEntered"] +[connection signal="body_entered" from="Butterfly 1/ObstacleCollider" to="Butterfly 1" method="_OnObstacleColliderBodyEntered"] +[connection signal="body_exited" from="Butterfly 1/ObstacleCollider" to="Butterfly 1" method="_OnObstacleColliderBodyExited"] +[connection signal="area_entered" from="Butterfly 2/PerchingCollider" to="Butterfly 2" method="_OnPerchingColliderAreaEntered"] +[connection signal="body_entered" from="Butterfly 2/PerchingCollider" to="Butterfly 2" method="_OnPerchingColliderBodyEntered"] +[connection signal="body_entered" from="Butterfly 2/ObstacleCollider" to="Butterfly 2" method="_OnObstacleColliderBodyEntered"] +[connection signal="body_exited" from="Butterfly 2/ObstacleCollider" to="Butterfly 2" method="_OnObstacleColliderBodyExited"] +[connection signal="area_entered" from="Butterfly 3/PerchingCollider" to="Butterfly 3" method="_OnPerchingColliderAreaEntered"] +[connection signal="body_entered" from="Butterfly 3/PerchingCollider" to="Butterfly 3" method="_OnPerchingColliderBodyEntered"] +[connection signal="body_entered" from="Butterfly 3/ObstacleCollider" to="Butterfly 3" method="_OnObstacleColliderBodyEntered"] +[connection signal="body_exited" from="Butterfly 3/ObstacleCollider" to="Butterfly 3" method="_OnObstacleColliderBodyExited"] +[connection signal="area_entered" from="Cliffs" to="Cliffs" method="_OnCliffsEntered"] +[connection signal="area_exited" from="Cliffs" to="Cliffs" method="_OnCliffsExited"] +[connection signal="area_entered" from="Cliffs/Waterfall" to="Cliffs" method="_OnWaterfallEntered"] +[connection signal="area_exited" from="Cliffs/Waterfall" to="Cliffs" method="_OnWaterfallExited"] +[connection signal="body_exited" from="Cliffs/Edge 1" to="Player" method="_OnCliffEdgeExited"] +[connection signal="body_exited" from="Cliffs/Edge 2" to="Player" method="_OnCliffEdgeExited"] +[connection signal="body_exited" from="Cliffs/Edge 3" to="Player" method="_OnCliffEdgeExited"] +[connection signal="body_exited" from="Cliffs/Edge 4" to="Player" method="_OnCliffEdgeExited"] +[connection signal="body_exited" from="Cliffs/Edge 5" to="Player" method="_OnCliffEdgeExited"] +[connection signal="body_exited" from="Cliffs/Edge 6" to="Player" method="_OnCliffEdgeExited"] +[connection signal="area_entered" from="Cliffs/Ground 1/Area2D" to="Player" method="_OnGroundEntered"] +[connection signal="area_exited" from="Cliffs/Ground 1/Area2D" to="Player" method="_OnGroundExited"] +[connection signal="area_entered" from="Cliffs/Ground 2/Area2D" to="Player" method="_OnGroundEntered"] +[connection signal="area_exited" from="Cliffs/Ground 2/Area2D" to="Player" method="_OnGroundExited"] +[connection signal="area_entered" from="Cliffs/Ground 3/Area2D" to="Player" method="_OnGroundEntered"] +[connection signal="area_exited" from="Cliffs/Ground 3/Area2D" to="Player" method="_OnGroundExited"] +[connection signal="area_entered" from="Cliffs/Ground 4/Area2D" to="Player" method="_OnGroundEntered"] +[connection signal="area_exited" from="Cliffs/Ground 4/Area2D" to="Player" method="_OnGroundExited"] +[connection signal="area_entered" from="Cliffs/Ground 5/Area2D" to="Player" method="_OnGroundEntered"] +[connection signal="area_exited" from="Cliffs/Ground 5/Area2D" to="Player" method="_OnGroundExited"] +[connection signal="area_entered" from="Cliffs/Ground 6/Area2D" to="Player" method="_OnGroundEntered"] +[connection signal="area_exited" from="Cliffs/Ground 6/Area2D" to="Player" method="_OnGroundExited"] diff --git a/ui.tscn b/ui.tscn index e46baee..449e320 100644 --- a/ui.tscn +++ b/ui.tscn @@ -9,6 +9,8 @@ load_path = "res://.import/energy-meter-fill.png-6afebb0eb5fda70a84cad1375645d58 anchor_right = 1.0 anchor_bottom = 1.0 __meta__ = { +"_edit_group_": true, +"_edit_lock_": true, "_edit_use_anchors_": false } @@ -26,6 +28,8 @@ texture_progress = SubResource( 1 ) fill_mode = 1 nine_patch_stretch = true __meta__ = { +"_edit_group_": true, +"_edit_lock_": true, "_edit_use_anchors_": false } @@ -44,5 +48,7 @@ bbcode_enabled = true fit_content_height = true scroll_active = false __meta__ = { +"_edit_group_": true, +"_edit_lock_": true, "_edit_use_anchors_": true }