diff --git a/CHANGELOG.md b/CHANGELOG.md index 3deba248..708edab7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## v0.3.3 Overworld Gameboard & Gamepiece Rework 🔧 + +### Under-the-hood changes +This update has aimed to greatly simplify the code responsible for moving Gamepieces around the Gameboard, while keeping the structure of the code roughly the same. Most scripts dealing with the overworld/field gamestate have been changed, but the main features are as follows: + - Collision on the Gameboard is no longer based on physics-based collisions. The physics implementation was great, but introduced a host of edge cases (e.g. two gamepieces moving onto the same cell on the same physics tick) that had to be accounted for. + - Rather, objects used to build the pathfinder use a registry pattern; GameboardLayers register themselves with the Gameboard, and Gamepieces register themselves with the GamepieceRegistry. The board and registry update automatically based on signals from their registered objects, and the user no longer needs to worry about emitting global signals such as "FieldEvents.terrain_changed". It all happens under the hood. + - The removal of circular dependency issues that were present in early Godot 4.X has made life much easier. The Gameboard singleton allows anything to figure out where coordinates occur on the gameboard and if those coordinates are moveable (thanks to the single Pathfinder), and the GamepieceRegistry allows objects (cutscenes!) to easily find where everything and everyone is placed on the board. Gameboard and GamepieceRegistry are autoloads that allow designers to easily observe the global overworld state without having to worry (too much) about messing things up. + - Many objects have had their responsibilities reduced, such as Gamepiece which now only deals with moving to a point (rather than also tracking cells, coordinates, movement paths, etc.), and GamepieceControllers which now are much more focused on helping a gamepiece follow a path in response to player and AI input (as opposed to previously, where they also dabbled in pathfinding, physics shenanigans, etc.) +Overall, the code should now be simpler to understand at first glance, and much easier for newcomers to work through. Happy designing! + ## v0.3.2 Combat UI Demo 🖱️ - Battler Actions & User Interface ### Guide the player through action selection diff --git a/assets/characters/default_animations/RESET.anim b/assets/characters/default_animations/RESET.anim deleted file mode 100644 index c6c519dd..00000000 Binary files a/assets/characters/default_animations/RESET.anim and /dev/null differ diff --git a/assets/characters/default_animations/idle_e.anim b/assets/characters/default_animations/idle_e.anim deleted file mode 100644 index fd94e086..00000000 Binary files a/assets/characters/default_animations/idle_e.anim and /dev/null differ diff --git a/assets/characters/default_animations/idle_n.anim b/assets/characters/default_animations/idle_n.anim deleted file mode 100644 index c0f21f8b..00000000 Binary files a/assets/characters/default_animations/idle_n.anim and /dev/null differ diff --git a/assets/characters/default_animations/idle_s.anim b/assets/characters/default_animations/idle_s.anim deleted file mode 100644 index fe3a1889..00000000 Binary files a/assets/characters/default_animations/idle_s.anim and /dev/null differ diff --git a/assets/characters/default_animations/idle_w.anim b/assets/characters/default_animations/idle_w.anim deleted file mode 100644 index 0494cf68..00000000 Binary files a/assets/characters/default_animations/idle_w.anim and /dev/null differ diff --git a/assets/characters/default_animations/run_e.anim b/assets/characters/default_animations/run_e.anim deleted file mode 100644 index c54ad8b4..00000000 Binary files a/assets/characters/default_animations/run_e.anim and /dev/null differ diff --git a/assets/characters/default_animations/run_n.anim b/assets/characters/default_animations/run_n.anim deleted file mode 100644 index bd118c44..00000000 Binary files a/assets/characters/default_animations/run_n.anim and /dev/null differ diff --git a/assets/characters/default_animations/run_s.anim b/assets/characters/default_animations/run_s.anim deleted file mode 100644 index e11948a6..00000000 Binary files a/assets/characters/default_animations/run_s.anim and /dev/null differ diff --git a/assets/characters/default_animations/run_w.anim b/assets/characters/default_animations/run_w.anim deleted file mode 100644 index 0f4800d2..00000000 Binary files a/assets/characters/default_animations/run_w.anim and /dev/null differ diff --git a/assets/characters/default_animations/standard_animations.res b/assets/characters/default_animations/standard_animations.res deleted file mode 100644 index c22a6b08..00000000 Binary files a/assets/characters/default_animations/standard_animations.res and /dev/null differ diff --git a/assets/characters/generic_character_gfx.tscn b/assets/characters/generic_character_gfx.tscn deleted file mode 100644 index b4d136b0..00000000 --- a/assets/characters/generic_character_gfx.tscn +++ /dev/null @@ -1,26 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://cdkha7cc72h35"] - -[ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_pdtfs"] -[ext_resource type="AnimationLibrary" uid="uid://dmmjb8ambpwar" path="res://assets/characters/default_animations/standard_animations.res" id="2_ljcdi"] -[ext_resource type="Texture2D" uid="uid://doea2mk0aaedo" path="res://assets/characters/character_generic.png" id="3_cn4da"] - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_tbyb3"] -size = Vector2(16, 16) - -[node name="GenericCharacterAnimation" instance=ExtResource("1_pdtfs")] - -[node name="AnimationPlayer" parent="." index="0"] -autoplay = "idle" -speed_scale = 2.0 -libraries = { -"": ExtResource("2_ljcdi") -} - -[node name="CollisionShape2D" parent="Area2D" index="0"] -shape = SubResource("RectangleShape2D_tbyb3") - -[node name="Sprite" parent="GFX" index="0"] -texture = ExtResource("3_cn4da") -offset = Vector2(0, -6) -region_enabled = true -region_rect = Rect2(1, 1, 16, 16) diff --git a/assets/characters/gobot_gfx.tscn b/assets/characters/gobot_gfx.tscn deleted file mode 100644 index 7d871e90..00000000 --- a/assets/characters/gobot_gfx.tscn +++ /dev/null @@ -1,24 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://qxua6ekob7fa"] - -[ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_ggnk7"] -[ext_resource type="AnimationLibrary" uid="uid://dmmjb8ambpwar" path="res://assets/characters/default_animations/standard_animations.res" id="2_mw4lc"] -[ext_resource type="Texture2D" uid="uid://4ua1ohn2tllf" path="res://assets/characters/gobot_field.png" id="3_rnaav"] - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_xkmti"] -size = Vector2(16, 16) - -[node name="GoBotGFX" instance=ExtResource("1_ggnk7")] - -[node name="AnimationPlayer" parent="." index="0"] -libraries = { -"": ExtResource("2_mw4lc") -} - -[node name="CollisionShape2D" parent="Area2D" index="0"] -shape = SubResource("RectangleShape2D_xkmti") - -[node name="Sprite" parent="GFX" index="0"] -texture = ExtResource("3_rnaav") -offset = Vector2(0, -6) -region_enabled = true -region_rect = Rect2(1, 1, 16, 16) diff --git a/assets/gui/path_destination_marker.tres b/assets/gui/path_destination_marker.tres index 9714c9e3..e3bcbe95 100644 --- a/assets/gui/path_destination_marker.tres +++ b/assets/gui/path_destination_marker.tres @@ -1,6 +1,6 @@ [gd_resource type="AtlasTexture" load_steps=2 format=3 uid="uid://b71dt8n01lhd0"] -[ext_resource type="Texture2D" uid="uid://dm4h0uo6gjp22" path="res://assets/terrain/dungeon_tilemap.png" id="1_km3tr"] +[ext_resource type="Texture2D" uid="uid://dm4h0uo6gjp22" path="res://overworld/maps/tilesets/dungeon_tilemap.png" id="1_km3tr"] [resource] atlas = ExtResource("1_km3tr") diff --git a/assets/terrain/tilesets/kenney_obstacles.tres b/assets/terrain/tilesets/kenney_obstacles.tres deleted file mode 100644 index e573272a..00000000 --- a/assets/terrain/tilesets/kenney_obstacles.tres +++ /dev/null @@ -1,460 +0,0 @@ -[gd_resource type="TileSet" load_steps=5 format=3 uid="uid://biq84075xlypd"] - -[ext_resource type="Texture2D" uid="uid://d2qfi5sncf72b" path="res://assets/terrain/town_tilemap.png" id="1_g3gb6"] -[ext_resource type="Texture2D" uid="uid://dm4h0uo6gjp22" path="res://assets/terrain/dungeon_tilemap.png" id="2_ou4ia"] - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_2gcu3"] -texture = ExtResource("1_g3gb6") -separation = Vector2i(1, 1) -3:1/0 = 0 -3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:0/0 = 0 -3:2/0 = 0 -3:2/0/terrain_set = 0 -3:2/0/terrain = 1 -3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:2/0 = 0 -4:2/0/terrain_set = 0 -4:2/0/terrain = 0 -4:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:1/0 = 0 -4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:0/0 = 0 -5:0/0 = 0 -5:0/0/terrain_set = 0 -5:0/0/terrain = 0 -5:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:1/0 = 0 -5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:2/0 = 0 -5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:2/0 = 0 -6:2/0/terrain_set = 0 -6:2/0/terrain = 0 -6:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:2/0/terrains_peering_bit/right_side = 0 -6:2/0/terrains_peering_bit/top_side = 0 -7:2/0 = 0 -7:2/0/terrain_set = 0 -7:2/0/terrain = 0 -7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0/terrains_peering_bit/top_side = 0 -8:2/0 = 0 -8:2/0/terrain_set = 0 -8:2/0/terrain = 0 -8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0/terrains_peering_bit/left_side = 0 -8:2/0/terrains_peering_bit/top_side = 0 -8:1/0 = 0 -8:1/0/terrain_set = 0 -8:1/0/terrain = 0 -8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:1/0/terrains_peering_bit/left_side = 0 -8:0/0 = 0 -8:0/0/terrain_set = 0 -8:0/0/terrain = 0 -8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:0/0/terrains_peering_bit/bottom_side = 0 -8:0/0/terrains_peering_bit/left_side = 0 -7:0/0 = 0 -7:0/0/terrain_set = 0 -7:0/0/terrain = 0 -7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0/terrains_peering_bit/bottom_side = 0 -6:0/0 = 0 -6:0/0/terrain_set = 0 -6:0/0/terrain = 0 -6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:0/0/terrains_peering_bit/right_side = 0 -6:0/0/terrains_peering_bit/bottom_side = 0 -6:1/0 = 0 -6:1/0/terrain_set = 0 -6:1/0/terrain = 0 -6:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:1/0/terrains_peering_bit/right_side = 0 -7:1/0 = 0 -7:1/0/terrain_set = 0 -7:1/0/terrain = 0 -7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:1/0/terrains_peering_bit/right_side = 0 -7:1/0/terrains_peering_bit/bottom_side = 0 -7:1/0/terrains_peering_bit/left_side = 0 -7:1/0/terrains_peering_bit/top_side = 0 -9:1/0 = 0 -9:1/0/terrain_set = 0 -9:1/0/terrain = 1 -9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:1/0/terrains_peering_bit/right_side = 1 -9:2/0 = 0 -9:2/0/terrain_set = 0 -9:2/0/terrain = 1 -9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:2/0/terrains_peering_bit/right_side = 1 -9:2/0/terrains_peering_bit/top_side = 1 -10:2/0 = 0 -10:2/0/terrain_set = 0 -10:2/0/terrain = 1 -10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:2/0/terrains_peering_bit/top_side = 1 -11:2/0 = 0 -11:2/0/terrain_set = 0 -11:2/0/terrain = 1 -11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:2/0/terrains_peering_bit/left_side = 1 -11:2/0/terrains_peering_bit/top_side = 1 -11:1/0 = 0 -11:1/0/terrain_set = 0 -11:1/0/terrain = 1 -11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:1/0/terrains_peering_bit/left_side = 1 -11:0/0 = 0 -11:0/0/terrain_set = 0 -11:0/0/terrain = 1 -11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:0/0/terrains_peering_bit/bottom_side = 1 -11:0/0/terrains_peering_bit/left_side = 1 -10:0/0 = 0 -10:0/0/terrain_set = 0 -10:0/0/terrain = 1 -10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:0/0/terrains_peering_bit/bottom_side = 1 -9:0/0 = 0 -9:0/0/terrain_set = 0 -9:0/0/terrain = 1 -9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:0/0/terrains_peering_bit/right_side = 1 -9:0/0/terrains_peering_bit/bottom_side = 1 -10:1/0 = 0 -10:1/0/terrain_set = 0 -10:1/0/terrain = 1 -10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:1/0/terrains_peering_bit/right_side = 1 -10:1/0/terrains_peering_bit/bottom_side = 1 -10:1/0/terrains_peering_bit/left_side = 1 -10:1/0/terrains_peering_bit/top_side = 1 -10:6/0 = 0 -10:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:6/0 = 0 -9:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:6/0 = 0 -8:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:5/0 = 0 -8:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:4/0 = 0 -8:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:3/0 = 0 -8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:3/0 = 0 -9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:3/0 = 0 -10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:4/0 = 0 -10:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:4/0 = 0 -11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:5/0 = 0 -11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:5/0 = 0 -10:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:5/0 = 0 -9:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:3/0 = 0 -11:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -0:8/0 = 0 -0:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:8/0 = 0 -1:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:8/0 = 0 -2:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:9/0 = 0 -2:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:10/0 = 0 -2:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:10/0 = 0 -1:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -0:10/0 = 0 -0:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -0:9/0 = 0 -0:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:9/0 = 0 -1:9/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:8/0 = 0 -3:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:8/0 = 0 -4:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:8/0 = 0 -5:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:8/0 = 0 -6:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:10/0 = 0 -6:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:10/0 = 0 -5:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:10/0 = 0 -4:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:10/0 = 0 -3:10/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:9/0 = 0 -4:9/0 = 0 -5:9/0 = 0 -6:9/0 = 0 -7:6/0 = 0 -7:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:5/0 = 0 -7:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:4/0 = 0 -7:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:4/0 = 0 -6:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:4/0 = 0 -5:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:4/0 = 0 -4:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:4/0 = 0 -3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:4/0 = 0 -2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:4/0 = 0 -1:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -0:4/0 = 0 -0:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -0:5/0 = 0 -0:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -0:6/0 = 0 -0:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:6/0 = 0 -1:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:6/0 = 0 -3:6/0 = 0 -3:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:6/0 = 0 -4:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:6/0 = 0 -5:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:6/0 = 0 -6:5/0 = 0 -6:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:5/0 = 0 -5:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:5/0 = 0 -4:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:5/0 = 0 -3:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:5/0 = 0 -2:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:5/0 = 0 -1:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:7/0 = 0 -4:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -0:7/0 = 0 -0:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:7/0 = 0 -1:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:7/0 = 0 -5:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:6/0 = 0 -11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:7/0 = 0 -10:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:8/0 = 0 -8:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:7/0 = 0 -7:8/0 = 0 -7:3/0 = 0 -7:3/0/terrain_set = 1 -7:3/0/terrain = 2 -6:3/0 = 0 -6:3/0/terrain_set = 1 -6:3/0/terrain = 0 -6:3/0/terrains_peering_bit/bottom_right_corner = 0 -6:3/0/terrains_peering_bit/top_left_corner = 0 -6:3/0/terrains_peering_bit/top_right_corner = 0 -5:3/0 = 0 -5:3/0/terrain_set = 1 -5:3/0/terrain = 0 -5:3/0/terrains_peering_bit/bottom_left_corner = 0 -5:3/0/terrains_peering_bit/top_left_corner = 0 -5:3/0/terrains_peering_bit/top_right_corner = 0 -4:3/0 = 0 -4:3/0/terrain_set = 1 -4:3/0/terrain = 0 -4:3/0/terrains_peering_bit/bottom_right_corner = 0 -4:3/0/terrains_peering_bit/bottom_left_corner = 0 -4:3/0/terrains_peering_bit/top_left_corner = 0 -3:3/0 = 0 -3:3/0/terrain_set = 1 -3:3/0/terrain = 0 -3:3/0/terrains_peering_bit/bottom_right_corner = 0 -3:3/0/terrains_peering_bit/bottom_left_corner = 0 -3:3/0/terrains_peering_bit/top_right_corner = 0 -2:3/0 = 0 -2:3/0/terrain_set = 1 -2:3/0/terrain = 0 -2:3/0/terrains_peering_bit/top_left_corner = 0 -1:3/0 = 0 -1:3/0/terrain_set = 1 -1:3/0/terrain = 0 -1:3/0/terrains_peering_bit/top_left_corner = 0 -1:3/0/terrains_peering_bit/top_right_corner = 0 -0:3/0 = 0 -0:3/0/terrain_set = 1 -0:3/0/terrain = 0 -0:3/0/terrains_peering_bit/top_right_corner = 0 -0:2/0 = 0 -0:2/0/terrain_set = 1 -0:2/0/terrain = 0 -0:2/0/terrains_peering_bit/bottom_right_corner = 0 -0:2/0/terrains_peering_bit/top_right_corner = 0 -1:2/0 = 0 -1:2/0/terrain_set = 1 -1:2/0/terrain = 0 -1:2/0/terrains_peering_bit/bottom_right_corner = 0 -1:2/0/terrains_peering_bit/bottom_left_corner = 0 -1:2/0/terrains_peering_bit/top_left_corner = 0 -1:2/0/terrains_peering_bit/top_right_corner = 0 -2:2/0 = 0 -2:2/0/terrain_set = 1 -2:2/0/terrain = 0 -2:2/0/terrains_peering_bit/bottom_left_corner = 0 -2:2/0/terrains_peering_bit/top_left_corner = 0 -2:1/0 = 0 -2:1/0/terrain_set = 1 -2:1/0/terrain = 0 -2:1/0/terrains_peering_bit/bottom_left_corner = 0 -2:0/0 = 0 -2:0/0/terrain_set = 1 -2:0/0/terrain = 1 -2:0/0/terrains_peering_bit/bottom_right_corner = 1 -2:0/0/terrains_peering_bit/bottom_left_corner = 1 -2:0/0/terrains_peering_bit/top_left_corner = 1 -2:0/0/terrains_peering_bit/top_right_corner = 1 -1:0/0 = 0 -1:0/0/terrain_set = 1 -1:0/0/terrain = 1 -1:0/0/terrains_peering_bit/bottom_right_corner = 1 -1:0/0/terrains_peering_bit/bottom_left_corner = 1 -1:0/0/terrains_peering_bit/top_left_corner = 1 -1:0/0/terrains_peering_bit/top_right_corner = 1 -0:0/0 = 0 -0:0/0/terrain_set = 1 -0:0/0/terrain = 1 -0:0/0/probability = 30.0 -0:0/0/terrains_peering_bit/bottom_right_corner = 1 -0:0/0/terrains_peering_bit/bottom_left_corner = 1 -0:0/0/terrains_peering_bit/top_left_corner = 1 -0:0/0/terrains_peering_bit/top_right_corner = 1 -0:1/0 = 0 -0:1/0/terrain_set = 1 -0:1/0/terrain = 0 -0:1/0/terrains_peering_bit/bottom_right_corner = 0 -1:1/0 = 0 -1:1/0/terrain_set = 1 -1:1/0/terrain = 0 -1:1/0/terrains_peering_bit/bottom_right_corner = 0 -1:1/0/terrains_peering_bit/bottom_left_corner = 0 -9:4/0 = 0 -9:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:8/0 = 0 -11:8/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:8/0 = 0 -11:10/0 = 0 -10:10/0 = 0 - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_xmrbd"] -texture = ExtResource("2_ou4ia") -separation = Vector2i(1, 1) -5:7/0 = 0 -5:7/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:5/0 = 0 -3:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:6/0 = 0 -3:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:6/0 = 0 -10:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -10:4/0 = 0 -10:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -9:4/0 = 0 -9:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -11:4/0 = 0 -11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:4/0 = 0 -4:4/0 = 0 -3:4/0 = 0 -2:4/0 = 0 -1:4/0 = 0 -0:4/0 = 0 -5:3/0 = 0 -5:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:3/0 = 0 -7:3/0 = 0 -8:3/0 = 0 -4:3/0 = 0 -4:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:2/0 = 0 -4:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:2/0 = 0 -5:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:3/0 = 0 -2:3/0 = 0 -1:3/0 = 0 -0:3/0 = 0 -0:2/0 = 0 -0:1/0 = 0 -0:0/0 = 0 -9:0/0 = 0 -8:0/0 = 0 -8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -8:2/0 = 0 -8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:0/0 = 0 -7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -7:2/0 = 0 -7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:2/0 = 0 -6:1/0 = 0 -6:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -6:0/0 = 0 -6:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:2/0 = 0 -1:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:2/0 = 0 -2:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:2/0 = 0 -3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:1/0 = 0 -3:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -3:0/0 = 0 -3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:0/0 = 0 -2:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:0/0 = 0 -1:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -1:1/0 = 0 -1:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -2:1/0 = 0 -2:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:1/0 = 0 -4:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:1/0 = 0 -5:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -5:0/0 = 0 -5:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) -4:0/0 = 0 -4:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) - -[resource] -physics_layer_0/collision_layer = 1 -terrain_set_0/mode = 2 -terrain_set_0/terrain_0/name = "GreenTrees 0" -terrain_set_0/terrain_0/color = Color(0.45098, 0.682353, 0.517647, 1) -terrain_set_0/terrain_1/name = "YellowTrees" -terrain_set_0/terrain_1/color = Color(0.823529, 0.74902, 0.529412, 1) -terrain_set_1/mode = 1 -terrain_set_1/terrain_0/name = "Dirt" -terrain_set_1/terrain_0/color = Color(0.5, 0.34375, 0.25, 1) -terrain_set_1/terrain_1/name = "Grass" -terrain_set_1/terrain_1/color = Color(0.152941, 0.329412, 0, 1) -terrain_set_1/terrain_2/name = "Cobblestone" -terrain_set_1/terrain_2/color = Color(0.262745, 0.239216, 0.223529, 1) -sources/0 = SubResource("TileSetAtlasSource_2gcu3") -sources/1 = SubResource("TileSetAtlasSource_xmrbd") diff --git a/assets/terrain/tilesets/kenney_terrain.tres b/assets/terrain/tilesets/kenney_terrain.tres deleted file mode 100644 index 3381aad6..00000000 --- a/assets/terrain/tilesets/kenney_terrain.tres +++ /dev/null @@ -1,130 +0,0 @@ -[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://ba2bnli4c27pk"] - -[ext_resource type="Texture2D" uid="uid://d2qfi5sncf72b" path="res://assets/terrain/town_tilemap.png" id="1_tusk5"] - -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_4cs30"] -texture = ExtResource("1_tusk5") -separation = Vector2i(1, 1) -2:0/0 = 0 -2:0/0/terrain_set = 0 -2:0/0/terrain = 0 -2:0/0/terrains_peering_bit/bottom_right_corner = 0 -2:0/0/terrains_peering_bit/bottom_left_corner = 0 -2:0/0/terrains_peering_bit/top_left_corner = 0 -2:0/0/terrains_peering_bit/top_right_corner = 0 -1:0/0 = 0 -1:0/0/terrain_set = 0 -1:0/0/terrain = 0 -1:0/0/terrains_peering_bit/bottom_right_corner = 0 -1:0/0/terrains_peering_bit/bottom_left_corner = 0 -1:0/0/terrains_peering_bit/top_left_corner = 0 -1:0/0/terrains_peering_bit/top_right_corner = 0 -0:0/0 = 0 -0:0/0/terrain_set = 0 -0:0/0/terrain = 0 -0:0/0/probability = 25.0 -0:0/0/terrains_peering_bit/bottom_right_corner = 0 -0:0/0/terrains_peering_bit/bottom_left_corner = 0 -0:0/0/terrains_peering_bit/top_left_corner = 0 -0:0/0/terrains_peering_bit/top_right_corner = 0 -0:1/0 = 0 -0:1/0/terrain_set = 0 -0:1/0/terrain = 1 -0:1/0/terrains_peering_bit/bottom_right_corner = 1 -0:1/0/terrains_peering_bit/bottom_left_corner = 0 -0:1/0/terrains_peering_bit/top_left_corner = 0 -0:1/0/terrains_peering_bit/top_right_corner = 0 -1:1/0 = 0 -1:1/0/terrain_set = 0 -1:1/0/terrain = 1 -1:1/0/terrains_peering_bit/bottom_right_corner = 1 -1:1/0/terrains_peering_bit/bottom_left_corner = 1 -1:1/0/terrains_peering_bit/top_left_corner = 0 -1:1/0/terrains_peering_bit/top_right_corner = 0 -2:1/0 = 0 -2:1/0/terrain_set = 0 -2:1/0/terrain = 1 -2:1/0/terrains_peering_bit/bottom_right_corner = 0 -2:1/0/terrains_peering_bit/bottom_left_corner = 1 -2:1/0/terrains_peering_bit/top_left_corner = 0 -2:1/0/terrains_peering_bit/top_right_corner = 0 -2:2/0 = 0 -2:2/0/terrain_set = 0 -2:2/0/terrain = 1 -2:2/0/terrains_peering_bit/bottom_right_corner = 0 -2:2/0/terrains_peering_bit/bottom_left_corner = 1 -2:2/0/terrains_peering_bit/top_left_corner = 1 -2:2/0/terrains_peering_bit/top_right_corner = 0 -1:2/0 = 0 -1:2/0/terrain_set = 0 -1:2/0/terrain = 1 -1:2/0/terrains_peering_bit/bottom_right_corner = 1 -1:2/0/terrains_peering_bit/bottom_left_corner = 1 -1:2/0/terrains_peering_bit/top_left_corner = 1 -1:2/0/terrains_peering_bit/top_right_corner = 1 -0:2/0 = 0 -0:2/0/terrain_set = 0 -0:2/0/terrain = 1 -0:2/0/terrains_peering_bit/bottom_right_corner = 1 -0:2/0/terrains_peering_bit/bottom_left_corner = 0 -0:2/0/terrains_peering_bit/top_left_corner = 0 -0:2/0/terrains_peering_bit/top_right_corner = 1 -0:3/0 = 0 -0:3/0/terrain_set = 0 -0:3/0/terrain = 1 -0:3/0/terrains_peering_bit/bottom_right_corner = 0 -0:3/0/terrains_peering_bit/bottom_left_corner = 0 -0:3/0/terrains_peering_bit/top_left_corner = 0 -0:3/0/terrains_peering_bit/top_right_corner = 1 -1:3/0 = 0 -1:3/0/terrain_set = 0 -1:3/0/terrain = 1 -1:3/0/terrains_peering_bit/bottom_right_corner = 0 -1:3/0/terrains_peering_bit/bottom_left_corner = 0 -1:3/0/terrains_peering_bit/top_left_corner = 1 -1:3/0/terrains_peering_bit/top_right_corner = 1 -2:3/0 = 0 -2:3/0/terrain_set = 0 -2:3/0/terrain = 1 -2:3/0/terrains_peering_bit/bottom_right_corner = 0 -2:3/0/terrains_peering_bit/bottom_left_corner = 0 -2:3/0/terrains_peering_bit/top_left_corner = 1 -2:3/0/terrains_peering_bit/top_right_corner = 0 -3:3/0 = 0 -3:3/0/terrain_set = 0 -3:3/0/terrain = 1 -3:3/0/terrains_peering_bit/bottom_right_corner = 1 -3:3/0/terrains_peering_bit/bottom_left_corner = 1 -3:3/0/terrains_peering_bit/top_left_corner = 0 -3:3/0/terrains_peering_bit/top_right_corner = 1 -4:3/0 = 0 -4:3/0/terrain_set = 0 -4:3/0/terrain = 1 -4:3/0/terrains_peering_bit/bottom_right_corner = 1 -4:3/0/terrains_peering_bit/bottom_left_corner = 1 -4:3/0/terrains_peering_bit/top_left_corner = 1 -4:3/0/terrains_peering_bit/top_right_corner = 0 -5:3/0 = 0 -5:3/0/terrain_set = 0 -5:3/0/terrain = 1 -5:3/0/terrains_peering_bit/bottom_right_corner = 0 -5:3/0/terrains_peering_bit/bottom_left_corner = 1 -5:3/0/terrains_peering_bit/top_left_corner = 1 -5:3/0/terrains_peering_bit/top_right_corner = 1 -6:3/0 = 0 -6:3/0/terrain_set = 0 -6:3/0/terrain = 1 -6:3/0/terrains_peering_bit/bottom_right_corner = 1 -6:3/0/terrains_peering_bit/bottom_left_corner = 0 -6:3/0/terrains_peering_bit/top_left_corner = 1 -6:3/0/terrains_peering_bit/top_right_corner = 1 -7:3/0 = 0 -7:3/0/terrain_set = 0 - -[resource] -terrain_set_0/mode = 1 -terrain_set_0/terrain_0/name = "Grass" -terrain_set_0/terrain_0/color = Color(0, 0.215686, 0.0117647, 1) -terrain_set_0/terrain_1/name = "Dirt" -terrain_set_0/terrain_1/color = Color(0.262745, 0.223529, 0.113725, 1) -sources/0 = SubResource("TileSetAtlasSource_4cs30") diff --git a/assets/arenas/steppes.png b/combat/arenas/steppes.png similarity index 100% rename from assets/arenas/steppes.png rename to combat/arenas/steppes.png diff --git a/assets/arenas/steppes.png.import b/combat/arenas/steppes.png.import similarity index 72% rename from assets/arenas/steppes.png.import rename to combat/arenas/steppes.png.import index 948cb5f2..4ab23cb4 100644 --- a/assets/arenas/steppes.png.import +++ b/combat/arenas/steppes.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://w55nt3s833tb" -path="res://.godot/imported/steppes.png-0c1adb5bb8416f2d7d47125d17dceb0f.ctex" +path="res://.godot/imported/steppes.png-f6191cbc6b9ecb70124594dd367bfb90.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/arenas/steppes.png" -dest_files=["res://.godot/imported/steppes.png-0c1adb5bb8416f2d7d47125d17dceb0f.ctex"] +source_file="res://combat/arenas/steppes.png" +dest_files=["res://.godot/imported/steppes.png-f6191cbc6b9ecb70124594dd367bfb90.ctex"] [params] diff --git a/battlers/bear/bear.png b/combat/battlers/bear/bear.png similarity index 100% rename from battlers/bear/bear.png rename to combat/battlers/bear/bear.png diff --git a/battlers/bear/bear.png.import b/combat/battlers/bear/bear.png.import similarity index 72% rename from battlers/bear/bear.png.import rename to combat/battlers/bear/bear.png.import index 142bf936..2bc35ed7 100644 --- a/battlers/bear/bear.png.import +++ b/combat/battlers/bear/bear.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://pkp6t20skjpe" -path="res://.godot/imported/bear.png-d9f6b9473ae947928a0c0213226688a4.ctex" +path="res://.godot/imported/bear.png-915fb881d65bd45e02e117cf8f2d101c.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://battlers/bear/bear.png" -dest_files=["res://.godot/imported/bear.png-d9f6b9473ae947928a0c0213226688a4.ctex"] +source_file="res://combat/battlers/bear/bear.png" +dest_files=["res://.godot/imported/bear.png-915fb881d65bd45e02e117cf8f2d101c.ctex"] [params] diff --git a/battlers/bear/bear_anim.tscn b/combat/battlers/bear/bear_anim.tscn similarity index 86% rename from battlers/bear/bear_anim.tscn rename to combat/battlers/bear/bear_anim.tscn index 62d97cdd..f2f9e0a5 100644 --- a/battlers/bear/bear_anim.tscn +++ b/combat/battlers/bear/bear_anim.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=3 uid="uid://bl8bmbt7v3lrj"] [ext_resource type="PackedScene" uid="uid://badexg85lctrq" path="res://src/combat/battlers/battler_anim.tscn" id="1_cpjl2"] -[ext_resource type="Texture2D" uid="uid://pkp6t20skjpe" path="res://battlers/bear/bear.png" id="2_3eyxi"] -[ext_resource type="AnimationLibrary" uid="uid://o2ktahx2nkki" path="res://battlers/default_battler_animations.res" id="2_c0d1t"] +[ext_resource type="Texture2D" uid="uid://pkp6t20skjpe" path="res://combat/battlers/bear/bear.png" id="2_3eyxi"] +[ext_resource type="AnimationLibrary" uid="uid://o2ktahx2nkki" path="res://combat/battlers/default_battler_animations.res" id="2_c0d1t"] [node name="BearAnim" instance=ExtResource("1_cpjl2")] battler_icon = ExtResource("2_3eyxi") diff --git a/battlers/bear/bear_stats.tres b/combat/battlers/bear/bear_stats.tres similarity index 100% rename from battlers/bear/bear_stats.tres rename to combat/battlers/bear/bear_stats.tres diff --git a/battlers/bear/focus_attack.tres b/combat/battlers/bear/focus_attack.tres similarity index 91% rename from battlers/bear/focus_attack.tres rename to combat/battlers/bear/focus_attack.tres index 08a5eb22..b55a5a1b 100644 --- a/battlers/bear/focus_attack.tres +++ b/combat/battlers/bear/focus_attack.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="StatsBattlerAction" load_steps=3 format=3 uid="uid://ctimffr7v621e"] -[ext_resource type="Texture2D" uid="uid://cch8ku256ts3y" path="res://battlers/bear/icon_raise.svg" id="1_2rya6"] +[ext_resource type="Texture2D" uid="uid://cch8ku256ts3y" path="res://combat/battlers/bear/icon_raise.svg" id="1_2rya6"] [ext_resource type="Script" uid="uid://lq2mfixji1w5" path="res://src/combat/actions/battler_action_modify_stats.gd" id="1_4j0yh"] [resource] diff --git a/battlers/bear/icon_punch.svg b/combat/battlers/bear/icon_punch.svg similarity index 100% rename from battlers/bear/icon_punch.svg rename to combat/battlers/bear/icon_punch.svg diff --git a/battlers/bear/icon_punch.svg.import b/combat/battlers/bear/icon_punch.svg.import similarity index 74% rename from battlers/bear/icon_punch.svg.import rename to combat/battlers/bear/icon_punch.svg.import index 78878825..b969372a 100644 --- a/battlers/bear/icon_punch.svg.import +++ b/combat/battlers/bear/icon_punch.svg.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://y2fg5cf57i7t" -path="res://.godot/imported/icon_punch.svg-6d799c200f6df8ec7b4a58aceab6f3c1.ctex" +path="res://.godot/imported/icon_punch.svg-6d2300056c12971c2b6ce8af11c11bce.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://battlers/bear/icon_punch.svg" -dest_files=["res://.godot/imported/icon_punch.svg-6d799c200f6df8ec7b4a58aceab6f3c1.ctex"] +source_file="res://combat/battlers/bear/icon_punch.svg" +dest_files=["res://.godot/imported/icon_punch.svg-6d2300056c12971c2b6ce8af11c11bce.ctex"] [params] diff --git a/battlers/bear/icon_raise.svg b/combat/battlers/bear/icon_raise.svg similarity index 100% rename from battlers/bear/icon_raise.svg rename to combat/battlers/bear/icon_raise.svg diff --git a/battlers/bear/icon_raise.svg.import b/combat/battlers/bear/icon_raise.svg.import similarity index 74% rename from battlers/bear/icon_raise.svg.import rename to combat/battlers/bear/icon_raise.svg.import index 1db250ab..41511c68 100644 --- a/battlers/bear/icon_raise.svg.import +++ b/combat/battlers/bear/icon_raise.svg.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cch8ku256ts3y" -path="res://.godot/imported/icon_raise.svg-8cc6d0caa7d3b4f88cdc8f1a163e16bf.ctex" +path="res://.godot/imported/icon_raise.svg-283e1597326be7ec66d64acdc699bf56.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://battlers/bear/icon_raise.svg" -dest_files=["res://.godot/imported/icon_raise.svg-8cc6d0caa7d3b4f88cdc8f1a163e16bf.ctex"] +source_file="res://combat/battlers/bear/icon_raise.svg" +dest_files=["res://.godot/imported/icon_raise.svg-283e1597326be7ec66d64acdc699bf56.ctex"] [params] diff --git a/battlers/bear/player_melee_action.tres b/combat/battlers/bear/player_melee_action.tres similarity index 91% rename from battlers/bear/player_melee_action.tres rename to combat/battlers/bear/player_melee_action.tres index 7d353461..e4f929cb 100644 --- a/battlers/bear/player_melee_action.tres +++ b/combat/battlers/bear/player_melee_action.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="AttackBattlerAction" load_steps=3 format=3 uid="uid://dp7wo0l4es3w4"] -[ext_resource type="Texture2D" uid="uid://y2fg5cf57i7t" path="res://battlers/bear/icon_punch.svg" id="1_f24qp"] +[ext_resource type="Texture2D" uid="uid://y2fg5cf57i7t" path="res://combat/battlers/bear/icon_punch.svg" id="1_f24qp"] [ext_resource type="Script" uid="uid://cpbigevghfrjn" path="res://src/combat/actions/battler_action_attack.gd" id="1_oh0gs"] [resource] diff --git a/battlers/bugcat/bugcat.png b/combat/battlers/bugcat/bugcat.png similarity index 100% rename from battlers/bugcat/bugcat.png rename to combat/battlers/bugcat/bugcat.png diff --git a/battlers/bugcat/bugcat.png.import b/combat/battlers/bugcat/bugcat.png.import similarity index 71% rename from battlers/bugcat/bugcat.png.import rename to combat/battlers/bugcat/bugcat.png.import index 03f277fd..13822c74 100644 --- a/battlers/bugcat/bugcat.png.import +++ b/combat/battlers/bugcat/bugcat.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://e4b6flk7roy3" -path="res://.godot/imported/bugcat.png-6bcd1fa6b277bd4c4e8a39476fa5bbe8.ctex" +path="res://.godot/imported/bugcat.png-f145a36c3b8b7a310a8c450ee1ee985b.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://battlers/bugcat/bugcat.png" -dest_files=["res://.godot/imported/bugcat.png-6bcd1fa6b277bd4c4e8a39476fa5bbe8.ctex"] +source_file="res://combat/battlers/bugcat/bugcat.png" +dest_files=["res://.godot/imported/bugcat.png-f145a36c3b8b7a310a8c450ee1ee985b.ctex"] [params] diff --git a/battlers/bugcat/bugcat_anim.tscn b/combat/battlers/bugcat/bugcat_anim.tscn similarity index 98% rename from battlers/bugcat/bugcat_anim.tscn rename to combat/battlers/bugcat/bugcat_anim.tscn index 49f4c633..9b7753de 100644 --- a/battlers/bugcat/bugcat_anim.tscn +++ b/combat/battlers/bugcat/bugcat_anim.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=7 format=3 uid="uid://ugsq7u4cue4w"] [ext_resource type="PackedScene" uid="uid://badexg85lctrq" path="res://src/combat/battlers/battler_anim.tscn" id="1_ws2uh"] -[ext_resource type="Texture2D" uid="uid://e4b6flk7roy3" path="res://battlers/bugcat/bugcat.png" id="2_jiam4"] +[ext_resource type="Texture2D" uid="uid://e4b6flk7roy3" path="res://combat/battlers/bugcat/bugcat.png" id="2_jiam4"] [sub_resource type="Animation" id="Animation_r4wpi"] length = 0.001 diff --git a/battlers/bugcat/bugcat_stats.tres b/combat/battlers/bugcat/bugcat_stats.tres similarity index 100% rename from battlers/bugcat/bugcat_stats.tres rename to combat/battlers/bugcat/bugcat_stats.tres diff --git a/battlers/bugcat/quick_attack.tres b/combat/battlers/bugcat/quick_attack.tres similarity index 100% rename from battlers/bugcat/quick_attack.tres rename to combat/battlers/bugcat/quick_attack.tres diff --git a/battlers/default_battler_animations.res b/combat/battlers/default_battler_animations.res similarity index 100% rename from battlers/default_battler_animations.res rename to combat/battlers/default_battler_animations.res diff --git a/battlers/squirrel/area_attack.tres b/combat/battlers/squirrel/area_attack.tres similarity index 90% rename from battlers/squirrel/area_attack.tres rename to combat/battlers/squirrel/area_attack.tres index e3c38a76..95385ac5 100644 --- a/battlers/squirrel/area_attack.tres +++ b/combat/battlers/squirrel/area_attack.tres @@ -1,6 +1,6 @@ [gd_resource type="Resource" script_class="AttackBattlerAction" load_steps=3 format=3 uid="uid://c01ilo1olkfsm"] -[ext_resource type="Texture2D" uid="uid://dt7jcphqs175b" path="res://battlers/squirrel/icon_arrows.svg" id="1_eedy7"] +[ext_resource type="Texture2D" uid="uid://dt7jcphqs175b" path="res://combat/battlers/squirrel/icon_arrows.svg" id="1_eedy7"] [ext_resource type="Script" uid="uid://cpbigevghfrjn" path="res://src/combat/actions/battler_action_attack.gd" id="2_x25ju"] [resource] diff --git a/battlers/squirrel/heal_friendly.tres b/combat/battlers/squirrel/heal_friendly.tres similarity index 89% rename from battlers/squirrel/heal_friendly.tres rename to combat/battlers/squirrel/heal_friendly.tres index fa16ad2f..00883d1d 100644 --- a/battlers/squirrel/heal_friendly.tres +++ b/combat/battlers/squirrel/heal_friendly.tres @@ -1,7 +1,7 @@ [gd_resource type="Resource" script_class="HealBattlerAction" load_steps=3 format=3 uid="uid://cfj3osdc334ks"] [ext_resource type="Script" uid="uid://d2chwgobkstjb" path="res://src/combat/actions/battler_action_heal.gd" id="1_knane"] -[ext_resource type="Texture2D" uid="uid://colusv412eplq" path="res://battlers/squirrel/icon_first_aid.svg" id="1_rw7rc"] +[ext_resource type="Texture2D" uid="uid://colusv412eplq" path="res://combat/battlers/squirrel/icon_first_aid.svg" id="1_rw7rc"] [resource] script = ExtResource("1_knane") diff --git a/battlers/squirrel/icon_arrows.svg b/combat/battlers/squirrel/icon_arrows.svg similarity index 100% rename from battlers/squirrel/icon_arrows.svg rename to combat/battlers/squirrel/icon_arrows.svg diff --git a/battlers/squirrel/icon_arrows.svg.import b/combat/battlers/squirrel/icon_arrows.svg.import similarity index 73% rename from battlers/squirrel/icon_arrows.svg.import rename to combat/battlers/squirrel/icon_arrows.svg.import index 18006e2c..941554d4 100644 --- a/battlers/squirrel/icon_arrows.svg.import +++ b/combat/battlers/squirrel/icon_arrows.svg.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://dt7jcphqs175b" -path="res://.godot/imported/icon_arrows.svg-e9d0eb8c72b6e790e8382165261553d2.ctex" +path="res://.godot/imported/icon_arrows.svg-93f11bfc028871112e9f653cbdf9e46b.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://battlers/squirrel/icon_arrows.svg" -dest_files=["res://.godot/imported/icon_arrows.svg-e9d0eb8c72b6e790e8382165261553d2.ctex"] +source_file="res://combat/battlers/squirrel/icon_arrows.svg" +dest_files=["res://.godot/imported/icon_arrows.svg-93f11bfc028871112e9f653cbdf9e46b.ctex"] [params] diff --git a/battlers/squirrel/icon_first_aid.svg b/combat/battlers/squirrel/icon_first_aid.svg similarity index 100% rename from battlers/squirrel/icon_first_aid.svg rename to combat/battlers/squirrel/icon_first_aid.svg diff --git a/battlers/squirrel/icon_first_aid.svg.import b/combat/battlers/squirrel/icon_first_aid.svg.import similarity index 72% rename from battlers/squirrel/icon_first_aid.svg.import rename to combat/battlers/squirrel/icon_first_aid.svg.import index 24517653..b0285a1a 100644 --- a/battlers/squirrel/icon_first_aid.svg.import +++ b/combat/battlers/squirrel/icon_first_aid.svg.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://colusv412eplq" -path="res://.godot/imported/icon_first_aid.svg-ff1251835add65a82cee53975a6752d0.ctex" +path="res://.godot/imported/icon_first_aid.svg-d0a85ff7422b7c9ce7bc050e8b5116bc.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://battlers/squirrel/icon_first_aid.svg" -dest_files=["res://.godot/imported/icon_first_aid.svg-ff1251835add65a82cee53975a6752d0.ctex"] +source_file="res://combat/battlers/squirrel/icon_first_aid.svg" +dest_files=["res://.godot/imported/icon_first_aid.svg-d0a85ff7422b7c9ce7bc050e8b5116bc.ctex"] [params] diff --git a/battlers/squirrel/squirrel.png b/combat/battlers/squirrel/squirrel.png similarity index 100% rename from battlers/squirrel/squirrel.png rename to combat/battlers/squirrel/squirrel.png diff --git a/battlers/squirrel/squirrel.png.import b/combat/battlers/squirrel/squirrel.png.import similarity index 71% rename from battlers/squirrel/squirrel.png.import rename to combat/battlers/squirrel/squirrel.png.import index 7fd71e13..bf775c1e 100644 --- a/battlers/squirrel/squirrel.png.import +++ b/combat/battlers/squirrel/squirrel.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cbgfjvlm8kx4k" -path="res://.godot/imported/squirrel.png-bb11b94b7ff34e41e2a15e442af94dbd.ctex" +path="res://.godot/imported/squirrel.png-40b82afcd6713b60ce238e7a0780293f.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://battlers/squirrel/squirrel.png" -dest_files=["res://.godot/imported/squirrel.png-bb11b94b7ff34e41e2a15e442af94dbd.ctex"] +source_file="res://combat/battlers/squirrel/squirrel.png" +dest_files=["res://.godot/imported/squirrel.png-40b82afcd6713b60ce238e7a0780293f.ctex"] [params] diff --git a/battlers/squirrel/squirrel_anim.tscn b/combat/battlers/squirrel/squirrel_anim.tscn similarity index 98% rename from battlers/squirrel/squirrel_anim.tscn rename to combat/battlers/squirrel/squirrel_anim.tscn index 8d67994e..96dd0383 100644 --- a/battlers/squirrel/squirrel_anim.tscn +++ b/combat/battlers/squirrel/squirrel_anim.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=7 format=3 uid="uid://cch8nxgex1edr"] [ext_resource type="PackedScene" uid="uid://badexg85lctrq" path="res://src/combat/battlers/battler_anim.tscn" id="1_d3f8c"] -[ext_resource type="Texture2D" uid="uid://cbgfjvlm8kx4k" path="res://battlers/squirrel/squirrel.png" id="2_0aqb7"] +[ext_resource type="Texture2D" uid="uid://cbgfjvlm8kx4k" path="res://combat/battlers/squirrel/squirrel.png" id="2_0aqb7"] [sub_resource type="Animation" id="Animation_r4wpi"] length = 0.001 diff --git a/battlers/squirrel/squirrel_stats.tres b/combat/battlers/squirrel/squirrel_stats.tres similarity index 100% rename from battlers/squirrel/squirrel_stats.tres rename to combat/battlers/squirrel/squirrel_stats.tres diff --git a/battlers/wolf/area_attack.tres b/combat/battlers/wolf/area_attack.tres similarity index 100% rename from battlers/wolf/area_attack.tres rename to combat/battlers/wolf/area_attack.tres diff --git a/battlers/wolf/wolf.png b/combat/battlers/wolf/wolf.png similarity index 100% rename from battlers/wolf/wolf.png rename to combat/battlers/wolf/wolf.png diff --git a/battlers/wolf/wolf.png.import b/combat/battlers/wolf/wolf.png.import similarity index 72% rename from battlers/wolf/wolf.png.import rename to combat/battlers/wolf/wolf.png.import index 350d3a08..42e98bea 100644 --- a/battlers/wolf/wolf.png.import +++ b/combat/battlers/wolf/wolf.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://dr8cs6liv45hd" -path="res://.godot/imported/wolf.png-2e44d7d1ca536c33187b2fdb04e1615d.ctex" +path="res://.godot/imported/wolf.png-cc03016b83a6ef6d5230118d9606f3f6.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://battlers/wolf/wolf.png" -dest_files=["res://.godot/imported/wolf.png-2e44d7d1ca536c33187b2fdb04e1615d.ctex"] +source_file="res://combat/battlers/wolf/wolf.png" +dest_files=["res://.godot/imported/wolf.png-cc03016b83a6ef6d5230118d9606f3f6.ctex"] [params] diff --git a/battlers/wolf/wolf_anim.tscn b/combat/battlers/wolf/wolf_anim.tscn similarity index 86% rename from battlers/wolf/wolf_anim.tscn rename to combat/battlers/wolf/wolf_anim.tscn index 0ef6ebe7..08023cd8 100644 --- a/battlers/wolf/wolf_anim.tscn +++ b/combat/battlers/wolf/wolf_anim.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=4 format=3 uid="uid://8f7e4yxs3poj"] [ext_resource type="PackedScene" uid="uid://badexg85lctrq" path="res://src/combat/battlers/battler_anim.tscn" id="1_ffl4t"] -[ext_resource type="Texture2D" uid="uid://dr8cs6liv45hd" path="res://battlers/wolf/wolf.png" id="2_nnyj7"] -[ext_resource type="AnimationLibrary" uid="uid://o2ktahx2nkki" path="res://battlers/default_battler_animations.res" id="2_q1kws"] +[ext_resource type="Texture2D" uid="uid://dr8cs6liv45hd" path="res://combat/battlers/wolf/wolf.png" id="2_nnyj7"] +[ext_resource type="AnimationLibrary" uid="uid://o2ktahx2nkki" path="res://combat/battlers/default_battler_animations.res" id="2_q1kws"] [node name="WolfAnim" instance=ExtResource("1_ffl4t")] battler_icon = ExtResource("2_nnyj7") diff --git a/battlers/wolf/wolf_stats.tres b/combat/battlers/wolf/wolf_stats.tres similarity index 100% rename from battlers/wolf/wolf_stats.tres rename to combat/battlers/wolf/wolf_stats.tres diff --git a/maps/default_gameboard.tres b/maps/default_gameboard.tres deleted file mode 100644 index 4396be5c..00000000 --- a/maps/default_gameboard.tres +++ /dev/null @@ -1,8 +0,0 @@ -[gd_resource type="Resource" script_class="Gameboard" load_steps=2 format=3 uid="uid://cbnicto2l2ur2"] - -[ext_resource type="Script" uid="uid://brfwvujo4oa4e" path="res://src/field/gameboard/gameboard.gd" id="1_jnxdl"] - -[resource] -script = ExtResource("1_jnxdl") -boundaries = Rect2i(0, 0, 60, 35) -cell_size = Vector2i(16, 16) diff --git a/assets/characters/character_generic.png b/overworld/characters/character_generic.png similarity index 100% rename from assets/characters/character_generic.png rename to overworld/characters/character_generic.png diff --git a/assets/characters/character_generic.png.import b/overworld/characters/character_generic.png.import similarity index 69% rename from assets/characters/character_generic.png.import rename to overworld/characters/character_generic.png.import index 5f12701f..b892a6ce 100644 --- a/assets/characters/character_generic.png.import +++ b/overworld/characters/character_generic.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://doea2mk0aaedo" -path="res://.godot/imported/character_generic.png-3a713b03097983e6fd591ab469a0af67.ctex" +path="res://.godot/imported/character_generic.png-4e0f13544e17c0aa3eb7b02b6ecba2b0.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/characters/character_generic.png" -dest_files=["res://.godot/imported/character_generic.png-3a713b03097983e6fd591ab469a0af67.ctex"] +source_file="res://overworld/characters/character_generic.png" +dest_files=["res://.godot/imported/character_generic.png-4e0f13544e17c0aa3eb7b02b6ecba2b0.ctex"] [params] diff --git a/overworld/characters/default_animations/RESET.anim b/overworld/characters/default_animations/RESET.anim new file mode 100644 index 00000000..b6127bc4 Binary files /dev/null and b/overworld/characters/default_animations/RESET.anim differ diff --git a/overworld/characters/default_animations/idle_e.anim b/overworld/characters/default_animations/idle_e.anim new file mode 100644 index 00000000..74625ac8 Binary files /dev/null and b/overworld/characters/default_animations/idle_e.anim differ diff --git a/overworld/characters/default_animations/idle_n.anim b/overworld/characters/default_animations/idle_n.anim new file mode 100644 index 00000000..d20d24ff Binary files /dev/null and b/overworld/characters/default_animations/idle_n.anim differ diff --git a/overworld/characters/default_animations/idle_s.anim b/overworld/characters/default_animations/idle_s.anim new file mode 100644 index 00000000..fd979d08 Binary files /dev/null and b/overworld/characters/default_animations/idle_s.anim differ diff --git a/overworld/characters/default_animations/idle_w.anim b/overworld/characters/default_animations/idle_w.anim new file mode 100644 index 00000000..ff2185a5 Binary files /dev/null and b/overworld/characters/default_animations/idle_w.anim differ diff --git a/overworld/characters/default_animations/run_e.anim b/overworld/characters/default_animations/run_e.anim new file mode 100644 index 00000000..30631a5a Binary files /dev/null and b/overworld/characters/default_animations/run_e.anim differ diff --git a/overworld/characters/default_animations/run_n.anim b/overworld/characters/default_animations/run_n.anim new file mode 100644 index 00000000..d77f8aac Binary files /dev/null and b/overworld/characters/default_animations/run_n.anim differ diff --git a/overworld/characters/default_animations/run_s.anim b/overworld/characters/default_animations/run_s.anim new file mode 100644 index 00000000..9e99f9be Binary files /dev/null and b/overworld/characters/default_animations/run_s.anim differ diff --git a/overworld/characters/default_animations/run_w.anim b/overworld/characters/default_animations/run_w.anim new file mode 100644 index 00000000..a6eb0dec Binary files /dev/null and b/overworld/characters/default_animations/run_w.anim differ diff --git a/overworld/characters/default_animations/standard_animations.res b/overworld/characters/default_animations/standard_animations.res new file mode 100644 index 00000000..ad6ccbcf Binary files /dev/null and b/overworld/characters/default_animations/standard_animations.res differ diff --git a/assets/characters/generic.atlastex b/overworld/characters/generic.atlastex similarity index 100% rename from assets/characters/generic.atlastex rename to overworld/characters/generic.atlastex diff --git a/overworld/characters/generic_character_gfx.tscn b/overworld/characters/generic_character_gfx.tscn new file mode 100644 index 00000000..93b64797 --- /dev/null +++ b/overworld/characters/generic_character_gfx.tscn @@ -0,0 +1,19 @@ +[gd_scene load_steps=4 format=3 uid="uid://cdkha7cc72h35"] + +[ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_pdtfs"] +[ext_resource type="AnimationLibrary" uid="uid://dmmjb8ambpwar" path="res://overworld/characters/default_animations/standard_animations.res" id="2_ljcdi"] +[ext_resource type="Texture2D" uid="uid://doea2mk0aaedo" path="res://overworld/characters/character_generic.png" id="3_vttgk"] + +[node name="GenericAnimation" instance=ExtResource("1_pdtfs")] + +[node name="AnimationPlayer" parent="." index="0"] +libraries = { +&"": ExtResource("2_ljcdi") +} +autoplay = "idle" +speed_scale = 2.0 + +[node name="Sprite" parent="Anchor" index="0"] +texture = ExtResource("3_vttgk") +region_enabled = true +region_rect = Rect2(1, 1, 16, 16) diff --git a/assets/characters/ ghost.atlastex b/overworld/characters/ghost.atlastex similarity index 100% rename from assets/characters/ ghost.atlastex rename to overworld/characters/ghost.atlastex diff --git a/assets/characters/ghost_gfx.tscn b/overworld/characters/ghost_gfx.tscn similarity index 68% rename from assets/characters/ghost_gfx.tscn rename to overworld/characters/ghost_gfx.tscn index 9859f8a9..8b2c07e4 100644 --- a/assets/characters/ghost_gfx.tscn +++ b/overworld/characters/ghost_gfx.tscn @@ -1,14 +1,14 @@ -[gd_scene load_steps=7 format=3 uid="uid://cgwailb13nkcd"] +[gd_scene load_steps=6 format=3 uid="uid://cgwailb13nkcd"] [ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_iqw7y"] -[ext_resource type="Texture2D" uid="uid://dopua6orsf0bs" path="res://assets/characters/ ghost.atlastex" id="2_xwhv8"] +[ext_resource type="Texture2D" uid="uid://dopua6orsf0bs" path="res://overworld/characters/ghost.atlastex" id="2_ip52p"] [sub_resource type="Animation" id="Animation_sr8xj"] length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -24,7 +24,7 @@ loop_mode = 1 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -40,20 +40,13 @@ _data = { &"idle": SubResource("Animation_maeh2") } -[sub_resource type="RectangleShape2D" id="RectangleShape2D_b20ad"] -size = Vector2(16, 16) - [node name="GhostGFX" instance=ExtResource("1_iqw7y")] [node name="AnimationPlayer" parent="." index="0"] libraries = { -"": SubResource("AnimationLibrary_6yooh") +&"": SubResource("AnimationLibrary_6yooh") } autoplay = "idle" -[node name="CollisionShape2D" parent="Area2D" index="0"] -shape = SubResource("RectangleShape2D_b20ad") - -[node name="Sprite" parent="GFX" index="0"] -texture = ExtResource("2_xwhv8") -offset = Vector2(0, -6) +[node name="Sprite" parent="Anchor" index="0"] +texture = ExtResource("2_ip52p") diff --git a/assets/characters/gobot.atlastex b/overworld/characters/gobot.atlastex similarity index 100% rename from assets/characters/gobot.atlastex rename to overworld/characters/gobot.atlastex diff --git a/assets/characters/gobot_field.png b/overworld/characters/gobot_field.png similarity index 100% rename from assets/characters/gobot_field.png rename to overworld/characters/gobot_field.png diff --git a/assets/characters/gobot_field.png.import b/overworld/characters/gobot_field.png.import similarity index 70% rename from assets/characters/gobot_field.png.import rename to overworld/characters/gobot_field.png.import index 65bdadf2..d13f8a51 100644 --- a/assets/characters/gobot_field.png.import +++ b/overworld/characters/gobot_field.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://4ua1ohn2tllf" -path="res://.godot/imported/gobot_field.png-5f823b51a69fe9b11b884401a88434b5.ctex" +path="res://.godot/imported/gobot_field.png-501c279b4cdefbcc435594745ac2be2e.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/characters/gobot_field.png" -dest_files=["res://.godot/imported/gobot_field.png-5f823b51a69fe9b11b884401a88434b5.ctex"] +source_file="res://overworld/characters/gobot_field.png" +dest_files=["res://.godot/imported/gobot_field.png-501c279b4cdefbcc435594745ac2be2e.ctex"] [params] diff --git a/overworld/characters/gobot_gfx.tscn b/overworld/characters/gobot_gfx.tscn new file mode 100644 index 00000000..e6251650 --- /dev/null +++ b/overworld/characters/gobot_gfx.tscn @@ -0,0 +1,17 @@ +[gd_scene load_steps=4 format=3 uid="uid://qxua6ekob7fa"] + +[ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_ggnk7"] +[ext_resource type="AnimationLibrary" uid="uid://dmmjb8ambpwar" path="res://overworld/characters/default_animations/standard_animations.res" id="2_mw4lc"] +[ext_resource type="Texture2D" uid="uid://4ua1ohn2tllf" path="res://overworld/characters/gobot_field.png" id="3_rnaav"] + +[node name="GoBotGFX" instance=ExtResource("1_ggnk7")] + +[node name="AnimationPlayer" parent="." index="0"] +libraries = { +&"": ExtResource("2_mw4lc") +} + +[node name="Sprite" parent="Anchor" index="0"] +texture = ExtResource("3_rnaav") +region_enabled = true +region_rect = Rect2(1, 1, 16, 16) diff --git a/assets/characters/knight.atlastex b/overworld/characters/knight.atlastex similarity index 100% rename from assets/characters/knight.atlastex rename to overworld/characters/knight.atlastex diff --git a/assets/characters/knight_gfx.tscn b/overworld/characters/knight_gfx.tscn similarity index 68% rename from assets/characters/knight_gfx.tscn rename to overworld/characters/knight_gfx.tscn index 7f4e190c..170425c9 100644 --- a/assets/characters/knight_gfx.tscn +++ b/overworld/characters/knight_gfx.tscn @@ -1,14 +1,14 @@ -[gd_scene load_steps=7 format=3 uid="uid://se1wnxu5svgj"] +[gd_scene load_steps=6 format=3 uid="uid://se1wnxu5svgj"] [ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_c58iv"] -[ext_resource type="Texture2D" uid="uid://ti2vhkpokeib" path="res://assets/characters/knight.atlastex" id="2_i5oqc"] +[ext_resource type="Texture2D" uid="uid://ti2vhkpokeib" path="res://overworld/characters/knight.atlastex" id="2_f3pos"] [sub_resource type="Animation" id="Animation_sr8xj"] length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -24,7 +24,7 @@ loop_mode = 1 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -40,20 +40,13 @@ _data = { &"idle": SubResource("Animation_maeh2") } -[sub_resource type="RectangleShape2D" id="RectangleShape2D_b20ad"] -size = Vector2(16, 16) - [node name="KnightGFX" instance=ExtResource("1_c58iv")] [node name="AnimationPlayer" parent="." index="0"] -autoplay = "idle" libraries = { -"": SubResource("AnimationLibrary_6yooh") +&"": SubResource("AnimationLibrary_6yooh") } +autoplay = "idle" -[node name="CollisionShape2D" parent="Area2D" index="0"] -shape = SubResource("RectangleShape2D_b20ad") - -[node name="Sprite" parent="GFX" index="0"] -texture = ExtResource("2_i5oqc") -offset = Vector2(0, -6) +[node name="Sprite" parent="Anchor" index="0"] +texture = ExtResource("2_f3pos") diff --git a/assets/characters/monk.atlastex b/overworld/characters/monk.atlastex similarity index 100% rename from assets/characters/monk.atlastex rename to overworld/characters/monk.atlastex diff --git a/assets/characters/monk_gfx.tscn b/overworld/characters/monk_gfx.tscn similarity index 68% rename from assets/characters/monk_gfx.tscn rename to overworld/characters/monk_gfx.tscn index 91dfd684..dfc4e1d6 100644 --- a/assets/characters/monk_gfx.tscn +++ b/overworld/characters/monk_gfx.tscn @@ -1,14 +1,14 @@ -[gd_scene load_steps=7 format=3 uid="uid://dqdk6eehxsrmn"] +[gd_scene load_steps=6 format=3 uid="uid://dqdk6eehxsrmn"] [ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_3s0fl"] -[ext_resource type="Texture2D" uid="uid://2kiqbt7c1s65" path="res://assets/characters/monk.atlastex" id="2_h5x4o"] +[ext_resource type="Texture2D" uid="uid://2kiqbt7c1s65" path="res://overworld/characters/monk.atlastex" id="2_ay6b6"] [sub_resource type="Animation" id="Animation_r565k"] length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -25,7 +25,7 @@ step = 0.5 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -41,20 +41,13 @@ _data = { &"idle": SubResource("Animation_b16yu") } -[sub_resource type="RectangleShape2D" id="RectangleShape2D_1u5hk"] -size = Vector2(16, 16) - [node name="MonkGFX" instance=ExtResource("1_3s0fl")] [node name="AnimationPlayer" parent="." index="0"] -autoplay = "idle" libraries = { -"": SubResource("AnimationLibrary_fx0ff") +&"": SubResource("AnimationLibrary_fx0ff") } +autoplay = "idle" -[node name="CollisionShape2D" parent="Area2D" index="0"] -shape = SubResource("RectangleShape2D_1u5hk") - -[node name="Sprite" parent="GFX" index="0"] -texture = ExtResource("2_h5x4o") -offset = Vector2(0, -6) +[node name="Sprite" parent="Anchor" index="0"] +texture = ExtResource("2_ay6b6") diff --git a/assets/characters/smith.atlastex b/overworld/characters/smith.atlastex similarity index 100% rename from assets/characters/smith.atlastex rename to overworld/characters/smith.atlastex diff --git a/assets/characters/smith_gfx.tscn b/overworld/characters/smith_gfx.tscn similarity index 68% rename from assets/characters/smith_gfx.tscn rename to overworld/characters/smith_gfx.tscn index f47ae1ee..b3057289 100644 --- a/assets/characters/smith_gfx.tscn +++ b/overworld/characters/smith_gfx.tscn @@ -1,14 +1,14 @@ -[gd_scene load_steps=7 format=3 uid="uid://bvtk5qllej4b8"] +[gd_scene load_steps=6 format=3 uid="uid://bvtk5qllej4b8"] [ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_jgl7k"] -[ext_resource type="Texture2D" uid="uid://b4py6kf410yhh" path="res://assets/characters/smith.atlastex" id="2_7h01k"] +[ext_resource type="Texture2D" uid="uid://b4py6kf410yhh" path="res://overworld/characters/smith.atlastex" id="2_fia7k"] [sub_resource type="Animation" id="Animation_h6akm"] length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -25,7 +25,7 @@ step = 0.5 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -41,20 +41,13 @@ _data = { &"idle": SubResource("Animation_rviym") } -[sub_resource type="RectangleShape2D" id="RectangleShape2D_b20ad"] -size = Vector2(16, 16) - [node name="KnightGFX" instance=ExtResource("1_jgl7k")] [node name="AnimationPlayer" parent="." index="0"] -autoplay = "idle" libraries = { -"": SubResource("AnimationLibrary_y0jyp") +&"": SubResource("AnimationLibrary_y0jyp") } +autoplay = "idle" -[node name="CollisionShape2D" parent="Area2D" index="0"] -shape = SubResource("RectangleShape2D_b20ad") - -[node name="Sprite" parent="GFX" index="0"] -texture = ExtResource("2_7h01k") -offset = Vector2(0, -6) +[node name="Sprite" parent="Anchor" index="0"] +texture = ExtResource("2_fia7k") diff --git a/assets/characters/thief.atlastex b/overworld/characters/thief.atlastex similarity index 100% rename from assets/characters/thief.atlastex rename to overworld/characters/thief.atlastex diff --git a/assets/characters/lady_gfx.tscn b/overworld/characters/thief_gfx.tscn similarity index 68% rename from assets/characters/lady_gfx.tscn rename to overworld/characters/thief_gfx.tscn index 5a8fb02b..d41d82b7 100644 --- a/assets/characters/lady_gfx.tscn +++ b/overworld/characters/thief_gfx.tscn @@ -1,14 +1,14 @@ -[gd_scene load_steps=7 format=3 uid="uid://kiwma43jc3n6"] +[gd_scene load_steps=6 format=3 uid="uid://kiwma43jc3n6"] [ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_lnhvj"] -[ext_resource type="Texture2D" uid="uid://da8xa6fkwyv4r" path="res://assets/characters/thief.atlastex" id="2_5o3nk"] +[ext_resource type="Texture2D" uid="uid://da8xa6fkwyv4r" path="res://overworld/characters/thief.atlastex" id="2_6n3f7"] [sub_resource type="Animation" id="Animation_r565k"] length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -25,7 +25,7 @@ step = 0.5 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -41,20 +41,13 @@ _data = { &"idle": SubResource("Animation_b16yu") } -[sub_resource type="RectangleShape2D" id="RectangleShape2D_1u5hk"] -size = Vector2(16, 16) - [node name="LadyGFX" instance=ExtResource("1_lnhvj")] [node name="AnimationPlayer" parent="." index="0"] -autoplay = "idle" libraries = { -"": SubResource("AnimationLibrary_fx0ff") +&"": SubResource("AnimationLibrary_fx0ff") } +autoplay = "idle" -[node name="CollisionShape2D" parent="Area2D" index="0"] -shape = SubResource("RectangleShape2D_1u5hk") - -[node name="Sprite" parent="GFX" index="0"] -texture = ExtResource("2_5o3nk") -offset = Vector2(0, -6) +[node name="Sprite" parent="Anchor" index="0"] +texture = ExtResource("2_6n3f7") diff --git a/assets/characters/wizard.atlastex b/overworld/characters/wizard.atlastex similarity index 100% rename from assets/characters/wizard.atlastex rename to overworld/characters/wizard.atlastex diff --git a/assets/characters/wizard_gfx.tscn b/overworld/characters/wizard_gfx.tscn similarity index 68% rename from assets/characters/wizard_gfx.tscn rename to overworld/characters/wizard_gfx.tscn index 521dc4b9..5b1a644d 100644 --- a/assets/characters/wizard_gfx.tscn +++ b/overworld/characters/wizard_gfx.tscn @@ -1,14 +1,14 @@ -[gd_scene load_steps=7 format=3 uid="uid://ccm8tsjysf8b5"] +[gd_scene load_steps=6 format=3 uid="uid://ccm8tsjysf8b5"] [ext_resource type="PackedScene" uid="uid://caxhff6by5nqu" path="res://src/field/gamepieces/animation/gamepiece_animation.tscn" id="1_7u2js"] -[ext_resource type="Texture2D" uid="uid://8ry5inpldbfg" path="res://assets/characters/wizard.atlastex" id="2_othtp"] +[ext_resource type="Texture2D" uid="uid://8ry5inpldbfg" path="res://overworld/characters/wizard.atlastex" id="2_b6oqf"] [sub_resource type="Animation" id="Animation_8lv7x"] length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -25,7 +25,7 @@ step = 0.5 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("GFX/Sprite:flip_h") +tracks/0/path = NodePath("Anchor/Sprite:flip_h") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -41,20 +41,13 @@ _data = { &"idle": SubResource("Animation_f7y2d") } -[sub_resource type="RectangleShape2D" id="RectangleShape2D_b20ad"] -size = Vector2(16, 16) - [node name="KnightGFX" instance=ExtResource("1_7u2js")] [node name="AnimationPlayer" parent="." index="0"] -autoplay = "idle" libraries = { -"": SubResource("AnimationLibrary_hgdni") +&"": SubResource("AnimationLibrary_hgdni") } +autoplay = "idle" -[node name="CollisionShape2D" parent="Area2D" index="0"] -shape = SubResource("RectangleShape2D_b20ad") - -[node name="Sprite" parent="GFX" index="0"] -texture = ExtResource("2_othtp") -offset = Vector2(0, -6) +[node name="Sprite" parent="Anchor" index="0"] +texture = ExtResource("2_b6oqf") diff --git a/maps/grove/game_end_trigger.gd b/overworld/maps/forest/game_end_trigger.gd similarity index 83% rename from maps/grove/game_end_trigger.gd rename to overworld/maps/forest/game_end_trigger.gd index 15ae5737..1bf36ce8 100644 --- a/maps/grove/game_end_trigger.gd +++ b/overworld/maps/forest/game_end_trigger.gd @@ -1,3 +1,4 @@ +@tool extends Trigger @export var timeline: DialogicTimeline @@ -9,7 +10,7 @@ var gamepiece: Gamepiece func _execute() -> void: - gamepiece.travel_to_cell(Vector2i(53, 30)) + gamepiece.move_to(Gameboard.cell_to_pixel(Vector2i(53, 30))) await gamepiece.arrived _timer.start() @@ -30,5 +31,6 @@ func _execute() -> void: func _on_area_entered(area: Area2D) -> void: + if not Engine.is_editor_hint(): + gamepiece = area.owner as Gamepiece super._on_area_entered(area) - gamepiece = area.owner as Gamepiece diff --git a/maps/grove/game_end_trigger.gd.uid b/overworld/maps/forest/game_end_trigger.gd.uid similarity index 100% rename from maps/grove/game_end_trigger.gd.uid rename to overworld/maps/forest/game_end_trigger.gd.uid diff --git a/maps/grove/ghost.dch b/overworld/maps/forest/ghost.dch similarity index 100% rename from maps/grove/ghost.dch rename to overworld/maps/forest/ghost.dch diff --git a/maps/grove/ghost.dch.uid b/overworld/maps/forest/ghost.dch.uid similarity index 100% rename from maps/grove/ghost.dch.uid rename to overworld/maps/forest/ghost.dch.uid diff --git a/maps/grove/ghost.dtl b/overworld/maps/forest/ghost.dtl similarity index 100% rename from maps/grove/ghost.dtl rename to overworld/maps/forest/ghost.dtl diff --git a/maps/grove/ghost.dtl.uid b/overworld/maps/forest/ghost.dtl.uid similarity index 100% rename from maps/grove/ghost.dtl.uid rename to overworld/maps/forest/ghost.dtl.uid diff --git a/overworld/maps/gbprops.tres b/overworld/maps/gbprops.tres new file mode 100644 index 00000000..70d9292a --- /dev/null +++ b/overworld/maps/gbprops.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="GameboardProperties" load_steps=2 format=3 uid="uid://k63mv5dbd1uk"] + +[ext_resource type="Script" uid="uid://cyl76x7u73s67" path="res://src/field/gameboard/gameboard_properties.gd" id="1_0hcip"] + +[resource] +script = ExtResource("1_0hcip") +extents = Rect2i(0, 0, 70, 35) +cell_size = Vector2i(16, 16) +metadata/_custom_type_script = "uid://cyl76x7u73s67" diff --git a/maps/house/wand_pedestal.dtl b/overworld/maps/house/wand_pedestal.dtl similarity index 100% rename from maps/house/wand_pedestal.dtl rename to overworld/maps/house/wand_pedestal.dtl diff --git a/maps/house/wand_pedestal.dtl.uid b/overworld/maps/house/wand_pedestal.dtl.uid similarity index 100% rename from maps/house/wand_pedestal.dtl.uid rename to overworld/maps/house/wand_pedestal.dtl.uid diff --git a/maps/house/wand_pedestal_interaction.gd b/overworld/maps/house/wand_pedestal_interaction.gd similarity index 95% rename from maps/house/wand_pedestal_interaction.gd rename to overworld/maps/house/wand_pedestal_interaction.gd index 29fa44e0..d069227b 100644 --- a/maps/house/wand_pedestal_interaction.gd +++ b/overworld/maps/house/wand_pedestal_interaction.gd @@ -17,7 +17,7 @@ const VALID_ITEMS: = [ static var _correct_pedestals: = {} ## Link the obstacle's animation player to this object for when the puzzle is solved. -@export var spikes_animation: AnimationPlayer +@export var solved_animation: AnimationPlayer ## Specify a timeline that should be run if an item is already placed on the pedestal. @export var wand_placed_timeline: DialogicTimeline @@ -38,7 +38,7 @@ func _ready() -> void: super._ready() if not Engine.is_editor_hint(): - assert(spikes_animation, "This interaction requires the obstacle's animation player!") + assert(solved_animation, "This interaction requires the obstacle's animation player!") # Setup the static variable to account for this pedestal. _correct_pedestals[self] = false @@ -71,9 +71,9 @@ func _execute() -> void: for pedestal in _correct_pedestals.keys(): pedestal.is_active = false - # The referenced animation player will visually resolve the puzzle. - spikes_animation.play("clear") - await spikes_animation.animation_finished + # The referenced animation player will resolve the puzzle. + solved_animation.play("solve") + await solved_animation.animation_finished # Check to see if ALL pedestals have the correct wand placed on them. diff --git a/maps/house/wand_pedestal_interaction.gd.uid b/overworld/maps/house/wand_pedestal_interaction.gd.uid similarity index 100% rename from maps/house/wand_pedestal_interaction.gd.uid rename to overworld/maps/house/wand_pedestal_interaction.gd.uid diff --git a/maps/house/wand_pedestal_interaction.tscn b/overworld/maps/house/wand_pedestal_interaction.tscn similarity index 76% rename from maps/house/wand_pedestal_interaction.tscn rename to overworld/maps/house/wand_pedestal_interaction.tscn index d6a8091e..d0c3b26d 100644 --- a/maps/house/wand_pedestal_interaction.tscn +++ b/overworld/maps/house/wand_pedestal_interaction.tscn @@ -1,9 +1,9 @@ [gd_scene load_steps=5 format=3 uid="uid://ctuol1ff8u5e2"] [ext_resource type="PackedScene" uid="uid://oot0x5n44b2r" path="res://src/field/cutscenes/Interaction.tscn" id="1_j1qab"] -[ext_resource type="Script" uid="uid://c2ux7md6xqvp0" path="res://maps/house/wand_pedestal_interaction.gd" id="2_vpehh"] -[ext_resource type="Resource" uid="uid://dqv2webtqx23s" path="res://maps/house/wand_pedestal_occupied.dtl" id="3_dfiym"] -[ext_resource type="Resource" uid="uid://ddvjgirk1peou" path="res://maps/house/wand_pedestal.dtl" id="4_s2fj7"] +[ext_resource type="Script" uid="uid://c2ux7md6xqvp0" path="res://overworld/maps/house/wand_pedestal_interaction.gd" id="2_vpehh"] +[ext_resource type="Resource" uid="uid://dqv2webtqx23s" path="res://overworld/maps/house/wand_pedestal_occupied.dtl" id="3_dfiym"] +[ext_resource type="Resource" uid="uid://ddvjgirk1peou" path="res://overworld/maps/house/wand_pedestal.dtl" id="4_s2fj7"] [node name="WandPedestalInteraction" instance=ExtResource("1_j1qab")] script = ExtResource("2_vpehh") diff --git a/maps/house/wand_pedestal_occupied.dtl b/overworld/maps/house/wand_pedestal_occupied.dtl similarity index 100% rename from maps/house/wand_pedestal_occupied.dtl rename to overworld/maps/house/wand_pedestal_occupied.dtl diff --git a/maps/house/wand_pedestal_occupied.dtl.uid b/overworld/maps/house/wand_pedestal_occupied.dtl.uid similarity index 100% rename from maps/house/wand_pedestal_occupied.dtl.uid rename to overworld/maps/house/wand_pedestal_occupied.dtl.uid diff --git a/maps/opening_cutscene.dtl b/overworld/maps/opening_cutscene.dtl similarity index 100% rename from maps/opening_cutscene.dtl rename to overworld/maps/opening_cutscene.dtl diff --git a/maps/opening_cutscene.dtl.uid b/overworld/maps/opening_cutscene.dtl.uid similarity index 100% rename from maps/opening_cutscene.dtl.uid rename to overworld/maps/opening_cutscene.dtl.uid diff --git a/maps/opening_cutscene.gd b/overworld/maps/opening_cutscene.gd similarity index 100% rename from maps/opening_cutscene.gd rename to overworld/maps/opening_cutscene.gd diff --git a/maps/opening_cutscene.gd.uid b/overworld/maps/opening_cutscene.gd.uid similarity index 100% rename from maps/opening_cutscene.gd.uid rename to overworld/maps/opening_cutscene.gd.uid diff --git a/assets/terrain/dungeon_tilemap.png b/overworld/maps/tilesets/dungeon_tilemap.png similarity index 100% rename from assets/terrain/dungeon_tilemap.png rename to overworld/maps/tilesets/dungeon_tilemap.png diff --git a/assets/terrain/dungeon_tilemap.png.import b/overworld/maps/tilesets/dungeon_tilemap.png.import similarity index 69% rename from assets/terrain/dungeon_tilemap.png.import rename to overworld/maps/tilesets/dungeon_tilemap.png.import index a716aaf2..59389268 100644 --- a/assets/terrain/dungeon_tilemap.png.import +++ b/overworld/maps/tilesets/dungeon_tilemap.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://dm4h0uo6gjp22" -path="res://.godot/imported/dungeon_tilemap.png-68df297cfdb861c9d71310f03207f420.ctex" +path="res://.godot/imported/dungeon_tilemap.png-9b7198d6aaaebcce120db5678a3c9e06.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/terrain/dungeon_tilemap.png" -dest_files=["res://.godot/imported/dungeon_tilemap.png-68df297cfdb861c9d71310f03207f420.ctex"] +source_file="res://overworld/maps/tilesets/dungeon_tilemap.png" +dest_files=["res://.godot/imported/dungeon_tilemap.png-9b7198d6aaaebcce120db5678a3c9e06.ctex"] [params] diff --git a/overworld/maps/tilesets/kenney_terrain.tres b/overworld/maps/tilesets/kenney_terrain.tres new file mode 100644 index 00000000..4e503a99 --- /dev/null +++ b/overworld/maps/tilesets/kenney_terrain.tres @@ -0,0 +1,470 @@ +[gd_resource type="TileSet" load_steps=5 format=3 uid="uid://biq84075xlypd"] + +[ext_resource type="Texture2D" uid="uid://d2qfi5sncf72b" path="res://overworld/maps/tilesets/town_tilemap.png" id="1_c40y6"] +[ext_resource type="Texture2D" uid="uid://dm4h0uo6gjp22" path="res://overworld/maps/tilesets/dungeon_tilemap.png" id="2_e8188"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_2gcu3"] +texture = ExtResource("1_c40y6") +separation = Vector2i(1, 1) +3:1/0 = 0 +3:1/0/custom_data_0 = true +3:0/0 = 0 +3:0/0/custom_data_0 = true +3:2/0 = 0 +3:2/0/terrain_set = 0 +3:2/0/terrain = 1 +3:2/0/custom_data_0 = true +4:2/0 = 0 +4:2/0/terrain_set = 0 +4:2/0/terrain = 0 +4:2/0/custom_data_0 = true +4:1/0 = 0 +4:1/0/custom_data_0 = true +4:0/0 = 0 +4:0/0/custom_data_0 = true +5:0/0 = 0 +5:0/0/terrain_set = 0 +5:0/0/terrain = 0 +5:0/0/custom_data_0 = true +5:1/0 = 0 +5:1/0/custom_data_0 = true +5:2/0 = 0 +6:2/0 = 0 +6:2/0/terrain_set = 0 +6:2/0/terrain = 0 +6:2/0/terrains_peering_bit/right_side = 0 +6:2/0/terrains_peering_bit/top_side = 0 +6:2/0/custom_data_0 = true +7:2/0 = 0 +7:2/0/terrain_set = 0 +7:2/0/terrain = 0 +7:2/0/terrains_peering_bit/top_side = 0 +7:2/0/custom_data_0 = true +8:2/0 = 0 +8:2/0/terrain_set = 0 +8:2/0/terrain = 0 +8:2/0/terrains_peering_bit/left_side = 0 +8:2/0/terrains_peering_bit/top_side = 0 +8:2/0/custom_data_0 = true +8:1/0 = 0 +8:1/0/terrain_set = 0 +8:1/0/terrain = 0 +8:1/0/terrains_peering_bit/left_side = 0 +8:1/0/custom_data_0 = true +8:0/0 = 0 +8:0/0/terrain_set = 0 +8:0/0/terrain = 0 +8:0/0/terrains_peering_bit/bottom_side = 0 +8:0/0/terrains_peering_bit/left_side = 0 +8:0/0/custom_data_0 = true +7:0/0 = 0 +7:0/0/terrain_set = 0 +7:0/0/terrain = 0 +7:0/0/terrains_peering_bit/bottom_side = 0 +7:0/0/custom_data_0 = true +6:0/0 = 0 +6:0/0/terrain_set = 0 +6:0/0/terrain = 0 +6:0/0/terrains_peering_bit/right_side = 0 +6:0/0/terrains_peering_bit/bottom_side = 0 +6:0/0/custom_data_0 = true +6:1/0 = 0 +6:1/0/terrain_set = 0 +6:1/0/terrain = 0 +6:1/0/terrains_peering_bit/right_side = 0 +6:1/0/custom_data_0 = true +7:1/0 = 0 +7:1/0/terrain_set = 0 +7:1/0/terrain = 0 +7:1/0/terrains_peering_bit/right_side = 0 +7:1/0/terrains_peering_bit/bottom_side = 0 +7:1/0/terrains_peering_bit/left_side = 0 +7:1/0/terrains_peering_bit/top_side = 0 +7:1/0/custom_data_0 = true +9:1/0 = 0 +9:1/0/terrain_set = 0 +9:1/0/terrain = 1 +9:1/0/terrains_peering_bit/right_side = 1 +9:1/0/custom_data_0 = true +9:2/0 = 0 +9:2/0/terrain_set = 0 +9:2/0/terrain = 1 +9:2/0/terrains_peering_bit/right_side = 1 +9:2/0/terrains_peering_bit/top_side = 1 +9:2/0/custom_data_0 = true +10:2/0 = 0 +10:2/0/terrain_set = 0 +10:2/0/terrain = 1 +10:2/0/terrains_peering_bit/top_side = 1 +10:2/0/custom_data_0 = true +11:2/0 = 0 +11:2/0/terrain_set = 0 +11:2/0/terrain = 1 +11:2/0/terrains_peering_bit/left_side = 1 +11:2/0/terrains_peering_bit/top_side = 1 +11:2/0/custom_data_0 = true +11:1/0 = 0 +11:1/0/terrain_set = 0 +11:1/0/terrain = 1 +11:1/0/terrains_peering_bit/left_side = 1 +11:1/0/custom_data_0 = true +11:0/0 = 0 +11:0/0/terrain_set = 0 +11:0/0/terrain = 1 +11:0/0/terrains_peering_bit/bottom_side = 1 +11:0/0/terrains_peering_bit/left_side = 1 +11:0/0/custom_data_0 = true +10:0/0 = 0 +10:0/0/terrain_set = 0 +10:0/0/terrain = 1 +10:0/0/terrains_peering_bit/bottom_side = 1 +10:0/0/custom_data_0 = true +9:0/0 = 0 +9:0/0/terrain_set = 0 +9:0/0/terrain = 1 +9:0/0/terrains_peering_bit/right_side = 1 +9:0/0/terrains_peering_bit/bottom_side = 1 +9:0/0/custom_data_0 = true +10:1/0 = 0 +10:1/0/terrain_set = 0 +10:1/0/terrain = 1 +10:1/0/terrains_peering_bit/right_side = 1 +10:1/0/terrains_peering_bit/bottom_side = 1 +10:1/0/terrains_peering_bit/left_side = 1 +10:1/0/terrains_peering_bit/top_side = 1 +10:1/0/custom_data_0 = true +10:6/0 = 0 +10:6/0/custom_data_0 = true +9:6/0 = 0 +9:6/0/custom_data_0 = true +8:6/0 = 0 +8:6/0/custom_data_0 = true +8:5/0 = 0 +8:5/0/custom_data_0 = true +8:4/0 = 0 +8:4/0/custom_data_0 = true +8:3/0 = 0 +8:3/0/custom_data_0 = true +9:3/0 = 0 +9:3/0/custom_data_0 = true +10:3/0 = 0 +10:3/0/custom_data_0 = true +10:4/0 = 0 +10:4/0/custom_data_0 = true +11:4/0 = 0 +11:4/0/custom_data_0 = true +11:5/0 = 0 +11:5/0/custom_data_0 = true +10:5/0 = 0 +10:5/0/custom_data_0 = true +9:5/0 = 0 +9:5/0/custom_data_0 = true +11:3/0 = 0 +11:3/0/custom_data_0 = true +0:8/0 = 0 +0:8/0/custom_data_0 = true +1:8/0 = 0 +1:8/0/custom_data_0 = true +2:8/0 = 0 +2:8/0/custom_data_0 = true +2:9/0 = 0 +2:9/0/custom_data_0 = true +2:10/0 = 0 +2:10/0/custom_data_0 = true +1:10/0 = 0 +1:10/0/custom_data_0 = true +0:10/0 = 0 +0:10/0/custom_data_0 = true +0:9/0 = 0 +0:9/0/custom_data_0 = true +1:9/0 = 0 +1:9/0/custom_data_0 = true +3:8/0 = 0 +3:8/0/custom_data_0 = true +4:8/0 = 0 +4:8/0/custom_data_0 = true +5:8/0 = 0 +5:8/0/custom_data_0 = true +6:8/0 = 0 +6:8/0/custom_data_0 = true +6:10/0 = 0 +6:10/0/custom_data_0 = true +5:10/0 = 0 +5:10/0/custom_data_0 = true +4:10/0 = 0 +4:10/0/custom_data_0 = true +3:10/0 = 0 +3:10/0/custom_data_0 = true +3:9/0 = 0 +3:9/0/custom_data_0 = true +4:9/0 = 0 +4:9/0/custom_data_0 = true +5:9/0 = 0 +5:9/0/custom_data_0 = true +6:9/0 = 0 +6:9/0/custom_data_0 = true +7:6/0 = 0 +7:6/0/custom_data_0 = true +7:5/0 = 0 +7:5/0/custom_data_0 = true +7:4/0 = 0 +7:4/0/custom_data_0 = true +6:4/0 = 0 +6:4/0/custom_data_0 = true +5:4/0 = 0 +5:4/0/custom_data_0 = true +4:4/0 = 0 +4:4/0/custom_data_0 = true +3:4/0 = 0 +3:4/0/custom_data_0 = true +2:4/0 = 0 +2:4/0/custom_data_0 = true +1:4/0 = 0 +1:4/0/custom_data_0 = true +0:4/0 = 0 +0:4/0/custom_data_0 = true +0:5/0 = 0 +0:5/0/custom_data_0 = true +0:6/0 = 0 +0:6/0/custom_data_0 = true +1:6/0 = 0 +1:6/0/custom_data_0 = true +2:6/0 = 0 +3:6/0 = 0 +3:6/0/custom_data_0 = true +4:6/0 = 0 +4:6/0/custom_data_0 = true +5:6/0 = 0 +5:6/0/custom_data_0 = true +6:6/0 = 0 +6:5/0 = 0 +6:5/0/custom_data_0 = true +5:5/0 = 0 +5:5/0/custom_data_0 = true +4:5/0 = 0 +4:5/0/custom_data_0 = true +3:5/0 = 0 +3:5/0/custom_data_0 = true +2:5/0 = 0 +2:5/0/custom_data_0 = true +1:5/0 = 0 +1:5/0/custom_data_0 = true +4:7/0 = 0 +4:7/0/custom_data_0 = true +0:7/0 = 0 +0:7/0/custom_data_0 = true +1:7/0 = 0 +1:7/0/custom_data_0 = true +5:7/0 = 0 +5:7/0/custom_data_0 = true +11:6/0 = 0 +11:6/0/custom_data_0 = true +10:7/0 = 0 +10:7/0/custom_data_0 = true +8:8/0 = 0 +8:8/0/custom_data_0 = true +8:7/0 = 0 +7:8/0 = 0 +7:8/0/custom_data_0 = true +7:3/0 = 0 +7:3/0/terrain_set = 1 +7:3/0/terrain = 2 +6:3/0 = 0 +6:3/0/terrain_set = 1 +6:3/0/terrain = 0 +6:3/0/terrains_peering_bit/bottom_right_corner = 0 +6:3/0/terrains_peering_bit/top_left_corner = 0 +6:3/0/terrains_peering_bit/top_right_corner = 0 +5:3/0 = 0 +5:3/0/terrain_set = 1 +5:3/0/terrain = 0 +5:3/0/terrains_peering_bit/bottom_left_corner = 0 +5:3/0/terrains_peering_bit/top_left_corner = 0 +5:3/0/terrains_peering_bit/top_right_corner = 0 +4:3/0 = 0 +4:3/0/terrain_set = 1 +4:3/0/terrain = 0 +4:3/0/terrains_peering_bit/bottom_right_corner = 0 +4:3/0/terrains_peering_bit/bottom_left_corner = 0 +4:3/0/terrains_peering_bit/top_left_corner = 0 +3:3/0 = 0 +3:3/0/terrain_set = 1 +3:3/0/terrain = 0 +3:3/0/terrains_peering_bit/bottom_right_corner = 0 +3:3/0/terrains_peering_bit/bottom_left_corner = 0 +3:3/0/terrains_peering_bit/top_right_corner = 0 +2:3/0 = 0 +2:3/0/terrain_set = 1 +2:3/0/terrain = 0 +2:3/0/terrains_peering_bit/top_left_corner = 0 +1:3/0 = 0 +1:3/0/terrain_set = 1 +1:3/0/terrain = 0 +1:3/0/terrains_peering_bit/top_left_corner = 0 +1:3/0/terrains_peering_bit/top_right_corner = 0 +0:3/0 = 0 +0:3/0/terrain_set = 1 +0:3/0/terrain = 0 +0:3/0/terrains_peering_bit/top_right_corner = 0 +0:2/0 = 0 +0:2/0/terrain_set = 1 +0:2/0/terrain = 0 +0:2/0/terrains_peering_bit/bottom_right_corner = 0 +0:2/0/terrains_peering_bit/top_right_corner = 0 +1:2/0 = 0 +1:2/0/terrain_set = 1 +1:2/0/terrain = 0 +1:2/0/terrains_peering_bit/bottom_right_corner = 0 +1:2/0/terrains_peering_bit/bottom_left_corner = 0 +1:2/0/terrains_peering_bit/top_left_corner = 0 +1:2/0/terrains_peering_bit/top_right_corner = 0 +2:2/0 = 0 +2:2/0/terrain_set = 1 +2:2/0/terrain = 0 +2:2/0/terrains_peering_bit/bottom_left_corner = 0 +2:2/0/terrains_peering_bit/top_left_corner = 0 +2:1/0 = 0 +2:1/0/terrain_set = 1 +2:1/0/terrain = 0 +2:1/0/terrains_peering_bit/bottom_left_corner = 0 +2:0/0 = 0 +2:0/0/terrain_set = 1 +2:0/0/terrain = 1 +2:0/0/terrains_peering_bit/bottom_right_corner = 1 +2:0/0/terrains_peering_bit/bottom_left_corner = 1 +2:0/0/terrains_peering_bit/top_left_corner = 1 +2:0/0/terrains_peering_bit/top_right_corner = 1 +1:0/0 = 0 +1:0/0/terrain_set = 1 +1:0/0/terrain = 1 +1:0/0/terrains_peering_bit/bottom_right_corner = 1 +1:0/0/terrains_peering_bit/bottom_left_corner = 1 +1:0/0/terrains_peering_bit/top_left_corner = 1 +1:0/0/terrains_peering_bit/top_right_corner = 1 +0:0/0 = 0 +0:0/0/terrain_set = 1 +0:0/0/terrain = 1 +0:0/0/probability = 30.0 +0:0/0/terrains_peering_bit/bottom_right_corner = 1 +0:0/0/terrains_peering_bit/bottom_left_corner = 1 +0:0/0/terrains_peering_bit/top_left_corner = 1 +0:0/0/terrains_peering_bit/top_right_corner = 1 +0:1/0 = 0 +0:1/0/terrain_set = 1 +0:1/0/terrain = 0 +0:1/0/terrains_peering_bit/bottom_right_corner = 0 +1:1/0 = 0 +1:1/0/terrain_set = 1 +1:1/0/terrain = 0 +1:1/0/terrains_peering_bit/bottom_right_corner = 0 +1:1/0/terrains_peering_bit/bottom_left_corner = 0 +9:4/0 = 0 +9:4/0/custom_data_0 = true +11:8/0 = 0 +11:8/0/custom_data_0 = true +9:8/0 = 0 +9:8/0/custom_data_0 = true +11:10/0 = 0 +11:10/0/custom_data_0 = true +10:10/0 = 0 +10:10/0/custom_data_0 = true + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_xmrbd"] +texture = ExtResource("2_e8188") +separation = Vector2i(1, 1) +5:7/0 = 0 +5:7/0/custom_data_0 = true +3:5/0 = 0 +3:5/0/custom_data_0 = true +3:6/0 = 0 +3:6/0/custom_data_0 = true +10:6/0 = 0 +10:6/0/custom_data_0 = true +10:4/0 = 0 +10:4/0/custom_data_0 = true +9:4/0 = 0 +9:4/0/custom_data_0 = true +11:4/0 = 0 +11:4/0/custom_data_0 = true +5:4/0 = 0 +4:4/0 = 0 +3:4/0 = 0 +2:4/0 = 0 +1:4/0 = 0 +0:4/0 = 0 +5:3/0 = 0 +5:3/0/custom_data_0 = true +6:3/0 = 0 +7:3/0 = 0 +8:3/0 = 0 +4:3/0 = 0 +4:3/0/custom_data_0 = true +4:2/0 = 0 +4:2/0/custom_data_0 = true +5:2/0 = 0 +5:2/0/custom_data_0 = true +3:3/0 = 0 +2:3/0 = 0 +1:3/0 = 0 +0:3/0 = 0 +0:2/0 = 0 +0:1/0 = 0 +0:0/0 = 0 +9:0/0 = 0 +8:0/0 = 0 +8:0/0/custom_data_0 = true +8:2/0 = 0 +8:2/0/custom_data_0 = true +7:0/0 = 0 +7:0/0/custom_data_0 = true +7:2/0 = 0 +7:2/0/custom_data_0 = true +6:2/0 = 0 +6:1/0 = 0 +6:1/0/custom_data_0 = true +6:0/0 = 0 +6:0/0/custom_data_0 = true +1:2/0 = 0 +1:2/0/custom_data_0 = true +2:2/0 = 0 +2:2/0/custom_data_0 = true +3:2/0 = 0 +3:2/0/custom_data_0 = true +3:1/0 = 0 +3:1/0/custom_data_0 = true +3:0/0 = 0 +3:0/0/custom_data_0 = true +2:0/0 = 0 +2:0/0/custom_data_0 = true +1:0/0 = 0 +1:0/0/custom_data_0 = true +1:1/0 = 0 +1:1/0/custom_data_0 = true +2:1/0 = 0 +2:1/0/custom_data_0 = true +4:1/0 = 0 +4:1/0/custom_data_0 = true +5:1/0 = 0 +5:1/0/custom_data_0 = true +5:0/0 = 0 +5:0/0/custom_data_0 = true +4:0/0 = 0 +4:0/0/custom_data_0 = true + +[resource] +terrain_set_0/mode = 2 +terrain_set_0/terrain_0/name = "GreenTrees 0" +terrain_set_0/terrain_0/color = Color(0.45098, 0.682353, 0.517647, 1) +terrain_set_0/terrain_1/name = "YellowTrees" +terrain_set_0/terrain_1/color = Color(0.823529, 0.74902, 0.529412, 1) +terrain_set_1/mode = 1 +terrain_set_1/terrain_0/name = "Dirt" +terrain_set_1/terrain_0/color = Color(0.5, 0.34375, 0.25, 1) +terrain_set_1/terrain_1/name = "Grass" +terrain_set_1/terrain_1/color = Color(0.152941, 0.329412, 0, 1) +terrain_set_1/terrain_2/name = "Cobblestone" +terrain_set_1/terrain_2/color = Color(0.262745, 0.239216, 0.223529, 1) +custom_data_layer_0/name = "IsCellBlocked" +custom_data_layer_0/type = 1 +sources/0 = SubResource("TileSetAtlasSource_2gcu3") +sources/1 = SubResource("TileSetAtlasSource_xmrbd") diff --git a/assets/terrain/town_tilemap.png b/overworld/maps/tilesets/town_tilemap.png similarity index 100% rename from assets/terrain/town_tilemap.png rename to overworld/maps/tilesets/town_tilemap.png diff --git a/assets/terrain/town_tilemap.png.import b/overworld/maps/tilesets/town_tilemap.png.import similarity index 70% rename from assets/terrain/town_tilemap.png.import rename to overworld/maps/tilesets/town_tilemap.png.import index 7ebace7d..db8f3936 100644 --- a/assets/terrain/town_tilemap.png.import +++ b/overworld/maps/tilesets/town_tilemap.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://d2qfi5sncf72b" -path="res://.godot/imported/town_tilemap.png-2998e8eb9fc51ed5db3b69c6ee26a142.ctex" +path="res://.godot/imported/town_tilemap.png-4b70887ab77bf7f5afd671c31fe07fcb.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/terrain/town_tilemap.png" -dest_files=["res://.godot/imported/town_tilemap.png-2998e8eb9fc51ed5db3b69c6ee26a142.ctex"] +source_file="res://overworld/maps/tilesets/town_tilemap.png" +dest_files=["res://.godot/imported/town_tilemap.png-4b70887ab77bf7f5afd671c31fe07fcb.ctex"] [params] diff --git a/maps/town/battles/test_combat_arena.tscn b/overworld/maps/town/battles/test_combat_arena.tscn similarity index 81% rename from maps/town/battles/test_combat_arena.tscn rename to overworld/maps/town/battles/test_combat_arena.tscn index 6f77caf0..b89edde7 100644 --- a/maps/town/battles/test_combat_arena.tscn +++ b/overworld/maps/town/battles/test_combat_arena.tscn @@ -1,22 +1,22 @@ [gd_scene load_steps=18 format=3 uid="uid://wivtmf75ic3f"] [ext_resource type="PackedScene" uid="uid://b3ciqydkjnkkx" path="res://src/combat/combat_arena.tscn" id="1_etpkf"] -[ext_resource type="Texture2D" uid="uid://w55nt3s833tb" path="res://assets/arenas/steppes.png" id="2_i30nm"] +[ext_resource type="Texture2D" uid="uid://w55nt3s833tb" path="res://combat/arenas/steppes.png" id="2_i30nm"] [ext_resource type="AudioStream" uid="uid://dagiejnj8dwqb" path="res://assets/music/squashin_bugs_fixed.mp3" id="2_vo8mp"] [ext_resource type="Script" uid="uid://dwj347l1r1os2" path="res://src/combat/battlers/battler.gd" id="4_6ngh4"] -[ext_resource type="Resource" uid="uid://chuarvle06xxf" path="res://battlers/bugcat/bugcat_stats.tres" id="5_1st0g"] -[ext_resource type="Resource" uid="uid://bn4nqbuhq4ih8" path="res://battlers/bear/bear_stats.tres" id="5_id2tu"] +[ext_resource type="Resource" uid="uid://chuarvle06xxf" path="res://combat/battlers/bugcat/bugcat_stats.tres" id="5_1st0g"] +[ext_resource type="Resource" uid="uid://bn4nqbuhq4ih8" path="res://combat/battlers/bear/bear_stats.tres" id="5_id2tu"] [ext_resource type="Script" uid="uid://cg2qyry5c4eef" path="res://src/combat/actions/battler_action.gd" id="6_b04cs"] -[ext_resource type="PackedScene" uid="uid://ugsq7u4cue4w" path="res://battlers/bugcat/bugcat_anim.tscn" id="6_r8rpm"] -[ext_resource type="Resource" uid="uid://752xsau3xyx0" path="res://battlers/bugcat/quick_attack.tres" id="7_hmx6r"] +[ext_resource type="PackedScene" uid="uid://ugsq7u4cue4w" path="res://combat/battlers/bugcat/bugcat_anim.tscn" id="6_r8rpm"] +[ext_resource type="Resource" uid="uid://752xsau3xyx0" path="res://combat/battlers/bugcat/quick_attack.tres" id="7_hmx6r"] [ext_resource type="PackedScene" uid="uid://dlr2vdjcicdx4" path="res://src/combat/CombatAI.tscn" id="9_omkxl"] -[ext_resource type="PackedScene" uid="uid://bl8bmbt7v3lrj" path="res://battlers/bear/bear_anim.tscn" id="10_ajkh0"] -[ext_resource type="Resource" uid="uid://dp7wo0l4es3w4" path="res://battlers/bear/player_melee_action.tres" id="10_uukpg"] -[ext_resource type="Resource" uid="uid://ctimffr7v621e" path="res://battlers/bear/focus_attack.tres" id="11_o8nj8"] -[ext_resource type="Resource" uid="uid://bka1pe2l3gbv" path="res://battlers/squirrel/squirrel_stats.tres" id="13_ewpfg"] -[ext_resource type="Resource" uid="uid://c01ilo1olkfsm" path="res://battlers/squirrel/area_attack.tres" id="14_xht23"] -[ext_resource type="Resource" uid="uid://cfj3osdc334ks" path="res://battlers/squirrel/heal_friendly.tres" id="15_0v4ad"] -[ext_resource type="PackedScene" uid="uid://cch8nxgex1edr" path="res://battlers/squirrel/squirrel_anim.tscn" id="16_ve6h1"] +[ext_resource type="PackedScene" uid="uid://bl8bmbt7v3lrj" path="res://combat/battlers/bear/bear_anim.tscn" id="10_ajkh0"] +[ext_resource type="Resource" uid="uid://dp7wo0l4es3w4" path="res://combat/battlers/bear/player_melee_action.tres" id="10_uukpg"] +[ext_resource type="Resource" uid="uid://ctimffr7v621e" path="res://combat/battlers/bear/focus_attack.tres" id="11_o8nj8"] +[ext_resource type="Resource" uid="uid://bka1pe2l3gbv" path="res://combat/battlers/squirrel/squirrel_stats.tres" id="13_ewpfg"] +[ext_resource type="Resource" uid="uid://c01ilo1olkfsm" path="res://combat/battlers/squirrel/area_attack.tres" id="14_xht23"] +[ext_resource type="Resource" uid="uid://cfj3osdc334ks" path="res://combat/battlers/squirrel/heal_friendly.tres" id="15_0v4ad"] +[ext_resource type="PackedScene" uid="uid://cch8nxgex1edr" path="res://combat/battlers/squirrel/squirrel_anim.tscn" id="16_ve6h1"] [node name="TestCombatArena" instance=ExtResource("1_etpkf")] music = ExtResource("2_vo8mp") diff --git a/maps/town/battles/test_combat_arena2.tscn b/overworld/maps/town/battles/test_combat_arena2.tscn similarity index 77% rename from maps/town/battles/test_combat_arena2.tscn rename to overworld/maps/town/battles/test_combat_arena2.tscn index 9c4981ec..65ec2388 100644 --- a/maps/town/battles/test_combat_arena2.tscn +++ b/overworld/maps/town/battles/test_combat_arena2.tscn @@ -1,25 +1,25 @@ [gd_scene load_steps=21 format=3 uid="uid://bq6b26pctmol4"] [ext_resource type="PackedScene" uid="uid://b3ciqydkjnkkx" path="res://src/combat/combat_arena.tscn" id="1_tqh6v"] -[ext_resource type="Texture2D" uid="uid://w55nt3s833tb" path="res://assets/arenas/steppes.png" id="2_5pnp5"] +[ext_resource type="Texture2D" uid="uid://w55nt3s833tb" path="res://combat/arenas/steppes.png" id="2_5pnp5"] [ext_resource type="AudioStream" uid="uid://dj7yf3u7fdxdu" path="res://assets/music/the_fun_run.mp3" id="2_gvpi1"] -[ext_resource type="PackedScene" uid="uid://8f7e4yxs3poj" path="res://battlers/wolf/wolf_anim.tscn" id="5_2jmm4"] -[ext_resource type="Resource" uid="uid://chuarvle06xxf" path="res://battlers/bugcat/bugcat_stats.tres" id="5_46fcu"] -[ext_resource type="Resource" uid="uid://bn4nqbuhq4ih8" path="res://battlers/bear/bear_stats.tres" id="5_dbmw8"] -[ext_resource type="Resource" uid="uid://bka1pe2l3gbv" path="res://battlers/squirrel/squirrel_stats.tres" id="5_ejdro"] -[ext_resource type="PackedScene" uid="uid://cch8nxgex1edr" path="res://battlers/squirrel/squirrel_anim.tscn" id="6_758fa"] +[ext_resource type="PackedScene" uid="uid://8f7e4yxs3poj" path="res://combat/battlers/wolf/wolf_anim.tscn" id="5_2jmm4"] +[ext_resource type="Resource" uid="uid://chuarvle06xxf" path="res://combat/battlers/bugcat/bugcat_stats.tres" id="5_46fcu"] +[ext_resource type="Resource" uid="uid://bn4nqbuhq4ih8" path="res://combat/battlers/bear/bear_stats.tres" id="5_dbmw8"] +[ext_resource type="Resource" uid="uid://bka1pe2l3gbv" path="res://combat/battlers/squirrel/squirrel_stats.tres" id="5_ejdro"] +[ext_resource type="PackedScene" uid="uid://cch8nxgex1edr" path="res://combat/battlers/squirrel/squirrel_anim.tscn" id="6_758fa"] [ext_resource type="Script" uid="uid://dwj347l1r1os2" path="res://src/combat/battlers/battler.gd" id="6_q0bkx"] [ext_resource type="Script" uid="uid://cg2qyry5c4eef" path="res://src/combat/actions/battler_action.gd" id="7_7p3qq"] -[ext_resource type="Resource" uid="uid://bs4g81qa8u57q" path="res://battlers/wolf/area_attack.tres" id="7_vldb3"] -[ext_resource type="Resource" uid="uid://752xsau3xyx0" path="res://battlers/bugcat/quick_attack.tres" id="8_71nny"] -[ext_resource type="PackedScene" uid="uid://ugsq7u4cue4w" path="res://battlers/bugcat/bugcat_anim.tscn" id="8_rgy6v"] -[ext_resource type="PackedScene" uid="uid://bl8bmbt7v3lrj" path="res://battlers/bear/bear_anim.tscn" id="9_jq0mb"] -[ext_resource type="Resource" uid="uid://chd4ncpr7k7lg" path="res://battlers/wolf/wolf_stats.tres" id="9_n8llw"] +[ext_resource type="Resource" uid="uid://bs4g81qa8u57q" path="res://combat/battlers/wolf/area_attack.tres" id="7_vldb3"] +[ext_resource type="Resource" uid="uid://752xsau3xyx0" path="res://combat/battlers/bugcat/quick_attack.tres" id="8_71nny"] +[ext_resource type="PackedScene" uid="uid://ugsq7u4cue4w" path="res://combat/battlers/bugcat/bugcat_anim.tscn" id="8_rgy6v"] +[ext_resource type="PackedScene" uid="uid://bl8bmbt7v3lrj" path="res://combat/battlers/bear/bear_anim.tscn" id="9_jq0mb"] +[ext_resource type="Resource" uid="uid://chd4ncpr7k7lg" path="res://combat/battlers/wolf/wolf_stats.tres" id="9_n8llw"] [ext_resource type="PackedScene" uid="uid://dlr2vdjcicdx4" path="res://src/combat/CombatAI.tscn" id="9_rktw6"] -[ext_resource type="Resource" uid="uid://dp7wo0l4es3w4" path="res://battlers/bear/player_melee_action.tres" id="13_232fw"] -[ext_resource type="Resource" uid="uid://ctimffr7v621e" path="res://battlers/bear/focus_attack.tres" id="14_lvnc8"] -[ext_resource type="Resource" uid="uid://c01ilo1olkfsm" path="res://battlers/squirrel/area_attack.tres" id="17_r76vx"] -[ext_resource type="Resource" uid="uid://cfj3osdc334ks" path="res://battlers/squirrel/heal_friendly.tres" id="18_fxlpy"] +[ext_resource type="Resource" uid="uid://dp7wo0l4es3w4" path="res://combat/battlers/bear/player_melee_action.tres" id="13_232fw"] +[ext_resource type="Resource" uid="uid://ctimffr7v621e" path="res://combat/battlers/bear/focus_attack.tres" id="14_lvnc8"] +[ext_resource type="Resource" uid="uid://c01ilo1olkfsm" path="res://combat/battlers/squirrel/area_attack.tres" id="17_r76vx"] +[ext_resource type="Resource" uid="uid://cfj3osdc334ks" path="res://combat/battlers/squirrel/heal_friendly.tres" id="18_fxlpy"] [node name="TestCombatArena" instance=ExtResource("1_tqh6v")] music = ExtResource("2_gvpi1") diff --git a/maps/town/conversation_encounter.gd b/overworld/maps/town/conversation_encounter.gd similarity index 100% rename from maps/town/conversation_encounter.gd rename to overworld/maps/town/conversation_encounter.gd diff --git a/maps/town/conversation_encounter.gd.uid b/overworld/maps/town/conversation_encounter.gd.uid similarity index 100% rename from maps/town/conversation_encounter.gd.uid rename to overworld/maps/town/conversation_encounter.gd.uid diff --git a/maps/town/door_unlock_interaction.gd b/overworld/maps/town/door_unlock_interaction.gd similarity index 98% rename from maps/town/door_unlock_interaction.gd rename to overworld/maps/town/door_unlock_interaction.gd index f47bd75d..43083de1 100644 --- a/maps/town/door_unlock_interaction.gd +++ b/overworld/maps/town/door_unlock_interaction.gd @@ -1,3 +1,4 @@ +@tool extends Interaction @onready var door: = get_parent() as Door diff --git a/maps/town/door_unlock_interaction.gd.uid b/overworld/maps/town/door_unlock_interaction.gd.uid similarity index 100% rename from maps/town/door_unlock_interaction.gd.uid rename to overworld/maps/town/door_unlock_interaction.gd.uid diff --git a/maps/town/encounter_before_combat.dtl b/overworld/maps/town/encounter_before_combat.dtl similarity index 100% rename from maps/town/encounter_before_combat.dtl rename to overworld/maps/town/encounter_before_combat.dtl diff --git a/maps/town/encounter_before_combat.dtl.uid b/overworld/maps/town/encounter_before_combat.dtl.uid similarity index 100% rename from maps/town/encounter_before_combat.dtl.uid rename to overworld/maps/town/encounter_before_combat.dtl.uid diff --git a/maps/town/encounter_on_loss.dtl b/overworld/maps/town/encounter_on_loss.dtl similarity index 100% rename from maps/town/encounter_on_loss.dtl rename to overworld/maps/town/encounter_on_loss.dtl diff --git a/maps/town/encounter_on_loss.dtl.uid b/overworld/maps/town/encounter_on_loss.dtl.uid similarity index 100% rename from maps/town/encounter_on_loss.dtl.uid rename to overworld/maps/town/encounter_on_loss.dtl.uid diff --git a/maps/town/encounter_on_victory.dtl b/overworld/maps/town/encounter_on_victory.dtl similarity index 100% rename from maps/town/encounter_on_victory.dtl rename to overworld/maps/town/encounter_on_victory.dtl diff --git a/maps/town/encounter_on_victory.dtl.uid b/overworld/maps/town/encounter_on_victory.dtl.uid similarity index 100% rename from maps/town/encounter_on_victory.dtl.uid rename to overworld/maps/town/encounter_on_victory.dtl.uid diff --git a/maps/town/enemy_ghost.dch b/overworld/maps/town/enemy_ghost.dch similarity index 100% rename from maps/town/enemy_ghost.dch rename to overworld/maps/town/enemy_ghost.dch diff --git a/maps/town/enemy_ghost.dch.uid b/overworld/maps/town/enemy_ghost.dch.uid similarity index 100% rename from maps/town/enemy_ghost.dch.uid rename to overworld/maps/town/enemy_ghost.dch.uid diff --git a/maps/town/fan_interaction.gd b/overworld/maps/town/fan_interaction.gd similarity index 65% rename from maps/town/fan_interaction.gd rename to overworld/maps/town/fan_interaction.gd index ec3f82fb..482b2c49 100644 --- a/maps/town/fan_interaction.gd +++ b/overworld/maps/town/fan_interaction.gd @@ -1,3 +1,4 @@ +@tool extends InteractionTemplateConversation @export var controller: GamepieceController @@ -8,8 +9,10 @@ extends InteractionTemplateConversation func _ready() -> void: super._ready() - assert(_adoring_fan, "Gamepiece was not found, check the node path!") - assert(controller, "Controller was not found, check the node path!") + + if not Engine.is_editor_hint(): + assert(_adoring_fan, "Gamepiece was not found, check the node path!") + assert(controller, "Controller was not found, check the node path!") func _execute() -> void: @@ -23,8 +26,15 @@ func _execute() -> void: func _on_initial_conversation_finished() -> void: - controller.travel_to_cell(Vector2(23, 13)) + var source_cell: = Gameboard.pixel_to_cell(_adoring_fan.position) + + # Everything is paused at the moment, so activate the fan's controller so that he can move on a + # path during the cutscene. + controller.is_active = true + controller.move_path = Gameboard.pathfinder.get_path_to_cell(source_cell, Vector2(23, 13)) + await _adoring_fan.arrived + controller.is_active = false # This conversation only emits a signal once: when the player should receive the quest reward. diff --git a/maps/town/fan_interaction.gd.uid b/overworld/maps/town/fan_interaction.gd.uid similarity index 100% rename from maps/town/fan_interaction.gd.uid rename to overworld/maps/town/fan_interaction.gd.uid diff --git a/maps/town/fan_of_four.dch b/overworld/maps/town/fan_of_four.dch similarity index 100% rename from maps/town/fan_of_four.dch rename to overworld/maps/town/fan_of_four.dch diff --git a/maps/town/fan_of_four.dch.uid b/overworld/maps/town/fan_of_four.dch.uid similarity index 100% rename from maps/town/fan_of_four.dch.uid rename to overworld/maps/town/fan_of_four.dch.uid diff --git a/maps/town/fan_of_four.dtl b/overworld/maps/town/fan_of_four.dtl similarity index 100% rename from maps/town/fan_of_four.dtl rename to overworld/maps/town/fan_of_four.dtl diff --git a/maps/town/fan_of_four.dtl.uid b/overworld/maps/town/fan_of_four.dtl.uid similarity index 100% rename from maps/town/fan_of_four.dtl.uid rename to overworld/maps/town/fan_of_four.dtl.uid diff --git a/maps/town/gang_of_four_conversation.gd b/overworld/maps/town/gang_of_four_conversation.gd similarity index 96% rename from maps/town/gang_of_four_conversation.gd rename to overworld/maps/town/gang_of_four_conversation.gd index f535dcb4..22decc7c 100644 --- a/maps/town/gang_of_four_conversation.gd +++ b/overworld/maps/town/gang_of_four_conversation.gd @@ -1,3 +1,4 @@ +@tool extends InteractionTemplateConversation diff --git a/maps/town/gang_of_four_conversation.gd.uid b/overworld/maps/town/gang_of_four_conversation.gd.uid similarity index 100% rename from maps/town/gang_of_four_conversation.gd.uid rename to overworld/maps/town/gang_of_four_conversation.gd.uid diff --git a/maps/town/monk.dch b/overworld/maps/town/monk.dch similarity index 100% rename from maps/town/monk.dch rename to overworld/maps/town/monk.dch diff --git a/maps/town/monk.dch.uid b/overworld/maps/town/monk.dch.uid similarity index 100% rename from maps/town/monk.dch.uid rename to overworld/maps/town/monk.dch.uid diff --git a/maps/town/monk.dtl b/overworld/maps/town/monk.dtl similarity index 100% rename from maps/town/monk.dtl rename to overworld/maps/town/monk.dtl diff --git a/maps/town/monk.dtl.uid b/overworld/maps/town/monk.dtl.uid similarity index 100% rename from maps/town/monk.dtl.uid rename to overworld/maps/town/monk.dtl.uid diff --git a/maps/town/runner.dch b/overworld/maps/town/runner.dch similarity index 100% rename from maps/town/runner.dch rename to overworld/maps/town/runner.dch diff --git a/maps/town/runner.dch.uid b/overworld/maps/town/runner.dch.uid similarity index 100% rename from maps/town/runner.dch.uid rename to overworld/maps/town/runner.dch.uid diff --git a/maps/town/runner.dtl b/overworld/maps/town/runner.dtl similarity index 100% rename from maps/town/runner.dtl rename to overworld/maps/town/runner.dtl diff --git a/maps/town/runner.dtl.uid b/overworld/maps/town/runner.dtl.uid similarity index 100% rename from maps/town/runner.dtl.uid rename to overworld/maps/town/runner.dtl.uid diff --git a/maps/town/sign.dtl b/overworld/maps/town/sign.dtl similarity index 100% rename from maps/town/sign.dtl rename to overworld/maps/town/sign.dtl diff --git a/maps/town/sign.dtl.uid b/overworld/maps/town/sign.dtl.uid similarity index 100% rename from maps/town/sign.dtl.uid rename to overworld/maps/town/sign.dtl.uid diff --git a/maps/town/smith.dch b/overworld/maps/town/smith.dch similarity index 100% rename from maps/town/smith.dch rename to overworld/maps/town/smith.dch diff --git a/maps/town/smith.dch.uid b/overworld/maps/town/smith.dch.uid similarity index 100% rename from maps/town/smith.dch.uid rename to overworld/maps/town/smith.dch.uid diff --git a/maps/town/smith.dtl b/overworld/maps/town/smith.dtl similarity index 100% rename from maps/town/smith.dtl rename to overworld/maps/town/smith.dtl diff --git a/maps/town/smith.dtl.uid b/overworld/maps/town/smith.dtl.uid similarity index 100% rename from maps/town/smith.dtl.uid rename to overworld/maps/town/smith.dtl.uid diff --git a/maps/town/strange_tree.dtl b/overworld/maps/town/strange_tree.dtl similarity index 100% rename from maps/town/strange_tree.dtl rename to overworld/maps/town/strange_tree.dtl diff --git a/maps/town/strange_tree.dtl.uid b/overworld/maps/town/strange_tree.dtl.uid similarity index 100% rename from maps/town/strange_tree.dtl.uid rename to overworld/maps/town/strange_tree.dtl.uid diff --git a/maps/town/strange_tree_interaction.gd b/overworld/maps/town/strange_tree_interaction.gd similarity index 88% rename from maps/town/strange_tree_interaction.gd rename to overworld/maps/town/strange_tree_interaction.gd index 66ea7ecd..20459ec0 100644 --- a/maps/town/strange_tree_interaction.gd +++ b/overworld/maps/town/strange_tree_interaction.gd @@ -1,4 +1,5 @@ # Opens up a secret path once the 'Strange Tree' has been interacted with twice. +@tool extends InteractionTemplateConversation @onready var _anim: = $AnimationPlayer as AnimationPlayer @@ -23,9 +24,5 @@ func _on_dialogic_signal_event(_argument: String) -> void: _popup.hide_and_free() # Clearing the secret path is controlled exclusively by the animation player. - # Once the animation has finished, pathfinders will need to be updated via the - # terrain_chagned signal below. _anim.play("disappear") await _anim.animation_finished - - FieldEvents.terrain_changed.emit() diff --git a/maps/town/strange_tree_interaction.gd.uid b/overworld/maps/town/strange_tree_interaction.gd.uid similarity index 100% rename from maps/town/strange_tree_interaction.gd.uid rename to overworld/maps/town/strange_tree_interaction.gd.uid diff --git a/maps/town/thief.dch b/overworld/maps/town/thief.dch similarity index 100% rename from maps/town/thief.dch rename to overworld/maps/town/thief.dch diff --git a/maps/town/thief.dch.uid b/overworld/maps/town/thief.dch.uid similarity index 100% rename from maps/town/thief.dch.uid rename to overworld/maps/town/thief.dch.uid diff --git a/maps/town/thief.dtl b/overworld/maps/town/thief.dtl similarity index 100% rename from maps/town/thief.dtl rename to overworld/maps/town/thief.dtl diff --git a/maps/town/thief.dtl.uid b/overworld/maps/town/thief.dtl.uid similarity index 100% rename from maps/town/thief.dtl.uid rename to overworld/maps/town/thief.dtl.uid diff --git a/maps/town/warrior.dch b/overworld/maps/town/warrior.dch similarity index 100% rename from maps/town/warrior.dch rename to overworld/maps/town/warrior.dch diff --git a/maps/town/warrior.dch.uid b/overworld/maps/town/warrior.dch.uid similarity index 100% rename from maps/town/warrior.dch.uid rename to overworld/maps/town/warrior.dch.uid diff --git a/maps/town/warrior.dtl b/overworld/maps/town/warrior.dtl similarity index 100% rename from maps/town/warrior.dtl rename to overworld/maps/town/warrior.dtl diff --git a/maps/town/warrior.dtl.uid b/overworld/maps/town/warrior.dtl.uid similarity index 100% rename from maps/town/warrior.dtl.uid rename to overworld/maps/town/warrior.dtl.uid diff --git a/maps/town/wizard.dch b/overworld/maps/town/wizard.dch similarity index 100% rename from maps/town/wizard.dch rename to overworld/maps/town/wizard.dch diff --git a/maps/town/wizard.dch.uid b/overworld/maps/town/wizard.dch.uid similarity index 100% rename from maps/town/wizard.dch.uid rename to overworld/maps/town/wizard.dch.uid diff --git a/maps/town/wizard.dtl b/overworld/maps/town/wizard.dtl similarity index 100% rename from maps/town/wizard.dtl rename to overworld/maps/town/wizard.dtl diff --git a/maps/town/wizard.dtl.uid b/overworld/maps/town/wizard.dtl.uid similarity index 100% rename from maps/town/wizard.dtl.uid rename to overworld/maps/town/wizard.dtl.uid diff --git a/project.godot b/project.godot index bfd2295b..65a8cb8a 100644 --- a/project.godot +++ b/project.godot @@ -20,7 +20,10 @@ config/icon="res://icon.svg" Camera="*res://src/field/field_camera.gd" CombatEvents="*res://src/combat/combat_events.gd" FieldEvents="*res://src/field/field_events.gd" +Gameboard="*res://src/field/gameboard/gameboard.gd" +GamepieceRegistry="*res://src/field/gamepieces/gamepiece_registry.gd" Music="*res://src/common/music/music_player.tscn" +Player="*res://src/common/player.gd" Transition="*res://src/common/screen_transitions/ScreenTransition.tscn" Dialogic="*res://addons/dialogic/Core/DialogicGameHandler.gd" @@ -70,33 +73,33 @@ animations/leave_default="res://addons/dialogic/Modules/Character/DefaultAnimati text/autocolor_names=true settings/text_speed=1.0 directories/dch_directory={ -"enemy_ghost": "res://maps/town/enemy_ghost.dch", -"fan_of_four": "res://maps/town/fan_of_four.dch", -"ghost": "res://maps/grove/ghost.dch", -"monk": "res://maps/town/monk.dch", -"runner": "res://maps/town/runner.dch", -"smith": "res://maps/town/smith.dch", -"thief": "res://maps/town/thief.dch", -"warrior": "res://maps/town/warrior.dch", -"wizard": "res://maps/town/wizard.dch" +"enemy_ghost": "res://overworld/maps/town/enemy_ghost.dch", +"fan_of_four": "res://overworld/maps/town/fan_of_four.dch", +"ghost": "res://overworld/maps/forest/ghost.dch", +"monk": "res://overworld/maps/town/monk.dch", +"runner": "res://overworld/maps/town/runner.dch", +"smith": "res://overworld/maps/town/smith.dch", +"thief": "res://overworld/maps/town/thief.dch", +"warrior": "res://overworld/maps/town/warrior.dch", +"wizard": "res://overworld/maps/town/wizard.dch" } directories/dtl_directory={ -"encounter_before_combat": "res://maps/town/encounter_before_combat.dtl", -"encounter_on_loss": "res://maps/town/encounter_on_loss.dtl", -"encounter_on_victory": "res://maps/town/encounter_on_victory.dtl", -"fan_of_four": "res://maps/town/fan_of_four.dtl", -"ghost": "res://maps/grove/ghost.dtl", -"monk": "res://maps/town/monk.dtl", -"opening_cutscene": "res://maps/opening_cutscene.dtl", -"runner": "res://maps/town/runner.dtl", -"sign": "res://maps/town/sign.dtl", -"smith": "res://maps/town/smith.dtl", -"strange_tree": "res://maps/town/strange_tree.dtl", -"thief": "res://maps/town/thief.dtl", -"wand_pedestal": "res://maps/house/wand_pedestal.dtl", -"wand_pedestal_occupied": "res://maps/house/wand_pedestal_occupied.dtl", -"warrior": "res://maps/town/warrior.dtl", -"wizard": "res://maps/town/wizard.dtl" +"encounter_before_combat": "res://overworld/maps/town/encounter_before_combat.dtl", +"encounter_on_loss": "res://overworld/maps/town/encounter_on_loss.dtl", +"encounter_on_victory": "res://overworld/maps/town/encounter_on_victory.dtl", +"fan_of_four": "res://overworld/maps/town/fan_of_four.dtl", +"ghost": "res://overworld/maps/forest/ghost.dtl", +"monk": "res://overworld/maps/town/monk.dtl", +"opening_cutscene": "res://overworld/maps/opening_cutscene.dtl", +"runner": "res://overworld/maps/town/runner.dtl", +"sign": "res://overworld/maps/town/sign.dtl", +"smith": "res://overworld/maps/town/smith.dtl", +"strange_tree": "res://overworld/maps/town/strange_tree.dtl", +"thief": "res://overworld/maps/town/thief.dtl", +"wand_pedestal": "res://overworld/maps/house/wand_pedestal.dtl", +"wand_pedestal_occupied": "res://overworld/maps/house/wand_pedestal_occupied.dtl", +"warrior": "res://overworld/maps/town/warrior.dtl", +"wizard": "res://overworld/maps/town/wizard.dtl" } text/initial_text_reveal_skippable=true text/text_reveal_skip_delay=0.05 diff --git a/src/combat/ui/action_menu/ui_action_button.tscn b/src/combat/ui/action_menu/ui_action_button.tscn index 26c30084..6516434d 100644 --- a/src/combat/ui/action_menu/ui_action_button.tscn +++ b/src/combat/ui/action_menu/ui_action_button.tscn @@ -5,7 +5,7 @@ [ext_resource type="Texture2D" uid="uid://dllh3cswof4m1" path="res://src/combat/ui/action_menu/menu_action_bg_pressed.png" id="2_4uiu2"] [ext_resource type="Texture2D" uid="uid://d2vajhpv3eb8i" path="res://src/combat/ui/action_menu/menu_action_bg_disabled.png" id="3_5oias"] [ext_resource type="Texture2D" uid="uid://kyl3dpbphoik" path="res://src/combat/ui/action_menu/menu_action_bg_focused.png" id="4_gyvxq"] -[ext_resource type="Texture2D" uid="uid://y2fg5cf57i7t" path="res://battlers/bear/icon_punch.svg" id="6_1t1bw"] +[ext_resource type="Texture2D" uid="uid://y2fg5cf57i7t" path="res://combat/battlers/bear/icon_punch.svg" id="6_1t1bw"] [ext_resource type="FontFile" uid="uid://d12hnvq203mdg" path="res://assets/gui/font/SourceCodePro-Bold.ttf" id="7_gvn2i"] [sub_resource type="LabelSettings" id="LabelSettings_f2eql"] diff --git a/src/combat/ui/turn_bar/ui_battler_icon.tscn b/src/combat/ui/turn_bar/ui_battler_icon.tscn index 9c8e0a4a..ddb09649 100644 --- a/src/combat/ui/turn_bar/ui_battler_icon.tscn +++ b/src/combat/ui/turn_bar/ui_battler_icon.tscn @@ -2,7 +2,7 @@ [ext_resource type="Texture2D" uid="uid://bt4jp5jwumaxr" path="res://src/combat/ui/turn_bar/portrait_bg_player.png" id="1_ba558"] [ext_resource type="Script" uid="uid://dckveflvxdyse" path="res://src/combat/ui/turn_bar/ui_battler_icon.gd" id="2_471d1"] -[ext_resource type="Texture2D" uid="uid://pkp6t20skjpe" path="res://battlers/bear/bear.png" id="2_qfsow"] +[ext_resource type="Texture2D" uid="uid://pkp6t20skjpe" path="res://combat/battlers/bear/bear.png" id="2_qfsow"] [sub_resource type="Animation" id="Animation_ih8oe"] length = 0.001 diff --git a/src/common/directions.gd b/src/common/directions.gd index 867baf32..bd77d293 100644 --- a/src/common/directions.gd +++ b/src/common/directions.gd @@ -5,6 +5,18 @@ extends RefCounted ## Abbreviations for 8 cardinal points (i.e. NW = Northwest, or Vector2[-1, -1]). enum Points { NW, N, NE, E, SE, S, SW, W } +## The [Vector2i] form of a given cardinal point. That is, North is Vector2i(0, -1), etc. +const MAPPINGS: = { + #Directions.Points.NW: Vector2i(-1, -1), + Directions.Points.N: Vector2i.UP, + #Directions.Points.NE: Vector2i(1, -1), + Directions.Points.E: Vector2i.RIGHT, + #Directions.Points.SE: Vector2i(1, 1), + Directions.Points.S: Vector2i.DOWN, + #Directions.Points.SW: Vector2i(-1, 1), + Directions.Points.W: Vector2i.LEFT, +} + ## Convert an angle, such as from [method Vector2.angle], to a [constant Points]. static func angle_to_direction(angle: float) -> Points: @@ -16,3 +28,7 @@ static func angle_to_direction(angle: float) -> Points: return Points.S return Points.W + + +static func vector_to_direction(vector: Vector2) -> Points: + return angle_to_direction(vector.angle()) diff --git a/src/common/player.gd b/src/common/player.gd new file mode 100644 index 00000000..1483d833 --- /dev/null +++ b/src/common/player.gd @@ -0,0 +1,20 @@ +## An autoload that provides easy access to the player's state, including both Combat and Field +## details. +## Reference to the player's party, inventory, and currently active character are found here. +## Additionally, game-wide player based signals are emitted from here. +extends Node + +## Emitted whenever the player's gamepiece changes. +signal gamepiece_changed + +## Emitted when the player sets a movement path for their focused gamepiece. +## The destination is the last cell in the path. +@warning_ignore("unused_signal") +signal player_path_set(gamepiece: Gamepiece, destination_cell: Vector2i) + +## The gamepeice that the player is currently controlling. This is a read-only property. +var gamepiece: Gamepiece = null: + set(value): + if value != gamepiece: + gamepiece = value + gamepiece_changed.emit() diff --git a/src/common/player.gd.uid b/src/common/player.gd.uid new file mode 100644 index 00000000..18e69079 --- /dev/null +++ b/src/common/player.gd.uid @@ -0,0 +1 @@ +uid://d3r1nl6y28h5b diff --git a/src/field/cutscenes/Interaction.tscn b/src/field/cutscenes/Interaction.tscn index 95578cd3..896f5492 100644 --- a/src/field/cutscenes/Interaction.tscn +++ b/src/field/cutscenes/Interaction.tscn @@ -16,5 +16,14 @@ collision_mask = 8 shape = SubResource("CircleShape2D_jn5tq") debug_color = Color(1, 0.929412, 0.631373, 0.419608) +[node name="Button" type="Button" parent="."] +offset_left = -8.0 +offset_top = -8.0 +offset_right = 8.0 +offset_bottom = 8.0 +focus_mode = 0 +mouse_filter = 1 +flat = true + [connection signal="area_entered" from="InteractionArea2D" to="." method="_on_area_entered"] [connection signal="area_exited" from="InteractionArea2D" to="." method="_on_area_exited"] diff --git a/src/field/cutscenes/interaction.gd b/src/field/cutscenes/interaction.gd index a45ba283..27aaf5e0 100644 --- a/src/field/cutscenes/interaction.gd +++ b/src/field/cutscenes/interaction.gd @@ -5,6 +5,8 @@ ## An active Interaction may be run by the player walking up to it and 'interacting' with it, ## usually via something as ubiquitous as the spacebar key. Common examples found in most RPGs are ## NPC conversations, opening treasure chests, activating a save point, etc. +## An edge case occurs when the player clicks on an interaction, though the player is far away. We +## only want to report the top-most interaction as being clicked. ## ##[br][br] ## Interactions handle player input directly and are activated according to the presence of the @@ -44,12 +46,25 @@ class_name Interaction extends Cutscene # running events are relevant. var _overlapping_areas: = [] +# A hidden Button control tells us when the player has clicked on the interaction. Note that only +# the topmost button may be clicked. +@onready var _button: Button = $Button + func _ready(): set_process_unhandled_input(false) if not Engine.is_editor_hint(): FieldEvents.input_paused.connect(_on_input_paused) + + # The button does not stop all mouse/touch input, otherwise the user could not highlight + # selectable cells. Instead, the GUI must prevent only clicks from propogating and should + # forward the general interaction_selected event. + _button.pressed.connect( + func _on_button_pressed() -> void: + _button.accept_event() # Stop the click event from being passed to _unhandled_input. + FieldEvents.interaction_selected.emit(self) + ) # Ensure that something is connected to _on_area_entered and _on_area_exited, which the Interaction diff --git a/src/field/cutscenes/popups/interaction_popup.tscn b/src/field/cutscenes/popups/interaction_popup.tscn index 1d117d95..c6cdb2db 100644 --- a/src/field/cutscenes/popups/interaction_popup.tscn +++ b/src/field/cutscenes/popups/interaction_popup.tscn @@ -8,6 +8,7 @@ radius = 32.0 [node name="InteractionPopup" instance=ExtResource("1_582ge")] script = ExtResource("2_2fot7") +emote = 1 radius = 32 is_active = true @@ -18,6 +19,7 @@ position = Vector2(0, -12) show_behind_parent = true collision_layer = 0 collision_mask = 4 +input_pickable = false monitorable = false [node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D" index="0"] diff --git a/src/field/cutscenes/popups/moving_interaction_popup.gd b/src/field/cutscenes/popups/moving_interaction_popup.gd index a8aac8a9..a164e54c 100644 --- a/src/field/cutscenes/popups/moving_interaction_popup.gd +++ b/src/field/cutscenes/popups/moving_interaction_popup.gd @@ -1,31 +1,37 @@ @tool -## An [InteractionPopup] that follows a moving [GamepieceAnimation]. +## An [InteractionPopup] that follows a moving [Gamepiece]. ## -## This [code]Popup[/code] must be a child of a [GamepieceAnimation] to function. +## This [code]Popup[/code] must be a child of a [Gamepiece] to function. ## ## Note that other popup types will jump to the occupied cell of the ancestor [Gamepiece], whereas ## MovingInteractionPopups sync their position to that of the gamepiece's graphical representation. extends InteractionPopup -@onready var _gp_animation: = get_parent() as GamepieceAnimation +@onready var _gp: = get_parent() as Gamepiece func _ready() -> void: super._ready() # Do not follow anything in editor or if this object's parent is not of the correct type. - if Engine.is_editor_hint() or not _gp_animation: + if Engine.is_editor_hint() or not _gp: set_process(false) func _get_configuration_warnings() -> PackedStringArray: - if not get_parent() is GamepieceAnimation: - return ["This popup must be a child of a GamepieceAnimation node!"] + if not _gp: + return ["This popup must be a child of a Gamepiece node!"] return [] +func _notification(what: int) -> void: + if what == NOTIFICATION_PARENTED: + _gp = get_parent() as Gamepiece + update_configuration_warnings() + + # Every process frame the popup sets its position to that of the graphical representation of the # gamepiece, appearing to follow the gamepiece around the field while still playing nicely with the # physics/interaction system. func _process(_delta: float) -> void: - position = _gp_animation.get_gfx_position() + position = _gp.follower.position diff --git a/src/field/cutscenes/templates/area_transitions/area_transition.gd b/src/field/cutscenes/templates/area_transitions/area_transition.gd index 4a676356..d80ac6d2 100644 --- a/src/field/cutscenes/templates/area_transitions/area_transition.gd +++ b/src/field/cutscenes/templates/area_transitions/area_transition.gd @@ -49,8 +49,10 @@ func _on_area_entered(area: Area2D) -> void: # Move the gamepiece to it's new position and update the camera immediately. var gamepiece: = area.owner as Gamepiece if gamepiece: - gamepiece.cell = gamepiece.gameboard.pixel_to_cell(arrival_coordinates) - gamepiece.reset_travel() + gamepiece.stop() + gamepiece.position = arrival_coordinates + GamepieceRegistry.move_gamepiece(gamepiece, Gameboard.pixel_to_cell(arrival_coordinates)) + Camera.reset_position() diff --git a/src/field/cutscenes/templates/area_transitions/area_transition.tscn b/src/field/cutscenes/templates/area_transitions/area_transition.tscn index aa4c850c..ceafb407 100644 --- a/src/field/cutscenes/templates/area_transitions/area_transition.tscn +++ b/src/field/cutscenes/templates/area_transitions/area_transition.tscn @@ -8,6 +8,7 @@ script = ExtResource("2_l3ptr") arrival_coordinates = Vector2(0, 0) new_music = null +is_active = true [node name="Destination" type="Sprite2D" parent="." index="1"] texture = ExtResource("3_retee") diff --git a/src/field/cutscenes/templates/combat/roaming_combat_trigger.gd b/src/field/cutscenes/templates/combat/roaming_combat_trigger.gd index 12114811..0d41232c 100644 --- a/src/field/cutscenes/templates/combat/roaming_combat_trigger.gd +++ b/src/field/cutscenes/templates/combat/roaming_combat_trigger.gd @@ -1,29 +1,12 @@ @tool extends CombatTrigger -@onready var gamepiece: = get_parent() as Gamepiece - -func _get_configuration_warnings() -> PackedStringArray: - var warnings: PackedStringArray = [] - if not gamepiece: - warnings.append("This object must be a child of a gamepiece!") - - return warnings - - -func _notification(what: int) -> void: - if what == NOTIFICATION_PARENTED: - gamepiece = get_parent() as Gamepiece - update_configuration_warnings() - - -# If the player has defeated this 'roaming encounter', remove the encounterable gamepiece. +# If the player has defeated this 'roaming encounter', remove the encounter. func _run_victory_cutscene() -> void: - if gamepiece: - gamepiece.queue_free() + queue_free() -# If the player has lost to this 'roaming encounter', incur the game-over screen. +# If the player has lost to this 'roaming encounter', play the game-over screen. func _run_loss_cutscene() -> void: await get_tree().process_frame diff --git a/src/field/cutscenes/templates/doors/door.gd b/src/field/cutscenes/templates/doors/door.gd index b5c1b637..caa14b93 100644 --- a/src/field/cutscenes/templates/doors/door.gd +++ b/src/field/cutscenes/templates/doors/door.gd @@ -1,23 +1,34 @@ @tool - class_name Door extends AreaTransition +# A locked door will block movement by placing a dummy gamepiece on the cell occupied by the door. +const GP_SCENE: = preload("res://src/field/gamepieces/gamepiece.tscn") + @export var is_locked: = false: set(value): - is_locked = value - - if not Engine.is_editor_hint(): + if value != is_locked: + is_locked = value + if not is_inside_tree(): await ready - _blocking_area.get_node("CollisionShape2D").disabled = !is_locked + if is_locked: + if _dummy_gp == null: + _dummy_gp = GP_SCENE.instantiate() + _dummy_gp.name = "CellBlocker" + _closed_door.add_child(_dummy_gp) - # Wait one frame for the physics server to update before rebuilding the pathfinders. - await get_tree().physics_frame - FieldEvents.terrain_changed.emit() + else: + open() + if _dummy_gp != null: + _dummy_gp.queue_free() + _dummy_gp = null + +# Keep a reference to the object used to block movement through a locked door. +# Note that this gamepiece has no animation, movement, etc. It exists to occupy a board cell. +var _dummy_gp: Gamepiece = null @onready var _anim: = $AnimationPlayer as AnimationPlayer -@onready var _blocking_area: = $Area2D/ClosedDoor/BlockingArea as Area2D @onready var _closed_door: = $Area2D/ClosedDoor as Sprite2D diff --git a/src/field/cutscenes/templates/doors/door.tscn b/src/field/cutscenes/templates/doors/door.tscn index cf947d41..642f5334 100644 --- a/src/field/cutscenes/templates/doors/door.tscn +++ b/src/field/cutscenes/templates/doors/door.tscn @@ -1,16 +1,13 @@ -[gd_scene load_steps=14 format=3 uid="uid://p0e4b0txynkd"] +[gd_scene load_steps=13 format=3 uid="uid://p0e4b0txynkd"] [ext_resource type="PackedScene" uid="uid://bd624fi8r2avm" path="res://src/field/cutscenes/templates/area_transitions/area_transition.tscn" id="1_0tk0k"] -[ext_resource type="Texture2D" uid="uid://d2qfi5sncf72b" path="res://assets/terrain/town_tilemap.png" id="2_4mdkx"] +[ext_resource type="Texture2D" uid="uid://d2qfi5sncf72b" path="res://overworld/maps/tilesets/town_tilemap.png" id="2_4mdkx"] [ext_resource type="Script" uid="uid://st17bkmvrohu" path="res://src/field/cutscenes/templates/doors/door.gd" id="2_13rnv"] [ext_resource type="AudioStream" uid="uid://c6o0qv4eig4q" path="res://assets/sfx/doorClose_1.ogg" id="4_d3ljg"] [ext_resource type="AudioStream" uid="uid://bww5xt1qrtltu" path="res://assets/sfx/impactWood_light_003.ogg" id="5_b854r"] [ext_resource type="AudioStream" uid="uid://bt1obi05x1xda" path="res://assets/sfx/impactWood_light_002.ogg" id="6_ui4yk"] [ext_resource type="FontFile" uid="uid://cfhyd5hmym1s4" path="res://assets/gui/font/Kenney Pixel.ttf" id="7_er0br"] -[sub_resource type="RectangleShape2D" id="RectangleShape2D_xgpwx"] -size = Vector2(15, 15) - [sub_resource type="Animation" id="Animation_8loys"] length = 0.001 tracks/0/type = "value" @@ -22,7 +19,7 @@ tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 1, +"update": 0, "values": [true] } tracks/1/type = "value" @@ -134,7 +131,7 @@ tracks/0/loop_wrap = true tracks/0/keys = { "times": PackedFloat32Array(0), "transitions": PackedFloat32Array(1), -"update": 1, +"update": 0, "values": [false] } tracks/1/type = "audio" @@ -183,16 +180,9 @@ texture = ExtResource("2_4mdkx") region_enabled = true region_rect = Rect2(17, 119, 16, 16) -[node name="BlockingArea" type="Area2D" parent="Area2D/ClosedDoor" index="0"] -collision_mask = 0 -monitoring = false - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D/ClosedDoor/BlockingArea" index="0"] -shape = SubResource("RectangleShape2D_xgpwx") - [node name="AnimationPlayer" type="AnimationPlayer" parent="." index="3"] libraries = { -"": SubResource("AnimationLibrary_k2tlp") +&"": SubResource("AnimationLibrary_k2tlp") } autoplay = "RESET" diff --git a/src/field/cutscenes/templates/treasure_chests/treasure_chest.gd b/src/field/cutscenes/templates/treasure_chests/treasure_chest.gd new file mode 100644 index 00000000..fdd7c28c --- /dev/null +++ b/src/field/cutscenes/templates/treasure_chests/treasure_chest.gd @@ -0,0 +1,15 @@ +@tool +extends Gamepiece + +@export var item_type: Inventory.ItemTypes +@export var amount: = 1 + +@onready var interaction: = $Interaction as Interaction + + +func _ready() -> void: + super._ready() + + if not Engine.is_editor_hint(): + interaction.item_type = item_type + interaction.amount = amount diff --git a/src/field/cutscenes/templates/treasure_chests/treasure_chest.gd.uid b/src/field/cutscenes/templates/treasure_chests/treasure_chest.gd.uid new file mode 100644 index 00000000..8eeaa6ab --- /dev/null +++ b/src/field/cutscenes/templates/treasure_chests/treasure_chest.gd.uid @@ -0,0 +1 @@ +uid://cgwq0j8de7mxv diff --git a/src/field/cutscenes/templates/treasure_chests/chest.tscn b/src/field/cutscenes/templates/treasure_chests/treasure_chest.tscn similarity index 67% rename from src/field/cutscenes/templates/treasure_chests/chest.tscn rename to src/field/cutscenes/templates/treasure_chests/treasure_chest.tscn index 0233b18e..ba2c3fcc 100644 --- a/src/field/cutscenes/templates/treasure_chests/chest.tscn +++ b/src/field/cutscenes/templates/treasure_chests/treasure_chest.tscn @@ -1,11 +1,13 @@ -[gd_scene load_steps=12 format=3 uid="uid://c8jtuge5yaqxa"] +[gd_scene load_steps=13 format=3 uid="uid://c3trg4x6hiuul"] -[ext_resource type="PackedScene" uid="uid://oot0x5n44b2r" path="res://src/field/cutscenes/Interaction.tscn" id="1_pr2rt"] -[ext_resource type="Script" uid="uid://dqccuka0umesn" path="res://src/field/cutscenes/templates/treasure_chests/chest.gd" id="2_55lx5"] -[ext_resource type="Texture2D" uid="uid://dm4h0uo6gjp22" path="res://assets/terrain/dungeon_tilemap.png" id="3_gr80q"] -[ext_resource type="AudioStream" uid="uid://cwpbiytveaon0" path="res://assets/sfx/doorOpen_2.ogg" id="4_6verl"] -[ext_resource type="AudioStream" uid="uid://d0fqunqsgssgd" path="res://assets/sfx/doorClose_4.ogg" id="5_fwhp7"] -[ext_resource type="PackedScene" uid="uid://cubp81mykng3h" path="res://src/field/cutscenes/popups/interaction_popup.tscn" id="6_hmx7o"] +[ext_resource type="PackedScene" uid="uid://b626e0bngfvjj" path="res://src/field/gamepieces/gamepiece.tscn" id="1_3w6ce"] +[ext_resource type="Script" uid="uid://cgwq0j8de7mxv" path="res://src/field/cutscenes/templates/treasure_chests/treasure_chest.gd" id="2_hxwix"] +[ext_resource type="PackedScene" uid="uid://oot0x5n44b2r" path="res://src/field/cutscenes/Interaction.tscn" id="2_s6euu"] +[ext_resource type="Script" uid="uid://dqccuka0umesn" path="res://src/field/cutscenes/templates/treasure_chests/treasure_chest_interaction.gd" id="4_3t0c6"] +[ext_resource type="Texture2D" uid="uid://dm4h0uo6gjp22" path="res://overworld/maps/tilesets/dungeon_tilemap.png" id="4_5fem6"] +[ext_resource type="AudioStream" uid="uid://d0fqunqsgssgd" path="res://assets/sfx/doorClose_4.ogg" id="5_3t0c6"] +[ext_resource type="AudioStream" uid="uid://cwpbiytveaon0" path="res://assets/sfx/doorOpen_2.ogg" id="6_rtaj3"] +[ext_resource type="PackedScene" uid="uid://cubp81mykng3h" path="res://src/field/cutscenes/popups/interaction_popup.tscn" id="7_3s1uf"] [sub_resource type="Animation" id="Animation_upvuf"] length = 0.001 @@ -47,7 +49,7 @@ tracks/1/keys = { "clips": [{ "end_offset": 0.0, "start_offset": 0.0, -"stream": ExtResource("5_fwhp7") +"stream": ExtResource("5_3t0c6") }], "times": PackedFloat32Array(0) } @@ -78,7 +80,7 @@ tracks/1/keys = { "clips": [{ "end_offset": 0.0, "start_offset": 0.0, -"stream": ExtResource("4_6verl") +"stream": ExtResource("6_rtaj3") }], "times": PackedFloat32Array(0) } @@ -91,33 +93,28 @@ _data = { &"open": SubResource("Animation_a1cbh") } -[sub_resource type="RectangleShape2D" id="RectangleShape2D_11osp"] -size = Vector2(15, 15) +[node name="TreasureChest" instance=ExtResource("1_3w6ce")] +script = ExtResource("2_hxwix") +item_type = null +amount = null -[node name="Chest" instance=ExtResource("1_pr2rt")] -script = ExtResource("2_55lx5") -item_type = 0 -amount = 1 +[node name="Interaction" parent="." index="1" node_paths=PackedStringArray("anim", "popup") instance=ExtResource("2_s6euu")] +script = ExtResource("4_3t0c6") +anim = NodePath("../AnimationPlayer") +popup = NodePath("../InteractionPopup") -[node name="Sprite2D" type="Sprite2D" parent="." index="1"] -texture = ExtResource("3_gr80q") +[node name="Sprite2D" type="Sprite2D" parent="." index="2"] +texture = ExtResource("4_5fem6") region_enabled = true region_rect = Rect2(85, 119, 16, 16) -[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="2"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="." index="3"] libraries = { -"": SubResource("AnimationLibrary_novt7") +&"": SubResource("AnimationLibrary_novt7") } -[node name="OpenAudio" type="AudioStreamPlayer" parent="." index="3"] +[node name="OpenAudio" type="AudioStreamPlayer" parent="." index="4"] bus = &"SFX" -[node name="MovementBlock" type="Area2D" parent="." index="4"] -collision_mask = 0 -monitoring = false - -[node name="CollisionShape2D" type="CollisionShape2D" parent="MovementBlock" index="0"] -shape = SubResource("RectangleShape2D_11osp") - -[node name="InteractionPopup" parent="." index="5" instance=ExtResource("6_hmx7o")] -emote = 1 +[node name="InteractionPopup" parent="." index="5" instance=ExtResource("7_3s1uf")] +emote = 2 diff --git a/src/field/cutscenes/templates/treasure_chests/chest.gd b/src/field/cutscenes/templates/treasure_chests/treasure_chest_interaction.gd similarity index 53% rename from src/field/cutscenes/templates/treasure_chests/chest.gd rename to src/field/cutscenes/templates/treasure_chests/treasure_chest_interaction.gd index 45225a99..50ef4aa6 100644 --- a/src/field/cutscenes/templates/treasure_chests/chest.gd +++ b/src/field/cutscenes/templates/treasure_chests/treasure_chest_interaction.gd @@ -1,30 +1,33 @@ +@tool +# An interaction that opens and closes an animated chest and adds an item to the player's inventory. +# The item is only added the first time the player opens the chest. extends Interaction -@export var item_type: Inventory.ItemTypes -@export var amount: = 1 +@export var anim: AnimationPlayer +@export var popup: InteractionPopup + +var item_type: Inventory.ItemTypes +var amount: = 1 var _is_open: = false var _item_received: = false: set(value): _item_received = value if _item_received: - _popup.hide_and_free() - -@onready var _anim: = $AnimationPlayer as AnimationPlayer -@onready var _popup: = $InteractionPopup + popup.hide_and_free() # Open or close the chest, depending on whether it is closed or open. # If this is the first time opening it, apply the items inside to the player's inventory. func _execute() -> void: if _is_open: - _anim.play("close") - await _anim.animation_finished + anim.play("close") + await anim.animation_finished _is_open = false else: - _anim.play("open") - await _anim.animation_finished + anim.play("open") + await anim.animation_finished if not _item_received: Inventory.restore().add(item_type, amount) diff --git a/src/field/cutscenes/templates/treasure_chests/chest.gd.uid b/src/field/cutscenes/templates/treasure_chests/treasure_chest_interaction.gd.uid similarity index 100% rename from src/field/cutscenes/templates/treasure_chests/chest.gd.uid rename to src/field/cutscenes/templates/treasure_chests/treasure_chest_interaction.gd.uid diff --git a/src/field/cutscenes/trigger.gd b/src/field/cutscenes/trigger.gd index e6c22897..fc635e2e 100644 --- a/src/field/cutscenes/trigger.gd +++ b/src/field/cutscenes/trigger.gd @@ -83,14 +83,14 @@ func _on_area_entered(area: Area2D) -> void: # Check to make sure that the gamepiece is moving before connecting to its 'arriving' # signal. This catches edge cases where the Trigger is unpaused while a colliding object - # is standing on top of it (which would mean that _on_gamepiece_arriving would trigger once + # is standing on top of it (which would mean that _on_gamepiece_arrived would trigger once # the gamepiece moves OFF of it. Which is bad.). if gamepiece and gamepiece.is_moving(): gamepiece_entered.emit(gamepiece) - gamepiece.arriving.connect(_on_gamepiece_arriving.bind(gamepiece), CONNECT_ONE_SHOT) + gamepiece.arrived.connect(_on_gamepiece_arrived.bind(gamepiece), CONNECT_ONE_SHOT) - # Triggers need to block input early. Otherwise, if waiting until the gamepiece is arriving, - # there's a chance that the player's controller may have received the gamepiece.arriving + # Triggers need to block input early. Otherwise, if waiting until the gamepiece has arrived, + # there's a chance that the player's controller may have received the gamepiece.arrived # signal first and continue moving the gamepiece. await get_tree().process_frame _is_cutscene_in_progress = true @@ -102,6 +102,6 @@ func _on_area_exited(area: Area2D) -> void: gamepiece_exited.emit(gamepiece) -func _on_gamepiece_arriving(_distance: float, gamepiece: Gamepiece) -> void: +func _on_gamepiece_arrived(gamepiece: Gamepiece) -> void: triggered.emit(gamepiece) run() diff --git a/src/field/field.gd b/src/field/field.gd index 3c1e555e..b8d82554 100644 --- a/src/field/field.gd +++ b/src/field/field.gd @@ -1,19 +1,41 @@ extends Node2D -const PLAYER_CONTROLLER: = preload("res://src/field/gamepieces/controllers/player_controller.tscn") - +## The cutscene that will play on starting a new game. @export var opening_cutscene: Cutscene -@export var focused_game_piece: Gamepiece = null: - set = set_focused_game_piece +## A PlayerController that will be dynamically assigned to whichever Gamepiece the player currently +## controls. +@export var player_controller: PackedScene -@export var gameboard: Gameboard +## The first gamepiece that the player will control. This may be null and assigned via an +## introductory cutscene instead. +@export var player_default_gamepiece: Gamepiece func _ready() -> void: - assert(gameboard) randomize() + # Assign proper controllers to player gamepieces whenever they change. + Player.gamepiece_changed.connect( + func _on_player_gp_changed() -> void: + var new_gp: = Player.gamepiece + Camera.gamepiece = new_gp + + # Free up any lingering controller(s). + for controller in get_tree().get_nodes_in_group(PlayerController.GROUP): + controller.queue_free() + + if new_gp: + var new_controller = player_controller.instantiate() + assert(new_controller is PlayerController, "The Field game state requires a valid + PlayerController set in the editor!") + + new_gp.add_child(new_controller) + new_controller.is_active = true + ) + + Player.gamepiece = player_default_gamepiece + # The field state must pause/unpause with combat accordingly. # Note that pausing/unpausing input is already wrapped up in triggers, which are what will # initiate combat. @@ -21,31 +43,8 @@ func _ready() -> void: CombatEvents.combat_finished.connect(func(_is_victory): show()) Camera.scale = scale - Camera.gameboard = gameboard Camera.make_current() Camera.reset_position() if opening_cutscene: opening_cutscene.run.call_deferred() - - -func set_focused_game_piece(value: Gamepiece) -> void: - if value == focused_game_piece: - return - - focused_game_piece = value - - if not is_inside_tree(): - await ready - - Camera.gamepiece = focused_game_piece - - # Free up any lingering controller(s). - for controller in get_tree().get_nodes_in_group(PlayerController.GROUP_NAME): - controller.queue_free() - - if focused_game_piece: - var new_controller = PLAYER_CONTROLLER.instantiate() - - focused_game_piece.add_child(new_controller) - new_controller.is_active = true diff --git a/src/field/field_camera.gd b/src/field/field_camera.gd index 75d1da4d..e807345e 100644 --- a/src/field/field_camera.gd +++ b/src/field/field_camera.gd @@ -7,7 +7,7 @@ class_name FieldCamera extends Camera2D -@export var gameboard: Gameboard: +@export var gameboard_properties: GameboardProperties: set(value): _on_viewport_resized() @@ -15,11 +15,12 @@ extends Camera2D @export var gamepiece: Gamepiece: set(value): if gamepiece: - gamepiece.camera_anchor.remote_path = "" + gamepiece.animation_transform.remote_path = "" gamepiece = value if gamepiece: - gamepiece.camera_anchor.remote_path = gamepiece.camera_anchor.get_path_to(self) + gamepiece.animation_transform.remote_path \ + = gamepiece.animation_transform.get_path_to(self) func _ready() -> void: @@ -35,14 +36,14 @@ func reset_position() -> void: func _on_viewport_resized() -> void: - if not gameboard: + if not gameboard_properties: return # Calculate tentative camera boundaries based on the gameboard. - var boundary_left: = gameboard.boundaries.position.x * gameboard.cell_size.x - var boundary_top: = gameboard.boundaries.position.y * gameboard.cell_size.y - var boundary_right: = gameboard.boundaries.end.x * gameboard.cell_size.x - var boundary_bottom: = gameboard.boundaries.end.y * gameboard.cell_size.y + var boundary_left: = gameboard_properties.extents.position.x * gameboard_properties.cell_size.x + var boundary_top: = gameboard_properties.extents.position.y * gameboard_properties.cell_size.y + var boundary_right: = gameboard_properties.extents.end.x * gameboard_properties.cell_size.x + var boundary_bottom: = gameboard_properties.extents.end.y * gameboard_properties.cell_size.y # We'll also want the current viewport boundary sizes. var vp_size: = get_viewport_rect().size / global_scale @@ -58,8 +59,8 @@ func _on_viewport_resized() -> void: # using the global scale. if boundary_width < vp_size.x: # Set the camera position to the centre of the gameboard. - position.x = (gameboard.boundaries.position.x + gameboard.boundaries.size.x/2.0) \ - * gameboard.cell_size.x + position.x = (gameboard_properties.extents.position.x \ + + gameboard_properties.extents.size.x/2.0) * gameboard_properties.cell_size.x # And add/subtract half the viewport dimension to come up with the limits. This will fix the # camera with the gameboard centred. @@ -74,8 +75,8 @@ func _on_viewport_resized() -> void: # Perform the same checks as above for the y-axis. if boundary_height < vp_size.y: - position.y = (gameboard.boundaries.position.y + gameboard.boundaries.size.y/2.0) \ - * gameboard.cell_size.y + position.y = (gameboard_properties.extents.position.y +\ + gameboard_properties.extents.size.y/2.0) * gameboard_properties.cell_size.y limit_top = (position.y - vp_size.y/2.0)*global_scale.y as int limit_bottom = (position.y + vp_size.y/2.0)*global_scale.y as int else: diff --git a/src/field/field_events.gd b/src/field/field_events.gd index 4d221365..194eb460 100644 --- a/src/field/field_events.gd +++ b/src/field/field_events.gd @@ -13,6 +13,14 @@ signal cell_highlighted(cell: Vector2i) @warning_ignore("unused_signal") signal cell_selected(cell: Vector2i) +## Emitted when the player selects a cell that is covered by an [Interaction]. +@warning_ignore("unused_signal") +signal interaction_selected(interaction: Interaction) + +### Emitted when the player moves over a cell containing a [Trigger]. +#@warning_ignore("unused_signal") +#signal interaction_selected(interaction: Interaction) + ## Emitted whenever a combat is triggered. This will lead to a transition from the field 'state' to ## a combat 'state'. @warning_ignore("unused_signal") @@ -27,50 +35,7 @@ signal cutscene_began @warning_ignore("unused_signal") signal cutscene_ended -## Gamepiece related signals, usually emitted by the the gamepieces themselves. -signal gamepiece_cell_changed(gamepiece: Gamepiece, old_cell: Vector2i) - -## Emitted when the player sets a movement path for their focused gamepiece. -## The destination is the last cell in the path. -@warning_ignore("unused_signal") -signal player_path_set(gamepiece: Gamepiece, destination_cell: Vector2i) - -## Emitted whenever terrain passability changes. Pathfinders will need to be rebuilt. -@warning_ignore("unused_signal") -signal terrain_changed - ## Emitted whenever ALL input within the field state is to be paused or resumed. ## Typically emitted by combat, dialogues, etc. @warning_ignore("unused_signal") signal input_paused(is_paused: bool) - -# The physics engine updates a frame after physics object move, which plays havoc with our -# CollisionFinder class (objects are not there the same frame they move!). -# This is an issue for moving gamepices. Multiple Gamepieces may decide to move onto the same cell -# in the same frame, since their collision shapes will not yet be blocking the cell. -# The Field Events manager keeps track of these edge cases by recording which cells were targeted -# for movement THIS FRAME. The record will be cleared at the end of the frame and wait for other -# cell_changed signals. -# Please note that this is not a comprehensive list of moving gamepieces, but rather a list of -# changes in cells that occured from Gamepieces for this frame only. -var _cell_changes_this_frame: Array[Vector2i] = [] - - -func _ready() -> void: - gamepiece_cell_changed.connect(_on_gamepiece_cell_changed) - - # We want to clear the record of this frame's cell changes at the end of the frame, so this - # class's _process() should run last. - set_process_priority(PROCESS_PRIORITY) - - -func _process(_delta: float) -> void: - _cell_changes_this_frame.clear() - - -func did_gp_move_to_cell_this_frame(cell: Vector2i) -> bool: - return _cell_changes_this_frame.has(cell) - - -func _on_gamepiece_cell_changed(gamepiece: Gamepiece, _old_cell: Vector2i) -> void: - _cell_changes_this_frame.append(gamepiece.cell) diff --git a/src/field/gameboard/debug/debug_cell_occupancy.png b/src/field/gameboard/debug/debug_cell_occupancy.png new file mode 100644 index 00000000..29ae889a Binary files /dev/null and b/src/field/gameboard/debug/debug_cell_occupancy.png differ diff --git a/src/field/gameboard/debug/debug_cell_occupancy.png.import b/src/field/gameboard/debug/debug_cell_occupancy.png.import new file mode 100644 index 00000000..a6a7cd91 --- /dev/null +++ b/src/field/gameboard/debug/debug_cell_occupancy.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dbpvlf2f8ajxy" +path="res://.godot/imported/debug_cell_occupancy.png-2d693575bd82620e7b01350a983456d9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/field/gameboard/debug/debug_cell_occupancy.png" +dest_files=["res://.godot/imported/debug_cell_occupancy.png-2d693575bd82620e7b01350a983456d9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/src/field/gameboard/debug/debug_map_boundaries.gd b/src/field/gameboard/debug/debug_map_boundaries.gd new file mode 100644 index 00000000..6f892666 --- /dev/null +++ b/src/field/gameboard/debug/debug_map_boundaries.gd @@ -0,0 +1,51 @@ +@tool +## Draws the boundaries set by a [Gameboard] object. +## +## Used within the editor to illustrate which cells will be included in the pathfinder calculations. +class_name DebugGameboardBoundaries extends Node2D + +@export var gameboard_properties: GameboardProperties: + set(value): + gameboard_properties = value + # For some reason, Godot 4.4.1 won't connect to gameboard_properties signals here, so its + # done on _ready instead. This means that the scene may need to be loaded before the + # debug boundaries will automatically update. + _update_boundaries() + +@export var boundary_color: Color = Color.DARK_RED: + set(value): + boundary_color = value + queue_redraw() + +@export_range(0.5, 5.0, 0.1, "or_greater") var line_width: = 2.0: + set(value): + line_width = value + queue_redraw() + +var _boundaries: Rect2i + + +func _ready() -> void: + if gameboard_properties != null: + gameboard_properties.extents_changed.connect(_update_boundaries) + gameboard_properties.cell_size_changed.connect(_update_boundaries) + + if not Engine.is_editor_hint(): + hide() + + +func _draw() -> void: + if not gameboard_properties: + return + + draw_rect(_boundaries, boundary_color, false, line_width) + + +func _update_boundaries() -> void: + if gameboard_properties != null: + _boundaries = Rect2i( + gameboard_properties.extents.position * gameboard_properties.cell_size, + gameboard_properties.extents.size * gameboard_properties.cell_size + ) + + queue_redraw() diff --git a/src/field/gameboard/debug_map_boundaries.gd.uid b/src/field/gameboard/debug/debug_map_boundaries.gd.uid similarity index 100% rename from src/field/gameboard/debug_map_boundaries.gd.uid rename to src/field/gameboard/debug/debug_map_boundaries.gd.uid diff --git a/src/field/gameboard/debug/debug_pathfinder_map.gd b/src/field/gameboard/debug/debug_pathfinder_map.gd new file mode 100644 index 00000000..1bbfb510 --- /dev/null +++ b/src/field/gameboard/debug/debug_pathfinder_map.gd @@ -0,0 +1,23 @@ +extends TileMapLayer + +@onready var _occupancy: TileMapLayer = $OccupancyGrid + + +func _ready() -> void: + _occupancy.tile_set = tile_set + + Gameboard.pathfinder_changed.connect( + func _on_pathfinder_changed(added_cells: Array[Vector2i], + removed_cells: Array[Vector2i]) -> void: + for cell in added_cells: + set_cell(cell, 0, Vector2i(0, 0), 0) + + for cell in removed_cells: + set_cell(cell) # Flag the cell as blocked. + ) + + GamepieceRegistry.gamepiece_moved.connect( + func _on_gp_moved(_gp: Gamepiece, new_cell: Vector2i, old_cell: Vector2i) -> void: + _occupancy.set_cell(old_cell) + _occupancy.set_cell(new_cell, 0, Vector2i(1, 0), 0) + ) diff --git a/src/field/gameboard/debug/debug_pathfinder_map.gd.uid b/src/field/gameboard/debug/debug_pathfinder_map.gd.uid new file mode 100644 index 00000000..20c65a69 --- /dev/null +++ b/src/field/gameboard/debug/debug_pathfinder_map.gd.uid @@ -0,0 +1 @@ +uid://yukpiyvqb6m3 diff --git a/src/field/gameboard/debug/tileset_debug_pathfinder_map.tres b/src/field/gameboard/debug/tileset_debug_pathfinder_map.tres new file mode 100644 index 00000000..905538f0 --- /dev/null +++ b/src/field/gameboard/debug/tileset_debug_pathfinder_map.tres @@ -0,0 +1,13 @@ +[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://dhda7bse8tu6l"] + +[ext_resource type="Texture2D" uid="uid://dbpvlf2f8ajxy" path="res://src/field/gameboard/debug/debug_cell_occupancy.png" id="1_wxru5"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_a4m4d"] +texture = ExtResource("1_wxru5") +separation = Vector2i(1, 0) +0:0/0 = 0 +1:0/0 = 0 +2:0/0 = 0 + +[resource] +sources/0 = SubResource("TileSetAtlasSource_a4m4d") diff --git a/src/field/gameboard/debug_map_boundaries.gd b/src/field/gameboard/debug_map_boundaries.gd deleted file mode 100644 index 5c399329..00000000 --- a/src/field/gameboard/debug_map_boundaries.gd +++ /dev/null @@ -1,41 +0,0 @@ -@tool -## Draws the boundaries set by a [Gameboard] object. -## -## Used within the editor to illustrate which cells will be included in the pathfinder calculations. -extends Node2D - -@export var gameboard: Gameboard: - set(value): - gameboard = value - - if gameboard: - _boundaries = Rect2i( - gameboard.boundaries.position * gameboard.cell_size, - gameboard.boundaries.size * gameboard.cell_size - ) - - queue_redraw() - -@export var boundary_color: Color = Color.DARK_RED: - set(value): - boundary_color = value - queue_redraw() - -@export_range(0.5, 5.0, 0.1, "or_greater") var line_width: = 2.0: - set(value): - line_width = value - queue_redraw() - -var _boundaries: Rect2i - - -func _ready() -> void: - if not Engine.is_editor_hint(): - hide() - - -func _draw() -> void: - if not gameboard: - return - - draw_rect(_boundaries, boundary_color, false, line_width) diff --git a/src/field/gameboard/gameboard.gd b/src/field/gameboard/gameboard.gd index b43cd45b..51046fcf 100644 --- a/src/field/gameboard/gameboard.gd +++ b/src/field/gameboard/gameboard.gd @@ -4,90 +4,85 @@ ## placed on one of these cells, so the gameboard determines where each cell is located. In this ## case, we are using a simple orthographic (square) projection. ## [br][br]The grid is contained within the playable [member boundaries] and its constituent cells. -class_name Gameboard -extends Resource +extends Node + +## Emitted whenever [member properties] is set. This is used in case a [Gamepiece] is added to the +## board before the board properties are ready. +signal properties_set + +## Emitted whenever the [member pathfinder] state changes. +## This signal is emitted automatically in response to changed [GameboardLayer]s. +##[/br][/br]Note: This signal is only emitted when the actual movement state of the Gameboard +## changes. [GameboardLayer]s may change their cells without actually changing the pathfinder's +## state (i.e. a visual update only), in which case this signal is not emitted. +signal pathfinder_changed(added_cells: Array[Vector2i], removed_cells: Array[Vector2i]) ## An invalid cell is not part of the gameboard. Note that this requires positive ## [member boundaries]. const INVALID_CELL: = Vector2i(-1, -1) -## An invalid index is not found on the gameboard. Note that this requires positive -## [member boundaries]. const INVALID_INDEX: = -1 -## Map cardinal [Directions] to a shift in coordinates. -const _DIRECTION_MAPPINGS: = { - Directions.Points.N: Vector2i.UP, - Directions.Points.E: Vector2i.RIGHT, - Directions.Points.S: Vector2i.DOWN, - Directions.Points.W: Vector2i.LEFT, -} - -## The extents of the playable area. -## [br][br][b]Note:[/b] The boundaries must only include positive coordinates. Negative coordinates -## increase calculation complexity. -@export var boundaries: = Rect2i(0, 0, 10, 10): - set(value): - boundaries = value - - # Clamp the map boundaries to a positive position and map size greater than 0. - boundaries.position.x = maxi(boundaries.position.x, 0) - boundaries.position.y = maxi(boundaries.position.y, 0) - boundaries.size.x = maxi(boundaries.size.x, 1) - boundaries.size.y = maxi(boundaries.size.y, 1) - -## The size of each grid cell. Usually - though not always - analogous to [TileSet]'s -## [member TileSet.tile_size]. -@export var cell_size: = Vector2i(16, 16): +## Determines the [member GameboardProperties.extents] of the Gameboard, among other details. +var properties: GameboardProperties = null: set(value): - cell_size = value - _half_cell_size = cell_size/2 + if value != properties: + properties = value + properties_set.emit() -var _half_cell_size: = cell_size / 2 +## A reference to the Pathfinder for the current playable area. +@onready var pathfinder: Pathfinder = Pathfinder.new() ## Convert cell coordinates to pixel coordinates. -func cell_to_pixel(cell_coordinates: Vector2i) -> Vector2i: - return cell_coordinates * cell_size + _half_cell_size +func cell_to_pixel(cell_coordinates: Vector2i) -> Vector2: + return Vector2(cell_coordinates * properties.cell_size) + properties.half_cell_size ## Convert pixel coordinates to cell coordinates. func pixel_to_cell(pixel_coordinates: Vector2) -> Vector2i: @warning_ignore("integer_division") return Vector2i( - floori(pixel_coordinates.x / cell_size.x), - floori(pixel_coordinates.y / cell_size.y) + floori(pixel_coordinates.x / properties.cell_size.x), + floori(pixel_coordinates.y / properties.cell_size.y) ) +func get_cell_under_node(node: Node2D) -> Vector2i: + return pixel_to_cell(node.global_position/node.global_scale) + + ## Convert cell coordinates to an index unique to those coordinates. -## [br][br][b]Note:[/b] cell coordinates outside the gameboard [member boundaries] will return +## [br][br][b]Note:[/b] cell coordinates outside the [member extents] will return ## [constant INVALID_INDEX]. func cell_to_index(cell_coordinates: Vector2i) -> int: - if boundaries.has_point(cell_coordinates): - return cell_coordinates.x + cell_coordinates.y*boundaries.size.x + if properties.extents.has_point(cell_coordinates): + # Negative coordinates can throw off index generation, so offset the boundary so that it's + # top left corner is always considered Vector2i.ZERO and index 0. + return (cell_coordinates.x-properties.extents.position.x) \ + + (cell_coordinates.y-properties.extents.position.y)*properties.extents.size.x return INVALID_INDEX ## Convert a unique index to cell coordinates. -## [br][br][b]Note:[/b] indices outside the gameboard [member boundaries] will return -## [constant INVALID_CELL]. +## [br][br][b]Note:[/b] indices outside the gameboard [member GameboardProperties.extents] will +## return [constant INVALID_CELL]. func index_to_cell(index: int) -> Vector2i: @warning_ignore("integer_division") var cell: = Vector2i( - index % boundaries.size.x, - index / boundaries.size.x + index % properties.extents.size.x + properties.extents.position.x, + index / properties.extents.size.x + properties.extents.position.y ) - if boundaries.has_point(cell): + if properties.extents.has_point(cell): return cell return INVALID_CELL ## Find a neighbouring cell, if it exists. Otherwise, returns [constant INVALID_CELL]. func get_adjacent_cell(cell: Vector2i, direction: int) -> Vector2i: - var neighbour: Vector2i = cell + _DIRECTION_MAPPINGS.get(direction, Vector2i.ZERO) - if boundaries.has_point(neighbour): + var neighbour: Vector2i = cell + Directions.MAPPINGS.get(direction, Vector2i.ZERO) + if properties.extents.has_point(neighbour): return neighbour return INVALID_CELL @@ -101,3 +96,97 @@ func get_adjacent_cells(cell: Vector2i) -> Array[Vector2i]: neighbours.append(neighbour) return neighbours + + +## The Gameboard's state (where [Gamepiece]'s may or may not move) is composed from a number of +## [GameboardLayer]s. These layers determine which cells are blocked or clear. +## The layers register themselves to the Gameboard in _ready. +func register_gameboard_layer(board_map: GameboardLayer) -> void: + # We want to know whenever the board_map changes the gameboard state. This occurs when the map + # is added or removed from the scene tree, or when its list of moveable cells changes. + # Compare the changed cells with those already in the pathfinder. Any changes will cause the + # Pathfinder to be updated. + board_map.cells_changed.connect( + func _on_gameboard_layer_cells_changed(cleared_cells: Array[Vector2i], + blocked_cells: Array[Vector2i]): + if board_map.name == "DoorGameboardLayer": + print("Door layer ", cleared_cells, " ", blocked_cells) + var added_cells: = _add_cells_to_pathfinder(cleared_cells) + var removed_cells: = _remove_cells_from_pathfinder(blocked_cells) + + _connect_new_pathfinder_cells(added_cells) + if not added_cells.is_empty() or not removed_cells.is_empty(): + pathfinder_changed.emit(added_cells.values(), removed_cells) + ) + + +# Add cells to the pathfinder, checking that there are no blocking tiles on any GameboardLayers. +# Returns a dictionary representing the cells that are actually added to the pathfinder (may differ +# from cleared_cells). Key = cell id (int, see cell_to_index), value = coordinate (Vector2i) +func _add_cells_to_pathfinder(cleared_cells: Array[Vector2i]) -> Dictionary[int, Vector2i]: + var added_cells: Dictionary[int, Vector2i] = {} + + # Verify whether or not cleared/blocked cells will change the state of the pathfinder. + # If there is no change in state, we will not pass along the cell to other systems and + # the pathfinder won't actually be changed. + for cell in cleared_cells: + # Note that cleared cells need to have all layers checked for a blocking tile. + if properties.extents.has_point(cell) and not pathfinder.has_cell(cell) \ + and _is_cell_clear(cell): + var uid: = cell_to_index(cell) + pathfinder.add_point(uid, cell) + added_cells[uid] = cell + + # Flag the cell as disabled if it is occupied. + if GamepieceRegistry.get_gamepiece(cell): + pathfinder.set_point_disabled(uid) + return added_cells + + +# Remove cells from the pathfinder so that Gamepieces can no longer move through them. +# Only one Gameboard layer needs to block a cell for it to be considered blocked. +# Returns an array of cell coordinates that have been blocked. Cells that were already not in the +# pathfinder will be excluded from this array. +func _remove_cells_from_pathfinder(blocked_cells: Array[Vector2i]) -> Array[Vector2i]: + var removed_cells: Array[Vector2i] = [] + for cell in blocked_cells: + # Only remove a cell that is already in the pathfinder. Also, we need to check that the cell + # is not clear, since this method is also called when cells are removed from GameboardLayers + # and other layers may still have this cell on their map. + if pathfinder.has_cell(cell) and not _is_cell_clear(cell): + pathfinder.remove_point(cell_to_index(cell)) + removed_cells.append(cell) + return removed_cells + + +# Go through a list of cells added to the pathfinder (returned from _add_cells_to_pathfinder) and +# connect them to each other and existing pathfinder cells. +func _connect_new_pathfinder_cells(added_cells: Dictionary[int, Vector2i]) -> void: + for uid in added_cells.keys(): + if pathfinder.has_point(uid): + for neighbor in Gameboard.get_adjacent_cells(added_cells[uid]): + var neighbor_id: = Gameboard.cell_to_index(neighbor) + if pathfinder.has_point(neighbor_id): + pathfinder.connect_points(uid, neighbor_id) + + +# Checks all [TileMapLayers] in the [constant GameboardLayer.GROUP] to see if the cell is clear +# (returns true) or blocked (returns false). +# [/br][/br]A clear cell must fulfill two criteria: +# [/br]- Exists in at least one of the [GameboardLayer]s. +# [/br]- None of the layers block movement at this cell, as defined by the +# [constant GameboardLayer.BLOCKED_CELL_DATA_LAYER] custom data layer (see +# [method TileData.get_custom_data]) +func _is_cell_clear(coord: Vector2i) -> bool: + # Check to make sure that cell exists. + var cell_exists: = false + + for tilemap: GameboardLayer in get_tree().get_nodes_in_group(GameboardLayer.GROUP): + if tilemap and coord in tilemap.get_used_cells(): + cell_exists = true + if not tilemap.is_cell_clear(coord): + return false + + # There is no terrain blocking cell movement. However we only want to allow movement if the cell + # actually exists in one of the tilemap layers. + return cell_exists diff --git a/src/field/gameboard/gameboard_layer.gd b/src/field/gameboard/gameboard_layer.gd new file mode 100644 index 00000000..4b30bbb5 --- /dev/null +++ b/src/field/gameboard/gameboard_layer.gd @@ -0,0 +1,87 @@ +## A variation of [TileMapLayer] that is used to create the [Gameboard]. +## +## Comes setup with a few tools used by designers to setup maps, specifying which cells may be +## moved to or from. Multiple GameboardLayers may exist simultaneously to allow developers to +## affect the gameboard with more than one layer. +##[/br][/br] These collision layers may also dynamically change, with the changes being reflected +## by the gameboard and pathfinder. +class_name GameboardLayer extends TileMapLayer + +## Emitted whenever the collision state of the tile map changes. +##[/br][/br] The GameboardLayer's tile map may change without changing which cells are blocked or +## are open for movement. In this case, the signal is not emitted. However, it is emitted whenever +## the map is added or removed from the game, in addition to when there is a change in blocked/clear +## cells. +signal cells_changed(cleared_cells: Array[Vector2i], blocked_cells: Array[Vector2i]) + +## The group name of all [GameboardLayer] that will be checked for blocked/walkable cells. +const GROUP: = "GameboardTileMapLayers" + +## The name of the "custom data layer" that determines whether or not a cell is blocked/walkable. +## The returned value will be a boolean reflecting if a cell is blocked or not. Fetches the value +## via [method TileData.get_custom_data].[/br][/br] +## If the data layer is not present in the [Tileset], then all cells in this [TileMapLayer] will, +## by default, block movement. +const BLOCKED_CELL_DATA_LAYER: = "IsCellBlocked" + +# A false value will cause is_cell_clear to always return true. This is used to flag when the +# TileMapLayers is being cleaned up an should no longer affect the pathfinder. +var _affects_collision: = true + + +func _ready() -> void: + add_to_group(GROUP) + Gameboard.register_gameboard_layer(self) + + tree_exiting.connect( + func _on_tree_exiting() -> void: + _affects_collision = false + + var blocked_cells: Array[Vector2i] = [] + cells_changed.emit(get_used_cells(), blocked_cells) + ) + + +## Returns true if the tile at coord exists and does not have a custom blocking data layer with a +## value set to true. +## Otherwise, returns false. +func is_cell_clear(coord: Vector2i) -> bool: + if not _affects_collision: + return true + + var tile_data: = get_cell_tile_data(coord) + if tile_data: + var is_cell_blocked: = tile_data.get_custom_data(BLOCKED_CELL_DATA_LAYER) as bool + return not is_cell_blocked + + # If the above conditions have not been met, the cell is blocked. + return false + + +# See [method TileMapLayer._update_cells]; called whenever the cells change. This allows designers +# to change maps on the fly and the collision state of the pathfinder should update. The coords +# parameter lets us know which cells have changed. Also, the method is called as the TileMapLayer +# is added to the scene. +# Note that if forced_cleanup is true, the TileMapLayer is in a state where its tiles should not +# affect collision. The conditions causing forced_cleanup are handled seperately through signals +# found in _ready(). +func _update_cells(coords: Array[Vector2i], forced_cleanup: bool) -> void: + # First of all, check to make sure the the tilemap has a tileset and the specific custom data + # layer that we need to specify whether or not a tile blocks movement. + if not tile_set or not tile_set.has_custom_data_layer_by_name(BLOCKED_CELL_DATA_LAYER): + return + + # Go through the specified coords, checking to see if any moveable cells (those that are NOT + # blocked) have been added or removed. + var cleared_cells: Array[Vector2i] = [] + var blocked_cells: Array[Vector2i] = [] + + if not forced_cleanup: + for coord in coords: + if is_cell_clear(coord): + cleared_cells.append(coord) + else: + blocked_cells.append(coord) + + if not (cleared_cells.is_empty() and blocked_cells.is_empty()): + cells_changed.emit(cleared_cells, blocked_cells) diff --git a/src/field/gameboard/gameboard_layer.gd.uid b/src/field/gameboard/gameboard_layer.gd.uid new file mode 100644 index 00000000..8e84f525 --- /dev/null +++ b/src/field/gameboard/gameboard_layer.gd.uid @@ -0,0 +1 @@ +uid://bt8owd5e0ns68 diff --git a/src/field/gameboard/gameboard_properties.gd b/src/field/gameboard/gameboard_properties.gd new file mode 100644 index 00000000..f62bea08 --- /dev/null +++ b/src/field/gameboard/gameboard_properties.gd @@ -0,0 +1,39 @@ +@tool +## Defines the properties of the playable game map. +class_name GameboardProperties extends Resource + +## Emitted whenever [member cell_size] changes. +signal cell_size_changed +## Emitted whenever [member extents] changes. +signal extents_changed + +## An invalid index is not found on the gameboard. Note that this requires positive +## [member extents]. +const INVALID_INDEX: = -1 + +## The extents of the playable area. This property is intended for editor use and should not change +## during gameplay, as that would change how [Pathfinder] indices are calculated. +@export var extents: = Rect2i(0, 0, 10, 10): + set(value): + extents = value + + # Ensure that the boundary size is greater than 0. + extents.size.x = maxi(extents.size.x, 1) + extents.size.y = maxi(extents.size.y, 1) + extents_changed.emit() + +## The size of each grid cell. Usually analogous to a [member TileSet.tile_size] of a +## [GameboardLayer]. +@export var cell_size: = Vector2i(16, 16): + set(value): + cell_size = value + half_cell_size = cell_size/2 + cell_size_changed.emit() + +var half_cell_size: = cell_size / 2.0 + + +func _to_string() -> String: + return "\n[GameboardProperties resource" + \ + "\nCell size: " + str(cell_size) + \ + "\nBoard extents: " + str(extents) + "]" diff --git a/src/field/gameboard/gameboard_properties.gd.uid b/src/field/gameboard/gameboard_properties.gd.uid new file mode 100644 index 00000000..892d84bc --- /dev/null +++ b/src/field/gameboard/gameboard_properties.gd.uid @@ -0,0 +1 @@ +uid://cyl76x7u73s67 diff --git a/src/field/gameboard/pathfinder.gd b/src/field/gameboard/pathfinder.gd index 830111a7..01f3ed3a 100644 --- a/src/field/gameboard/pathfinder.gd +++ b/src/field/gameboard/pathfinder.gd @@ -4,58 +4,101 @@ class_name Pathfinder extends AStar2D -# Requires the gameboard for board boundaries and cell <-> index conversion. -var _gameboard: Gameboard = null +# When finding a path, we may want to ignore certain cells that are occupied by Gamepeices. +# These flags specify which disabled cells will still allow the path through. +## Ignore the pccupant of the source cell when searching for a path via [method path_to_cell]. +## This is especially useful when wanting to find a path for a gamepiece from their current cell. +const FLAG_ALLOW_SOURCE_OCCUPANT = 1 << 0 +## Ignore the occupant of the target cell when searching for a path via [method path_to_cell]. +const FLAG_ALLOW_TARGET_OCCUPANT = 1 << 1 +## Ignore all gamepieces on the pathfinder cells when searching for a path via +## [method path_to_cell]. +const FLAG_ALLOW_ALL_OCCUPANTS = 1 << 2 + + +func _init() -> void: + # Disable/re-enable occupied cells whenever a gamepiece moves. + GamepieceRegistry.gamepiece_moved.connect( + func _on_gamepiece_moved(_gp: Gamepiece, new_cell: Vector2i, old_cell: Vector2i) -> void: + var new_cell_id: = Gameboard.cell_to_index(new_cell) + if has_point(new_cell_id): + set_point_disabled(new_cell_id, true) + + var old_cell_id: = Gameboard.cell_to_index(old_cell) + if has_point(old_cell_id): + set_point_disabled(old_cell_id, false) + ) + + GamepieceRegistry.gamepiece_freed.connect( + func _on_gamepiece_free(_gp: Gamepiece, coord: Vector2i) -> void: + var cell_id: = Gameboard.cell_to_index(coord) + if has_point(cell_id): + set_point_disabled(cell_id, false) + ) -# Only cells within the gameboard's boundary will be considered. -func _init(pathable_cells: Array[Vector2i], gameboard: Gameboard) -> void: - _gameboard = gameboard - assert(_gameboard, "Pathfinder::init error: invalid gameboard reference!") - - _build_cell_list(pathable_cells) - _connect_cells() +## Returns true if the coordinate is found in the Pathfinder. +func has_cell(coord: Vector2i) -> bool: + return has_point(Gameboard.cell_to_index(coord)) + + +## Returns true if the coordinate is found in the Pathfinder and the cell is unoccupied. +func can_move_to(coord: Vector2i) -> bool: + var uid: = Gameboard.cell_to_index(coord) + return has_point(uid) and not is_point_disabled(uid) ## Find a path between two cells. Returns an empty array if no path is available. -func get_path_cells(source_cell: Vector2i, target_cell: Vector2i) -> Array[Vector2i]: - # Check to make sure that the source and target cells fall within the gameboard boundaries... - if not _gameboard.boundaries.has_point(source_cell) \ - or not _gameboard.boundaries.has_point(target_cell): - return [] +## If allow_blocked_source or allow_blocked_target are false, the pathinder wlil fail if a gamepiece +## occupies the source or target cells, respectively. +func get_path_to_cell(source_coord: Vector2i, target_coord: Vector2i, + occupancy_flags: int = 1) -> Array[Vector2i]: + # Store the return value in a variable. + var move_path: Array[Vector2i] = [] - # ...and that the source and target cells are registered with the pathfinder. - var source_id: = _gameboard.cell_to_index(source_cell) - var target_id: = _gameboard.cell_to_index(target_cell) - if not has_point(source_id) or not has_point(target_id): - return [] + # Find the source/target IDs and keep track of whether or not the cells are occupied. + var source_id: = Gameboard.cell_to_index(source_coord) + var target_id: = Gameboard.cell_to_index(target_coord) - # Disabled cells are usually occupied. Allow movement out of a disabled cell. - var disable_source: = is_point_disabled(source_id) - set_point_disabled(source_id, false) + # The pathfinder has several flags to ignore cell occupancy. We'll need to track which occupants + # are temporarily ignored and then re-disable their pathfinder points once a path is found. + # Key is point id, value is whether or not the point is disabled. + var ignored_points: Dictionary[int, bool] = {} + if (occupancy_flags & FLAG_ALLOW_ALL_OCCUPANTS) != 0: + for id in get_point_ids(): + if is_point_disabled(id): + ignored_points[id] = true + set_point_disabled(id, false) - var path_cells: Array[Vector2i] = [] - for cell in get_point_path(source_id, target_id): - path_cells.append(Vector2i(cell)) - - # Re-disable the start cell if it was blocked. - set_point_disabled(source_id, disable_source) + if has_point(source_id) and has_point(target_id): + # Check to see if we want to un-disable the source/target cells. + if (occupancy_flags & FLAG_ALLOW_SOURCE_OCCUPANT) != 0: + ignored_points[source_id] = is_point_disabled(source_id) + set_point_disabled(source_id, false) + if (occupancy_flags & FLAG_ALLOW_TARGET_OCCUPANT) != 0: + ignored_points[target_id] = is_point_disabled(target_id) + set_point_disabled(target_id, false) + + for path_coord: Vector2i in get_point_path(source_id, target_id): + if path_coord != source_coord: # Don't include the source as the first path element. + move_path.append(path_coord) + + # Change any enabled cells back to their previous state. + for id in ignored_points: + set_point_disabled(id, ignored_points[id]) - return path_cells + return move_path -## Get the shortest path to any cell adjacent to the specified target. Essentially allows moving -## [i]next[/i] to a target cell. -## -## Returns an empty array if there are no paths available. -func get_path_cells_to_adjacent_cell(source_cell: Vector2i, - target_cell: Vector2i) -> Array[Vector2i]: +## Find a path to a cell adjacent to the target coordinate. +## Returns an empty path if there are no pathable adjacent cells. +func get_path_cells_to_adjacent_cell(source_coord: Vector2i, + target_coord: Vector2i, occupancy_flags: int = 1) -> Array[Vector2i]: var shortest_path: Array[Vector2i] = [] var shortest_path_length: = INF - for cell in _gameboard.get_adjacent_cells(target_cell): - var cell_path: = get_path_cells(source_cell, cell) - + for cell in Gameboard.get_adjacent_cells(target_coord): + var cell_path: = get_path_to_cell(source_coord, cell, occupancy_flags) if not cell_path.is_empty() and cell_path.size() < shortest_path_length: shortest_path_length = cell_path.size() shortest_path = cell_path @@ -63,75 +106,15 @@ func get_path_cells_to_adjacent_cell(source_cell: Vector2i, return shortest_path -## Manually update whether or not a single cell is blocked. -## [br][br][b]Note:[/b] Blocked cells are usually occupied by a blocking [Gamepiece]. Cells that are -## no longer pathable due to changes in terrain should be removed from the pathfinder entirely. -func block_cell(cell: Vector2i, value: = true) -> void: - var cell_id: = _gameboard.cell_to_index(cell) - if has_point(cell_id) and cell_id != Gameboard.INVALID_INDEX: - set_point_disabled(cell_id, value) - - -## Update all blocked cells in the pathfinder in a single batch. -## -## [br][br][b]Note:[/b] Cells that were previously blocked but that are not included in the -## 'blocked' parameter will be unblocked. -func set_blocked_cells(blocked: Array[Vector2i]) -> void: - for id in get_point_ids(): - var cell: = _gameboard.index_to_cell(id) - block_cell(cell, cell in blocked) - - -## Returns a list of all cells that are currently blocked. -func get_blocked_cells() -> Array[Vector2i]: - var blocked_cells: Array[Vector2i] = [] - for id in get_point_ids(): - if is_point_disabled(id): - blocked_cells.append(_gameboard.index_to_cell(id)) - - return blocked_cells - - -## Verify that a cell exists within the pathfinder. It may or may not be blocked. -func has_cell(value: Vector2i) -> bool: - var index: = _gameboard.cell_to_index(value) - return has_point(index) - - -## Get all cells that are registered with the pathfinder. Cells may or may not be blocked. -func get_cells() -> Array[Vector2i]: - var cells: Array[Vector2i] = [] - - for index in get_point_ids(): - var cell: = _gameboard.index_to_cell(index) - cells.append(cell) - - return cells - - -func _build_cell_list(pathable_cells: Array[Vector2i]) -> void: - for cell in pathable_cells: - if not has_cell(cell) and _gameboard.boundaries.has_point(cell): - var cell_id: = _gameboard.cell_to_index(cell) - if cell_id != Gameboard.INVALID_INDEX: - add_point(cell_id, cell) - - -func _connect_cells() -> void: - for source_id in get_point_ids(): - var source_cell: = _gameboard.index_to_cell(source_id) - - var adjacent_cells: Array[Vector2i] = _gameboard.get_adjacent_cells(source_cell) - for neighbour in adjacent_cells: - var target_id: = _gameboard.cell_to_index(neighbour) - - if target_id != Gameboard.INVALID_INDEX and has_point(target_id): - connect_points(source_id, target_id) - - +# Format the pathfinder so that it may be easily debugged with print. func _to_string() -> String: var value: = "\nPathfinder:" for index in get_point_ids(): - value += "\n%s - Id: %d; Linked to: %s" % [str(_gameboard.index_to_cell(index)), index, - get_point_connections(index)] + var cell_header: = "\n%s - Id: %d;" % [str(Gameboard.index_to_cell(index)), index] + + var is_disabled: = "\t\t\t" + if is_point_disabled(index): + is_disabled = " (disabled)\t" + + value += (cell_header + is_disabled + "Linked to: %s" % get_point_connections(index)) return value + "\n" diff --git a/src/field/gamepieces/animation/gamepiece_animation.gd b/src/field/gamepieces/animation/gamepiece_animation.gd index de7e61ea..24d2cef9 100644 --- a/src/field/gamepieces/animation/gamepiece_animation.gd +++ b/src/field/gamepieces/animation/gamepiece_animation.gd @@ -1,9 +1,12 @@ @tool ## Encapsulates [Gamepiece] animation as an optional component. ## -## Allows [method play]ing animations that automatically adapt to the parent [Gamepiece]'s state. -## Transitions between animations are handled automatically, including changes to direction. -## [br][br][b]Note:[/b] Requires a [Gamepiece] as parent. +## Allows [method play]ing animations that automatically adapt to the parent [Gamepiece]'s +## direction. Transitions between animations are handled automatically, including changes to +## direction. +## [br][br][b]Note:[/b] This is usually not added to the scene tree directly by the designer. +## Rather, it is typically added to a [Gamepiece] through the [member Gamepiece.animation_scene] +## property. @icon("res://assets/editor/icons/GamepieceAnimation.svg") class_name GamepieceAnimation extends Marker2D @@ -30,54 +33,6 @@ var direction: = Directions.Points.S: set = set_direction @onready var _anim: = $AnimationPlayer as AnimationPlayer -@onready var _collision_shape: = $Area2D/CollisionShape2D as CollisionShape2D - -# At times the current 'graphics' (the visible element, at times abbreviated 'gfx') will move -# separately from the rest of the animation or gamepiece. -# For example, when travelling between cells, the gamepiece needs to move instantly so that the -# physics element of the gamepiece fully occupies it's current cell. The gfx will lag behind and -# appear to run to catch up to the cell. -@onready var _gfx: = $GFX as Marker2D - - -func _ready() -> void: - if not Engine.is_editor_hint(): - var gamepiece = get_parent() as Gamepiece - assert(gamepiece, "GamepieceAnimation expects gamepiece information exposed via signals." - + " Please only use GamepieceAnimation as a child of a Gamepiece for correct animation." - + " Current parent is named %s." % get_parent().name) - - # Collisions will find the Area2D node as the collider. We'll point its owner reference to - # the gamepiece itself to allow easily identify colliding gamepieces. - $Area2D.owner = gamepiece - - gamepiece.blocks_movement_changed.connect( \ - _on_gamepiece_blocks_movement_changed.bind(gamepiece)) - _on_gamepiece_blocks_movement_changed(gamepiece) - - gamepiece.arrived.connect(_on_gamepiece_arrived) - gamepiece.direction_changed.connect(_on_gamepiece_direction_changed) - gamepiece.travel_begun.connect(_on_gamepiece_travel_begun) - - # Need to wait one frame in the event that the parent gamepiece is not yet ready. We cannot - # just wait for the ready signal since there is no guarantee that it will be emitted (for - # example we may be swapping animation objects on an existing gamepiece). - await get_tree().process_frame - gamepiece.gfx_anchor.remote_path = gamepiece.gfx_anchor.get_path_to(_gfx) - - -func _notification(what: int) -> void: - if what == NOTIFICATION_PARENTED: - update_configuration_warnings() - - -func _get_configuration_warnings() -> PackedStringArray: - var warnings: PackedStringArray = [] - if not get_parent() is Gamepiece: - warnings.append("GamepieceAnimation expects gamepiece information exposed via signals. " - + "Please only use GamepieceAnimation as a child of a Gamepiece for correct animation.") - - return warnings ## Change the currently playing animation to a new value, if it exists. @@ -123,10 +78,6 @@ func set_direction(value: Directions.Points) -> void: _swap_animation(current_sequence_id, true) -func get_gfx_position() -> Vector2: - return _gfx.position - - # Transition to the next animation sequence, accounting for the RESET track and current animation # elapsed time. func _swap_animation(next_sequence: String, keep_position: bool) -> void: @@ -148,30 +99,3 @@ func _swap_animation(next_sequence: String, keep_position: bool) -> void: _anim.play(next_sequence) _anim.advance(current_position_ratio * next_anim.length) - - -func _on_gamepiece_arrived() -> void: - _gfx.position = Vector2(0, 0) - - play("idle") - - -func _on_gamepiece_direction_changed(new_direction: Vector2) -> void: - if not new_direction.is_equal_approx(Vector2.ZERO): - var direction_value: = Directions.angle_to_direction(new_direction.angle()) - set_direction(direction_value) - - -# Change the collision shape's color depending on whether or not it blocks pathfinding. -# Please turn on 'Visible Collision Shapes' under the editor's Debug menu to see which cells are -# occupied by gamepieces. -func _on_gamepiece_blocks_movement_changed(gamepiece: Gamepiece) -> void: - if gamepiece.blocks_movement: - _collision_shape.disabled = false - - else: - _collision_shape.disabled = true - - -func _on_gamepiece_travel_begun(): - play("run") diff --git a/src/field/gamepieces/animation/gamepiece_animation.tscn b/src/field/gamepieces/animation/gamepiece_animation.tscn index caeacbea..35eab57e 100644 --- a/src/field/gamepieces/animation/gamepiece_animation.tscn +++ b/src/field/gamepieces/animation/gamepiece_animation.tscn @@ -7,15 +7,8 @@ script = ExtResource("1_l0scw") [node name="AnimationPlayer" type="AnimationPlayer" parent="."] -[node name="Area2D" type="Area2D" parent="."] -collision_layer = 2 -collision_mask = 7 +[node name="Anchor" type="Marker2D" parent="."] -[node name="CollisionShape2D" type="CollisionShape2D" parent="Area2D"] -debug_color = Color(0.67451, 0.156863, 0.278431, 0.419608) +[node name="Sprite" type="Sprite2D" parent="Anchor"] -[node name="GFX" type="Marker2D" parent="."] - -[node name="Sprite" type="Sprite2D" parent="GFX"] - -[node name="Shadow" type="Sprite2D" parent="GFX"] +[node name="Shadow" type="Sprite2D" parent="Anchor"] diff --git a/src/field/field_cursor.gd b/src/field/gamepieces/controllers/cursor/field_cursor.gd similarity index 60% rename from src/field/field_cursor.gd rename to src/field/gamepieces/controllers/cursor/field_cursor.gd index 788785a4..f40f00fd 100644 --- a/src/field/field_cursor.gd +++ b/src/field/gamepieces/controllers/cursor/field_cursor.gd @@ -3,7 +3,7 @@ ## The field cursor's role is to determine whether or not the input event occurs over a particular ## cell and how that cell should be highlighted. class_name FieldCursor -extends TileMap +extends TileMapLayer ## Emitted when the highlighted cell changes to a new value. An invalid cell is indicated by a value ## of [constant Gameboard.INVALID_CELL]. @@ -12,17 +12,6 @@ signal focus_changed(old_focus: Vector2i, new_focus: Vector2i) ## Emitted when a cell is selected via input event. signal selected(selected_cell: Vector2i) -## The [Gameboard] object used to convert touch/mouse coordinates to game coordinates. The reference -## must be valid for the cursor to function properly. -@export var gameboard: Gameboard - -## The cursor may focus on any cell from those included in valid_cells. -## The valid cell list may be used to change what is 'highlightable' at any given moment (e.g. an -## ability that only affects neighbouring cells or limiting movement to a given direction). -## An empty valid_cells list will allow the cursor to select any cell. -var valid_cells: Array[Vector2i] = []: - set = set_valid_cells - ## The cell currently highlighted by the cursor. ## ## [br][br]A focus of [constant Gameboard.INVALID_CELL] indicates that there is no highlight. @@ -31,8 +20,6 @@ var focus: = Gameboard.INVALID_CELL: func _ready() -> void: - assert(gameboard, "\n%s::initialize error - Invalid Gameboard reference!" % name) - FieldEvents.input_paused.connect(_on_input_paused) @@ -48,24 +35,11 @@ func _unhandled_input(event: InputEvent) -> void: FieldEvents.cell_selected.emit(_get_cell_under_mouse()) -## Limit cursor selection to a particular subset of cells. -## [br][br][b]Note:[/b] Providing an empty array will allow any cell to be highlighted (negative to -## positive infinity). Default behaviour assumes that all cells are valid. -func set_valid_cells(cells: Array[Vector2i]) -> void: - valid_cells = cells - - if _is_cell_invalid(focus): - set_focus(Gameboard.INVALID_CELL) - - ## Change the highlighted cell to a new value. A value of [constant Gameboard.INVALID_CELL] will ## indicate that there is no highlighted cell. ## [br][br][b]Note:[/b] Values will be limited to [member valid_cells] if valid_cells is not empty. ## Values outside of valid_cells will not be focused. func set_focus(value: Vector2i) -> void: - if _is_cell_invalid(value): - value = Gameboard.INVALID_CELL - if value == focus: return @@ -75,7 +49,8 @@ func set_focus(value: Vector2i) -> void: clear() if focus != Gameboard.INVALID_CELL: - set_cell(0, focus, 0, Vector2(1, 5)) + set_cell(focus, 0, Vector2i(1, 5), 0) + #set_cell(0, focus, 0, Vector2(1, 5)) focus_changed.emit(old_focus, focus) FieldEvents.cell_highlighted.emit(focus) @@ -85,19 +60,14 @@ func set_focus(value: Vector2i) -> void: func _get_cell_under_mouse() -> Vector2i: # The mouse coordinates need to be corrected for any scale or position changes in the scene. var mouse_position: = ((get_global_mouse_position()-global_position) / global_scale) - var cell_under_mouse: = gameboard.pixel_to_cell(mouse_position) + var cell_under_mouse: = Gameboard.pixel_to_cell(mouse_position) - if not gameboard.boundaries.has_point(cell_under_mouse): + if not Gameboard.pathfinder.has_cell(cell_under_mouse): cell_under_mouse = Gameboard.INVALID_CELL return cell_under_mouse -# A wrapper for cell validity criteria. -func _is_cell_invalid(cell: Vector2i) -> bool: - return not valid_cells.is_empty() and not cell in valid_cells - - func _on_input_paused(is_paused: bool) -> void: set_process_unhandled_input(!is_paused) diff --git a/src/field/field_cursor.gd.uid b/src/field/gamepieces/controllers/cursor/field_cursor.gd.uid similarity index 100% rename from src/field/field_cursor.gd.uid rename to src/field/gamepieces/controllers/cursor/field_cursor.gd.uid diff --git a/src/field/gamepieces/controllers/cursor/player_path_destination_marker.gd b/src/field/gamepieces/controllers/cursor/player_path_destination_marker.gd new file mode 100644 index 00000000..4d224304 --- /dev/null +++ b/src/field/gamepieces/controllers/cursor/player_path_destination_marker.gd @@ -0,0 +1,15 @@ +extends Sprite2D + + +func _ready() -> void: + Player.player_path_set.connect( + func(gamepiece: Gamepiece, destination_cell: Vector2i) -> void: + if not gamepiece.arrived.is_connected(_on_gp_arrived): + gamepiece.arrived.connect(_on_gp_arrived, CONNECT_ONE_SHOT) + position = Gameboard.cell_to_pixel(destination_cell) + show() + ) + + +func _on_gp_arrived() -> void: + hide() diff --git a/src/field/player_path_destination_marker.gd.uid b/src/field/gamepieces/controllers/cursor/player_path_destination_marker.gd.uid similarity index 100% rename from src/field/player_path_destination_marker.gd.uid rename to src/field/gamepieces/controllers/cursor/player_path_destination_marker.gd.uid diff --git a/src/field/gamepieces/controllers/cursor/tileset_cursor.tres b/src/field/gamepieces/controllers/cursor/tileset_cursor.tres new file mode 100644 index 00000000..e22caa91 --- /dev/null +++ b/src/field/gamepieces/controllers/cursor/tileset_cursor.tres @@ -0,0 +1,13 @@ +[gd_resource type="TileSet" load_steps=3 format=3 uid="uid://cnlvvllr0ici"] + +[ext_resource type="Texture2D" uid="uid://dm4h0uo6gjp22" path="res://overworld/maps/tilesets/dungeon_tilemap.png" id="1_gvcwb"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_orie5"] +resource_name = "Overlay" +texture = ExtResource("1_gvcwb") +separation = Vector2i(1, 1) +1:5/0 = 0 +0:5/0 = 0 + +[resource] +sources/0 = SubResource("TileSetAtlasSource_orie5") diff --git a/src/field/gamepieces/controllers/gamepiece_controller.gd b/src/field/gamepieces/controllers/gamepiece_controller.gd index 84c5906c..6c6a9374 100644 --- a/src/field/gamepieces/controllers/gamepiece_controller.gd +++ b/src/field/gamepieces/controllers/gamepiece_controller.gd @@ -1,277 +1,107 @@ @tool -## Base controller responsible for the pathfinding state and movement of a gamepiece. -## -## A controller is responsible for all gamepiece behaviour, especially movement. The base controller -## provides several utility methods that query the [Gameboard]/[Gamepiece] state. -## -## [br][br]Please note that the GamepieceController class doesn't [i]do[/i] anything. Specific -## controllers will usually be subclassed from this base class. See [PlayerController] for a -## detailed example. -## -## [br][br]Requires a gamepiece as parent. The controller is derived from Node2D to account for -## [member global_scale] when searching for paths/objects. -## [br][br][b]Note:[/b] The controller is an optional component. Only gamepieces requiring player -## input or AI will be controlled. @icon("res://assets/editor/icons/IconGamepieceController.svg") class_name GamepieceController extends Node2D -# Colliding objects that have the following property set to true will block movement. -const BLOCKING_PROPERTY: = "blocks_movement" +## Emitted whenever the gamepiece begins moving towards a new cell in its [member move_path]. +signal waypoint_changed(waypoint: Vector2i) -## Colliders matching the following mask will be used to determine which cells are walkable. Cells -## containing any terrain collider will not be included for pathfinding. -@export_flags_2d_physics var terrain_mask: = 0x1 +## An active controller will receive inputs (player or otherwise). An inactive controller does +## nothing. This is useful, for example, when toggling of gamepiece movement during cutscenes. +var is_active: = false: + set = set_is_active -## The physics layers which will be used to search for gamepiece-related objects. -## Please see the project properties for the specific physics layers. [b]All[/b] collision shapes -## matching the mask will be checked regardless of position in the scene tree. -@export_flags_2d_physics var gamepiece_mask: = 0 - -# Some controllers may be needed during cutscenes. In this case, they will not be paused. -@export var run_during_cutscenes: = false: +## Keep track of a move path. The controller will check that the path is clear each time the +## gamepiece needs to continue on to the next cell. +var move_path: Array[Vector2i] = []: + set = move_along_path +var _current_waypoint: Vector2i: set(value): - run_during_cutscenes = value - - if not Engine.is_editor_hint(): - if not is_inside_tree(): - await ready - - if value and Cutscene.is_cutscene_in_progress(): - is_paused = false - - elif not value and Cutscene.is_cutscene_in_progress(): - is_paused = true - -## A pathfinder will be built from and respond to the physics state. This will be used to determine -## movement for the parent [Gamepiece]. -var pathfinder: Pathfinder - -# Keep track of cells that need an update and do so as a batch before the next path search. -var _cells_to_update: PackedVector2Array = [] + if value != _current_waypoint: + _current_waypoint = value + waypoint_changed.emit(_current_waypoint) # The controller operates on its direct parent, which must be a gamepiece object. var _gamepiece: Gamepiece -# Refer to _gamepiece's gameboard object to prevent repeatedly typing '_gamepiece.gameboard'. -var _gameboard: Gameboard - -# Create two internal collision finders that will search for other objects using Godot's built-in -# physics engine. -var _gamepiece_searcher: CollisionFinder -var _terrain_searcher: CollisionFinder - -# Controllers are paused on a few conditions: -# a) The gamestate changes to something other than the field, where controllers should not run. -# b) A cutscene is run, pausing most input. -var is_paused: = false: - set = set_is_paused - - -# Keep track of a move path. The controller will check that the path is clear each time the -# gamepiece needs to continue on to the next cell. -var _waypoints: Array[Vector2i] = [] -var _current_waypoint: Vector2i - func _ready() -> void: + set_process(false) + set_physics_process(false) + if not Engine.is_editor_hint(): - # A controller must operate on a gamepiece. Obtain the gamepiece reference and pull - # necessary information from it. - _gamepiece = get_parent() as Gamepiece - assert(_gamepiece, "The GamepieceController must have a Gamepiece as a parent. " - + "%s is not a gamepiece!" % get_parent().name) - - _gameboard = _gamepiece.gameboard - assert(_gameboard, "%s error: invalid Gameboard object!" % name) - - FieldEvents.input_paused.connect(_on_input_paused) + is_active = true _gamepiece.arriving.connect(_on_gamepiece_arriving) _gamepiece.arrived.connect(_on_gamepiece_arrived) - # The controller will be notified of any changes in the gameboard and respond accordingly. - FieldEvents.gamepiece_cell_changed.connect(_on_gamepiece_cell_changed) - FieldEvents.terrain_changed.connect(_on_terrain_passability_changed) - - # Create the objects that will be used to query the state of the gamepieces and terrain. - var min_cell_axis: = minf(_gameboard.cell_size.x-1, _gameboard.cell_size.y-1) / 2.0 - _gamepiece_searcher = CollisionFinder.new(get_world_2d().direct_space_state, min_cell_axis, - gamepiece_mask) - _terrain_searcher = CollisionFinder.new(get_world_2d().direct_space_state, min_cell_axis, - terrain_mask) - - # Wait a frame for the gameboard and physics engine to be fully setup. Once the physics - # engine is ready, its state may be queried to setup the pathfinder. - await get_tree().process_frame - _rebuild_pathfinder() - - -func _notification(what: int) -> void: - if what == NOTIFICATION_PARENTED: - update_configuration_warnings() + FieldEvents.input_paused.connect( + func _on_input_paused(value: bool) -> void: + is_active = !value + ) func _get_configuration_warnings() -> PackedStringArray: var warnings: PackedStringArray = [] - if not get_parent() is Gamepiece: - warnings.append("Expects a Gamepiece as parent to correctly function. " - + "Please only use GamepieceController as a child of a Gamepiece for correct animation.") + if not _gamepiece: + warnings.append("This object must be a child of a gamepiece!") return warnings -func travel_to_cell(destination: Vector2i, allow_adjacent_cells: = false) -> void: - _update_changed_cells() - _waypoints = pathfinder.get_path_cells(_gamepiece.cell, destination) - # No path could be found to the destination. If allowed, search for a path to an adjacent cell. - if _waypoints.size() <= 1 and allow_adjacent_cells: - _waypoints = pathfinder.get_path_cells_to_adjacent_cell(_gamepiece.cell, destination) - - # Only follow a valid path with a length greater than 0 (more than one waypoint). - if _waypoints.size() > 1: - # The first waypoint is the focus' current cell and may be discarded. - _waypoints.remove_at(0) - _current_waypoint = _waypoints.pop_front() - - _gamepiece.travel_to_cell(_current_waypoint) - - else: - _waypoints.clear() - - -## Returns true if a given cell is occupied by something that has a collider matching -## [member gamepiece_mask]. -func is_cell_blocked(cell: Vector2i) -> bool: - var search_coordinates: = Vector2(_gameboard.cell_to_pixel(cell)) * global_scale - var collisions = _gamepiece_searcher.search(search_coordinates) - - # Take advantage of duck typing: any colliding object could block movement. Look at the owner - # of the collision shape for a blocking flag. - # Please see BLOCKING_PROPERTY for more information. - # Note that not all collisions will have this blocking flag. In those cases, assume that the - # collision is a blocking collision. - for collision in collisions: - var blocks_movement = true - if collision.collider.owner.get(BLOCKING_PROPERTY): - blocks_movement = collision.collider.owner.get(BLOCKING_PROPERTY) as bool - - if blocks_movement: - return true - - # There is one last check to make. It is possible that a gamepiece has decided to move to cell - # THIS frame. It's collision shape will not move until next frame, so the events manager may - # have flagged this cell as 'targeted this frame'. - return FieldEvents.did_gp_move_to_cell_this_frame(cell) +func _notification(what: int) -> void: + if what == NOTIFICATION_PARENTED: + _gamepiece = get_parent() as Gamepiece + update_configuration_warnings() -## Find all collision matching [member gamepiece_mask] at a given cell. -func get_collisions(cell: Vector2i) -> Array: - var search_coordinates: = Vector2(_gameboard.cell_to_pixel(cell)) * global_scale - return _gamepiece_searcher.search(search_coordinates) +func move_along_path(value: Array[Vector2i]) -> void: + move_path = value + _move_to_next_waypoint() -func set_is_paused(paused: bool) -> void: - is_paused = paused - - if is_inside_tree() and not _waypoints.is_empty(): - _current_waypoint = _waypoints.pop_front() - _gamepiece.travel_to_cell(_current_waypoint) +## Set whether or not the controller may exert control over the gamepiece. +## There are a number of occasions (such as cutscenes or combat) where gamepieces are inactive. +func set_is_active(value: bool) -> void: + is_active = value + _move_to_next_waypoint() # Will only affect the gamepiece if is_active == true. -# Completely rebuild the pathfinder, searching for all empty terrain within the gameboard -# boundaries. -# Empty terrain is considered a cell that is NOT occupied by a collider with a terrain_mask. -func _rebuild_pathfinder() -> void: - var pathable_cells: Array[Vector2i] = [] +# Finds the [member move_path]'s waypoint using [method Array.pop_front] and begins moveing the +# gamepiece towards it. +# The method will do nothing if the controller is currently inactive. +# Returns the distance (in pixels) to the next waypoint. +func _move_to_next_waypoint() -> float: + var distance_to_point: = 0.0 - # Loop through ALL cells within the board boundaries. The only cells that will not be considered - # walkable are those that contain a collision shape matching the terrain layer mask. - for x in range(_gameboard.boundaries.position.x, _gameboard.boundaries.end.x): - for y in range(_gameboard.boundaries.position.y, _gameboard.boundaries.end.y): - var cell: = Vector2i(x, y) + if is_active: + if move_path.size() >= 1 and Gameboard.pathfinder.can_move_to(move_path[0]): + _current_waypoint = move_path.pop_front() + var destination = Gameboard.cell_to_pixel(_current_waypoint) - # To find collision shapes we'll query a PhysicsDirectSpaceState2D (usually that of the - # current viewport's World2D). If there is a collision shape matching terrainn_mask - # then we'll know to discard the cell. Otherwise it may be considered walkable. - var search_coordinates: = Vector2(_gameboard.cell_to_pixel(cell)) * global_scale - var collisions: = _terrain_searcher.search(search_coordinates) - if collisions.is_empty(): - pathable_cells.append(cell) - - pathfinder = Pathfinder.new(pathable_cells, _gameboard) - _find_all_blocked_cells() - - -# The following method searches ALL cells contained in the pathfinder for objects that might block -# gamepiece movement. -# -# This method may be overwritten depending on the movement behaviour of a controller's focus. For -# instance, a teleporting or flying focus will not be blocked by grounded gamepieces. -func _find_all_blocked_cells() -> void: - var blocked_cells: Array[Vector2i] = [] - - for cell in pathfinder.get_cells(): - if is_cell_blocked(cell): - blocked_cells.append(cell) - - pathfinder.set_blocked_cells(blocked_cells) - - -# Go through all cells that have been flagged for updates and determine if they are indeed occupied. -# This should usually be called before searching for a move path. -func _update_changed_cells() -> void: - # Duplicate entries may be included in _cells_to_update. Filter them by converting the array to - # dictionary keys (which are always unique). - # This ensures that given coordinates are only queried once per update. - var checked_coordinates: = {} - - for cell in _cells_to_update: - if not cell in checked_coordinates: - pathfinder.block_cell(cell, is_cell_blocked(cell)) - checked_coordinates[cell] = null - - _cells_to_update.clear() - - -func _on_input_paused(paused: bool) -> void: - if paused and run_during_cutscenes and Cutscene.is_cutscene_in_progress(): - return + # Report how far away the waypoint is. + distance_to_point = _gamepiece.position.distance_to(destination) + _gamepiece.move_to(Gameboard.cell_to_pixel(_current_waypoint)) + + GamepieceRegistry.move_gamepiece(_gamepiece, _current_waypoint) - is_paused = paused + return distance_to_point -# The controller's focus will finish travelling this frame unless it is extended. When following a -# path, the gamepiece will want to travel to the next waypoint. +# The controller's gamepiece will finish travelling this frame unless it is extended. When following +# a path, the gamepiece will want to travel to the next waypoint. # excess_distance covers cases where the gamepiece will move past the current waypoint and prevents # stuttering for a single frame (or slower-than-expected movement for *very* fast gamepieces). func _on_gamepiece_arriving(excess_distance: float) -> void: - # If the gamepiece is currently following a path, continue moving along the path if it is still - # a valid movement path (since obstacles may shift while in transit). - if not _waypoints.is_empty() and not is_paused: - while not _waypoints.is_empty() and excess_distance > 0: - if is_cell_blocked(_waypoints[0]) \ - or FieldEvents.did_gp_move_to_cell_this_frame(_waypoints[0]): + if not move_path.is_empty() and is_active: + # Fast gamepieces could jump several waypoints at once, so check to see which waypoint is + # next in line. + while not move_path.is_empty() and excess_distance > 0.0: + if not Gameboard.pathfinder.can_move_to(move_path[0]): return - _current_waypoint = _waypoints.pop_front() - var distance_to_waypoint: = \ - _gamepiece.position.distance_to(_gameboard.cell_to_pixel(_current_waypoint)) - - _gamepiece.travel_to_cell(_current_waypoint) + var distance_to_waypoint: = _move_to_next_waypoint() excess_distance -= distance_to_waypoint func _on_gamepiece_arrived() -> void: - _waypoints.clear() - - -# Whenever a gamepiece moves, flag its destination and origin as in need of an update. -func _on_gamepiece_cell_changed(gamepiece: Gamepiece, old_cell: Vector2) -> void: - _cells_to_update.append(old_cell) - _cells_to_update.append(gamepiece.cell) - - -# Various events may trigger a change in the terrain which, in turn, changes which cells are -# passable. The pathfinder will need to be rebuilt. -func _on_terrain_passability_changed() -> void: - _rebuild_pathfinder() + move_path.clear() diff --git a/src/field/gamepieces/controllers/gamepiece_controller.gd.uid b/src/field/gamepieces/controllers/gamepiece_controller.gd.uid index 3f4c1960..02e4413f 100644 --- a/src/field/gamepieces/controllers/gamepiece_controller.gd.uid +++ b/src/field/gamepieces/controllers/gamepiece_controller.gd.uid @@ -1 +1 @@ -uid://pfbspn48phnw +uid://ht3xm51xvouh diff --git a/src/field/gamepieces/controllers/path_loop_ai_controller.gd b/src/field/gamepieces/controllers/path_loop_ai_controller.gd index 34f7e039..8c2a80d4 100644 --- a/src/field/gamepieces/controllers/path_loop_ai_controller.gd +++ b/src/field/gamepieces/controllers/path_loop_ai_controller.gd @@ -1,139 +1,218 @@ @tool extends GamepieceController -## The points in the move_path will be used to generate the waypoints that the AI will follow. -@export var move_path: Line2D: +## The points in the path_to_follow will be used to generate the waypoints that the controller will +## follow. +@export var path_to_follow: Line2D: set(value): - move_path = value + path_to_follow = value update_configuration_warnings() -var _current_waypoint_index: = 0 -var _path_origin: Vector2 +var _current_waypoint_index: = -1 +var _path_origin: = Vector2.ZERO +var _start_cell: = Vector2i.ZERO +# The Gamepiece will wait for the timer to elapse before starting on its path. +# The timer will also trigger between iterations of the path. This means that after the gamepiece +# has looped back to the original point it will wait for _timer.timeout before beginning the next +# loop. +# The timer will also trigger if the path becomes blocked, for some reason. @onready var _timer: Timer = $WaitTimer func _ready() -> void: - super._ready() - if not Engine.is_editor_hint(): - move_path.hide() + path_to_follow.hide() _path_origin = _gamepiece.position + # The controller cannot find a path until the pathfinder has updated, and changes may + # require a new path. Update whenever the pathfinder changes. + Gameboard.pathfinder_changed.connect( + func _on_pathfinder_changed(_added, _removed) -> void: + # Log an error if the path described by path_to_follow cannot be traversed. + if not _find_move_path(): + #printerr("Failed to find a path_to_follow for '%s'!" % _gamepiece.name) + return + ) + _timer.one_shot = true - _timer.timeout.connect(_on_timer_timeout) + _timer.timeout.connect(_move_to_next_waypoint) _timer.start() + + super._ready() -func set_is_paused(paused: bool) -> void: - is_paused = paused +# Override GamepieceController's default implementation to preserve the move_path and to make use +# of the wait timer, if it is active. +func set_is_active(value: bool) -> void: + is_active = value - # Pause/unpause the wait timer to match the controller's 'paused state'. This is only really - # relevant if the controller is currently waiting to run the next loop. - _timer.paused = is_paused + ## Pause/unpause the wait timer to match the controller's 'paused state'. This is only really + ## relevant if the controller is currently waiting to run the next loop. + _timer.paused = !is_active - # Otherwise, if the gamepiece is in transit, pick up where it had left off. - if not paused: - if _current_waypoint_index > 0 and _current_waypoint_index < _waypoints.size() - 1 and \ - not is_cell_blocked(_waypoints[_current_waypoint_index]): - _gamepiece.travel_to_cell(_waypoints[_current_waypoint_index]) + ## Otherwise, if the gamepiece is in transit, pick up where it had left off. + if _timer.is_stopped(): + _move_to_next_waypoint() + +#func set_is_paused(paused: bool) -> void: + #is_paused = paused + # + ## Pause/unpause the wait timer to match the controller's 'paused state'. This is only really + ## relevant if the controller is currently waiting to run the next loop. + #_timer.paused = is_paused + # + ## Otherwise, if the gamepiece is in transit, pick up where it had left off. + #if not paused: + #if _current_waypoint_index > 0 and _current_waypoint_index < _waypoints.size() - 1 and \ + #not is_cell_blocked(_waypoints[_current_waypoint_index]): + #_gamepiece.travel_to_cell(_waypoints[_current_waypoint_index]) func _get_configuration_warnings() -> PackedStringArray: var warnings: PackedStringArray = [] # Node exports are currently broken. - if not move_path: + if not path_to_follow: warnings.append("The path loop controller needs a valid Line2D to follow!") return warnings -# Ensure that the waypoints are updated whenever the pathfinder is re-created. -# The controller's path will NOT take blocking gamepieces into account, so temporarily unblock all -# cells in the pathfinder. -func _rebuild_pathfinder() -> void: - super._rebuild_pathfinder() - - var blocked_cells: = pathfinder.get_blocked_cells() - pathfinder.set_blocked_cells([]) - - _find_waypoints_from_line2D() +# Try to convert the path_to_follow into a series of cells for the gamepiece to move to. +# Loop through the points in the Line2D, using Gameboard.pathfinder to find a path to each. Also +# searches for the shortest path from the last point to the first point. +# This method will fail if there is no valid path on the Gameboard between line points. +func _find_move_path() -> bool: + move_path.clear() - pathfinder.set_blocked_cells(blocked_cells) - - -# Note that the following must be called after the pathfinder has been built. -func _find_waypoints_from_line2D() -> void: # A path needs at least two points. - if move_path.get_point_count() <= 1: - return + if path_to_follow.get_point_count() <= 1: + return false # Add the first cell to the path, since subsequent additions will have the first cell removed. - _waypoints.append(_gameboard.pixel_to_cell(move_path.get_point_position(0) + _path_origin)) - - # Create a looping path from the points specified by move_path. Will fail if a path cannot be - # found between some of the move_path's points. - for i in range(1, move_path.get_point_count()): - var source: = _gameboard.pixel_to_cell(move_path.get_point_position(i-1) + _path_origin) - var target: = _gameboard.pixel_to_cell(move_path.get_point_position(i) + _path_origin) + _start_cell = Gameboard.pixel_to_cell(path_to_follow.get_point_position(0) + _path_origin) + #move_path.append(Gameboard.pixel_to_cell(path_to_follow.get_point_position(0) + _path_origin)) + + # Create a looping path from the points specified by path_to_follow. Will fail if a path cannot + # be found between some of the path_to_follow's points. + for i in range(1, path_to_follow.get_point_count()): + var source: = Gameboard.pixel_to_cell(path_to_follow.get_point_position(i-1) + _path_origin) + var target: = Gameboard.pixel_to_cell(path_to_follow.get_point_position(i) + _path_origin) - var path_subset: = pathfinder.get_path_cells(source, target) - if path_subset.is_empty(): - push_error("'%s' PathLoopAiController::_find_waypoints_from_line2D() error - " % name + - "Failed to find a path between cells %s and %s." % [source, target]) - return + var path_segment: = Gameboard.pathfinder.get_path_to_cell(source, target, + Pathfinder.FLAG_ALLOW_SOURCE_OCCUPANT | Pathfinder.FLAG_ALLOW_TARGET_OCCUPANT) + if path_segment.is_empty(): + #push_error("'%s' PathLoopAiController::_find_waypoints_from_line2D() error - " % name + + #"Failed to find a path between cells %s and %s." % [source, target]) + return false - # Trim the first cell in the path found to prevent duplicates. - _waypoints.append_array(path_subset.slice(1)) + move_path.append_array(path_segment) # Finally, connect the ending and starting cells to complete the loop. - var last_pos: = move_path.get_point_position(move_path.get_point_count()-1) + _path_origin - var last_cell: = _gameboard.pixel_to_cell(last_pos) - var first_cell: = _gameboard.pixel_to_cell(move_path.get_point_position(0) + _path_origin) + var last_pos: = path_to_follow.get_point_position(path_to_follow.get_point_count()-1) \ + + _path_origin + var last_cell: = Gameboard.pixel_to_cell(last_pos) + var first_cell: = Gameboard.pixel_to_cell(path_to_follow.get_point_position(0) + _path_origin) # If we've made it this far there must be a path between the first and last cell. - _waypoints.append_array(pathfinder.get_path_cells(last_cell, first_cell).slice(1)) + if last_cell != first_cell: + move_path.append_array(Gameboard.pathfinder.get_path_to_cell(last_cell, first_cell, + Pathfinder.FLAG_ALLOW_SOURCE_OCCUPANT | Pathfinder.FLAG_ALLOW_TARGET_OCCUPANT)) + return true -func _on_gamepiece_arriving(excess_distance: float) -> void: - if is_paused: - return +func _get_next_waypoint_index() -> int: + var next_index: = _current_waypoint_index + 1 + if next_index >= move_path.size(): + next_index = 0 + return next_index + + +func _move_to_next_waypoint() -> float: + var distance_to_point: = 0.0 - # If the gamepiece is currently following a path, continue moving along the path if it is still - # a valid movement path since obstacles may shift while in transit. - while _current_waypoint_index >= 0 and _current_waypoint_index < _waypoints.size() - 1 \ - and excess_distance > 0: - _current_waypoint_index += 1 - var waypoint: = _waypoints[_current_waypoint_index] - if is_cell_blocked(waypoint) or FieldEvents.did_gp_move_to_cell_this_frame(waypoint): - set_process(true) - return + if is_active and not move_path.is_empty(): + var next_index: = _get_next_waypoint_index() - var distance_to_waypoint: = \ - _gamepiece.position.distance_to(_gameboard.cell_to_pixel(waypoint)) + # If the next waypoint is blocked, restart the timer and try again later. + if Gameboard.pathfinder.can_move_to(move_path[next_index]): + _current_waypoint_index = next_index + _current_waypoint = move_path[_current_waypoint_index] + + var destination = Gameboard.cell_to_pixel(_current_waypoint) + distance_to_point = _gamepiece.position.distance_to(destination) + _gamepiece.move_to(destination) + + GamepieceRegistry.move_gamepiece(_gamepiece, _current_waypoint) + - _gamepiece.travel_to_cell(waypoint) - excess_distance -= distance_to_waypoint + else: + _timer.start() + + return distance_to_point +# Modified from the default behaviour to always wait for wait_timer.timeout on the last point. +func _on_gamepiece_arriving(excess_distance: float) -> void: + if not move_path.is_empty() and is_active: + # Fast gamepieces could jump several waypoints at once, so check to see which waypoint is + # next in line. + while not move_path.is_empty() and excess_distance > 0.0: + if _current_waypoint == _start_cell \ + or not Gameboard.pathfinder.can_move_to(move_path[_get_next_waypoint_index()]): + return + + var distance_to_waypoint: = _move_to_next_waypoint() + excess_distance -= distance_to_waypoint + + +# Override GamepieceController's default implementation to preserve the move_path. +#func _on_gamepiece_arriving(excess_distance: float) -> void: + #if not is_active: + #return + # + ## If the gamepiece is currently following a path, continue moving along the path if it is still + ## a valid movement path since obstacles may shift while in transit. + #while _current_waypoint_index >= 0 and _current_waypoint_index < move_path.size() - 1 \ + #and excess_distance > 0: + #_current_waypoint_index += 1 + #var waypoint: = move_path[_current_waypoint_index] + # + ## If the gamepiece cannot move to the next cell in the path, begin the timer and wait for + ## the path to reopen. + #if not Gameboard.can_move_to(waypoint): + #return + # + #var distance_to_waypoint: = \ + #_gamepiece.position.distance_to(Gameboard.cell_to_pixel(waypoint)) + # + #_gamepiece.travel_to_cell(waypoint) + #excess_distance -= distance_to_waypoint + + +# Override GamepieceController's implementation to preserve the move_path. func _on_gamepiece_arrived() -> void: _timer.start() -func _on_timer_timeout() -> void: - if _current_waypoint_index < 0 or _current_waypoint_index >= _waypoints.size(): - _current_waypoint_index = 0 - - var waypoint: = _waypoints[_current_waypoint_index] - if waypoint == _gamepiece.cell: - _current_waypoint_index += 1 - if _current_waypoint_index >= _waypoints.size(): - _current_waypoint_index = 0 - waypoint = _waypoints[_current_waypoint_index] - - if waypoint != _gamepiece.cell and is_cell_blocked(waypoint): - _timer.start() - - else: - _gamepiece.travel_to_cell(waypoint) +# Restart the path from the Gamepiece's current cell. If the next waypoint is blocked, the timer +# will be restarted. +#func _on_timer_timeout() -> void: + #if _current_waypoint_index < 0 or _current_waypoint_index >= move_path.size(): + #_current_waypoint_index = 0 + # + #_current_waypoint = move_path[_current_waypoint_index] + #if _current_waypoint == _gamepiece.cell: + #_current_waypoint_index += 1 + #if _current_waypoint_index >= move_path.size(): + #_current_waypoint_index = 0 + #_current_waypoint = move_path[_current_waypoint_index] + # + ## If the next waypoint is blocked, restart the timer and try again laer. + #if _current_waypoint != _gamepiece.cell and \ + #not Gameboard.pathfinder.can_move_to(_current_waypoint): + #_timer.start() + # + #else: + #_gamepiece.move_to(Gameboard.cell_to_pixel(_current_waypoint)) diff --git a/src/field/gamepieces/controllers/player_controller.gd b/src/field/gamepieces/controllers/player_controller.gd index ff37d1be..5629cfdf 100644 --- a/src/field/gamepieces/controllers/player_controller.gd +++ b/src/field/gamepieces/controllers/player_controller.gd @@ -4,33 +4,35 @@ ## The controller responds to player input to handle movement and interaction. class_name PlayerController extends GamepieceController -const GROUP_NAME: = "_PLAYER_CONTROLLER_GROUP" - -var is_active: = false: - set(value): - is_active = value - - set_process(is_active) - set_physics_process(is_active) - set_process_input(is_active) - set_process_unhandled_input(is_active) +const GROUP: = "_PLAYER_CONTROLLER_GROUP" # Keep track of a targeted interaction. Used to face & interact with the object at a path's end. # It is reset on cancelling the move path or continuing movement via arrows/gamepad directions. -var _target: Interaction = null +var _target_interaction: Interaction = null + +# Keep track of any Triggers that the player has stepped on. +var _active_trigger: Trigger = null + +# Also keep track of the most recently pressed move key (e.g. WASD keys). This makes keyboard input +# feel more intuitive, since the gamepiece will move towards the most recently pressed key rather +# than prefering an arbitrary axis. +var _last_input_direction: = Vector2.ZERO +# The "interaction searcher" area basically activates any Interactions, which means that they'll +# respond to key/button input. @onready var _interaction_searcher: = $InteractionSearcher as Area2D +@onready var _interaction_shape: = $InteractionSearcher/CollisionShape2D as CollisionShape2D + +# The player collision area activates Triggers whenever the player moves onto their collision +# shape. @onready var _player_collision: = $PlayerCollision as Area2D func _ready() -> void: super._ready() - set_process(false) - set_physics_process(false) - if not Engine.is_editor_hint(): - add_to_group(GROUP_NAME) + add_to_group(GROUP) # Refer the various player collision shapes to their gamepiece (parent of the controller). # This will allow other objects/systems to quickly find which gamepiece they are working on @@ -38,142 +40,181 @@ func _ready() -> void: _interaction_searcher.owner = _gamepiece _player_collision.owner = _gamepiece - FieldEvents.cell_selected.connect(_on_cell_selected) + # Update the position of the player's collision shape to match the cell that it is currently + # moving towards. + waypoint_changed.connect( + func _on_waypoint_changed(new_waypoint: Vector2i): + if new_waypoint == Gameboard.INVALID_CELL: + _player_collision.position = Vector2.ZERO + else: + _player_collision.position = Gameboard.cell_to_pixel(new_waypoint) \ + - _gamepiece.position + ) - # Connect to a few lambdas that change the cell at which the player searches for - # interactions. These come into play whenever the player's gamepiece moves to a new cell or - # changes direction. - _gamepiece.cell_changed.connect( - func(old_cell): - super._on_gamepiece_cell_changed(_gamepiece, old_cell) - _align_interaction_searcher_to_faced_cell() + # The player collision picks up any triggers that it moves over. Keep track of them until + # player movement to the current cells has completed. + _player_collision.area_entered.connect( + func _on_collision_triggered(area: Area2D): + if area.owner is Trigger: + _active_trigger = area.owner ) + _gamepiece.direction_changed.connect( - func(_direction): _align_interaction_searcher_to_faced_cell() + func _on_gamepiece_direction_changed(new_direction: Directions.Points): + var offset: Vector2 = Directions.MAPPINGS[new_direction] * 16 + _interaction_searcher.position = offset ) - is_active = true - - _align_interaction_searcher_to_faced_cell() + FieldEvents.cell_selected.connect(_on_cell_selected) + FieldEvents.interaction_selected.connect(_on_interaction_selected) -func set_is_paused(paused: bool) -> void: - super.set_is_paused(paused) - set_process(!paused) - set_physics_process(!paused) +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_released("select"): + stop_moving() - - -func _physics_process(_delta: float) -> void: - var move_dir: = _get_move_direction() - if move_dir: - _target = null - - if not _gamepiece.is_moving(): - var target_cell: = Vector2i.ZERO + elif event is InputEventKey: + if event.is_action_pressed("ui_up"): + _last_input_direction = Vector2.UP + if _gamepiece.is_moving(): stop_moving() + else: move_to_pressed_key(Vector2.UP) - # Unless using 8-direction movement, one movement axis must be preferred. - # Default to the x-axis. - if not is_zero_approx(move_dir.x): - move_dir = Vector2(move_dir.x, 0) - else: - move_dir = Vector2(0, move_dir.y) + elif event.is_action_pressed("ui_down"): + _last_input_direction = Vector2.DOWN + if _gamepiece.is_moving(): stop_moving() + else: move_to_pressed_key(Vector2.DOWN) - _gamepiece.direction = move_dir - target_cell = _gamepiece.cell + Vector2i(move_dir) + elif event.is_action_pressed("ui_left"): + _last_input_direction = Vector2.LEFT + if _gamepiece.is_moving(): stop_moving() + else: move_to_pressed_key(Vector2.LEFT) - # If there is a gamepiece at the target cell, do not move on top of it. - _update_changed_cells() - if not is_cell_blocked(target_cell) and \ - not FieldEvents.did_gp_move_to_cell_this_frame(target_cell): - var move_path: = pathfinder.get_path_cells(_gamepiece.cell, target_cell) - - # Path is invalid. Bump animation? - if move_path.size() <= 1: - pass - - else: - _gamepiece.travel_to_cell(target_cell) + elif event.is_action_pressed("ui_right"): + _last_input_direction = Vector2.RIGHT + if _gamepiece.is_moving(): stop_moving() + else: move_to_pressed_key(Vector2.RIGHT) + + +func move_along_path(value: Array[Vector2i]) -> void: + super.move_along_path(value.duplicate()) + + _interaction_shape.disabled = true + Player.player_path_set.emit(_gamepiece, value.back()) + + +func move_to_pressed_key(input_direction: Vector2) -> void: + if is_active: + var source_cell: = GamepieceRegistry.get_cell(_gamepiece) + var target_cell: = Vector2i.ZERO + + # Unless using 8-direction movement, one movement axis must be preferred. + # Default to the x-axis. + target_cell = source_cell + Vector2i(input_direction) + + # Try to get a path to destination (will fail if cell is occupied) + var new_move_path: = Gameboard.pathfinder.get_path_to_cell(source_cell, target_cell) + + # Path is invalid. Bump animation? + if new_move_path.size() < 1: + _gamepiece.direction = Directions.angle_to_direction(input_direction.angle()) else: - _target = null - _waypoints.clear() + move_path = new_move_path.duplicate() -func _get_move_direction() -> Vector2: - return Vector2( - Input.get_axis("ui_left", "ui_right"), - Input.get_axis("ui_up", "ui_down") - ) +func stop_moving() -> void: + move_path.clear() + _target_interaction = null -func _align_interaction_searcher_to_faced_cell() -> void: - var cell_coordinates: = Vector2(_gameboard.cell_to_pixel(_gamepiece.get_faced_cell())) - _interaction_searcher.global_position = cell_coordinates*_gamepiece.global_scale +# The player has clicked on an empty gameboard cell. We'll try to move _gamepiece to the cell. +func _on_cell_selected(cell: Vector2i) -> void: + if is_active and not _gamepiece.is_moving(): + var source_cell: = Gameboard.pixel_to_cell(_gamepiece.position) + + # Don't move to the cell the focus is standing on. + if cell == source_cell: + return + + # Take a look at what's underneath the cursor. If there's an interaction, move towards it + # and try to interact with it. + + # Otherwise it's just the empty gameboard, so we'll try to move the player towards the + # selected cell. + var new_path = Gameboard.pathfinder.get_path_to_cell(source_cell, cell) + if not new_path.is_empty(): + move_path = new_path.duplicate() + + +# The player has clicked on something interactable. We'll try to move next to the interaction and +# then run the interaction. +func _on_interaction_selected(interaction: Interaction) -> void: + if is_active and not _gamepiece.is_moving(): + var source_cell: = Gameboard.pixel_to_cell(_gamepiece.position) + var target_cell: = Gameboard.pixel_to_cell(interaction.position) + + if target_cell == source_cell: + return + + # First of all, check to see if the target is adjacent to the source. + if target_cell in Gameboard.get_adjacent_cells(source_cell): + _gamepiece.direction \ + = Directions.vector_to_direction(interaction.position - _gamepiece.position) + interaction.run() + + else: + # Only cache the interaction and move towards it if there is a valid move path. + var new_path = Gameboard.pathfinder.get_path_cells_to_adjacent_cell(source_cell, + target_cell) + if not new_path.is_empty(): + _target_interaction = interaction + + move_path = new_path.duplicate() + + # If the player is already moving, cancel that movement. + else: + stop_moving() -# The controller's focus will finish travelling this frame unless it is extended. -# There are a few cases where the controller will want to extend the path: -# a) The gamepiece is following a series of waypoints, and needs to know which cell is next. Note -# that the controller is responsible for the waypoints (instead of the gamepiece, for -# instance) so that the path can be checked for any changes *as the gamepiece travels*. -# b) A movement key/button is held down and the gamepiece should smoothly flow into the next cell. func _on_gamepiece_arriving(excess_distance: float) -> void: - # Handle moving to the next waypoint in the path. - super._on_gamepiece_arriving(excess_distance) + # If the gamepiece moved onto a trigger, stop the gamepiece in its tracks. + if _active_trigger: + stop_moving() - # Allow movement keys/buttons to override path following. - var move_direction: = _get_move_direction() - if move_direction and not is_paused: - _target = null - _waypoints.clear() - - var next_cell: Vector2i - if not is_zero_approx(move_direction.x): - next_cell = _gamepiece.cell + Vector2i(int(move_direction.x), 0) - else: - next_cell = _gamepiece.cell + Vector2i(0, int(move_direction.y)) + # Otherwise, carry on with movement. + else: + super._on_gamepiece_arriving(excess_distance) - if pathfinder.has_cell(next_cell) and not is_cell_blocked(next_cell) and \ - not FieldEvents.did_gp_move_to_cell_this_frame(next_cell): - _gamepiece.travel_to_cell(next_cell) + # It may be that the player is holding the keys down. In that case, continue moving the + # gamepiece towards the pressed direction. + var input_direction: = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") + if not input_direction.is_equal_approx(Vector2.ZERO): + move_to_pressed_key(_last_input_direction) func _on_gamepiece_arrived() -> void: super._on_gamepiece_arrived() - if _target: - var distance_to_target: = _target.global_position/_target.global_scale - _gamepiece.position - _gamepiece.direction = distance_to_target + _player_collision.position = Vector2.ZERO + _interaction_shape.disabled = false + + # If there's a trigger at this cell, do nothing but reset the trigger reference. + if _active_trigger: + _active_trigger = null + + # Otherwise, if there's an interaction queued, run the interaction. + elif _target_interaction: + # Face the selected interaction... + var direction_to_target: = _target_interaction.position - _gamepiece.position + _gamepiece.direction = Directions.vector_to_direction(direction_to_target) - _target.run() - _target = null - - -func _on_cell_selected(cell: Vector2i) -> void: - if is_active and not _gamepiece.is_moving(): - # Don't move to the cell the focus is standing on. May want to open inventory. - if cell == _gamepiece.cell: - return - - # We'll want different behaviour depending on what's underneath the cursor. - var collisions: = get_collisions(cell) - - # If there is an interaction underneath the cursor the player's gamepiece should flag the - # target and move to an adjacent cell. - if not collisions.is_empty(): - for collision: Dictionary in collisions: - if collision.collider.owner is Interaction: - _target = collision.collider.owner - break - - # The following method will move to an empty cell OR adjacent to a blocked cell that has - # an interaction located on it. - travel_to_cell(cell, _target != null) - if not _waypoints.is_empty(): - FieldEvents.player_path_set.emit(_gamepiece, _waypoints.back()) - - # There is no path but there is a target, which means that the player is standing right next - # to the target interaction. - elif _target: - _on_gamepiece_arrived() + # ...and then execute the interaction. + _target_interaction.run() + _target_interaction = null + + # No target, but check to see if the player is holding a key down and face in the direction of + # the last pressed key. + else: + var input_direction: = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down") + if not input_direction.is_equal_approx(Vector2.ZERO): + _gamepiece.direction = Directions.vector_to_direction(_last_input_direction) diff --git a/src/field/gamepieces/controllers/player_controller.gd.uid b/src/field/gamepieces/controllers/player_controller.gd.uid index cbec584a..e27f5e3f 100644 --- a/src/field/gamepieces/controllers/player_controller.gd.uid +++ b/src/field/gamepieces/controllers/player_controller.gd.uid @@ -1 +1 @@ -uid://cqlx3rgg16wkv +uid://vnofet0hi8mx diff --git a/src/field/gamepieces/controllers/player_controller.tscn b/src/field/gamepieces/controllers/player_controller.tscn index 0c93f37a..fee48ef5 100644 --- a/src/field/gamepieces/controllers/player_controller.tscn +++ b/src/field/gamepieces/controllers/player_controller.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=4 format=3 uid="uid://d2lj4blu56fte"] -[ext_resource type="Script" uid="uid://cqlx3rgg16wkv" path="res://src/field/gamepieces/controllers/player_controller.gd" id="1_i2bab"] +[ext_resource type="Script" uid="uid://vnofet0hi8mx" path="res://src/field/gamepieces/controllers/player_controller.gd" id="1_5pjdg"] [sub_resource type="CircleShape2D" id="CircleShape2D_3ejyl"] radius = 7.0 @@ -9,13 +9,11 @@ radius = 7.0 radius = 6.0 [node name="PlayerController" type="Node2D"] -script = ExtResource("1_i2bab") -gamepiece_mask = 18 +script = ExtResource("1_5pjdg") [node name="PlayerCollision" type="Area2D" parent="."] collision_layer = 4 -collision_mask = 0 -monitoring = false +collision_mask = 32 [node name="CollisionShape2D" type="CollisionShape2D" parent="PlayerCollision"] shape = SubResource("CircleShape2D_3ejyl") diff --git a/src/field/gamepieces/gamepiece.gd b/src/field/gamepieces/gamepiece.gd index a60ed766..6ae702ad 100644 --- a/src/field/gamepieces/gamepiece.gd +++ b/src/field/gamepieces/gamepiece.gd @@ -10,10 +10,7 @@ ## Gamepiece may be placed. The gameboard is made up of cells, each of which may be occupied by one ## or more gamepieces. @icon("res://assets/editor/icons/Gamepiece.svg") -class_name Gamepiece extends Node2D - -## Emitted when the gamepiece begins to travel towards a destination cell. -signal travel_begun +class_name Gamepiece extends Path2D ## Emitted when a gamepiece is about to finish travlling to its destination cell. The remaining ## distance that the gamepiece could travel is based on how far the gamepiece has travelled this @@ -25,118 +22,106 @@ signal arriving(remaining_distance: float) ## Emitted when the gamepiece has finished travelling to its destination cell. signal arrived -## Emitted when [member blocks_movement] changes. -signal blocks_movement_changed - -## Emitted when the gamepiece moves to a new [member cell] on the gameboard.[br][br] -## When travelling, [member cell] is updated [b]before[/b] travelling. In this case, -## prefer to wait for [signal arrived] instead. -signal cell_changed(old_cell: Vector2i) - ## Emitted when the gamepiece's [member direction] changes, usually as it travels about the board. -signal direction_changed(new_direction: Vector2) +signal direction_changed(new_direction: Directions.Points) -## The [Gameboard] object used to tie the gamepiece to the gameboard. A gamepiece without a valid -## gameboard reference will produce errors, stopping the program. -@export var gameboard: Gameboard: +## A [GamepieceAnimation] packed scene that will be automatically added to the gamepiece. Other +## scene types will not be accepted. +@export var animation_scene: PackedScene: set(value): - gameboard = value - update_configuration_warnings() - -## A gamepiece may block movement into the cell it currently occupies. To do so, the gamepiece also -## requires a descendant [CollisionObject2D] with a valid collision shape. -@export var blocks_movement: = false: - set(value): - if value != blocks_movement: - blocks_movement = value - blocks_movement_changed.emit() + animation_scene = value + + if not is_inside_tree(): + await ready - update_configuration_warnings() + if animation: + animation.queue_free() + animation = null + + if animation_scene: + # Check to make sure that the supplied scene instantiates as a GamepieceAnimation. + var new_scene: = animation_scene.instantiate() + animation = new_scene as GamepieceAnimation + if not animation: + printerr("Gamepiece '%s' cannot accept '%s' as " % [name, new_scene.name], + "gamepiece_gfx_scene. '%s' is not a GamepieceGFX object!" % new_scene.name) + new_scene.free() + animation_scene = null + return + + follower.add_child(animation) ## The gamepiece will traverse a movement path at [code]move_speed[/code] pixels per second. +##[/br][/br]Note that extremely high speeds (finish a long path in a single frame) will produce +## unexpected results. @export var move_speed: = 64.0 -## The gamepiece's position is snapped to whichever cell it currently occupies. -## [br][br]The gamepiece will move by steps, being placed at whichever cell it currently occupies. -## This is useful for snapping its collision shape to the gameboard grid, so that there is never -## ambiguity to which space/cell is occupied according to the physics engine. [br][br] -## It is not desirable, however, for the graphical representation of the gamepiece (or the camera!) -## to jump around the gameboard with the gamepiece. Rather, a follower will travel a movement path -## to give the appearance of smooth movement. Other objects (such as sprites and animation) will -## derive their position from this follower and, consequently, appear to move smoothly. -## See [member camera_anchor] and [member gfx_anchor]. -var cell: = Vector2i.ZERO: - set = set_cell +## The visual representation of the gamepiece, set automatically based on [member animation_scene]. +## Usually the animation is only changed by the gamepiece itself, though the designer may want to +## play different animations sometimes (such as during a cutscene). +var animation: GamepieceAnimation = null ## The [code]direction[/code] is a unit vector that points where the gamepiece is 'looking'. ## In the event that the gamepiece is moving along a path, direction is updated automatically as ## long as the gamepiece continues to move. -var direction: = Vector2.DOWN: +var direction: = Directions.Points.S: set(value): - value = value.normalized() - if not direction.is_equal_approx(value): + if value != direction: direction = value + + if not is_inside_tree(): + await ready + + animation.direction = direction direction_changed.emit(direction) -## A camera may smoothly follow a travelling gamepiece by receiving the camera_anchor's transform. -@onready var camera_anchor: = $Decoupler/Path2D/PathFollow2D/CameraAnchor as RemoteTransform2D +## The position at the centre of the cell currently occupied by the gamepiece. Note that this +## differs from the gamepiece's position while it is moving. +var rest_position: = Vector2.ZERO + +## The position at the centre of the cell to which the gamepiece is currently moving (and which it +## currently occupies, as it moves towards it). +## Compare this with the Gamepiece's position, which is kept constant at the move path's origin +## until the gamepiece has arrived at its destination. Compare also with the position of the path +## follower, at which the GamepieceAnimation is rendered. +var destination: Vector2 -## The graphical representation of the gamepiece may smoothly follow a travelling gamepiece by -## receiving the gfx_anchor's transform. -@onready var gfx_anchor: = $Decoupler/Path2D/PathFollow2D/GFXAnchor as RemoteTransform2D +## Node2Ds may want to follow the gamepiece's animation, rather than position (which updates only at +## the end of a path). Nodes may follow a travelling gamepiece by receiving the path follower's +## transform.[/br][/br] +## The [member RemoteTransform2D.remote_path] is reserved for the player camera, but other nodes +## may access the anchor's position directly. +@onready var animation_transform: = $PathFollow2D/CameraAnchor as RemoteTransform2D # The following objects allow the gamepiece to appear to move smoothly around the gameboard. # Please note that the path is decoupled from the gamepiece's position (scale is set to match # the gamepiece in _ready(), however) in order to simplify path management. All path coordinates may # be provided in game-world coordinates and will remain relative to the origin even as the # gamepiece's position changes. -@onready var _path: = $Decoupler/Path2D as Path2D -@onready var _follower: = $Decoupler/Path2D/PathFollow2D as PathFollow2D +@onready var follower: = $PathFollow2D as PathFollow2D func _ready() -> void: - set_physics_process(false) - update_configuration_warnings() + set_process(false) - if not Engine.is_editor_hint(): - assert(gameboard, "Gamepiece '%s' must have a gameboard reference to function!" % name) - - # Ensure that the gamepiece and its path are at the same scale. This will enable providing - # movement coordinates in local scale, simplifying path creation. - _path.global_scale = global_scale + if not Engine.is_editor_hint() and is_inside_tree(): + # Some gamepieces may be added to the scene before the Gameboard properties are set. In that + # case, wait for Gameboard dimensions to be set before registering the gamepiece. + if Gameboard.properties == null: + await Gameboard.properties_set - # We want to automatically forward the cell_changed signal to the corresponding FieldEvent - # (please see FieldEvents.gamepiece_cell_changed). - # To do so we'll connect the cell_changed signal to a lambda that will automatically call - # the FieldEvent for us, ensuring that the two signals are always paired. - cell_changed.connect( - func(old_cell: Vector2): FieldEvents.gamepiece_cell_changed.emit(self, old_cell) - ) + # Snap the gamepiece to the cell on which it is standing. + var cell: = Gameboard.get_cell_under_node(self) + position = Gameboard.cell_to_pixel(cell) - # Snap the gamepiece to it's initial grid position. - # Note that the path's coordinates are decoupled from the gamepiece's in order to simplify - # path creation (origin is the point of reference), so the follower needs to be initialized - # to the gamepiece's position. - cell = gameboard.pixel_to_cell(position) - _follower.position = position - - -func _get_configuration_warnings() -> PackedStringArray: - var warnings: PackedStringArray = [] - if not gameboard: - warnings.append("Gamepiece requires a Gameboard object to function!") - - # If this gamepiece is supposed to block movement ensure that it has a valid physics object. - if blocks_movement: - var collision_shapes: = find_children("*", "CollisionObject2D") - if collision_shapes.is_empty(): - warnings.append("Gamepiece is set to block other gamepieces but has no collision " - + "object. Please add a CollisionObject2D (i.e. Area2D) to enable blocking.") - - return warnings + # Then register the gamepiece with the registry. Note that if a gamepiece already exists at + # the cell, this one will simply be freed. + if GamepieceRegistry.register(self, cell) == false: + queue_free() -func _physics_process(delta: float) -> void: +func _process(delta: float) -> void: + # How far will the gamepiece move this frame? var move_distance: = move_speed * delta # We need to let others know that the gamepiece will arrive at the end of its path THIS frame. @@ -147,87 +132,62 @@ func _physics_process(delta: float) -> void: # movement. # The excess travel distance allows us to know how much to extend the path by. A VERY fast # gamepiece may jump a few cells at a time. - var excess_travel_distance: = _follower.progress + move_distance \ - - _path.curve.get_baked_length() - if excess_travel_distance >= 0: + var excess_travel_distance: = follower.progress + move_distance - curve.get_baked_length() + if excess_travel_distance >= 0.0: arriving.emit(excess_travel_distance) - # Movement may have been extended, so check if we need to cap movement to the waypoint. - var has_arrived: = _follower.progress + move_distance >= _path.curve.get_baked_length() - if has_arrived: - move_distance = _path.curve.get_baked_length() - _follower.progress - - _follower.progress += move_distance + # The path may have been extended, so the gamepiece can move along the path now. + follower.progress += move_distance - # If we've reached the end of the path, either travel to the next waypoint or wrap up movement. - if has_arrived: - reset_travel() - - -## Begin travelling towards the specified cell. -## [br][br]The gamepiece's position will update instantly to the target cell, whereas the path -## follower will begin moving smoothly towards the destination at [member move_speed]. The -## [signal arriving] and [signal arrived] signals will be emitted accordingly as the path follower -## reaches the destination cell. -## [br][br]To move the gamepiece instantly to a new cell, call [method set_cell] instead. -## [br][br][b]Note:[/b] Calling travel_to_cell on a moving gamepiece will update it's position to -## that indicated by the cell coordinates and add the cell to the movement path. -func travel_to_cell(destination_cell: Vector2i) -> void: - set_physics_process(true) + # Figure out which direction the gamepiece is facing, making sure that the GamepieceAnimation + # scene doesn't rotate. + animation.global_rotation = 0 + direction = Directions.angle_to_direction(follower.rotation) - # Note that updating the gamepiece's cell will snap it to its new grid position. This will - # be accounted for below when calculating the waypoint's pixel coordinates. - var old_position: = position - cell = destination_cell - direction = (position - old_position).normalized() + # If the gamepiece has arrived, update it's position and movement details. + if follower.progress >= curve.get_baked_length(): + stop() + + +## Move the gamepiece towards a point, given in pixel coordinates. +## If the Gamepiece is currently moving, this point will be added to the current path (see +## [member Path2D.curve]. Otherwise, a new curve is created with the point as the target.[br][br] +## Note that the Gamepiece's position will remain fixed until it has fully traveresed its movement +## path. At this point, its position is then updated to its destination. +func move_to(target_point: Vector2) -> void: + # Note that the destination is where the gamepiece will end up in game world coordinates. + destination = target_point + set_process(true) - # Setting the cell (the above line) snaps the gamepiece to its new cell, but we want to animate - # its movement. Therefore, the follower must lag behind, 'travelling' to the next cell. - # Reset the follower's position here so that there is no jitter when moving. - _follower.position = old_position + if curve == null: + curve = Curve2D.new() + curve.add_point(Vector2.ZERO) + + animation.play("run") - # If the gamepiece is not yet moving, we'll setup a new path. - if not _path.curve: - _path.curve = Curve2D.new() - - # The path needs at least two points for the follower to work correctly, so a new path - # will travel from the gamepiece's old position. - _path.curve.add_point(old_position) - _follower.progress = 0 + # The positions on the path, however, are all relative to the gamepiece's current position. The + # position doesn't update until the Gamepiece reaches its final destination, otherwise the path + # would move along with the gamepiece. + curve.add_point(destination-position) + + +## Stop the gamepiece from travelling and update its position. +func stop() -> void: + # Sort out gamepiece position, resetting the follower and placing everything at the destination. + position = destination + follower.progress = 0 + curve = null + destination = Vector2.ZERO - # The gamepiece serves as the waypoint's frame of reference. - _path.curve.add_point(gameboard.cell_to_pixel(destination_cell)) + # Handle the change to animation. + animation.global_rotation = 0 + animation.play("idle") - travel_begun.emit() - - -## Stop the gamepiece from travelling and set it at its cell. -func reset_travel() -> void: - _path.curve = null - _follower.progress = 0 - - set_physics_process(false) + # Stop movement and update logic. + set_process(false) arrived.emit() -## Returns [code]true[/code] if the gamepiece is currently traversing a path. +## Returns [code]true[/code] if the gamepiece is currently moving along its [member Path2D.curve]. func is_moving() -> bool: - return is_physics_processing() - - -func set_cell(value: Vector2i) -> void: - if Engine.is_editor_hint(): - return - - var old_cell: = cell - cell = value - - if not is_inside_tree(): - await ready - - position = gameboard.cell_to_pixel(cell) - cell_changed.emit(old_cell) - - -func get_faced_cell() -> Vector2i: - return (Vector2(cell) + direction).round() + return is_processing() diff --git a/src/field/gamepieces/gamepiece.tscn b/src/field/gamepieces/gamepiece.tscn index 06ce8152..c4f29e1a 100644 --- a/src/field/gamepieces/gamepiece.tscn +++ b/src/field/gamepieces/gamepiece.tscn @@ -2,21 +2,13 @@ [ext_resource type="Script" uid="uid://bn24acltw2l44" path="res://src/field/gamepieces/gamepiece.gd" id="1_xhsbn"] -[node name="Gamepiece" type="Node2D"] +[node name="Gamepiece" type="Path2D"] y_sort_enabled = true script = ExtResource("1_xhsbn") -max_speed = 64.0 -[node name="Decoupler" type="Node" parent="."] +[node name="PathFollow2D" type="PathFollow2D" parent="."] +loop = false -[node name="Path2D" type="Path2D" parent="Decoupler"] - -[node name="PathFollow2D" type="PathFollow2D" parent="Decoupler/Path2D"] - -[node name="CameraAnchor" type="RemoteTransform2D" parent="Decoupler/Path2D/PathFollow2D"] -update_rotation = false -update_scale = false - -[node name="GFXAnchor" type="RemoteTransform2D" parent="Decoupler/Path2D/PathFollow2D"] +[node name="CameraAnchor" type="RemoteTransform2D" parent="PathFollow2D"] update_rotation = false update_scale = false diff --git a/src/field/gamepieces/gamepiece_registry.gd b/src/field/gamepieces/gamepiece_registry.gd new file mode 100644 index 00000000..21eee4e7 --- /dev/null +++ b/src/field/gamepieces/gamepiece_registry.gd @@ -0,0 +1,106 @@ +## The GamepieceRegistry keeps track of each [Gamepiece] that is currently placed on the board. +## +## Since player movement is locked to gameboard cells (rather than physics-based movement), this +## allows UI elements, cutscenes, and other systems to quickly lookup gamepieces by name or +## location. Additionally, it allows pathfinders to see which cells are occupied or unoccupied. +## [/br][/br]Note that only ONE gamepiece may occupy a cell and will block the movement of other +## gamepieces. +extends Node + +signal gamepiece_moved(gp: Gamepiece, new_cell: Vector2i, old_cell: Vector2i) +signal gamepiece_freed(gp: Gamepiece, cell: Vector2i) + +# Store all registered gamepeices by the cell they occupy. +var _gamepieces: Dictionary[Vector2i, Gamepiece] = {} + + +func register(gamepiece: Gamepiece, cell: Vector2i) -> bool: + # Don't register a gamepiece if it's cell is already occupied... + if _gamepieces.has(cell): + printerr("Failed to register Gamepiece '%s' at cell '%s'. " % [gamepiece.name, str(cell)], + "A gamepiece already exists at that cell!") + return false + + #...or if it has already been registered, for some reason. + if gamepiece in _gamepieces.values(): + printerr("Refused to register Gamepiece '%s' at cell '%s'. " % [gamepiece.name, str(cell)], + "The gamepiece has already been registered!") + return true + + # We want to know when the gamepiece leaves the scene tree, as it is no longer on the gameboard. + # This probably means that the gamepiece has been freed. + gamepiece.tree_exiting.connect(_on_gamepiece_tree_exiting.bind(gamepiece)) + + _gamepieces[cell] = gamepiece + gamepiece_moved.emit(gamepiece, cell, Gameboard.INVALID_CELL) + + return true + + +## Update a gamepiece's position within the registry. +## Note that animation/position will need to be updated in response to the +## [signal Events.gamepiece_moved] signal. +func move_gamepiece(gp: Gamepiece, new_cell: Vector2i) -> bool: + # Don't move a gamepiece to an occupied cell. + if _gamepieces.has(new_cell): + print("Cell %s is already occupied, cannot move gamepiece '%s'!" % [str(new_cell), gp.name]) + return false + + var old_cell: = get_cell(gp) + if old_cell == new_cell: + return false + + _gamepieces.erase(old_cell) + _gamepieces[new_cell] = gp + + gamepiece_moved.emit(gp, new_cell, old_cell) + return true + + +## Return the gamepiece, if any,that is found at a given cell. +func get_gamepiece(cell: Vector2i) -> Gamepiece: + return _gamepieces.get(cell) as Gamepiece + + +## Return the gamepiece, if any, that has a given name. +func get_gamepiece_by_name(gp_name: String) -> Gamepiece: + for gp: Gamepiece in _gamepieces.values(): + if gp.name == gp_name: + return gp + return null + + +## Return the cell occupied by a given gamepiece. +func get_cell(gp: Gamepiece) -> Vector2i: + # Don't look up null gamepieces (i.e. blocked cells). + if gp: + var cell: = _gamepieces.find_key(gp) as Vector2i + if _gamepieces.has(cell): + return cell + return Gameboard.INVALID_CELL + + +func get_occupied_cells() -> Array[Vector2i]: + return _gamepieces.keys() + + +func get_gamepieces() -> Array[Gamepiece]: + return _gamepieces.values() + + +# Remove all traces of the gamepiece from the registry. +func _on_gamepiece_tree_exiting(gp: Gamepiece) -> void: + var cell = _gamepieces.find_key(gp) + if _gamepieces.has(cell): + _gamepieces.erase(cell) + gamepiece_freed.emit(gp, cell) + + #if cell != null: + #Events.gamepiece_exiting_tree.emit(gp, cell) + + +func _to_string() -> String: + var msg: = "\nGamepieceRegistry:" + for entry in _gamepieces: + msg += ("\n%s %s" % [entry, str(_gamepieces[entry])]) + return msg diff --git a/src/field/gamepieces/gamepiece_registry.gd.uid b/src/field/gamepieces/gamepiece_registry.gd.uid new file mode 100644 index 00000000..fc03cf65 --- /dev/null +++ b/src/field/gamepieces/gamepiece_registry.gd.uid @@ -0,0 +1 @@ +uid://c8otrh0xdc3bu diff --git a/src/field/map.gd b/src/field/map.gd new file mode 100644 index 00000000..13db7abd --- /dev/null +++ b/src/field/map.gd @@ -0,0 +1,30 @@ +@tool +extends Node2D + +## The map defines the properties of the playable grid, which will be applied on _ready to the +## [Gameboard]. These properties usually correspond to one or multiple tilesets. +@export var gameboard_properties: GameboardProperties: + set(value): + gameboard_properties = value + + if not is_inside_tree(): + await ready + + _debug_boundaries.gameboard_properties = gameboard_properties + +@onready var _debug_boundaries: DebugGameboardBoundaries = $Overlay/DebugBoundaries + +func _ready() -> void: + if not Engine.is_editor_hint(): + Camera.gameboard_properties = gameboard_properties + Gameboard.properties = gameboard_properties + + # Gamepieces need to be registered according to which cells they currently occupy. + # Gamepieces may not overlap, and only the first gamepiece registered to a given cell will + # be kept. + #for gamepiece: Gamepiece in find_children("*", "Gamepiece"): + #var cell: = Gameboard.get_cell_under_node(gamepiece) + #gamepiece.position = Gameboard.cell_to_pixel(cell) + # + #if GamepieceRegistry.register(gamepiece, cell) == false: + #gamepiece.queue_free() diff --git a/src/field/map.gd.uid b/src/field/map.gd.uid new file mode 100644 index 00000000..1659ab64 --- /dev/null +++ b/src/field/map.gd.uid @@ -0,0 +1 @@ +uid://drugj534rnwxw diff --git a/src/field/player_path_destination_marker.gd b/src/field/player_path_destination_marker.gd deleted file mode 100644 index 701d912e..00000000 --- a/src/field/player_path_destination_marker.gd +++ /dev/null @@ -1,12 +0,0 @@ -extends Sprite2D - -@export var gameboard: Gameboard - - -func _ready() -> void: - FieldEvents.player_path_set.connect( - func(gamepiece: Gamepiece, destination_cell: Vector2i) -> void: - gamepiece.arrived.connect(hide, CONNECT_ONE_SHOT) - position = gameboard.cell_to_pixel(destination_cell) - show() - ) diff --git a/src/main.tscn b/src/main.tscn index 6a6e4416..cdf5744d 100644 --- a/src/main.tscn +++ b/src/main.tscn @@ -1,65 +1,66 @@ -[gd_scene load_steps=90 format=3 uid="uid://p01fb6nvi144"] +[gd_scene load_steps=89 format=4 uid="uid://p01fb6nvi144"] [ext_resource type="Script" uid="uid://m3oktjc6gmsb" path="res://src/field/field.gd" id="2_bkxev"] -[ext_resource type="Script" uid="uid://dwq2jtul5j1rc" path="res://src/field/field_cursor.gd" id="5_3guor"] -[ext_resource type="Resource" uid="uid://cbnicto2l2ur2" path="res://maps/default_gameboard.tres" id="6_kd8tv"] -[ext_resource type="TileSet" uid="uid://biq84075xlypd" path="res://assets/terrain/tilesets/kenney_obstacles.tres" id="7_po5fq"] -[ext_resource type="Texture2D" uid="uid://dm4h0uo6gjp22" path="res://assets/terrain/dungeon_tilemap.png" id="9_woa3f"] +[ext_resource type="PackedScene" uid="uid://d2lj4blu56fte" path="res://src/field/gamepieces/controllers/player_controller.tscn" id="2_esa52"] +[ext_resource type="Script" uid="uid://drugj534rnwxw" path="res://src/field/map.gd" id="2_la2p5"] +[ext_resource type="TileSet" uid="uid://cnlvvllr0ici" path="res://src/field/gamepieces/controllers/cursor/tileset_cursor.tres" id="3_2v5er"] +[ext_resource type="Resource" uid="uid://k63mv5dbd1uk" path="res://overworld/maps/gbprops.tres" id="3_esa52"] +[ext_resource type="Script" uid="uid://dwq2jtul5j1rc" path="res://src/field/gamepieces/controllers/cursor/field_cursor.gd" id="5_3guor"] +[ext_resource type="TileSet" uid="uid://biq84075xlypd" path="res://overworld/maps/tilesets/kenney_terrain.tres" id="7_po5fq"] +[ext_resource type="Texture2D" uid="uid://dm4h0uo6gjp22" path="res://overworld/maps/tilesets/dungeon_tilemap.png" id="9_woa3f"] [ext_resource type="PackedScene" uid="uid://b626e0bngfvjj" path="res://src/field/gamepieces/gamepiece.tscn" id="11_yntrj"] [ext_resource type="Script" uid="uid://bm5b3nr6vn3da" path="res://src/field/gamepieces/controllers/path_loop_ai_controller.gd" id="12_glwd5"] -[ext_resource type="PackedScene" uid="uid://cdkha7cc72h35" path="res://assets/characters/generic_character_gfx.tscn" id="12_n5rm1"] -[ext_resource type="PackedScene" uid="uid://qxua6ekob7fa" path="res://assets/characters/gobot_gfx.tscn" id="12_oablq"] -[ext_resource type="Script" uid="uid://ccow10kcmjj04" path="res://maps/town/gang_of_four_conversation.gd" id="13_0rh60"] +[ext_resource type="PackedScene" uid="uid://cdkha7cc72h35" path="res://overworld/characters/generic_character_gfx.tscn" id="12_n5rm1"] +[ext_resource type="PackedScene" uid="uid://qxua6ekob7fa" path="res://overworld/characters/gobot_gfx.tscn" id="12_oablq"] +[ext_resource type="Script" uid="uid://ccow10kcmjj04" path="res://overworld/maps/town/gang_of_four_conversation.gd" id="13_0rh60"] [ext_resource type="Texture2D" uid="uid://b71dt8n01lhd0" path="res://assets/gui/path_destination_marker.tres" id="13_osl4o"] -[ext_resource type="Script" uid="uid://drl6kefixf2hu" path="res://src/field/player_path_destination_marker.gd" id="14_0j4ru"] -[ext_resource type="Resource" uid="uid://2604gnv0ps2b" path="res://maps/town/warrior.dtl" id="14_68y0v"] -[ext_resource type="PackedScene" uid="uid://se1wnxu5svgj" path="res://assets/characters/knight_gfx.tscn" id="14_av6f5"] +[ext_resource type="Script" uid="uid://drl6kefixf2hu" path="res://src/field/gamepieces/controllers/cursor/player_path_destination_marker.gd" id="14_0j4ru"] +[ext_resource type="Resource" uid="uid://2604gnv0ps2b" path="res://overworld/maps/town/warrior.dtl" id="14_68y0v"] +[ext_resource type="PackedScene" uid="uid://se1wnxu5svgj" path="res://overworld/characters/knight_gfx.tscn" id="14_av6f5"] [ext_resource type="Script" uid="uid://jka4efg1wci6" path="res://src/field/cutscenes/templates/conversations/conversation_template.gd" id="14_b3y71"] -[ext_resource type="Resource" uid="uid://cp5k342d2qao1" path="res://maps/town/runner.dtl" id="16_ybo02"] -[ext_resource type="PackedScene" uid="uid://dqdk6eehxsrmn" path="res://assets/characters/monk_gfx.tscn" id="17_qgtho"] -[ext_resource type="PackedScene" uid="uid://kiwma43jc3n6" path="res://assets/characters/lady_gfx.tscn" id="17_sieyv"] -[ext_resource type="PackedScene" uid="uid://bvtk5qllej4b8" path="res://assets/characters/smith_gfx.tscn" id="18_2msel"] +[ext_resource type="Resource" uid="uid://cp5k342d2qao1" path="res://overworld/maps/town/runner.dtl" id="16_ybo02"] +[ext_resource type="PackedScene" uid="uid://dqdk6eehxsrmn" path="res://overworld/characters/monk_gfx.tscn" id="17_qgtho"] +[ext_resource type="PackedScene" uid="uid://kiwma43jc3n6" path="res://overworld/characters/thief_gfx.tscn" id="17_sieyv"] +[ext_resource type="PackedScene" uid="uid://bvtk5qllej4b8" path="res://overworld/characters/smith_gfx.tscn" id="18_2msel"] [ext_resource type="Script" uid="uid://cmtpjnqderv2u" path="res://src/field/cutscenes/popups/moving_interaction_popup.gd" id="18_8igsj"] -[ext_resource type="Script" uid="uid://27j187rqxg64" path="res://src/field/gameboard/debug_map_boundaries.gd" id="18_cqtg7"] -[ext_resource type="PackedScene" uid="uid://ccm8tsjysf8b5" path="res://assets/characters/wizard_gfx.tscn" id="19_ius2d"] +[ext_resource type="Script" uid="uid://27j187rqxg64" path="res://src/field/gameboard/debug/debug_map_boundaries.gd" id="18_cqtg7"] +[ext_resource type="PackedScene" uid="uid://ccm8tsjysf8b5" path="res://overworld/characters/wizard_gfx.tscn" id="19_ius2d"] [ext_resource type="Script" uid="uid://ch0v602x6lumo" path="res://addons/dialogic/Modules/Text/node_name_label.gd" id="19_lpxfg"] [ext_resource type="PackedScene" uid="uid://oot0x5n44b2r" path="res://src/field/cutscenes/Interaction.tscn" id="19_sa6jd"] [ext_resource type="Script" uid="uid://3mvjdi4s31vl" path="res://addons/dialogic/Modules/Text/node_dialog_text.gd" id="20_g8d34"] [ext_resource type="Script" uid="uid://c0g1jsnegpvtq" path="res://src/field/ui/dialogue_window.gd" id="20_lk3dv"] [ext_resource type="Script" uid="uid://drtxbx1se41v0" path="res://addons/dialogic/Modules/Character/node_portrait_container.gd" id="21_f53lt"] [ext_resource type="FontFile" uid="uid://cfhyd5hmym1s4" path="res://assets/gui/font/Kenney Pixel.ttf" id="21_r13nn"] -[ext_resource type="Resource" uid="uid://c5gfpb2ghma5w" path="res://maps/town/smith.dtl" id="22_dko83"] -[ext_resource type="Resource" uid="uid://b6cc3gmd8nlty" path="res://maps/town/thief.dtl" id="22_rd6oa"] -[ext_resource type="Resource" uid="uid://cu4um6ppwmk03" path="res://maps/town/monk.dtl" id="24_grnqa"] -[ext_resource type="Script" uid="uid://pfbspn48phnw" path="res://src/field/gamepieces/controllers/gamepiece_controller.gd" id="26_p8jrd"] -[ext_resource type="Resource" uid="uid://vbo7p1nxgkrv" path="res://maps/town/wizard.dtl" id="28_ll4xp"] -[ext_resource type="Script" uid="uid://b2vp0gl62wukl" path="res://maps/town/fan_interaction.gd" id="29_at3vc"] +[ext_resource type="Resource" uid="uid://c5gfpb2ghma5w" path="res://overworld/maps/town/smith.dtl" id="22_dko83"] +[ext_resource type="Resource" uid="uid://b6cc3gmd8nlty" path="res://overworld/maps/town/thief.dtl" id="22_rd6oa"] +[ext_resource type="Resource" uid="uid://cu4um6ppwmk03" path="res://overworld/maps/town/monk.dtl" id="24_grnqa"] +[ext_resource type="Script" uid="uid://ht3xm51xvouh" path="res://src/field/gamepieces/controllers/gamepiece_controller.gd" id="26_p8jrd"] +[ext_resource type="Resource" uid="uid://vbo7p1nxgkrv" path="res://overworld/maps/town/wizard.dtl" id="28_ll4xp"] +[ext_resource type="Resource" uid="uid://bv1qjslq2pp7c" path="res://overworld/maps/town/fan_of_four.dtl" id="29_a8sfs"] +[ext_resource type="Script" uid="uid://b2vp0gl62wukl" path="res://overworld/maps/town/fan_interaction.gd" id="29_at3vc"] [ext_resource type="PackedScene" uid="uid://chgku8dii7mu8" path="res://src/field/cutscenes/templates/pickups/pickup.tscn" id="29_gxq7u"] -[ext_resource type="Resource" uid="uid://bv1qjslq2pp7c" path="res://maps/town/fan_of_four.dtl" id="30_n17q5"] -[ext_resource type="Script" uid="uid://b3pc7s5n03m85" path="res://maps/town/strange_tree_interaction.gd" id="31_y2el4"] -[ext_resource type="Resource" uid="uid://cdtwlcd2d6q07" path="res://maps/town/strange_tree.dtl" id="32_m0jee"] +[ext_resource type="Script" uid="uid://b3pc7s5n03m85" path="res://overworld/maps/town/strange_tree_interaction.gd" id="31_y2el4"] +[ext_resource type="Resource" uid="uid://cdtwlcd2d6q07" path="res://overworld/maps/town/strange_tree.dtl" id="32_m0jee"] [ext_resource type="Script" uid="uid://biiqi2vvuyjy0" path="res://src/field/cutscenes/templates/combat/roaming_combat_trigger.gd" id="33_0gswb"] -[ext_resource type="PackedScene" uid="uid://c8jtuge5yaqxa" path="res://src/field/cutscenes/templates/treasure_chests/chest.tscn" id="33_7djdg"] [ext_resource type="PackedScene" uid="uid://p0e4b0txynkd" path="res://src/field/cutscenes/templates/doors/door.tscn" id="33_lbtsh"] -[ext_resource type="Texture2D" uid="uid://d2qfi5sncf72b" path="res://assets/terrain/town_tilemap.png" id="33_ofo2l"] -[ext_resource type="PackedScene" uid="uid://wivtmf75ic3f" path="res://maps/town/battles/test_combat_arena.tscn" id="34_moieg"] +[ext_resource type="PackedScene" uid="uid://wivtmf75ic3f" path="res://overworld/maps/town/battles/test_combat_arena.tscn" id="34_moieg"] [ext_resource type="PackedScene" uid="uid://cubp81mykng3h" path="res://src/field/cutscenes/popups/interaction_popup.tscn" id="34_qs25x"] [ext_resource type="Script" uid="uid://xdpci16n7w0j" path="res://src/field/ui/inventory/ui_inventory.gd" id="34_tk01t"] [ext_resource type="AudioStream" uid="uid://duwauer3vwtne" path="res://assets/music/Insect Factory.mp3" id="34_xbc6u"] -[ext_resource type="Script" uid="uid://dlr1qymr1i4e" path="res://maps/town/door_unlock_interaction.gd" id="34_xtrml"] -[ext_resource type="Resource" uid="uid://dhllga88kmxrs" path="res://maps/town/sign.dtl" id="35_gv62s"] -[ext_resource type="Script" uid="uid://bb4gwwr02pllp" path="res://maps/town/conversation_encounter.gd" id="35_i66wm"] -[ext_resource type="PackedScene" uid="uid://bq6b26pctmol4" path="res://maps/town/battles/test_combat_arena2.tscn" id="35_x5y1m"] -[ext_resource type="PackedScene" uid="uid://cgwailb13nkcd" path="res://assets/characters/ghost_gfx.tscn" id="36_7n3c5"] -[ext_resource type="Resource" uid="uid://gcpgk7rnyguj" path="res://maps/town/encounter_before_combat.dtl" id="36_fu3a1"] +[ext_resource type="Script" uid="uid://dlr1qymr1i4e" path="res://overworld/maps/town/door_unlock_interaction.gd" id="34_xtrml"] +[ext_resource type="Resource" uid="uid://dhllga88kmxrs" path="res://overworld/maps/town/sign.dtl" id="35_gv62s"] +[ext_resource type="Script" uid="uid://bb4gwwr02pllp" path="res://overworld/maps/town/conversation_encounter.gd" id="35_i66wm"] +[ext_resource type="PackedScene" uid="uid://bq6b26pctmol4" path="res://overworld/maps/town/battles/test_combat_arena2.tscn" id="35_x5y1m"] +[ext_resource type="PackedScene" uid="uid://cgwailb13nkcd" path="res://overworld/characters/ghost_gfx.tscn" id="36_7n3c5"] +[ext_resource type="Resource" uid="uid://gcpgk7rnyguj" path="res://overworld/maps/town/encounter_before_combat.dtl" id="36_fu3a1"] [ext_resource type="PackedScene" uid="uid://bd624fi8r2avm" path="res://src/field/cutscenes/templates/area_transitions/area_transition.tscn" id="37_6xxks"] -[ext_resource type="Resource" uid="uid://dmmexun61mw4j" path="res://maps/town/encounter_on_victory.dtl" id="37_8j2gh"] -[ext_resource type="Resource" uid="uid://r1aeyknxv1hr" path="res://maps/grove/ghost.dtl" id="37_uncgg"] -[ext_resource type="Resource" uid="uid://c4ns5mfdjc11e" path="res://maps/town/encounter_on_loss.dtl" id="38_f1335"] -[ext_resource type="PackedScene" uid="uid://ctuol1ff8u5e2" path="res://maps/house/wand_pedestal_interaction.tscn" id="38_n1c7a"] +[ext_resource type="Resource" uid="uid://dmmexun61mw4j" path="res://overworld/maps/town/encounter_on_victory.dtl" id="37_8j2gh"] +[ext_resource type="Resource" uid="uid://r1aeyknxv1hr" path="res://overworld/maps/forest/ghost.dtl" id="37_uncgg"] +[ext_resource type="Resource" uid="uid://c4ns5mfdjc11e" path="res://overworld/maps/town/encounter_on_loss.dtl" id="38_f1335"] +[ext_resource type="PackedScene" uid="uid://ctuol1ff8u5e2" path="res://overworld/maps/house/wand_pedestal_interaction.tscn" id="38_n1c7a"] [ext_resource type="AudioStream" uid="uid://ohgp0pb24my4" path="res://assets/sfx/chop.ogg" id="39_02ti3"] [ext_resource type="PackedScene" uid="uid://dpopnsfpfdasl" path="res://src/field/cutscenes/Trigger.tscn" id="39_p2lth"] -[ext_resource type="Script" uid="uid://cstx0ojahlkxk" path="res://maps/grove/game_end_trigger.gd" id="40_lduow"] +[ext_resource type="Script" uid="uid://cstx0ojahlkxk" path="res://overworld/maps/forest/game_end_trigger.gd" id="40_lduow"] [ext_resource type="AudioStream" uid="uid://ctnn0hqkx67k7" path="res://assets/music/Apple Cider.mp3" id="41_uxhyb"] [ext_resource type="AudioStream" uid="uid://c5w0ripyqfl68" path="res://assets/sfx/drop_002.ogg" id="42_bc1t5"] [ext_resource type="AudioStream" uid="uid://dhr63rdgg3dn2" path="res://assets/sfx/error_006.ogg" id="43_qeoai"] @@ -67,26 +68,17 @@ [ext_resource type="Script" uid="uid://dlds5j5kp8u3d" path="res://addons/dialogic/Modules/Choice/node_choice_button.gd" id="53_w1dgf"] [ext_resource type="AudioStream" uid="uid://b6c1p14bc20p1" path="res://addons/dialogic/Example Assets/sound-effects/typing1.wav" id="54_fh5dy"] [ext_resource type="AudioStream" uid="uid://c3uw4nft0de13" path="res://addons/dialogic/Example Assets/sound-effects/typing2.wav" id="55_8lvao"] -[ext_resource type="Script" uid="uid://dstlv1xykju5l" path="res://maps/opening_cutscene.gd" id="55_vsmkr"] +[ext_resource type="Script" uid="uid://bt8owd5e0ns68" path="res://src/field/gameboard/gameboard_layer.gd" id="55_a8sfs"] +[ext_resource type="PackedScene" uid="uid://c3trg4x6hiuul" path="res://src/field/cutscenes/templates/treasure_chests/treasure_chest.tscn" id="55_mo8tx"] +[ext_resource type="Script" uid="uid://dstlv1xykju5l" path="res://overworld/maps/opening_cutscene.gd" id="55_vsmkr"] [ext_resource type="AudioStream" uid="uid://dnboblpkf0fqi" path="res://addons/dialogic/Example Assets/sound-effects/typing3.wav" id="56_prbwr"] [ext_resource type="AudioStream" uid="uid://c2viukvbub6v6" path="res://addons/dialogic/Example Assets/sound-effects/typing4.wav" id="57_tomnb"] [ext_resource type="AudioStream" uid="uid://dwcre3fjf3cj8" path="res://addons/dialogic/Example Assets/sound-effects/typing5.wav" id="58_br2ni"] -[ext_resource type="Resource" uid="uid://bwjallq2c71rq" path="res://maps/opening_cutscene.dtl" id="68_jcriq"] +[ext_resource type="TileSet" uid="uid://dhda7bse8tu6l" path="res://src/field/gameboard/debug/tileset_debug_pathfinder_map.tres" id="59_nl04t"] +[ext_resource type="Script" uid="uid://yukpiyvqb6m3" path="res://src/field/gameboard/debug/debug_pathfinder_map.gd" id="60_a8sfs"] +[ext_resource type="Resource" uid="uid://bwjallq2c71rq" path="res://overworld/maps/opening_cutscene.dtl" id="68_jcriq"] [ext_resource type="Script" uid="uid://i6j3l72wljdc" path="res://src/combat/combat.gd" id="69_meyff"] -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_orie5"] -resource_name = "Overlay" -texture = ExtResource("9_woa3f") -separation = Vector2i(1, 1) -1:5/0 = 0 -0:5/0 = 0 - -[sub_resource type="TileSet" id="TileSet_uvju2"] -sources/0 = SubResource("TileSetAtlasSource_orie5") - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_0ughy"] -size = Vector2(15, 15) - [sub_resource type="Animation" id="Animation_y8463"] length = 0.001 tracks/0/type = "value" @@ -101,18 +93,6 @@ tracks/0/keys = { "update": 0, "values": [Color(1, 1, 1, 1)] } -tracks/1/type = "value" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("PathBlocker/CollisionShape2D:disabled") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [false] -} [sub_resource type="Animation" id="Animation_0kxfj"] resource_name = "disappear" @@ -128,17 +108,19 @@ tracks/0/keys = { "update": 0, "values": [Color(1, 1, 1, 1), Color(1, 1, 1, 0)] } -tracks/1/type = "value" +tracks/1/type = "method" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("PathBlocker/CollisionShape2D:disabled") +tracks/1/path = NodePath("TileMap") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { -"times": PackedFloat32Array(0, 1), -"transitions": PackedFloat32Array(1, 1), -"update": 1, -"values": [false, true] +"times": PackedFloat32Array(1), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"queue_free" +}] } [sub_resource type="AnimationLibrary" id="AnimationLibrary_37hna"] @@ -147,21 +129,44 @@ _data = { &"disappear": SubResource("Animation_0kxfj") } -[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_s5jqb"] -texture = ExtResource("33_ofo2l") -separation = Vector2i(1, 1) -8:0/0 = 0 -7:0/0 = 0 -6:0/0 = 0 -6:1/0 = 0 -6:2/0 = 0 -7:2/0 = 0 -7:1/0 = 0 -8:1/0 = 0 -8:2/0 = 0 - -[sub_resource type="TileSet" id="TileSet_tinid"] -sources/0 = SubResource("TileSetAtlasSource_s5jqb") +[sub_resource type="Animation" id="Animation_orjmt"] +resource_name = "solve" +length = 0.25 +step = 0.05 +tracks/0/type = "audio" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Pedestal/SpikesClick") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"clips": [{ +"end_offset": 0.0, +"start_offset": 0.0, +"stream": ExtResource("39_02ti3") +}], +"times": PackedFloat32Array(0) +} +tracks/0/use_blend = true +tracks/1/type = "method" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Pedestal") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.25), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"queue_free" +}] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_jktnn"] +_data = { +&"solve": SubResource("Animation_orjmt") +} [sub_resource type="Animation" id="Animation_bwvqs"] length = 0.001 @@ -257,51 +262,37 @@ tracks/1/keys = { "times": PackedFloat32Array(0, 0.2, 0.4, 0.9) } tracks/1/use_blend = true -tracks/2/type = "method" +tracks/2/type = "value" tracks/2/imported = false tracks/2/enabled = true -tracks/2/path = NodePath("AnimationPlayer/WinScreen") +tracks/2/path = NodePath("AnimationPlayer/WinScreen/ColorRect/VBoxContainer/VBoxContainer:modulate") tracks/2/interp = 1 tracks/2/loop_wrap = true tracks/2/keys = { -"times": PackedFloat32Array(1.1), -"transitions": PackedFloat32Array(1), -"values": [{ -"args": [0.2], -"method": &"cover" -}] +"times": PackedFloat32Array(1.8, 2.5), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)] } tracks/3/type = "value" tracks/3/imported = false tracks/3/enabled = true -tracks/3/path = NodePath("AnimationPlayer/WinScreen/ColorRect/VBoxContainer/VBoxContainer:modulate") +tracks/3/path = NodePath("AnimationPlayer/WinScreen/ColorRect:visible") tracks/3/interp = 1 tracks/3/loop_wrap = true tracks/3/keys = { -"times": PackedFloat32Array(1.8, 2.5), -"transitions": PackedFloat32Array(1, 1), -"update": 0, -"values": [Color(1, 1, 1, 0), Color(1, 1, 1, 1)] +"times": PackedFloat32Array(1.1), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] } tracks/4/type = "value" tracks/4/imported = false tracks/4/enabled = true -tracks/4/path = NodePath("AnimationPlayer/WinScreen/ColorRect:visible") +tracks/4/path = NodePath("AnimationPlayer/WinScreen/ColorRect:modulate") tracks/4/interp = 1 tracks/4/loop_wrap = true tracks/4/keys = { -"times": PackedFloat32Array(1.1), -"transitions": PackedFloat32Array(1), -"update": 1, -"values": [true] -} -tracks/5/type = "value" -tracks/5/imported = false -tracks/5/enabled = true -tracks/5/path = NodePath("AnimationPlayer/WinScreen/ColorRect:modulate") -tracks/5/interp = 1 -tracks/5/loop_wrap = true -tracks/5/keys = { "times": PackedFloat32Array(1.1, 1.4), "transitions": PackedFloat32Array(1, 1), "update": 0, @@ -320,264 +311,187 @@ font_size = 128 [sub_resource type="RectangleShape2D" id="RectangleShape2D_giaot"] size = Vector2(14, 23) -[sub_resource type="Animation" id="Animation_orjmt"] -resource_name = "clear" -length = 0.25 -tracks/0/type = "audio" -tracks/0/imported = false -tracks/0/enabled = true -tracks/0/path = NodePath("Spikes/SpikesClick") -tracks/0/interp = 1 -tracks/0/loop_wrap = true -tracks/0/keys = { -"clips": [{ -"end_offset": 0.0, -"start_offset": 0.0, -"stream": ExtResource("39_02ti3") -}], -"times": PackedFloat32Array(0) -} -tracks/0/use_blend = true -tracks/1/type = "method" -tracks/1/imported = false -tracks/1/enabled = true -tracks/1/path = NodePath("Spikes/SpikesArea") -tracks/1/interp = 1 -tracks/1/loop_wrap = true -tracks/1/keys = { -"times": PackedFloat32Array(0), -"transitions": PackedFloat32Array(1), -"values": [{ -"args": [], -"method": &"queue_free" -}] -} - -[sub_resource type="AnimationLibrary" id="AnimationLibrary_jktnn"] -_data = { -&"clear": SubResource("Animation_orjmt") -} - -[sub_resource type="RectangleShape2D" id="RectangleShape2D_44b32"] -size = Vector2(15, 15) - [node name="Main" type="Node2D"] - -[node name="Field" type="Node2D" parent="." node_paths=PackedStringArray("opening_cutscene", "focused_game_piece")] scale = Vector2(5, 5) + +[node name="Field" type="Node2D" parent="." node_paths=PackedStringArray("opening_cutscene", "player_default_gamepiece")] script = ExtResource("2_bkxev") opening_cutscene = NodePath("OpeningCutscene") -focused_game_piece = NodePath("Terrain/Gamepieces/Player") -gameboard = ExtResource("6_kd8tv") +player_controller = ExtResource("2_esa52") +player_default_gamepiece = NodePath("Map/Player") -[node name="Terrain" type="TileMap" parent="Field"] +[node name="Map" type="Node2D" parent="Field"] y_sort_enabled = true -tile_set = ExtResource("7_po5fq") -format = 2 -layer_0/name = "Terrain" -layer_0/z_index = -1 -layer_0/tile_data = PackedInt32Array(786450, 458752, 3, 786449, 458752, 3, 786448, 458752, 3, 786447, 458752, 3, 524303, 458752, 3, 589839, 458752, 3, 655375, 458752, 3, 720911, 458752, 3, 720903, 458752, 3, 720904, 458752, 3, 720905, 458752, 3, 720906, 458752, 3, 720907, 458752, 3, 720908, 458752, 3, 720909, 458752, 3, 720910, 458752, 3, 458766, 458752, 3, 458765, 458752, 3, 458764, 458752, 3, 458763, 458752, 3, 458762, 458752, 3, 458761, 458752, 3, 458760, 458752, 3, 524302, 458752, 3, 393230, 458752, 3, 524307, 458752, 3, 524306, 458752, 3, 524305, 458752, 3, 524304, 458752, 3, 458771, 458752, 3, 327688, 458752, 3, 393224, 458752, 3, 589842, 65536, 1, 589841, 65536, 1, 589840, 0, 1, 655376, 0, 2, 720913, 65536, 3, 720914, 131072, 3, 655378, 327680, 3, 655377, 65536, 2, 720912, 0, 3, 589843, 131072, 1, 655379, 131072, 3, 589844, 65536, 0, 524308, 0, 0, 524309, 0, 2, 589845, 0, 3, 655380, 0, 0, 589846, 393216, 3, 655382, 0, 2, 655383, 262144, 3, 589847, 131072, 2, 524311, 131072, 1, 524310, 262144, 3, 458774, 131072, 1, 458773, 0, 1, 655381, 131072, 0, 655384, 131072, 1, 720920, 131072, 2, 786456, 131072, 3, 786455, 0, 3, 720919, 393216, 3, 720918, 0, 3, 589848, 0, 0, 524312, 65536, 0, 458776, 131072, 0, 458775, 0, 0, 393239, 65536, 0, 262180, 0, 0, 196644, 0, 0, 131108, 0, 0, 65572, 0, 0, 36, 0, 0, -65500, 0, 0, -131036, 0, 0, -196572, 0, 0, -262108, 65536, 0, -327644, 0, 0, -393180, 0, 0, -458716, 131072, 0, -524252, 0, 0, 262179, 0, 0, 196643, 0, 0, 131107, 0, 0, 65571, 0, 0, 35, 0, 0, -65501, 0, 0, -131037, 0, 0, -196573, 0, 0, -262109, 0, 0, -327645, 0, 0, -393181, 0, 0, -458717, 0, 0, -524253, 0, 0, 262178, 0, 0, 196642, 0, 0, 131106, 0, 0, 65570, 0, 0, 34, 0, 0, -65502, 0, 0, -131038, 0, 0, -196574, 0, 0, -262110, 0, 0, -327646, 0, 0, -393182, 0, 0, -458718, 0, 0, -524254, 0, 0, 262177, 0, 0, 196641, 0, 0, 131105, 0, 0, 65569, 0, 0, 33, 0, 0, -65503, 0, 0, -131039, 0, 0, -196575, 0, 0, -262111, 0, 0, -327647, 65536, 0, -393183, 65536, 0, -458719, 0, 0, -524255, 0, 0, 262176, 0, 0, 196640, 0, 0, 131104, 0, 0, 65568, 0, 0, 32, 0, 0, -65504, 0, 0, -131040, 0, 0, -196576, 0, 0, -262112, 0, 0, -327648, 0, 0, -393184, 0, 0, -458720, 0, 0, -524256, 0, 0, 262175, 0, 0, 196639, 0, 0, 131103, 0, 0, 65567, 0, 0, 31, 0, 0, -65505, 0, 0, -131041, 0, 0, -196577, 0, 0, -262113, 0, 0, -327649, 0, 0, -393185, 0, 0, -458721, 0, 0, -524257, 131072, 0, 262174, 65536, 0, 196638, 0, 0, 131102, 0, 0, 65566, 0, 0, 30, 0, 0, -65506, 0, 0, -131042, 0, 0, -196578, 0, 0, -262114, 0, 0, -327650, 0, 0, -393186, 0, 0, -458722, 0, 0, -524258, 0, 0, 262173, 0, 0, 196637, 0, 0, 131101, 0, 0, 65565, 0, 0, 29, 0, 0, -65507, 0, 0, -131043, 0, 0, -196579, 0, 0, -262115, 0, 0, -327651, 0, 0, -393187, 0, 0, -458723, 0, 0, -524259, 0, 0, 262172, 0, 0, 196636, 0, 0, 131100, 0, 0, 65564, 0, 0, 28, 0, 0, -65508, 0, 0, -131044, 0, 0, -196580, 0, 0, -262116, 0, 0, -327652, 0, 0, -393188, 0, 0, -458724, 0, 0, -524260, 0, 0, 262171, 0, 0, 196635, 0, 0, 131099, 0, 0, 65563, 0, 0, 27, 0, 0, -65509, 131072, 0, -131045, 0, 0, -196581, 0, 0, -262117, 0, 0, -327653, 0, 0, -393189, 0, 0, -458725, 0, 0, -524261, 131072, 0, 262170, 0, 0, 196634, 0, 0, 131098, 0, 0, 65562, 0, 0, 26, 0, 0, -65510, 0, 0, -131046, 0, 0, -196582, 0, 0, -262118, 0, 0, -327654, 0, 0, -393190, 0, 0, -458726, 0, 0, -524262, 0, 0, 262169, 0, 0, 196633, 0, 0, 131097, 0, 0, 65561, 0, 0, 25, 0, 0, -65511, 0, 0, -131047, 0, 0, -196583, 0, 0, -262119, 0, 0, -327655, 0, 0, -393191, 0, 0, -458727, 0, 0, -524263, 0, 0, 262168, 0, 0, 196632, 0, 0, 131096, 0, 0, 65560, 0, 0, 24, 0, 0, -65512, 65536, 0, -131048, 0, 0, -196584, 0, 0, -262120, 131072, 0, -327656, 0, 0, -393192, 0, 0, -458728, 0, 0, -524264, 0, 0, 262167, 0, 0, 196631, 0, 0, 131095, 0, 0, 65559, 0, 0, 23, 0, 0, -65513, 0, 0, -131049, 0, 0, -196585, 0, 0, -262121, 0, 0, -327657, 0, 0, -393193, 0, 0, -458729, 0, 0, -524265, 0, 0, 262166, 0, 0, 196630, 65536, 0, 131094, 65536, 0, 65558, 65536, 0, 22, 65536, 0, -65514, 0, 0, -131050, 0, 0, -196586, 0, 0, -262122, 0, 0, -327658, 0, 0, -393194, 0, 0, -458730, 0, 0, -524266, 0, 0, 262165, 0, 0, 196629, 0, 0, 131093, 0, 0, 65557, 0, 0, 21, 65536, 0, -65515, 0, 0, -131051, 0, 0, -196587, 0, 0, -262123, 0, 0, -327659, 0, 0, -393195, 0, 0, -458731, 0, 0, -524267, 0, 0, 262164, 0, 0, 196628, 65536, 0, 131092, 65536, 0, 65556, 0, 0, 20, 0, 0, -65516, 65536, 0, -131052, 0, 0, -196588, 0, 0, -262124, 0, 0, -327660, 65536, 0, -393196, 0, 0, -458732, 0, 0, -524268, 0, 0, 262163, 131072, 0, 196627, 0, 0, 131091, 0, 0, 65555, 65536, 0, 19, 131072, 0, -65517, 65536, 0, -131053, 0, 0, -196589, 0, 0, -262125, 0, 0, -327661, 0, 0, -393197, 0, 0, -458733, 0, 0, -524269, 0, 0, 262162, 0, 0, 196626, 0, 0, 131090, 0, 0, 65554, 0, 0, 18, 0, 0, -65518, 65536, 0, -131054, 0, 0, -196590, 0, 0, -262126, 65536, 0, -327662, 0, 0, -393198, 131072, 0, -458734, 0, 0, -524270, 0, 0, 262161, 0, 0, 196625, 0, 0, 131089, 0, 0, 65553, 0, 0, 17, 65536, 0, -65519, 0, 0, -131055, 0, 0, -196591, 0, 0, -262127, 0, 0, -327663, 0, 0, -393199, 0, 0, -458735, 0, 0, -524271, 0, 0, 262160, 0, 0, 196624, 0, 0, 131088, 131072, 0, 65552, 65536, 0, 16, 0, 0, -65520, 65536, 0, -131056, 0, 0, -196592, 0, 0, -262128, 0, 0, -327664, 0, 0, -393200, 0, 0, -458736, 0, 0, -524272, 0, 0, 262159, 0, 0, 196623, 0, 0, 131087, 0, 0, 65551, 0, 0, 15, 65536, 0, -65521, 0, 0, -131057, 0, 0, -196593, 0, 0, -262129, 0, 0, -327665, 65536, 0, -393201, 0, 0, -458737, 0, 0, -524273, 0, 0, 262158, 0, 0, 196622, 0, 0, 131086, 0, 0, 65550, 0, 0, 14, 65536, 0, -65522, 131072, 0, -131058, 0, 0, -196594, 0, 0, -262130, 0, 0, -327666, 0, 0, -393202, 0, 0, -458738, 0, 0, -524274, 0, 0, 262157, 0, 0, 196621, 0, 0, 131085, 0, 0, 65549, 0, 0, 13, 0, 0, -65523, 0, 0, -131059, 0, 0, -196595, 0, 0, -262131, 0, 0, -327667, 0, 0, -393203, 0, 0, -458739, 0, 0, -524275, 0, 0, 262156, 0, 0, 196620, 0, 0, 131084, 0, 0, 65548, 65536, 0, 12, 0, 0, -65524, 0, 0, -131060, 0, 0, -196596, 0, 0, -262132, 0, 0, -327668, 65536, 0, -393204, 0, 0, -458740, 0, 0, -524276, 0, 0, 262155, 0, 0, 196619, 65536, 0, 131083, 0, 0, 65547, 0, 0, 11, 0, 0, -65525, 0, 0, -131061, 0, 0, -196597, 0, 0, -262133, 0, 0, -327669, 0, 0, -393205, 0, 0, -458741, 0, 0, -524277, 0, 0, 262154, 65536, 0, 196618, 65536, 0, 131082, 65536, 0, 65546, 0, 0, 10, 0, 0, -65526, 65536, 0, -131062, 0, 0, -196598, 0, 0, -262134, 65536, 0, -327670, 0, 0, -393206, 0, 0, -458742, 0, 0, -524278, 0, 0, 262153, 0, 0, 196617, 0, 0, 131081, 0, 0, 65545, 0, 0, 9, 0, 0, -65527, 131072, 0, -131063, 0, 0, -196599, 0, 0, -262135, 0, 0, -327671, 0, 0, -393207, 0, 0, -458743, 0, 0, -524279, 0, 0, 262152, 0, 0, 196616, 0, 0, 131080, 0, 0, 65544, 0, 0, 8, 65536, 0, -65528, 0, 0, -131064, 0, 0, -196600, 0, 0, -262136, 0, 0, -327672, 0, 0, -393208, 0, 0, -458744, 0, 0, -524280, 0, 0, 262151, 0, 0, 196615, 0, 0, 131079, 0, 0, 65543, 131072, 0, 7, 0, 0, -65529, 65536, 0, -131065, 0, 0, -196601, 0, 0, -262137, 0, 0, -327673, 0, 0, -393209, 0, 0, -458745, 0, 0, -524281, 0, 0, 262150, 0, 0, 196614, 0, 0, 131078, 0, 0, 65542, 0, 0, 6, 65536, 0, -65530, 65536, 0, -131066, 0, 0, -196602, 0, 0, -262138, 131072, 0, -327674, 0, 0, -393210, 0, 0, -458746, 0, 0, -524282, 0, 0, 262149, 0, 0, 196613, 0, 0, 131077, 0, 0, 65541, 0, 0, 5, 0, 0, -65531, 0, 0, -131067, 0, 0, -196603, 0, 0, -262139, 0, 0, -327675, 0, 0, -393211, 0, 0, -458747, 0, 0, -524283, 0, 0, 262148, 65536, 0, 196612, 0, 0, 131076, 0, 0, 65540, 0, 0, 4, 65536, 0, -65532, 65536, 0, -131068, 0, 0, -196604, 0, 0, -262140, 0, 0, -327676, 0, 0, -393212, 0, 0, -458748, 0, 0, -524284, 0, 0, 262147, 131072, 0, 196611, 65536, 0, 131075, 65536, 0, 65539, 0, 0, 3, 0, 0, -65533, 65536, 0, -131069, 0, 0, -196605, 0, 0, -262141, 0, 0, -327677, 0, 0, -393213, 0, 0, -458749, 0, 0, -524285, 0, 0, 262146, 0, 0, 196610, 65536, 0, 131074, 131072, 0, 65538, 0, 0, 2, 0, 0, -65534, 0, 0, -131070, 0, 0, -196606, 0, 0, -262142, 0, 0, -327678, 0, 0, -393214, 0, 0, -458750, 0, 0, -524286, 0, 0, 262145, 65536, 0, 196609, 0, 0, 131073, 131072, 0, 65537, 65536, 0, 1, 65536, 0, -65535, 0, 0, -131071, 0, 0, -196607, 0, 0, -262143, 0, 0, -327679, 0, 0, -393215, 0, 0, -458751, 0, 0, -524287, 0, 0, 262144, 0, 0, 196608, 65536, 0, 131072, 65536, 0, 65536, 65536, 0, 0, 0, 0, -65536, 131072, 0, -131072, 0, 0, -196608, 0, 0, -262144, 131072, 0, -327680, 0, 0, -393216, 0, 0, -458752, 0, 0, -524288, 0, 0, 327679, 65536, 0, 262143, 65536, 0, 196607, 0, 0, 131071, 0, 0, 65535, 0, 0, -1, 0, 0, -65537, 0, 0, -131073, 0, 0, -196609, 0, 0, -262145, 0, 0, -327681, 0, 0, -393217, 0, 0, -458753, 65536, 0, 327678, 0, 0, 262142, 0, 0, 196606, 0, 0, 131070, 0, 0, 65534, 0, 0, -2, 0, 0, -65538, 0, 0, -131074, 0, 0, -196610, 0, 0, -262146, 0, 0, -327682, 0, 0, -393218, 0, 0, -458754, 0, 0, 327677, 0, 0, 262141, 0, 0, 196605, 0, 0, 131069, 0, 0, 65533, 0, 0, -3, 0, 0, -65539, 0, 0, -131075, 0, 0, -196611, 0, 0, -262147, 0, 0, -327683, 0, 0, -393219, 0, 0, -458755, 0, 0, 327676, 0, 0, 262140, 0, 0, 196604, 0, 0, 131068, 0, 0, 65532, 0, 0, -4, 0, 0, -65540, 0, 0, -131076, 0, 0, -196612, 0, 0, -262148, 0, 0, -327684, 0, 0, -393220, 0, 0, -458756, 0, 0, 327675, 0, 0, 262139, 0, 0, 196603, 0, 0, 131067, 0, 0, 65531, 0, 0, -5, 0, 0, -65541, 0, 0, -131077, 65536, 0, -196613, 0, 0, -262149, 0, 0, -327685, 0, 0, -393221, 0, 0, -458757, 0, 0, 327674, 0, 0, 262138, 0, 0, 196602, 0, 0, 131066, 0, 0, 65530, 0, 0, -6, 0, 0, -65542, 0, 0, -131078, 0, 0, -196614, 0, 0, -262150, 0, 0, -327686, 0, 0, -393222, 0, 0, -458758, 0, 0, 327673, 0, 0, 262137, 0, 0, 196601, 0, 0, 131065, 0, 0, 65529, 0, 0, -7, 0, 0, -65543, 0, 0, -131079, 0, 0, -196615, 0, 0, -262151, 0, 0, -327687, 0, 0, -393223, 0, 0, -458759, 0, 0, 327672, 0, 0, 262136, 131072, 0, 196600, 0, 0, 131064, 0, 0, 65528, 0, 0, -8, 0, 0, -65544, 0, 0, -131080, 0, 0, -196616, 0, 0, -262152, 0, 0, -327688, 0, 0, -393224, 0, 0, -458760, 0, 0, 327671, 65536, 0, 262135, 0, 0, 196599, 0, 0, 131063, 0, 0, 65527, 0, 0, -9, 0, 0, -65545, 0, 0, -131081, 0, 0, -196617, 0, 0, -262153, 0, 0, -327689, 0, 0, -393225, 0, 0, -458761, 0, 0, 327670, 0, 0, 262134, 0, 0, 196598, 0, 0, 131062, 0, 0, 65526, 0, 0, -10, 0, 0, -65546, 0, 0, -131082, 0, 0, -196618, 0, 0, -262154, 0, 0, -327690, 0, 0, -393226, 0, 0, -458762, 0, 0, 327669, 0, 0, 262133, 0, 0, 196597, 0, 0, 131061, 0, 0, 65525, 0, 0, -11, 0, 0, -65547, 0, 0, -131083, 0, 0, -196619, 65536, 0, -262155, 0, 0, -327691, 0, 0, -393227, 0, 0, -458763, 0, 0, 327668, 0, 0, 262132, 0, 0, 196596, 0, 0, 131060, 0, 0, 65524, 0, 0, -12, 0, 0, -65548, 0, 0, -131084, 0, 0, -196620, 0, 0, -262156, 0, 0, -327692, 0, 0, -393228, 0, 0, -458764, 0, 0, 1441828, 0, 0, 1376292, 0, 0, 1310756, 0, 0, 1245220, 0, 0, 1179684, 0, 0, 1114148, 0, 0, 1048612, 0, 0, 983076, 0, 0, 917540, 0, 0, 852004, 0, 0, 1441827, 0, 0, 1376291, 0, 0, 1310755, 0, 0, 1245219, 0, 0, 1179683, 0, 0, 1114147, 0, 0, 1048611, 65536, 0, 983075, 0, 0, 917539, 0, 0, 852003, 0, 0, 1441826, 0, 0, 1376290, 0, 0, 1310754, 0, 0, 1245218, 0, 0, 1179682, 0, 0, 1114146, 0, 0, 1048610, 0, 0, 983074, 0, 0, 917538, 0, 0, 852002, 0, 0, 1441825, 0, 0, 1376289, 0, 0, 1310753, 0, 0, 1245217, 0, 0, 1179681, 0, 0, 1114145, 0, 0, 1048609, 0, 0, 983073, 0, 0, 917537, 0, 0, 852001, 0, 0, 1441824, 0, 0, 1376288, 0, 0, 1310752, 0, 0, 1245216, 0, 0, 1179680, 0, 0, 1114144, 0, 0, 1048608, 0, 0, 983072, 0, 0, 917536, 0, 0, 852000, 0, 0, 1441823, 0, 0, 1376287, 0, 0, 1310751, 0, 0, 1245215, 0, 0, 1179679, 0, 0, 1114143, 0, 0, 1048607, 0, 0, 983071, 0, 0, 917535, 0, 0, 851999, 0, 0, 1441822, 0, 0, 1376286, 0, 0, 1310750, 0, 0, 1245214, 0, 0, 1179678, 0, 0, 1114142, 0, 0, 1048606, 0, 0, 983070, 0, 0, 917534, 0, 0, 851998, 0, 0, 1441821, 0, 0, 1376285, 0, 0, 1310749, 0, 0, 1245213, 0, 0, 1179677, 65536, 0, 1114141, 0, 0, 1048605, 0, 0, 983069, 0, 0, 917533, 0, 0, 851997, 0, 0, 1441820, 0, 0, 1376284, 0, 0, 1310748, 0, 0, 1245212, 0, 0, 1179676, 0, 0, 1114140, 0, 0, 1048604, 0, 0, 983068, 0, 0, 917532, 0, 0, 851996, 0, 0, 1441819, 0, 0, 1376283, 0, 0, 1310747, 0, 0, 1245211, 65536, 0, 1179675, 0, 0, 1114139, 0, 0, 1048603, 0, 0, 983067, 0, 0, 917531, 131072, 0, 851995, 0, 0, 1441818, 0, 0, 1376282, 0, 0, 1310746, 0, 0, 1245210, 0, 0, 1179674, 0, 0, 1114138, 0, 0, 1048602, 0, 0, 983066, 0, 0, 917530, 0, 0, 851994, 0, 0, 1441817, 0, 0, 1376281, 0, 0, 1310745, 0, 0, 1245209, 0, 0, 1179673, 0, 0, 1114137, 0, 0, 1048601, 0, 0, 983065, 0, 0, 917529, 0, 0, 851993, 0, 0, 1441816, 0, 0, 1376280, 0, 0, 1310744, 0, 0, 1245208, 0, 0, 1179672, 131072, 0, 1114136, 0, 0, 1048600, 0, 0, 983064, 0, 0, 917528, 0, 0, 851992, 0, 0, 1441815, 0, 0, 1376279, 0, 0, 1310743, 0, 0, 1245207, 0, 0, 1179671, 0, 0, 1114135, 0, 0, 1048599, 0, 0, 983063, 131072, 0, 917527, 0, 0, 851991, 0, 0, 1441814, 0, 0, 1376278, 0, 0, 1310742, 0, 0, 1114134, 0, 0, 1048598, 0, 0, 983062, 0, 0, 917526, 0, 0, 851990, 0, 0, 1441813, 0, 0, 1376277, 0, 0, 1310741, 131072, 0, 1114133, 0, 0, 1048597, 0, 0, 983061, 0, 0, 917525, 0, 0, 851989, 0, 0, 1441812, 0, 0, 1376276, 0, 0, 1310740, 0, 0, 1245204, 0, 0, 1179668, 0, 0, 1114132, 0, 0, 1048596, 0, 0, 983060, 0, 0, 917524, 0, 0, 851988, 65536, 0, 1441811, 0, 0, 1376275, 0, 0, 1310739, 0, 0, 1245203, 0, 0, 1179667, 0, 0, 1114131, 0, 0, 1048595, 0, 0, 983059, 0, 0, 917523, 0, 0, 851987, 65536, 0, 1441810, 0, 0, 1376274, 0, 0, 1310738, 0, 0, 1245202, 0, 0, 1179666, 0, 0, 1114130, 0, 0, 1048594, 65536, 0, 983058, 0, 0, 917522, 0, 0, 851986, 0, 0, 1441809, 0, 0, 1376273, 0, 0, 1310737, 0, 0, 1245201, 0, 0, 1179665, 0, 0, 1114129, 0, 0, 1048593, 0, 0, 983057, 0, 0, 917521, 0, 0, 851985, 0, 0, 1441808, 131072, 0, 1376272, 0, 0, 1310736, 0, 0, 1245200, 0, 0, 1179664, 0, 0, 1114128, 0, 0, 1048592, 0, 0, 983056, 0, 0, 917520, 0, 0, 851984, 131072, 0, 1441807, 0, 0, 1376271, 131072, 0, 1310735, 0, 0, 1245199, 0, 0, 1179663, 0, 0, 1114127, 0, 0, 1048591, 0, 0, 983055, 0, 0, 917519, 0, 0, 851983, 0, 0, 1441806, 131072, 0, 1376270, 131072, 3, 1310734, 131072, 1, 1245198, 0, 0, 1179662, 0, 0, 1114126, 0, 0, 1048590, 0, 0, 983054, 0, 0, 917518, 0, 0, 851982, 0, 0, 1441805, 65536, 0, 1376269, 0, 3, 1310733, 0, 1, 1245197, 65536, 0, 1179661, 0, 0, 1114125, 65536, 0, 1048589, 131072, 3, 983053, 131072, 2, 917517, 131072, 1, 851981, 0, 0, 1441804, 0, 0, 1376268, 0, 0, 1310732, 0, 0, 1245196, 131072, 3, 1179660, 131072, 1, 1114124, 0, 0, 1048588, 0, 3, 983052, 0, 2, 917516, 0, 1, 851980, 65536, 0, 1441803, 0, 0, 1376267, 0, 0, 1310731, 0, 0, 1245195, 0, 3, 1179659, 0, 1, 1114123, 0, 0, 1048587, 0, 0, 983051, 0, 0, 917515, 65536, 0, 851979, 0, 0, 1441802, 0, 0, 1376266, 0, 0, 1310730, 0, 0, 1245194, 0, 0, 1179658, 0, 0, 1114122, 65536, 0, 1048586, 0, 0, 983050, 0, 0, 917514, 0, 0, 851978, 0, 0, 1441801, 0, 0, 1376265, 0, 0, 1310729, 0, 0, 1245193, 0, 0, 1179657, 0, 0, 1114121, 0, 0, 1048585, 0, 0, 983049, 0, 0, 917513, 0, 0, 851977, 0, 0, 1441800, 0, 0, 1376264, 0, 0, 1310728, 0, 0, 1245192, 0, 0, 1179656, 0, 0, 1114120, 0, 0, 1048584, 0, 0, 983048, 0, 0, 917512, 0, 0, 851976, 0, 0, 1441799, 0, 0, 1376263, 0, 0, 1310727, 0, 0, 1245191, 0, 0, 1179655, 0, 0, 1114119, 0, 0, 1048583, 0, 0, 983047, 131072, 0, 917511, 0, 0, 851975, 0, 0, 1441798, 0, 0, 1376262, 0, 0, 1310726, 0, 0, 1245190, 0, 0, 1179654, 0, 0, 1114118, 0, 0, 1048582, 0, 0, 983046, 0, 0, 917510, 131072, 0, 851974, 0, 0, 1441797, 0, 0, 1376261, 0, 0, 1310725, 0, 0, 1245189, 0, 0, 1179653, 0, 0, 1114117, 0, 0, 1048581, 0, 0, 983045, 0, 0, 917509, 0, 0, 851973, 0, 0, 1441796, 0, 0, 1376260, 0, 0, 1310724, 0, 0, 1245188, 0, 0, 1179652, 0, 0, 1114116, 0, 0, 1048580, 0, 0, 983044, 0, 0, 917508, 0, 0, 851972, 0, 0, 1441795, 0, 0, 1376259, 0, 0, 1310723, 65536, 0, 1245187, 0, 0, 1179651, 0, 0, 1114115, 131072, 0, 1048579, 0, 0, 983043, 0, 0, 917507, 0, 0, 851971, 65536, 0, 1441794, 65536, 0, 1376258, 0, 0, 1310722, 0, 0, 1245186, 0, 0, 1179650, 0, 0, 1114114, 0, 0, 1048578, 0, 0, 983042, 0, 0, 917506, 0, 0, 851970, 0, 0, 1441793, 0, 0, 1376257, 0, 0, 1310721, 0, 0, 1245185, 0, 0, 1179649, 0, 0, 1114113, 0, 0, 1048577, 0, 0, 983041, 0, 0, 917505, 0, 0, 851969, 0, 0, 1441792, 0, 0, 1376256, 131072, 0, 1310720, 0, 0, 1245184, 0, 0, 1179648, 0, 0, 1114112, 65536, 0, 1048576, 65536, 0, 983040, 0, 0, 917504, 0, 0, 851968, 131072, 0, 1507327, 0, 0, 1441791, 0, 0, 1376255, 65536, 0, 1310719, 0, 0, 1245183, 0, 0, 1179647, 0, 0, 1114111, 0, 0, 1048575, 0, 0, 983039, 0, 0, 917503, 0, 0, 1507326, 0, 0, 1441790, 0, 0, 1376254, 0, 0, 1310718, 0, 0, 1245182, 0, 0, 1179646, 0, 0, 1114110, 0, 0, 1048574, 0, 0, 983038, 0, 0, 917502, 0, 0, 1507325, 0, 0, 1441789, 0, 0, 1376253, 0, 0, 1310717, 0, 0, 1245181, 0, 0, 1179645, 0, 0, 1114109, 0, 0, 1048573, 0, 0, 983037, 0, 0, 917501, 0, 0, 1507324, 0, 0, 1441788, 0, 0, 1376252, 0, 0, 1310716, 0, 0, 1245180, 131072, 0, 1179644, 0, 0, 1114108, 0, 0, 1048572, 0, 0, 983036, 0, 0, 917500, 0, 0, 1507323, 0, 0, 1441787, 0, 0, 1376251, 0, 0, 1310715, 0, 0, 1245179, 0, 0, 1179643, 0, 0, 1114107, 0, 0, 1048571, 0, 0, 983035, 0, 0, 917499, 0, 0, 1507322, 0, 0, 1441786, 0, 0, 1376250, 0, 0, 1310714, 0, 0, 1245178, 0, 0, 1179642, 0, 0, 1114106, 0, 0, 1048570, 0, 0, 983034, 0, 0, 917498, 0, 0, 1507321, 0, 0, 1441785, 0, 0, 1376249, 0, 0, 1310713, 0, 0, 1245177, 0, 0, 1179641, 0, 0, 1114105, 0, 0, 1048569, 0, 0, 983033, 0, 0, 917497, 0, 0, 1507320, 0, 0, 1441784, 0, 0, 1376248, 0, 0, 1310712, 0, 0, 1245176, 131072, 0, 1179640, 0, 0, 1114104, 0, 0, 1048568, 0, 0, 983032, 0, 0, 917496, 0, 0, 1507319, 0, 0, 1441783, 0, 0, 1376247, 0, 0, 1310711, 0, 0, 1245175, 65536, 0, 1179639, 0, 0, 1114103, 0, 0, 1048567, 0, 0, 983031, 0, 0, 917495, 0, 0, 1507318, 0, 0, 1441782, 0, 0, 1376246, 0, 0, 1310710, 0, 0, 1245174, 0, 0, 1179638, 0, 0, 1114102, 0, 0, 1048566, 0, 0, 983030, 0, 0, 917494, 0, 0, 1507317, 0, 0, 1441781, 0, 0, 1376245, 0, 0, 1310709, 0, 0, 1245173, 0, 0, 1179637, 0, 0, 1114101, 65536, 0, 1048565, 0, 0, 983029, 0, 0, 917493, 0, 0, 1507316, 0, 0, 1441780, 0, 0, 1376244, 0, 0, 1310708, 0, 0, 1245172, 0, 0, 1179636, 0, 0, 1114100, 0, 0, 1048564, 0, 0, 983028, 0, 0, 917492, 0, 0, 786438, 0, 0, 720902, 0, 0, 655366, 0, 0, 589830, 131072, 0, 524294, 0, 0, 458758, 0, 0, 393222, 0, 0, 327686, 0, 0, 786437, 0, 0, 720901, 65536, 0, 655365, 0, 0, 589829, 0, 0, 524293, 65536, 0, 458757, 65536, 0, 393221, 0, 0, 327685, 0, 0, 786436, 0, 0, 720900, 0, 0, 655364, 65536, 0, 589828, 0, 0, 524292, 0, 0, 458756, 0, 0, 393220, 65536, 0, 327684, 0, 0, 786435, 65536, 0, 720899, 0, 0, 655363, 131072, 0, 589827, 0, 0, 524291, 0, 0, 458755, 0, 0, 393219, 0, 0, 327683, 0, 0, 786434, 0, 0, 720898, 0, 0, 655362, 0, 0, 589826, 0, 0, 524290, 0, 0, 458754, 65536, 0, 393218, 65536, 0, 327682, 65536, 0, 786433, 0, 0, 720897, 0, 0, 655361, 0, 0, 589825, 0, 0, 524289, 0, 0, 458753, 0, 0, 393217, 65536, 0, 327681, 0, 0, 786432, 65536, 0, 720896, 65536, 0, 655360, 0, 0, 589824, 65536, 0, 524288, 0, 0, 458752, 0, 0, 393216, 0, 0, 327680, 0, 0, 851967, 0, 0, 786431, 131072, 0, 720895, 0, 0, 655359, 0, 0, 589823, 0, 0, 524287, 0, 0, 458751, 0, 0, 393215, 0, 0, 851966, 0, 0, 786430, 0, 0, 720894, 0, 0, 655358, 0, 0, 589822, 0, 0, 524286, 0, 0, 458750, 0, 0, 393214, 0, 0, 851965, 0, 0, 786429, 0, 0, 720893, 0, 0, 655357, 0, 0, 589821, 0, 0, 524285, 0, 0, 458749, 0, 0, 393213, 0, 0, 851964, 0, 0, 786428, 0, 0, 720892, 0, 0, 655356, 0, 0, 589820, 0, 0, 524284, 0, 0, 458748, 0, 0, 393212, 0, 0, 851963, 0, 0, 786427, 0, 0, 720891, 0, 0, 655355, 0, 0, 589819, 0, 0, 524283, 0, 0, 458747, 131072, 0, 393211, 131072, 0, 851962, 0, 0, 786426, 0, 0, 720890, 0, 0, 655354, 0, 0, 589818, 0, 0, 524282, 0, 0, 458746, 0, 0, 393210, 0, 0, 851961, 0, 0, 786425, 0, 0, 720889, 0, 0, 655353, 0, 0, 589817, 0, 0, 524281, 0, 0, 458745, 0, 0, 393209, 0, 0, 851960, 0, 0, 786424, 0, 0, 720888, 0, 0, 655352, 131072, 0, 589816, 0, 0, 524280, 0, 0, 458744, 0, 0, 393208, 0, 0, 851959, 0, 0, 786423, 0, 0, 720887, 0, 0, 655351, 0, 0, 589815, 0, 0, 524279, 0, 0, 458743, 0, 0, 393207, 0, 0, 851958, 0, 0, 786422, 0, 0, 720886, 0, 0, 655350, 0, 0, 589814, 0, 0, 524278, 0, 0, 458742, 0, 0, 393206, 0, 0, 851957, 0, 0, 786421, 0, 0, 720885, 0, 0, 655349, 0, 0, 589813, 0, 0, 524277, 0, 0, 458741, 0, 0, 393205, 0, 0, 851956, 0, 0, 786420, 0, 0, 720884, 0, 0, 655348, 0, 0, 589812, 0, 0, 524276, 0, 0, 458740, 0, 0, 393204, 0, 0, 786468, 0, 0, 720932, 0, 0, 655396, 0, 0, 589860, 0, 0, 524324, 65536, 0, 458788, 0, 0, 393252, 0, 0, 327716, 0, 0, 786467, 0, 0, 720931, 0, 0, 655395, 0, 0, 589859, 0, 0, 524323, 0, 0, 458787, 0, 0, 393251, 0, 0, 327715, 0, 0, 786466, 0, 0, 720930, 0, 0, 655394, 0, 0, 589858, 0, 0, 524322, 0, 0, 458786, 0, 0, 393250, 0, 0, 327714, 0, 0, 786465, 0, 0, 720929, 0, 0, 655393, 0, 0, 589857, 0, 0, 524321, 0, 0, 458785, 0, 0, 393249, 0, 0, 327713, 0, 0, 786464, 0, 0, 720928, 0, 0, 655392, 0, 0, 589856, 0, 0, 524320, 0, 0, 458784, 0, 0, 393248, 0, 0, 327712, 0, 0, 786463, 0, 0, 720927, 131072, 0, 655391, 0, 0, 589855, 0, 0, 524319, 0, 0, 458783, 0, 0, 393247, 0, 0, 327711, 0, 0, 786462, 131072, 0, 720926, 0, 0, 655390, 0, 0, 589854, 0, 0, 524318, 0, 0, 458782, 0, 0, 393246, 0, 0, 327710, 0, 0, 786461, 0, 0, 720925, 0, 0, 655389, 0, 0, 589853, 0, 0, 524317, 0, 0, 458781, 0, 0, 393245, 0, 0, 327709, 0, 0, 786460, 0, 0, 720924, 0, 0, 655388, 0, 0, 589852, 0, 0, 524316, 0, 0, 458780, 0, 0, 393244, 0, 0, 327708, 0, 0, 786459, 0, 0, 720923, 131072, 0, 655387, 0, 0, 589851, 0, 0, 524315, 0, 0, 458779, 0, 0, 393243, 0, 0, 327707, 0, 0, 786458, 0, 0, 720922, 0, 0, 655386, 131072, 0, 589850, 0, 0, 524314, 0, 0, 458778, 0, 0, 393242, 0, 0, 327706, 0, 0, 786457, 0, 0, 720921, 0, 0, 655385, 0, 0, 589849, 0, 0, 524313, 0, 0, 458777, 0, 0, 393241, 0, 0, 327705, 0, 0, 786454, 0, 0, 786453, 0, 0, 720917, 0, 0, 720916, 0, 0, 720915, 131072, 0, 786451, 0, 0, 786452, 0, 0, 458772, 0, 0, 393236, 0, 0, 327700, 0, 0, 327701, 65536, 0, 327702, 0, 0, 327703, 0, 0, 327704, 0, 0, 393240, 65536, 0, 393238, 131072, 0, 393237, 0, 0, 393235, 0, 0, 327699, 0, 0, 327698, 0, 0, 327697, 65536, 0, 327696, 0, 0, 327695, 0, 0, 393231, 0, 0, 458767, 0, 0, 458768, 0, 0, 458769, 0, 0, 458770, 0, 0, 393234, 0, 0, 393233, 0, 0, 393232, 131072, 0, 327693, 0, 0, 327694, 0, 0, 327692, 0, 0, 327691, 0, 0, 327690, 0, 0, 327689, 0, 0, 393225, 0, 0, 393226, 0, 0, 393227, 65536, 0, 393228, 0, 0, 393229, 0, 0, 655374, 0, 0, 589838, 0, 0, 589837, 0, 0, 524301, 0, 0, 524300, 0, 0, 524299, 0, 0, 524298, 0, 0, 524297, 0, 0, 524296, 0, 0, 524295, 0, 0, 589831, 0, 0, 655367, 0, 0, 655368, 0, 0, 655369, 0, 0, 655370, 0, 0, 655371, 0, 0, 655372, 0, 0, 655373, 0, 0, 589836, 0, 0, 589835, 0, 0, 589834, 0, 0, 589833, 0, 0, 589832, 0, 0, 458759, 0, 0, 393223, 0, 0, 327687, 0, 0, 786446, 0, 0, 786445, 0, 0, 786444, 0, 0, 786443, 0, 0, 786442, 0, 0, 786441, 0, 0, 786440, 0, 0, 786439, 65536, 0, 1245205, 65536, 0, 1245206, 131072, 0, 1179670, 131072, 0, 1179669, 131072, 0, -65487, 65537, 0, -65486, 131073, 0, -65485, 131073, 0, -65484, 393217, 0, -65483, 131073, 0, -65482, 131073, 0, -65481, 131073, 0, -65480, 393217, 0, -65479, 131073, 0, -65478, 131073, 0, -65477, 131073, 0, -65476, 196609, 0, 60, 196609, 1, 65596, 196609, 1, 131132, 196609, 1, 196668, 196609, 1, 262204, 196609, 1, 327740, 196609, 1, 393276, 196609, 1, 458812, 196609, 1, 524348, 196609, 2, 524347, 131073, 2, 524346, 131073, 2, 524345, 131073, 2, 524344, 131073, 2, 524343, 131073, 2, 524342, 131073, 2, 524341, 131073, 2, 524340, 131073, 2, 524339, 131073, 2, 524338, 131073, 2, 524337, 65537, 2, 458801, 65537, 1, 393265, 65537, 1, 327729, 65537, 1, 262193, 65537, 1, 196657, 65537, 1, 131121, 65537, 1, 65585, 65537, 1, 49, 65537, 1, 327728, 1, 2, -131016, 1, 2, 458813, 1, 1, -131019, 1, 1, 458802, 1, 4, 458803, 1, 4, 458804, 1, 4, 458805, 1, 4, 458806, 1, 4, 458807, 1, 4, 458808, 1, 4, 458809, 1, 4, 458810, 1, 4, 458811, 1, 4, 50, 131073, 1, 65586, 262145, 3, 131122, 1, 4, 196658, 1, 4, 262194, 1, 4, 327730, 1, 4, 393266, 1, 4, 51, 262145, 3, 65587, 589825, 0, 131123, 393217, 3, 196659, 393217, 3, 262195, 393217, 3, 327731, 1, 4, 393267, 1, 4, 52, 393217, 1, 65588, 393217, 1, 131124, 393217, 2, 196660, 1, 4, 262196, 393217, 3, 327732, 1, 4, 393268, 1, 4, 53, 262145, 3, 65589, 262145, 3, 131125, 458753, 2, 196661, 1, 4, 262197, 393217, 3, 327733, 1, 4, 393269, 1, 4, 54, 131073, 1, 65590, 262145, 3, 131126, 458753, 2, 196662, 1, 4, 262198, 393217, 3, 327734, 1, 4, 393270, 1, 4, 55, 262145, 3, 65591, 131073, 1, 131127, 458753, 2, 196663, 1, 4, 262199, 393217, 3, 327735, 1, 4, 393271, 1, 4, 56, 393217, 1, 65592, 393217, 1, 131128, 393217, 2, 196664, 1, 4, 262200, 393217, 3, 327736, 1, 4, 393272, 1, 4, 57, 262145, 3, 65593, 196609, 1, 131129, 262145, 1, 196665, 589825, 4, 262201, 393217, 3, 327737, 1, 4, 393273, 1, 4, 58, 589825, 0, 65594, 1, 0, 131130, 1, 0, 196666, 196609, 3, 262202, 393217, 3, 327738, 1, 4, 393274, 1, 4, 59, 262145, 3, 65595, 1, 0, 131131, 131073, 0, 196667, 131073, 1, 262203, 1, 4, 327739, 1, 4, 393275, 1, 4, 2228283, 0, 0, 2162747, 0, 0, 2097211, 0, 0, 2031675, 0, 0, 1966139, 131072, 0, 1900603, 65536, 0, 1835067, 0, 0, 1769531, 0, 0, 1703995, 0, 0, 1638459, 0, 0, 2228282, 0, 0, 2162746, 0, 0, 2097210, 0, 0, 2031674, 0, 0, 1966138, 65536, 0, 1900602, 65536, 0, 1835066, 65536, 0, 1769530, 0, 0, 1703994, 0, 0, 1638458, 65536, 0, 2228281, 0, 0, 2162745, 0, 0, 2097209, 0, 0, 2031673, 65536, 0, 1966137, 65536, 0, 1900601, 0, 0, 1835065, 0, 0, 1769529, 0, 0, 1703993, 65536, 0, 1638457, 65536, 0, 2228280, 0, 0, 2162744, 0, 0, 2097208, 0, 0, 2031672, 0, 0, 1966136, 65536, 0, 1900600, 65536, 0, 1835064, 65536, 0, 1769528, 65536, 0, 1703992, 0, 0, 1638456, 65536, 0, 2228279, 0, 0, 2162743, 65536, 0, 2097207, 65536, 0, 2031671, 65536, 0, 1966135, 0, 0, 1900599, 65536, 0, 1835063, 65536, 0, 1769527, 0, 0, 1703991, 0, 0, 1638455, 0, 0, 2228278, 65536, 0, 2162742, 65536, 0, 2097206, 65536, 0, 2031670, 65536, 0, 1966134, 0, 0, 1900598, 131072, 0, 1835062, 65536, 0, 1769526, 65536, 0, 1703990, 0, 0, 1638454, 0, 0, 2228277, 65536, 0, 2162741, 65536, 0, 2097205, 131072, 0, 2031669, 0, 0, 1966133, 0, 0, 1900597, 65536, 0, 1835061, 65536, 0, 1769525, 65536, 0, 1703989, 0, 0, 1638453, 0, 0, 2228276, 65536, 0, 2162740, 0, 0, 2097204, 0, 0, 2031668, 65536, 0, 1966132, 0, 0, 1900596, 65536, 0, 1835060, 65536, 0, 1769524, 65536, 0, 1703988, 65536, 0, 1638452, 0, 0, 2228275, 0, 0, 2162739, 65536, 0, 2097203, 0, 0, 2031667, 65536, 0, 1966131, 0, 0, 1900595, 65536, 0, 1835059, 0, 0, 1769523, 131072, 0, 1703987, 0, 0, 1638451, 0, 0, 2228274, 65536, 0, 2162738, 65536, 0, 2097202, 0, 0, 2031666, 0, 0, 1966130, 0, 0, 1900594, 65536, 0, 1835058, 65536, 0, 1769522, 0, 0, 1703986, 0, 0, 1638450, 0, 0, 2228273, 0, 0, 2162737, 0, 0, 2097201, 65536, 0, 2031665, 0, 0, 1966129, 0, 0, 1900593, 0, 0, 1835057, 0, 0, 1769521, 65536, 0, 1703985, 65536, 0, 1638449, 0, 0, 2228272, 0, 0, 2162736, 131072, 0, 2097200, 131072, 3, 2031664, 131072, 2, 1966128, 131072, 1, 1900592, 65536, 0, 1835056, 0, 0, 1769520, 0, 0, 1703984, 0, 0, 1638448, 0, 0, 2228271, 65536, 0, 2162735, 131072, 3, 2097199, 327680, 3, 2031663, 196608, 3, 1966127, 0, 1, 1900591, 0, 0, 1835055, 0, 0, 1769519, 131072, 0, 1703983, 65536, 0, 1638447, 0, 0, 2228270, 65536, 0, 2162734, 0, 3, 2097198, 393216, 3, 2031662, 65536, 1, 1966126, 0, 0, 1900590, 0, 0, 1835054, 0, 0, 1769518, 0, 0, 1703982, 0, 0, 1638446, 0, 0, 2228269, 0, 0, 2162733, 65536, 0, 2097197, 0, 3, 2031661, 0, 1, 1966125, 0, 0, 1900589, 0, 0, 1835053, 0, 0, 1769517, 0, 0, 1703981, 131072, 0, 1638445, 65536, 0, 2228268, 0, 0, 2162732, 65536, 0, 2097196, 65536, 0, 2031660, 0, 0, 1966124, 65536, 0, 1900588, 65536, 0, 1835052, 65536, 0, 1769516, 0, 0, 1703980, 0, 0, 1638444, 131072, 0, 2228267, 0, 0, 2162731, 0, 0, 2097195, 65536, 0, 2031659, 65536, 0, 1966123, 0, 0, 1900587, 65536, 0, 1835051, 65536, 0, 1769515, 0, 0, 1703979, 131072, 0, 1638443, 131072, 0, 2228266, 0, 0, 2162730, 0, 0, 2097194, 0, 0, 2031658, 0, 0, 1966122, 0, 0, 1900586, 0, 0, 1835050, 65536, 0, 1769514, 65536, 0, 1703978, 0, 0, 1638442, 0, 0, 2228265, 0, 0, 2162729, 0, 0, 2097193, 0, 0, 2031657, 0, 0, 1966121, 0, 0, 1900585, 131072, 0, 1835049, 0, 0, 1769513, 0, 0, 1703977, 0, 0, 1638441, 0, 0, 2228264, 0, 0, 2162728, 0, 0, 2097192, 131072, 0, 2031656, 0, 0, 1966120, 65536, 0, 1900584, 0, 0, 1835048, 0, 0, 1769512, 0, 0, 1703976, 0, 0, 1638440, 0, 0, 2228263, 65536, 0, 2162727, 65536, 0, 2097191, 65536, 0, 2031655, 0, 0, 1966119, 0, 0, 1900583, 65536, 0, 1835047, 65536, 0, 1769511, 0, 0, 1703975, 0, 0, 1638439, 0, 0, 2228262, 65536, 0, 2162726, 65536, 0, 2097190, 65536, 0, 2031654, 0, 0, 1966118, 0, 0, 1900582, 65536, 0, 1835046, 0, 0, 1769510, 65536, 0, 1703974, 0, 0, 1638438, 0, 0, 2228261, 65536, 0, 2162725, 65536, 0, 2097189, 65536, 0, 2031653, 0, 0, 1966117, 0, 0, 1900581, 0, 0, 1835045, 0, 0, 1769509, 0, 0, 1703973, 0, 0, 1638437, 0, 0, 1572886, 131072, 0, 1507350, 0, 0, 1572885, 0, 0, 1507349, 65536, 0, 1572884, 0, 0, 1507348, 0, 0, 1572883, 0, 0, 1507347, 0, 0, 1572882, 0, 0, 1507346, 0, 0, 1572881, 0, 0, 1507345, 65536, 0, 1572880, 65536, 0, 1507344, 65536, 0, 1572879, 65536, 0, 1507343, 0, 0, 1572878, 131072, 0, 1507342, 0, 0, 1572877, 65536, 0, 1507341, 65536, 0, 1572876, 0, 0, 1507340, 0, 0, 1572875, 0, 0, 1507339, 0, 0, 1572874, 0, 0, 1507338, 0, 0, 1572873, 0, 0, 1507337, 0, 0, 1572872, 0, 0, 1507336, 0, 0, 1572871, 0, 0, 1507335, 0, 0, 1572870, 0, 0, 1507334, 0, 0, 1572869, 0, 0, 1507333, 0, 0, 1572868, 0, 0, 1507332, 0, 0, 1572867, 0, 0, 1507331, 0, 0, 1572866, 0, 0, 1507330, 0, 0, 1572865, 0, 0, 1507329, 0, 0, 1572864, 0, 0, 1507328, 0, 0, 1638399, 0, 0, 1572863, 0, 0, 1638398, 0, 0, 1572862, 0, 0, 1638397, 0, 0, 1572861, 0, 0, 1638396, 0, 0, 1572860, 0, 0, 1638395, 0, 0, 1572859, 0, 0, 1638394, 0, 0, 1572858, 65536, 0, 1638393, 0, 0, 1572857, 0, 0, 1638392, 0, 0, 1572856, 0, 0, 1638391, 0, 0, 1572855, 0, 0, 1638390, 0, 0, 1572854, 0, 0, 1638389, 0, 0, 1572853, 0, 0, 1638388, 0, 0, 1572852, 0, 0, 2752548, 0, 0, 2687012, 0, 0, 2621476, 0, 0, 2555940, 0, 0, 2490404, 0, 0, 2424868, 0, 0, 2359332, 0, 0, 2293796, 0, 0, 2228260, 0, 0, 2162724, 0, 0, 2097188, 0, 0, 2031652, 0, 0, 1966116, 65536, 0, 1900580, 0, 0, 1835044, 0, 0, 1769508, 0, 0, 1703972, 0, 0, 1638436, 0, 0, 1572900, 0, 0, 1507364, 0, 0, 2752547, 0, 0, 2687011, 0, 0, 2621475, 0, 0, 2555939, 0, 0, 2490403, 0, 0, 2424867, 0, 0, 2359331, 0, 0, 2293795, 0, 0, 2228259, 0, 0, 2162723, 0, 0, 2097187, 0, 0, 2031651, 0, 0, 1966115, 0, 0, 1900579, 0, 0, 1835043, 0, 0, 1769507, 0, 0, 1703971, 65536, 0, 1638435, 0, 0, 1572899, 0, 0, 1507363, 0, 0, 2752546, 0, 0, 2687010, 0, 0, 2621474, 0, 0, 2555938, 0, 0, 2490402, 0, 0, 2424866, 0, 0, 2359330, 0, 0, 2293794, 0, 0, 2228258, 0, 0, 2162722, 0, 0, 2097186, 0, 0, 2031650, 0, 0, 1966114, 0, 0, 1900578, 0, 0, 1835042, 0, 0, 1769506, 0, 0, 1703970, 0, 0, 1638434, 0, 0, 1572898, 0, 0, 1507362, 0, 0, 2752545, 0, 0, 2687009, 0, 0, 2621473, 0, 0, 2555937, 0, 0, 2490401, 0, 0, 2424865, 0, 0, 2359329, 0, 0, 2293793, 0, 0, 2228257, 65536, 0, 2162721, 0, 0, 2097185, 0, 0, 2031649, 0, 0, 1966113, 0, 0, 1900577, 0, 0, 1835041, 0, 0, 1769505, 0, 0, 1703969, 131072, 0, 1638433, 0, 0, 1572897, 0, 0, 1507361, 0, 0, 2752544, 0, 0, 2687008, 65536, 0, 2621472, 0, 0, 2555936, 0, 0, 2490400, 0, 0, 2424864, 0, 0, 2359328, 0, 0, 2293792, 0, 0, 2228256, 0, 0, 2162720, 0, 0, 2097184, 0, 0, 2031648, 0, 0, 1966112, 0, 0, 1900576, 0, 0, 1835040, 0, 0, 1769504, 0, 0, 1703968, 0, 0, 1638432, 0, 0, 1572896, 0, 0, 1507360, 0, 0, 2752543, 0, 0, 2687007, 0, 0, 2621471, 0, 0, 2555935, 0, 0, 2490399, 0, 0, 2424863, 0, 0, 2359327, 0, 0, 2293791, 0, 0, 2228255, 0, 0, 2162719, 0, 0, 2097183, 0, 0, 2031647, 0, 0, 1966111, 0, 0, 1900575, 0, 0, 1835039, 0, 0, 1769503, 0, 0, 1703967, 0, 0, 1638431, 0, 0, 1572895, 0, 0, 1507359, 0, 0, 2752542, 0, 0, 2687006, 131072, 0, 2621470, 131072, 0, 2555934, 0, 0, 2490398, 0, 0, 2424862, 0, 0, 2359326, 0, 0, 2293790, 131072, 0, 2228254, 0, 0, 2162718, 0, 0, 2097182, 0, 0, 2031646, 131072, 0, 1966110, 0, 0, 1900574, 0, 0, 1835038, 0, 0, 1769502, 0, 0, 1703966, 0, 0, 1638430, 0, 0, 1572894, 0, 0, 1507358, 0, 0, 2752541, 0, 0, 2687005, 0, 0, 2621469, 0, 0, 2555933, 0, 0, 2490397, 0, 0, 2424861, 0, 0, 2359325, 131072, 0, 2293789, 0, 0, 2228253, 0, 0, 2162717, 0, 0, 2097181, 0, 0, 2031645, 0, 0, 1966109, 0, 0, 1900573, 0, 0, 1835037, 0, 0, 1769501, 0, 0, 1703965, 0, 0, 1638429, 0, 0, 1572893, 0, 0, 1507357, 0, 0, 2752540, 0, 0, 2687004, 0, 0, 2621468, 131072, 0, 2555932, 0, 0, 2490396, 0, 0, 2424860, 0, 0, 2359324, 0, 0, 2293788, 131072, 0, 2228252, 0, 0, 2162716, 0, 0, 2097180, 65536, 0, 2031644, 0, 0, 1966108, 0, 0, 1900572, 0, 0, 1835036, 0, 0, 1769500, 0, 0, 1703964, 0, 0, 1638428, 0, 0, 1572892, 0, 0, 1507356, 0, 0, 2752539, 0, 0, 2687003, 0, 0, 2621467, 131072, 0, 2555931, 0, 0, 2490395, 0, 0, 2424859, 0, 0, 2359323, 0, 0, 2293787, 0, 0, 2228251, 0, 0, 2162715, 0, 0, 2097179, 0, 0, 2031643, 0, 0, 1966107, 0, 0, 1900571, 0, 0, 1835035, 0, 0, 1769499, 0, 0, 1703963, 0, 0, 1638427, 0, 0, 1572891, 0, 0, 1507355, 0, 0, 2752538, 0, 0, 2687002, 0, 0, 2621466, 0, 0, 2555930, 0, 0, 2490394, 0, 0, 2424858, 0, 0, 2359322, 0, 0, 2293786, 0, 0, 2228250, 0, 0, 2162714, 0, 0, 2097178, 0, 0, 2031642, 0, 0, 1966106, 0, 0, 1900570, 0, 0, 1835034, 0, 0, 1769498, 0, 0, 1703962, 0, 0, 1638426, 0, 0, 1572890, 0, 0, 1507354, 0, 0, 2752537, 65536, 0, 2687001, 0, 0, 2621465, 0, 0, 2555929, 0, 0, 2490393, 0, 0, 2424857, 0, 0, 2359321, 0, 0, 2293785, 0, 0, 2228249, 0, 0, 2162713, 0, 0, 2097177, 0, 0, 2031641, 0, 0, 1966105, 0, 0, 1900569, 0, 0, 1835033, 0, 0, 1769497, 0, 0, 1703961, 0, 0, 1638425, 0, 0, 1572889, 0, 0, 1507353, 0, 0, 2752536, 0, 0, 2687000, 0, 0, 2621464, 0, 0, 2555928, 0, 0, 2490392, 0, 0, 2424856, 65536, 0, 2359320, 0, 0, 2293784, 131072, 0, 2228248, 0, 0, 2162712, 0, 0, 2097176, 0, 0, 2031640, 0, 0, 1966104, 65536, 0, 1900568, 0, 0, 1835032, 0, 0, 1769496, 0, 0, 1703960, 0, 0, 1638424, 0, 0, 1572888, 0, 0, 1507352, 0, 0, 2752535, 0, 0, 2686999, 0, 0, 2621463, 0, 0, 2555927, 0, 0, 2490391, 0, 0, 2424855, 0, 0, 2359319, 0, 0, 2293783, 0, 0, 2228247, 131072, 0, 2162711, 0, 0, 2097175, 0, 0, 2031639, 0, 0, 1966103, 0, 0, 1900567, 65536, 0, 1835031, 65536, 0, 1769495, 0, 0, 1703959, 0, 0, 1638423, 0, 0, 1572887, 0, 0, 1507351, 0, 0, 2752583, 0, 0, 2687047, 0, 0, 2621511, 0, 0, 2555975, 0, 0, 2490439, 0, 0, 2424903, 131072, 0, 2359367, 0, 0, 2293831, 0, 0, 2228295, 131072, 0, 2162759, 0, 0, 2097223, 0, 0, 2031687, 0, 0, 1966151, 0, 0, 1900615, 0, 0, 1835079, 0, 0, 1769543, 0, 0, 1704007, 0, 0, 1638471, 0, 0, 1572935, 0, 0, 1507399, 0, 0, 1441863, 0, 0, 1376327, 131072, 0, 1310791, 0, 0, 1245255, 0, 0, 1179719, 0, 0, 1114183, 0, 0, 2752582, 0, 0, 2687046, 0, 0, 2621510, 0, 0, 2555974, 0, 0, 2490438, 0, 0, 2424902, 0, 0, 2359366, 0, 0, 2293830, 0, 0, 2228294, 0, 0, 2162758, 0, 0, 2097222, 0, 0, 2031686, 0, 0, 1966150, 0, 0, 1900614, 0, 0, 1835078, 0, 0, 1769542, 0, 0, 1704006, 0, 0, 1638470, 0, 0, 1572934, 65536, 0, 1507398, 0, 0, 1441862, 0, 0, 1376326, 0, 0, 1310790, 0, 0, 1245254, 0, 0, 1179718, 0, 0, 1114182, 0, 0, 2752581, 0, 0, 2687045, 65536, 0, 2621509, 0, 0, 2555973, 0, 0, 2490437, 131072, 0, 2424901, 0, 0, 2359365, 131072, 0, 2293829, 0, 0, 2228293, 0, 0, 2162757, 0, 0, 2097221, 0, 0, 2031685, 0, 0, 1966149, 131072, 0, 1900613, 0, 0, 1835077, 0, 0, 1769541, 0, 0, 1704005, 0, 0, 1638469, 0, 0, 1572933, 0, 0, 1507397, 0, 0, 1441861, 0, 0, 1376325, 0, 0, 1310789, 0, 0, 1245253, 0, 0, 1179717, 0, 0, 1114181, 0, 0, 2752580, 0, 0, 2687044, 0, 0, 2621508, 0, 0, 2555972, 0, 0, 2490436, 0, 0, 2424900, 0, 0, 2359364, 0, 0, 2293828, 0, 0, 2228292, 0, 0, 2162756, 0, 0, 2097220, 0, 0, 2031684, 0, 0, 1966148, 0, 0, 1900612, 0, 0, 1835076, 0, 0, 1769540, 0, 0, 1704004, 0, 0, 1638468, 0, 0, 1572932, 0, 0, 1507396, 131072, 3, 1441860, 131072, 1, 1376324, 0, 0, 1310788, 0, 0, 1245252, 0, 0, 1179716, 0, 0, 1114180, 0, 0, 2752579, 0, 0, 2687043, 0, 0, 2621507, 0, 0, 2555971, 0, 0, 2490435, 0, 0, 2424899, 0, 0, 2359363, 0, 0, 2293827, 0, 0, 2228291, 0, 0, 2162755, 0, 0, 2097219, 0, 0, 2031683, 0, 0, 1966147, 0, 0, 1900611, 131072, 0, 1835075, 0, 0, 1769539, 0, 0, 1704003, 0, 0, 1638467, 0, 0, 1572931, 0, 0, 1507395, 65536, 3, 1441859, 65536, 1, 1376323, 0, 0, 1310787, 0, 0, 1245251, 0, 0, 1179715, 0, 0, 1114179, 0, 0, 2752578, 0, 0, 2687042, 0, 0, 2621506, 0, 0, 2555970, 0, 0, 2490434, 0, 0, 2424898, 0, 0, 2359362, 0, 0, 2293826, 0, 0, 2228290, 0, 0, 2162754, 0, 0, 2097218, 0, 0, 2031682, 0, 0, 1966146, 0, 0, 1900610, 0, 0, 1835074, 0, 0, 1769538, 0, 0, 1704002, 0, 0, 1638466, 0, 0, 1572930, 0, 0, 1507394, 0, 3, 1441858, 0, 1, 1376322, 0, 0, 1310786, 0, 0, 1245250, 0, 0, 1179714, 0, 0, 1114178, 0, 0, 2752577, 131072, 0, 2687041, 65536, 0, 2621505, 0, 0, 2555969, 0, 0, 2490433, 0, 0, 2424897, 0, 0, 2359361, 0, 0, 2293825, 0, 0, 2228289, 0, 0, 2162753, 0, 0, 2097217, 0, 0, 2031681, 0, 0, 1966145, 131072, 0, 1900609, 0, 0, 1835073, 0, 0, 1769537, 0, 0, 1704001, 0, 0, 1638465, 0, 0, 1572929, 0, 0, 1507393, 0, 0, 1441857, 0, 0, 1376321, 0, 0, 1310785, 0, 0, 1245249, 0, 0, 1179713, 0, 0, 1114177, 0, 0, 2752576, 0, 0, 2687040, 0, 0, 2621504, 0, 0, 2555968, 0, 0, 2490432, 0, 0, 2424896, 0, 0, 2359360, 0, 0, 2293824, 0, 0, 2228288, 0, 0, 2162752, 65536, 0, 2097216, 0, 0, 2031680, 0, 0, 1966144, 0, 0, 1900608, 0, 0, 1835072, 0, 0, 1769536, 0, 0, 1704000, 0, 0, 1638464, 0, 0, 1572928, 0, 0, 1507392, 0, 0, 1441856, 131072, 0, 1376320, 0, 0, 1310784, 0, 0, 1245248, 0, 0, 1179712, 0, 0, 1114176, 0, 0, 2752575, 0, 0, 2687039, 0, 0, 2621503, 0, 0, 2555967, 0, 0, 2490431, 0, 0, 2424895, 0, 0, 2359359, 0, 0, 2293823, 0, 0, 2228287, 0, 0, 2162751, 0, 0, 2097215, 0, 0, 2031679, 0, 0, 1966143, 0, 0, 1900607, 0, 0, 1835071, 0, 0, 1769535, 0, 0, 1703999, 0, 0, 1638463, 0, 0, 1572927, 0, 0, 1507391, 0, 0, 1441855, 0, 0, 1376319, 0, 0, 1310783, 0, 0, 1245247, 0, 0, 1179711, 0, 0, 1114175, 65536, 0, 2752574, 0, 0, 2687038, 0, 0, 2621502, 0, 0, 2555966, 0, 0, 2490430, 0, 0, 2424894, 0, 0, 2359358, 0, 0, 2293822, 0, 0, 2228286, 65536, 0, 2162750, 0, 0, 2097214, 0, 0, 2031678, 0, 0, 1966142, 0, 0, 1900606, 0, 0, 1835070, 0, 0, 1769534, 0, 0, 1703998, 0, 0, 1638462, 0, 0, 1572926, 0, 0, 1507390, 0, 0, 1441854, 0, 0, 1376318, 0, 0, 1310782, 0, 0, 1245246, 131072, 0, 1179710, 0, 0, 1114174, 0, 0, 2752573, 0, 0, 2687037, 0, 0, 2621501, 0, 0, 2555965, 0, 0, 2490429, 0, 0, 2424893, 0, 0, 2359357, 0, 0, 2293821, 0, 0, 2228285, 0, 0, 2162749, 0, 0, 2097213, 0, 0, 2031677, 0, 0, 1966141, 0, 0, 1900605, 0, 0, 1835069, 0, 0, 1769533, 0, 0, 1703997, 0, 0, 1638461, 0, 0, 1572925, 0, 0, 1507389, 0, 0, 1441853, 0, 0, 1376317, 0, 0, 1310781, 0, 0, 1245245, 0, 0, 1179709, 0, 0, 1114173, 0, 0, 2752572, 0, 0, 2687036, 0, 0, 2621500, 131072, 0, 2555964, 0, 0, 2490428, 0, 0, 2424892, 0, 0, 2359356, 0, 0, 2293820, 0, 0, 2228284, 0, 0, 2162748, 0, 0, 2097212, 65536, 0, 2031676, 65536, 0, 1966140, 65536, 0, 1900604, 65536, 0, 1835068, 0, 0, 1769532, 0, 0, 1703996, 0, 0, 1638460, 0, 0, 1572924, 0, 0, 1507388, 0, 0, 1441852, 0, 0, 1376316, 0, 0, 1310780, 0, 0, 1245244, 0, 0, 1179708, 0, 0, 1114172, 65536, 0, 2752571, 131072, 0, 2687035, 0, 0, 2621499, 0, 0, 2555963, 0, 0, 2490427, 0, 0, 2424891, 0, 0, 2359355, 0, 0, 2293819, 0, 0, 1572923, 0, 0, 1507387, 0, 0, 1441851, 0, 0, 1376315, 0, 0, 1310779, 65536, 0, 1245243, 0, 0, 1179707, 0, 0, 1114171, 0, 0, 2752570, 0, 0, 2687034, 0, 0, 2621498, 0, 0, 2555962, 0, 0, 2490426, 0, 0, 2424890, 0, 0, 2359354, 0, 0, 2293818, 0, 0, 1572922, 0, 0, 1507386, 0, 0, 1441850, 0, 0, 1376314, 0, 0, 1310778, 0, 0, 1245242, 0, 0, 1179706, 0, 0, 1114170, 0, 0, 2752569, 0, 0, 2687033, 0, 0, 2621497, 0, 0, 2555961, 0, 0, 2490425, 0, 0, 2424889, 0, 0, 2359353, 0, 0, 2293817, 0, 0, 1572921, 0, 0, 1507385, 0, 0, 1441849, 0, 0, 1376313, 0, 0, 1310777, 0, 0, 1245241, 0, 0, 1179705, 0, 0, 1114169, 131072, 0, 2752568, 0, 0, 2687032, 0, 0, 2621496, 0, 0, 2555960, 0, 0, 2490424, 0, 0, 2424888, 0, 0, 2359352, 0, 0, 2293816, 65536, 0, 1572920, 65536, 0, 1507384, 0, 0, 1441848, 65536, 0, 1376312, 0, 0, 1310776, 0, 0, 1245240, 0, 0, 1179704, 0, 0, 1114168, 0, 0, 2752567, 0, 0, 2687031, 0, 0, 2621495, 0, 0, 2555959, 131072, 0, 2490423, 0, 0, 2424887, 0, 0, 2359351, 65536, 0, 2293815, 0, 0, 1572919, 0, 0, 1507383, 0, 0, 1441847, 0, 0, 1376311, 0, 0, 1310775, 0, 0, 1245239, 0, 0, 1179703, 0, 0, 1114167, 0, 0, 2752566, 0, 0, 2687030, 0, 0, 2621494, 0, 0, 2555958, 0, 0, 2490422, 0, 0, 2424886, 0, 0, 2359350, 0, 0, 2293814, 0, 0, 1572918, 0, 0, 1507382, 0, 0, 1441846, 0, 0, 1376310, 0, 0, 1310774, 0, 0, 1245238, 0, 0, 1179702, 0, 0, 1114166, 0, 0, 2752565, 0, 0, 2687029, 0, 0, 2621493, 0, 0, 2555957, 0, 0, 2490421, 0, 0, 2424885, 0, 0, 2359349, 0, 0, 2293813, 0, 0, 1572917, 0, 0, 1507381, 0, 0, 1441845, 0, 0, 1376309, 0, 0, 1310773, 0, 0, 1245237, 0, 0, 1179701, 0, 0, 1114165, 131072, 0, 2752564, 0, 0, 2687028, 0, 0, 2621492, 0, 0, 2555956, 0, 0, 2490420, 0, 0, 2424884, 0, 0, 2359348, 0, 0, 2293812, 0, 0, 1572916, 65536, 0, 1507380, 0, 0, 1441844, 0, 0, 1376308, 0, 0, 1310772, 0, 0, 1245236, 0, 0, 1179700, 0, 0, 1114164, 0, 0, 2752563, 0, 0, 2687027, 0, 0, 2621491, 0, 0, 2555955, 0, 0, 2490419, 0, 0, 2424883, 0, 0, 2359347, 0, 0, 2293811, 131072, 0, 1572915, 0, 0, 1507379, 0, 0, 1441843, 0, 0, 1376307, 0, 0, 1310771, 0, 0, 1245235, 0, 0, 1179699, 65536, 0, 1114163, 0, 0, 2752562, 0, 0, 2687026, 0, 0, 2621490, 0, 0, 2555954, 0, 0, 2490418, 0, 0, 2424882, 0, 0, 2359346, 0, 0, 2293810, 0, 0, 1572914, 0, 0, 1507378, 0, 0, 1441842, 0, 0, 1376306, 0, 0, 1310770, 0, 0, 1245234, 0, 0, 1179698, 0, 0, 1114162, 0, 0, 2752561, 0, 0, 2687025, 0, 0, 2621489, 0, 0, 2555953, 0, 0, 2490417, 0, 0, 2424881, 0, 0, 2359345, 0, 0, 2293809, 0, 0, 1572913, 131072, 0, 1507377, 0, 0, 1441841, 0, 0, 1376305, 0, 0, 1310769, 0, 0, 1245233, 0, 0, 1179697, 0, 0, 1114161, 0, 0, 2752560, 0, 0, 2687024, 0, 0, 2621488, 0, 0, 2555952, 0, 0, 2490416, 0, 0, 2424880, 0, 0, 2359344, 0, 0, 2293808, 0, 0, 1572912, 0, 0, 1507376, 0, 0, 1441840, 0, 0, 1376304, 0, 0, 1310768, 0, 0, 1245232, 0, 0, 1179696, 0, 0, 1114160, 0, 0, 2752559, 0, 0, 2687023, 0, 0, 2621487, 0, 0, 2555951, 0, 0, 2490415, 0, 0, 2424879, 0, 0, 2359343, 0, 0, 2293807, 0, 0, 1572911, 0, 0, 1507375, 0, 0, 1441839, 0, 0, 1376303, 0, 0, 1310767, 0, 0, 1245231, 0, 0, 1179695, 65536, 0, 1114159, 0, 0, 2752558, 0, 0, 2687022, 131072, 0, 2621486, 65536, 0, 2555950, 0, 0, 2490414, 0, 0, 2424878, 0, 0, 2359342, 0, 0, 2293806, 0, 0, 1572910, 0, 0, 1507374, 0, 0, 1441838, 0, 0, 1376302, 0, 0, 1310766, 0, 0, 1245230, 0, 0, 1179694, 0, 0, 1114158, 0, 0, 2752557, 0, 0, 2687021, 0, 0, 2621485, 0, 0, 2555949, 0, 0, 2490413, 0, 0, 2424877, 0, 0, 2359341, 0, 0, 2293805, 0, 0, 1572909, 0, 0, 1507373, 0, 0, 1441837, 0, 0, 1376301, 0, 0, 1310765, 0, 0, 1245229, 0, 0, 1179693, 0, 0, 1114157, 0, 0, 2752556, 0, 0, 2687020, 0, 0, 2621484, 0, 0, 2555948, 0, 0, 2490412, 0, 0, 2424876, 0, 0, 2359340, 0, 0, 2293804, 0, 0, 1572908, 65536, 0, 1507372, 0, 0, 1441836, 0, 0, 1376300, 0, 0, 1310764, 0, 0, 1245228, 0, 0, 1179692, 0, 0, 1114156, 0, 0, 2752555, 0, 0, 2687019, 0, 0, 2621483, 131072, 0, 2555947, 0, 0, 2490411, 0, 0, 2424875, 0, 0, 2359339, 0, 0, 2293803, 0, 0, 1572907, 65536, 0, 1507371, 0, 0, 1441835, 0, 0, 1376299, 0, 0, 1310763, 0, 0, 1245227, 0, 0, 1179691, 0, 0, 1114155, 0, 0, 2752554, 65536, 0, 2687018, 0, 0, 2621482, 0, 0, 2555946, 0, 0, 2490410, 0, 0, 2424874, 65536, 0, 2359338, 0, 0, 2293802, 0, 0, 1572906, 0, 0, 1507370, 0, 0, 1441834, 0, 0, 1376298, 0, 0, 1310762, 0, 0, 1245226, 0, 0, 1179690, 0, 0, 1114154, 131072, 0, 2752553, 131072, 0, 2687017, 0, 0, 2621481, 0, 0, 2555945, 0, 0, 2490409, 0, 0, 2424873, 0, 0, 2359337, 0, 0, 2293801, 0, 0, 1572905, 0, 0, 1507369, 0, 0, 1441833, 0, 0, 1376297, 0, 0, 1310761, 65536, 0, 1245225, 0, 0, 1179689, 0, 0, 1114153, 0, 0, 2752552, 0, 0, 2687016, 0, 0, 2621480, 0, 0, 2555944, 0, 0, 2490408, 0, 0, 2424872, 0, 0, 2359336, 0, 0, 2293800, 0, 0, 1572904, 0, 0, 1507368, 0, 0, 1441832, 0, 0, 1376296, 0, 0, 1310760, 0, 0, 1245224, 0, 0, 1179688, 0, 0, 1114152, 65536, 0, 2752551, 0, 0, 2687015, 0, 0, 2621479, 0, 0, 2555943, 0, 0, 2490407, 0, 0, 2424871, 0, 0, 2359335, 0, 0, 2293799, 0, 0, 1572903, 131072, 0, 1507367, 0, 0, 1441831, 65536, 0, 1376295, 0, 0, 1310759, 131072, 0, 1245223, 0, 0, 1179687, 65536, 0, 1114151, 65536, 0, 2752550, 65536, 0, 2687014, 0, 0, 2621478, 0, 0, 2555942, 0, 0, 2490406, 0, 0, 2424870, 0, 0, 2359334, 0, 0, 2293798, 0, 0, 1572902, 0, 0, 1507366, 0, 0, 1441830, 65536, 0, 1376294, 0, 0, 1310758, 0, 0, 1245222, 131072, 0, 1179686, 0, 0, 1114150, 0, 0, 2752549, 0, 0, 2687013, 0, 0, 2621477, 0, 0, 2555941, 0, 0, 2490405, 0, 0, 2424869, 0, 0, 2359333, 0, 0, 2293797, 0, 0, 1572901, 0, 0, 1507365, 0, 0, 1441829, 0, 0, 1376293, 65536, 0, 1310757, 65536, 0, 1245221, 0, 0, 1179685, 0, 0, 1114149, 0, 0) -layer_1/name = "Obstacles" -layer_1/y_sort_enabled = true -layer_1/tile_data = PackedInt32Array(524293, 0, 4, 589829, 0, 5, 655365, 0, 6, 524294, 196608, 4, 589830, 65536, 5, 655366, 0, 7, 524295, 65536, 4, 524296, 131072, 4, 589832, 131072, 5, 655368, 196608, 6, 262151, 262144, 6, 262153, 458752, 6, 262150, 327680, 6, 262148, 262144, 6, 196612, 262144, 6, 196614, 458752, 6, 131079, 262144, 4, 196615, 262144, 5, 131080, 327680, 4, 196616, 458752, 5, 131081, 393216, 4, 196617, 393216, 5, 65540, 262144, 4, 131076, 262144, 5, 65541, 458752, 4, 131077, 327680, 5, 65542, 393216, 4, 131078, 393216, 5, 196613, 262144, 7, 262149, 262144, 7, 262152, 327680, 7, 524292, 589824, 3, 524291, 589824, 3, 524290, 589824, 3, 524289, 524288, 3, 589825, 524288, 4, 655361, 524288, 5, 655362, 589824, 3, 655364, 589824, 3, 589828, 655360, 7, 589826, 655360, 7, 786438, 524288, 6, 786439, 589824, 6, 786441, 589824, 6, 786443, 589824, 6, 786444, 655360, 6, 786442, 589824, 3, 786440, 589824, 3, 196621, 0, 4, 262157, 0, 5, 327693, 0, 6, 196622, 65536, 4, 262158, 65536, 5, 327694, 65536, 7, 196623, 131072, 4, 262159, 131072, 5, 327695, 196608, 6, 327691, 524288, 6, 327692, 589824, 6, 65550, 327680, 2, 458755, 327680, 1, 655374, 524288, 8, 262162, 0, 4, 327698, 0, 5, 393234, 0, 6, 262163, 196608, 4, 327699, 65536, 5, 393235, 0, 7, 262164, 131072, 4, 327700, 131072, 5, 393236, 196608, 6, 655379, 0, 4, 720915, 0, 5, 786451, 0, 6, 655380, 65536, 4, 720916, 65536, 5, 786452, 0, 7, 655381, 65536, 4, 720917, 65536, 5, 786453, 0, 7, 655382, 131072, 4, 720918, 131072, 5, 786454, 196608, 6, 655384, 655360, 3, 720920, 655360, 4, 786456, 655360, 5, 655383, 589824, 6, 786455, 589824, 6, 720919, 327680, 1, 851992, 327680, 1, 917527, 327680, 1, 917523, 327680, 1, 917522, 327680, 2, 458756, 262144, 2, 393221, 327680, 0, 720897, 524288, 1, 327696, 327680, 0, 851978, 262144, 2, 851976, 262144, 1, 851975, 262144, 1, 655370, 262144, 1, 655372, 262144, 1, 196624, 262144, 1, 131090, 262144, 1, 393219, 262144, 1, 917519, 262144, 1, 917525, 262144, 1, 589848, 262144, 1, 65556, 262144, 1, 393229, 327680, 2, 393228, 327680, 1, 393227, 327680, 1, 458772, 327680, 1, 327687, 262144, 2, 327689, 262144, 2, 851970, 262144, 1, 983043, 262144, 1, 917508, 262144, 1, 983044, 262144, 2, 917506, 262144, 2, 983048, 262144, 2, 983049, 262144, 1, 917503, 458752, 1, 917502, 458752, 1, 917501, 458752, 1, 851965, 458752, 1, 851964, 458752, 1, 851963, 458752, 1, 786427, 458752, 1, 720891, 458752, 1, 655355, 458752, 1, 655356, 458752, 1, 589820, 458752, 1, 589821, 458752, 1, 655357, 458752, 1, 720893, 458752, 1, 786429, 458752, 1, 917499, 458752, 1, 917498, 458752, 1, 851962, 458752, 1, 786426, 458752, 1, 720890, 458752, 1, 655354, 458752, 1, 589818, 458752, 1, 524282, 458752, 1, 458746, 458752, 1, 458747, 458752, 1, 393211, 458752, 1, 524283, 458752, 1, 589819, 458752, 1, 917500, 458752, 1, 983036, 458752, 1, 786430, 458752, 1, 720894, 458752, 1, 720895, 458752, 1, 655359, 458752, 1, 589823, 458752, 1, 524287, 458752, 1, 458751, 458752, 1, 393216, 458752, 1, 327680, 524288, 0, 393215, 458752, 1, 327679, 458752, 1, 262143, 458752, 1, 196607, 458752, 1, 131071, 458752, 1, 65536, 458752, 1, 65537, 524288, 2, 1, 458752, 1, 2, 524288, 2, 3, 262144, 2, -65533, 524288, 2, -65532, 458752, 2, -65531, 458752, 2, -65530, 458752, 2, -65529, 458752, 2, -65528, 458752, 2, -65527, 458752, 2, -65526, 393216, 2, -65525, 458752, 1, -65524, 458752, 1, -65523, 458752, 1, -65522, 524288, 2, -393227, 458752, 1, -393226, 458752, 1, -393225, 458752, 1, -393224, 458752, 1, -393223, 458752, 1, -393222, 458752, 1, -393221, 458752, 1, -393220, 458752, 1, -393219, 458752, 1, -393218, 458752, 1, -393217, 458752, 1, -458752, 458752, 1, -458751, 458752, 1, -458750, 458752, 1, -458749, 458752, 1, -458748, 458752, 1, -458747, 458752, 1, -458746, 458752, 1, -458745, 458752, 1, -458744, 458752, 1, -458743, 458752, 1, -458742, 458752, 1, -458741, 458752, 1, -458740, 458752, 1, -458739, 458752, 1, -458738, 458752, 1, -458737, 458752, 1, -458736, 458752, 1, -458735, 458752, 1, -458734, 458752, 1, -458733, 458752, 1, -458732, 458752, 1, -458731, 458752, 1, -458730, 458752, 1, -458729, 458752, 1, -458728, 458752, 1, -458727, 458752, 1, -458726, 458752, 1, -458725, 458752, 1, -458724, 458752, 1, -458723, 458752, 1, -458722, 458752, 1, -458721, 458752, 1, -458720, 458752, 1, -458719, 458752, 1, -458718, 458752, 1, -458717, 458752, 1, -524253, 458752, 1, -524254, 458752, 1, -524255, 458752, 1, -524256, 458752, 1, -524257, 458752, 1, -524258, 458752, 1, -524259, 458752, 1, -524260, 458752, 1, -524261, 458752, 1, -524262, 458752, 1, -524263, 458752, 1, -524264, 458752, 1, -524265, 458752, 1, -524266, 458752, 1, -524267, 458752, 1, -524268, 458752, 1, -524269, 458752, 1, -524270, 458752, 1, -524271, 458752, 1, -524272, 458752, 1, -524273, 458752, 1, -524274, 458752, 1, -524275, 458752, 1, -524276, 458752, 1, -524277, 458752, 1, -524278, 458752, 1, -524279, 458752, 1, -524280, 458752, 1, -524281, 458752, 1, -524282, 458752, 1, -524283, 458752, 1, -524284, 458752, 1, -524285, 458752, 1, -524286, 458752, 1, -524287, 458752, 1, -524288, 458752, 1, -458753, 458752, 1, -458754, 458752, 1, -458755, 458752, 1, -458756, 458752, 1, -458757, 458752, 1, -458758, 458752, 1, -458759, 458752, 1, -458760, 458752, 1, -458761, 458752, 1, -458762, 458752, 1, -458763, 458752, 1, -458764, 393216, 0, -393228, 458752, 1, -327692, 458752, 1, -262156, 458752, 1, -196620, 458752, 1, -131084, 458752, 1, -65548, 458752, 1, -12, 458752, 1, 65524, 458752, 1, 131060, 458752, 1, 196596, 458752, 1, 262132, 458752, 1, 327668, 458752, 1, 393204, 458752, 1, 458740, 458752, 1, 524276, 458752, 1, 589812, 458752, 1, 655348, 458752, 1, 720884, 458752, 1, 786420, 458752, 1, 851956, 458752, 1, 917492, 458752, 1, 983028, 458752, 1, 1048564, 458752, 1, 1114100, 458752, 1, 1179636, 458752, 1, 1245172, 458752, 1, 1310708, 458752, 1, 1376244, 458752, 1, 1441780, 393216, 2, 1507316, 458752, 1, 1507317, 458752, 1, 1507318, 458752, 1, 1507319, 458752, 1, 1507320, 458752, 1, 1507321, 458752, 1, 1507322, 458752, 1, 1507323, 458752, 1, 1507324, 458752, 1, 1507325, 458752, 1, 1507326, 458752, 1, 1441828, 458752, 1, 1441827, 458752, 1, 1441826, 458752, 1, 1441825, 458752, 1, 1441824, 458752, 1, 1441823, 458752, 1, 1441822, 458752, 1, 1441821, 458752, 1, 1441820, 458752, 1, 1441819, 458752, 1, 1441818, 458752, 1, 1441817, 458752, 1, 1441816, 458752, 1, 1441815, 458752, 1, 1441814, 458752, 1, 1441813, 458752, 1, 1441812, 458752, 1, 1441811, 458752, 1, 1441810, 458752, 1, 1441809, 458752, 1, 1441808, 524288, 2, 1441807, 393216, 1, 1441804, 458752, 1, 1441803, 458752, 1, 1441802, 458752, 1, 1441801, 524288, 2, 1441800, 393216, 2, 1441799, 524288, 2, 1441798, 458752, 1, 1441797, 458752, 1, 1441796, 458752, 1, 1441795, 458752, 1, 1441794, 458752, 1, 1441793, 458752, 1, 1441792, 458752, 1, 1507327, 458752, 1, -65500, 458752, 1, 36, 458752, 1, 65572, 458752, 1, 131108, 458752, 1, 196644, 458752, 1, 262180, 458752, 1, 327716, 458752, 1, 393252, 458752, 1, 458788, 458752, 1, 524324, 458752, 1, 589860, 458752, 1, 655396, 458752, 1, 720932, 458752, 1, 786468, 458752, 1, 852004, 458752, 1, 917540, 458752, 1, 983076, 458752, 1, 1048612, 458752, 1, 1114148, 458752, 1, 1179684, 458752, 1, 1245220, 458752, 1, 1310756, 458752, 1, 1376292, 458752, 1, -524252, 458752, 1, -458716, 458752, 1, -393180, 458752, 1, -327644, 458752, 1, -262108, 458752, 1, -196572, 458752, 1, -131036, 458752, 1, -65511, 458752, 1, -65512, 458752, 1, -65513, 458752, 1, -65514, 458752, 1, -65515, 393216, 2, -65516, 458752, 2, -65517, 458752, 2, -65518, 458752, 2, -65519, 458752, 2, -65520, 458752, 2, -65521, 458752, 2, -65534, 458752, 1, -65535, 458752, 1, -65536, 458752, 1, -1, 458752, 1, 983065, 458752, 1, 917529, 393216, 0, 851993, 393216, 1, 786457, 393216, 1, 720921, 393216, 1, 655385, 393216, 1, 589849, 393216, 1, 524313, 393216, 1, 458777, 393216, 1, 393241, 393216, 2, 327705, 458752, 1, 262169, 458752, 1, 196633, 458752, 1, 131097, 458752, 1, 65561, 458752, 1, 25, 458752, 1, 983050, 458752, 0, 983055, 393216, 0, 983056, 458752, 1, 983057, 458752, 1, 983058, 524288, 0, 983059, 458752, 0, 983060, 458752, 0, 983061, 458752, 0, 983062, 458752, 0, 983063, 458752, 0, 983064, 393216, 0, 1048577, 458752, 1, 1048578, 458752, 1, 1048579, 524288, 0, 1048580, 393216, 0, 1048581, 458752, 1, 1048582, 458752, 1, 1048583, 458752, 1, 1048584, 524288, 0, 1048585, 393216, 0, 1048586, 458752, 1, 1048575, 458752, 1, 983040, 458752, 1, 983041, 458752, 1, 983042, 524288, 0, 65535, 458752, 1, 786431, 458752, 1, 851967, 458752, 1, 983039, 458752, 1, 1376291, 458752, 1, 1310755, 458752, 1, 1245219, 458752, 1, 1179683, 458752, 1, 1114147, 458752, 1, 1048611, 458752, 1, 983075, 458752, 1, 917539, 458752, 1, 852003, 458752, 1, 786467, 458752, 1, 720931, 458752, 1, 655395, 458752, 1, 589859, 458752, 1, 524323, 458752, 1, 458787, 458752, 1, 393251, 458752, 1, 327715, 458752, 1, 262179, 458752, 1, 196643, 458752, 1, 131107, 458752, 1, 65571, 458752, 1, 35, 458752, 1, -65501, 458752, 1, -131037, 458752, 1, -196573, 458752, 1, -262109, 458752, 1, -327645, 458752, 1, -393181, 458752, 1, 1376290, 458752, 1, 1310754, 458752, 1, 1245218, 458752, 1, 1179682, 458752, 1, 1114146, 458752, 1, 1048610, 458752, 1, 983074, 458752, 1, 917538, 458752, 1, 852002, 458752, 1, 786466, 458752, 1, 720930, 458752, 1, 655394, 458752, 1, 589858, 458752, 1, 524322, 458752, 1, 458786, 458752, 1, 393250, 458752, 1, 327714, 458752, 1, 262178, 458752, 1, 196642, 458752, 1, 131106, 458752, 1, 65570, 458752, 1, 34, 458752, 1, -65502, 458752, 1, -131038, 458752, 1, -196574, 458752, 1, -262110, 458752, 1, -327646, 458752, 1, -393182, 458752, 1, 1376289, 458752, 1, 1310753, 458752, 1, 1245217, 458752, 1, 1179681, 458752, 1, 1114145, 458752, 1, 1048609, 458752, 1, 983073, 458752, 1, 917537, 458752, 1, 852001, 458752, 1, 786465, 458752, 1, 720929, 458752, 1, 655393, 458752, 1, 589857, 458752, 1, 524321, 458752, 1, 458785, 458752, 1, 393249, 458752, 1, 327713, 458752, 1, 262177, 458752, 1, 196641, 458752, 1, 131105, 458752, 1, 65569, 458752, 1, 33, 458752, 1, -65503, 458752, 1, -131039, 458752, 1, -196575, 458752, 1, -262111, 458752, 1, -327647, 458752, 1, -393183, 458752, 1, 1376288, 458752, 1, 1310752, 458752, 1, 1245216, 458752, 1, 1179680, 458752, 1, 1114144, 458752, 1, 1048608, 458752, 1, 983072, 458752, 1, 917536, 458752, 1, 852000, 458752, 1, 786464, 458752, 1, 720928, 458752, 1, 655392, 458752, 1, 589856, 458752, 1, 524320, 458752, 1, 458784, 458752, 1, 393248, 458752, 1, 327712, 458752, 1, 262176, 458752, 1, 196640, 458752, 1, 131104, 458752, 1, 65568, 458752, 1, 32, 458752, 1, -65504, 458752, 1, -131040, 458752, 1, -196576, 458752, 1, -262112, 458752, 1, -327648, 458752, 1, -393184, 458752, 1, 1376287, 458752, 1, 1310751, 458752, 1, 1245215, 458752, 1, 1179679, 458752, 1, 1114143, 458752, 1, 1048607, 458752, 1, 983071, 458752, 1, 917535, 458752, 1, 851999, 458752, 1, 786463, 458752, 1, 720927, 458752, 1, 655391, 458752, 1, 589855, 458752, 1, 524319, 458752, 1, 458783, 458752, 1, 393247, 458752, 1, 327711, 458752, 1, 262175, 458752, 1, 196639, 458752, 1, 131103, 458752, 1, 65567, 458752, 1, 31, 458752, 1, -65505, 458752, 1, -131041, 458752, 1, -196577, 458752, 1, -262113, 458752, 1, -327649, 458752, 1, -393185, 458752, 1, 1376286, 458752, 1, 1310750, 458752, 1, 1245214, 458752, 1, 1179678, 458752, 1, 1114142, 458752, 1, 1048606, 458752, 1, 983070, 458752, 1, 917534, 458752, 1, 851998, 458752, 1, 786462, 458752, 1, 720926, 458752, 1, 655390, 458752, 1, 589854, 458752, 1, 524318, 458752, 1, 458782, 458752, 1, 393246, 458752, 1, 327710, 458752, 1, 262174, 458752, 1, 196638, 458752, 1, 131102, 458752, 1, 65566, 458752, 1, 30, 458752, 1, -65506, 458752, 1, -131042, 458752, 1, -196578, 458752, 1, -262114, 458752, 1, -327650, 458752, 1, -393186, 458752, 1, 1376285, 458752, 1, 1310749, 458752, 1, 1245213, 458752, 1, 1179677, 458752, 1, 1114141, 458752, 1, 1048605, 458752, 1, 983069, 458752, 1, 917533, 458752, 1, 851997, 458752, 1, 786461, 458752, 1, 720925, 458752, 1, 655389, 458752, 1, 589853, 458752, 1, 524317, 458752, 1, 458781, 458752, 1, 393245, 458752, 1, 327709, 458752, 1, 262173, 458752, 1, 196637, 458752, 1, 131101, 458752, 1, 65565, 458752, 1, 29, 458752, 1, -65507, 458752, 1, -131043, 458752, 1, -196579, 458752, 1, -262115, 458752, 1, -327651, 458752, 1, -393187, 458752, 1, 1376284, 458752, 1, 1310748, 458752, 1, 1245212, 458752, 1, 1179676, 458752, 1, 1114140, 458752, 1, 1048604, 458752, 1, 983068, 458752, 1, 917532, 458752, 1, 851996, 458752, 1, 786460, 458752, 1, 720924, 458752, 1, 655388, 458752, 1, 589852, 458752, 1, 524316, 458752, 1, 458780, 458752, 1, 393244, 458752, 1, 327708, 458752, 1, 262172, 458752, 1, 196636, 458752, 1, 131100, 458752, 1, 65564, 458752, 1, 28, 458752, 1, -65508, 458752, 1, -131044, 458752, 1, -196580, 458752, 1, -262116, 458752, 1, -327652, 458752, 1, -393188, 458752, 1, 1376283, 458752, 1, 1310747, 458752, 1, 1245211, 458752, 1, 1179675, 458752, 1, 1114139, 458752, 1, 1048603, 458752, 1, 983067, 458752, 1, 917531, 458752, 1, 851995, 458752, 1, 786459, 458752, 1, 720923, 458752, 1, 655387, 458752, 1, 589851, 458752, 1, 524315, 458752, 1, 458779, 458752, 1, 393243, 458752, 1, 327707, 458752, 1, 262171, 458752, 1, 196635, 458752, 1, 131099, 458752, 1, 65563, 458752, 1, 27, 458752, 1, -65509, 458752, 1, -131045, 458752, 1, -196581, 458752, 1, -262117, 458752, 1, -327653, 458752, 1, -393189, 458752, 1, 1376282, 458752, 1, 1310746, 458752, 1, 1245210, 458752, 1, 1179674, 458752, 1, 1114138, 458752, 1, 1048602, 458752, 1, 983066, 458752, 1, 917530, 458752, 1, 851994, 458752, 1, 786458, 458752, 1, 720922, 458752, 1, 655386, 458752, 1, 589850, 458752, 1, 524314, 458752, 1, 458778, 458752, 1, 393242, 458752, 1, 327706, 458752, 1, 262170, 458752, 1, 196634, 458752, 1, 131098, 458752, 1, 65562, 458752, 1, 26, 458752, 1, -65510, 458752, 1, -131046, 458752, 1, -196582, 458752, 1, -262118, 458752, 1, -327654, 458752, 1, -393190, 458752, 1, 1376281, 458752, 1, 1310745, 458752, 1, 1245209, 458752, 1, 1179673, 458752, 1, 1114137, 458752, 1, 1048601, 458752, 1, -131047, 458752, 1, -196583, 458752, 1, -262119, 458752, 1, -327655, 458752, 1, -393191, 458752, 1, 1376280, 458752, 1, 1310744, 458752, 1, 1245208, 458752, 1, 1179672, 458752, 1, 1114136, 458752, 1, 1048600, 458752, 1, -131048, 458752, 1, -196584, 458752, 1, -262120, 458752, 1, -327656, 458752, 1, -393192, 458752, 1, 1376279, 458752, 1, 1310743, 458752, 1, 1245207, 458752, 1, 1179671, 458752, 1, 1114135, 458752, 1, 1048599, 458752, 1, -131049, 458752, 1, -196585, 458752, 1, -262121, 458752, 1, -327657, 458752, 1, -393193, 458752, 1, 1376278, 458752, 1, 1310742, 458752, 1, 1245206, 393216, 0, 1179670, 393216, 2, 1114134, 458752, 1, 1048598, 458752, 1, -131050, 458752, 1, -196586, 458752, 1, -262122, 458752, 1, -327658, 458752, 1, -393194, 458752, 1, 1376277, 458752, 1, 1310741, 458752, 1, 1245205, 524288, 0, 1179669, 524288, 2, 1114133, 458752, 1, 1048597, 458752, 1, -131051, 458752, 1, -196587, 458752, 1, -262123, 458752, 1, -327659, 458752, 1, -393195, 458752, 1, 1376276, 458752, 1, 1310740, 458752, 1, 1245204, 458752, 1, 1179668, 458752, 1, 1114132, 458752, 1, 1048596, 458752, 1, -131052, 458752, 1, -196588, 458752, 1, -262124, 458752, 1, -327660, 458752, 1, -393196, 458752, 1, 1376275, 458752, 1, 1310739, 458752, 1, 1245203, 458752, 1, 1179667, 458752, 1, 1114131, 458752, 1, 1048595, 458752, 1, -131053, 458752, 1, -196589, 458752, 1, -262125, 458752, 1, -327661, 458752, 1, -393197, 458752, 1, 1376274, 458752, 1, 1310738, 458752, 1, 1245202, 458752, 1, 1179666, 458752, 1, 1114130, 458752, 1, 1048594, 458752, 1, -131054, 458752, 1, -196590, 458752, 1, -262126, 458752, 1, -327662, 458752, 1, -393198, 458752, 1, 1376273, 458752, 1, 1310737, 458752, 1, 1245201, 458752, 1, 1179665, 458752, 1, 1114129, 458752, 1, 1048593, 458752, 1, -131055, 458752, 1, -196591, 458752, 1, -262127, 458752, 1, -327663, 458752, 1, -393199, 458752, 1, 1376272, 458752, 1, 1310736, 458752, 1, 1245200, 458752, 1, 1179664, 458752, 1, 1114128, 458752, 1, 1048592, 458752, 1, -131056, 458752, 1, -196592, 458752, 1, -262128, 458752, 1, -327664, 458752, 1, -393200, 458752, 1, 1376271, 393216, 1, 1310735, 393216, 2, 1245199, 458752, 1, 1179663, 458752, 1, 1114127, 458752, 1, 1048591, 458752, 1, -131057, 458752, 1, -196593, 458752, 1, -262129, 458752, 1, -327665, 458752, 1, -393201, 458752, 1, -131058, 458752, 1, -196594, 458752, 1, -262130, 458752, 1, -327666, 458752, 1, -393202, 458752, 1, -131059, 458752, 1, -196595, 458752, 1, -262131, 458752, 1, -327667, 458752, 1, -393203, 458752, 1, 1376268, 524288, 0, -131060, 458752, 1, -196596, 458752, 1, -262132, 458752, 1, -327668, 458752, 1, -393204, 458752, 1, 1376267, 458752, 1, -131061, 458752, 1, -196597, 458752, 1, -262133, 458752, 1, -327669, 458752, 1, -393205, 458752, 1, 1376266, 458752, 1, 1310730, 458752, 1, 1245194, 458752, 1, 1179658, 524288, 0, 1114122, 524288, 2, -131062, 458752, 1, -196598, 458752, 1, -262134, 458752, 1, -327670, 458752, 1, -393206, 458752, 1, 1376265, 458752, 1, 1310729, 458752, 1, 1245193, 458752, 1, 1179657, 458752, 1, 1114121, 458752, 1, -131063, 458752, 1, -196599, 458752, 1, -262135, 458752, 1, -327671, 458752, 1, -393207, 458752, 1, 1376264, 458752, 1, 1310728, 458752, 1, 1245192, 458752, 1, 1179656, 458752, 1, 1114120, 458752, 1, -131064, 458752, 1, -196600, 458752, 1, -262136, 458752, 1, -327672, 458752, 1, -393208, 458752, 1, 1376263, 458752, 1, 1310727, 458752, 1, 1245191, 458752, 1, 1179655, 458752, 1, 1114119, 458752, 1, -131065, 458752, 1, -196601, 458752, 1, -262137, 458752, 1, -327673, 458752, 1, -393209, 458752, 1, 1376262, 458752, 1, 1310726, 458752, 1, 1245190, 458752, 1, 1179654, 458752, 1, 1114118, 458752, 1, -131066, 458752, 1, -196602, 458752, 1, -262138, 458752, 1, -327674, 458752, 1, -393210, 458752, 1, 1376261, 458752, 1, 1310725, 458752, 1, 1245189, 458752, 1, 1179653, 458752, 1, 1114117, 458752, 1, -131067, 458752, 1, -196603, 458752, 1, -262139, 458752, 1, -327675, 458752, 1, -393211, 458752, 1, 1376260, 458752, 1, 1310724, 458752, 1, 1245188, 458752, 1, 1179652, 458752, 1, 1114116, 458752, 1, -131068, 458752, 1, -196604, 458752, 1, -262140, 458752, 1, -327676, 458752, 1, -393212, 458752, 1, 1376259, 458752, 1, 1310723, 458752, 1, 1245187, 458752, 1, 1179651, 458752, 1, 1114115, 458752, 1, -131069, 458752, 1, -196605, 458752, 1, -262141, 458752, 1, -327677, 458752, 1, -393213, 458752, 1, 1376258, 458752, 1, 1310722, 458752, 1, 1245186, 458752, 1, 1179650, 458752, 1, 1114114, 458752, 1, -131070, 458752, 1, -196606, 458752, 1, -262142, 458752, 1, -327678, 458752, 1, -393214, 458752, 1, 1376257, 458752, 1, 1310721, 458752, 1, 1245185, 458752, 1, 1179649, 458752, 1, 1114113, 458752, 1, -131071, 458752, 1, -196607, 458752, 1, -262143, 458752, 1, -327679, 458752, 1, -393215, 458752, 1, 1376256, 458752, 1, 1310720, 458752, 1, 1245184, 458752, 1, 1179648, 458752, 1, 1114112, 458752, 1, 1048576, 458752, 1, -131072, 458752, 1, -196608, 458752, 1, -262144, 458752, 1, -327680, 458752, 1, -393216, 458752, 1, 1441791, 458752, 1, 1376255, 458752, 1, 1310719, 458752, 1, 1245183, 458752, 1, 1179647, 458752, 1, 1114111, 458752, 1, -65537, 458752, 1, -131073, 458752, 1, -196609, 458752, 1, -262145, 458752, 1, -327681, 458752, 1, 1441790, 458752, 1, 1376254, 458752, 1, 1310718, 458752, 1, 1245182, 458752, 1, 1179646, 458752, 1, 1114110, 458752, 1, 1048574, 458752, 1, 983038, 458752, 1, 655358, 458752, 1, 589822, 458752, 1, 524286, 458752, 1, 458750, 458752, 1, 393214, 458752, 1, 327678, 458752, 1, 262142, 458752, 1, 196606, 458752, 1, 131070, 458752, 1, 65534, 458752, 1, -2, 458752, 1, -65538, 458752, 1, -131074, 458752, 1, -196610, 458752, 1, -262146, 458752, 1, -327682, 458752, 1, 1441789, 458752, 1, 1376253, 458752, 1, 1310717, 458752, 1, 1245181, 458752, 1, 1179645, 458752, 1, 1114109, 458752, 1, 1048573, 458752, 1, 983037, 458752, 1, 524285, 458752, 1, 458749, 458752, 1, 393213, 458752, 1, 327677, 458752, 1, 262141, 458752, 1, 196605, 458752, 1, 131069, 458752, 1, 65533, 458752, 1, -3, 458752, 1, -65539, 458752, 1, -131075, 458752, 1, -196611, 458752, 1, -262147, 458752, 1, -327683, 458752, 1, 1441788, 458752, 1, 1376252, 458752, 1, 1310716, 458752, 1, 1245180, 458752, 1, 1179644, 458752, 1, 1114108, 458752, 1, 1048572, 458752, 1, 524284, 458752, 1, 458748, 458752, 1, 393212, 458752, 1, 327676, 458752, 1, 262140, 458752, 1, 196604, 458752, 1, 131068, 458752, 1, 65532, 458752, 1, -4, 458752, 1, -65540, 458752, 1, -131076, 458752, 1, -196612, 458752, 1, -262148, 458752, 1, -327684, 458752, 1, 1441787, 458752, 1, 1376251, 458752, 1, 1310715, 458752, 1, 1245179, 458752, 1, 1179643, 458752, 1, 1114107, 458752, 1, 1048571, 458752, 1, 983035, 458752, 1, 327675, 458752, 1, 262139, 458752, 1, 196603, 458752, 1, 131067, 458752, 1, 65531, 458752, 1, -5, 458752, 1, -65541, 458752, 1, -131077, 458752, 1, -196613, 458752, 1, -262149, 458752, 1, -327685, 458752, 1, 1441786, 458752, 1, 1376250, 458752, 1, 1310714, 458752, 1, 1245178, 458752, 1, 1179642, 458752, 1, 1114106, 458752, 1, 1048570, 458752, 1, 983034, 458752, 1, 393210, 458752, 1, 327674, 458752, 1, 262138, 458752, 1, 196602, 458752, 1, 131066, 458752, 1, 65530, 458752, 1, -6, 458752, 1, -65542, 458752, 1, -131078, 458752, 1, -196614, 458752, 1, -262150, 458752, 1, -327686, 458752, 1, 1441785, 458752, 1, 1376249, 458752, 1, 1310713, 458752, 1, 1245177, 458752, 1, 1179641, 458752, 1, 1114105, 458752, 1, 1048569, 458752, 1, 983033, 458752, 1, 917497, 458752, 1, 851961, 458752, 1, 786425, 458752, 1, 720889, 458752, 1, 655353, 458752, 1, 589817, 458752, 1, 524281, 458752, 1, 458745, 458752, 1, 393209, 458752, 1, 327673, 458752, 1, 262137, 458752, 1, 196601, 458752, 1, 131065, 458752, 1, 65529, 458752, 1, -7, 458752, 1, -65543, 458752, 1, -131079, 458752, 1, -196615, 458752, 1, -262151, 458752, 1, -327687, 458752, 1, 1441784, 458752, 1, 1376248, 458752, 1, 1310712, 458752, 1, 1245176, 458752, 1, 1179640, 458752, 1, 1114104, 458752, 1, 1048568, 458752, 1, 983032, 458752, 1, 917496, 458752, 1, 851960, 458752, 1, 786424, 458752, 1, 720888, 458752, 1, 655352, 458752, 1, 589816, 458752, 1, 524280, 458752, 1, 458744, 458752, 1, 393208, 458752, 1, 327672, 458752, 1, 262136, 458752, 1, 196600, 458752, 1, 131064, 458752, 1, 65528, 458752, 1, -8, 458752, 1, -65544, 458752, 1, -131080, 458752, 1, -196616, 458752, 1, -262152, 458752, 1, -327688, 458752, 1, 1441783, 458752, 1, 1376247, 458752, 1, 1310711, 458752, 1, 1245175, 458752, 1, 1179639, 458752, 1, 1114103, 458752, 1, 1048567, 458752, 1, 983031, 458752, 1, 917495, 458752, 1, 851959, 458752, 1, 786423, 458752, 1, 720887, 458752, 1, 655351, 458752, 1, 589815, 458752, 1, 524279, 458752, 1, 458743, 458752, 1, 393207, 458752, 1, 327671, 458752, 1, 262135, 458752, 1, 196599, 458752, 1, 131063, 458752, 1, 65527, 458752, 1, -9, 458752, 1, -65545, 458752, 1, -131081, 458752, 1, -196617, 458752, 1, -262153, 458752, 1, -327689, 458752, 1, 1441782, 458752, 1, 1376246, 458752, 1, 1310710, 458752, 1, 1245174, 458752, 1, 1179638, 458752, 1, 1114102, 458752, 1, 1048566, 458752, 1, 983030, 458752, 1, 917494, 458752, 1, 851958, 458752, 1, 786422, 458752, 1, 720886, 458752, 1, 655350, 458752, 1, 589814, 458752, 1, 524278, 458752, 1, 458742, 458752, 1, 393206, 458752, 1, 327670, 458752, 1, 262134, 458752, 1, 196598, 458752, 1, 131062, 458752, 1, 65526, 458752, 1, -10, 458752, 1, -65546, 458752, 1, -131082, 458752, 1, -196618, 458752, 1, -262154, 458752, 1, -327690, 458752, 1, 1441781, 458752, 1, 1376245, 458752, 1, 1310709, 458752, 1, 1245173, 458752, 1, 1179637, 458752, 1, 1114101, 458752, 1, 1048565, 458752, 1, 983029, 458752, 1, 917493, 458752, 1, 851957, 458752, 1, 786421, 458752, 1, 720885, 458752, 1, 655349, 458752, 1, 589813, 458752, 1, 524277, 458752, 1, 458741, 458752, 1, 393205, 458752, 1, 327669, 458752, 1, 262133, 458752, 1, 196597, 458752, 1, 131061, 458752, 1, 65525, 458752, 1, -11, 458752, 1, -65547, 458752, 1, -131083, 458752, 1, -196619, 458752, 1, -262155, 458752, 1, -327691, 458752, 1, 851966, 458752, 1, 786428, 458752, 1, 720892, 458752, 1, 0, 458752, 1, 131072, 524288, 2, 12, 458752, 1, 11, 458752, 1, 13, 524288, 2, 10, 393216, 1, 65547, 458752, 2, 65548, 458752, 2, 23, 458752, 1, 65559, 458752, 1, 65560, 458752, 1, 131096, 458752, 1, 196632, 458752, 1, 262168, 458752, 1, 196631, 393216, 0, 262167, 458752, 1, 327703, 458752, 1, 327704, 458752, 1, 393240, 524288, 2, 24, 458752, 1, 22, 393216, 2, 131095, 393216, 2, 262166, 393216, 1, 327702, 393216, 1, 65558, 393216, 1, 393239, 393216, 2, 917521, 458752, 0, 917520, 458752, 0, 983047, 458752, 0, 983046, 458752, 0, 983045, 458752, 0, 917505, 524288, 0, 851968, 524288, 0, 917504, 458752, 1, 1048587, 524288, 1, 1114123, 262144, 2, 1048590, 393216, 0, 1114126, 458752, 1, 1179661, 393216, 2, 1179662, 458752, 1, 1245197, 262144, 2, 1245198, 393216, 2, 1376269, 458752, 0, 1441805, 524288, 2, 1245195, 524288, 1, 1310731, 524288, 0, 1114125, 393216, 0, 393237, 589824, 4, 589833, 720896, 8, 262156, 655361, 6, 14, 327681, 7, 262155, 196609, 5, 196620, 655361, 6, 131084, 196609, 5, 131086, 720896, 8, 655363, 589824, 3, 393230, 327680, 1, 393231, 327680, 1, 458767, 327680, 1, 458766, 327680, 1, 458765, 327680, 1, 655369, 720896, 6, 524288, 524288, 2, 458752, 458752, 1, 458753, 524288, 2, 393217, 524288, 0, 720896, 458752, 1, 655360, 524288, 2, 786432, 524288, 2, 589824, 524288, 0, 196608, 524288, 1, 262144, 524288, 1, 262147, 196608, 2, 458754, 327680, 0, 1114161, 458752, 1, 1179697, 458752, 1, 1245233, 458752, 1, 1310769, 458752, 1, 1376305, 458752, 1, 1441841, 458752, 1, 1507377, 458752, 1, 1572913, 393216, 2, 1114162, 458752, 1, 1179698, 458752, 1, 1245234, 458752, 1, 1310770, 458752, 1, 1376306, 458752, 1, 1441842, 458752, 1, 1507378, 458752, 1, 1572914, 458752, 1, 2293798, 458752, 1, 2359334, 458752, 1, 2424870, 458752, 1, 2490406, 458752, 1, 2555942, 458752, 1, 2621478, 458752, 1, 2687014, 458752, 1, 2752550, 458752, 1, 2293799, 458752, 1, 2359335, 458752, 1, 2424871, 458752, 1, 2490407, 458752, 1, 2555943, 458752, 1, 2621479, 458752, 1, 2687015, 458752, 1, 2752551, 458752, 1, 1835033, 458752, 1, 1900569, 458752, 1, 1835034, 458752, 1, 1900570, 458752, 1, 1835035, 458752, 1, 1900571, 458752, 1, 1835036, 458752, 1, 1900572, 458752, 1, 1835037, 458752, 1, 1900573, 458752, 1, 1835038, 458752, 1, 1900574, 458752, 1, 1835039, 458752, 1, 1900575, 458752, 1, 1835040, 458752, 1, 1900576, 458752, 1, 1835041, 458752, 1, 1900577, 458752, 1, 1835042, 458752, 1, 1900578, 458752, 1, 1835043, 458752, 1, 1900579, 458752, 1, 1835044, 458752, 1, 1900580, 458752, 1, 1900604, 393216, 2, 1966140, 393216, 0, 1900605, 458752, 1, 1966141, 458752, 1, 1900606, 458752, 1, 1966142, 458752, 1, 1900607, 458752, 1, 1966143, 458752, 1, 1900608, 458752, 1, 1966144, 458752, 1, 1900609, 458752, 1, 1966145, 458752, 1, 1900610, 458752, 1, 1966146, 458752, 1, 1900611, 458752, 1, 1966147, 458752, 1, 1900612, 458752, 1, 1966148, 458752, 1, 1900613, 458752, 1, 1966149, 458752, 1, 1900614, 458752, 1, 1966150, 458752, 1, 1900615, 458752, 1, 1966151, 458752, 1, 2752583, 524288, 2, 2687047, 458752, 1, 2621511, 458752, 1, 2555975, 458752, 1, 2490439, 458752, 1, 2424903, 458752, 1, 2359367, 458752, 1, 2293831, 458752, 1, 2752582, 458752, 1, 2687046, 458752, 1, 2621510, 458752, 1, 2555974, 458752, 1, 2490438, 458752, 1, 2424902, 458752, 1, 2359366, 458752, 1, 2293830, 458752, 1, 2752581, 458752, 1, 2687045, 458752, 1, 2621509, 458752, 1, 2555973, 458752, 1, 2490437, 458752, 1, 2424901, 458752, 1, 2359365, 458752, 1, 2293829, 458752, 1, 2752580, 458752, 1, 2687044, 458752, 1, 2621508, 458752, 1, 2555972, 458752, 1, 2490436, 458752, 1, 2424900, 458752, 1, 2359364, 458752, 1, 2293828, 458752, 1, 2752579, 458752, 1, 2687043, 458752, 1, 2621507, 458752, 1, 2555971, 458752, 1, 2490435, 458752, 1, 2424899, 458752, 1, 2359363, 458752, 1, 2293827, 458752, 1, 2752578, 458752, 1, 2687042, 458752, 1, 2621506, 458752, 1, 2555970, 458752, 1, 2490434, 458752, 1, 2424898, 458752, 1, 2359362, 458752, 1, 2293826, 458752, 1, 2752577, 458752, 1, 2687041, 458752, 1, 2621505, 458752, 1, 2555969, 458752, 1, 2490433, 458752, 1, 2424897, 458752, 1, 2359361, 458752, 1, 2293825, 458752, 1, 2752576, 458752, 1, 2687040, 458752, 1, 2621504, 458752, 1, 2555968, 458752, 1, 2490432, 458752, 1, 2424896, 458752, 1, 2359360, 458752, 1, 2293824, 458752, 1, 2752575, 458752, 1, 2687039, 458752, 1, 2621503, 458752, 1, 2555967, 458752, 1, 2490431, 458752, 1, 2424895, 458752, 1, 2359359, 458752, 1, 2293823, 458752, 1, 2752574, 458752, 1, 2687038, 458752, 1, 2621502, 458752, 1, 2555966, 458752, 1, 2490430, 458752, 1, 2424894, 458752, 1, 2359358, 458752, 1, 2293822, 458752, 1, 2752573, 458752, 1, 2687037, 458752, 1, 2621501, 458752, 1, 2555965, 458752, 1, 2490429, 458752, 1, 2424893, 458752, 1, 2359357, 458752, 1, 2293821, 458752, 1, 2752572, 458752, 1, 2687036, 458752, 1, 2621500, 458752, 1, 2555964, 458752, 1, 2490428, 458752, 1, 2424892, 458752, 1, 2359356, 458752, 1, 2293820, 458752, 1, 2752571, 458752, 1, 2687035, 458752, 1, 2621499, 458752, 1, 2555963, 458752, 1, 2490427, 458752, 1, 2424891, 458752, 1, 2359355, 458752, 1, 2293819, 458752, 1, 2752570, 458752, 1, 2687034, 458752, 1, 2621498, 458752, 1, 2555962, 458752, 1, 2490426, 458752, 1, 2424890, 458752, 1, 2359354, 458752, 1, 2293818, 458752, 1, 2752569, 458752, 1, 2687033, 458752, 1, 2621497, 458752, 1, 2555961, 458752, 1, 2490425, 458752, 1, 2424889, 458752, 1, 2359353, 458752, 1, 2293817, 458752, 1, 2752568, 458752, 1, 2687032, 458752, 1, 2621496, 458752, 1, 2555960, 458752, 1, 2490424, 458752, 1, 2424888, 458752, 1, 2359352, 458752, 1, 2293816, 458752, 1, 2752567, 458752, 1, 2687031, 458752, 1, 2621495, 458752, 1, 2555959, 458752, 1, 2490423, 458752, 1, 2424887, 458752, 1, 2359351, 458752, 1, 2293815, 458752, 1, 2752566, 458752, 1, 2687030, 458752, 1, 2621494, 458752, 1, 2555958, 458752, 1, 2490422, 458752, 1, 2424886, 458752, 1, 2359350, 458752, 1, 2293814, 458752, 1, 2752565, 458752, 1, 2687029, 458752, 1, 2621493, 458752, 1, 2555957, 458752, 1, 2490421, 458752, 1, 2424885, 458752, 1, 2359349, 458752, 1, 2293813, 458752, 1, 2752564, 458752, 1, 2687028, 458752, 1, 2621492, 458752, 1, 2555956, 458752, 1, 2490420, 458752, 1, 2424884, 458752, 1, 2359348, 458752, 1, 2293812, 458752, 1, 2752563, 458752, 1, 2687027, 458752, 1, 2621491, 458752, 1, 2555955, 458752, 1, 2490419, 458752, 1, 2424883, 458752, 1, 2359347, 458752, 1, 2293811, 458752, 1, 2752562, 458752, 1, 2687026, 458752, 1, 2621490, 458752, 1, 2555954, 458752, 1, 2490418, 458752, 1, 2424882, 458752, 1, 2359346, 458752, 1, 2293810, 458752, 1, 2752561, 458752, 1, 2687025, 458752, 1, 2621489, 458752, 1, 2555953, 458752, 1, 2490417, 458752, 1, 2424881, 458752, 1, 2359345, 458752, 1, 2293809, 458752, 1, 2752560, 458752, 1, 2687024, 458752, 1, 2621488, 458752, 1, 2555952, 458752, 1, 2490416, 458752, 1, 2424880, 458752, 1, 2359344, 458752, 1, 2293808, 458752, 1, 2752559, 458752, 1, 2687023, 458752, 1, 2621487, 458752, 1, 2555951, 458752, 1, 2490415, 458752, 1, 2424879, 458752, 1, 2359343, 458752, 1, 2293807, 458752, 1, 2752558, 458752, 1, 2687022, 458752, 1, 2621486, 458752, 1, 2555950, 458752, 1, 2490414, 458752, 1, 2424878, 458752, 1, 2359342, 458752, 1, 2293806, 458752, 1, 2752557, 458752, 1, 2687021, 458752, 1, 2621485, 458752, 1, 2555949, 458752, 1, 2490413, 458752, 1, 2424877, 458752, 1, 2359341, 458752, 1, 2293805, 458752, 1, 2752556, 458752, 1, 2687020, 458752, 1, 2621484, 458752, 1, 2555948, 458752, 1, 2490412, 458752, 1, 2424876, 458752, 1, 2359340, 458752, 1, 2293804, 458752, 1, 2752555, 458752, 1, 2687019, 458752, 1, 2621483, 458752, 1, 2555947, 458752, 1, 2490411, 458752, 1, 2424875, 458752, 1, 2359339, 458752, 1, 2293803, 458752, 1, 2752554, 458752, 1, 2687018, 458752, 1, 2621482, 458752, 1, 2555946, 458752, 1, 2490410, 458752, 1, 2424874, 458752, 1, 2359338, 458752, 1, 2293802, 458752, 1, 2752553, 458752, 1, 2687017, 458752, 1, 2621481, 458752, 1, 2555945, 458752, 1, 2490409, 458752, 1, 2424873, 458752, 1, 2359337, 458752, 1, 2293801, 458752, 1, 2752552, 458752, 1, 2687016, 458752, 1, 2621480, 458752, 1, 2555944, 458752, 1, 2490408, 458752, 1, 2424872, 458752, 1, 2359336, 458752, 1, 2293800, 458752, 1, 2752549, 458752, 1, 2687013, 458752, 1, 2621477, 458752, 1, 2555941, 458752, 1, 2490405, 458752, 1, 2424869, 458752, 1, 2359333, 458752, 1, 2293797, 458752, 1, 2752548, 458752, 1, 2687012, 458752, 1, 2621476, 458752, 1, 2555940, 458752, 1, 2490404, 458752, 1, 2424868, 458752, 1, 2359332, 458752, 1, 2293796, 458752, 1, 2752547, 458752, 1, 2687011, 458752, 1, 2621475, 458752, 1, 2555939, 458752, 1, 2490403, 458752, 1, 2424867, 458752, 1, 2359331, 458752, 1, 2293795, 458752, 1, 2752546, 458752, 1, 2687010, 458752, 1, 2621474, 458752, 1, 2555938, 458752, 1, 2490402, 458752, 1, 2424866, 458752, 1, 2359330, 458752, 1, 2293794, 458752, 1, 2752545, 458752, 1, 2687009, 458752, 1, 2621473, 458752, 1, 2555937, 458752, 1, 2490401, 458752, 1, 2424865, 458752, 1, 2359329, 458752, 1, 2293793, 458752, 1, 2752544, 458752, 1, 2687008, 458752, 1, 2621472, 458752, 1, 2555936, 458752, 1, 2490400, 458752, 1, 2424864, 458752, 1, 2359328, 458752, 1, 2293792, 458752, 1, 2752543, 458752, 1, 2687007, 458752, 1, 2621471, 458752, 1, 2555935, 458752, 1, 2490399, 458752, 1, 2424863, 458752, 1, 2359327, 458752, 1, 2293791, 458752, 1, 2752542, 458752, 1, 2687006, 458752, 1, 2621470, 458752, 1, 2555934, 458752, 1, 2490398, 458752, 1, 2424862, 458752, 1, 2359326, 458752, 1, 2293790, 458752, 1, 2752541, 458752, 1, 2687005, 458752, 1, 2621469, 458752, 1, 2555933, 458752, 1, 2490397, 458752, 1, 2424861, 458752, 1, 2359325, 458752, 1, 2293789, 458752, 1, 2752540, 458752, 1, 2687004, 458752, 1, 2621468, 458752, 1, 2555932, 458752, 1, 2490396, 458752, 1, 2424860, 458752, 1, 2359324, 458752, 1, 2293788, 458752, 1, 2752539, 458752, 1, 2687003, 458752, 1, 2621467, 458752, 1, 2555931, 458752, 1, 2490395, 458752, 1, 2424859, 458752, 1, 2359323, 458752, 1, 2293787, 458752, 1, 2752538, 458752, 1, 2687002, 458752, 1, 2621466, 458752, 1, 2555930, 458752, 1, 2490394, 458752, 1, 2424858, 458752, 1, 2359322, 458752, 1, 2293786, 458752, 1, 2752537, 458752, 1, 2687001, 458752, 1, 2621465, 458752, 1, 2555929, 458752, 1, 2490393, 458752, 1, 2424857, 458752, 1, 2359321, 458752, 1, 2293785, 458752, 1, 2228260, 458752, 1, 2162724, 458752, 1, 2097188, 458752, 1, 2031652, 458752, 1, 1966116, 458752, 1, 1769508, 458752, 1, 1703972, 458752, 1, 1638436, 458752, 1, 1572900, 458752, 1, 1507364, 458752, 1, 2228259, 458752, 1, 2162723, 458752, 1, 2097187, 458752, 1, 2031651, 458752, 1, 1966115, 458752, 1, 1769507, 458752, 1, 1703971, 458752, 1, 1638435, 458752, 1, 1572899, 458752, 1, 1507363, 458752, 1, 2228258, 458752, 1, 2162722, 458752, 1, 2097186, 458752, 1, 2031650, 458752, 1, 1966114, 458752, 1, 1769506, 458752, 1, 1703970, 458752, 1, 1638434, 458752, 1, 1572898, 458752, 1, 1507362, 458752, 1, 2228257, 458752, 1, 2162721, 458752, 1, 2097185, 458752, 1, 2031649, 458752, 1, 1966113, 458752, 1, 1769505, 458752, 1, 1703969, 458752, 1, 1638433, 458752, 1, 1572897, 458752, 1, 1507361, 458752, 1, 2228256, 458752, 1, 2162720, 458752, 1, 2097184, 458752, 1, 2031648, 458752, 1, 1966112, 458752, 1, 1769504, 458752, 1, 1703968, 458752, 1, 1638432, 458752, 1, 1572896, 458752, 1, 1507360, 458752, 1, 2228255, 458752, 1, 2162719, 458752, 1, 2097183, 458752, 1, 2031647, 458752, 1, 1966111, 458752, 1, 1769503, 458752, 1, 1703967, 458752, 1, 1638431, 458752, 1, 1572895, 458752, 1, 1507359, 458752, 1, 2228254, 458752, 1, 2162718, 458752, 1, 2097182, 458752, 1, 2031646, 458752, 1, 1966110, 458752, 1, 1769502, 458752, 1, 1703966, 458752, 1, 1638430, 458752, 1, 1572894, 458752, 1, 1507358, 458752, 1, 2228253, 458752, 1, 2162717, 458752, 1, 2097181, 458752, 1, 2031645, 458752, 1, 1966109, 458752, 1, 1769501, 458752, 1, 1703965, 458752, 1, 1638429, 458752, 1, 1572893, 458752, 1, 1507357, 458752, 1, 2228252, 458752, 1, 2162716, 458752, 1, 2097180, 458752, 1, 2031644, 458752, 1, 1966108, 458752, 1, 1769500, 458752, 1, 1703964, 458752, 1, 1638428, 458752, 1, 1572892, 458752, 1, 1507356, 458752, 1, 2228251, 458752, 1, 2162715, 458752, 1, 2097179, 458752, 1, 2031643, 458752, 1, 1966107, 458752, 1, 1769499, 458752, 1, 1703963, 458752, 1, 1638427, 458752, 1, 1572891, 458752, 1, 1507355, 458752, 1, 2228250, 458752, 1, 2162714, 458752, 1, 2097178, 458752, 1, 2031642, 458752, 1, 1966106, 458752, 1, 1769498, 458752, 1, 1703962, 458752, 1, 1638426, 458752, 1, 1572890, 458752, 1, 1507354, 458752, 1, 2228249, 458752, 1, 2162713, 458752, 1, 2097177, 458752, 1, 2031641, 458752, 1, 1966105, 458752, 1, 1769497, 458752, 1, 1703961, 458752, 1, 1638425, 458752, 1, 1572889, 458752, 1, 1507353, 458752, 1, 2228295, 458752, 1, 2162759, 458752, 1, 2097223, 458752, 1, 2031687, 458752, 1, 1835079, 458752, 1, 1769543, 458752, 1, 1704007, 458752, 1, 1638471, 458752, 1, 1572935, 458752, 1, 1507399, 458752, 1, 1441863, 458752, 1, 1310791, 458752, 2, 1245255, 458752, 1, 1179719, 458752, 1, 1114183, 524288, 0, 2228294, 458752, 1, 2162758, 458752, 1, 2097222, 458752, 1, 2031686, 458752, 1, 1835078, 458752, 1, 1769542, 458752, 1, 1704006, 458752, 1, 1638470, 458752, 1, 1572934, 458752, 1, 1310790, 524288, 2, 1245254, 458752, 1, 1179718, 458752, 1, 1114182, 458752, 1, 2228293, 458752, 1, 2162757, 458752, 1, 2097221, 458752, 1, 2031685, 458752, 1, 1835077, 458752, 1, 1769541, 458752, 1, 1704005, 458752, 1, 1638469, 458752, 1, 1572933, 458752, 1, 1441861, 458752, 2, 1376325, 458752, 1, 1310789, 458752, 1, 1245253, 458752, 1, 1179717, 458752, 1, 1114181, 458752, 1, 2228292, 458752, 1, 2162756, 458752, 1, 2097220, 458752, 1, 2031684, 458752, 1, 1835076, 458752, 1, 1769540, 458752, 1, 1704004, 458752, 1, 1638468, 458752, 1, 1376324, 393216, 2, 1310788, 458752, 1, 1245252, 458752, 1, 1179716, 458752, 1, 1114180, 458752, 1, 2228291, 458752, 1, 2162755, 458752, 1, 2097219, 458752, 1, 2031683, 458752, 1, 1835075, 458752, 1, 1769539, 458752, 1, 1704003, 458752, 1, 1638467, 458752, 1, 1376323, 458752, 2, 1310787, 458752, 1, 1245251, 458752, 1, 1179715, 458752, 1, 1114179, 458752, 1, 2228290, 458752, 1, 2162754, 458752, 1, 2097218, 458752, 1, 2031682, 458752, 1, 1835074, 458752, 1, 1769538, 458752, 1, 1704002, 458752, 1, 1638466, 458752, 1, 1572930, 458752, 1, 1376322, 524288, 2, 1310786, 458752, 1, 1245250, 458752, 1, 1179714, 458752, 1, 1114178, 458752, 1, 2228289, 458752, 1, 2162753, 458752, 1, 2097217, 458752, 1, 2031681, 458752, 1, 1835073, 458752, 1, 1769537, 458752, 1, 1704001, 458752, 1, 1638465, 458752, 1, 1441857, 524288, 2, 1376321, 458752, 1, 1310785, 458752, 1, 1245249, 458752, 1, 1179713, 458752, 1, 1114177, 458752, 1, 2228288, 458752, 1, 2162752, 458752, 1, 2097216, 458752, 1, 2031680, 458752, 1, 1835072, 458752, 1, 1769536, 458752, 1, 1704000, 458752, 1, 1638464, 458752, 1, 1507392, 458752, 2, 1441856, 458752, 1, 1376320, 458752, 1, 1310784, 458752, 1, 1245248, 458752, 1, 1179712, 458752, 1, 1114176, 458752, 1, 2228287, 458752, 1, 2162751, 458752, 1, 2097215, 458752, 1, 2031679, 458752, 1, 1835071, 458752, 1, 1769535, 458752, 1, 1703999, 458752, 1, 1507391, 458752, 2, 1441855, 458752, 1, 1376319, 458752, 1, 1310783, 458752, 1, 1245247, 458752, 1, 1179711, 458752, 1, 1114175, 458752, 1, 2228286, 458752, 1, 2162750, 458752, 1, 2097214, 458752, 1, 2031678, 458752, 1, 1835070, 458752, 1, 1769534, 458752, 1, 1507390, 524288, 2, 1441854, 458752, 1, 1376318, 458752, 1, 1310782, 458752, 1, 1245246, 458752, 1, 1179710, 458752, 1, 1114174, 458752, 1, 2228285, 458752, 1, 2162749, 458752, 1, 2097213, 458752, 1, 2031677, 458752, 1, 1835069, 458752, 1, 1638461, 524288, 2, 1572925, 458752, 1, 1507389, 458752, 1, 1441853, 458752, 1, 1376317, 458752, 1, 1310781, 458752, 1, 1245245, 458752, 1, 1179709, 458752, 1, 1114173, 458752, 1, 2228284, 458752, 1, 2162748, 458752, 1, 2097212, 458752, 1, 2031676, 458752, 1, 1835068, 458752, 1, 1638460, 458752, 1, 1572924, 458752, 1, 1507388, 458752, 1, 1441852, 458752, 1, 1376316, 458752, 1, 1310780, 458752, 1, 1245244, 458752, 1, 1179708, 458752, 1, 1114172, 458752, 1, 1572923, 458752, 1, 1507387, 458752, 1, 1441851, 458752, 1, 1376315, 458752, 1, 1310779, 458752, 1, 1245243, 458752, 1, 1179707, 458752, 1, 1114171, 458752, 1, 1572922, 458752, 1, 1507386, 458752, 1, 1441850, 458752, 1, 1376314, 458752, 1, 1310778, 458752, 1, 1245242, 458752, 1, 1179706, 458752, 1, 1114170, 458752, 1, 1572921, 458752, 1, 1507385, 458752, 1, 1441849, 458752, 1, 1376313, 458752, 1, 1310777, 458752, 1, 1245241, 458752, 1, 1179705, 458752, 1, 1114169, 458752, 1, 1572920, 458752, 1, 1507384, 458752, 1, 1441848, 458752, 1, 1376312, 458752, 1, 1310776, 458752, 1, 1245240, 458752, 1, 1179704, 458752, 1, 1114168, 458752, 1, 1572919, 458752, 1, 1507383, 458752, 1, 1441847, 458752, 1, 1376311, 458752, 1, 1310775, 458752, 1, 1245239, 458752, 1, 1179703, 458752, 1, 1114167, 458752, 1, 1572918, 458752, 1, 1507382, 458752, 1, 1441846, 458752, 1, 1376310, 458752, 1, 1310774, 458752, 1, 1245238, 458752, 1, 1179702, 458752, 1, 1114166, 458752, 1, 1572917, 458752, 1, 1507381, 458752, 1, 1441845, 458752, 1, 1376309, 458752, 1, 1310773, 458752, 1, 1245237, 458752, 1, 1179701, 458752, 1, 1114165, 458752, 1, 1572916, 458752, 1, 1507380, 458752, 1, 1441844, 458752, 1, 1376308, 458752, 1, 1310772, 458752, 1, 1245236, 458752, 1, 1179700, 458752, 1, 1114164, 458752, 1, 1572915, 458752, 1, 1507379, 458752, 1, 1441843, 458752, 1, 1376307, 458752, 1, 1310771, 458752, 1, 1245235, 458752, 1, 1179699, 458752, 1, 1114163, 458752, 1, 1572912, 524288, 2, 1507376, 458752, 1, 1441840, 458752, 1, 1376304, 458752, 1, 1310768, 458752, 1, 1245232, 458752, 1, 1179696, 458752, 1, 1114160, 458752, 1, 1572911, 458752, 1, 1507375, 458752, 1, 1441839, 458752, 1, 1376303, 458752, 1, 1310767, 458752, 1, 1245231, 458752, 1, 1179695, 458752, 1, 1114159, 458752, 1, 1572910, 458752, 1, 1507374, 458752, 1, 1441838, 458752, 1, 1376302, 458752, 1, 1310766, 458752, 1, 1245230, 458752, 1, 1179694, 458752, 1, 1114158, 458752, 1, 1572909, 458752, 1, 1507373, 458752, 1, 1441837, 458752, 1, 1376301, 458752, 1, 1310765, 458752, 1, 1245229, 458752, 1, 1179693, 458752, 1, 1114157, 458752, 1, 1572908, 393216, 2, 1507372, 458752, 1, 1441836, 458752, 1, 1376300, 458752, 1, 1310764, 458752, 1, 1245228, 458752, 1, 1179692, 458752, 1, 1114156, 458752, 1, 1572907, 524288, 2, 1507371, 458752, 1, 1441835, 458752, 1, 1376299, 458752, 1, 1310763, 458752, 1, 1245227, 458752, 1, 1179691, 458752, 1, 1114155, 458752, 1, 1572906, 458752, 1, 1507370, 458752, 1, 1441834, 458752, 1, 1376298, 458752, 1, 1310762, 458752, 1, 1245226, 458752, 1, 1179690, 458752, 1, 1114154, 458752, 1, 1572905, 458752, 1, 1507369, 458752, 1, 1441833, 458752, 1, 1376297, 458752, 1, 1310761, 458752, 1, 1245225, 458752, 1, 1179689, 458752, 1, 1114153, 458752, 1, 1572904, 393216, 2, 1507368, 393216, 0, 1441832, 393216, 2, 1376296, 458752, 1, 1310760, 458752, 1, 1245224, 458752, 1, 1179688, 458752, 1, 1114152, 393216, 1, 1376295, 393216, 2, 1310759, 458752, 1, 1245223, 458752, 1, 1179687, 393216, 0, 1507366, 524288, 1, 1310758, 393216, 2, 1245222, 393216, 0, 1572901, 458752, 1, 1507365, 458752, 1, 1441829, 524288, 0, 1114149, 458752, 1, 1572869, 524288, 2, 1507333, 458752, 1, 1572868, 458752, 1, 1507332, 458752, 1, 1572867, 458752, 1, 1507331, 458752, 1, 1572866, 458752, 1, 1507330, 458752, 1, 1572865, 458752, 1, 1507329, 458752, 1, 1572864, 458752, 1, 1507328, 458752, 1, 1638399, 458752, 1, 1572863, 458752, 1, 1638398, 458752, 1, 1572862, 458752, 1, 1638397, 458752, 1, 1572861, 458752, 1, 1638396, 458752, 1, 1572860, 458752, 1, 1638395, 458752, 1, 1572859, 458752, 1, 1638394, 458752, 1, 1572858, 458752, 1, 1638393, 458752, 1, 1572857, 458752, 1, 1638392, 458752, 1, 1572856, 458752, 1, 1638391, 458752, 1, 1572855, 458752, 1, 1638390, 458752, 1, 1572854, 458752, 1, 1638389, 458752, 1, 1572853, 458752, 1, 1638388, 393216, 2, 1572852, 458752, 1, 1572876, 524288, 2, 1507340, 458752, 1, 1572875, 458752, 1, 1507339, 458752, 1, 1572874, 393216, 2, 1507338, 458752, 1, 1572888, 458752, 1, 1507352, 458752, 1, 1572887, 458752, 1, 1507351, 458752, 1, 1572886, 524288, 2, 1507350, 458752, 1, 1572885, 458752, 1, 1507349, 458752, 1, 1572884, 458752, 1, 1507348, 458752, 1, 1572883, 458752, 1, 1507347, 458752, 1, 1572882, 458752, 1, 1507346, 458752, 1, 1572881, 393216, 2, 1507345, 458752, 1, 2752536, 458752, 1, 2687000, 458752, 1, 2621464, 458752, 1, 2555928, 458752, 1, 2490392, 458752, 1, 2424856, 458752, 1, 2359320, 458752, 1, 2293784, 458752, 1, 2228248, 458752, 1, 2162712, 458752, 1, 2097176, 458752, 1, 2031640, 458752, 1, 1966104, 458752, 1, 1900568, 458752, 1, 1835032, 458752, 1, 1769496, 458752, 1, 1703960, 458752, 1, 1638424, 458752, 1, 2752535, 393216, 2, 2686999, 458752, 1, 2621463, 458752, 1, 2555927, 458752, 1, 2490391, 458752, 1, 2424855, 458752, 1, 2359319, 458752, 1, 2293783, 458752, 1, 2228247, 458752, 1, 2162711, 458752, 1, 2097175, 458752, 1, 2031639, 458752, 1, 1966103, 458752, 1, 1900567, 458752, 1, 1835031, 458752, 1, 1769495, 458752, 1, 1703959, 458752, 1, 1638423, 458752, 1, 1572902, 524288, 0, 1638438, 524288, 2, 1703973, 524288, 2, 1638437, 458752, 1, 1638440, 393216, 1, 1703976, 458752, 0, 1769512, 393216, 2, 1835049, 458752, 2, 1769513, 524288, 0, 1769514, 458752, 2, 1703978, 524288, 0, 1703977, 393216, 2, 1638441, 458752, 1, 1638442, 524288, 2, 1376293, 524288, 1, 1310757, 524288, 1, 1245221, 524288, 1, 1179685, 524288, 2, 1114150, 524288, 2, 1703995, 458752, 1, 1703994, 393216, 2, 1703993, 327680, 0, 1703992, 524288, 0, 1769528, 524288, 2, 1769527, 458752, 1, 1769526, 393216, 2, 1703990, 458752, 1, 1703989, 393216, 2, 1638453, 458752, 1, 1638452, 458752, 1, 1638451, 458752, 1, 1638450, 458752, 1, 1703986, 458752, 1, 1769523, 524288, 2, 1703987, 458752, 1, 1769522, 458752, 1, 1835058, 458752, 1, 1900594, 458752, 1, 1966130, 458752, 1, 1966129, 458752, 1, 2031665, 393216, 2, 2097201, 393216, 2, 2162738, 393216, 2, 2162739, 524288, 0, 2228275, 458752, 1, 2228276, 524288, 0, 2097202, 524288, 0, 2031666, 524288, 2, 1900593, 458752, 1, 1835057, 458752, 1, 1769521, 393216, 0, 1638455, 458752, 1, 1703991, 458752, 1, 1638454, 458752, 1, 1638456, 524288, 2, 1638457, 393216, 2, 1638458, 458752, 1, 1638459, 458752, 1, 1966139, 524288, 0, 1966138, 458752, 1, 1966137, 393216, 0, 2031673, 458752, 1, 2031672, 393216, 0, 2097208, 458752, 1, 2097207, 393216, 0, 2162744, 458752, 1, 2162743, 393216, 2, 2228279, 393216, 0, 2228280, 458752, 1, 2228281, 458752, 1, 2162745, 458752, 1, 2097209, 458752, 1, 2031674, 458752, 1, 2031675, 458752, 1, 2097211, 458752, 1, 2162747, 458752, 1, 2162746, 458752, 1, 2228282, 458752, 1, 2228283, 458752, 1, 2097210, 458752, 1, 1900602, 524288, 0, 1835066, 393216, 1, 1835067, 524288, 0, 1900603, 458752, 2, 1638445, 393216, 2, 1638446, 458752, 1, 1703982, 524288, 2, 1769518, 524288, 0, 1769517, 393216, 0, 1835053, 393216, 2, 1900588, 393216, 1, 1900589, 458752, 1, 1966125, 393216, 2, 1966126, 524288, 2, 1900590, 524288, 0, 1835054, 524288, 2, 1703983, 524288, 2, 1638447, 458752, 1, 2228269, 524288, 0, 2228268, 458752, 1, 2162732, 524288, 0, 2162731, 458752, 1, 2097195, 524288, 0, 2097194, 458752, 1, 2097193, 458752, 1, 2031657, 524288, 0, 2031656, 393216, 0, 2097191, 393216, 0, 2097192, 458752, 1, 2162728, 458752, 1, 2162727, 393216, 2, 2228263, 393216, 0, 2228264, 458752, 1, 2228265, 458752, 1, 2162730, 458752, 1, 2228266, 458752, 1, 2228267, 458752, 1, 2162729, 458752, 1, 2031658, 458752, 0, 2228274, 393216, 0, 2228271, 393216, 0, 2228272, 524288, 0, 2228273, 458752, 0, 2228270, 458752, 0, 2228262, 524288, 0, 2162725, 524288, 0, 2228261, 458752, 1, 2162737, 262144, 2, 2162742, 327680, 0, 2228278, 458752, 0, 2228277, 458752, 0, 1769525, 262144, 2, 2097203, 262144, 2, 2162740, 262144, 2, 2097204, 327680, 0, 2031667, 262144, 2, 1966131, 524288, 1, 1900595, 524288, 1, 1835059, 524288, 1, 1703988, 524288, 2, 1835063, 458752, 2, 1900601, 393216, 1, 1835056, 393216, 1, 1900592, 393216, 1, 1966128, 393216, 1, 1769509, 524288, 0, 1835046, 524288, 0, 1900583, 524288, 1, 2031655, 524288, 2, 2097190, 458752, 2, 2097189, 524288, 2, 1966119, 524288, 0, 2031654, 458752, 1, 2031653, 458752, 1, 1966117, 458752, 1, 1966118, 458752, 1, 1900582, 458752, 1, 1900581, 458752, 1, 1835045, 458752, 1, 1966122, 327680, 0, 2162726, 262144, 2, 1769515, 262144, 2, 1703980, 327680, 0, 1769516, 327680, 0, 1703981, 393216, 1, 1703985, 393216, 1, 1638449, 393216, 1, 1638448, 524288, 1, 327735, 524288, 3, 327736, 589824, 6, 327737, 589824, 3, 327738, 589824, 6, 327739, 589824, 3, 393271, 524288, 4, 458807, 524288, 4, 393273, 720896, 8, 458810, 589824, 8, 393272, 720896, 10, 458811, 589824, 8, 458809, 589824, 8, 458808, 589824, 8, 393274, 196609, 6, 393275, 196609, 5, 327732, 720896, 8, 393269, 720896, 8, 458802, 655361, 6, 458806, 655361, 6, 458805, 196609, 6, 393270, 196609, 5, 458803, 196609, 5, 327730, 655360, 6, 1703996, 524288, 2, 1441862, 393216, 1, 1376327, 458752, 0, 1376326, 524288, 1, 1572931, 524288, 0, 1572932, 393216, 0, 1572926, 524288, 1) -layer_2/name = "Overlay" -layer_2/z_index = 100 -layer_2/tile_data = PackedInt32Array(589838, 524288, 7, 786440, 262144, 0, 786439, 262144, 0, 917513, 262144, 0, 851972, 262144, 0, 786434, 262144, 0, 917507, 262144, 0, 851983, 262144, 0, 589836, 262144, 0, 589834, 262144, 0, 851989, 262144, 0, 524312, 262144, 0, 327683, 262144, 0, 65554, 262144, 0, 131088, 262144, 0, 20, 262144, 0, 589831, 196608, 5, 655360, 458752, 0, 1703982, 393216, 2, 1835053, 393216, 0, 2031665, 393216, 0, 1835067, 393216, 0, 327738, 196609, 5, 393269, 196609, 5, 1507397, 458752, 0, 1507394, 458752, 0, 1572929, 393216, 0, 1638463, 393216, 0, 1703998, 393216, 0, 1769533, 393216, 0, 1769532, 458752, 0, 1572928, 458752, 0, 1507398, 393216, 0) - -[node name="PlayerCursor" type="TileMap" parent="Field/Terrain"] -tile_set = SubResource("TileSet_uvju2") -format = 2 -script = ExtResource("5_3guor") -gameboard = ExtResource("6_kd8tv") +script = ExtResource("2_la2p5") +gameboard_properties = ExtResource("3_esa52") -[node name="PlayerPathDestinationMarker" type="Sprite2D" parent="Field/Terrain"] -visible = false -modulate = Color(0.909804, 0.270588, 0.215686, 0.705882) -texture = ExtResource("13_osl4o") -script = ExtResource("14_0j4ru") -gameboard = ExtResource("6_kd8tv") +[node name="Player" parent="Field/Map" instance=ExtResource("11_yntrj")] +position = Vector2(24.0001, 216) +animation_scene = ExtResource("12_oablq") +move_speed = 96.0 +metadata/_edit_group_ = true -[node name="Gamepieces" type="Node2D" parent="Field/Terrain"] +[node name="Town" type="Node2D" parent="Field/Map"] y_sort_enabled = true +metadata/_edit_lock_ = true -[node name="Player" parent="Field/Terrain/Gamepieces" instance=ExtResource("11_yntrj")] -position = Vector2(24, 200) -gameboard = ExtResource("6_kd8tv") -blocks_movement = true -move_speed = 96.0 -metadata/_edit_group_ = true +[node name="Ground" type="TileMapLayer" parent="Field/Map/Town"] +tile_map_data = PackedByteArray("AAAkABAAAAAAAAAAAAAkAA8AAAAAAAAAAAAkAA4AAAAAAAAAAAAkAA0AAAAAAAAAAAAkAAwAAAAAAAAAAAAkAAsAAAAAAAAAAAAkAAoAAAAAAAAAAAAkAAkAAAAAAAAAAAAkAAgAAAAAAAAAAAAkAAcAAAAAAAAAAAAkAAYAAAAAAAAAAAAkAAUAAAAAAAAAAAAkAAQAAAAAAAAAAAAkAAMAAAAAAAAAAAAkAAIAAAACAAAAAAAkAAEAAAAAAAAAAAAkAAAAAAAAAAAAAAAkAP//AAAAAAAAAAAkAP7/AAAAAAAAAAAkAP3/AAAAAAAAAAAkAPz/AAAAAAAAAAAkAPv/AAAAAAAAAAAkAPr/AAAAAAAAAAAkAPn/AAAAAAAAAAAkAPj/AAAAAAAAAAAjABAAAAAAAAAAAAAjAA8AAAAAAAAAAAAjAA4AAAAAAAAAAAAjAA0AAAAAAAAAAAAjAAwAAAAAAAAAAAAjAAsAAAAAAAAAAAAjAAoAAAAAAAAAAAAjAAkAAAAAAAAAAAAjAAgAAAAAAAAAAAAjAAcAAAAAAAAAAAAjAAYAAAAAAAAAAAAjAAUAAAAAAAAAAAAjAAQAAAAAAAAAAAAjAAMAAAAAAAAAAAAjAAIAAAAAAAAAAAAjAAEAAAAAAAAAAAAjAAAAAAAAAAAAAAAjAP//AAAAAAAAAAAjAP7/AAAAAAAAAAAjAP3/AAAAAAAAAAAjAPz/AAAAAAAAAAAjAPv/AAAAAAAAAAAjAPr/AAAAAAAAAAAjAPn/AAAAAAAAAAAjAPj/AAAAAAAAAAAiABAAAAAAAAAAAAAiAA8AAAAAAAAAAAAiAA4AAAAAAAAAAAAiAA0AAAAAAAAAAAAiAAwAAAAAAAAAAAAiAAsAAAAAAAAAAAAiAAoAAAAAAAAAAAAiAAkAAAAAAAAAAAAiAAgAAAAAAAAAAAAiAAcAAAAAAAAAAAAiAAYAAAAAAAAAAAAiAAUAAAAAAAAAAAAiAAQAAAAAAAAAAAAiAAMAAAAAAAAAAAAiAAIAAAAAAAAAAAAiAAEAAAAAAAAAAAAiAAAAAAAAAAAAAAAiAP//AAAAAAAAAAAiAP7/AAAAAAAAAAAiAP3/AAAAAAAAAAAiAPz/AAACAAAAAAAiAPv/AAAAAAAAAAAiAPr/AAAAAAAAAAAiAPn/AAAAAAAAAAAiAPj/AAAAAAAAAAAhABAAAAAAAAAAAAAhAA8AAAAAAAAAAAAhAA4AAAAAAAAAAAAhAA0AAAAAAAAAAAAhAAwAAAAAAAAAAAAhAAsAAAAAAAAAAAAhAAoAAAAAAAAAAAAhAAkAAAAAAAAAAAAhAAgAAAAAAAAAAAAhAAcAAAAAAAAAAAAhAAYAAAAAAAAAAAAhAAUAAAAAAAAAAAAhAAQAAAAAAAAAAAAhAAMAAAACAAAAAAAhAAIAAAAAAAAAAAAhAAEAAAAAAAAAAAAhAAAAAAAAAAAAAAAhAP//AAAAAAAAAAAhAP7/AAAAAAAAAAAhAP3/AAAAAAAAAAAhAPz/AAAAAAAAAAAhAPv/AAAAAAAAAAAhAPr/AAAAAAAAAAAhAPn/AAABAAAAAAAhAPj/AAAAAAAAAAAgABAAAAAAAAAAAAAgAA8AAAAAAAAAAAAgAA4AAAAAAAAAAAAgAA0AAAAAAAAAAAAgAAwAAAAAAAAAAAAgAAsAAAAAAAAAAAAgAAoAAAAAAAAAAAAgAAkAAAAAAAAAAAAgAAgAAAAAAAAAAAAgAAcAAAAAAAAAAAAgAAYAAAAAAAAAAAAgAAUAAAAAAAAAAAAgAAQAAAAAAAAAAAAgAAMAAAAAAAAAAAAgAAIAAAAAAAAAAAAgAAEAAAAAAAAAAAAgAAAAAAAAAAAAAAAgAP//AAAAAAAAAAAgAP7/AAAAAAAAAAAgAP3/AAAAAAAAAAAgAPz/AAAAAAAAAAAgAPv/AAAAAAAAAAAgAPr/AAAAAAAAAAAgAPn/AAAAAAAAAAAgAPj/AAAAAAAAAAAfABAAAAAAAAAAAAAfAA8AAAAAAAAAAAAfAA4AAAAAAAAAAAAfAA0AAAAAAAAAAAAfAAwAAAAAAAAAAAAfAAsAAAAAAAAAAAAfAAoAAAAAAAAAAAAfAAkAAAAAAAAAAAAfAAgAAAAAAAAAAAAfAAcAAAAAAAAAAAAfAAYAAAAAAAAAAAAfAAUAAAAAAAAAAAAfAAQAAAAAAAAAAAAfAAMAAAAAAAAAAAAfAAIAAAAAAAAAAAAfAAEAAAAAAAAAAAAfAAAAAAAAAAAAAAAfAP//AAAAAAAAAAAfAP7/AAAAAAAAAAAfAP3/AAAAAAAAAAAfAPz/AAAAAAAAAAAfAPv/AAAAAAAAAAAfAPr/AAAAAAAAAAAfAPn/AAAAAAAAAAAfAPj/AAAAAAAAAAAeABAAAAAAAAAAAAAeAA8AAAAAAAAAAAAeAA4AAAAAAAAAAAAeAA0AAAAAAAAAAAAeAAwAAAAAAAAAAAAeAAsAAAABAAAAAAAeAAoAAAAAAAAAAAAeAAkAAAAAAAAAAAAeAAgAAAAAAAAAAAAeAAcAAAABAAAAAAAeAAYAAAAAAAAAAAAeAAUAAAAAAAAAAAAeAAQAAAAAAAAAAAAeAAMAAAAAAAAAAAAeAAIAAAAAAAAAAAAeAAEAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAP//AAAAAAAAAAAeAP7/AAAAAAAAAAAeAP3/AAAAAAAAAAAeAPz/AAAAAAAAAAAeAPv/AAAAAAAAAAAeAPr/AAAAAAAAAAAeAPn/AAAAAAAAAAAeAPj/AAAAAAAAAAAdABAAAAAAAAAAAAAdAA8AAAAAAAAAAAAdAA4AAAAAAAAAAAAdAA0AAAAAAAAAAAAdAAwAAAAAAAAAAAAdAAsAAAAAAAAAAAAdAAoAAAAAAAAAAAAdAAkAAAABAAAAAAAdAAgAAAAAAAAAAAAdAAcAAAAAAAAAAAAdAAYAAAAAAAAAAAAdAAUAAAAAAAAAAAAdAAQAAAAAAAAAAAAdAAMAAAAAAAAAAAAdAAIAAAAAAAAAAAAdAAEAAAAAAAAAAAAdAAAAAAACAAAAAAAdAP//AAABAAAAAAAdAP7/AAAAAAAAAAAdAP3/AAAAAAAAAAAdAPz/AAAAAAAAAAAdAPv/AAAAAAAAAAAdAPr/AAAAAAAAAAAdAPn/AAACAAAAAAAdAPj/AAAAAAAAAAAcABAAAAAAAAAAAAAcAA8AAAAAAAAAAAAcAA4AAAAAAAAAAAAcAA0AAAAAAAAAAAAcAAwAAAAAAAAAAAAcAAsAAAAAAAAAAAAcAAoAAAAAAAAAAAAcAAkAAAAAAAAAAAAcAAgAAAAAAAAAAAAcAAcAAAAAAAAAAAAcAAYAAAAAAAAAAAAcAAUAAAAAAAAAAAAcAAQAAAAAAAAAAAAcAAMAAAAAAAAAAAAcAAIAAAAAAAAAAAAcAAEAAAAAAAAAAAAcAAAAAAAAAAAAAAAcAP//AAAAAAAAAAAcAP7/AAAAAAAAAAAcAP3/AAAAAAAAAAAcAPz/AAAAAAAAAAAcAPv/AAAAAAAAAAAcAPr/AAAAAAAAAAAcAPn/AAAAAAAAAAAcAPj/AAAAAAAAAAAbABAAAAAAAAAAAAAbAA8AAAAAAAAAAAAbAA4AAAAAAAAAAAAbAA0AAAAAAAAAAAAbAAwAAAAAAAAAAAAbAAsAAAAAAAAAAAAbAAoAAAAAAAAAAAAbAAkAAAAAAAAAAAAbAAgAAAAAAAAAAAAbAAcAAAAAAAAAAAAbAAYAAAAAAAAAAAAbAAUAAAAAAAAAAAAbAAQAAAAAAAAAAAAbAAMAAAAAAAAAAAAbAAIAAAAAAAAAAAAbAAEAAAAAAAAAAAAbAAAAAAAAAAAAAAAbAP//AAAAAAAAAAAbAP7/AAAAAAAAAAAbAP3/AAAAAAAAAAAbAPz/AAAAAAAAAAAbAPv/AAAAAAAAAAAbAPr/AAAAAAAAAAAbAPn/AAAAAAAAAAAbAPj/AAAAAAAAAAAaABAAAAAAAAAAAAAaAA8AAAAAAAAAAAAaAA4AAAAAAAAAAAAaAA0AAAAAAAAAAAAaAAwAAAAAAAAAAAAaAAsAAAAAAAAAAAAaAAoAAAAAAAAAAAAaAAkAAAAAAAAAAAAaAAgAAAAAAAAAAAAaAAcAAAABAAAAAAAaAAYAAAAAAAAAAAAaAAUAAAAAAAAAAAAaAAQAAAAAAAAAAAAaAAMAAAAAAAAAAAAaAAIAAAAAAAAAAAAaAAEAAAAAAAAAAAAaAAAAAAAAAAAAAAAaAP//AAAAAAAAAAAaAP7/AAAAAAAAAAAaAP3/AAAAAAAAAAAaAPz/AAAAAAAAAAAaAPv/AAAAAAAAAAAaAPr/AAAAAAAAAAAaAPn/AAAAAAAAAAAaAPj/AAAAAAAAAAAZABAAAAABAAAAAAAZAA8AAAAAAAAAAAAZAA4AAAAAAAAAAAAZAA0AAAAAAAAAAAAZAAwAAAAAAAAAAAAZAAsAAAAAAAAAAAAZAAoAAAAAAAAAAAAZAAkAAAAAAAAAAAAZAAgAAAAAAAAAAAAZAAcAAAACAAAAAAAZAAYAAAABAAAAAAAZAAUAAAAAAAAAAAAZAAQAAAAAAAAAAAAZAAMAAAAAAAAAAAAZAAIAAAAAAAAAAAAZAAEAAAAAAAAAAAAZAAAAAAAAAAAAAAAZAP//AAAAAAAAAAAZAP7/AAAAAAAAAAAZAP3/AAAAAAAAAAAZAPz/AAAAAAAAAAAZAPv/AAAAAAAAAAAZAPr/AAAAAAAAAAAZAPn/AAAAAAAAAAAZAPj/AAAAAAAAAAAYABAAAAABAAAAAAAYAA8AAAAAAAAAAAAYAA4AAAAAAAAAAAAYAA0AAAAAAAAAAAAYAAwAAAACAAMAAAAYAAsAAAACAAIAAAAYAAoAAAACAAEAAAAYAAkAAAAAAAAAAAAYAAgAAAABAAAAAAAYAAcAAAACAAAAAAAYAAYAAAAAAAAAAAAYAAUAAAABAAAAAAAYAAQAAAAAAAAAAAAYAAMAAAAAAAAAAAAYAAIAAAAAAAAAAAAYAAEAAAAAAAAAAAAYAAAAAAAAAAAAAAAYAP//AAAAAAAAAAAYAP7/AAAAAAAAAAAYAP3/AAAAAAAAAAAYAPz/AAAAAAAAAAAYAPv/AAAAAAAAAAAYAPr/AAAAAAAAAAAYAPn/AAAAAAAAAAAYAPj/AAAAAAAAAAAXABAAAAAAAAAAAAAXAA8AAAAAAAAAAAAXAA4AAAACAAAAAAAXAA0AAAAAAAAAAAAXAAwAAAAAAAMAAAAXAAsAAAAGAAMAAAAXAAoAAAAEAAMAAAAXAAkAAAACAAIAAAAXAAgAAAACAAEAAAAXAAcAAAAAAAAAAAAXAAYAAAACAAAAAAAXAAUAAAAAAAAAAAAXAAQAAAAAAAAAAAAXAAMAAAAAAAAAAAAXAAIAAAAAAAAAAAAXAAEAAAAAAAAAAAAXAAAAAAAAAAAAAAAXAP//AAAAAAAAAAAXAP7/AAAAAAAAAAAXAP3/AAAAAAAAAAAXAPz/AAAAAAAAAAAXAPv/AAAAAAAAAAAXAPr/AAAAAAAAAAAXAPn/AAAAAAAAAAAXAPj/AAAAAAAAAAAWABgAAAAAAAAAAAAWABcAAAAAAAAAAAAWABYAAAAAAAAAAAAWABUAAAAAAAAAAAAWABQAAAAAAAAAAAAWABMAAAAAAAAAAAAWABIAAAAAAAAAAAAWABEAAAAAAAAAAAAWABAAAAAAAAAAAAAWAA8AAAAAAAAAAAAWAA4AAAAAAAAAAAAWAA0AAAAAAAAAAAAWAAwAAAAAAAAAAAAWAAsAAAAAAAMAAAAWAAoAAAAAAAIAAAAWAAkAAAAGAAMAAAAWAAgAAAAEAAMAAAAWAAcAAAACAAEAAAAWAAYAAAAAAAAAAAAWAAUAAAAAAAAAAAAWAAQAAAACAAAAAAAWAAMAAAAAAAAAAAAWAAIAAAAAAAAAAAAWAAEAAAAAAAAAAAAWAAAAAAAAAAAAAAAWAP//AAAAAAAAAAAWAP7/AAAAAAAAAAAWAP3/AAAAAAAAAAAWAPz/AAAAAAAAAAAWAPv/AAAAAAAAAAAWAPr/AAAAAAAAAAAWAPn/AAAAAAAAAAAWAPj/AAAAAAAAAAAVABgAAAAAAAAAAAAVABcAAAAAAAAAAAAVABYAAAAAAAAAAAAVABUAAAAAAAAAAAAVABQAAAAAAAAAAAAVABMAAAAAAAAAAAAVABIAAAAAAAAAAAAVABEAAAAAAAAAAAAVABAAAAAAAAAAAAAVAA8AAAAAAAAAAAAVAA4AAAAAAAAAAAAVAA0AAAAAAAAAAAAVAAwAAAAAAAAAAAAVAAsAAAAAAAAAAAAVAAoAAAACAAAAAAAVAAkAAAAAAAMAAAAVAAgAAAAAAAIAAAAVAAcAAAAAAAEAAAAVAAYAAAAAAAAAAAAVAAUAAAAAAAAAAAAVAAQAAAAAAAAAAAAVAAMAAAAAAAAAAAAVAAIAAAAAAAAAAAAVAAEAAAAAAAAAAAAVAAAAAAAAAAAAAAAVAP//AAAAAAAAAAAVAP7/AAAAAAAAAAAVAP3/AAAAAAAAAAAVAPz/AAAAAAAAAAAVAPv/AAABAAAAAAAVAPr/AAAAAAAAAAAVAPn/AAAAAAAAAAAVAPj/AAAAAAAAAAAUABgAAAACAAAAAAAUABcAAAAAAAAAAAAUABYAAAAAAAAAAAAUABUAAAAAAAAAAAAUABQAAAAAAAAAAAAUABMAAAAAAAAAAAAUABIAAAAAAAAAAAAUABEAAAAAAAAAAAAUABAAAAAAAAAAAAAUAA8AAAAAAAAAAAAUAA4AAAAAAAAAAAAUAA0AAAABAAAAAAAUAAwAAAAAAAAAAAAUAAsAAAAAAAAAAAAUAAoAAAAAAAAAAAAUAAkAAAABAAAAAAAUAAgAAAAAAAAAAAAUAAcAAAAAAAAAAAAUAAYAAAAAAAAAAAAUAAUAAAAAAAAAAAAUAAQAAAAAAAAAAAAUAAMAAAABAAAAAAAUAAIAAAABAAAAAAAUAAEAAAAAAAAAAAAUAAAAAAAAAAAAAAAUAP//AAABAAAAAAAUAP7/AAAAAAAAAAAUAP3/AAAAAAAAAAAUAPz/AAAAAAAAAAAUAPv/AAAAAAAAAAAUAPr/AAAAAAAAAAAUAPn/AAAAAAAAAAAUAPj/AAAAAAAAAAATABgAAAAAAAAAAAATABcAAAAAAAAAAAATABYAAAAAAAAAAAATABUAAAAAAAAAAAATABQAAAAAAAAAAAATABMAAAAAAAAAAAATABIAAAAAAAAAAAATABEAAAAAAAAAAAATABAAAAAAAAAAAAATAA8AAAAAAAAAAAATAA4AAAAAAAAAAAATAA0AAAABAAAAAAATAAwAAAAAAAAAAAATAAsAAAACAAAAAAATAAoAAAACAAMAAAATAAkAAAACAAEAAAATAAgAAAAHAAMAAAATAAcAAAAHAAMAAAATAAYAAAAAAAAAAAATAAUAAAAAAAAAAAATAAQAAAACAAAAAAATAAMAAAAAAAAAAAATAAIAAAAAAAAAAAATAAEAAAABAAAAAAATAAAAAAACAAAAAAATAP//AAABAAAAAAATAP7/AAAAAAAAAAATAP3/AAAAAAAAAAATAPz/AAAAAAAAAAATAPv/AAAAAAAAAAATAPr/AAAAAAAAAAATAPn/AAAAAAAAAAATAPj/AAAAAAAAAAASABgAAAAAAAAAAAASABcAAAAAAAAAAAASABYAAAACAAAAAAASABUAAAAAAAAAAAASABQAAAAAAAAAAAASABMAAAAAAAAAAAASABIAAAAAAAAAAAASABEAAAAAAAAAAAASABAAAAAAAAAAAAASAA8AAAAAAAAAAAASAA4AAAAAAAAAAAASAA0AAAAAAAAAAAASAAwAAAAHAAMAAAASAAsAAAACAAMAAAASAAoAAAAFAAMAAAASAAkAAAABAAEAAAASAAgAAAAHAAMAAAASAAcAAAAAAAAAAAASAAYAAAAAAAAAAAASAAUAAAAAAAAAAAASAAQAAAAAAAAAAAASAAMAAAAAAAAAAAASAAIAAAAAAAAAAAASAAEAAAAAAAAAAAASAAAAAAAAAAAAAAASAP//AAABAAAAAAASAP7/AAAAAAAAAAASAP3/AAAAAAAAAAASAPz/AAAAAAAAAAASAPv/AAAAAAAAAAASAPr/AAAAAAAAAAASAPn/AAAAAAAAAAASAPj/AAAAAAAAAAARABgAAAACAAAAAAARABcAAAAAAAAAAAARABYAAAAAAAAAAAARABUAAAAAAAAAAAARABQAAAAAAAAAAAARABMAAAACAAAAAAARABIAAAAAAAAAAAARABEAAAAAAAAAAAARABAAAAAAAAAAAAARAA8AAAAAAAAAAAARAA4AAAAAAAAAAAARAA0AAAAAAAAAAAARAAwAAAAHAAMAAAARAAsAAAABAAMAAAARAAoAAAABAAIAAAARAAkAAAABAAEAAAARAAgAAAAHAAMAAAARAAcAAAAAAAAAAAARAAYAAAAAAAAAAAARAAUAAAABAAAAAAARAAQAAAAAAAAAAAARAAMAAAAAAAAAAAARAAIAAAAAAAAAAAARAAEAAAAAAAAAAAARAAAAAAABAAAAAAARAP//AAAAAAAAAAARAP7/AAAAAAAAAAARAP3/AAAAAAAAAAARAPz/AAAAAAAAAAARAPv/AAAAAAAAAAARAPr/AAAAAAAAAAARAPn/AAAAAAAAAAARAPj/AAAAAAAAAAAQABgAAAAAAAAAAAAQABcAAAAAAAAAAAAQABYAAAAAAAAAAAAQABUAAAAAAAAAAAAQABQAAAAAAAAAAAAQABMAAAAAAAAAAAAQABIAAAAAAAAAAAAQABEAAAAAAAAAAAAQABAAAAAAAAAAAAAQAA8AAAAAAAAAAAAQAA4AAAAAAAAAAAAQAA0AAAACAAAAAAAQAAwAAAAHAAMAAAAQAAsAAAAAAAMAAAAQAAoAAAAAAAIAAAAQAAkAAAAAAAEAAAAQAAgAAAAHAAMAAAAQAAcAAAAAAAAAAAAQAAYAAAACAAAAAAAQAAUAAAAAAAAAAAAQAAQAAAAAAAAAAAAQAAMAAAAAAAAAAAAQAAIAAAACAAAAAAAQAAEAAAABAAAAAAAQAAAAAAAAAAAAAAAQAP//AAABAAAAAAAQAP7/AAAAAAAAAAAQAP3/AAAAAAAAAAAQAPz/AAAAAAAAAAAQAPv/AAAAAAAAAAAQAPr/AAAAAAAAAAAQAPn/AAAAAAAAAAAQAPj/AAAAAAAAAAAPABgAAAAAAAAAAAAPABcAAAAAAAAAAAAPABYAAAACAAAAAAAPABUAAAAAAAAAAAAPABQAAAAAAAAAAAAPABMAAAAAAAAAAAAPABIAAAAAAAAAAAAPABEAAAAAAAAAAAAPABAAAAAAAAAAAAAPAA8AAAAAAAAAAAAPAA4AAAAAAAAAAAAPAA0AAAAAAAAAAAAPAAwAAAAHAAMAAAAPAAsAAAAHAAMAAAAPAAoAAAAHAAMAAAAPAAkAAAAHAAMAAAAPAAgAAAAHAAMAAAAPAAcAAAAAAAAAAAAPAAYAAAAAAAAAAAAPAAUAAAAAAAAAAAAPAAQAAAAAAAAAAAAPAAMAAAAAAAAAAAAPAAIAAAAAAAAAAAAPAAEAAAAAAAAAAAAPAAAAAAABAAAAAAAPAP//AAAAAAAAAAAPAP7/AAACAAAAAAAPAP3/AAAAAAAAAAAPAPz/AAAAAAAAAAAPAPv/AAABAAAAAAAPAPr/AAAAAAAAAAAPAPn/AAAAAAAAAAAPAPj/AAAAAAAAAAAOABgAAAAAAAAAAAAOABcAAAAAAAAAAAAOABYAAAAAAAAAAAAOABUAAAACAAMAAAAOABQAAAACAAEAAAAOABMAAAAAAAAAAAAOABIAAAACAAAAAAAOABEAAAAAAAAAAAAOABAAAAAAAAAAAAAOAA8AAAAAAAAAAAAOAA4AAAAAAAAAAAAOAA0AAAAAAAAAAAAOAAwAAAAAAAAAAAAOAAsAAAAHAAMAAAAOAAoAAAAAAAAAAAAOAAkAAAAAAAAAAAAOAAgAAAAHAAMAAAAOAAcAAAAHAAMAAAAOAAYAAAAHAAMAAAAOAAUAAAAAAAAAAAAOAAQAAAAAAAAAAAAOAAMAAAAAAAAAAAAOAAIAAAAAAAAAAAAOAAEAAAAAAAAAAAAOAAAAAAABAAAAAAAOAP//AAACAAAAAAAOAP7/AAAAAAAAAAAOAP3/AAAAAAAAAAAOAPz/AAAAAAAAAAAOAPv/AAAAAAAAAAAOAPr/AAAAAAAAAAAOAPn/AAAAAAAAAAAOAPj/AAAAAAAAAAANABgAAAAAAAAAAAANABcAAAABAAAAAAANABYAAAAAAAAAAAANABUAAAAAAAMAAAANABQAAAAAAAEAAAANABMAAAAAAAAAAAANABIAAAAAAAAAAAANABEAAAAAAAAAAAANABAAAAACAAMAAAANAA8AAAACAAIAAAANAA4AAAACAAIAAAANAA0AAAACAAEAAAANAAwAAAAAAAAAAAANAAsAAAAHAAMAAAANAAoAAAAAAAAAAAANAAkAAAAAAAAAAAANAAgAAAAAAAAAAAANAAcAAAAHAAMAAAANAAYAAAAAAAAAAAANAAUAAAAAAAAAAAANAAQAAAAAAAAAAAANAAMAAAAAAAAAAAANAAIAAAAAAAAAAAANAAEAAAAAAAAAAAANAAAAAAAAAAAAAAANAP//AAAAAAAAAAANAP7/AAAAAAAAAAANAP3/AAAAAAAAAAANAPz/AAAAAAAAAAANAPv/AAAAAAAAAAANAPr/AAAAAAAAAAANAPn/AAAAAAAAAAANAPj/AAABAAAAAAAMABgAAAAAAAAAAAAMABcAAAAAAAAAAAAMABYAAAAAAAAAAAAMABUAAAAAAAAAAAAMABQAAAAAAAAAAAAMABMAAAACAAMAAAAMABIAAAACAAEAAAAMABEAAAAAAAAAAAAMABAAAAAAAAMAAAAMAA8AAAAAAAIAAAAMAA4AAAAAAAIAAAAMAA0AAAAAAAEAAAAMAAwAAAAAAAAAAAAMAAsAAAAHAAMAAAAMAAoAAAAAAAAAAAAMAAkAAAAAAAAAAAAMAAgAAAAAAAAAAAAMAAcAAAAHAAMAAAAMAAYAAAAAAAAAAAAMAAUAAAAAAAAAAAAMAAQAAAAAAAAAAAAMAAMAAAAAAAAAAAAMAAIAAAAAAAAAAAAMAAEAAAABAAAAAAAMAAAAAAAAAAAAAAAMAP//AAAAAAAAAAAMAP7/AAAAAAAAAAAMAP3/AAAAAAAAAAAMAPz/AAAAAAAAAAAMAPv/AAAAAAAAAAAMAPr/AAABAAAAAAAMAPn/AAAAAAAAAAAMAPj/AAAAAAAAAAALABgAAAAAAAAAAAALABcAAAAAAAAAAAALABYAAAAAAAAAAAALABUAAAAAAAAAAAALABQAAAAAAAAAAAALABMAAAAAAAMAAAALABIAAAAAAAEAAAALABEAAAACAAAAAAALABAAAAAAAAAAAAALAA8AAAABAAAAAAALAA4AAAAAAAAAAAALAA0AAAAAAAAAAAALAAwAAAAAAAAAAAALAAsAAAAHAAMAAAALAAoAAAAAAAAAAAALAAkAAAAAAAAAAAALAAgAAAAAAAAAAAALAAcAAAAHAAMAAAALAAYAAAABAAAAAAALAAUAAAAAAAAAAAALAAQAAAAAAAAAAAALAAMAAAABAAAAAAALAAIAAAAAAAAAAAALAAEAAAAAAAAAAAALAAAAAAAAAAAAAAALAP//AAAAAAAAAAALAP7/AAAAAAAAAAALAP3/AAAAAAAAAAALAPz/AAAAAAAAAAALAPv/AAAAAAAAAAALAPr/AAAAAAAAAAALAPn/AAAAAAAAAAALAPj/AAAAAAAAAAAKABgAAAAAAAAAAAAKABcAAAAAAAAAAAAKABYAAAAAAAAAAAAKABUAAAAAAAAAAAAKABQAAAAAAAAAAAAKABMAAAAAAAAAAAAKABIAAAAAAAAAAAAKABEAAAAAAAAAAAAKABAAAAAAAAAAAAAKAA8AAAAAAAAAAAAKAA4AAAAAAAAAAAAKAA0AAAAAAAAAAAAKAAwAAAAAAAAAAAAKAAsAAAAHAAMAAAAKAAoAAAAAAAAAAAAKAAkAAAAAAAAAAAAKAAgAAAAAAAAAAAAKAAcAAAAHAAMAAAAKAAYAAAAAAAAAAAAKAAUAAAAAAAAAAAAKAAQAAAABAAAAAAAKAAMAAAABAAAAAAAKAAIAAAABAAAAAAAKAAEAAAAAAAAAAAAKAAAAAAAAAAAAAAAKAP//AAABAAAAAAAKAP7/AAAAAAAAAAAKAP3/AAAAAAAAAAAKAPz/AAAAAAAAAAAKAPv/AAAAAAAAAAAKAPr/AAAAAAAAAAAKAPn/AAAAAAAAAAAKAPj/AAAAAAAAAAAJABgAAAAAAAAAAAAJABcAAAAAAAAAAAAJABYAAAAAAAAAAAAJABUAAAAAAAAAAAAJABQAAAAAAAAAAAAJABMAAAAAAAAAAAAJABIAAAAAAAAAAAAJABEAAAAAAAAAAAAJABAAAAAAAAAAAAAJAA8AAAAAAAAAAAAJAA4AAAAAAAAAAAAJAA0AAAAAAAAAAAAJAAwAAAAAAAAAAAAJAAsAAAAHAAMAAAAJAAoAAAAAAAAAAAAJAAkAAAAAAAAAAAAJAAgAAAAAAAAAAAAJAAcAAAAHAAMAAAAJAAYAAAAAAAAAAAAJAAUAAAAAAAAAAAAJAAQAAAAAAAAAAAAJAAMAAAAAAAAAAAAJAAIAAAAAAAAAAAAJAAEAAAAAAAAAAAAJAAAAAAAAAAAAAAAJAP//AAACAAAAAAAJAP7/AAAAAAAAAAAJAP3/AAAAAAAAAAAJAPz/AAAAAAAAAAAJAPv/AAAAAAAAAAAJAPr/AAAAAAAAAAAJAPn/AAAAAAAAAAAJAPj/AAAAAAAAAAAIABgAAAAAAAAAAAAIABcAAAAAAAAAAAAIABYAAAAAAAAAAAAIABUAAAAAAAAAAAAIABQAAAAAAAAAAAAIABMAAAAAAAAAAAAIABIAAAAAAAAAAAAIABEAAAAAAAAAAAAIABAAAAAAAAAAAAAIAA8AAAAAAAAAAAAIAA4AAAAAAAAAAAAIAA0AAAAAAAAAAAAIAAwAAAAAAAAAAAAIAAsAAAAHAAMAAAAIAAoAAAAAAAAAAAAIAAkAAAAAAAAAAAAIAAgAAAAAAAAAAAAIAAcAAAAHAAMAAAAIAAYAAAAHAAMAAAAIAAUAAAAHAAMAAAAIAAQAAAAAAAAAAAAIAAMAAAAAAAAAAAAIAAIAAAAAAAAAAAAIAAEAAAAAAAAAAAAIAAAAAAABAAAAAAAIAP//AAAAAAAAAAAIAP7/AAAAAAAAAAAIAP3/AAAAAAAAAAAIAPz/AAAAAAAAAAAIAPv/AAAAAAAAAAAIAPr/AAAAAAAAAAAIAPn/AAAAAAAAAAAIAPj/AAACAAAAAAAHABgAAAAAAAAAAAAHABcAAAAAAAAAAAAHABYAAAAAAAAAAAAHABUAAAAAAAAAAAAHABQAAAAAAAAAAAAHABMAAAAAAAAAAAAHABIAAAAAAAAAAAAHABEAAAAAAAAAAAAHABAAAAAAAAAAAAAHAA8AAAAAAAAAAAAHAA4AAAAAAAAAAAAHAA0AAAAAAAAAAAAHAAwAAAABAAAAAAAHAAsAAAAHAAMAAAAHAAoAAAAAAAAAAAAHAAkAAAAAAAAAAAAHAAgAAAAAAAAAAAAHAAcAAAAAAAAAAAAHAAYAAAAAAAAAAAAHAAUAAAAAAAAAAAAHAAQAAAAAAAAAAAAHAAMAAAAAAAAAAAAHAAIAAAAAAAAAAAAHAAEAAAACAAAAAAAHAAAAAAAAAAAAAAAHAP//AAABAAAAAAAHAP7/AAAAAAAAAAAHAP3/AAAAAAAAAAAHAPz/AAAAAAAAAAAHAPv/AAAAAAAAAAAHAPr/AAAAAAAAAAAHAPn/AAAAAAAAAAAHAPj/AAAAAAAAAAAGABgAAAAAAAAAAAAGABcAAAAAAAAAAAAGABYAAAAAAAAAAAAGABUAAAAAAAAAAAAGABQAAAAAAAAAAAAGABMAAAAAAAAAAAAGABIAAAAAAAAAAAAGABEAAAAAAAAAAAAGABAAAAAAAAAAAAAGAA8AAAAAAAAAAAAGAA4AAAAAAAAAAAAGAA0AAAAAAAAAAAAGAAwAAAAAAAAAAAAGAAsAAAAAAAAAAAAGAAoAAAAAAAAAAAAGAAkAAAACAAAAAAAGAAgAAAAAAAAAAAAGAAcAAAAAAAAAAAAGAAYAAAAAAAAAAAAGAAUAAAAAAAAAAAAGAAQAAAAAAAAAAAAGAAMAAAAAAAAAAAAGAAIAAAAAAAAAAAAGAAEAAAAAAAAAAAAGAAAAAAABAAAAAAAGAP//AAABAAAAAAAGAP7/AAAAAAAAAAAGAP3/AAAAAAAAAAAGAPz/AAAAAAAAAAAGAPv/AAAAAAAAAAAGAPr/AAAAAAAAAAAGAPn/AAABAAAAAAAGAPj/AAAAAAAAAAAFABgAAAAAAAAAAAAFABcAAAAAAAAAAAAFABYAAAAAAAAAAAAFABUAAAAAAAAAAAAFABQAAAAAAAAAAAAFABMAAAAAAAAAAAAFABIAAAAAAAAAAAAFABEAAAAAAAAAAAAFABAAAAAAAAAAAAAFAA8AAAAAAAAAAAAFAA4AAAABAAAAAAAFAA0AAAAAAAAAAAAFAAwAAAAAAAAAAAAFAAsAAAABAAAAAAAFAAoAAAAAAAAAAAAFAAkAAAAAAAAAAAAFAAgAAAABAAAAAAAFAAcAAAABAAAAAAAFAAYAAAAAAAAAAAAFAAUAAAAAAAAAAAAFAAQAAAAAAAAAAAAFAAMAAAAAAAAAAAAFAAIAAAAAAAAAAAAFAAEAAAAAAAAAAAAFAAAAAAAAAAAAAAAFAP//AAAAAAAAAAAFAP7/AAAAAAAAAAAFAP3/AAAAAAAAAAAFAPz/AAAAAAAAAAAFAPv/AAAAAAAAAAAFAPr/AAAAAAAAAAAFAPn/AAACAAAAAAAFAPj/AAAAAAAAAAAEABgAAAAAAAAAAAAEABcAAAAAAAAAAAAEABYAAAAAAAAAAAAEABUAAAAAAAAAAAAEABQAAAAAAAAAAAAEABMAAAACAAAAAAAEABIAAAAAAAAAAAAEABEAAAAAAAAAAAAEABAAAAAAAAAAAAAEAA8AAAAAAAAAAAAEAA4AAAAAAAAAAAAEAA0AAAAAAAAAAAAEAAwAAAAAAAAAAAAEAAsAAAAAAAAAAAAEAAoAAAABAAAAAAAEAAkAAAAAAAAAAAAEAAgAAAAAAAAAAAAEAAcAAAAAAAAAAAAEAAYAAAABAAAAAAAEAAUAAAAAAAAAAAAEAAQAAAABAAAAAAAEAAMAAAAAAAAAAAAEAAIAAAAAAAAAAAAEAAEAAAAAAAAAAAAEAAAAAAABAAAAAAAEAP//AAABAAAAAAAEAP7/AAAAAAAAAAAEAP3/AAAAAAAAAAAEAPz/AAAAAAAAAAAEAPv/AAAAAAAAAAAEAPr/AAAAAAAAAAAEAPn/AAAAAAAAAAAEAPj/AAAAAAAAAAADABgAAAAAAAAAAAADABcAAAAAAAAAAAADABYAAAAAAAAAAAADABUAAAAAAAAAAAADABQAAAAAAAAAAAADABMAAAAAAAAAAAADABIAAAAAAAAAAAADABEAAAAAAAAAAAADABAAAAAAAAAAAAADAA8AAAAAAAAAAAADAA4AAAAAAAAAAAADAA0AAAABAAAAAAADAAwAAAABAAAAAAADAAsAAAAAAAAAAAADAAoAAAACAAAAAAADAAkAAAAAAAAAAAADAAgAAAAAAAAAAAADAAcAAAAAAAAAAAADAAYAAAAAAAAAAAADAAUAAAAAAAAAAAADAAQAAAACAAAAAAADAAMAAAABAAAAAAADAAIAAAABAAAAAAADAAEAAAAAAAAAAAADAAAAAAAAAAAAAAADAP//AAABAAAAAAADAP7/AAAAAAAAAAADAP3/AAAAAAAAAAADAPz/AAAAAAAAAAADAPv/AAABAAAAAAADAPr/AAAAAAAAAAADAPn/AAAAAAAAAAADAPj/AAAAAAAAAAACABgAAAAAAAAAAAACABcAAAAAAAAAAAACABYAAAAAAAAAAAACABUAAAAAAAAAAAACABQAAAAAAAAAAAACABMAAAAAAAAAAAACABIAAAAAAAAAAAACABEAAAAAAAAAAAACABAAAAAAAAAAAAACAA8AAAAAAAAAAAACAA4AAAAAAAAAAAACAA0AAAAAAAAAAAACAAwAAAAAAAAAAAACAAsAAAAAAAAAAAACAAoAAAAAAAAAAAACAAkAAAAAAAAAAAACAAgAAAAAAAAAAAACAAcAAAABAAAAAAACAAYAAAABAAAAAAACAAUAAAABAAAAAAACAAQAAAAAAAAAAAACAAMAAAABAAAAAAACAAIAAAACAAAAAAACAAEAAAAAAAAAAAACAAAAAAAAAAAAAAACAP//AAAAAAAAAAACAP7/AAAAAAAAAAACAP3/AAAAAAAAAAACAPz/AAAAAAAAAAACAPv/AAAAAAAAAAACAPr/AAAAAAAAAAACAPn/AAAAAAAAAAACAPj/AAAAAAAAAAABABgAAAAAAAAAAAABABcAAAAAAAAAAAABABYAAAAAAAAAAAABABUAAAAAAAAAAAABABQAAAAAAAAAAAABABMAAAAAAAAAAAABABIAAAAAAAAAAAABABEAAAAAAAAAAAABABAAAAAAAAAAAAABAA8AAAAAAAAAAAABAA4AAAAAAAAAAAABAA0AAAAAAAAAAAABAAwAAAAAAAAAAAABAAsAAAAAAAAAAAABAAoAAAAAAAAAAAABAAkAAAAAAAAAAAABAAgAAAAAAAAAAAABAAcAAAAAAAAAAAABAAYAAAABAAAAAAABAAUAAAAAAAAAAAABAAQAAAABAAAAAAABAAMAAAAAAAAAAAABAAIAAAACAAAAAAABAAEAAAABAAAAAAABAAAAAAABAAAAAAABAP//AAAAAAAAAAABAP7/AAAAAAAAAAABAP3/AAAAAAAAAAABAPz/AAAAAAAAAAABAPv/AAAAAAAAAAABAPr/AAACAAAAAAABAPn/AAAAAAAAAAABAPj/AAAAAAAAAAAAABgAAAAAAAAAAAAAABcAAAAAAAAAAAAAABYAAAAAAAAAAAAAABUAAAAAAAAAAAAAABQAAAAAAAAAAAAAABMAAAAAAAAAAAAAABIAAAAAAAAAAAAAABEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAA4AAAAAAAAAAAAAAA0AAAACAAAAAAAAAAwAAAABAAAAAAAAAAsAAAABAAAAAAAAAAoAAAAAAAAAAAAAAAkAAAABAAAAAAAAAAgAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAMAAAABAAAAAAAAAAIAAAABAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAP//AAACAAAAAAAAAP7/AAABAAAAAAAAAP3/AAAAAAAAAAAAAPz/AAAAAAAAAAAAAPv/AAAAAAAAAAAAAPr/AAAAAAAAAAAAAPn/AAAAAAAAAAAAAPj/AAAAAAAAAAD//xgAAAAAAAAAAAD//xcAAAAAAAAAAAD//xYAAAAAAAAAAAD//xUAAAACAAAAAAD//xQAAAACAAAAAAD//xMAAAAAAAAAAAD//xIAAAAAAAAAAAD//xEAAAAAAAAAAAD//xAAAAAAAAAAAAD//w8AAAAAAAAAAAD//w4AAAAAAAAAAAD//w0AAAAAAAAAAAD//wwAAAAAAAAAAAD//wsAAAACAAAAAAD//woAAAAAAAAAAAD//wkAAAAAAAAAAAD//wgAAAAAAAAAAAD//wcAAAAAAAAAAAD//wYAAAAAAAAAAAD//wUAAAAAAAAAAAD//wQAAAABAAAAAAD//wMAAAABAAAAAAD//wIAAAAAAAAAAAD//wEAAAAAAAAAAAD//wAAAAAAAAAAAAD/////AAAAAAAAAAD///7/AAAAAAAAAAD///3/AAAAAAAAAAD///z/AAAAAAAAAAD///v/AAAAAAAAAAD///r/AAAAAAAAAAD///n/AAAAAAAAAAD///j/AAAAAAAAAAD+/xgAAAAAAAAAAAD+/xcAAAAAAAAAAAD+/xYAAAAAAAAAAAD+/xUAAAAAAAAAAAD+/xQAAAAAAAAAAAD+/xMAAAAAAAAAAAD+/xIAAAAAAAAAAAD+/xEAAAAAAAAAAAD+/xAAAAAAAAAAAAD+/w8AAAAAAAAAAAD+/w4AAAAAAAAAAAD+/w0AAAAAAAAAAAD+/wwAAAAAAAAAAAD+/wsAAAACAAAAAAD+/woAAAAAAAAAAAD+/wkAAAAAAAAAAAD+/wgAAAAAAAAAAAD+/wcAAAAAAAAAAAD+/wYAAAAAAAAAAAD+/wUAAAAAAAAAAAD+/wQAAAAAAAAAAAD+/wMAAAAAAAAAAAD+/wIAAAABAAAAAAD+/wEAAAAAAAAAAAD+/wAAAAAAAAAAAAD+////AAAAAAAAAAD+//7/AAAAAAAAAAD+//3/AAAAAAAAAAD+//z/AAAAAAAAAAD+//v/AAABAAAAAAD+//r/AAAAAAAAAAD+//n/AAAAAAAAAAD+//j/AAAAAAAAAAD9/xgAAAAAAAAAAAD9/xcAAAAAAAAAAAD9/xYAAAAAAAAAAAD9/xUAAAAAAAAAAAD9/xQAAAAAAAAAAAD9/xMAAAAAAAAAAAD9/xIAAAAAAAAAAAD9/xEAAAAAAAAAAAD9/xAAAAAAAAAAAAD9/w8AAAAAAAAAAAD9/w4AAAAAAAAAAAD9/w0AAAAAAAAAAAD9/wwAAAAAAAAAAAD9/wsAAAAAAAAAAAD9/woAAAAAAAAAAAD9/wkAAAAAAAAAAAD9/wgAAAAAAAAAAAD9/wcAAAAAAAAAAAD9/wYAAAAAAAAAAAD9/wUAAAAAAAAAAAD9/wQAAAAAAAAAAAD9/wMAAAAAAAAAAAD9/wIAAAAAAAAAAAD9/wEAAAAAAAAAAAD9/wAAAAAAAAAAAAD9////AAAAAAAAAAD9//7/AAAAAAAAAAD9//3/AAAAAAAAAAD9//z/AAAAAAAAAAD9//v/AAAAAAAAAAD9//r/AAAAAAAAAAD9//n/AAAAAAAAAAD9//j/AAAAAAAAAAD8/xgAAAAAAAAAAAD8/xcAAAAAAAAAAAD8/xYAAAAAAAAAAAD8/xUAAAAAAAAAAAD8/xQAAAAAAAAAAAD8/xMAAAAAAAAAAAD8/xIAAAAAAAAAAAD8/xEAAAAAAAAAAAD8/xAAAAAAAAAAAAD8/w8AAAAAAAAAAAD8/w4AAAAAAAAAAAD8/w0AAAAAAAAAAAD8/wwAAAACAAAAAAD8/wsAAAACAAAAAAD8/woAAAAAAAAAAAD8/wkAAAAAAAAAAAD8/wgAAAAAAAAAAAD8/wcAAAAAAAAAAAD8/wYAAAABAAAAAAD8/wUAAAAAAAAAAAD8/wQAAAAAAAAAAAD8/wMAAAAAAAAAAAD8/wIAAAAAAAAAAAD8/wEAAAAAAAAAAAD8/wAAAAAAAAAAAAD8////AAAAAAAAAAD8//7/AAAAAAAAAAD8//3/AAAAAAAAAAD8//z/AAAAAAAAAAD8//v/AAABAAAAAAD8//r/AAACAAAAAAD8//n/AAAAAAAAAAD8//j/AAAAAAAAAAD7/xgAAAAAAAAAAAD7/xcAAAAAAAAAAAD7/xYAAAACAAAAAAD7/xUAAAAAAAAAAAD7/xQAAAAAAAAAAAD7/xMAAAAAAAAAAAD7/xIAAAAAAAAAAAD7/xEAAAAAAAAAAAD7/xAAAAAAAAAAAAD7/w8AAAAAAAAAAAD7/w4AAAAAAAAAAAD7/w0AAAAAAAAAAAD7/wwAAAAAAAAAAAD7/wsAAAAAAAAAAAD7/woAAAAAAAAAAAD7/wkAAAAAAAAAAAD7/wgAAAAAAAAAAAD7/wcAAAAAAAAAAAD7/wYAAAAAAAAAAAD7/wUAAAAAAAAAAAD7/wQAAAAAAAAAAAD7/wMAAAAAAAAAAAD7/wIAAAAAAAAAAAD7/wEAAAABAAAAAAD7/wAAAAAAAAAAAAD7////AAAAAAAAAAD7//7/AAAAAAAAAAD7//3/AAAAAAAAAAD7//z/AAAAAAAAAAD7//v/AAAAAAAAAAD7//r/AAAAAAAAAAD7//n/AAAAAAAAAAD7//j/AAAAAAAAAAD6/xgAAAAAAAAAAAD6/xcAAAAAAAAAAAD6/xYAAAAAAAAAAAD6/xUAAAAAAAAAAAD6/xQAAAACAAAAAAD6/xMAAAAAAAAAAAD6/xIAAAAAAAAAAAD6/xEAAAAAAAAAAAD6/xAAAAAAAAAAAAD6/w8AAAAAAAAAAAD6/w4AAAAAAAAAAAD6/w0AAAAAAAAAAAD6/wwAAAAAAAAAAAD6/wsAAAAAAAAAAAD6/woAAAACAAAAAAD6/wkAAAABAAAAAAD6/wgAAAAAAAAAAAD6/wcAAAAAAAAAAAD6/wYAAAAAAAAAAAD6/wUAAAABAAAAAAD6/wQAAAAAAAAAAAD6/wMAAAAAAAAAAAD6/wIAAAACAAAAAAD6/wEAAAAAAAAAAAD6/wAAAAAAAAAAAAD6////AAAAAAAAAAD6//7/AAAAAAAAAAD6//3/AAAAAAAAAAD6//z/AAAAAAAAAAD6//v/AAAAAAAAAAD6//r/AAAAAAAAAAD6//n/AAAAAAAAAAD6//j/AAACAAAAAAD5/xgAAAAAAAAAAAD5/xcAAAAAAAAAAAD5/xYAAAAAAAAAAAD5/xUAAAAAAAAAAAD5/xQAAAAAAAAAAAD5/xMAAAAAAAAAAAD5/xIAAAAAAAAAAAD5/xEAAAAAAAAAAAD5/xAAAAAAAAAAAAD5/w8AAAAAAAAAAAD5/w4AAAAAAAAAAAD5/w0AAAAAAAAAAAD5/wwAAAAAAAAAAAD5/wsAAAAAAAAAAAD5/woAAAAAAAAAAAD5/wkAAAAAAAAAAAD5/wgAAAAAAAAAAAD5/wcAAAAAAAAAAAD5/wYAAAAAAAAAAAD5/wUAAAAAAAAAAAD5/wQAAAABAAAAAAD5/wMAAAAAAAAAAAD5/wIAAAAAAAAAAAD5/wEAAAAAAAAAAAD5/wAAAAAAAAAAAAD5////AAAAAAAAAAD5//7/AAAAAAAAAAD5//3/AAAAAAAAAAD5//z/AAACAAAAAAD5//v/AAAAAAAAAAD5//r/AAAAAAAAAAD5//n/AAAAAAAAAAD5//j/AAAAAAAAAAD4/xgAAAAAAAAAAAD4/xcAAAAAAAAAAAD4/xYAAAAAAAAAAAD4/xUAAAAAAAAAAAD4/xQAAAACAAAAAAD4/xMAAAAAAAAAAAD4/xIAAAAAAAAAAAD4/xEAAAAAAAAAAAD4/xAAAAAAAAAAAAD4/w8AAAAAAAAAAAD4/w4AAAAAAAAAAAD4/w0AAAAAAAAAAAD4/wwAAAAAAAAAAAD4/wsAAAAAAAAAAAD4/woAAAAAAAAAAAD4/wkAAAAAAAAAAAD4/wgAAAAAAAAAAAD4/wcAAAAAAAAAAAD4/wYAAAAAAAAAAAD4/wUAAAAAAAAAAAD4/wQAAAAAAAAAAAD4/wMAAAAAAAAAAAD4/wIAAAAAAAAAAAD4/wEAAAAAAAAAAAD4/wAAAAAAAAAAAAD4////AAAAAAAAAAD4//7/AAAAAAAAAAD4//3/AAAAAAAAAAD4//z/AAAAAAAAAAD4//v/AAAAAAAAAAD4//r/AAABAAAAAAD4//n/AAAAAAAAAAD4//j/AAAAAAAAAAD3/xgAAAAAAAAAAAD3/xcAAAABAAAAAAD3/xYAAAAAAAAAAAD3/xUAAAAAAAAAAAD3/xQAAAAAAAAAAAD3/xMAAAAAAAAAAAD3/xIAAAAAAAAAAAD3/xEAAAAAAAAAAAD3/xAAAAAAAAAAAAD3/w8AAAAAAAAAAAD3/w4AAAAAAAAAAAD3/w0AAAAAAAAAAAD3/wwAAAAAAAAAAAD3/wsAAAAAAAAAAAD3/woAAAAAAAAAAAD3/wkAAAAAAAAAAAD3/wgAAAAAAAAAAAD3/wcAAAAAAAAAAAD3/wYAAAAAAAAAAAD3/wUAAAAAAAAAAAD3/wQAAAAAAAAAAAD3/wMAAAAAAAAAAAD3/wIAAAAAAAAAAAD3/wEAAAAAAAAAAAD3/wAAAAAAAAAAAAD3////AAAAAAAAAAD3//7/AAAAAAAAAAD3//3/AAAAAAAAAAD3//z/AAAAAAAAAAD3//v/AAAAAAAAAAD3//r/AAAAAAAAAAD3//n/AAAAAAAAAAD3//j/AAAAAAAAAAD2/xgAAAAAAAAAAAD2/xcAAAAAAAAAAAD2/xYAAAAAAAAAAAD2/xUAAAAAAAAAAAD2/xQAAAAAAAAAAAD2/xMAAAAAAAAAAAD2/xIAAAAAAAAAAAD2/xEAAAAAAAAAAAD2/xAAAAAAAAAAAAD2/w8AAAAAAAAAAAD2/w4AAAAAAAAAAAD2/w0AAAAAAAAAAAD2/wwAAAAAAAAAAAD2/wsAAAAAAAAAAAD2/woAAAAAAAAAAAD2/wkAAAAAAAAAAAD2/wgAAAAAAAAAAAD2/wcAAAAAAAAAAAD2/wYAAAAAAAAAAAD2/wUAAAAAAAAAAAD2/wQAAAAAAAAAAAD2/wMAAAAAAAAAAAD2/wIAAAAAAAAAAAD2/wEAAAAAAAAAAAD2/wAAAAAAAAAAAAD2////AAAAAAAAAAD2//7/AAAAAAAAAAD2//3/AAAAAAAAAAD2//z/AAAAAAAAAAD2//v/AAAAAAAAAAD2//r/AAACAAAAAAD2//n/AAAAAAAAAAD2//j/AAAAAAAAAAD1/xgAAAAAAAAAAAD1/xcAAAAAAAAAAAD1/xYAAAACAAAAAAD1/xUAAAAAAAAAAAD1/xQAAAAAAAAAAAD1/xMAAAAAAAAAAAD1/xIAAAAAAAAAAAD1/xEAAAAAAAAAAAD1/xAAAAAAAAAAAAD1/w8AAAAAAAAAAAD1/w4AAAAAAAAAAAD1/w0AAAAAAAAAAAD1/wwAAAAAAAAAAAD1/wsAAAAAAAAAAAD1/woAAAAAAAAAAAD1/wkAAAAAAAAAAAD1/wgAAAACAAAAAAD1/wcAAAAAAAAAAAD1/wYAAAACAAAAAAD1/wUAAAAAAAAAAAD1/wQAAAAAAAAAAAD1/wMAAAAAAAAAAAD1/wIAAAAAAAAAAAD1/wEAAAAAAAAAAAD1/wAAAAAAAAAAAAD1////AAAAAAAAAAD1//7/AAAAAAAAAAD1//3/AAAAAAAAAAD1//z/AAAAAAAAAAD1//v/AAAAAAAAAAD1//r/AAACAAAAAAD1//n/AAAAAAAAAAD1//j/AAAAAAAAAAD0/xgAAAAAAAAAAAD0/xcAAAAAAAAAAAD0/xYAAAAAAAAAAAD0/xUAAAABAAAAAAD0/xQAAAAAAAAAAAD0/xMAAAAAAAAAAAD0/xIAAAAAAAAAAAD0/xEAAAAAAAAAAAD0/xAAAAAAAAAAAAD0/w8AAAAAAAAAAAD0/w4AAAAAAAAAAAD0/w0AAAAAAAAAAAD0/wwAAAAAAAAAAAD0/wsAAAAAAAAAAAD0/woAAAABAAAAAAD0/wkAAAAAAAAAAAD0/wgAAAAAAAAAAAD0/wcAAAAAAAAAAAD0/wYAAAAAAAAAAAD0/wUAAAAAAAAAAAD0/wQAAAAAAAAAAAD0/wMAAAAAAAAAAAD0/wIAAAAAAAAAAAD0/wEAAAAAAAAAAAD0/wAAAAAAAAAAAAD0////AAAAAAAAAAD0//7/AAAAAAAAAAD0//3/AAAAAAAAAAD0//z/AAAAAAAAAAD0//v/AAAAAAAAAAD0//r/AAAAAAAAAAD0//n/AAAAAAAAAAD0//j/AAACAAAAAAA=") +tile_set = ExtResource("7_po5fq") +script = ExtResource("55_a8sfs") +metadata/_edit_lock_ = true -[node name="GoBotGFX" parent="Field/Terrain/Gamepieces/Player" instance=ExtResource("12_oablq")] +[node name="Buildings" type="TileMapLayer" parent="Field/Map/Town"] +tile_map_data = PackedByteArray("AAAEAAEAAAAEAAQAAAAEAAIAAAAEAAUAAAAEAAMAAAAEAAYAAAAEAAQAAAAEAAYAAAAFAAEAAAAHAAQAAAAFAAIAAAAFAAUAAAAFAAMAAAAEAAcAAAAFAAQAAAAEAAcAAAAGAAEAAAAGAAQAAAAGAAIAAAAGAAUAAAAGAAMAAAAHAAYAAAAGAAQAAAAFAAYAAAAHAAIAAAAEAAQAAAAHAAMAAAAEAAUAAAAHAAQAAAAEAAYAAAAIAAIAAAAFAAQAAAAIAAMAAAAHAAUAAAAIAAQAAAAFAAcAAAAJAAIAAAAGAAQAAAAJAAMAAAAGAAUAAAAJAAQAAAAHAAYAAAANAAMAAAAAAAQAAAANAAQAAAAAAAUAAAANAAUAAAAAAAYAAAAOAAMAAAABAAQAAAAOAAQAAAABAAUAAAAOAAUAAAABAAcAAAAPAAMAAAACAAQAAAAPAAQAAAACAAUAAAAPAAUAAAADAAYAAAASAAQAAAAAAAQAAAASAAUAAAAAAAUAAAASAAYAAAAAAAYAAAATAAQAAAADAAQAAAATAAUAAAABAAUAAAATAAYAAAAAAAcAAAAUAAQAAAACAAQAAAAUAAUAAAACAAUAAAAUAAYAAAADAAYAAAATAAoAAAAAAAQAAAATAAsAAAAAAAUAAAATAAwAAAAAAAYAAAAUAAoAAAABAAQAAAAUAAsAAAABAAUAAAAUAAwAAAAAAAcAAAAVAAoAAAABAAQAAAAVAAsAAAABAAUAAAAVAAwAAAAAAAcAAAAWAAoAAAACAAQAAAAWAAsAAAACAAUAAAAWAAwAAAADAAYAAAAFAAgAAAAAAAQAAAAFAAkAAAAAAAUAAAAFAAoAAAAAAAYAAAAGAAgAAAADAAQAAAAGAAkAAAABAAUAAAAGAAoAAAAAAAcAAAAHAAgAAAABAAQAAAAIAAgAAAACAAQAAAAIAAkAAAACAAUAAAAIAAoAAAADAAYAAAA=") +tile_set = ExtResource("7_po5fq") +script = ExtResource("55_a8sfs") +metadata/_edit_lock_ = true -[node name="Town" type="Node2D" parent="Field/Terrain/Gamepieces"] -y_sort_enabled = true +[node name="Trees" type="TileMapLayer" parent="Field/Map/Town"] +tile_map_data = PackedByteArray("AAD1/wAAAAAHAAEAAAD1/wEAAAAHAAEAAAD1/wIAAAAHAAEAAAD1/wMAAAAHAAEAAAD1/wQAAAAHAAEAAAD1/wUAAAAHAAEAAAD1/wYAAAAHAAEAAAD1/wcAAAAHAAEAAAD1/wgAAAAHAAEAAAD1/wkAAAAHAAEAAAD1/woAAAAHAAEAAAD1/wsAAAAHAAEAAAD1/wwAAAAHAAEAAAD1/w0AAAAHAAEAAAD1/w4AAAAHAAEAAAD1/w8AAAAHAAEAAAD1/xAAAAAHAAEAAAD1/xEAAAAHAAEAAAD1/xIAAAAHAAEAAAD1/xMAAAAHAAEAAAD1/xQAAAAHAAEAAAD1/xUAAAAHAAEAAAD1/xYAAAAHAAEAAAD1/xcAAAAHAAEAAAD2/wAAAAAHAAEAAAD2/wEAAAAHAAEAAAD2/wIAAAAHAAEAAAD2/wMAAAAHAAEAAAD2/wQAAAAHAAEAAAD2/wUAAAAHAAEAAAD2/wYAAAAHAAEAAAD2/wcAAAAHAAEAAAD2/wgAAAAHAAEAAAD2/wkAAAAHAAEAAAD2/woAAAAHAAEAAAD2/wsAAAAHAAEAAAD2/wwAAAAHAAEAAAD2/w0AAAAHAAEAAAD2/w4AAAAHAAEAAAD2/w8AAAAHAAEAAAD2/xAAAAAHAAEAAAD2/xEAAAAHAAEAAAD2/xIAAAAHAAEAAAD2/xMAAAAHAAEAAAD2/xQAAAAHAAEAAAD2/xUAAAAHAAEAAAD2/xYAAAAHAAEAAAD2/xcAAAAHAAEAAAD3/wAAAAAHAAEAAAD3/wEAAAAHAAEAAAD3/wIAAAAHAAEAAAD3/wMAAAAHAAEAAAD3/wQAAAAHAAEAAAD3/wUAAAAHAAEAAAD3/wYAAAAHAAEAAAD3/wcAAAAHAAEAAAD3/wgAAAAHAAEAAAD3/wkAAAAHAAEAAAD3/woAAAAHAAEAAAD3/wsAAAAHAAEAAAD3/wwAAAAHAAEAAAD3/w0AAAAHAAEAAAD3/w4AAAAHAAEAAAD3/w8AAAAHAAEAAAD3/xAAAAAHAAEAAAD3/xEAAAAHAAEAAAD3/xIAAAAHAAEAAAD3/xMAAAAHAAEAAAD3/xQAAAAHAAEAAAD3/xUAAAAHAAEAAAD3/xYAAAAHAAEAAAD3/xcAAAAHAAEAAAD4/wAAAAAHAAEAAAD4/wEAAAAHAAEAAAD4/wIAAAAHAAEAAAD4/wMAAAAHAAEAAAD4/wQAAAAHAAEAAAD4/wUAAAAHAAEAAAD4/wYAAAAHAAEAAAD4/wcAAAAHAAEAAAD4/wgAAAAHAAEAAAD4/wkAAAAHAAEAAAD4/woAAAAHAAEAAAD4/wsAAAAHAAEAAAD4/wwAAAAHAAEAAAD4/w0AAAAHAAEAAAD4/w4AAAAHAAEAAAD4/w8AAAAHAAEAAAD4/xAAAAAHAAEAAAD4/xEAAAAHAAEAAAD4/xIAAAAHAAEAAAD4/xMAAAAHAAEAAAD4/xQAAAAHAAEAAAD4/xUAAAAHAAEAAAD4/xYAAAAHAAEAAAD4/xcAAAAHAAEAAAD5/wAAAAAHAAEAAAD5/wEAAAAHAAEAAAD5/wIAAAAHAAEAAAD5/wMAAAAHAAEAAAD5/wQAAAAHAAEAAAD5/wUAAAAHAAEAAAD5/wYAAAAHAAEAAAD5/wcAAAAHAAEAAAD5/wgAAAAHAAEAAAD5/wkAAAAHAAEAAAD5/woAAAAHAAEAAAD5/wsAAAAHAAEAAAD5/wwAAAAHAAEAAAD5/w0AAAAHAAEAAAD5/w4AAAAHAAEAAAD5/w8AAAAHAAEAAAD5/xAAAAAHAAEAAAD5/xEAAAAHAAEAAAD5/xIAAAAHAAEAAAD5/xMAAAAHAAEAAAD5/xQAAAAHAAEAAAD5/xUAAAAHAAEAAAD5/xYAAAAHAAEAAAD5/xcAAAAHAAEAAAD6/wAAAAAHAAEAAAD6/wEAAAAHAAEAAAD6/wIAAAAHAAEAAAD6/wMAAAAHAAEAAAD6/wQAAAAHAAEAAAD6/wUAAAAHAAEAAAD6/wYAAAAHAAEAAAD6/wcAAAAHAAEAAAD6/wgAAAAHAAEAAAD6/wkAAAAHAAEAAAD6/woAAAAHAAEAAAD6/wsAAAAHAAEAAAD6/wwAAAAHAAEAAAD6/w0AAAAHAAEAAAD6/w4AAAAHAAEAAAD6/w8AAAAHAAEAAAD6/xAAAAAHAAEAAAD6/xEAAAAHAAEAAAD6/xIAAAAHAAEAAAD6/xMAAAAHAAEAAAD6/xQAAAAHAAEAAAD6/xUAAAAHAAEAAAD6/xYAAAAHAAEAAAD6/xcAAAAHAAEAAAD7/wAAAAAHAAEAAAD7/wEAAAAHAAEAAAD7/wIAAAAHAAEAAAD7/wMAAAAHAAEAAAD7/wQAAAAHAAEAAAD7/wUAAAAHAAEAAAD7/wYAAAAHAAEAAAD7/wcAAAAHAAEAAAD7/wgAAAAHAAEAAAD7/wkAAAAHAAEAAAD7/woAAAAHAAEAAAD7/wsAAAAHAAEAAAD7/wwAAAAHAAEAAAD7/w0AAAAHAAEAAAD7/w4AAAAHAAEAAAD7/w8AAAAHAAEAAAD7/xAAAAAHAAEAAAD7/xEAAAAHAAEAAAD7/xIAAAAHAAEAAAD7/xMAAAAHAAEAAAD7/xQAAAAHAAEAAAD7/xUAAAAHAAEAAAD7/xYAAAAHAAEAAAD7/xcAAAAHAAEAAAD8/wAAAAAHAAEAAAD8/wEAAAAHAAEAAAD8/wIAAAAHAAEAAAD8/wMAAAAHAAEAAAD8/wQAAAAHAAEAAAD8/wUAAAAHAAEAAAD8/wYAAAAHAAEAAAD8/wcAAAAHAAEAAAD8/wgAAAAHAAEAAAD8/wkAAAAHAAEAAAD8/woAAAAHAAEAAAD8/wsAAAAHAAEAAAD8/wwAAAAHAAEAAAD8/w0AAAAHAAEAAAD8/w4AAAAHAAEAAAD8/w8AAAAHAAEAAAD8/xAAAAAHAAEAAAD8/xEAAAAHAAEAAAD8/xIAAAAHAAEAAAD8/xMAAAAHAAEAAAD8/xQAAAAHAAEAAAD8/xUAAAAHAAEAAAD8/xYAAAAHAAEAAAD8/xcAAAAHAAEAAAD9/wAAAAAHAAEAAAD9/wEAAAAHAAEAAAD9/wIAAAAHAAEAAAD9/wMAAAAHAAEAAAD9/wQAAAAHAAEAAAD9/wUAAAAHAAEAAAD9/wYAAAAHAAEAAAD9/wcAAAAHAAEAAAD9/wgAAAAHAAEAAAD9/wkAAAAHAAEAAAD9/woAAAAHAAEAAAD9/wsAAAAHAAEAAAD9/wwAAAAHAAEAAAD9/w0AAAAHAAEAAAD9/w4AAAAHAAEAAAD9/w8AAAAHAAEAAAD9/xAAAAAHAAEAAAD9/xEAAAAHAAEAAAD9/xIAAAAHAAEAAAD9/xMAAAAHAAEAAAD9/xQAAAAHAAEAAAD9/xUAAAAHAAEAAAD9/xYAAAAHAAEAAAD9/xcAAAAHAAEAAAD+/wAAAAAHAAEAAAD+/wEAAAAHAAEAAAD+/wIAAAAHAAEAAAD+/wMAAAAHAAEAAAD+/wQAAAAHAAEAAAD+/wUAAAAHAAEAAAD+/wYAAAAHAAEAAAD+/wcAAAAHAAEAAAD+/wgAAAAHAAEAAAD+/wkAAAAHAAEAAAD+/woAAAAHAAEAAAD+/wsAAAAHAAEAAAD+/wwAAAAHAAEAAAD+/w0AAAAHAAEAAAD+/w4AAAAHAAEAAAD+/w8AAAAHAAEAAAD+/xAAAAAHAAEAAAD+/xEAAAAHAAEAAAD+/xIAAAAHAAEAAAD+/xMAAAAHAAEAAAD+/xQAAAAHAAEAAAD+/xUAAAAHAAEAAAD+/xYAAAAHAAEAAAD+/xcAAAAHAAEAAAD//wAAAAAHAAEAAAD//wEAAAAHAAEAAAD//wIAAAAHAAEAAAD//wMAAAAHAAEAAAD//wQAAAAHAAEAAAD//wUAAAAHAAEAAAD//wYAAAAHAAEAAAD//wcAAAAHAAEAAAD//wgAAAAHAAEAAAD//wkAAAAHAAEAAAD//woAAAAHAAEAAAD//wsAAAAHAAEAAAD//wwAAAAHAAEAAAD//w0AAAAHAAEAAAD//w4AAAAHAAEAAAD//w8AAAAHAAEAAAD//xAAAAAHAAEAAAD//xEAAAAHAAEAAAD//xIAAAAHAAEAAAD//xMAAAAHAAEAAAD//xQAAAAHAAEAAAD//xUAAAAHAAEAAAD//xYAAAAHAAEAAAD//xcAAAAHAAEAAAAAAAAAAAAHAAEAAAAAAAEAAAAHAAEAAAAAAAIAAAAIAAIAAAAAAAMAAAAIAAEAAAAAAAQAAAAIAAEAAAAAAAUAAAAIAAAAAAAAAAYAAAAHAAEAAAAAAAcAAAAHAAEAAAAAAAgAAAAIAAIAAAAAAAkAAAAIAAAAAAAAAAoAAAAIAAIAAAAAAAsAAAAHAAEAAAAAAAwAAAAIAAIAAAAAAA0AAAAIAAAAAAAAAA4AAAAHAAEAAAAAAA8AAAAHAAEAAAAAABAAAAAHAAEAAAAAABEAAAAHAAEAAAAAABIAAAAHAAEAAAAAABMAAAAHAAEAAAAAABQAAAAHAAEAAAAAABUAAAAHAAEAAAAAABYAAAAHAAEAAAAAABcAAAAHAAEAAAABAAAAAAAHAAEAAAABAAEAAAAIAAIAAAABAAYAAAAIAAAAAAABAAcAAAAIAAIAAAABAAgAAAAIAAMAAAABAAkAAAAIAAQAAAABAAoAAAAIAAUAAAABAAsAAAAIAAEAAAABAA4AAAAIAAAAAAABAA8AAAAHAAEAAAABABAAAAAHAAEAAAABABEAAAAHAAEAAAABABIAAAAHAAEAAAABABMAAAAHAAEAAAABABQAAAAHAAEAAAABABUAAAAHAAEAAAABABYAAAAHAAEAAAABABcAAAAHAAEAAAACAAAAAAAIAAIAAAACAAcAAAAFAAAAAAACAAgAAAAJAAMAAAACAAkAAAAKAAcAAAACAAoAAAAJAAMAAAACAA0AAAAEAAEAAAACAA4AAAAEAAIAAAACAA8AAAAIAAAAAAACABAAAAAHAAEAAAACABEAAAAHAAEAAAACABIAAAAHAAEAAAACABMAAAAHAAEAAAACABQAAAAHAAEAAAACABUAAAAHAAEAAAACABYAAAAHAAEAAAACABcAAAAHAAEAAAADAAYAAAAEAAEAAAADAAcAAAAFAAEAAAADAAgAAAAJAAMAAAADAA8AAAAEAAEAAAADABAAAAAIAAAAAAADABEAAAAHAAEAAAADABIAAAAHAAEAAAADABMAAAAHAAEAAAADABQAAAAHAAEAAAADABUAAAAHAAEAAAADABYAAAAHAAEAAAADABcAAAAHAAEAAAAEAAcAAAAEAAIAAAAEAAkAAAAKAAcAAAAEAA4AAAAEAAEAAAAEAA8AAAAEAAIAAAAEABAAAAAGAAAAAAAEABEAAAAHAAEAAAAEABIAAAAHAAEAAAAEABMAAAAHAAEAAAAEABQAAAAHAAEAAAAEABUAAAAHAAEAAAAEABYAAAAHAAEAAAAEABcAAAAHAAEAAAAFAAYAAAAFAAAAAAAFAA8AAAAHAAAAAAAFABAAAAAHAAEAAAAFABEAAAAHAAEAAAAFABIAAAAHAAEAAAAFABMAAAAHAAEAAAAFABQAAAAHAAEAAAAFABUAAAAHAAEAAAAFABYAAAAHAAEAAAAFABcAAAAHAAEAAAAGAA8AAAAHAAAAAAAGABAAAAAHAAEAAAAGABEAAAAHAAEAAAAGABIAAAAHAAEAAAAGABMAAAAHAAEAAAAGABQAAAAHAAEAAAAGABUAAAAHAAEAAAAGABYAAAAHAAEAAAAHAA8AAAAHAAAAAAAHABAAAAAHAAEAAAAHABEAAAAHAAEAAAAHABIAAAAHAAEAAAAHABMAAAAHAAEAAAAHABQAAAAHAAEAAAAHABUAAAAHAAEAAAAIAAwAAAAJAAMAAAAIAA8AAAAEAAIAAAAIABAAAAAIAAAAAAAIABEAAAAHAAEAAAAIABIAAAAHAAEAAAAIABMAAAAHAAEAAAAIABQAAAAHAAEAAAAIABUAAAAHAAEAAAAJAAkAAAALAAgAAAAJAAwAAAAJAAYAAAAJAA8AAAAEAAEAAAAJABAAAAAGAAAAAAAJABEAAAAHAAEAAAAJABIAAAAHAAEAAAAJABMAAAAHAAEAAAAJABQAAAAHAAEAAAAJABUAAAAHAAEAAAAKAA8AAAAHAAAAAAAKABAAAAAHAAEAAAAKABEAAAAIAAIAAAAKABIAAAAIAAAAAAAKABMAAAAHAAEAAAAKABQAAAAHAAEAAAAKABUAAAAHAAEAAAALAAwAAAAJAAYAAAALABAAAAAIAAEAAAALABEAAAAEAAIAAAALABMAAAAIAAEAAAALABQAAAAIAAAAAAALABUAAAAHAAEAAAALABYAAAAHAAEAAAALABcAAAAHAAEAAAAMAAAAAAAHAAEAAAAMAAMAAQAKAAYAAAAMAAQAAQAKAAYAAAAMAAUAAAAJAAYAAAAMABUAAAAIAAAAAAAMABYAAAAHAAEAAAAMABcAAAAHAAEAAAANAAAAAAAIAAIAAAANABUAAAAHAAAAAAANABYAAAAIAAIAAAAOAAIAAAALAAgAAAAOAAYAAAAFAAEAAAAOABAAAAAGAAAAAAAOABEAAAAHAAEAAAAOABIAAAAHAAEAAAAPAAYAAAAFAAEAAAAPAA8AAAAGAAAAAAAPABAAAAAHAAEAAAAPABEAAAAHAAEAAAAPABIAAAAHAAEAAAAQAAMAAAAEAAEAAAAQAAUAAAAFAAAAAAAQAA4AAAAHAAAAAAAQAA8AAAAHAAEAAAAQABAAAAAHAAEAAAAQABEAAAAHAAEAAAAQABIAAAAHAAEAAAAQABMAAAAHAAEAAAAQABQAAAAHAAEAAAAQABUAAAAHAAEAAAARAA4AAAAHAAAAAAARAA8AAAAHAAEAAAARABAAAAAHAAEAAAARABEAAAAHAAEAAAARABIAAAAHAAEAAAARABMAAAAHAAEAAAARABQAAAAHAAEAAAARABUAAAAHAAEAAAASAA4AAAAFAAIAAAASAA8AAAAIAAAAAAASABAAAAAHAAEAAAASABEAAAAHAAEAAAASABIAAAAHAAEAAAASABMAAAAHAAEAAAASABQAAAAHAAEAAAASABUAAAAHAAEAAAASABYAAAAHAAEAAAASABcAAAAHAAEAAAATAA4AAAAFAAEAAAATAA8AAAAHAAAAAAATABAAAAAHAAEAAAATABEAAAAHAAEAAAATABIAAAAHAAEAAAATABMAAAAHAAEAAAATABQAAAAHAAEAAAATABUAAAAHAAEAAAATABYAAAAHAAEAAAATABcAAAAHAAEAAAAUAA8AAAAHAAAAAAAUABAAAAAHAAEAAAAUABEAAAAHAAEAAAAUABIAAAAHAAEAAAAUABMAAAAHAAEAAAAUABQAAAAHAAEAAAAUABUAAAAHAAEAAAAUABYAAAAHAAEAAAAUABcAAAAHAAEAAAAVAAYAAAAJAAQAAAAVAA4AAAAEAAEAAAAVAA8AAAAHAAAAAAAVABAAAAAHAAEAAAAVABEAAAAHAAEAAAAVABIAAAAIAAIAAAAVABMAAAAIAAAAAAAVABQAAAAHAAEAAAAVABUAAAAHAAEAAAAVABYAAAAHAAEAAAAVABcAAAAHAAEAAAAWAAUAAAAGAAEAAAAWAA8AAAAHAAAAAAAWABAAAAAHAAEAAAAWABEAAAAHAAEAAAAWABIAAAAGAAIAAAAWABMAAAAGAAAAAAAWABQAAAAHAAEAAAAWABUAAAAHAAEAAAAWABYAAAAHAAEAAAAWABcAAAAHAAEAAAAXAAAAAAAHAAEAAAAXAAMAAAAGAAAAAAAXAAQAAAAHAAEAAAAXAAoAAAAJAAYAAAAXAAsAAAAFAAEAAAAXAA4AAAAFAAEAAAAXAA8AAAAHAAAAAAAXABAAAAAHAAEAAAAYAAAAAAAHAAEAAAAYAAEAAAAHAAEAAAAYAAIAAAAHAAEAAAAYAAMAAAAHAAEAAAAYAAQAAAAHAAEAAAAYAAUAAAAHAAEAAAAYAAkAAAAEAAEAAAAYAAoAAAAKAAMAAAAYAAsAAAAKAAQAAAAYAA0AAAAFAAEAAAAYAA8AAAAGAAAAAAAZAAAAAAAHAAEAAAAZAAEAAAAHAAEAAAAZAAIAAAAHAAEAAAAZAAMAAAAHAAEAAAAZAAQAAAAHAAEAAAAZAAUAAAAHAAEAAAAZAAgAAAAGAAEAAAAZAAkAAAAGAAEAAAAZAAoAAAAGAAEAAAAZAAsAAAAGAAEAAAAZAAwAAAAGAAEAAAAZAA4AAAAGAAAAAAAZAA8AAAAHAAEAAAAaAAAAAAAHAAEAAAAaAAEAAAAHAAEAAAAaAAIAAAAHAAEAAAAaAAMAAAAHAAEAAAAaAAQAAAAHAAEAAAAaAAUAAAAHAAEAAAAaAAYAAAAHAAEAAAAaAAcAAAAHAAEAAAAaAAgAAAAHAAEAAAAaAAkAAAAHAAEAAAAaAAoAAAAHAAEAAAAaAAsAAAAHAAEAAAAaAAwAAAAHAAEAAAAaAA0AAAAHAAEAAAAaAA4AAAAHAAEAAAAaAA8AAAAHAAEAAAAbAAAAAAAHAAEAAAAbAAEAAAAHAAEAAAAbAAIAAAAHAAEAAAAbAAMAAAAHAAEAAAAbAAQAAAAHAAEAAAAbAAUAAAAHAAEAAAAbAAYAAAAHAAEAAAAbAAcAAAAHAAEAAAAbAAgAAAAHAAEAAAAbAAkAAAAHAAEAAAAbAAoAAAAHAAEAAAAbAAsAAAAHAAEAAAAbAAwAAAAHAAEAAAAbAA0AAAAHAAEAAAAbAA4AAAAHAAEAAAAbAA8AAAAHAAEAAAAcAAAAAAAHAAEAAAAcAAEAAAAHAAEAAAAcAAIAAAAHAAEAAAAcAAMAAAAHAAEAAAAcAAQAAAAHAAEAAAAcAAUAAAAHAAEAAAAcAAYAAAAHAAEAAAAcAAcAAAAHAAEAAAAcAAgAAAAHAAEAAAAcAAkAAAAHAAEAAAAcAAoAAAAHAAEAAAAcAAsAAAAHAAEAAAAcAAwAAAAHAAEAAAAcAA0AAAAHAAEAAAAcAA4AAAAHAAEAAAAcAA8AAAAHAAEAAAAdAAAAAAAHAAEAAAAdAAEAAAAHAAEAAAAdAAIAAAAHAAEAAAAdAAMAAAAHAAEAAAAdAAQAAAAHAAEAAAAdAAUAAAAHAAEAAAAdAAYAAAAHAAEAAAAdAAcAAAAHAAEAAAAdAAgAAAAHAAEAAAAdAAkAAAAHAAEAAAAdAAoAAAAHAAEAAAAdAAsAAAAHAAEAAAAdAAwAAAAHAAEAAAAdAA0AAAAHAAEAAAAdAA4AAAAHAAEAAAAdAA8AAAAHAAEAAAAeAAAAAAAHAAEAAAAeAAEAAAAHAAEAAAAeAAIAAAAHAAEAAAAeAAMAAAAHAAEAAAAeAAQAAAAHAAEAAAAeAAUAAAAHAAEAAAAeAAYAAAAHAAEAAAAeAAcAAAAHAAEAAAAeAAgAAAAHAAEAAAAeAAkAAAAHAAEAAAAeAAoAAAAHAAEAAAAeAAsAAAAHAAEAAAAeAAwAAAAHAAEAAAAeAA0AAAAHAAEAAAAeAA4AAAAHAAEAAAAeAA8AAAAHAAEAAAAfAAAAAAAHAAEAAAAfAAEAAAAHAAEAAAAfAAIAAAAHAAEAAAAfAAMAAAAHAAEAAAAfAAQAAAAHAAEAAAAfAAUAAAAHAAEAAAAfAAYAAAAHAAEAAAAfAAcAAAAHAAEAAAAfAAgAAAAHAAEAAAAfAAkAAAAHAAEAAAAfAAoAAAAHAAEAAAAfAAsAAAAHAAEAAAAfAAwAAAAHAAEAAAAfAA0AAAAHAAEAAAAfAA4AAAAHAAEAAAAfAA8AAAAHAAEAAAAgAAAAAAAHAAEAAAAgAAEAAAAHAAEAAAAgAAIAAAAHAAEAAAAgAAMAAAAHAAEAAAAgAAQAAAAHAAEAAAAgAAUAAAAHAAEAAAAgAAYAAAAHAAEAAAAgAAcAAAAHAAEAAAAgAAgAAAAHAAEAAAAgAAkAAAAHAAEAAAAgAAoAAAAHAAEAAAAgAAsAAAAHAAEAAAAgAAwAAAAHAAEAAAAgAA0AAAAHAAEAAAAgAA4AAAAHAAEAAAAgAA8AAAAHAAEAAAAhAAAAAAAHAAEAAAAhAAEAAAAHAAEAAAAhAAIAAAAHAAEAAAAhAAMAAAAHAAEAAAAhAAQAAAAHAAEAAAAhAAUAAAAHAAEAAAAhAAYAAAAHAAEAAAAhAAcAAAAHAAEAAAAhAAgAAAAHAAEAAAAhAAkAAAAHAAEAAAAhAAoAAAAHAAEAAAAhAAsAAAAHAAEAAAAhAAwAAAAHAAEAAAAhAA0AAAAHAAEAAAAhAA4AAAAHAAEAAAAhAA8AAAAHAAEAAAAiAAAAAAAHAAEAAAAiAAEAAAAHAAEAAAAiAAIAAAAHAAEAAAAiAAMAAAAHAAEAAAAiAAQAAAAHAAEAAAAiAAUAAAAHAAEAAAAiAAYAAAAHAAEAAAAiAAcAAAAHAAEAAAAiAAgAAAAHAAEAAAAiAAkAAAAHAAEAAAAiAAoAAAAHAAEAAAAiAAsAAAAHAAEAAAAiAAwAAAAHAAEAAAAiAA0AAAAHAAEAAAAiAA4AAAAHAAEAAAAiAA8AAAAHAAEAAAAjAAAAAAAHAAEAAAAjAAEAAAAHAAEAAAAjAAIAAAAHAAEAAAAjAAMAAAAHAAEAAAAjAAQAAAAHAAEAAAAjAAUAAAAHAAEAAAAjAAYAAAAHAAEAAAAjAAcAAAAHAAEAAAAjAAgAAAAHAAEAAAAjAAkAAAAHAAEAAAAjAAoAAAAHAAEAAAAjAAsAAAAHAAEAAAAjAAwAAAAHAAEAAAAjAA0AAAAHAAEAAAAjAA4AAAAHAAEAAAAjAA8AAAAHAAEAAAAkAAAAAAAHAAEAAAAkAAEAAAAHAAEAAAAkAAIAAAAHAAEAAAAkAAMAAAAHAAEAAAAkAAQAAAAHAAEAAAAkAAUAAAAHAAEAAAAkAAYAAAAHAAEAAAAkAAcAAAAHAAEAAAAkAAgAAAAHAAEAAAAkAAkAAAAHAAEAAAAkAAoAAAAHAAEAAAAkAAsAAAAHAAEAAAAkAAwAAAAHAAEAAAAkAA0AAAAHAAEAAAAkAA4AAAAHAAEAAAAkAA8AAAAHAAEAAAD0/wAAAAAHAAEAAAD0/wEAAAAHAAEAAAD0/wIAAAAHAAEAAAD0/wMAAAAHAAEAAAD0/wQAAAAHAAEAAAD0/wUAAAAHAAEAAAD0/wYAAAAHAAEAAAD0/wcAAAAHAAEAAAD0/wgAAAAHAAEAAAD0/wkAAAAHAAEAAAD0/woAAAAHAAEAAAD0/wsAAAAHAAEAAAD0/wwAAAAHAAEAAAD0/w0AAAAHAAEAAAD0/w4AAAAHAAEAAAD0/w8AAAAHAAEAAAD0/xAAAAAHAAEAAAD0/xEAAAAHAAEAAAD0/xIAAAAHAAEAAAD0/xMAAAAHAAEAAAD0/xQAAAAHAAEAAAD0/xUAAAAGAAIAAAD0/xYAAAAHAAEAAAD0/xcAAAAHAAEAAAD0/xgAAAAGAAIAAAD1/xgAAAAHAAEAAAD2/xgAAAAHAAEAAAD3/xgAAAAHAAEAAAD4/xgAAAAHAAEAAAD5/xgAAAAHAAEAAAD6/xgAAAAHAAEAAAD7/xgAAAAHAAEAAAD8/xgAAAAHAAEAAAD9/xgAAAAHAAEAAAD+/xgAAAAHAAEAAAD//xgAAAAHAAEAAAAAABgAAAAHAAEAAAABABgAAAAHAAEAAAACABgAAAAHAAEAAAADAAAAAAAHAAIAAAADAAQAAAADAAIAAAADAAoAAAAJAAMAAAADABgAAAAHAAEAAAAEAAgAAAAJAAMAAAAEAAoAAAAJAAMAAAAEABgAAAAHAAEAAAAFABgAAAAIAAIAAAAGAAwAAAAIAAYAAAAHAAUAAAAEAAIAAAAHAAwAAAAJAAYAAAAHAA0AAAAEAAEAAAAHABYAAAAIAAIAAAAIAA0AAAAEAAEAAAAIABYAAAAGAAIAAAAJAAUAAAAEAAIAAAAJAAoAAAALAAYAAAAJABYAAAAIAAIAAAAKAAAAAAAGAAIAAAAKAAoAAAAEAAEAAAAKAAwAAAAJAAMAAAAKAA0AAAAEAAIAAAAKABYAAAAHAAEAAAAKABcAAAAHAAEAAAAKABgAAAAGAAIAAAALAAAAAAAHAAEAAAALAAEAAAAHAAIAAAALAAQAAQADAAUAAAALAAUAAAAIAAYAAAALAAYAAAAFAAEAAAALABgAAAAHAAEAAAAMAAEAAAAHAAIAAAAMAAIAAQADAAUAAAAMAAYAAAAFAAEAAAAMAAoAAAAEAAEAAAAMAAwAAAAKAAYAAAAMABgAAAAIAAIAAAANAAYAAAAFAAIAAAANAAcAAAAFAAEAAAANABEAAAAGAAAAAAANABIAAAAGAAIAAAANABMAAAAEAAIAAAAOAAAAAQAFAAcAAAAOAAEAAAAFAAIAAAAOAAcAAAAFAAEAAAAOAAoAAAAIAAgAAAAOABMAAAAGAAIAAAAPAAcAAAAFAAEAAAAPAA4AAAAEAAEAAAAPABMAAAAHAAEAAAAPABQAAAAGAAIAAAAPABUAAAAGAAEAAAAPABYAAAAGAAEAAAAQABYAAAAIAAIAAAARABYAAAAHAAEAAAARABcAAAAHAAEAAAARABgAAAAGAAIAAAASAAIAAAAEAAEAAAASABgAAAAHAAEAAAATABgAAAAHAAEAAAAUAAEAAAAEAAEAAAAUAAcAAAAFAAEAAAAUABgAAAAHAAEAAAAVABgAAAAHAAEAAAAWAAAAAAAGAAIAAAAWAAEAAAAGAAEAAAAWAAQAAAAGAAEAAAAWABgAAAAIAAIAAAAXAAEAAAAHAAEAAAAXAAIAAAAGAAIAAAAXAAUAAAAHAAEAAAAXAAYAAAAGAAIAAAAXAAwAAAAJAAYAAAAYAAYAAAAIAAIAAAAYAAwAAAAKAAUAAAAYABAAAAAHAAEAAAAZAAYAAAAGAAIAAAAZAAcAAAAGAAEAAAAZAA0AAAAGAAEAAAAZABAAAAAHAAEAAAAaABAAAAAHAAEAAAAbABAAAAAHAAEAAAAcABAAAAAHAAEAAAAdABAAAAAHAAEAAAAeABAAAAAHAAEAAAAfABAAAAAHAAEAAAAgABAAAAAHAAEAAAAhABAAAAAHAAEAAAAiABAAAAAHAAEAAAAjABAAAAAHAAEAAAAkABAAAAAHAAEAAAAkAP//AAAHAAEAAAAkAP7/AAAHAAEAAAAkAP3/AAAHAAEAAAAkAPz/AAAHAAEAAAAkAPv/AAAHAAEAAAAkAPr/AAAHAAEAAAAkAPn/AAAHAAEAAAAkAPj/AAAIAAAAAAAjAP//AAAHAAEAAAAjAP7/AAAHAAEAAAAjAP3/AAAHAAEAAAAjAPz/AAAHAAEAAAAjAPv/AAAHAAEAAAAjAPr/AAAHAAEAAAAjAPn/AAAHAAEAAAAjAPj/AAAHAAEAAAAiAP//AAAHAAEAAAAiAP7/AAAHAAEAAAAiAP3/AAAHAAEAAAAiAPz/AAAHAAEAAAAiAPv/AAAHAAEAAAAiAPr/AAAHAAEAAAAiAPn/AAAHAAEAAAAiAPj/AAAHAAEAAAAhAP//AAAHAAEAAAAhAP7/AAAHAAEAAAAhAP3/AAAHAAEAAAAhAPz/AAAHAAEAAAAhAPv/AAAHAAEAAAAhAPr/AAAHAAEAAAAhAPn/AAAHAAEAAAAhAPj/AAAHAAEAAAAgAP//AAAHAAEAAAAgAP7/AAAHAAEAAAAgAP3/AAAHAAEAAAAgAPz/AAAHAAEAAAAgAPv/AAAHAAEAAAAgAPr/AAAHAAEAAAAgAPn/AAAHAAEAAAAgAPj/AAAHAAEAAAAfAP//AAAHAAEAAAAfAP7/AAAHAAEAAAAfAP3/AAAHAAEAAAAfAPz/AAAHAAEAAAAfAPv/AAAHAAEAAAAfAPr/AAAHAAEAAAAfAPn/AAAHAAEAAAAfAPj/AAAHAAEAAAAeAP//AAAHAAEAAAAeAP7/AAAHAAEAAAAeAP3/AAAHAAEAAAAeAPz/AAAHAAEAAAAeAPv/AAAHAAEAAAAeAPr/AAAHAAEAAAAeAPn/AAAHAAEAAAAeAPj/AAAHAAEAAAAdAP//AAAHAAEAAAAdAP7/AAAHAAEAAAAdAP3/AAAHAAEAAAAdAPz/AAAHAAEAAAAdAPv/AAAHAAEAAAAdAPr/AAAHAAEAAAAdAPn/AAAHAAEAAAAdAPj/AAAHAAEAAAAcAP//AAAHAAEAAAAcAP7/AAAHAAEAAAAcAP3/AAAHAAEAAAAcAPz/AAAHAAEAAAAcAPv/AAAHAAEAAAAcAPr/AAAHAAEAAAAcAPn/AAAHAAEAAAAcAPj/AAAHAAEAAAAbAP//AAAHAAEAAAAbAP7/AAAHAAEAAAAbAP3/AAAHAAEAAAAbAPz/AAAHAAEAAAAbAPv/AAAHAAEAAAAbAPr/AAAHAAEAAAAbAPn/AAAHAAEAAAAbAPj/AAAHAAEAAAAaAP//AAAHAAEAAAAaAP7/AAAHAAEAAAAaAP3/AAAHAAEAAAAaAPz/AAAHAAEAAAAaAPv/AAAHAAEAAAAaAPr/AAAHAAEAAAAaAPn/AAAHAAEAAAAaAPj/AAAHAAEAAAAZAP//AAAHAAEAAAAZAP7/AAAHAAEAAAAZAP3/AAAHAAEAAAAZAPz/AAAHAAEAAAAZAPv/AAAHAAEAAAAZAPr/AAAHAAEAAAAZAPn/AAAHAAEAAAAZAPj/AAAHAAEAAAAYAP//AAAHAAEAAAAYAP7/AAAHAAEAAAAYAP3/AAAHAAEAAAAYAPz/AAAHAAEAAAAYAPv/AAAHAAEAAAAYAPr/AAAHAAEAAAAYAPn/AAAHAAEAAAAYAPj/AAAHAAEAAAAXAP//AAAHAAEAAAAXAP7/AAAHAAEAAAAXAP3/AAAHAAEAAAAXAPz/AAAHAAEAAAAXAPv/AAAHAAEAAAAXAPr/AAAHAAEAAAAXAPn/AAAHAAEAAAAXAPj/AAAHAAEAAAAWAP//AAAHAAEAAAAWAP7/AAAHAAEAAAAWAP3/AAAHAAEAAAAWAPz/AAAHAAEAAAAWAPv/AAAHAAEAAAAWAPr/AAAHAAEAAAAWAPn/AAAHAAEAAAAWAPj/AAAHAAEAAAAVAP//AAAGAAIAAAAVAP7/AAAHAAEAAAAVAP3/AAAHAAEAAAAVAPz/AAAHAAEAAAAVAPv/AAAHAAEAAAAVAPr/AAAHAAEAAAAVAPn/AAAHAAEAAAAVAPj/AAAHAAEAAAAUAP//AAAHAAIAAAAUAP7/AAAHAAEAAAAUAP3/AAAHAAEAAAAUAPz/AAAHAAEAAAAUAPv/AAAHAAEAAAAUAPr/AAAHAAEAAAAUAPn/AAAHAAEAAAAUAPj/AAAHAAEAAAATAP//AAAHAAIAAAATAP7/AAAHAAEAAAATAP3/AAAHAAEAAAATAPz/AAAHAAEAAAATAPv/AAAHAAEAAAATAPr/AAAHAAEAAAATAPn/AAAHAAEAAAATAPj/AAAHAAEAAAASAP//AAAHAAIAAAASAP7/AAAHAAEAAAASAP3/AAAHAAEAAAASAPz/AAAHAAEAAAASAPv/AAAHAAEAAAASAPr/AAAHAAEAAAASAPn/AAAHAAEAAAASAPj/AAAHAAEAAAARAP//AAAHAAIAAAARAP7/AAAHAAEAAAARAP3/AAAHAAEAAAARAPz/AAAHAAEAAAARAPv/AAAHAAEAAAARAPr/AAAHAAEAAAARAPn/AAAHAAEAAAARAPj/AAAHAAEAAAAQAP//AAAHAAIAAAAQAP7/AAAHAAEAAAAQAP3/AAAHAAEAAAAQAPz/AAAHAAEAAAAQAPv/AAAHAAEAAAAQAPr/AAAHAAEAAAAQAPn/AAAHAAEAAAAQAPj/AAAHAAEAAAAPAP//AAAHAAIAAAAPAP7/AAAHAAEAAAAPAP3/AAAHAAEAAAAPAPz/AAAHAAEAAAAPAPv/AAAHAAEAAAAPAPr/AAAHAAEAAAAPAPn/AAAHAAEAAAAPAPj/AAAHAAEAAAAOAP//AAAIAAIAAAAOAP7/AAAHAAEAAAAOAP3/AAAHAAEAAAAOAPz/AAAHAAEAAAAOAPv/AAAHAAEAAAAOAPr/AAAHAAEAAAAOAPn/AAAHAAEAAAAOAPj/AAAHAAEAAAANAP//AAAHAAEAAAANAP7/AAAHAAEAAAANAP3/AAAHAAEAAAANAPz/AAAHAAEAAAANAPv/AAAHAAEAAAANAPr/AAAHAAEAAAANAPn/AAAHAAEAAAANAPj/AAAHAAEAAAAMAP//AAAHAAEAAAAMAP7/AAAHAAEAAAAMAP3/AAAHAAEAAAAMAPz/AAAHAAEAAAAMAPv/AAAHAAEAAAAMAPr/AAAHAAEAAAAMAPn/AAAHAAEAAAAMAPj/AAAHAAEAAAALAP//AAAHAAEAAAALAP7/AAAHAAEAAAALAP3/AAAHAAEAAAALAPz/AAAHAAEAAAALAPv/AAAHAAEAAAALAPr/AAAHAAEAAAALAPn/AAAHAAEAAAALAPj/AAAHAAEAAAAKAP//AAAHAAEAAAAKAP7/AAAHAAEAAAAKAP3/AAAHAAEAAAAKAPz/AAAHAAEAAAAKAPv/AAAHAAEAAAAKAPr/AAAHAAEAAAAKAPn/AAAHAAEAAAAKAPj/AAAHAAEAAAAJAP//AAAGAAIAAAAJAP7/AAAHAAEAAAAJAP3/AAAHAAEAAAAJAPz/AAAHAAEAAAAJAPv/AAAHAAEAAAAJAPr/AAAHAAEAAAAJAPn/AAAHAAEAAAAJAPj/AAAHAAEAAAAIAP//AAAHAAIAAAAIAP7/AAAHAAEAAAAIAP3/AAAHAAEAAAAIAPz/AAAHAAEAAAAIAPv/AAAHAAEAAAAIAPr/AAAHAAEAAAAIAPn/AAAHAAEAAAAIAPj/AAAHAAEAAAAHAP//AAAHAAIAAAAHAP7/AAAHAAEAAAAHAP3/AAAHAAEAAAAHAPz/AAAHAAEAAAAHAPv/AAAHAAEAAAAHAPr/AAAHAAEAAAAHAPn/AAAHAAEAAAAHAPj/AAAHAAEAAAAGAP//AAAHAAIAAAAGAP7/AAAHAAEAAAAGAP3/AAAHAAEAAAAGAPz/AAAHAAEAAAAGAPv/AAAHAAEAAAAGAPr/AAAHAAEAAAAGAPn/AAAHAAEAAAAGAPj/AAAHAAEAAAAFAP//AAAHAAIAAAAFAP7/AAAHAAEAAAAFAP3/AAAHAAEAAAAFAPz/AAAHAAEAAAAFAPv/AAAHAAEAAAAFAPr/AAAHAAEAAAAFAPn/AAAHAAEAAAAFAPj/AAAHAAEAAAAEAP//AAAIAAIAAAAEAP7/AAAHAAEAAAAEAP3/AAAHAAEAAAAEAPz/AAAHAAEAAAAEAPv/AAAHAAEAAAAEAPr/AAAHAAEAAAAEAPn/AAAHAAEAAAAEAPj/AAAHAAEAAAADAP//AAAHAAEAAAADAP7/AAAHAAEAAAADAP3/AAAHAAEAAAADAPz/AAAHAAEAAAADAPv/AAAHAAEAAAADAPr/AAAHAAEAAAADAPn/AAAHAAEAAAADAPj/AAAHAAEAAAACAP//AAAHAAEAAAACAP7/AAAHAAEAAAACAP3/AAAHAAEAAAACAPz/AAAHAAEAAAACAPv/AAAHAAEAAAACAPr/AAAHAAEAAAACAPn/AAAHAAEAAAACAPj/AAAHAAEAAAABAP//AAAHAAEAAAABAP7/AAAHAAEAAAABAP3/AAAHAAEAAAABAPz/AAAHAAEAAAABAPv/AAAHAAEAAAABAPr/AAAHAAEAAAABAPn/AAAHAAEAAAABAPj/AAAHAAEAAAAAAP//AAAHAAEAAAAAAP7/AAAHAAEAAAAAAP3/AAAHAAEAAAAAAPz/AAAHAAEAAAAAAPv/AAAHAAEAAAAAAPr/AAAHAAEAAAAAAPn/AAAHAAEAAAAAAPj/AAAHAAEAAAD/////AAAHAAEAAAD///7/AAAHAAEAAAD///3/AAAHAAEAAAD///z/AAAHAAEAAAD///v/AAAHAAEAAAD///r/AAAHAAEAAAD///n/AAAHAAEAAAD///j/AAAHAAEAAAD+////AAAHAAEAAAD+//7/AAAHAAEAAAD+//3/AAAHAAEAAAD+//z/AAAHAAEAAAD+//v/AAAHAAEAAAD+//r/AAAHAAEAAAD+//n/AAAHAAEAAAD+//j/AAAHAAEAAAD9////AAAHAAEAAAD9//7/AAAHAAEAAAD9//3/AAAHAAEAAAD9//z/AAAHAAEAAAD9//v/AAAHAAEAAAD9//r/AAAHAAEAAAD9//n/AAAHAAEAAAD9//j/AAAHAAEAAAD8////AAAHAAEAAAD8//7/AAAHAAEAAAD8//3/AAAHAAEAAAD8//z/AAAHAAEAAAD8//v/AAAHAAEAAAD8//r/AAAHAAEAAAD8//n/AAAHAAEAAAD8//j/AAAHAAEAAAD7////AAAHAAEAAAD7//7/AAAHAAEAAAD7//3/AAAHAAEAAAD7//z/AAAHAAEAAAD7//v/AAAHAAEAAAD7//r/AAAHAAEAAAD7//n/AAAHAAEAAAD7//j/AAAHAAEAAAD6////AAAHAAEAAAD6//7/AAAHAAEAAAD6//3/AAAHAAEAAAD6//z/AAAHAAEAAAD6//v/AAAHAAEAAAD6//r/AAAHAAEAAAD6//n/AAAHAAEAAAD6//j/AAAHAAEAAAD5////AAAHAAEAAAD5//7/AAAHAAEAAAD5//3/AAAHAAEAAAD5//z/AAAHAAEAAAD5//v/AAAHAAEAAAD5//r/AAAHAAEAAAD5//n/AAAHAAEAAAD5//j/AAAHAAEAAAD4////AAAHAAEAAAD4//7/AAAHAAEAAAD4//3/AAAHAAEAAAD4//z/AAAHAAEAAAD4//v/AAAHAAEAAAD4//r/AAAHAAEAAAD4//n/AAAHAAEAAAD4//j/AAAHAAEAAAD3////AAAHAAEAAAD3//7/AAAHAAEAAAD3//3/AAAHAAEAAAD3//z/AAAHAAEAAAD3//v/AAAHAAEAAAD3//r/AAAHAAEAAAD3//n/AAAHAAEAAAD3//j/AAAHAAEAAAD2////AAAHAAEAAAD2//7/AAAHAAEAAAD2//3/AAAHAAEAAAD2//z/AAAHAAEAAAD2//v/AAAHAAEAAAD2//r/AAAHAAEAAAD2//n/AAAHAAEAAAD2//j/AAAHAAEAAAD1////AAAHAAEAAAD1//7/AAAHAAEAAAD1//3/AAAHAAEAAAD1//z/AAAHAAEAAAD1//v/AAAHAAEAAAD1//r/AAAHAAEAAAD1//n/AAAHAAEAAAD1//j/AAAHAAEAAAD0////AAAHAAEAAAD0//7/AAAHAAEAAAD0//3/AAAHAAEAAAD0//z/AAAHAAEAAAD0//v/AAAHAAEAAAD0//r/AAAHAAEAAAD0//n/AAAHAAEAAAD0//j/AAAGAAAAAAA=") +tile_set = ExtResource("7_po5fq") +script = ExtResource("55_a8sfs") metadata/_edit_lock_ = true -[node name="MoodyHero" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("11_yntrj")] +[node name="TreeTops" type="TileMapLayer" parent="Field/Map/Town"] +y_sort_enabled = true +tile_map_data = PackedByteArray("AAAAAAoAAAAHAAAAAAACAAwAAAAEAAAAAAADAAUAAAAEAAAAAAADAA4AAAAEAAAAAAAEAA0AAAAEAAAAAAAHAAkAAAADAAUAAAAHAAwAAAAEAAAAAAAIAAwAAAAEAAAAAAAJAA4AAAAEAAAAAAAKAAkAAAAEAAAAAAAMAAkAAAAEAAAAAAAOAAkAAAAIAAcAAAAPAA0AAAAEAAAAAAAQAAIAAAAEAAAAAAASAAEAAAAEAAAAAAAUAAAAAAAEAAAAAAAVAA0AAAAEAAAAAAAYAAgAAAAEAAAAAAA=") +tile_set = ExtResource("7_po5fq") + +[node name="Gamepieces" type="Node2D" parent="Field/Map/Town"] +y_sort_enabled = true + +[node name="MoodyHero" parent="Field/Map/Town/Gamepieces" instance=ExtResource("11_yntrj")] position = Vector2(296, 24) -gameboard = ExtResource("6_kd8tv") -blocks_movement = true +animation_scene = ExtResource("14_av6f5") metadata/_edit_group_ = true -[node name="KnightGFX" parent="Field/Terrain/Gamepieces/Town/MoodyHero" instance=ExtResource("14_av6f5")] - -[node name="Interaction" parent="Field/Terrain/Gamepieces/Town/MoodyHero" instance=ExtResource("19_sa6jd")] +[node name="Interaction" parent="Field/Map/Town/Gamepieces/MoodyHero" instance=ExtResource("19_sa6jd")] script = ExtResource("13_0rh60") timeline = ExtResource("14_68y0v") -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/MoodyHero/Interaction" instance=ExtResource("34_qs25x")] -emote = 1 +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/MoodyHero/Interaction" instance=ExtResource("34_qs25x")] -[node name="Runner" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("11_yntrj")] +[node name="Runner" parent="Field/Map/Town/Gamepieces" instance=ExtResource("11_yntrj")] position = Vector2(296, 184) -gameboard = ExtResource("6_kd8tv") -blocks_movement = true +animation_scene = ExtResource("12_n5rm1") metadata/_edit_group_ = true -[node name="GenericCharacterAnimation" parent="Field/Terrain/Gamepieces/Town/Runner" instance=ExtResource("12_n5rm1")] - -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/Runner/GenericCharacterAnimation" instance=ExtResource("34_qs25x")] +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/Runner" instance=ExtResource("34_qs25x")] script = ExtResource("18_8igsj") -emote = 1 -[node name="Interaction" parent="Field/Terrain/Gamepieces/Town/Runner" instance=ExtResource("19_sa6jd")] +[node name="Interaction" parent="Field/Map/Town/Gamepieces/Runner/InteractionPopup" instance=ExtResource("19_sa6jd")] script = ExtResource("14_b3y71") timeline = ExtResource("16_ybo02") -[node name="LoopAI" type="Node2D" parent="Field/Terrain/Gamepieces/Town/Runner" node_paths=PackedStringArray("move_path")] +[node name="LoopAI" type="Node2D" parent="Field/Map/Town/Gamepieces/Runner" node_paths=PackedStringArray("path_to_follow")] script = ExtResource("12_glwd5") -move_path = NodePath("MovePath") -gamepiece_mask = 2 +path_to_follow = NodePath("MovePath") -[node name="WaitTimer" type="Timer" parent="Field/Terrain/Gamepieces/Town/Runner/LoopAI"] +[node name="WaitTimer" type="Timer" parent="Field/Map/Town/Gamepieces/Runner/LoopAI"] wait_time = 1.5 one_shot = true -[node name="MovePath" type="Line2D" parent="Field/Terrain/Gamepieces/Town/Runner/LoopAI"] +[node name="MovePath" type="Line2D" parent="Field/Map/Town/Gamepieces/Runner/LoopAI"] points = PackedVector2Array(1.52588e-05, 1.52588e-05, 0, -32, -32, -32, -32, 0, 0, 0) width = 2.0 -[node name="Thief" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("11_yntrj")] +[node name="Thief" parent="Field/Map/Town/Gamepieces" instance=ExtResource("11_yntrj")] position = Vector2(248, 8) -gameboard = ExtResource("6_kd8tv") -blocks_movement = true +animation_scene = ExtResource("17_sieyv") metadata/_edit_group_ = true -[node name="ThiefGFX" parent="Field/Terrain/Gamepieces/Town/Thief" instance=ExtResource("17_sieyv")] - -[node name="Interaction" parent="Field/Terrain/Gamepieces/Town/Thief" instance=ExtResource("19_sa6jd")] +[node name="Interaction" parent="Field/Map/Town/Gamepieces/Thief" instance=ExtResource("19_sa6jd")] script = ExtResource("13_0rh60") timeline = ExtResource("22_rd6oa") -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/Thief/Interaction" instance=ExtResource("34_qs25x")] -emote = 1 +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/Thief/Interaction" instance=ExtResource("34_qs25x")] -[node name="Monk" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("11_yntrj")] +[node name="Monk" parent="Field/Map/Town/Gamepieces" instance=ExtResource("11_yntrj")] position = Vector2(344, 8) -gameboard = ExtResource("6_kd8tv") -blocks_movement = true +animation_scene = ExtResource("17_qgtho") metadata/_edit_group_ = true -[node name="MonkGFX" parent="Field/Terrain/Gamepieces/Town/Monk" instance=ExtResource("17_qgtho")] - -[node name="Interaction" parent="Field/Terrain/Gamepieces/Town/Monk" instance=ExtResource("19_sa6jd")] +[node name="Interaction" parent="Field/Map/Town/Gamepieces/Monk" instance=ExtResource("19_sa6jd")] script = ExtResource("13_0rh60") timeline = ExtResource("24_grnqa") -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/Monk/Interaction" instance=ExtResource("34_qs25x")] -emote = 1 +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/Monk/Interaction" instance=ExtResource("34_qs25x")] -[node name="Smith" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("11_yntrj")] +[node name="Smith" parent="Field/Map/Town/Gamepieces" instance=ExtResource("11_yntrj")] position = Vector2(136, 88) -gameboard = ExtResource("6_kd8tv") -blocks_movement = true +animation_scene = ExtResource("18_2msel") metadata/_edit_group_ = true -[node name="KnightGFX" parent="Field/Terrain/Gamepieces/Town/Smith" instance=ExtResource("18_2msel")] - -[node name="Interaction" parent="Field/Terrain/Gamepieces/Town/Smith" instance=ExtResource("19_sa6jd")] +[node name="Interaction" parent="Field/Map/Town/Gamepieces/Smith" instance=ExtResource("19_sa6jd")] script = ExtResource("14_b3y71") timeline = ExtResource("22_dko83") -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/Smith/Interaction" instance=ExtResource("34_qs25x")] -emote = 1 +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/Smith/Interaction" instance=ExtResource("34_qs25x")] -[node name="Wizard" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("11_yntrj")] +[node name="Wizard" parent="Field/Map/Town/Gamepieces" instance=ExtResource("11_yntrj")] position = Vector2(344, 72) -gameboard = ExtResource("6_kd8tv") -blocks_movement = true +animation_scene = ExtResource("19_ius2d") metadata/_edit_group_ = true -[node name="WizardGFX" parent="Field/Terrain/Gamepieces/Town/Wizard" instance=ExtResource("19_ius2d")] - -[node name="Interaction" parent="Field/Terrain/Gamepieces/Town/Wizard" instance=ExtResource("19_sa6jd")] +[node name="Interaction" parent="Field/Map/Town/Gamepieces/Wizard" instance=ExtResource("19_sa6jd")] script = ExtResource("13_0rh60") timeline = ExtResource("28_ll4xp") -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/Wizard/Interaction" instance=ExtResource("34_qs25x")] -emote = 1 +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/Wizard/Interaction" instance=ExtResource("34_qs25x")] -[node name="AdoringFan" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("11_yntrj")] +[node name="AdoringFan" parent="Field/Map/Town/Gamepieces" instance=ExtResource("11_yntrj")] position = Vector2(280, 104) -gameboard = ExtResource("6_kd8tv") -blocks_movement = true +animation_scene = ExtResource("12_n5rm1") move_speed = 235.0 -metadata/_edit_group_ = true - -[node name="GFX" parent="Field/Terrain/Gamepieces/Town/AdoringFan" instance=ExtResource("12_n5rm1")] -[node name="Controller" type="Node2D" parent="Field/Terrain/Gamepieces/Town/AdoringFan"] +[node name="GamepieceController" type="Node2D" parent="Field/Map/Town/Gamepieces/AdoringFan"] script = ExtResource("26_p8jrd") -gamepiece_mask = 6 -run_during_cutscenes = true +metadata/_edit_lock_ = true -[node name="Interaction" parent="Field/Terrain/Gamepieces/Town/AdoringFan" node_paths=PackedStringArray("controller") instance=ExtResource("19_sa6jd")] +[node name="Interaction" parent="Field/Map/Town/Gamepieces/AdoringFan" node_paths=PackedStringArray("controller") instance=ExtResource("19_sa6jd")] script = ExtResource("29_at3vc") -controller = NodePath("../Controller") -timeline = ExtResource("30_n17q5") +controller = NodePath("../GamepieceController") +timeline = ExtResource("29_a8sfs") +metadata/_edit_lock_ = true -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/AdoringFan/Interaction" instance=ExtResource("34_qs25x")] -emote = 1 +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/AdoringFan/Interaction" instance=ExtResource("34_qs25x")] +metadata/_edit_lock_ = true -[node name="RoamingEncounter" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("11_yntrj")] +[node name="RoamingEncounter" parent="Field/Map/Town/Gamepieces" instance=ExtResource("39_p2lth")] position = Vector2(200, 264) -gameboard = ExtResource("6_kd8tv") -move_speed = 235.0 -metadata/_edit_group_ = true - -[node name="GhostGFX" parent="Field/Terrain/Gamepieces/Town/RoamingEncounter" instance=ExtResource("36_7n3c5")] - -[node name="CombatStartTrigger" parent="Field/Terrain/Gamepieces/Town/RoamingEncounter" instance=ExtResource("39_p2lth")] +scale = Vector2(1, 1) script = ExtResource("33_0gswb") combat_arena = ExtResource("34_moieg") +metadata/_edit_group_ = true -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/RoamingEncounter/CombatStartTrigger" instance=ExtResource("34_qs25x")] +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/RoamingEncounter" instance=ExtResource("34_qs25x")] emote = 0 radius = 64 -[node name="ConversationEncounter" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("11_yntrj")] +[node name="GhostGFX" parent="Field/Map/Town/Gamepieces/RoamingEncounter" instance=ExtResource("36_7n3c5")] +scale = Vector2(1, 1) + +[node name="ConversationEncounter" parent="Field/Map/Town/Gamepieces" instance=ExtResource("11_yntrj")] position = Vector2(83.2, 6.39999) -gameboard = ExtResource("6_kd8tv") -blocks_movement = true +animation_scene = ExtResource("36_7n3c5") metadata/_edit_group_ = true -[node name="GhostGFX" parent="Field/Terrain/Gamepieces/Town/ConversationEncounter" instance=ExtResource("36_7n3c5")] - -[node name="Interaction" parent="Field/Terrain/Gamepieces/Town/ConversationEncounter" instance=ExtResource("19_sa6jd")] +[node name="Interaction" parent="Field/Map/Town/Gamepieces/ConversationEncounter" instance=ExtResource("19_sa6jd")] script = ExtResource("35_i66wm") pre_combat_timeline = ExtResource("36_fu3a1") victory_timeline = ExtResource("37_8j2gh") loss_timeline = ExtResource("38_f1335") combat_arena = ExtResource("35_x5y1m") -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/ConversationEncounter/Interaction" instance=ExtResource("34_qs25x")] +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/ConversationEncounter/Interaction" instance=ExtResource("34_qs25x")] emote = 0 -[node name="KeyPickup" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("29_gxq7u")] +[node name="KeyPickup" parent="Field/Map/Town/Gamepieces" instance=ExtResource("29_gxq7u")] position = Vector2(40, 24) metadata/_edit_lock_ = true -[node name="Door" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("33_lbtsh")] +[node name="Door" parent="Field/Map/Town/Gamepieces" instance=ExtResource("33_lbtsh")] position = Vector2(120, 176) is_locked = true arrival_coordinates = Vector2(824, 40) @@ -585,79 +499,173 @@ new_music = ExtResource("34_xbc6u") metadata/_edit_group_ = true metadata/_edit_lock_ = true -[node name="Interaction" parent="Field/Terrain/Gamepieces/Town/Door" instance=ExtResource("19_sa6jd")] +[node name="Interaction" parent="Field/Map/Town/Gamepieces/Door" instance=ExtResource("19_sa6jd")] position = Vector2(0, -8) script = ExtResource("34_xtrml") -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/Door/Interaction" instance=ExtResource("34_qs25x")] +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/Door/Interaction" instance=ExtResource("34_qs25x")] z_index = 100 -emote = 1 -[node name="StrangeTreeInteraction" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("19_sa6jd")] +[node name="StrangeTreeInteraction" parent="Field/Map/Town/Gamepieces" instance=ExtResource("19_sa6jd")] position = Vector2(56, 72) script = ExtResource("31_y2el4") timeline = ExtResource("32_m0jee") metadata/_edit_group_ = true metadata/_edit_lock_ = true -[node name="PathBlocker" type="Area2D" parent="Field/Terrain/Gamepieces/Town/StrangeTreeInteraction"] -collision_layer = 2 -collision_mask = 0 - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Field/Terrain/Gamepieces/Town/StrangeTreeInteraction/PathBlocker"] -position = Vector2(-16, 16) -shape = SubResource("RectangleShape2D_0ughy") - -[node name="AnimationPlayer" type="AnimationPlayer" parent="Field/Terrain/Gamepieces/Town/StrangeTreeInteraction"] +[node name="AnimationPlayer" type="AnimationPlayer" parent="Field/Map/Town/Gamepieces/StrangeTreeInteraction"] libraries = { &"": SubResource("AnimationLibrary_37hna") } -[node name="TileMap" type="TileMap" parent="Field/Terrain/Gamepieces/Town/StrangeTreeInteraction"] -position = Vector2(-8, -8) -tile_set = SubResource("TileSet_tinid") -format = 2 -layer_0/tile_data = PackedInt32Array(65532, 458752, 1, 65533, 458752, 1, -3, 458752, 1, -65539, 458752, 1, -4, 458752, 1, -65540, 458752, 1, 131069, 458752, 1, -2, 458752, 1, 65534, 458752, 1, 131070, 458752, 1, 196606, 524288, 2, 131071, 524288, 2, 65535, 524288, 0, -1, 524288, 1, -65538, 524288, 0) - -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/StrangeTreeInteraction" instance=ExtResource("34_qs25x")] +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/StrangeTreeInteraction" instance=ExtResource("34_qs25x")] emote = 2 -[node name="SignInteraction" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("19_sa6jd")] +[node name="TileMap" type="TileMapLayer" parent="Field/Map/Town/Gamepieces/StrangeTreeInteraction"] +position = Vector2(-56, -72) +tile_map_data = PackedByteArray("AAD//wIAAAAHAAEAAAD//wMAAAAHAAEAAAD//wQAAAAHAAEAAAAAAAIAAAAHAAEAAAAAAAMAAAAHAAEAAAAAAAQAAAAHAAEAAAAAAAUAAAAHAAEAAAABAAIAAAAIAAAAAAABAAMAAAAHAAEAAAABAAQAAAAHAAEAAAABAAUAAAAHAAEAAAABAAYAAAAIAAIAAAACAAMAAAAIAAEAAAACAAQAAAAIAAAAAAACAAUAAAAIAAIAAAA=") +tile_set = ExtResource("7_po5fq") +script = ExtResource("55_a8sfs") + +[node name="SignInteraction" parent="Field/Map/Town/Gamepieces" instance=ExtResource("19_sa6jd")] position = Vector2(152, 168) script = ExtResource("14_b3y71") timeline = ExtResource("35_gv62s") metadata/_edit_group_ = true metadata/_edit_lock_ = true -[node name="InteractionPopup" parent="Field/Terrain/Gamepieces/Town/SignInteraction" instance=ExtResource("34_qs25x")] +[node name="InteractionPopup" parent="Field/Map/Town/Gamepieces/SignInteraction" instance=ExtResource("34_qs25x")] emote = 2 -[node name="TownToGrove" parent="Field/Terrain/Gamepieces/Town" instance=ExtResource("37_6xxks")] +[node name="TownToGrove" parent="Field/Map/Town/Gamepieces" instance=ExtResource("37_6xxks")] position = Vector2(200, 280) arrival_coordinates = Vector2(632, 424) new_music = ExtResource("41_uxhyb") metadata/_edit_lock_ = true -[node name="Grove" type="Node2D" parent="Field/Terrain/Gamepieces"] +[node name="House" type="Node2D" parent="Field/Map"] y_sort_enabled = true metadata/_edit_lock_ = true -[node name="Ghost" parent="Field/Terrain/Gamepieces/Grove" instance=ExtResource("11_yntrj")] -position = Vector2(840, 488) -gameboard = ExtResource("6_kd8tv") +[node name="Ground" type="TileMapLayer" parent="Field/Map/House"] +tile_map_data = PackedByteArray("AAAyAAIAAQAAAAQAAAAyAAMAAQAAAAQAAAAyAAQAAQAAAAQAAAAyAAUAAQAAAAQAAAAyAAYAAQAAAAQAAAAyAAcAAQAAAAQAAAAzAAIAAQAGAAMAAAAzAAMAAQAGAAMAAAAzAAQAAQAGAAMAAAAzAAUAAQAAAAQAAAAzAAYAAQAAAAQAAAAzAAcAAQAAAAQAAAA0AAIAAQAAAAQAAAA0AAMAAQAAAAQAAAA0AAQAAQAGAAMAAAA0AAUAAQAAAAQAAAA0AAYAAQAAAAQAAAA0AAcAAQAAAAQAAAA1AAIAAQAAAAQAAAA1AAMAAQAAAAQAAAA1AAQAAQAGAAMAAAA1AAUAAQAAAAQAAAA1AAYAAQAAAAQAAAA1AAcAAQAAAAQAAAA2AAIAAQAAAAQAAAA2AAMAAQAAAAQAAAA2AAQAAQAGAAMAAAA2AAUAAQAAAAQAAAA2AAYAAQAAAAQAAAA2AAcAAQAAAAQAAAA3AAIAAQAAAAQAAAA3AAMAAQAAAAQAAAA3AAQAAQAGAAMAAAA3AAUAAQAAAAQAAAA3AAYAAQAAAAQAAAA3AAcAAQAAAAQAAAA4AAIAAQAAAAQAAAA4AAMAAQAAAAQAAAA4AAQAAQAGAAMAAAA4AAUAAQAAAAQAAAA4AAYAAQAAAAQAAAA4AAcAAQAAAAQAAAA5AAQAAQAGAAMAAAA5AAUAAQAAAAQAAAA5AAYAAQAAAAQAAAA5AAcAAQAAAAQAAAA6AAEAAQAAAAAAAAA6AAIAAQAAAAAAAAA6AAMAAQADAAMAAAA6AAQAAQAAAAQAAAA6AAUAAQAAAAQAAAA6AAYAAQAAAAQAAAA6AAcAAQAAAAQAAAA7AAEAAQAAAAAAAAA7AAQAAQAAAAQAAAA7AAUAAQAAAAQAAAA7AAYAAQAAAAQAAAA7AAcAAQAAAAQAAAA=") +tile_set = ExtResource("7_po5fq") +script = ExtResource("55_a8sfs") +metadata/_edit_lock_ = true + +[node name="Walls" type="TileMapLayer" parent="Field/Map/House"] +y_sort_enabled = true +tile_map_data = PackedByteArray("AAAxAP//AQABAAAAAAAxAAAAAQABAAEAAAAxAAEAAQABAAEAAAAxAAIAAQABAAEAAAAxAAMAAQABAAEAAAAxAAQAAQABAAEAAAAxAAUAAQABAAEAAAAxAAYAAQABAAEAAAAxAAcAAQABAAEAAAAxAAgAAQABAAIAAAAyAP//AQACAAAAAAAyAAAAAQACAAEAAAAyAAEAAQAEAAMAAAAyAAgAAQACAAIAAAAzAP//AQACAAAAAAAzAAAAAQAEAAMAAAAzAAEAAQAJAAAAAAAzAAgAAQACAAIAAAA0AP//AQAGAAAAAAA0AAAAAQAGAAEAAAA0AAEAAQAGAAEAAAA0AAgAAQACAAIAAAA1AP//AQACAAAAAAA1AAAAAQAEAAMAAAA1AAEAAQAEAAMAAAA1AAgAAQACAAIAAAA2AP//AQACAAAAAAA2AAAAAQACAAEAAAA2AAEAAQAEAAMAAAA2AAgAAQACAAIAAAA3AP//AQACAAAAAAA3AAAAAQAEAAMAAAA3AAEAAQACAAEAAAA3AAgAAQACAAIAAAA4AP//AQAGAAAAAAA4AAAAAQAGAAEAAAA4AAEAAQAGAAEAAAA4AAgAAQACAAIAAAA5AP//AQACAAAAAAA5AAAAAQAEAAMAAAA5AAEAAQADAAEAAAA5AAIAAQAEAAEAAAA5AAMAAQAJAAQAAAA5AAgAAQACAAIAAAA6AP//AQACAAAAAAA6AAAAAQAJAAAAAAA6AAgAAQACAAIAAAA7AP//AQACAAAAAAA7AAAAAQAEAAMAAAA7AAIAAQACAAAAAAA7AAMAAQAEAAMAAAA7AAgAAQACAAIAAAA8AP//AQADAAAAAAA8AAAAAQADAAEAAAA8AAEAAQADAAEAAAA8AAIAAQADAAEAAAA8AAMAAQADAAEAAAA8AAQAAQADAAEAAAA8AAUAAQADAAEAAAA8AAYAAQADAAEAAAA8AAcAAQADAAEAAAA8AAgAAQADAAIAAAA=") +tile_set = ExtResource("7_po5fq") +script = ExtResource("55_a8sfs") +metadata/_edit_lock_ = true + +[node name="Decoration" type="TileMapLayer" parent="Field/Map/House"] +y_sort_enabled = true +tile_map_data = PackedByteArray("AAAyAAUAAAAKAAYAAAAyAAcAAQAKAAYAAAAzAAcAAQADAAUAAAA0AAUAAAALAAgAAAA1AAIAAQAHAAIAAAA1AAYAAQADAAUAAAA1AAcAAQADAAYAAAA2AAIAAQAHAAIAAAA2AAYAAQADAAUAAAA2AAcAAQAKAAYAAAA3AAIAAQAHAAIAAAA3AAUAAAAIAAMAAAA3AAYAAAAIAAQAAAA3AAcAAAAIAAQAAAA4AAUAAAAJAAYAAAA4AAYAAAALAAoAAAA4AAcAAAAJAAgAAAA5AAUAAAAJAAMAAAA5AAYAAAALAAgAAAA5AAcAAAAJAAgAAAA6AAUAAQADAAUAAAA6AAYAAQADAAYAAAA6AAcAAAAJAAgAAAA7AAUAAAAJAAMAAAA7AAYAAQADAAUAAAA7AAcAAAAJAAgAAAA=") +tile_set = ExtResource("7_po5fq") +script = ExtResource("55_a8sfs") +metadata/_edit_lock_ = true + +[node name="Gamepieces" type="Node2D" parent="Field/Map/House"] +y_sort_enabled = true + +[node name="TreasureChest" parent="Field/Map/House/Gamepieces" instance=ExtResource("55_mo8tx")] +position = Vector2(840, 120) +item_type = 3 +amount = 1 + +[node name="PedestalPuzzle" type="Node2D" parent="Field/Map/House/Gamepieces"] +y_sort_enabled = true +metadata/_edit_lock_ = true + +[node name="GreenPedestal" parent="Field/Map/House/Gamepieces/PedestalPuzzle" node_paths=PackedStringArray("solved_animation") instance=ExtResource("38_n1c7a")] +position = Vector2(856, 40) +solved_animation = NodePath("../Pedestal/AnimationPlayer") +pedestal_requirement = "Green" + +[node name="BluePedestal" parent="Field/Map/House/Gamepieces/PedestalPuzzle" node_paths=PackedStringArray("solved_animation") instance=ExtResource("38_n1c7a")] +position = Vector2(872, 40) +solved_animation = NodePath("../Pedestal/AnimationPlayer") +pedestal_requirement = "Blue" + +[node name="RedPedestal" parent="Field/Map/House/Gamepieces/PedestalPuzzle" node_paths=PackedStringArray("solved_animation") instance=ExtResource("38_n1c7a")] +position = Vector2(888, 40) +solved_animation = NodePath("../Pedestal/AnimationPlayer") +pedestal_requirement = "Red" + +[node name="Pedestal" parent="Field/Map/House/Gamepieces/PedestalPuzzle" instance=ExtResource("11_yntrj")] +position = Vector2(936, 72) +scale = Vector2(1, 1) metadata/_edit_group_ = true + +[node name="Sprite2D" type="Sprite2D" parent="Field/Map/House/Gamepieces/PedestalPuzzle/Pedestal"] +scale = Vector2(1, 1) +texture = ExtResource("9_woa3f") +region_enabled = true +region_rect = Rect2(85, 51, 16, 16) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Field/Map/House/Gamepieces/PedestalPuzzle/Pedestal"] +root_node = NodePath("../..") +libraries = { +&"": SubResource("AnimationLibrary_jktnn") +} + +[node name="SpikesClick" type="AudioStreamPlayer" parent="Field/Map/House/Gamepieces/PedestalPuzzle/Pedestal"] +bus = &"SFX" + +[node name="AreaTransitions" type="Node2D" parent="Field/Map/House"] + +[node name="HouseToTown" parent="Field/Map/House/AreaTransitions" instance=ExtResource("37_6xxks")] +position = Vector2(824, 24) +arrival_coordinates = Vector2(120, 184) +new_music = ExtResource("41_uxhyb") +metadata/_edit_lock_ = true + +[node name="HouseToGrove" parent="Field/Map/House/AreaTransitions" instance=ExtResource("37_6xxks")] +position = Vector2(936, 8) +arrival_coordinates = Vector2(936, 440) +new_music = ExtResource("41_uxhyb") +metadata/_edit_lock_ = true + +[node name="Forest" type="Node2D" parent="Field/Map"] +y_sort_enabled = true +metadata/_edit_lock_ = true + +[node name="Terrain" type="TileMapLayer" parent="Field/Map/Forest"] +tile_map_data = PackedByteArray("AABHACoAAAAAAAAAAABHACkAAAAAAAAAAABHACgAAAACAAAAAABHACcAAAAAAAAAAABHACYAAAAAAAAAAABHACUAAAAAAAAAAABHACQAAAAAAAAAAABHACMAAAAAAAAAAABHACIAAAACAAAAAABHACEAAAAAAAAAAABHACAAAAAAAAAAAABHAB8AAAAAAAAAAABHAB4AAAAAAAAAAABHAB0AAAAAAAAAAABHABwAAAAAAAAAAABHABsAAAAAAAAAAABHABoAAAAAAAAAAABHABkAAAAAAAAAAABHABgAAAACAAAAAABHABcAAAAAAAAAAABHABYAAAAAAAAAAABHABUAAAAAAAAAAABHABQAAAAAAAAAAABHABMAAAAAAAAAAABHABIAAAAAAAAAAABHABEAAAAAAAAAAABGACoAAAAAAAAAAABGACkAAAAAAAAAAABGACgAAAAAAAAAAABGACcAAAAAAAAAAABGACYAAAAAAAAAAABGACUAAAAAAAAAAABGACQAAAAAAAAAAABGACMAAAAAAAAAAABGACIAAAAAAAAAAABGACEAAAAAAAAAAABGACAAAAAAAAAAAABGAB8AAAAAAAAAAABGAB4AAAAAAAAAAABGAB0AAAACAAAAAABGABwAAAAAAAAAAABGABsAAAAAAAAAAABGABoAAAAAAAAAAABGABkAAAAAAAAAAABGABgAAAAAAAAAAABGABcAAAAAAAAAAABGABYAAAAAAAAAAABGABUAAAAAAAAAAABGABQAAAAAAAAAAABGABMAAAAAAAAAAABGABIAAAAAAAAAAABGABEAAAAAAAAAAABFACoAAAAAAAAAAABFACkAAAAAAAAAAABFACgAAAAAAAAAAABFACcAAAAAAAAAAABFACYAAAAAAAAAAABFACUAAAAAAAAAAABFACQAAAAAAAAAAABFACMAAAAAAAAAAABFACIAAAAAAAAAAABFACEAAAAAAAAAAABFACAAAAAAAAAAAABFAB8AAAAAAAAAAABFAB4AAAAAAAAAAABFAB0AAAAAAAAAAABFABwAAAAAAAAAAABFABsAAAAAAAAAAABFABoAAAAAAAAAAABFABkAAAAAAAAAAABFABgAAAAAAAAAAABFABcAAAAAAAAAAABFABYAAAAAAAAAAABFABUAAAAAAAAAAABFABQAAAAAAAAAAABFABMAAAAAAAAAAABFABIAAAAAAAAAAABFABEAAAAAAAAAAABEACoAAAAAAAAAAABEACkAAAAAAAAAAABEACgAAAAAAAAAAABEACcAAAAAAAAAAABEACYAAAAAAAAAAABEACUAAAAAAAAAAABEACQAAAAAAAAAAABEACMAAAAAAAAAAABEACIAAAAAAAAAAABEACEAAAAAAAAAAABEACAAAAAAAAAAAABEAB8AAAAAAAAAAABEAB4AAAAAAAAAAABEAB0AAAAAAAAAAABEABwAAAAAAAAAAABEABsAAAAAAAAAAABEABoAAAAAAAAAAABEABkAAAAAAAAAAABEABgAAAAAAAAAAABEABcAAAAAAAAAAABEABYAAAAAAAAAAABEABUAAAAAAAAAAABEABQAAAAAAAAAAABEABMAAAAAAAAAAABEABIAAAAAAAAAAABEABEAAAAAAAAAAABDACoAAAAAAAAAAABDACkAAAAAAAAAAABDACgAAAAAAAAAAABDACcAAAAAAAAAAABDACYAAAAAAAAAAABDACUAAAAAAAAAAABDACQAAAAAAAAAAABDACMAAAAAAAAAAABDACIAAAAAAAAAAABDACEAAAAAAAAAAABDACAAAAAAAAAAAABDAB8AAAAAAAAAAABDAB4AAAAAAAAAAABDAB0AAAAAAAAAAABDABwAAAAAAAAAAABDABsAAAAAAAAAAABDABoAAAAAAAAAAABDABkAAAAAAAAAAABDABgAAAAAAAAAAABDABcAAAAAAAAAAABDABYAAAAAAAAAAABDABUAAAAAAAAAAABDABQAAAAAAAAAAABDABMAAAAAAAAAAABDABIAAAAAAAAAAABDABEAAAAAAAAAAABCACoAAAAAAAAAAABCACkAAAAAAAAAAABCACgAAAAAAAAAAABCACcAAAAAAAAAAABCACYAAAAAAAAAAABCACUAAAAAAAAAAABCACQAAAAAAAAAAABCACMAAAAAAAAAAABCACIAAAACAAAAAABCACEAAAAAAAAAAABCACAAAAAAAAAAAABCAB8AAAAAAAAAAABCAB4AAAAAAAAAAABCAB0AAAAAAAAAAABCABwAAAAAAAAAAABCABsAAAABAAAAAABCABoAAAAAAAAAAABCABkAAAAAAAAAAABCABgAAAAAAAAAAABCABcAAAAAAAAAAABCABYAAAAAAAAAAABCABUAAAAAAAAAAABCABQAAAAAAAAAAABCABMAAAAAAAAAAABCABIAAAAAAAAAAABCABEAAAAAAAAAAABBACoAAAAAAAAAAABBACkAAAAAAAAAAABBACgAAAAAAAAAAABBACcAAAABAAAAAABBACYAAAAAAAAAAABBACUAAAAAAAAAAABBACQAAAAAAAAAAABBACMAAAAAAAAAAABBACIAAAAAAAAAAABBACEAAAAAAAAAAABBACAAAAAAAAAAAABBAB8AAAAAAAAAAABBAB4AAAAAAAAAAABBAB0AAAAAAAAAAABBABwAAAAAAAAAAABBABsAAAAAAAAAAABBABoAAAACAAAAAABBABkAAAAAAAAAAABBABgAAAAAAAAAAABBABcAAAAAAAAAAABBABYAAAAAAAAAAABBABUAAAAAAAAAAABBABQAAAAAAAAAAABBABMAAAAAAAAAAABBABIAAAAAAAAAAABBABEAAAAAAAAAAABAACoAAAAAAAAAAABAACkAAAAAAAAAAABAACgAAAAAAAAAAABAACcAAAAAAAAAAABAACYAAAAAAAAAAABAACUAAAAAAAAAAABAACQAAAAAAAAAAABAACMAAAAAAAAAAABAACIAAAAAAAAAAABAACEAAAAAAAAAAABAACAAAAAAAAAAAABAAB8AAAAAAAAAAABAAB4AAAAAAAAAAABAAB0AAAAAAAAAAABAABwAAAAAAAAAAABAABsAAAAAAAAAAABAABoAAAAAAAAAAABAABkAAAAAAAAAAABAABgAAAAAAAAAAABAABcAAAABAAAAAABAABYAAAAAAAAAAABAABUAAAAAAAAAAABAABQAAAAAAAAAAABAABMAAAAAAAAAAABAABIAAAAAAAAAAABAABEAAAAAAAAAAAA/ACoAAAAAAAAAAAA/ACkAAAAAAAAAAAA/ACgAAAACAAAAAAA/ACcAAAAAAAAAAAA/ACYAAAAAAAAAAAA/ACUAAAAAAAAAAAA/ACQAAAAAAAAAAAA/ACMAAAAAAAAAAAA/ACIAAAAAAAAAAAA/ACEAAAAAAAAAAAA/ACAAAAAAAAAAAAA/AB8AAAAAAAAAAAA/AB4AAAABAAAAAAA/AB0AAAAAAAAAAAA/ABwAAAAAAAAAAAA/ABsAAAAAAAAAAAA/ABoAAAACAAAAAAA/ABkAAAAAAAAAAAA/ABgAAAAAAAAAAAA/ABcAAAAAAAAAAAA/ABYAAAAAAAAAAAA/ABUAAAAAAAAAAAA/ABQAAAAAAAAAAAA/ABMAAAAAAAAAAAA/ABIAAAAAAAAAAAA/ABEAAAAAAAAAAAA+ACoAAAAAAAAAAAA+ACkAAAAAAAAAAAA+ACgAAAAAAAAAAAA+ACcAAAACAAAAAAA+ACYAAAAAAAAAAAA+ACUAAAAAAAAAAAA+ACQAAAAAAAAAAAA+ACMAAAAAAAAAAAA+ACIAAAAAAAAAAAA+ACEAAAAAAAAAAAA+ACAAAAAAAAAAAAA+AB8AAAAAAAAAAAA+AB4AAAAAAAAAAAA+AB0AAAAAAAAAAAA+ABwAAAAAAAAAAAA+ABsAAAACAAAAAAA+ABoAAAAAAAAAAAA+ABkAAAAAAAAAAAA+ABgAAAAAAAAAAAA+ABcAAAAAAAAAAAA+ABYAAAAAAAAAAAA+ABUAAAAAAAAAAAA+ABQAAAAAAAAAAAA+ABMAAAAAAAAAAAA+ABIAAAAAAAAAAAA+ABEAAAAAAAAAAAA9ACoAAAAAAAAAAAA9ACkAAAAAAAAAAAA9ACgAAAAAAAAAAAA9ACcAAAAAAAAAAAA9ACYAAAAAAAAAAAA9ACUAAAAAAAAAAAA9ACQAAAAAAAAAAAA9ACMAAAAAAAAAAAA9ACIAAAAAAAAAAAA9ACEAAAAAAAAAAAA9ACAAAAAAAAAAAAA9AB8AAAAAAAAAAAA9AB4AAAAAAAAAAAA9AB0AAAAAAAAAAAA9ABwAAAAAAAAAAAA9ABsAAAAAAAAAAAA9ABoAAAAAAAAAAAA9ABkAAAAAAAAAAAA9ABgAAAAAAAAAAAA9ABcAAAAAAAAAAAA9ABYAAAAAAAAAAAA9ABUAAAAAAAAAAAA9ABQAAAAAAAAAAAA9ABMAAAAAAAAAAAA9ABIAAAAAAAAAAAA9ABEAAAAAAAAAAAA8ACoAAAAAAAAAAAA8ACkAAAAAAAAAAAA8ACgAAAAAAAAAAAA8ACcAAAAAAAAAAAA8ACYAAAAAAAAAAAA8ACUAAAAAAAAAAAA8ACQAAAAAAAAAAAA8ACMAAAAAAAAAAAA8ACIAAAAAAAAAAAA8ACEAAAAAAAAAAAA8ACAAAAAAAAAAAAA8AB8AAAAAAAAAAAA8AB4AAAAAAAAAAAA8AB0AAAAAAAAAAAA8ABwAAAAAAAAAAAA8ABsAAAAAAAAAAAA8ABoAAAAAAAAAAAA8ABkAAAAAAAAAAAA8ABgAAAAAAAAAAAA8ABcAAAAAAAAAAAA8ABYAAAAAAAAAAAA8ABUAAAAAAAAAAAA8ABQAAAAAAAAAAAA8ABMAAAAAAAAAAAA8ABIAAAAAAAAAAAA8ABEAAAAAAAAAAAA7ACoAAAAAAAAAAAA7ACkAAAAAAAAAAAA7ACgAAAAAAAAAAAA7ACcAAAAAAAAAAAA7ACYAAAAAAAAAAAA7ACUAAAAAAAAAAAA7ACQAAAAAAAAAAAA7ACMAAAAAAAAAAAA7ACIAAAAAAAAAAAA7ACEAAAAAAAAAAAA7ACAAAAACAAAAAAA7AB8AAAAAAAAAAAA7AB4AAAAAAAAAAAA7AB0AAAAAAAAAAAA7ABwAAAACAAAAAAA7ABsAAAAAAAAAAAA7ABoAAAAAAAAAAAA7ABkAAAAAAAAAAAA7ABgAAAAAAAAAAAA7ABcAAAAAAAAAAAA7ABYAAAAAAAAAAAA7ABUAAAAAAAAAAAA7ABQAAAAAAAAAAAA7ABMAAAAAAAAAAAA7ABIAAAAAAAAAAAA7ABEAAAAAAAAAAAA6ACoAAAAAAAAAAAA6ACkAAAAAAAAAAAA6ACgAAAAAAAAAAAA6ACcAAAAAAAAAAAA6ACYAAAAAAAAAAAA6ACUAAAAAAAAAAAA6ACQAAAAAAAAAAAA6ACMAAAABAAAAAAA6ACIAAAAAAAAAAAA6ACEAAAAAAAAAAAA6ACAAAAAAAAAAAAA6AB8AAAAAAAAAAAA6AB4AAAAAAAAAAAA6AB0AAAAAAAAAAAA6ABwAAAAAAAAAAAA6ABsAAAAAAAAAAAA6ABoAAAAAAAAAAAA6ABkAAAAAAAAAAAA6ABgAAAAAAAAAAAA6ABcAAAACAAAAAAA6ABYAAAAAAAAAAAA6ABUAAAAAAAAAAAA6ABQAAAAAAAAAAAA6ABMAAAAAAAAAAAA6ABIAAAAAAAAAAAA6ABEAAAAAAAAAAAA5ACoAAAAAAAAAAAA5ACkAAAAAAAAAAAA5ACgAAAAAAAAAAAA5ACcAAAAAAAAAAAA5ACYAAAAAAAAAAAA5ACUAAAAAAAAAAAA5ACQAAAAAAAAAAAA5ACMAAAABAAAAAAA5ACIAAAAAAAAAAAA5ACEAAAAAAAAAAAA5ACAAAAAAAAAAAAA5AB8AAAAAAAAAAAA5AB4AAAAAAAAAAAA5AB0AAAABAAAAAAA5ABwAAAAAAAAAAAA5ABsAAAAAAAAAAAA5ABoAAAAAAAAAAAA5ABkAAAAAAAAAAAA5ABgAAAABAAAAAAA5ABcAAAAAAAAAAAA5ABYAAAAAAAAAAAA5ABUAAAAAAAAAAAA5ABQAAAAAAAAAAAA5ABMAAAAAAAAAAAA5ABIAAAAAAAAAAAA5ABEAAAAAAAAAAAA4ACoAAAAAAAAAAAA4ACkAAAAAAAAAAAA4ACgAAAAAAAAAAAA4ACcAAAAAAAAAAAA4ACYAAAAAAAAAAAA4ACUAAAAAAAAAAAA4ACQAAAAAAAAAAAA4ACMAAAAAAAAAAAA4ACIAAAAAAAAAAAA4ACEAAAAAAAAAAAA4ACAAAAAAAAAAAAA4AB8AAAAAAAAAAAA4AB4AAAAAAAAAAAA4AB0AAAAAAAAAAAA4ABwAAAAAAAAAAAA4ABsAAAACAAAAAAA4ABoAAAAAAAAAAAA4ABkAAAAAAAAAAAA4ABgAAAAAAAAAAAA4ABcAAAAAAAAAAAA4ABYAAAAAAAAAAAA4ABUAAAAAAAAAAAA4ABQAAAAAAAAAAAA4ABMAAAAAAAAAAAA4ABIAAAAAAAAAAAA4ABEAAAAAAAAAAAA3ACoAAAAAAAAAAAA3ACkAAAACAAAAAAA3ACgAAAACAAAAAAA3ACcAAAAAAAAAAAA3ACYAAAAAAAAAAAA3ACUAAAAAAAAAAAA3ACQAAAAAAAAAAAA3ACMAAAAAAAAAAAA3ACIAAAAAAAAAAAA3ACEAAAAAAAAAAAA3ACAAAAABAAAAAAA3AB8AAAAAAAAAAAA3AB4AAAAAAAAAAAA3AB0AAAAAAAAAAAA3ABwAAAAAAAAAAAA3ABsAAAAAAAAAAAA3ABoAAAAAAAAAAAA3ABkAAAAAAAAAAAA3ABgAAAAAAAAAAAA3ABcAAAAAAAAAAAA3ABYAAAAAAAAAAAA3ABUAAAAAAAAAAAA3ABQAAAAAAAAAAAA3ABMAAAAAAAAAAAA3ABIAAAAAAAAAAAA3ABEAAAAAAAAAAAA2ACoAAAAAAAAAAAA2ACkAAAAAAAAAAAA2ACgAAAAAAAAAAAA2ACcAAAAAAAAAAAA2ACYAAAAAAAAAAAA2ACUAAAACAAAAAAA2ACQAAAAAAAAAAAA2ACMAAAAAAAAAAAA2ACIAAAAAAAAAAAA2ACEAAAAAAAAAAAA2ACAAAAAAAAAAAAA2AB8AAAAAAAAAAAA2AB4AAAAAAAAAAAA2AB0AAAAAAAAAAAA2ABwAAAAAAAAAAAA2ABsAAAAAAAAAAAA2ABoAAAAAAAAAAAA2ABkAAAAAAAAAAAA2ABgAAAAAAAAAAAA2ABcAAAAAAAAAAAA2ABYAAAAAAAAAAAA2ABUAAAAAAAAAAAA2ABQAAAAAAAAAAAA2ABMAAAAAAAAAAAA2ABIAAAAAAAAAAAA2ABEAAAAAAAAAAAA1ACoAAAAAAAAAAAA1ACkAAAAAAAAAAAA1ACgAAAAAAAAAAAA1ACcAAAAAAAAAAAA1ACYAAAAAAAAAAAA1ACUAAAAAAAAAAAA1ACQAAAAAAAAAAAA1ACMAAAAAAAAAAAA1ACIAAAAAAAAAAAA1ACEAAAAAAAAAAAA1ACAAAAAAAAAAAAA1AB8AAAAAAAAAAAA1AB4AAAAAAAAAAAA1AB0AAAAAAAAAAAA1ABwAAAAAAAAAAAA1ABsAAAAAAAAAAAA1ABoAAAABAAAAAAA1ABkAAAAAAAAAAAA1ABgAAAABAAAAAAA1ABcAAAAAAAAAAAA1ABYAAAAAAAAAAAA1ABUAAAAAAAAAAAA1ABQAAAAAAAAAAAA1ABMAAAAAAAAAAAA1ABIAAAACAAAAAAA1ABEAAAAAAAAAAAA0ACoAAAAAAAAAAAA0ACkAAAABAAAAAAA0ACgAAAAAAAAAAAA0ACcAAAAAAAAAAAA0ACYAAAAAAAAAAAA0ACUAAAAAAAAAAAA0ACQAAAAAAAAAAAA0ACMAAAAAAAAAAAA0ACIAAAAAAAAAAAA0ACEAAAAAAAAAAAA0ACAAAAACAAAAAAA0AB8AAAAAAAAAAAA0AB4AAAAAAAAAAAA0AB0AAAAAAAAAAAA0ABwAAAAAAAAAAAA0ABsAAAAAAAAAAAA0ABoAAAAAAAAAAAA0ABkAAAAAAAAAAAA0ABgAAAAAAAAAAAA0ABcAAAAAAAAAAAA0ABYAAAAAAAAAAAA0ABUAAAACAAAAAAA0ABQAAAAAAAAAAAA0ABMAAAACAAAAAAA0ABIAAAAAAAAAAAA0ABEAAAAAAAAAAAAzACoAAAAAAAAAAAAzACkAAAAAAAAAAAAzACgAAAAAAAAAAAAzACcAAAAAAAAAAAAzACYAAAAAAAAAAAAzACUAAAAAAAAAAAAzACQAAAAAAAAAAAAzACMAAAAAAAAAAAAzACIAAAAAAAAAAAAzACEAAAAAAAAAAAAzACAAAAAAAAAAAAAzAB8AAAACAAAAAAAzAB4AAAAAAAAAAAAzAB0AAAAAAAAAAAAzABwAAAAAAAAAAAAzABsAAAAAAAAAAAAzABoAAAAAAAAAAAAzABkAAAAAAAAAAAAzABgAAAAAAAAAAAAzABcAAAAAAAAAAAAzABYAAAAAAAAAAAAzABUAAAAAAAAAAAAzABQAAAAAAAAAAAAzABMAAAAAAAAAAAAzABIAAAAAAAAAAAAzABEAAAAAAAAAAAAyACoAAAAAAAAAAAAyACkAAAACAAAAAAAyACgAAAAAAAAAAAAyACcAAAAAAAAAAAAyACYAAAAAAAAAAAAyACUAAAAAAAAAAAAyACQAAAAAAAAAAAAyACMAAAAAAAAAAAAyACIAAAAAAAAAAAAyACEAAAAAAAAAAAAyACAAAAAAAAAAAAAyAB8AAAAAAAAAAAAyAB4AAAAAAAAAAAAyAB0AAAAAAAAAAAAyABwAAAAAAAAAAAAyABsAAAAAAAAAAAAyABoAAAAAAAAAAAAyABkAAAAAAAAAAAAyABgAAAAAAAAAAAAyABcAAAAAAAAAAAAyABYAAAAAAAAAAAAyABUAAAAAAAAAAAAyABQAAAAAAAAAAAAyABMAAAAAAAAAAAAyABIAAAAAAAAAAAAyABEAAAAAAAAAAAAxACoAAAAAAAAAAAAxACkAAAAAAAAAAAAxACgAAAAAAAAAAAAxACcAAAAAAAAAAAAxACYAAAAAAAAAAAAxACUAAAAAAAAAAAAxACQAAAAAAAAAAAAxACMAAAABAAAAAAAxACIAAAAAAAAAAAAxACEAAAAAAAAAAAAxACAAAAAAAAAAAAAxAB8AAAAAAAAAAAAxAB4AAAAAAAAAAAAxAB0AAAAAAAAAAAAxABwAAAAAAAAAAAAxABsAAAAAAAAAAAAxABoAAAAAAAAAAAAxABkAAAABAAAAAAAxABgAAAAAAAAAAAAxABcAAAAAAAAAAAAxABYAAAAAAAAAAAAxABUAAAAAAAAAAAAxABQAAAAAAAAAAAAxABMAAAAAAAAAAAAxABIAAAAAAAAAAAAxABEAAAAAAAAAAAAwACoAAAAAAAAAAAAwACkAAAAAAAAAAAAwACgAAAAAAAAAAAAwACcAAAAAAAAAAAAwACYAAAAAAAAAAAAwACUAAAAAAAAAAAAwACQAAAAAAAAAAAAwACMAAAAAAAAAAAAwACIAAAAAAAAAAAAwACEAAAAAAAAAAAAwACAAAAAAAAAAAAAwAB8AAAAAAAAAAAAwAB4AAAAAAAAAAAAwAB0AAAAAAAAAAAAwABwAAAAAAAAAAAAwABsAAAAAAAAAAAAwABoAAAAAAAAAAAAwABkAAAAAAAAAAAAwABgAAAAAAAAAAAAwABcAAAAAAAAAAAAwABYAAAAAAAAAAAAwABUAAAAAAAAAAAAwABQAAAAAAAAAAAAwABMAAAAAAAAAAAAwABIAAAAAAAAAAAAwABEAAAAAAAAAAAAvACoAAAAAAAAAAAAvACkAAAAAAAAAAAAvACgAAAAAAAAAAAAvACcAAAAAAAAAAAAvACYAAAAAAAAAAAAvACUAAAAAAAAAAAAvACQAAAAAAAAAAAAvACMAAAAAAAAAAAAvACIAAAAAAAAAAAAvACEAAAAAAAAAAAAvACAAAAAAAAAAAAAvAB8AAAAAAAAAAAAvAB4AAAAAAAAAAAAvAB0AAAAAAAAAAAAvABwAAAAAAAAAAAAvABsAAAABAAAAAAAvABoAAAAAAAAAAAAvABkAAAAAAAAAAAAvABgAAAAAAAAAAAAvABcAAAAAAAAAAAAvABYAAAAAAAAAAAAvABUAAAAAAAAAAAAvABQAAAACAAAAAAAvABMAAAAAAAAAAAAvABIAAAAAAAAAAAAvABEAAAAAAAAAAAAuACoAAAAAAAAAAAAuACkAAAACAAAAAAAuACgAAAAAAAAAAAAuACcAAAAAAAAAAAAuACYAAAAAAAAAAAAuACUAAAAAAAAAAAAuACQAAAAAAAAAAAAuACMAAAAAAAAAAAAuACIAAAAAAAAAAAAuACEAAAAAAAAAAAAuACAAAAAAAAAAAAAuAB8AAAACAAAAAAAuAB4AAAAAAAAAAAAuAB0AAAAAAAAAAAAuABwAAAAAAAAAAAAuABsAAAAAAAAAAAAuABoAAAAAAAAAAAAuABkAAAAAAAAAAAAuABgAAAAAAAAAAAAuABcAAAAAAAAAAAAuABYAAAAAAAAAAAAuABUAAAAAAAAAAAAuABQAAAAAAAAAAAAuABMAAAAAAAAAAAAuABIAAAAAAAAAAAAuABEAAAACAAAAAAAtACoAAAAAAAAAAAAtACkAAAAAAAAAAAAtACgAAAAAAAAAAAAtACcAAAAAAAAAAAAtACYAAAAAAAAAAAAtACUAAAAAAAAAAAAtACQAAAAAAAAAAAAtACMAAAAAAAAAAAAtACIAAAAAAAAAAAAtACEAAAAAAAAAAAAtACAAAAAAAAAAAAAtAB8AAAAAAAAAAAAtAB4AAAAAAAAAAAAtAB0AAAAAAAAAAAAtABwAAAAAAAAAAAAtABsAAAAAAAAAAAAtABoAAAAAAAAAAAAtABkAAAAAAAAAAAAtABgAAAAAAAAAAAAtABcAAAAAAAAAAAAtABYAAAAAAAAAAAAtABUAAAAAAAAAAAAtABQAAAAAAAAAAAAtABMAAAAAAAAAAAAtABIAAAAAAAAAAAAtABEAAAAAAAAAAAAsACoAAAAAAAAAAAAsACkAAAAAAAAAAAAsACgAAAAAAAAAAAAsACcAAAAAAAAAAAAsACYAAAAAAAAAAAAsACUAAAAAAAAAAAAsACQAAAAAAAAAAAAsACMAAAAAAAAAAAAsACIAAAAAAAAAAAAsACEAAAAAAAAAAAAsACAAAAAAAAAAAAAsAB8AAAAAAAAAAAAsAB4AAAAAAAAAAAAsAB0AAAAAAAAAAAAsABwAAAAAAAAAAAAsABsAAAAAAAAAAAAsABoAAAAAAAAAAAAsABkAAAAAAAAAAAAsABgAAAAAAAAAAAAsABcAAAAAAAAAAAAsABYAAAAAAAAAAAAsABUAAAAAAAAAAAAsABQAAAAAAAAAAAAsABMAAAABAAAAAAAsABIAAAAAAAAAAAAsABEAAAAAAAAAAAArACoAAAAAAAAAAAArACkAAAAAAAAAAAArACgAAAAAAAAAAAArACcAAAAAAAAAAAArACYAAAAAAAAAAAArACUAAAAAAAAAAAArACQAAAAAAAAAAAArACMAAAAAAAAAAAArACIAAAAAAAAAAAArACEAAAAAAAAAAAArACAAAAAAAAAAAAArAB8AAAAAAAAAAAArAB4AAAAAAAAAAAArAB0AAAAAAAAAAAArABwAAAAAAAAAAAArABsAAAAAAAAAAAArABoAAAAAAAAAAAArABkAAAAAAAAAAAArABgAAAAAAAAAAAArABcAAAAAAAAAAAArABYAAAAAAAAAAAArABUAAAAAAAAAAAArABQAAAAAAAAAAAArABMAAAAAAAAAAAArABIAAAAAAAAAAAArABEAAAAAAAAAAAAqACoAAAAAAAAAAAAqACkAAAAAAAAAAAAqACgAAAAAAAAAAAAqACcAAAAAAAAAAAAqACYAAAAAAAAAAAAqACUAAAAAAAAAAAAqACQAAAAAAAAAAAAqACMAAAAAAAAAAAAqACIAAAAAAAAAAAAqACEAAAAAAAAAAAAqACAAAAAAAAAAAAAqAB8AAAABAAAAAAAqAB4AAAAAAAAAAAAqAB0AAAAAAAAAAAAqABwAAAAAAAAAAAAqABsAAAAAAAAAAAAqABoAAAAAAAAAAAAqABkAAAAAAAAAAAAqABgAAAAAAAAAAAAqABcAAAAAAAAAAAAqABYAAAAAAAAAAAAqABUAAAAAAAAAAAAqABQAAAAAAAAAAAAqABMAAAAAAAAAAAAqABIAAAAAAAAAAAAqABEAAAAAAAAAAAApACoAAAAAAAAAAAApACkAAAABAAAAAAApACgAAAAAAAAAAAApACcAAAAAAAAAAAApACYAAAAAAAAAAAApACUAAAAAAAAAAAApACQAAAAAAAAAAAApACMAAAAAAAAAAAApACIAAAAAAAAAAAApACEAAAAAAAAAAAApACAAAAAAAAAAAAApAB8AAAAAAAAAAAApAB4AAAAAAAAAAAApAB0AAAACAAAAAAApABwAAAAAAAAAAAApABsAAAAAAAAAAAApABoAAAAAAAAAAAApABkAAAAAAAAAAAApABgAAAAAAAAAAAApABcAAAAAAAAAAAApABYAAAAAAAAAAAApABUAAAAAAAAAAAApABQAAAAAAAAAAAApABMAAAAAAAAAAAApABIAAAAAAAAAAAApABEAAAAAAAAAAAAoACoAAAAAAAAAAAAoACkAAAAAAAAAAAAoACgAAAAAAAAAAAAoACcAAAACAAAAAAAoACYAAAAAAAAAAAAoACUAAAAAAAAAAAAoACQAAAAAAAAAAAAoACMAAAAAAAAAAAAoACIAAAAAAAAAAAAoACEAAAAAAAAAAAAoACAAAAAAAAAAAAAoAB8AAAAAAAAAAAAoAB4AAAAAAAAAAAAoAB0AAAAAAAAAAAAoABwAAAAAAAAAAAAoABsAAAAAAAAAAAAoABoAAAAAAAAAAAAoABkAAAAAAAAAAAAoABgAAAAAAAAAAAAoABcAAAAAAAAAAAAoABYAAAAAAAAAAAAoABUAAAAAAAAAAAAoABQAAAAAAAAAAAAoABMAAAAAAAAAAAAoABIAAAAAAAAAAAAoABEAAAAAAAAAAAAnACoAAAAAAAAAAAAnACkAAAAAAAAAAAAnACgAAAAAAAAAAAAnACcAAAAAAAAAAAAnACYAAAAAAAAAAAAnACUAAAAAAAAAAAAnACQAAAAAAAAAAAAnACMAAAAAAAAAAAAnACIAAAAAAAAAAAAnACEAAAAAAAAAAAAnACAAAAAAAAAAAAAnAB8AAAAAAAAAAAAnAB4AAAACAAAAAAAnAB0AAAAAAAAAAAAnABwAAAAAAAAAAAAnABsAAAAAAAAAAAAnABoAAAAAAAAAAAAnABkAAAAAAAAAAAAnABgAAAAAAAAAAAAnABcAAAAAAAAAAAAnABYAAAACAAAAAAAnABUAAAAAAAAAAAAnABQAAAAAAAAAAAAnABMAAAAAAAAAAAAnABIAAAAAAAAAAAAnABEAAAAAAAAAAAAmACoAAAAAAAAAAAAmACkAAAAAAAAAAAAmACgAAAAAAAAAAAAmACcAAAAAAAAAAAAmACYAAAAAAAAAAAAmACUAAAAAAAAAAAAmACQAAAAAAAAAAAAmACMAAAACAAAAAAAmACIAAAAAAAAAAAAmACEAAAAAAAAAAAAmACAAAAAAAAAAAAAmAB8AAAAAAAAAAAAmAB4AAAAAAAAAAAAmAB0AAAAAAAAAAAAmABwAAAAAAAAAAAAmABsAAAABAAAAAAAmABoAAAAAAAAAAAAmABkAAAAAAAAAAAAmABgAAAAAAAAAAAAmABcAAAAAAAAAAAAmABYAAAAAAAAAAAAmABUAAAAAAAAAAAAmABQAAAAAAAAAAAAmABMAAAAAAAAAAAAmABIAAAAAAAAAAAAmABEAAAAAAAAAAAAlACoAAAAAAAAAAAAlACkAAAAAAAAAAAAlACgAAAAAAAAAAAAlACcAAAAAAAAAAAAlACYAAAAAAAAAAAAlACUAAAAAAAAAAAAlACQAAAAAAAAAAAAlACMAAAAAAAAAAAAlACIAAAAAAAAAAAAlACEAAAAAAAAAAAAlACAAAAAAAAAAAAAlAB8AAAAAAAAAAAAlAB4AAAAAAAAAAAAlAB0AAAAAAAAAAAAlABwAAAAAAAAAAAAlABsAAAAAAAAAAAAlABoAAAAAAAAAAAAlABkAAAAAAAAAAAAlABgAAAAAAAAAAAAlABcAAAAAAAAAAAAlABYAAAAAAAAAAAAlABUAAAAAAAAAAAAlABQAAAAAAAAAAAAlABMAAAAAAAAAAAAlABIAAAAAAAAAAAAlABEAAAAAAAAAAAAkACoAAAAAAAAAAAAkACkAAAAAAAAAAAAkACgAAAAAAAAAAAAkACcAAAAAAAAAAAAkACYAAAAAAAAAAAAkACUAAAAAAAAAAAAkACQAAAAAAAAAAAAkACMAAAAAAAAAAAAkACIAAAAAAAAAAAAkACEAAAAAAAAAAAAkACAAAAAAAAAAAAAkAB8AAAAAAAAAAAAkAB4AAAAAAAAAAAAkAB0AAAAAAAAAAAAkABwAAAAAAAAAAAAkABsAAAAAAAAAAAAkABoAAAAAAAAAAAAkABkAAAAAAAAAAAAkABgAAAAAAAAAAAAkABcAAAAAAAAAAAAkABYAAAAAAAAAAAAkABUAAAAAAAAAAAAkABQAAAAAAAAAAAAkABMAAAACAAAAAAAkABIAAAAAAAAAAAAkABEAAAAAAAAAAAAjACoAAAAAAAAAAAAjACkAAAAAAAAAAAAjACgAAAAAAAAAAAAjACcAAAAAAAAAAAAjACYAAAABAAAAAAAjACUAAAAAAAAAAAAjACQAAAAAAAAAAAAjACMAAAAAAAAAAAAjACIAAAAAAAAAAAAjACEAAAAAAAAAAAAjACAAAAAAAAAAAAAjAB8AAAAAAAAAAAAjAB4AAAAAAAAAAAAjAB0AAAAAAAAAAAAjABwAAAAAAAAAAAAjABsAAAAAAAAAAAAjABoAAAAAAAAAAAAjABkAAAAAAAAAAAAjABgAAAAAAAAAAAAjABcAAAAAAAAAAAAjABYAAAAAAAAAAAAjABUAAAAAAAAAAAAjABQAAAAAAAAAAAAjABMAAAAAAAAAAAAjABIAAAAAAAAAAAAjABEAAAABAAAAAAAiACoAAAAAAAAAAAAiACkAAAAAAAAAAAAiACgAAAAAAAAAAAAiACcAAAAAAAAAAAAiACYAAAAAAAAAAAAiACUAAAAAAAAAAAAiACQAAAAAAAAAAAAiACMAAAAAAAAAAAAiACIAAAAAAAAAAAAiACEAAAAAAAAAAAAiACAAAAAAAAAAAAAiAB8AAAAAAAAAAAAiAB4AAAAAAAAAAAAiAB0AAAAAAAAAAAAiABwAAAAAAAAAAAAiABsAAAAAAAAAAAAiABoAAAAAAAAAAAAiABkAAAAAAAAAAAAiABgAAAAAAAAAAAAiABcAAAAAAAAAAAAiABYAAAAAAAAAAAAiABUAAAAAAAAAAAAiABQAAAAAAAAAAAAiABMAAAAAAAAAAAAiABIAAAAAAAAAAAAiABEAAAAAAAAAAAAhACoAAAAAAAAAAAAhACkAAAAAAAAAAAAhACgAAAAAAAAAAAAhACcAAAAAAAAAAAAhACYAAAAAAAAAAAAhACUAAAAAAAAAAAAhACQAAAAAAAAAAAAhACMAAAAAAAAAAAAhACIAAAAAAAAAAAAhACEAAAAAAAAAAAAhACAAAAAAAAAAAAAhAB8AAAABAAAAAAAhAB4AAAAAAAAAAAAhAB0AAAAAAAAAAAAhABwAAAAAAAAAAAAhABsAAAAAAAAAAAAhABoAAAAAAAAAAAAhABkAAAAAAAAAAAAhABgAAAAAAAAAAAAhABcAAAAAAAAAAAAhABYAAAAAAAAAAAAhABUAAAAAAAAAAAAhABQAAAAAAAAAAAAhABMAAAAAAAAAAAAhABIAAAAAAAAAAAAhABEAAAAAAAAAAAAgACoAAAAAAAAAAAAgACkAAAAAAAAAAAAgACgAAAAAAAAAAAAgACcAAAAAAAAAAAAgACYAAAAAAAAAAAAgACUAAAAAAAAAAAAgACQAAAABAAAAAAAgACMAAAAAAAAAAAAgACIAAAAAAAAAAAAgACEAAAAAAAAAAAAgACAAAAAAAAAAAAAgAB8AAAAAAAAAAAAgAB4AAAAAAAAAAAAgAB0AAAAAAAAAAAAgABwAAAAAAAAAAAAgABsAAAAAAAAAAAAgABoAAAAAAAAAAAAgABkAAAAAAAAAAAAgABgAAAAAAAAAAAAgABcAAAAAAAAAAAAgABYAAAABAAAAAAAgABUAAAAAAAAAAAAgABQAAAAAAAAAAAAgABMAAAAAAAAAAAAgABIAAAAAAAAAAAAgABEAAAAAAAAAAAAfACoAAAAAAAAAAAAfACkAAAAAAAAAAAAfACgAAAAAAAAAAAAfACcAAAAAAAAAAAAfACYAAAAAAAAAAAAfACUAAAAAAAAAAAAfACQAAAAAAAAAAAAfACMAAAAAAAAAAAAfACIAAAAAAAAAAAAfACEAAAAAAAAAAAAfACAAAAAAAAAAAAAfAB8AAAAAAAAAAAAfAB4AAAAAAAAAAAAfAB0AAAAAAAAAAAAfABwAAAAAAAAAAAAfABsAAAAAAAAAAAAfABoAAAAAAAAAAAAfABkAAAACAAAAAAAfABgAAAAAAAAAAAAfABcAAAAAAAAAAAAfABYAAAAAAAAAAAAfABUAAAAAAAAAAAAfABQAAAAAAAAAAAAfABMAAAAAAAAAAAAfABIAAAAAAAAAAAAfABEAAAAAAAAAAAAeACoAAAAAAAAAAAAeACkAAAAAAAAAAAAeACgAAAAAAAAAAAAeACcAAAAAAAAAAAAeACYAAAAAAAAAAAAeACUAAAAAAAAAAAAeACQAAAAAAAAAAAAeACMAAAAAAAAAAAAeACIAAAAAAAAAAAAeACEAAAAAAAAAAAAeACAAAAAAAAAAAAAeAB8AAAAAAAAAAAAeAB4AAAAAAAAAAAAeAB0AAAAAAAAAAAAeABwAAAAAAAAAAAAeABsAAAAAAAAAAAAeABoAAAAAAAAAAAAeABkAAAAAAAAAAAAeABgAAAAAAAAAAAAeABcAAAAAAAAAAAAeABYAAAAAAAAAAAAeABUAAAAAAAAAAAAeABQAAAAAAAAAAAAeABMAAAAAAAAAAAAeABIAAAAAAAAAAAAeABEAAAAAAAAAAAAdACoAAAAAAAAAAAAdACkAAAAAAAAAAAAdACgAAAAAAAAAAAAdACcAAAAAAAAAAAAdACYAAAAAAAAAAAAdACUAAAAAAAAAAAAdACQAAAAAAAAAAAAdACMAAAAAAAAAAAAdACIAAAAAAAAAAAAdACEAAAAAAAAAAAAdACAAAAAAAAAAAAAdAB8AAAAAAAAAAAAdAB4AAAAAAAAAAAAdAB0AAAAAAAAAAAAdABwAAAAAAAAAAAAdABsAAAAAAAAAAAAdABoAAAAAAAAAAAAdABkAAAAAAAAAAAAdABgAAAABAAAAAAAdABcAAAAAAAAAAAAdABYAAAAAAAAAAAAdABUAAAAAAAAAAAAdABQAAAAAAAAAAAAdABMAAAAAAAAAAAAdABIAAAAAAAAAAAAdABEAAAAAAAAAAAAcACoAAAAAAAAAAAAcACkAAAAAAAAAAAAcACgAAAAAAAAAAAAcACcAAAAAAAAAAAAcACYAAAAAAAAAAAAcACUAAAAAAAAAAAAcACQAAAAAAAAAAAAcACMAAAAAAAAAAAAcACIAAAAAAAAAAAAcACEAAAAAAAAAAAAcACAAAAAAAAAAAAAcAB8AAAAAAAAAAAAcAB4AAAAAAAAAAAAcAB0AAAAAAAAAAAAcABwAAAAAAAAAAAAcABsAAAAAAAAAAAAcABoAAAAAAAAAAAAcABkAAAAAAAAAAAAcABgAAAAAAAAAAAAcABcAAAAAAAAAAAAcABYAAAAAAAAAAAAcABUAAAAAAAAAAAAcABQAAAAAAAAAAAAcABMAAAAAAAAAAAAcABIAAAAAAAAAAAAcABEAAAAAAAAAAAAbACoAAAAAAAAAAAAbACkAAAAAAAAAAAAbACgAAAAAAAAAAAAbACcAAAAAAAAAAAAbACYAAAAAAAAAAAAbACUAAAAAAAAAAAAbACQAAAAAAAAAAAAbACMAAAAAAAAAAAAbACIAAAAAAAAAAAAbACEAAAAAAAAAAAAbACAAAAAAAAAAAAAbAB8AAAAAAAAAAAAbAB4AAAAAAAAAAAAbAB0AAAAAAAAAAAAbABwAAAABAAAAAAAbABsAAAAAAAAAAAAbABoAAAAAAAAAAAAbABkAAAAAAAAAAAAbABgAAAAAAAAAAAAbABcAAAAAAAAAAAAbABYAAAAAAAAAAAAbABUAAAACAAAAAAAbABQAAAAAAAAAAAAbABMAAAAAAAAAAAAbABIAAAAAAAAAAAAbABEAAAACAAAAAAAaACoAAAAAAAAAAAAaACkAAAAAAAAAAAAaACgAAAABAAAAAAAaACcAAAAAAAAAAAAaACYAAAAAAAAAAAAaACUAAAAAAAAAAAAaACQAAAAAAAAAAAAaACMAAAAAAAAAAAAaACIAAAAAAAAAAAAaACEAAAAAAAAAAAAaACAAAAAAAAAAAAAaAB8AAAAAAAAAAAAaAB4AAAAAAAAAAAAaAB0AAAAAAAAAAAAaABwAAAABAAAAAAAaABsAAAAAAAAAAAAaABoAAAAAAAAAAAAaABkAAAAAAAAAAAAaABgAAAAAAAAAAAAaABcAAAAAAAAAAAAaABYAAAAAAAAAAAAaABUAAAAAAAAAAAAaABQAAAAAAAAAAAAaABMAAAAAAAAAAAAaABIAAAAAAAAAAAAaABEAAAAAAAAAAAAZACoAAAAAAAAAAAAZACkAAAAAAAAAAAAZACgAAAAAAAAAAAAZACcAAAAAAAAAAAAZACYAAAAAAAAAAAAZACUAAAAAAAAAAAAZACQAAAAAAAAAAAAZACMAAAAAAAAAAAAZACIAAAAAAAAAAAAZACEAAAAAAAAAAAAZACAAAAAAAAAAAAAZAB8AAAAAAAAAAAAZAB4AAAAAAAAAAAAZAB0AAAAAAAAAAAAZABwAAAAAAAAAAAAZABsAAAAAAAAAAAAZABoAAAAAAAAAAAAZABkAAAAAAAAAAAAZABgAAAAAAAAAAAAZABcAAAAAAAAAAAAZABYAAAAAAAAAAAAZABUAAAAAAAAAAAAZABQAAAAAAAAAAAAZABMAAAAAAAAAAAAZABIAAAAAAAAAAAAZABEAAAAAAAAAAAAYACoAAAAAAAAAAAAYACkAAAAAAAAAAAAYACgAAAAAAAAAAAAYACcAAAAAAAAAAAAYACYAAAAAAAAAAAAYACUAAAAAAAAAAAAYACQAAAAAAAAAAAAYACMAAAAAAAAAAAAYACIAAAAAAAAAAAAYACEAAAACAAAAAAAYACAAAAAAAAAAAAAYAB8AAAAAAAAAAAAYAB4AAAAAAAAAAAAYAB0AAAAAAAAAAAAYABwAAAAAAAAAAAAYABsAAAAAAAAAAAAYABoAAAAAAAAAAAAYABkAAAAAAAAAAAAYABgAAAAAAAAAAAAYABcAAAAAAAAAAAAYABYAAAAAAAAAAAAYABUAAAAAAAAAAAAYABQAAAAAAAAAAAAYABMAAAAAAAAAAAAYABIAAAAAAAAAAAAYABEAAAACAAAAAAAXACoAAAAAAAAAAAAXACkAAAAAAAAAAAAXACgAAAAAAAAAAAAXACcAAAAAAAAAAAAXACYAAAAAAAAAAAAXACUAAAAAAAAAAAAXACQAAAAAAAAAAAAXACMAAAAAAAAAAAAXACIAAAAAAAAAAAAXACEAAAAAAAAAAAAXACAAAAAAAAAAAAAXAB8AAAAAAAAAAAAXAB4AAAAAAAAAAAAXAB0AAAAAAAAAAAAXABwAAAAAAAAAAAAXABsAAAAAAAAAAAAXABoAAAAAAAAAAAAXABkAAAAAAAAAAAAXABgAAAAAAAAAAAAXABcAAAAAAAAAAAAXABYAAAAAAAAAAAAXABUAAAAAAAAAAAAXABQAAAAAAAAAAAAXABMAAAAAAAAAAAAXABIAAAAAAAAAAAAXABEAAAAAAAAAAAA=") +tile_set = ExtResource("7_po5fq") +script = ExtResource("55_a8sfs") +metadata/_edit_lock_ = true + +[node name="Trees" type="TileMapLayer" parent="Field/Map/Forest"] +tile_map_data = PackedByteArray("AAAXABEAAAAHAAEAAAAXABIAAAAHAAEAAAAXABMAAAAHAAEAAAAXABQAAAAHAAEAAAAXABUAAAAHAAEAAAAXABYAAAAHAAEAAAAXABcAAAAHAAEAAAAXABgAAAAHAAEAAAAXABkAAAAHAAEAAAAXABoAAAAHAAEAAAAXABsAAAAHAAEAAAAXABwAAAAHAAEAAAAXAB0AAAAHAAEAAAAXAB4AAAAHAAEAAAAXAB8AAAAHAAEAAAAXACAAAAAHAAEAAAAXACEAAAAHAAEAAAAXACIAAAAHAAEAAAAXACMAAAAHAAEAAAAXACQAAAAHAAEAAAAXACUAAAAHAAEAAAAXACYAAAAHAAEAAAAXACcAAAAHAAEAAAAXACgAAAAHAAEAAAAXACkAAAAHAAEAAAAXACoAAAAGAAIAAAAYABEAAAAHAAEAAAAYABIAAAAHAAEAAAAYABMAAAAHAAEAAAAYABQAAAAHAAEAAAAYABUAAAAHAAEAAAAYABYAAAAHAAEAAAAYABcAAAAHAAEAAAAYABgAAAAHAAEAAAAYABkAAAAHAAEAAAAYABoAAAAHAAEAAAAYABsAAAAHAAEAAAAYABwAAAAHAAEAAAAYAB0AAAAHAAEAAAAYAB4AAAAHAAEAAAAYAB8AAAAHAAEAAAAYACAAAAAHAAEAAAAYACEAAAAHAAEAAAAYACIAAAAHAAEAAAAYACMAAAAHAAEAAAAYACQAAAAHAAEAAAAYACUAAAAHAAEAAAAYACYAAAAHAAEAAAAYACcAAAAHAAEAAAAYACgAAAAHAAEAAAAYACkAAAAHAAEAAAAYACoAAAAHAAEAAAAZABEAAAAHAAEAAAAZABIAAAAHAAEAAAAZABMAAAAHAAEAAAAZABQAAAAHAAEAAAAZABUAAAAHAAEAAAAZABYAAAAHAAEAAAAZABcAAAAHAAEAAAAZABgAAAAHAAEAAAAZABkAAAAHAAEAAAAZABoAAAAHAAEAAAAZABsAAAAHAAEAAAAZABwAAAAHAAEAAAAZAB0AAAAHAAEAAAAZAB4AAAAHAAEAAAAZAB8AAAAHAAEAAAAZACAAAAAHAAEAAAAZACEAAAAHAAEAAAAZACIAAAAHAAEAAAAZACMAAAAHAAEAAAAZACQAAAAHAAEAAAAZACUAAAAHAAEAAAAZACYAAAAHAAEAAAAZACcAAAAHAAEAAAAZACgAAAAHAAEAAAAZACkAAAAHAAEAAAAZACoAAAAHAAEAAAAaABEAAAAHAAEAAAAaABIAAAAHAAEAAAAaABMAAAAHAAEAAAAaABQAAAAHAAEAAAAaABUAAAAHAAEAAAAaABYAAAAHAAEAAAAaABcAAAAHAAEAAAAaABgAAAAHAAEAAAAaABkAAAAHAAEAAAAaABoAAAAHAAEAAAAaABsAAAAHAAEAAAAaABwAAAAHAAEAAAAaAB0AAAAHAAEAAAAaAB4AAAAHAAEAAAAaAB8AAAAHAAEAAAAaACAAAAAHAAEAAAAaACEAAAAHAAEAAAAaACIAAAAHAAEAAAAaACMAAAAHAAEAAAAaACQAAAAHAAEAAAAaACUAAAAHAAEAAAAaACYAAAAHAAEAAAAaACcAAAAHAAEAAAAaACgAAAAHAAEAAAAaACkAAAAHAAEAAAAaACoAAAAHAAEAAAAbABEAAAAHAAEAAAAbABIAAAAHAAEAAAAbABMAAAAHAAEAAAAbABQAAAAHAAEAAAAbABUAAAAHAAEAAAAbABYAAAAHAAEAAAAbABcAAAAHAAEAAAAbABgAAAAHAAEAAAAbABkAAAAHAAEAAAAbABoAAAAHAAEAAAAbABsAAAAHAAEAAAAbABwAAAAHAAEAAAAbAB0AAAAHAAEAAAAbAB4AAAAHAAEAAAAbAB8AAAAHAAEAAAAbACAAAAAHAAEAAAAbACEAAAAHAAEAAAAbACIAAAAHAAEAAAAbACMAAAAHAAEAAAAbACQAAAAHAAEAAAAbACUAAAAHAAEAAAAbACYAAAAHAAEAAAAbACcAAAAHAAEAAAAbACgAAAAHAAEAAAAbACkAAAAHAAEAAAAbACoAAAAHAAEAAAAcABEAAAAHAAEAAAAcABIAAAAHAAEAAAAcABMAAAAHAAEAAAAcABQAAAAHAAEAAAAcABUAAAAHAAEAAAAcABYAAAAHAAEAAAAcABcAAAAHAAEAAAAcABgAAAAHAAEAAAAcABkAAAAHAAEAAAAcABoAAAAHAAEAAAAcABsAAAAHAAEAAAAcABwAAAAHAAEAAAAcAB0AAAAHAAEAAAAcAB4AAAAHAAEAAAAcAB8AAAAHAAEAAAAcACAAAAAHAAEAAAAcACEAAAAHAAEAAAAcACIAAAAHAAEAAAAcACMAAAAHAAEAAAAcACQAAAAHAAEAAAAcACUAAAAHAAEAAAAcACYAAAAHAAEAAAAcACcAAAAHAAEAAAAcACgAAAAHAAEAAAAcACkAAAAHAAEAAAAcACoAAAAHAAEAAAAdABEAAAAHAAEAAAAdABIAAAAHAAEAAAAdABMAAAAHAAEAAAAdABQAAAAHAAEAAAAdABUAAAAHAAEAAAAdABYAAAAHAAEAAAAdABcAAAAHAAEAAAAdABgAAAAHAAEAAAAdABkAAAAHAAEAAAAdABoAAAAHAAEAAAAdABsAAAAHAAEAAAAdABwAAAAHAAEAAAAdAB0AAAAHAAEAAAAdAB4AAAAHAAEAAAAdAB8AAAAHAAEAAAAdACAAAAAHAAEAAAAdACEAAAAHAAEAAAAdACIAAAAHAAEAAAAdACMAAAAHAAEAAAAdACQAAAAHAAEAAAAdACUAAAAHAAEAAAAdACYAAAAHAAEAAAAdACcAAAAHAAEAAAAdACgAAAAHAAEAAAAdACkAAAAHAAEAAAAdACoAAAAHAAEAAAAeABEAAAAHAAEAAAAeABIAAAAHAAEAAAAeABMAAAAHAAEAAAAeABQAAAAHAAEAAAAeABUAAAAHAAEAAAAeABYAAAAHAAEAAAAeABcAAAAHAAEAAAAeABgAAAAHAAEAAAAeABkAAAAHAAEAAAAeABoAAAAHAAEAAAAeABsAAAAHAAEAAAAeABwAAAAHAAEAAAAeAB0AAAAHAAEAAAAeAB4AAAAHAAEAAAAeAB8AAAAHAAEAAAAeACAAAAAHAAEAAAAeACEAAAAHAAEAAAAeACIAAAAHAAEAAAAeACMAAAAHAAEAAAAeACQAAAAHAAEAAAAeACUAAAAHAAEAAAAeACYAAAAHAAEAAAAeACcAAAAHAAEAAAAeACgAAAAHAAEAAAAeACkAAAAHAAEAAAAeACoAAAAHAAEAAAAfABEAAAAHAAEAAAAfABIAAAAHAAEAAAAfABMAAAAHAAEAAAAfABQAAAAHAAEAAAAfABUAAAAHAAEAAAAfABYAAAAHAAEAAAAfABcAAAAHAAEAAAAfABgAAAAHAAEAAAAfABkAAAAHAAEAAAAfABoAAAAHAAEAAAAfABsAAAAHAAEAAAAfABwAAAAHAAEAAAAfAB0AAAAHAAEAAAAfAB4AAAAHAAEAAAAfAB8AAAAHAAEAAAAfACAAAAAHAAEAAAAfACEAAAAHAAEAAAAfACIAAAAHAAEAAAAfACMAAAAHAAEAAAAfACQAAAAHAAEAAAAfACUAAAAHAAEAAAAfACYAAAAHAAEAAAAfACcAAAAHAAEAAAAfACgAAAAHAAEAAAAfACkAAAAHAAEAAAAfACoAAAAHAAEAAAAgABEAAAAHAAEAAAAgABIAAAAHAAEAAAAgABMAAAAHAAEAAAAgABQAAAAHAAEAAAAgABUAAAAHAAEAAAAgABYAAAAHAAEAAAAgABcAAAAHAAEAAAAgABgAAAAHAAEAAAAgABkAAAAHAAEAAAAgABoAAAAHAAEAAAAgABsAAAAHAAEAAAAgABwAAAAHAAEAAAAgAB0AAAAHAAEAAAAgAB4AAAAHAAEAAAAgAB8AAAAHAAEAAAAgACAAAAAHAAEAAAAgACEAAAAHAAEAAAAgACIAAAAHAAEAAAAgACMAAAAHAAEAAAAgACQAAAAHAAEAAAAgACUAAAAHAAEAAAAgACYAAAAHAAEAAAAgACcAAAAHAAEAAAAgACgAAAAHAAEAAAAgACkAAAAHAAEAAAAgACoAAAAHAAEAAAAhABEAAAAHAAEAAAAhABIAAAAHAAEAAAAhABMAAAAHAAEAAAAhABQAAAAHAAEAAAAhABUAAAAHAAEAAAAhABYAAAAHAAEAAAAhABcAAAAHAAEAAAAhABgAAAAHAAEAAAAhABkAAAAHAAEAAAAhABoAAAAHAAEAAAAhABsAAAAHAAEAAAAhABwAAAAHAAEAAAAhAB0AAAAHAAEAAAAhAB4AAAAHAAEAAAAhAB8AAAAHAAEAAAAhACAAAAAHAAEAAAAhACEAAAAHAAEAAAAhACIAAAAHAAEAAAAhACMAAAAHAAEAAAAhACQAAAAHAAEAAAAhACUAAAAHAAEAAAAhACYAAAAHAAEAAAAhACcAAAAHAAEAAAAhACgAAAAHAAEAAAAhACkAAAAHAAEAAAAhACoAAAAHAAEAAAAiABEAAAAHAAEAAAAiABIAAAAHAAEAAAAiABMAAAAHAAEAAAAiABQAAAAHAAEAAAAiABUAAAAHAAEAAAAiABYAAAAHAAEAAAAiABcAAAAHAAEAAAAiABgAAAAHAAEAAAAiABkAAAAHAAEAAAAiABoAAAAHAAEAAAAiABsAAAAHAAEAAAAiABwAAAAHAAEAAAAiAB0AAAAHAAEAAAAiAB4AAAAHAAEAAAAiAB8AAAAHAAEAAAAiACAAAAAHAAEAAAAiACEAAAAHAAEAAAAiACIAAAAHAAEAAAAiACMAAAAHAAEAAAAiACQAAAAHAAEAAAAiACUAAAAHAAEAAAAiACYAAAAHAAEAAAAiACcAAAAHAAEAAAAiACgAAAAHAAEAAAAiACkAAAAHAAEAAAAiACoAAAAHAAEAAAAjABEAAAAHAAEAAAAjABIAAAAHAAEAAAAjABMAAAAHAAEAAAAjABQAAAAHAAEAAAAjABUAAAAHAAEAAAAjABYAAAAHAAEAAAAjABcAAAAHAAEAAAAjABgAAAAHAAEAAAAjABkAAAAHAAEAAAAjABoAAAAHAAEAAAAjABsAAAAHAAEAAAAjABwAAAAHAAEAAAAjAB0AAAAHAAEAAAAjAB4AAAAHAAEAAAAjAB8AAAAHAAEAAAAjACAAAAAHAAEAAAAjACEAAAAHAAEAAAAjACIAAAAHAAEAAAAjACMAAAAHAAEAAAAjACQAAAAHAAEAAAAjACUAAAAHAAEAAAAjACYAAAAHAAEAAAAjACcAAAAHAAEAAAAjACgAAAAHAAEAAAAjACkAAAAHAAEAAAAjACoAAAAHAAEAAAAkABEAAAAHAAEAAAAkABIAAAAHAAEAAAAkABMAAAAHAAEAAAAkABQAAAAHAAEAAAAkABUAAAAHAAEAAAAkABYAAAAHAAEAAAAkABcAAAAHAAEAAAAkABgAAAAHAAEAAAAkABkAAAAHAAEAAAAkABoAAAAHAAEAAAAkABsAAAAHAAEAAAAkABwAAAAHAAEAAAAkAB0AAAAHAAEAAAAkAB4AAAAHAAEAAAAkAB8AAAAHAAEAAAAkACAAAAAHAAEAAAAkACEAAAAHAAEAAAAkACIAAAAHAAEAAAAkACMAAAAHAAEAAAAkACQAAAAHAAEAAAAkACUAAAAHAAEAAAAkACYAAAAHAAEAAAAkACcAAAAHAAEAAAAkACgAAAAHAAEAAAAkACkAAAAHAAEAAAAkACoAAAAHAAEAAAAlABEAAAAHAAEAAAAlABIAAAAIAAIAAAAlABMAAAAIAAEAAAAlABQAAAAIAAEAAAAlABUAAAAIAAEAAAAlABYAAAAIAAAAAAAlABcAAAAHAAEAAAAlABgAAAAHAAEAAAAlABkAAAAHAAEAAAAlABoAAAAIAAIAAAAlABsAAAAIAAAAAAAlABwAAAAHAAEAAAAlAB0AAAAHAAEAAAAlAB4AAAAHAAEAAAAlAB8AAAAHAAEAAAAlACAAAAAIAAIAAAAlACEAAAAIAAAAAAAlACIAAAAHAAEAAAAlACMAAAAHAAEAAAAlACQAAAAHAAEAAAAlACUAAAAHAAEAAAAlACYAAAAHAAEAAAAlACcAAAAHAAEAAAAlACgAAAAHAAEAAAAlACkAAAAHAAEAAAAlACoAAAAHAAEAAAAmABEAAAAIAAIAAAAmABMAAAAGAAAAAAAmABQAAAAGAAIAAAAmABcAAAAIAAEAAAAmABgAAAAIAAAAAAAmABkAAAAIAAIAAAAmABwAAAAIAAAAAAAmAB0AAAAHAAEAAAAmAB4AAAAHAAEAAAAmAB8AAAAHAAEAAAAmACAAAAAHAAIAAAAmACEAAAAEAAIAAAAmACIAAAAIAAAAAAAmACMAAAAHAAEAAAAmACQAAAAHAAEAAAAmACUAAAAHAAEAAAAmACYAAAAHAAEAAAAmACcAAAAHAAEAAAAmACgAAAAHAAEAAAAmACkAAAAHAAEAAAAmACoAAAAHAAEAAAAnABIAAAAGAAAAAAAnABMAAAAHAAEAAAAnABQAAAAHAAEAAAAnABUAAAAGAAIAAAAnAB0AAAAIAAEAAAAnAB4AAAAIAAAAAAAnAB8AAAAIAAIAAAAnACAAAAAGAAAAAAAnACEAAAAGAAIAAAAnACIAAAAGAAAAAAAnACMAAAAHAAEAAAAnACQAAAAHAAEAAAAnACUAAAAHAAEAAAAnACYAAAAHAAEAAAAnACcAAAAHAAEAAAAnACgAAAAHAAEAAAAnACkAAAAHAAEAAAAnACoAAAAHAAEAAAAoABEAAAAGAAEAAAAoABIAAAAHAAEAAAAoABMAAAAHAAEAAAAoABQAAAAHAAEAAAAoABUAAAAHAAEAAAAoABYAAAAGAAIAAAAoABcAAAAGAAAAAAAoABgAAAAGAAIAAAAoABkAAAAGAAEAAAAoABoAAAAHAAAAAAAoABsAAAAGAAIAAAAoAB8AAAAGAAAAAAAoACAAAAAHAAEAAAAoACEAAAAHAAEAAAAoACIAAAAHAAEAAAAoACMAAAAHAAEAAAAoACQAAAAHAAEAAAAoACUAAAAHAAEAAAAoACYAAAAHAAEAAAAoACcAAAAHAAEAAAAoACgAAAAHAAEAAAAoACkAAAAHAAEAAAAoACoAAAAHAAEAAAApABEAAAAHAAEAAAApABIAAAAHAAEAAAApABMAAAAHAAEAAAApABQAAAAHAAEAAAApABUAAAAHAAEAAAApABYAAAAHAAEAAAApABcAAAAHAAEAAAApABgAAAAHAAEAAAApABkAAAAHAAEAAAApABoAAAAGAAIAAAApABsAAAAIAAAAAAApABwAAAAHAAIAAAApAB8AAAAIAAAAAAApACAAAAAHAAEAAAApACEAAAAHAAEAAAApACIAAAAHAAEAAAApACMAAAAHAAEAAAApACQAAAAHAAEAAAApACUAAAAHAAEAAAApACYAAAAHAAEAAAApACcAAAAHAAEAAAApACgAAAAHAAEAAAApACkAAAAHAAEAAAApACoAAAAHAAEAAAAqABEAAAAHAAEAAAAqABIAAAAHAAEAAAAqABMAAAAHAAEAAAAqABQAAAAHAAEAAAAqABUAAAAHAAEAAAAqABYAAAAHAAEAAAAqABcAAAAHAAEAAAAqABgAAAAHAAEAAAAqABkAAAAIAAIAAAAqABoAAAAIAAAAAAAqABsAAAAHAAIAAAAqAB4AAAAFAAAAAAAqAB8AAAAHAAAAAAAqACAAAAAHAAEAAAAqACEAAAAHAAEAAAAqACIAAAAHAAEAAAAqACMAAAAHAAEAAAAqACQAAAAHAAEAAAAqACUAAAAHAAEAAAAqACYAAAAHAAEAAAAqACcAAAAHAAEAAAAqACgAAAAHAAEAAAAqACkAAAAHAAEAAAAqACoAAAAHAAEAAAArABEAAAAHAAEAAAArABIAAAAHAAEAAAArABMAAAAHAAEAAAArABQAAAAHAAEAAAArABUAAAAHAAEAAAArABYAAAAHAAEAAAArABcAAAAHAAEAAAArABgAAAAIAAIAAAArABsAAAAEAAIAAAArACAAAAAIAAAAAAArACEAAAAHAAEAAAArACIAAAAHAAEAAAArACMAAAAHAAEAAAArACQAAAAHAAEAAAArACUAAAAHAAEAAAArACYAAAAHAAEAAAArACcAAAAHAAEAAAArACgAAAAHAAEAAAArACkAAAAHAAEAAAArACoAAAAHAAEAAAAsABEAAAAHAAEAAAAsABIAAAAHAAEAAAAsABMAAAAHAAEAAAAsABQAAAAHAAEAAAAsABUAAAAHAAEAAAAsABYAAAAHAAEAAAAsABcAAAAHAAEAAAAsABgAAAAGAAIAAAAsABoAAAAFAAAAAAAsABsAAAAFAAAAAAAsAB0AAAAGAAEAAAAsACEAAAAIAAAAAAAsACIAAAAHAAEAAAAsACMAAAAHAAEAAAAsACQAAAAHAAEAAAAsACUAAAAHAAEAAAAsACYAAAAHAAEAAAAsACcAAAAHAAEAAAAsACgAAAAHAAEAAAAsACkAAAAHAAEAAAAsACoAAAAHAAEAAAAtABEAAAAHAAEAAAAtABIAAAAHAAEAAAAtABMAAAAHAAEAAAAtABQAAAAHAAEAAAAtABUAAAAHAAEAAAAtABYAAAAHAAEAAAAtABcAAAAHAAEAAAAtABgAAAAHAAEAAAAtABkAAAAGAAIAAAAtABoAAAAGAAEAAAAtABsAAAAGAAAAAAAtABwAAAAGAAIAAAAtAB0AAAAHAAEAAAAtAB4AAAAGAAIAAAAtACIAAAAIAAAAAAAtACMAAAAHAAEAAAAtACQAAAAHAAEAAAAtACUAAAAHAAEAAAAtACYAAAAHAAEAAAAtACcAAAAHAAEAAAAtACgAAAAHAAEAAAAtACkAAAAHAAEAAAAtACoAAAAHAAEAAAAuABEAAAAHAAEAAAAuABIAAAAHAAEAAAAuABMAAAAHAAEAAAAuABQAAAAHAAEAAAAuABUAAAAHAAEAAAAuABYAAAAHAAEAAAAuABcAAAAHAAEAAAAuABgAAAAHAAEAAAAuABkAAAAHAAEAAAAuABoAAAAIAAIAAAAuABsAAAAIAAAAAAAuABwAAAAIAAIAAAAuAB0AAAAIAAAAAAAuAB4AAAAIAAIAAAAuACIAAAAHAAAAAAAuACMAAAAHAAEAAAAuACQAAAAHAAEAAAAuACUAAAAHAAEAAAAuACYAAAAHAAEAAAAuACcAAAAHAAEAAAAuACgAAAAHAAEAAAAuACkAAAAHAAEAAAAuACoAAAAHAAEAAAAvABEAAAAHAAEAAAAvABIAAAAHAAEAAAAvABMAAAAHAAEAAAAvABQAAAAHAAEAAAAvABUAAAAHAAEAAAAvABYAAAAHAAEAAAAvABcAAAAHAAEAAAAvABgAAAAHAAEAAAAvABkAAAAHAAEAAAAvABoAAAAIAAIAAAAvACIAAAAGAAAAAAAvACMAAAAHAAEAAAAvACQAAAAHAAEAAAAvACUAAAAHAAEAAAAvACYAAAAHAAEAAAAvACcAAAAHAAEAAAAvACgAAAAHAAEAAAAvACkAAAAHAAEAAAAvACoAAAAHAAEAAAAwABEAAAAHAAEAAAAwABIAAAAHAAEAAAAwABMAAAAHAAEAAAAwABQAAAAHAAEAAAAwABUAAAAHAAEAAAAwABYAAAAHAAEAAAAwABcAAAAHAAEAAAAwABgAAAAIAAIAAAAwABkAAAAIAAEAAAAwABwAAAAGAAEAAAAwAB0AAAAGAAEAAAAwAB4AAAAGAAEAAAAwACIAAAAIAAAAAAAwACMAAAAHAAEAAAAwACQAAAAHAAEAAAAwACUAAAAHAAEAAAAwACYAAAAHAAEAAAAwACcAAAAHAAEAAAAwACgAAAAHAAEAAAAwACkAAAAHAAEAAAAwACoAAAAHAAEAAAAxABEAAAAHAAEAAAAxABIAAAAHAAEAAAAxABMAAAAHAAEAAAAxABQAAAAHAAEAAAAxABUAAAAHAAEAAAAxABYAAAAHAAEAAAAxABcAAAAHAAEAAAAxABgAAAAGAAIAAAAxABkAAAAGAAEAAAAxABoAAAAGAAEAAAAxABsAAAAGAAAAAAAxABwAAAAHAAEAAAAxAB0AAAAHAAEAAAAxAB4AAAAHAAEAAAAxAB8AAAAGAAIAAAAxACAAAAAGAAIAAAAxACEAAAAEAAIAAAAxACIAAAAHAAAAAAAxACMAAAAHAAEAAAAxACQAAAAHAAEAAAAxACUAAAAHAAEAAAAxACYAAAAHAAEAAAAxACcAAAAHAAEAAAAxACgAAAAHAAEAAAAxACkAAAAHAAEAAAAxACoAAAAHAAEAAAAyABEAAAAHAAEAAAAyABIAAAAHAAEAAAAyABMAAAAHAAEAAAAyABQAAAAHAAEAAAAyABUAAAAHAAEAAAAyABYAAAAHAAEAAAAyABcAAAAHAAEAAAAyABgAAAAHAAEAAAAyABkAAAAHAAEAAAAyABoAAAAHAAEAAAAyABsAAAAHAAEAAAAyABwAAAAHAAEAAAAyAB0AAAAHAAEAAAAyAB4AAAAHAAEAAAAyAB8AAAAIAAIAAAAyACAAAAAIAAAAAAAyACEAAAAGAAIAAAAyACIAAAAGAAAAAAAyACMAAAAHAAEAAAAyACQAAAAHAAEAAAAyACUAAAAHAAEAAAAyACYAAAAHAAEAAAAyACcAAAAHAAEAAAAyACgAAAAHAAEAAAAyACkAAAAHAAEAAAAyACoAAAAHAAEAAAAzABEAAAAHAAEAAAAzABIAAAAHAAEAAAAzABMAAAAHAAEAAAAzABQAAAAHAAEAAAAzABUAAAAHAAEAAAAzABYAAAAHAAEAAAAzABcAAAAHAAEAAAAzABgAAAAHAAEAAAAzABkAAAAHAAEAAAAzABoAAAAHAAEAAAAzABsAAAAIAAIAAAAzABwAAAAIAAEAAAAzAB0AAAAIAAEAAAAzAB4AAAAIAAEAAAAzAB8AAAAEAAIAAAAzACAAAAAEAAIAAAAzACEAAAAIAAAAAAAzACIAAAAHAAEAAAAzACMAAAAHAAEAAAAzACQAAAAHAAEAAAAzACUAAAAHAAEAAAAzACYAAAAHAAEAAAAzACcAAAAHAAEAAAAzACgAAAAHAAEAAAAzACkAAAAHAAEAAAAzACoAAAAHAAEAAAA0ABEAAAAHAAEAAAA0ABIAAAAHAAEAAAA0ABMAAAAHAAEAAAA0ABQAAAAHAAEAAAA0ABUAAAAHAAEAAAA0ABYAAAAHAAEAAAA0ABcAAAAHAAEAAAA0ABgAAAAHAAEAAAA0ABkAAAAHAAEAAAA0ABoAAAAIAAIAAAA0ACAAAAAFAAAAAAA0ACEAAAAEAAIAAAA0ACIAAAAIAAAAAAA0ACMAAAAHAAEAAAA0ACQAAAAHAAEAAAA0ACUAAAAHAAEAAAA0ACYAAAAHAAEAAAA0ACcAAAAHAAEAAAA0ACgAAAAHAAEAAAA0ACkAAAAHAAEAAAA0ACoAAAAHAAEAAAA1ABEAAAAHAAEAAAA1ABIAAAAHAAEAAAA1ABMAAAAHAAEAAAA1ABQAAAAHAAEAAAA1ABUAAAAHAAEAAAA1ABYAAAAHAAEAAAA1ABcAAAAHAAEAAAA1ABgAAAAHAAEAAAA1ABkAAAAHAAEAAAA1ABoAAAAGAAIAAAA1ABsAAAAEAAIAAAA1ACIAAAAHAAAAAAA1ACMAAAAHAAEAAAA1ACQAAAAHAAEAAAA1ACUAAAAHAAEAAAA1ACYAAAAHAAEAAAA1ACcAAAAHAAEAAAA1ACgAAAAHAAEAAAA1ACkAAAAHAAEAAAA1ACoAAAAHAAEAAAA2ABEAAAAHAAEAAAA2ABIAAAAHAAEAAAA2ABMAAAAHAAEAAAA2ABQAAAAHAAEAAAA2ABUAAAAHAAEAAAA2ABYAAAAHAAEAAAA2ABcAAAAHAAEAAAA2ABgAAAAHAAEAAAA2ABkAAAAHAAEAAAA2ABoAAAAHAAEAAAA2ABsAAAAGAAIAAAA2ACEAAAAFAAAAAAA2ACIAAAAHAAAAAAA2ACMAAAAHAAEAAAA2ACQAAAAHAAEAAAA2ACUAAAAHAAEAAAA2ACYAAAAHAAEAAAA2ACcAAAAHAAEAAAA2ACgAAAAHAAEAAAA2ACkAAAAHAAEAAAA2ACoAAAAHAAEAAAA3ABEAAAAHAAEAAAA3ABIAAAAHAAEAAAA3ABMAAAAHAAEAAAA3ABQAAAAHAAEAAAA3ABUAAAAHAAEAAAA3ABYAAAAHAAEAAAA3ABcAAAAHAAEAAAA3ABgAAAAHAAEAAAA3ABkAAAAHAAEAAAA3ABoAAAAHAAEAAAA3ABsAAAAHAAEAAAA3ABwAAAAHAAIAAAA3ACAAAAAGAAAAAAA3ACEAAAAGAAIAAAA3ACIAAAAGAAAAAAA3ACMAAAAHAAEAAAA3ACQAAAAHAAEAAAA3ACUAAAAHAAEAAAA3ACYAAAAHAAEAAAA3ACcAAAAHAAEAAAA3ACgAAAAHAAEAAAA3ACkAAAAHAAEAAAA3ACoAAAAHAAEAAAA4ABEAAAAHAAEAAAA4ABIAAAAHAAEAAAA4ABMAAAAHAAEAAAA4ABQAAAAHAAEAAAA4ABUAAAAHAAEAAAA4ABYAAAAHAAEAAAA4ABcAAAAHAAEAAAA4ABgAAAAHAAEAAAA4ABkAAAAIAAIAAAA4ABoAAAAIAAAAAAA4ABsAAAAIAAIAAAA4AB8AAAAGAAAAAAA4ACAAAAAHAAEAAAA4ACEAAAAHAAEAAAA4ACIAAAAHAAEAAAA4ACMAAAAHAAEAAAA4ACQAAAAHAAEAAAA4ACUAAAAHAAEAAAA4ACYAAAAHAAEAAAA4ACcAAAAHAAEAAAA4ACgAAAAHAAEAAAA4ACkAAAAHAAEAAAA4ACoAAAAHAAEAAAA5ABEAAAAHAAEAAAA5ABIAAAAHAAEAAAA5ABMAAAAHAAEAAAA5ABQAAAAHAAEAAAA5ABUAAAAHAAEAAAA5ABYAAAAHAAEAAAA5ABcAAAAHAAEAAAA5ABgAAAAHAAEAAAA5ABkAAAAGAAIAAAA5ABoAAAAFAAAAAAA5AB0AAAAGAAEAAAA5AB4AAAAGAAAAAAA5AB8AAAAHAAEAAAA5ACAAAAAHAAEAAAA5ACEAAAAHAAEAAAA5ACIAAAAHAAEAAAA5ACMAAAAHAAEAAAA5ACQAAAAHAAEAAAA5ACUAAAAHAAEAAAA5ACYAAAAHAAEAAAA5ACcAAAAHAAEAAAA5ACgAAAAHAAEAAAA5ACkAAAAHAAEAAAA5ACoAAAAHAAEAAAA6ABEAAAAHAAEAAAA6ABIAAAAHAAEAAAA6ABMAAAAHAAEAAAA6ABQAAAAHAAEAAAA6ABUAAAAHAAEAAAA6ABYAAAAHAAEAAAA6ABcAAAAHAAEAAAA6ABgAAAAHAAEAAAA6ABkAAAAHAAEAAAA6ABoAAAAGAAIAAAA6ABwAAAAGAAEAAAA6AB0AAAAIAAAAAAA6AB4AAAAHAAEAAAA6AB8AAAAHAAEAAAA6ACAAAAAHAAEAAAA6ACEAAAAHAAEAAAA6ACIAAAAHAAEAAAA6ACMAAAAHAAEAAAA6ACQAAAAHAAEAAAA6ACUAAAAHAAEAAAA6ACYAAAAHAAEAAAA6ACcAAAAHAAEAAAA6ACgAAAAHAAEAAAA6ACkAAAAHAAEAAAA6ACoAAAAHAAEAAAA7ABEAAAAHAAEAAAA7ABIAAAAHAAEAAAA7ABMAAAAHAAEAAAA7ABQAAAAHAAEAAAA7ABUAAAAHAAEAAAA7ABYAAAAHAAEAAAA7ABcAAAAHAAEAAAA7ABgAAAAHAAEAAAA7ABkAAAAHAAEAAAA7ABoAAAAHAAEAAAA7ABwAAAAIAAAAAAA7AB0AAAAHAAIAAAA7AB4AAAAIAAAAAAA7AB8AAAAHAAEAAAA7ACAAAAAHAAEAAAA7ACEAAAAHAAEAAAA7ACIAAAAHAAEAAAA7ACMAAAAHAAEAAAA7ACQAAAAHAAEAAAA7ACUAAAAHAAEAAAA7ACYAAAAHAAEAAAA7ACcAAAAHAAEAAAA7ACgAAAAHAAEAAAA7ACkAAAAHAAEAAAA7ACoAAAAHAAEAAAA8ABEAAAAHAAEAAAA8ABIAAAAHAAEAAAA8ABMAAAAHAAEAAAA8ABQAAAAHAAEAAAA8ABUAAAAHAAEAAAA8ABYAAAAHAAEAAAA8ABcAAAAHAAEAAAA8ABgAAAAHAAEAAAA8ABkAAAAHAAEAAAA8ABoAAAAIAAIAAAA8ABwAAAAHAAEAAAA8AB0AAAAGAAIAAAA8AB4AAAAGAAAAAAA8AB8AAAAHAAEAAAA8ACAAAAAHAAEAAAA8ACEAAAAHAAEAAAA8ACIAAAAHAAEAAAA8ACMAAAAHAAEAAAA8ACQAAAAHAAEAAAA8ACUAAAAHAAEAAAA8ACYAAAAHAAEAAAA8ACcAAAAHAAEAAAA8ACgAAAAHAAEAAAA8ACkAAAAHAAEAAAA8ACoAAAAHAAEAAAA9ABEAAAAHAAEAAAA9ABIAAAAHAAEAAAA9ABMAAAAHAAEAAAA9ABQAAAAHAAEAAAA9ABUAAAAHAAEAAAA9ABYAAAAHAAEAAAA9ABcAAAAHAAEAAAA9ABgAAAAHAAEAAAA9ABkAAAAIAAIAAAA9ABwAAAAHAAEAAAA9AB0AAAAHAAEAAAA9AB4AAAAHAAEAAAA9AB8AAAAHAAEAAAA9ACAAAAAHAAEAAAA9ACEAAAAHAAEAAAA9ACIAAAAHAAEAAAA9ACMAAAAHAAEAAAA9ACQAAAAHAAEAAAA9ACUAAAAHAAEAAAA9ACYAAAAHAAEAAAA9ACcAAAAHAAEAAAA9ACgAAAAHAAEAAAA9ACkAAAAHAAEAAAA9ACoAAAAHAAEAAAA+ABEAAAAHAAEAAAA+ABIAAAAHAAEAAAA+ABMAAAAHAAEAAAA+ABQAAAAHAAEAAAA+ABUAAAAHAAEAAAA+ABYAAAAHAAEAAAA+ABcAAAAIAAIAAAA+ABgAAAAIAAEAAAA+ABsAAAAHAAEAAAA+ABwAAAAHAAEAAAA+AB0AAAAHAAEAAAA+AB4AAAAHAAEAAAA+AB8AAAAHAAEAAAA+ACAAAAAHAAEAAAA+ACEAAAAHAAEAAAA+ACIAAAAHAAEAAAA+ACMAAAAHAAEAAAA+ACQAAAAHAAEAAAA+ACUAAAAHAAEAAAA+ACYAAAAHAAEAAAA+ACcAAAAHAAEAAAA+ACgAAAAHAAEAAAA+ACkAAAAHAAEAAAA+ACoAAAAHAAEAAAA/ABEAAAAHAAEAAAA/ABIAAAAHAAEAAAA/ABMAAAAHAAEAAAA/ABQAAAAHAAEAAAA/ABUAAAAHAAEAAAA/ABYAAAAHAAEAAAA/ABcAAAAHAAIAAAA/ABoAAAAHAAEAAAA/ABsAAAAHAAEAAAA/ABwAAAAHAAEAAAA/AB0AAAAHAAEAAAA/AB4AAAAHAAEAAAA/AB8AAAAHAAEAAAA/ACAAAAAHAAEAAAA/ACEAAAAHAAEAAAA/ACIAAAAHAAEAAAA/ACMAAAAHAAEAAAA/ACQAAAAHAAEAAAA/ACUAAAAHAAEAAAA/ACYAAAAHAAEAAAA/ACcAAAAHAAEAAAA/ACgAAAAHAAEAAAA/ACkAAAAHAAEAAAA/ACoAAAAHAAEAAABAABEAAAAHAAEAAABAABIAAAAHAAEAAABAABMAAAAHAAEAAABAABQAAAAHAAEAAABAABUAAAAHAAEAAABAABYAAAAHAAEAAABAABcAAAAHAAIAAABAABkAAAAHAAEAAABAABoAAAAHAAEAAABAABsAAAAHAAEAAABAABwAAAAHAAEAAABAAB0AAAAHAAEAAABAAB4AAAAHAAEAAABAAB8AAAAHAAEAAABAACAAAAAHAAEAAABAACEAAAAHAAEAAABAACIAAAAHAAEAAABAACMAAAAHAAEAAABAACQAAAAHAAEAAABAACUAAAAHAAEAAABAACYAAAAHAAEAAABAACcAAAAHAAEAAABAACgAAAAHAAEAAABAACkAAAAHAAEAAABAACoAAAAHAAEAAABBABEAAAAHAAEAAABBABIAAAAHAAEAAABBABMAAAAHAAEAAABBABQAAAAHAAEAAABBABUAAAAHAAEAAABBABYAAAAIAAIAAABBABkAAAAHAAEAAABBABoAAAAHAAEAAABBABsAAAAHAAEAAABBABwAAAAHAAEAAABBAB0AAAAHAAEAAABBAB4AAAAHAAEAAABBAB8AAAAHAAEAAABBACAAAAAHAAEAAABBACEAAAAHAAEAAABBACIAAAAHAAEAAABBACMAAAAHAAEAAABBACQAAAAHAAEAAABBACUAAAAHAAEAAABBACYAAAAHAAEAAABBACcAAAAHAAEAAABBACgAAAAHAAEAAABBACkAAAAHAAEAAABBACoAAAAHAAEAAABCABEAAAAHAAEAAABCABIAAAAHAAEAAABCABMAAAAHAAEAAABCABQAAAAHAAEAAABCABUAAAAIAAIAAABCABgAAAAHAAEAAABCABkAAAAHAAEAAABCABoAAAAHAAEAAABCABsAAAAHAAEAAABCABwAAAAHAAEAAABCAB0AAAAHAAEAAABCAB4AAAAHAAEAAABCAB8AAAAHAAEAAABCACAAAAAHAAEAAABCACEAAAAHAAEAAABCACIAAAAHAAEAAABCACMAAAAHAAEAAABCACQAAAAHAAEAAABCACUAAAAHAAEAAABCACYAAAAHAAEAAABCACcAAAAHAAEAAABCACgAAAAHAAEAAABCACkAAAAHAAEAAABCACoAAAAHAAEAAABDABEAAAAHAAEAAABDABIAAAAHAAEAAABDABMAAAAHAAEAAABDABQAAAAHAAEAAABDABUAAAAHAAIAAABDABgAAAAIAAAAAABDABkAAAAHAAEAAABDABoAAAAHAAEAAABDABsAAAAHAAEAAABDABwAAAAHAAEAAABDAB0AAAAHAAEAAABDAB4AAAAHAAEAAABDAB8AAAAHAAEAAABDACAAAAAHAAEAAABDACEAAAAHAAEAAABDACIAAAAHAAEAAABDACMAAAAHAAEAAABDACQAAAAHAAEAAABDACUAAAAHAAEAAABDACYAAAAHAAEAAABDACcAAAAHAAEAAABDACgAAAAHAAEAAABDACkAAAAHAAEAAABDACoAAAAHAAEAAABEABEAAAAHAAEAAABEABIAAAAHAAEAAABEABMAAAAHAAEAAABEABQAAAAHAAEAAABEABUAAAAGAAIAAABEABgAAAAGAAAAAABEABkAAAAHAAEAAABEABoAAAAHAAEAAABEABsAAAAHAAEAAABEABwAAAAHAAEAAABEAB0AAAAHAAEAAABEAB4AAAAHAAEAAABEAB8AAAAHAAEAAABEACAAAAAHAAEAAABEACEAAAAHAAEAAABEACIAAAAHAAEAAABEACMAAAAHAAEAAABEACQAAAAHAAEAAABEACUAAAAHAAEAAABEACYAAAAHAAEAAABEACcAAAAHAAEAAABEACgAAAAHAAEAAABEACkAAAAHAAEAAABEACoAAAAHAAEAAABFABEAAAAHAAEAAABFABIAAAAHAAEAAABFABMAAAAHAAEAAABFABQAAAAHAAEAAABFABUAAAAHAAEAAABFABYAAAAHAAIAAABFABgAAAAHAAEAAABFABkAAAAHAAEAAABFABoAAAAHAAEAAABFABsAAAAHAAEAAABFABwAAAAHAAEAAABFAB0AAAAHAAEAAABFAB4AAAAHAAEAAABFAB8AAAAHAAEAAABFACAAAAAHAAEAAABFACEAAAAHAAEAAABFACIAAAAHAAEAAABFACMAAAAHAAEAAABFACQAAAAHAAEAAABFACUAAAAHAAEAAABFACYAAAAHAAEAAABFACcAAAAHAAEAAABFACgAAAAHAAEAAABFACkAAAAHAAEAAABFACoAAAAHAAEAAABGABEAAAAHAAEAAABGABIAAAAHAAEAAABGABMAAAAHAAEAAABGABQAAAAIAAIAAABGABUAAAAIAAEAAABGABYAAAAGAAEAAABGABgAAAAHAAEAAABGABkAAAAHAAEAAABGABoAAAAHAAEAAABGABsAAAAHAAEAAABGABwAAAAHAAEAAABGAB0AAAAHAAEAAABGAB4AAAAHAAEAAABGAB8AAAAHAAEAAABGACAAAAAHAAEAAABGACEAAAAHAAEAAABGACIAAAAHAAEAAABGACMAAAAHAAEAAABGACQAAAAHAAEAAABGACUAAAAHAAEAAABGACYAAAAHAAEAAABGACcAAAAHAAEAAABGACgAAAAHAAEAAABGACkAAAAHAAEAAABGACoAAAAHAAEAAABHABEAAAAIAAAAAABHABIAAAAHAAEAAABHABMAAAAHAAEAAABHABQAAAAHAAIAAABHABUAAAAHAAAAAABHABYAAAAHAAEAAABHABcAAAAHAAEAAABHABgAAAAHAAEAAABHABkAAAAHAAEAAABHABoAAAAHAAEAAABHABsAAAAHAAEAAABHABwAAAAHAAEAAABHAB0AAAAHAAEAAABHAB4AAAAHAAEAAABHAB8AAAAHAAEAAABHACAAAAAHAAEAAABHACEAAAAHAAEAAABHACIAAAAHAAEAAABHACMAAAAHAAEAAABHACQAAAAHAAEAAABHACUAAAAHAAEAAABHACYAAAAHAAEAAABHACcAAAAHAAEAAABHACgAAAAHAAEAAABHACkAAAAHAAEAAABHACoAAAAIAAIAAAA=") +tile_set = ExtResource("7_po5fq") +script = ExtResource("55_a8sfs") +metadata/_edit_lock_ = true + +[node name="Treetops" type="TileMapLayer" parent="Field/Map/Forest"] +tile_map_data = PackedByteArray("AAAtABwAAAAGAAAAAAAuABoAAAAGAAIAAAAxAB8AAAAGAAAAAAA7ABwAAAAGAAAAAAA8ABsAAAAHAAAAAAA9ABsAAAAGAAAAAAA+ABoAAAAGAAAAAAA/ABkAAAAGAAAAAABAABgAAAAHAAAAAABBABgAAAAGAAAAAABCABcAAAAHAAAAAABFABcAAAAHAAAAAABGABcAAAAGAAAAAAA=") +tile_set = ExtResource("7_po5fq") metadata/_edit_lock_ = true -[node name="GhostGFX" parent="Field/Terrain/Gamepieces/Grove/Ghost" instance=ExtResource("36_7n3c5")] +[node name="Gamepieces" type="Node2D" parent="Field/Map/Forest"] +y_sort_enabled = true -[node name="AnimationPlayer" type="AnimationPlayer" parent="Field/Terrain/Gamepieces/Grove/Ghost"] +[node name="Ghost" parent="Field/Map/Forest/Gamepieces" instance=ExtResource("11_yntrj")] +position = Vector2(840, 488) +metadata/_edit_group_ = true + +[node name="GhostGFX" parent="Field/Map/Forest/Gamepieces/Ghost" instance=ExtResource("36_7n3c5")] + +[node name="AnimationPlayer" type="AnimationPlayer" parent="Field/Map/Forest/Gamepieces/Ghost"] libraries = { &"": SubResource("AnimationLibrary_d6ycm") } -[node name="WinScreen" type="CanvasLayer" parent="Field/Terrain/Gamepieces/Grove/Ghost/AnimationPlayer"] +[node name="WinScreen" type="CanvasLayer" parent="Field/Map/Forest/Gamepieces/Ghost/AnimationPlayer"] -[node name="ColorRect" type="ColorRect" parent="Field/Terrain/Gamepieces/Grove/Ghost/AnimationPlayer/WinScreen"] +[node name="ColorRect" type="ColorRect" parent="Field/Map/Forest/Gamepieces/Ghost/AnimationPlayer/WinScreen"] visible = false modulate = Color(1, 1, 1, 0) anchors_preset = 15 @@ -668,7 +676,7 @@ grow_vertical = 2 mouse_filter = 2 color = Color(0, 0, 0, 1) -[node name="VBoxContainer" type="CenterContainer" parent="Field/Terrain/Gamepieces/Grove/Ghost/AnimationPlayer/WinScreen/ColorRect"] +[node name="VBoxContainer" type="CenterContainer" parent="Field/Map/Forest/Gamepieces/Ghost/AnimationPlayer/WinScreen/ColorRect"] layout_mode = 1 anchors_preset = 15 anchor_right = 1.0 @@ -676,16 +684,16 @@ anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 -[node name="VBoxContainer" type="VBoxContainer" parent="Field/Terrain/Gamepieces/Grove/Ghost/AnimationPlayer/WinScreen/ColorRect/VBoxContainer"] +[node name="VBoxContainer" type="VBoxContainer" parent="Field/Map/Forest/Gamepieces/Ghost/AnimationPlayer/WinScreen/ColorRect/VBoxContainer"] modulate = Color(1, 1, 1, 0) layout_mode = 2 -[node name="Label" type="Label" parent="Field/Terrain/Gamepieces/Grove/Ghost/AnimationPlayer/WinScreen/ColorRect/VBoxContainer/VBoxContainer"] +[node name="Label" type="Label" parent="Field/Map/Forest/Gamepieces/Ghost/AnimationPlayer/WinScreen/ColorRect/VBoxContainer/VBoxContainer"] layout_mode = 2 text = "THANK YOU FOR PLAYING!" label_settings = SubResource("LabelSettings_dkg5i") -[node name="Label2" type="Label" parent="Field/Terrain/Gamepieces/Grove/Ghost/AnimationPlayer/WinScreen/ColorRect/VBoxContainer/VBoxContainer"] +[node name="Label2" type="Label" parent="Field/Map/Forest/Gamepieces/Ghost/AnimationPlayer/WinScreen/ColorRect/VBoxContainer/VBoxContainer"] custom_minimum_size = Vector2(800, 0) layout_mode = 2 text = "Find more info or ways to help out at @@ -693,112 +701,69 @@ github.com/gdquest-demos/godot-open-rpg!" horizontal_alignment = 1 autowrap_mode = 3 -[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="Field/Terrain/Gamepieces/Grove/Ghost"] +[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="Field/Map/Forest/Gamepieces/Ghost"] bus = &"SFX" -[node name="Pickup" parent="Field/Terrain/Gamepieces/Grove" instance=ExtResource("29_gxq7u")] +[node name="Pickup" parent="Field/Map/Forest/Gamepieces" instance=ExtResource("29_gxq7u")] position = Vector2(776, 424) item_type = 5 -[node name="GameEndTrigger" parent="Field/Terrain/Gamepieces/Grove" node_paths=PackedStringArray("ghost_animation_player") instance=ExtResource("39_p2lth")] +[node name="GameEndTrigger" parent="Field/Map/Forest/Gamepieces" node_paths=PackedStringArray("ghost_animation_player") instance=ExtResource("39_p2lth")] position = Vector2(888, 472) script = ExtResource("40_lduow") timeline = ExtResource("37_uncgg") ghost_animation_player = NodePath("../Ghost/AnimationPlayer") -[node name="Area2D2" type="Area2D" parent="Field/Terrain/Gamepieces/Grove/GameEndTrigger"] +[node name="Area2D2" type="Area2D" parent="Field/Map/Forest/Gamepieces/GameEndTrigger"] position = Vector2(9.76562e-05, 16) collision_layer = 32 collision_mask = 4 monitorable = false -[node name="CollisionShape2D" type="CollisionShape2D" parent="Field/Terrain/Gamepieces/Grove/GameEndTrigger/Area2D2"] +[node name="CollisionShape2D" type="CollisionShape2D" parent="Field/Map/Forest/Gamepieces/GameEndTrigger/Area2D2"] position = Vector2(0, 3.5) shape = SubResource("RectangleShape2D_giaot") debug_color = Color(1, 0.55, 0.8, 0.42) -[node name="Timer" type="Timer" parent="Field/Terrain/Gamepieces/Grove/GameEndTrigger"] +[node name="Timer" type="Timer" parent="Field/Map/Forest/Gamepieces/GameEndTrigger"] wait_time = 0.25 one_shot = true -[node name="GroveToHouse" parent="Field/Terrain/Gamepieces/Grove" instance=ExtResource("37_6xxks")] +[node name="GroveToHouse" parent="Field/Map/Forest/Gamepieces" instance=ExtResource("37_6xxks")] position = Vector2(952, 440) arrival_coordinates = Vector2(936, 24) new_music = ExtResource("34_xbc6u") metadata/_edit_lock_ = true -[node name="GroveToTown" parent="Field/Terrain/Gamepieces/Grove" instance=ExtResource("37_6xxks")] +[node name="GroveToTown" parent="Field/Map/Forest/Gamepieces" instance=ExtResource("37_6xxks")] position = Vector2(632, 408) arrival_coordinates = Vector2(200, 264) new_music = ExtResource("41_uxhyb") metadata/_edit_lock_ = true -[node name="House" type="Node2D" parent="Field/Terrain/Gamepieces"] -y_sort_enabled = true -metadata/_edit_lock_ = true +[node name="Overlay" type="Node2D" parent="Field/Map"] -[node name="PedestalPuzzle" type="Node2D" parent="Field/Terrain/Gamepieces/House"] -y_sort_enabled = true -metadata/_edit_lock_ = true - -[node name="GreenPedestal" parent="Field/Terrain/Gamepieces/House/PedestalPuzzle" node_paths=PackedStringArray("spikes_animation") instance=ExtResource("38_n1c7a")] -position = Vector2(856, 40) -spikes_animation = NodePath("../Spikes") -pedestal_requirement = "Green" - -[node name="BluePedestal" parent="Field/Terrain/Gamepieces/House/PedestalPuzzle" node_paths=PackedStringArray("spikes_animation") instance=ExtResource("38_n1c7a")] -position = Vector2(872, 40) -spikes_animation = NodePath("../Spikes") -pedestal_requirement = "Blue" - -[node name="RedPedestal" parent="Field/Terrain/Gamepieces/House/PedestalPuzzle" node_paths=PackedStringArray("spikes_animation") instance=ExtResource("38_n1c7a")] -position = Vector2(888, 40) -spikes_animation = NodePath("../Spikes") -pedestal_requirement = "Red" - -[node name="Spikes" type="AnimationPlayer" parent="Field/Terrain/Gamepieces/House/PedestalPuzzle"] -libraries = { -&"": SubResource("AnimationLibrary_jktnn") -} - -[node name="SpikesArea" type="Area2D" parent="Field/Terrain/Gamepieces/House/PedestalPuzzle/Spikes"] -position = Vector2(4680, 360) -scale = Vector2(5, 5) -collision_layer = 2 -collision_mask = 0 -monitoring = false -metadata/_edit_group_ = true - -[node name="Sprite2D" type="Sprite2D" parent="Field/Terrain/Gamepieces/House/PedestalPuzzle/Spikes/SpikesArea"] -texture = ExtResource("9_woa3f") -region_enabled = true -region_rect = Rect2(85, 51, 16, 16) - -[node name="CollisionShape2D" type="CollisionShape2D" parent="Field/Terrain/Gamepieces/House/PedestalPuzzle/Spikes/SpikesArea"] -shape = SubResource("RectangleShape2D_44b32") - -[node name="SpikesClick" type="AudioStreamPlayer" parent="Field/Terrain/Gamepieces/House/PedestalPuzzle/Spikes"] -bus = &"SFX" +[node name="DebugMoveGrid" type="TileMapLayer" parent="Field/Map/Overlay"] +visible = false +modulate = Color(1, 1, 1, 0.470588) +tile_set = ExtResource("59_nl04t") +script = ExtResource("60_a8sfs") -[node name="HouseToTown" parent="Field/Terrain/Gamepieces/House" instance=ExtResource("37_6xxks")] -position = Vector2(824, 24) -arrival_coordinates = Vector2(120, 184) -new_music = ExtResource("41_uxhyb") -metadata/_edit_lock_ = true +[node name="OccupancyGrid" type="TileMapLayer" parent="Field/Map/Overlay/DebugMoveGrid"] -[node name="HouseToGrove" parent="Field/Terrain/Gamepieces/House" instance=ExtResource("37_6xxks")] -position = Vector2(936, 8) -arrival_coordinates = Vector2(936, 440) -new_music = ExtResource("41_uxhyb") -metadata/_edit_lock_ = true +[node name="Cursor" type="TileMapLayer" parent="Field/Map/Overlay"] +tile_set = ExtResource("3_2v5er") +script = ExtResource("5_3guor") -[node name="Chest" parent="Field/Terrain/Gamepieces/House" instance=ExtResource("33_7djdg")] -position = Vector2(840, 120) -item_type = 3 +[node name="PlayerPathDestinationMarker" type="Sprite2D" parent="Field/Map/Overlay"] +visible = false +modulate = Color(0.909804, 0.270588, 0.215686, 0.705882) +texture = ExtResource("13_osl4o") +script = ExtResource("14_0j4ru") -[node name="MapBoundaries" type="Node2D" parent="Field"] +[node name="DebugBoundaries" type="Node2D" parent="Field/Map/Overlay"] script = ExtResource("18_cqtg7") -gameboard = ExtResource("6_kd8tv") +gameboard_properties = ExtResource("3_esa52") metadata/_edit_lock_ = true [node name="UI" type="CanvasLayer" parent="Field"] @@ -961,4 +926,4 @@ metadata/_edit_lock_ = true wait_time = 0.5 one_shot = true -[connection signal="area_entered" from="Field/Terrain/Gamepieces/Grove/GameEndTrigger/Area2D2" to="Field/Terrain/Gamepieces/Grove/GameEndTrigger" method="_on_area_entered"] +[connection signal="area_entered" from="Field/Map/Forest/Gamepieces/GameEndTrigger/Area2D2" to="Field/Map/Forest/Gamepieces/GameEndTrigger" method="_on_area_entered"]