From 144fc55459a2948855d499cb0e15623a1847f734 Mon Sep 17 00:00:00 2001 From: Will Thompson Date: Fri, 18 Sep 2026 20:10:44 +0100 Subject: [PATCH] Tile-o-matic This adds a prototype of a script that can be used to automatically update water, foam, shadows (cliff and bridge), and cliff collisions based on the other layers in the scene. It's halfway (or maybe 1/10 of the way) to a custom level editor. It supports multiple layers of bridges but only one layer of elevations or (elevation or bridge) shadows. The intended workflow is to paint floors, cliffs, and bridges, then click Update to fix the others. One thing I discovered while writing this is that we didn't have collisionless alternatives for every cliff-edge tile, only for two of them, and those alternatives were missing their occlusion (physics and light) polygons and possibly some other properties. I wrote a script to give every cliff-edge tile an alternative that does not have wall collisions. However this is still not quite correct. Bottom edges include include the cliff-face below. That face needs to be walkable when the bridge is coming from the bottom; but when coming from the side, the bottom should block the player. So we need two alts for that. Similarly, if you have a bridge reaching a top-right corner from its right edge, and land at a lower height above its top edge, you shouldn't be able to walk off the top. You can see the problem in this test scene. I did not fix this family of issues. This is also all painfully hard-coded to the specific tilesets in the main game... --- .../props/tileomatic/tileomatic.gd | 197 ++++++++++++++++++ .../props/tileomatic/tileomatic.gd.uid | 1 + .../props/tileomatic/tileomatic_test.tscn | 120 +++++++++++ tiles/elevation_2.tres | 147 +++++++++++++ tools/add_elevation_alternative_tiles.gd | 41 ++++ tools/add_elevation_alternative_tiles.gd.uid | 1 + 6 files changed, 507 insertions(+) create mode 100644 scenes/game_elements/props/tileomatic/tileomatic.gd create mode 100644 scenes/game_elements/props/tileomatic/tileomatic.gd.uid create mode 100644 scenes/game_elements/props/tileomatic/tileomatic_test.tscn create mode 100644 tools/add_elevation_alternative_tiles.gd create mode 100644 tools/add_elevation_alternative_tiles.gd.uid diff --git a/scenes/game_elements/props/tileomatic/tileomatic.gd b/scenes/game_elements/props/tileomatic/tileomatic.gd new file mode 100644 index 0000000000..f8088c84af --- /dev/null +++ b/scenes/game_elements/props/tileomatic/tileomatic.gd @@ -0,0 +1,197 @@ +# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 +@tool +extends Node +## Automatically paint water, foam, and shadows in a group of TileMapLayers +## +## It is very tedious and error-prone to paint these by hand. This tool assumes +## that that floor & elevation tiles should be surrounded by water, and that +## water should otherwise not be present. It also deals with using alternative +## water/cliff tiles as needed for bridges and the back row of elevated terrain +## extending over water. It is extremely hardcoded to our core TileSets and does +## not attempt to be general at all. +## +## @experimental This is only a prototype. You should expect to have to manually +## tweak this script and/or the scene if you want to use it. + +enum WaterAlternatives { + UNSET = -1, + NORMAL = 0, + WALKABLE = 1, + TOP_WALKABLE = 2, +} +enum FillMode { + WHEN_EXPOSED, + WHEN_NEIGHBOURS_EXPOSED, +} + +const HEIGHT_KEY = &"height" + +const WATER_SOURCE_ID := 0 +const WATER_TILE := Vector2i(0, 0) + +const FOAM_SOURCE_ID := 2 +const FOAM_TILE := Vector2i(0, 0) + +const SHADOWS_SOURCE_ID = 0 +const SHADOWS_TILE := Vector2i(0, 0) + +const BRIDGES_SOURCE_ID = 3 + +@export var water: TileMapLayer +@export var foam: TileMapLayer +@export var floors: Array[TileMapLayer] + +# TODO: Should this be an array of pairs? +@export var bridge_shadows: TileMapLayer +## For bridges that are not at ground level, set a "height" metadata with integer value +## for the height above ground level. This allows the shadows to be offset correctly. +@export var bridges: Array[TileMapLayer] + +# TODO: Support multiple layers of elevation +@export var elevation_shadows: TileMapLayer +@export var elevation: TileMapLayer + +@export_tool_button("Update") var update: Callable = _update + + +func _non_water_layers() -> Array[TileMapLayer]: + var xs := floors.duplicate() + xs.append(elevation) + return xs + + +func _update() -> void: + # TODO: use undo/redo + _toggle(water, _non_water_layers(), [], FillMode.WHEN_EXPOSED, WATER_SOURCE_ID, WATER_TILE) + _cliff_o_matic() + + _toggle( + foam, _non_water_layers(), [], FillMode.WHEN_NEIGHBOURS_EXPOSED, FOAM_SOURCE_ID, FOAM_TILE + ) + + _toggle( + elevation_shadows, + [elevation], + [Vector2i(0, 7), Vector2i(1, 7), Vector2i(2, 7), Vector2i(3, 7)], + FillMode.WHEN_NEIGHBOURS_EXPOSED, + SHADOWS_SOURCE_ID, + SHADOWS_TILE + ) + + _bridge_o_matic() + + if get_tree().edited_scene_root == owner: + Engine.get_singleton("EditorInterface").mark_scene_as_unsaved() + + +func _get_layer_offset(layer: TileMapLayer) -> Vector2i: + var default := 1 if layer == elevation else 0 + return Vector2i(0, 1) * (layer.get_meta(HEIGHT_KEY, default) as int) + + +# Toggle tiles in [param lower] based on the presence or absence of tiles in +# [param upper_layers], taking into account the offset for each of those +# according to _get_layer_offset(). +func _toggle( + lower: TileMapLayer, + upper_layers: Array[TileMapLayer], + ignore_upper_tiles: Array[Vector2i], + fill_mode: FillMode, + source_id: int, + atlas_coords: Vector2i, + alternative_tile: int = 0 +) -> void: + var box := lower.get_used_rect() + var upper_cells: Dictionary[Vector2i, bool] + for layer: TileMapLayer in upper_layers: + var offset := _get_layer_offset(layer) + for used_cell: Vector2i in layer.get_used_cells(): + if not layer.get_cell_atlas_coords(used_cell) in ignore_upper_tiles: + upper_cells[used_cell + offset] = true + + box = box.merge(layer.get_used_rect().grow(2)) + + for x: int in range(box.position.x, box.end.x): + for y: int in range(box.position.y, box.end.y): + var coords := Vector2i(x, y) + var covered := upper_cells.has(coords) + var neighbours_covered := ( + upper_cells.has(coords + Vector2i.UP) + and upper_cells.has(coords + Vector2i.DOWN) + and upper_cells.has(coords + Vector2i.LEFT) + and upper_cells.has(coords + Vector2i.RIGHT) + ) + if ( + (fill_mode == FillMode.WHEN_EXPOSED and not covered) + or ( + fill_mode == FillMode.WHEN_NEIGHBOURS_EXPOSED + and covered + and not neighbours_covered + ) + ): + lower.set_cell(coords, source_id, atlas_coords, alternative_tile) + else: + lower.erase_cell(coords) + + +func _cliff_o_matic() -> void: + for coords: Vector2i in elevation.get_used_cells(): + # Make water behind clifftops walkable + if water.get_cell_source_id(coords) != -1: + water.set_cell(coords, WATER_SOURCE_ID, WATER_TILE, WaterAlternatives.WALKABLE) + + # Make cliffs above stairs walkable + if elevation.get_cell_atlas_coords(coords).y == 7: + var up := coords + Vector2i.UP + elevation.set_cell( + up, elevation.get_cell_source_id(up), elevation.get_cell_atlas_coords(up), 1 + ) + + +# Paint shadows below bridges. +func _bridge_o_matic() -> void: + bridge_shadows.clear() + + for b: TileMapLayer in bridges: + var offset := _get_layer_offset(b) + for coords: Vector2i in b.get_used_cells(): + var bridge_atlas_coords := b.get_cell_atlas_coords(coords) + var water_alt := WaterAlternatives.UNSET + var elevation_alt := 0 + match bridge_atlas_coords: + Vector2i(0, 0): # Horizontal left anchor + # TODO: One alt is not enough. For the bottom-right corner + # cliff tile, for example, we need 3 alts: one with no + # collisions on the right, one with no collisions on the + # bottom, and one with neither set of collisions, to handle + # the cases of bridges coming from each edge. The one-tile + # clifftop actually needs 2 ** 4 - 1 alts I think!... Could + # do it as a bitmask: label the cardinal directions 0, 1, 2, + # 3, then set the (1 << direction)th bit for each bridge, + # and now use that numbered alternative. + elevation_alt = 1 + Vector2i(1, 0): # Horizontal bridge middle segment + bridge_shadows.set_cell(coords + offset, BRIDGES_SOURCE_ID, Vector2i(2, 3)) + water_alt = WaterAlternatives.WALKABLE + elevation_alt = 1 + Vector2i(2, 0): # Horizontal right anchor + elevation_alt = 1 + Vector2i(0, 1): # Vertical bridge top + elevation_alt = 1 + Vector2i(0, 2): # Vertical bridge middle segment + water_alt = WaterAlternatives.WALKABLE + elevation_alt = 1 + Vector2i(0, 3): # Bottom of vertical bridge + # (TODO: and how about pontoons in other directions?! Need + # more water alts - or to put the physics into the bridge.) + water_alt = WaterAlternatives.TOP_WALKABLE + elevation_alt = 1 + + if water.get_cell_source_id(coords) != -1 and water_alt != WaterAlternatives.UNSET: + water.set_cell(coords, WATER_SOURCE_ID, WATER_TILE, water_alt) + + if elevation.get_cell_alternative_tile(coords) == 0 and elevation_alt != 0: + var source_id := elevation.get_cell_source_id(coords) + var atlas_coords := elevation.get_cell_atlas_coords(coords) + elevation.set_cell(coords, source_id, atlas_coords, elevation_alt) diff --git a/scenes/game_elements/props/tileomatic/tileomatic.gd.uid b/scenes/game_elements/props/tileomatic/tileomatic.gd.uid new file mode 100644 index 0000000000..387ce9a3bd --- /dev/null +++ b/scenes/game_elements/props/tileomatic/tileomatic.gd.uid @@ -0,0 +1 @@ +uid://dd58aty1bmx1g diff --git a/scenes/game_elements/props/tileomatic/tileomatic_test.tscn b/scenes/game_elements/props/tileomatic/tileomatic_test.tscn new file mode 100644 index 0000000000..0594eb8869 --- /dev/null +++ b/scenes/game_elements/props/tileomatic/tileomatic_test.tscn @@ -0,0 +1,120 @@ +[gd_scene format=4 uid="uid://cp54yq12hcsdn"] + +[ext_resource type="Script" uid="uid://c8405c212rbn6" path="res://scenes/game_elements/props/background_music/components/background_music.gd" id="1_nyjlp"] +[ext_resource type="AudioStream" uid="uid://bbamdm6wtjjcn" path="res://assets/first_party/music/Threadbare_Bed.ogg" id="2_wmohk"] +[ext_resource type="Script" uid="uid://dd58aty1bmx1g" path="res://scenes/game_elements/props/tileomatic/tileomatic.gd" id="3_46qpo"] +[ext_resource type="TileSet" uid="uid://oynx002hv8tl" path="res://tiles/water.tres" id="4_r34th"] +[ext_resource type="TileSet" uid="uid://bjx3gvah0ycl1" path="res://tiles/foam_2.tres" id="5_m665c"] +[ext_resource type="TileSet" uid="uid://b8qnr0owsbhhn" path="res://tiles/exterior_floors.tres" id="6_ooh1h"] +[ext_resource type="TileSet" uid="uid://41pk6xbhypue" path="res://tiles/fence.tres" id="7_wsa58"] +[ext_resource type="TileSet" uid="uid://do0ffypatd77h" path="res://tiles/bridges.tres" id="8_ir1lv"] +[ext_resource type="TileSet" uid="uid://bdc7ucso7bx0s" path="res://tiles/shadows.tres" id="9_m23oo"] +[ext_resource type="TileSet" uid="uid://b778cuoftt88r" path="res://tiles/elevation_2.tres" id="10_t64ph"] +[ext_resource type="Material" uid="uid://64aeyjitacv3" path="res://scenes/game_elements/props/void/void_chromakey_material.tres" id="11_ed2id"] +[ext_resource type="TileSet" uid="uid://ciq5guijvlyb0" path="res://tiles/void_chromakey.tres" id="12_qsid1"] +[ext_resource type="PackedScene" uid="uid://iu2q66clupc6" path="res://scenes/game_elements/characters/player/player.tscn" id="13_k62uw"] +[ext_resource type="SpriteFrames" uid="uid://dtoylirwywk0j" path="res://scenes/game_elements/characters/components/sprite_frames/storyweaver_blue.tres" id="14_y4k7c"] +[ext_resource type="PackedScene" uid="uid://fuhl3l6gxq5k" path="res://scenes/game_elements/props/collectible_item/collectible_item.tscn" id="15_xwn5o"] +[ext_resource type="Script" uid="uid://bgmwplmj3bfls" path="res://scenes/globals/game_state/inventory/inventory_item.gd" id="16_lvr2k"] +[ext_resource type="PackedScene" uid="uid://dv4f232y8w8dv" path="res://scenes/game_elements/props/decoration/water_rock/water_rock.tscn" id="17_3aosk"] + +[sub_resource type="Resource" id="Resource_g27r7"] +script = ExtResource("16_lvr2k") +type = 2 +metadata/_custom_type_script = "uid://bgmwplmj3bfls" + +[node name="TileomaticTest" type="Node2D" unique_id=78806229] + +[node name="BackgroundMusic" type="Node" parent="." unique_id=1126404391] +script = ExtResource("1_nyjlp") +stream = ExtResource("2_wmohk") +metadata/_custom_type_script = "uid://c8405c212rbn6" + +[node name="TileMapLayers" type="Node2D" parent="." unique_id=1846893098 node_paths=PackedStringArray("water", "foam", "floors", "bridge_shadows", "bridges", "elevation_shadows", "elevation")] +script = ExtResource("3_46qpo") +water = NodePath("Water") +foam = NodePath("Foam") +floors = [NodePath("Grass"), NodePath("Paths")] +bridge_shadows = NodePath("BridgeShadow") +bridges = [NodePath("Bridges"), NodePath("Bridges_Level1")] +elevation_shadows = NodePath("CliffShadows") +elevation = NodePath("Cliffs") + +[node name="Water" type="TileMapLayer" parent="TileMapLayers" unique_id=1934786228] +z_index = -1 +tile_map_data = PackedByteArray("AAADAAMAAAAAAAAAAAADAAQAAAAAAAAAAAADAAUAAAAAAAAAAAADAAYAAAAAAAAAAAADAAcAAAAAAAAAAAADAAgAAAAAAAAAAAADAAkAAAAAAAAAAAAFAAkAAAAAAAAAAAAGAAEAAAAAAAAAAAAGAAkAAAAAAAAAAAAHAAEAAAAAAAAAAAAIAAEAAAAAAAAAAAAJAAEAAAAAAAAAAAAKAAEAAAAAAAAAAAALAAEAAAAAAAAAAAAMAAEAAAAAAAAAAAANAAEAAAAAAAAAAAANAAkAAAAAAAAAAAAOAAEAAAAAAAAAAAAOAAkAAAAAAAAAAAAPAAEAAAAAAAAAAAAQAAEAAAAAAAAAAAAQAAkAAAAAAAAAAAARAAkAAAAAAAAAAAASAAkAAAAAAAAAAAAUAAEAAAAAAAAAAAAUAAkAAAAAAAAAAAAVAAEAAAAAAAAAAAAVAAkAAAAAAAAAAAAWAAEAAAAAAAAAAAAWAAkAAAAAAAAAAAAXAAEAAAAAAAAAAAAXAAkAAAAAAAAAAAAYAAEAAAAAAAAAAAAYAAkAAAAAAAAAAAAZAAEAAAAAAAAAAAAZAAkAAAAAAAAAAQAaAAEAAAAAAAAAAAAaAAkAAAAAAAAAAAAbAAEAAAAAAAAAAAAbAAkAAAAAAAAAAAAcAAkAAAAAAAAAAAAdAAkAAAAAAAAAAAAeAAkAAAAAAAAAAAAfAAkAAAAAAAAAAAAgAAEAAAAAAAAAAAAgAAkAAAAAAAAAAAAhAAEAAAAAAAAAAAAhAAkAAAAAAAAAAAAiAAEAAAAAAAAAAAAiAAIAAAAAAAAAAAAiAAMAAAAAAAAAAAAiAAQAAAAAAAAAAAAiAAUAAAAAAAAAAAAiAAYAAAAAAAAAAAAiAAcAAAAAAAAAAAAiAAgAAAAAAAAAAAAiAAkAAAAAAAAAAAAEAAkAAAAAAAAAAAACAAEAAAAAAAAAAAACAAIAAAAAAAAAAAACAAMAAAAAAAAAAAACAAQAAAAAAAAAAAACAAUAAAAAAAAAAAACAAYAAAAAAAAAAAACAAcAAAAAAAAAAAACAAgAAAAAAAAAAAACAAkAAAAAAAAAAAABAAEAAAAAAAAAAAABAAIAAAAAAAAAAAABAAMAAAAAAAAAAAABAAQAAAAAAAAAAAABAAUAAAAAAAAAAAABAAYAAAAAAAAAAAABAAcAAAAAAAAAAAABAAgAAAAAAAAAAAABAAkAAAAAAAAAAAABAAoAAAAAAAAAAAABAAsAAAAAAAAAAAABAAwAAAAAAAAAAAABAA0AAAAAAAAAAAACAAoAAAAAAAAAAAACAAsAAAAAAAAAAAACAAwAAAAAAAAAAAACAA0AAAAAAAAAAAADAAoAAAAAAAAAAAADAAsAAAAAAAAAAAADAAwAAAAAAAAAAAADAA0AAAAAAAAAAAAEAAoAAAAAAAAAAAAEAAsAAAAAAAAAAAAEAAwAAAAAAAAAAAAEAA0AAAAAAAAAAAAFAAoAAAAAAAAAAAAFAAsAAAAAAAAAAAAFAAwAAAAAAAAAAAAFAA0AAAAAAAAAAAAGAAoAAAAAAAAAAAAGAAsAAAAAAAAAAAAGAAwAAAAAAAAAAAAGAA0AAAAAAAAAAAAKAAwAAAAAAAAAAQAKAA0AAAAAAAAAAgALAAwAAAAAAAAAAAALAA0AAAAAAAAAAAAMAA0AAAAAAAAAAAANAAoAAAAAAAAAAAANAAsAAAAAAAAAAAAOAAoAAAAAAAAAAAAOAAsAAAAAAAAAAAAQAAoAAAAAAAAAAAAQAAsAAAAAAAAAAAARAAoAAAAAAAAAAAARAAsAAAAAAAAAAAARAAwAAAAAAAAAAAASAAoAAAAAAAAAAAASAAsAAAAAAAAAAAASAAwAAAAAAAAAAAAUAAoAAAAAAAAAAAAUAAsAAAAAAAAAAAAUAAwAAAAAAAAAAAAVAAoAAAAAAAAAAAAVAAsAAAAAAAAAAAAVAAwAAAAAAAAAAAAWAAoAAAAAAAAAAAAWAAsAAAAAAAAAAAAWAAwAAAAAAAAAAAAXAAoAAAAAAAAAAAAXAAsAAAAAAAAAAAAXAAwAAAAAAAAAAAAYAAoAAAAAAAAAAAAYAAsAAAAAAAAAAAAYAAwAAAAAAAAAAAAZAAoAAAAAAAAAAQAZAAsAAAAAAAAAAgAZAAwAAAAAAAAAAAAaAAoAAAAAAAAAAAAaAAsAAAAAAAAAAAAaAAwAAAAAAAAAAAAbAAoAAAAAAAAAAAAbAAsAAAAAAAAAAAAbAAwAAAAAAAAAAAAcAAoAAAAAAAAAAAAcAAsAAAAAAAAAAAAcAAwAAAAAAAAAAAAcAA0AAAAAAAAAAAAdAAoAAAAAAAAAAAAdAAsAAAAAAAAAAAAdAAwAAAAAAAAAAAAdAA0AAAAAAAAAAAAeAAoAAAAAAAAAAAAeAAsAAAAAAAAAAAAeAAwAAAAAAAAAAAAeAA0AAAAAAAAAAAAfAAoAAAAAAAAAAAAfAAsAAAAAAAAAAAAfAAwAAAAAAAAAAAAfAA0AAAAAAAAAAAAgAAoAAAAAAAAAAAAgAAsAAAAAAAAAAAAgAAwAAAAAAAAAAAAgAA0AAAAAAAAAAAAhAAoAAAAAAAAAAAAhAAsAAAAAAAAAAAAhAAwAAAAAAAAAAAAhAA0AAAAAAAAAAAAiAAoAAAAAAAAAAAAiAAsAAAAAAAAAAAAiAAwAAAAAAAAAAAAiAA0AAAAAAAAAAAABAAAAAAAAAAAAAAABAA4AAAAAAAAAAAACAAAAAAAAAAAAAAACAA4AAAAAAAAAAAADAA4AAAAAAAAAAAAEAA4AAAAAAAAAAAAFAA4AAAAAAAAAAAAGAAAAAAAAAAAAAAAGAA4AAAAAAAAAAAAKAA4AAAAAAAAAAAALAAAAAAAAAAAAAAALAA4AAAAAAAAAAAAMAAAAAAAAAAAAAAAMAA4AAAAAAAAAAAANAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAVAAAAAAAAAAAAAAAWAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAaAAAAAAAAAAAAAAAbAAAAAAAAAAAAAAAcAAAAAAAAAAAAAQAcAA4AAAAAAAAAAAAdAA4AAAAAAAAAAAAeAA4AAAAAAAAAAAAfAA4AAAAAAAAAAAAgAAAAAAAAAAAAAAAgAA4AAAAAAAAAAAAhAAAAAAAAAAAAAAAhAA4AAAAAAAAAAAAiAAAAAAAAAAAAAAAiAA4AAAAAAAAAAAAjAAAAAAAAAAAAAAAjAAEAAAAAAAAAAAAjAAIAAAAAAAAAAAAjAAMAAAAAAAAAAAAjAAQAAAAAAAAAAAAjAAUAAAAAAAAAAAAjAAYAAAAAAAAAAAAjAAcAAAAAAAAAAAAjAAgAAAAAAAAAAAAjAAkAAAAAAAAAAAAjAAoAAAAAAAAAAAAjAAsAAAAAAAAAAAAjAAwAAAAAAAAAAAAjAA0AAAAAAAAAAAD+//7/AAAAAAAAAAD+////AAAAAAAAAAD+/wAAAAAAAAAAAAD+/wEAAAAAAAAAAAD+/wIAAAAAAAAAAAD+/wMAAAAAAAAAAAD+/wQAAAAAAAAAAAD+/wUAAAAAAAAAAAD+/wYAAAAAAAAAAAD+/wcAAAAAAAAAAAD+/wgAAAAAAAAAAAD+/wkAAAAAAAAAAAD+/woAAAAAAAAAAAD+/wsAAAAAAAAAAAD+/wwAAAAAAAAAAAD+/w0AAAAAAAAAAAD+/w4AAAAAAAAAAAD///7/AAAAAAAAAAD/////AAAAAAAAAAD//wAAAAAAAAAAAAD//wEAAAAAAAAAAAD//wIAAAAAAAAAAAD//wMAAAAAAAAAAAD//wQAAAAAAAAAAAD//wUAAAAAAAAAAAD//wYAAAAAAAAAAAD//wcAAAAAAAAAAAD//wgAAAAAAAAAAAD//wkAAAAAAAAAAAD//woAAAAAAAAAAAD//wsAAAAAAAAAAAD//wwAAAAAAAAAAAD//w0AAAAAAAAAAAD//w4AAAAAAAAAAAAAAP7/AAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAA0AAAAAAAAAAAAAAA4AAAAAAAAAAAABAP7/AAAAAAAAAAABAP//AAAAAAAAAAAGAP7/AAAAAAAAAAAHAAkAAAAAAAAAAAAHAAoAAAAAAAAAAAAHAAsAAAAAAAAAAAAHAAwAAAAAAAAAAAAHAA0AAAAAAAAAAAAHAA4AAAAAAAAAAAAIAAwAAAAAAAAAAAAIAA0AAAAAAAAAAAAIAA4AAAAAAAAAAAAJAAwAAAAAAAAAAAAJAA0AAAAAAAAAAAAJAA4AAAAAAAAAAAALAP7/AAAAAAAAAAALAP//AAAAAAAAAAAMAP7/AAAAAAAAAAAMAP//AAAAAAAAAAANAP7/AAAAAAAAAAANAP//AAAAAAAAAAATAAkAAAAAAAAAAAATAAoAAAAAAAAAAAATAAsAAAAAAAAAAAATAAwAAAAAAAAAAAAWAP7/AAAAAAAAAAAWAP//AAAAAAAAAQAXAP7/AAAAAAAAAAAXAP//AAAAAAAAAQAYAP7/AAAAAAAAAAAYAP//AAAAAAAAAQAZAP7/AAAAAAAAAAAZAP//AAAAAAAAAQAaAP7/AAAAAAAAAAAaAP//AAAAAAAAAQAgAP7/AAAAAAAAAAAgAP//AAAAAAAAAAAhAP7/AAAAAAAAAAAhAP//AAAAAAAAAAAiAP7/AAAAAAAAAAAiAP//AAAAAAAAAAAjAP7/AAAAAAAAAAAjAP//AAAAAAAAAAD+//n/AAAAAAAAAAD+//r/AAAAAAAAAAD+//v/AAAAAAAAAAD+//z/AAAAAAAAAAD+//3/AAAAAAAAAAD///n/AAAAAAAAAAD///r/AAAAAAAAAAD///v/AAAAAAAAAAD///z/AAAAAAAAAAD///3/AAAAAAAAAAAAAPn/AAAAAAAAAAAAAPr/AAAAAAAAAAAAAPv/AAAAAAAAAAAAAPz/AAAAAAAAAAAAAP3/AAAAAAAAAAABAPn/AAAAAAAAAAABAPr/AAAAAAAAAAABAPv/AAAAAAAAAAABAPz/AAAAAAAAAAABAP3/AAAAAAAAAAAEAPr/AAAAAAAAAAAEAPv/AAAAAAAAAQAFAPr/AAAAAAAAAAAFAPv/AAAAAAAAAQAFAP3/AAAAAAAAAQAGAPr/AAAAAAAAAAAGAPv/AAAAAAAAAQAGAP3/AAAAAAAAAAAHAPn/AAAAAAAAAAAHAPr/AAAAAAAAAAAHAPv/AAAAAAAAAAAIAPr/AAAAAAAAAAAIAPv/AAAAAAAAAQAJAPr/AAAAAAAAAQAJAPv/AAAAAAAAAgAKAPr/AAAAAAAAAAAKAPv/AAAAAAAAAQALAPn/AAAAAAAAAAALAPr/AAAAAAAAAAALAPv/AAAAAAAAAQALAPz/AAAAAAAAAAALAP3/AAAAAAAAAAAMAPr/AAAAAAAAAAAMAPv/AAAAAAAAAQAMAPz/AAAAAAAAAAAMAP3/AAAAAAAAAAANAPr/AAAAAAAAAAANAPv/AAAAAAAAAQANAPz/AAAAAAAAAAANAP3/AAAAAAAAAAAOAPr/AAAAAAAAAAAPAPn/AAAAAAAAAAAPAPr/AAAAAAAAAAAQAPn/AAAAAAAAAAAQAPr/AAAAAAAAAAARAPv/AAAAAAAAAAASAPn/AAAAAAAAAAASAPr/AAAAAAAAAAASAPv/AAAAAAAAAAATAPn/AAAAAAAAAAATAPr/AAAAAAAAAAATAPv/AAAAAAAAAAAUAPn/AAAAAAAAAAAUAPr/AAAAAAAAAAAUAPv/AAAAAAAAAAAVAPn/AAAAAAAAAAAVAPr/AAAAAAAAAAAVAPv/AAAAAAAAAAAWAPn/AAAAAAAAAAAWAPr/AAAAAAAAAAAWAPv/AAAAAAAAAAAWAPz/AAAAAAAAAAAWAP3/AAAAAAAAAAAXAPn/AAAAAAAAAAAXAPr/AAAAAAAAAAAXAPv/AAAAAAAAAAAXAPz/AAAAAAAAAAAXAP3/AAAAAAAAAAAYAPn/AAAAAAAAAAAYAPr/AAAAAAAAAAAYAPv/AAAAAAAAAAAYAPz/AAAAAAAAAAAYAP3/AAAAAAAAAAAZAPn/AAAAAAAAAAAZAPr/AAAAAAAAAAAZAPv/AAAAAAAAAAAZAPz/AAAAAAAAAAAZAP3/AAAAAAAAAAAaAPn/AAAAAAAAAAAaAPr/AAAAAAAAAAAaAPv/AAAAAAAAAAAaAPz/AAAAAAAAAQAaAP3/AAAAAAAAAAAbAPn/AAAAAAAAAAAbAPr/AAAAAAAAAAAbAPv/AAAAAAAAAAAcAPn/AAAAAAAAAAAcAPr/AAAAAAAAAAAcAPv/AAAAAAAAAAAdAPn/AAAAAAAAAAAdAPr/AAAAAAAAAAAdAPv/AAAAAAAAAQAeAPn/AAAAAAAAAAAeAPr/AAAAAAAAAAAeAPv/AAAAAAAAAAAfAPn/AAAAAAAAAAAfAPr/AAAAAAAAAAAfAPv/AAAAAAAAAAAgAPn/AAAAAAAAAAAgAPr/AAAAAAAAAAAgAPv/AAAAAAAAAAAgAPz/AAAAAAAAAQAgAP3/AAAAAAAAAAAhAPn/AAAAAAAAAAAhAPr/AAAAAAAAAAAhAPv/AAAAAAAAAAAhAPz/AAAAAAAAAAAhAP3/AAAAAAAAAAAiAPn/AAAAAAAAAAAiAPr/AAAAAAAAAAAiAPv/AAAAAAAAAAAiAPz/AAAAAAAAAAAiAP3/AAAAAAAAAAAjAPn/AAAAAAAAAAAjAPr/AAAAAAAAAAAjAPv/AAAAAAAAAAAjAPz/AAAAAAAAAAAjAP3/AAAAAAAAAAAMAAkAAAAAAAAAAAAMAAoAAAAAAAAAAAAMAAsAAAAAAAAAAAAMAAwAAAAAAAAAAAARAAAAAAAAAAAAAAARAAEAAAAAAAAAAAASAAAAAAAAAAAAAQASAAEAAAAAAAAAAQATAAAAAAAAAAAAAAATAAEAAAAAAAAAAAAfAAAAAAAAAAAAAAAfAAEAAAAAAAAAAAAHAPz/AAAAAAAAAAAHAP3/AAAAAAAAAAAHAP7/AAAAAAAAAAAIAP3/AAAAAAAAAAAIAP7/AAAAAAAAAQATAAgAAAAAAAAAAAAUAAgAAAAAAAAAAAAVAAgAAAAAAAAAAAAXAAIAAAAAAAAAAAAXAAMAAAAAAAAAAAAYAAIAAAAAAAAAAAAYAAMAAAAAAAAAAAAZAAIAAAAAAAAAAAAZAAMAAAAAAAAAAAASAP3/AAAAAAAAAAAUAP3/AAAAAAAAAAAFAAMAAAAAAAAAAAAFAAQAAAAAAAAAAAAFAAUAAAAAAAAAAAAFAAYAAAAAAAAAAAAFAAcAAAAAAAAAAAAGAAMAAAAAAAAAAAAGAAQAAAAAAAAAAAAGAAUAAAAAAAAAAAAGAAYAAAAAAAAAAAAGAAcAAAAAAAAAAAAOAPv/AAAAAAAAAQAPAPv/AAAAAAAAAQAQAPv/AAAAAAAAAQD+//X/AAAAAAAAAAD+//b/AAAAAAAAAAD+//f/AAAAAAAAAAD+//j/AAAAAAAAAAD///X/AAAAAAAAAAD///b/AAAAAAAAAAD///f/AAAAAAAAAAD///j/AAAAAAAAAAAAAPX/AAAAAAAAAAAAAPb/AAAAAAAAAAAAAPf/AAAAAAAAAAAAAPj/AAAAAAAAAAABAPX/AAAAAAAAAAABAPb/AAAAAAAAAAABAPf/AAAAAAAAAAABAPj/AAAAAAAAAAACAPX/AAAAAAAAAAACAPb/AAAAAAAAAQADAPX/AAAAAAAAAAADAPb/AAAAAAAAAQAEAPX/AAAAAAAAAAAEAPb/AAAAAAAAAQAFAPX/AAAAAAAAAAAFAPb/AAAAAAAAAQAGAPX/AAAAAAAAAAAGAPb/AAAAAAAAAQAHAPX/AAAAAAAAAAAHAPb/AAAAAAAAAAAHAPf/AAAAAAAAAAAHAPj/AAAAAAAAAQAIAPX/AAAAAAAAAAAIAPb/AAAAAAAAAAAIAPf/AAAAAAAAAQAJAPX/AAAAAAAAAAAJAPb/AAAAAAAAAAAJAPf/AAAAAAAAAQAKAPX/AAAAAAAAAAAKAPb/AAAAAAAAAAAKAPf/AAAAAAAAAQALAPX/AAAAAAAAAAALAPb/AAAAAAAAAAALAPf/AAAAAAAAAAALAPj/AAAAAAAAAQAMAPX/AAAAAAAAAAAMAPb/AAAAAAAAAAAMAPf/AAAAAAAAAAAMAPj/AAAAAAAAAQANAPX/AAAAAAAAAAANAPb/AAAAAAAAAAANAPf/AAAAAAAAAAANAPj/AAAAAAAAAQAOAPX/AAAAAAAAAAAOAPb/AAAAAAAAAAAOAPf/AAAAAAAAAAAOAPj/AAAAAAAAAQAPAPX/AAAAAAAAAAAPAPb/AAAAAAAAAAAPAPf/AAAAAAAAAAAPAPj/AAAAAAAAAQAQAPX/AAAAAAAAAAAQAPb/AAAAAAAAAAAQAPf/AAAAAAAAAAAQAPj/AAAAAAAAAQARAPX/AAAAAAAAAAARAPb/AAAAAAAAAAARAPf/AAAAAAAAAQASAPX/AAAAAAAAAAASAPb/AAAAAAAAAAASAPf/AAAAAAAAAQASAPj/AAAAAAAAAAATAPX/AAAAAAAAAAATAPb/AAAAAAAAAAATAPf/AAAAAAAAAQAUAPX/AAAAAAAAAAAUAPb/AAAAAAAAAAAUAPf/AAAAAAAAAAAUAPj/AAAAAAAAAAAVAPX/AAAAAAAAAAAVAPb/AAAAAAAAAAAVAPf/AAAAAAAAAAAVAPj/AAAAAAAAAAAWAPX/AAAAAAAAAAAWAPb/AAAAAAAAAAAWAPf/AAAAAAAAAAAWAPj/AAAAAAAAAAAXAPX/AAAAAAAAAAAXAPb/AAAAAAAAAAAXAPf/AAAAAAAAAAAXAPj/AAAAAAAAAAAYAPX/AAAAAAAAAAAYAPb/AAAAAAAAAAAYAPf/AAAAAAAAAAAYAPj/AAAAAAAAAAAZAPX/AAAAAAAAAAAZAPb/AAAAAAAAAAAZAPf/AAAAAAAAAAAZAPj/AAAAAAAAAAAaAPX/AAAAAAAAAAAaAPb/AAAAAAAAAAAaAPf/AAAAAAAAAAAaAPj/AAAAAAAAAAAbAPX/AAAAAAAAAAAbAPb/AAAAAAAAAAAbAPf/AAAAAAAAAAAbAPj/AAAAAAAAAAAcAPX/AAAAAAAAAAAcAPb/AAAAAAAAAAAcAPf/AAAAAAAAAAAcAPj/AAAAAAAAAAAdAPX/AAAAAAAAAAAdAPb/AAAAAAAAAAAdAPf/AAAAAAAAAAAdAPj/AAAAAAAAAAAeAPX/AAAAAAAAAAAeAPb/AAAAAAAAAAAeAPf/AAAAAAAAAAAeAPj/AAAAAAAAAAAfAPX/AAAAAAAAAAAfAPb/AAAAAAAAAAAfAPf/AAAAAAAAAAAfAPj/AAAAAAAAAAAgAPX/AAAAAAAAAAAgAPb/AAAAAAAAAAAgAPf/AAAAAAAAAAAgAPj/AAAAAAAAAAAhAPX/AAAAAAAAAAAhAPb/AAAAAAAAAAAhAPf/AAAAAAAAAAAhAPj/AAAAAAAAAAAiAPX/AAAAAAAAAAAiAPb/AAAAAAAAAAAiAPf/AAAAAAAAAAAiAPj/AAAAAAAAAAAjAPX/AAAAAAAAAAAjAPb/AAAAAAAAAAAjAPf/AAAAAAAAAAAjAPj/AAAAAAAAAAD+//T/AAAAAAAAAAD///T/AAAAAAAAAAAAAPT/AAAAAAAAAAABAPT/AAAAAAAAAAACAPT/AAAAAAAAAAADAPT/AAAAAAAAAAAEAPT/AAAAAAAAAAAFAPT/AAAAAAAAAAAGAPT/AAAAAAAAAAAHAPT/AAAAAAAAAAAHAP//AAAAAAAAAQAIAPT/AAAAAAAAAAAJAPT/AAAAAAAAAAAKAPT/AAAAAAAAAAALAPT/AAAAAAAAAAAMAPT/AAAAAAAAAAANAPT/AAAAAAAAAAAOAPT/AAAAAAAAAAAPAPT/AAAAAAAAAAAQAPT/AAAAAAAAAAARAPT/AAAAAAAAAAASAPT/AAAAAAAAAAATAPT/AAAAAAAAAAAUAPT/AAAAAAAAAAAVAPT/AAAAAAAAAAAWAPT/AAAAAAAAAAAXAPT/AAAAAAAAAAAYAPT/AAAAAAAAAAAZAPT/AAAAAAAAAAAaAPT/AAAAAAAAAAAbAPT/AAAAAAAAAAAcAPT/AAAAAAAAAAAdAPT/AAAAAAAAAAAeAPT/AAAAAAAAAAAfAPT/AAAAAAAAAAAgAPT/AAAAAAAAAAAhAPT/AAAAAAAAAAAiAPT/AAAAAAAAAAAjAPT/AAAAAAAAAAACAP//AAAAAAAAAAAGAP//AAAAAAAAAAAOAAcAAAAAAAAAAAAOAAgAAAAAAAAAAAAQAAcAAAAAAAAAAAAQAAgAAAAAAAAAAAARAAcAAAAAAAAAAAARAAgAAAAAAAAAAAANAAwAAAAAAAAAAAANAA0AAAAAAAAAAAANAA4AAAAAAAAAAAAOAAwAAAAAAAAAAAAOAA0AAAAAAAAAAAAOAA4AAAAAAAAAAAAPAAcAAAAAAAAAAAAPAAgAAAAAAAAAAAAPAAkAAAAAAAAAAAAPAAoAAAAAAAAAAAAPAAsAAAAAAAAAAAAPAAwAAAAAAAAAAAAPAA0AAAAAAAAAAAAPAA4AAAAAAAAAAAAQAAwAAAAAAAAAAAAQAA0AAAAAAAAAAAAQAA4AAAAAAAAAAAARAA0AAAAAAAAAAAARAA4AAAAAAAAAAAASAA0AAAAAAAAAAAASAA4AAAAAAAAAAAATAA0AAAAAAAAAAAATAA4AAAAAAAAAAAAUAA0AAAAAAAAAAAAUAA4AAAAAAAAAAAAVAA0AAAAAAAAAAAAVAA4AAAAAAAAAAAAWAA0AAAAAAAAAAAAWAA4AAAAAAAAAAAAXAA0AAAAAAAAAAAAXAA4AAAAAAAAAAAAYAA0AAAAAAAAAAAAYAA4AAAAAAAAAAAAZAA0AAAAAAAAAAAAZAA4AAAAAAAAAAAAaAA0AAAAAAAAAAAAaAA4AAAAAAAAAAAAbAA0AAAAAAAAAAAAbAA4AAAAAAAAAAAAjAA4AAAAAAAAAAAA=") +tile_set = ExtResource("4_r34th") +metadata/_edit_lock_ = true + +[node name="Foam" type="TileMapLayer" parent="TileMapLayers" unique_id=170161388] +tile_map_data = PackedByteArray("AAAHAAAAAgAAAAAAAAAIAP//AgAAAAAAAAAIAAAAAgAAAAAAAAAJAPz/AgAAAAAAAAAJAP3/AgAAAAAAAAAJAP7/AgAAAAAAAAAJAAAAAgAAAAAAAAAKAPz/AgAAAAAAAAAKAP3/AgAAAAAAAAAKAP7/AgAAAAAAAAAKAP//AgAAAAAAAAAKAAAAAgAAAAAAAAAOAPz/AgAAAAAAAAAOAP3/AgAAAAAAAAAOAP7/AgAAAAAAAAAPAPz/AgAAAAAAAAAPAP//AgAAAAAAAAAQAPz/AgAAAAAAAAAEAAMAAgAAAAAAAAAEAAQAAgAAAAAAAAAEAAUAAgAAAAAAAAAEAAYAAgAAAAAAAAAEAAcAAgAAAAAAAAAEAAgAAgAAAAAAAAAFAAIAAgAAAAAAAAAFAAgAAgAAAAAAAAAGAAIAAgAAAAAAAAAGAAgAAgAAAAAAAAAHAAIAAgAAAAAAAAAHAAMAAgAAAAAAAAAHAAQAAgAAAAAAAAAHAAUAAgAAAAAAAAAHAAYAAgAAAAAAAAAHAAcAAgAAAAAAAAAHAAgAAgAAAAAAAAAIAAIAAgAAAAAAAAAJAAIAAgAAAAAAAAAKAAIAAgAAAAAAAAALAAIAAgAAAAAAAAAMAAIAAgAAAAAAAAAMAAgAAgAAAAAAAAANAAIAAgAAAAAAAAANAAgAAgAAAAAAAAAOAP//AgAAAAAAAAAOAAIAAgAAAAAAAAAPAAIAAgAAAAAAAAAQAP//AgAAAAAAAAAQAAIAAgAAAAAAAAARAPz/AgAAAAAAAAARAP3/AgAAAAAAAAARAP//AgAAAAAAAAARAAIAAgAAAAAAAAASAPz/AgAAAAAAAAASAP7/AgAAAAAAAAASAP//AgAAAAAAAAASAAIAAgAAAAAAAAASAAgAAgAAAAAAAAATAPz/AgAAAAAAAAATAP3/AgAAAAAAAAATAP//AgAAAAAAAAATAAIAAgAAAAAAAAATAAcAAgAAAAAAAAAUAPz/AgAAAAAAAAAUAP7/AgAAAAAAAAAUAP//AgAAAAAAAAAUAAIAAgAAAAAAAAAUAAcAAgAAAAAAAAAVAPz/AgAAAAAAAAAVAP3/AgAAAAAAAAAVAP7/AgAAAAAAAAAVAP//AgAAAAAAAAAVAAIAAgAAAAAAAAAVAAcAAgAAAAAAAAAWAAIAAgAAAAAAAAAWAAMAAgAAAAAAAAAWAAgAAgAAAAAAAAAXAAQAAgAAAAAAAAAXAAgAAgAAAAAAAAAYAAQAAgAAAAAAAAAYAAgAAgAAAAAAAAAZAAQAAgAAAAAAAAAZAAgAAgAAAAAAAAAaAAIAAgAAAAAAAAAaAAMAAgAAAAAAAAAaAAgAAgAAAAAAAAAbAPz/AgAAAAAAAAAbAP3/AgAAAAAAAAAbAP7/AgAAAAAAAAAbAP//AgAAAAAAAAAbAAIAAgAAAAAAAAAbAAgAAgAAAAAAAAAcAPz/AgAAAAAAAAAcAP//AgAAAAAAAAAcAAgAAgAAAAAAAAAdAPz/AgAAAAAAAAAdAAgAAgAAAAAAAAAeAPz/AgAAAAAAAAAeAAgAAgAAAAAAAAAfAPz/AgAAAAAAAAAfAP3/AgAAAAAAAAAfAP7/AgAAAAAAAAAfAP//AgAAAAAAAAAfAAIAAgAAAAAAAAAfAAgAAgAAAAAAAAAgAAIAAgAAAAAAAAAgAAgAAgAAAAAAAAAhAAIAAgAAAAAAAAAhAAMAAgAAAAAAAAAhAAQAAgAAAAAAAAAhAAUAAgAAAAAAAAAhAAYAAgAAAAAAAAAhAAcAAgAAAAAAAAAhAAgAAgAAAAAAAAAIAAkAAgAAAAAAAAAIAAoAAgAAAAAAAAAIAAsAAgAAAAAAAAAJAAsAAgAAAAAAAAAKAAsAAgAAAAAAAAALAAkAAgAAAAAAAAALAAoAAgAAAAAAAAALAAsAAgAAAAAAAAAcAAEAAgAAAAAAAAAdAAAAAgAAAAAAAAAeAAAAAgAAAAAAAAAeAAEAAgAAAAAAAAAIAPj/AgAAAAAAAAAIAPn/AgAAAAAAAAAIAPz/AgAAAAAAAAAJAPj/AgAAAAAAAAAJAPn/AgAAAAAAAAAKAPj/AgAAAAAAAAAKAPn/AgAAAAAAAAACAPf/AgAAAAAAAAACAPj/AgAAAAAAAAACAPn/AgAAAAAAAAACAPr/AgAAAAAAAAACAPv/AgAAAAAAAAACAPz/AgAAAAAAAAACAP3/AgAAAAAAAAACAP7/AgAAAAAAAAADAPf/AgAAAAAAAAADAPr/AgAAAAAAAAADAPv/AgAAAAAAAAADAAAAAgAAAAAAAAADAAEAAgAAAAAAAAADAAIAAgAAAAAAAAAEAPf/AgAAAAAAAAAEAPn/AgAAAAAAAAAEAPz/AgAAAAAAAAAEAP3/AgAAAAAAAAAFAPf/AgAAAAAAAAAFAPn/AgAAAAAAAAAFAPz/AgAAAAAAAAAFAP7/AgAAAAAAAAAFAAAAAgAAAAAAAAAFAAEAAgAAAAAAAAAGAPf/AgAAAAAAAAAGAPj/AgAAAAAAAAAGAPn/AgAAAAAAAAAGAPz/AgAAAAAAAAAMAPn/AgAAAAAAAAANAPn/AgAAAAAAAAAOAPn/AgAAAAAAAAARAPj/AgAAAAAAAAARAPn/AgAAAAAAAAARAPr/AgAAAAAAAAATAPj/AgAAAAAAAAADAP//AgAAAAAAAAAFAP//AgAAAAAAAAANAAcAAgAAAAAAAAAOAAYAAgAAAAAAAAAQAAYAAgAAAAAAAAARAAYAAgAAAAAAAAASAAcAAgAAAAAAAAAPAAYAAgAAAAAAAAA=") +tile_set = ExtResource("5_m665c") +metadata/_edit_lock_ = true + +[node name="Grass" type="TileMapLayer" parent="TileMapLayers" unique_id=1795357034] +tile_map_data = PackedByteArray("AAAhAAgAAQACAAIAAAAhAAcAAQACAAEAAAAhAAYAAQACAAEAAAAhAAUAAQACAAEAAAAhAAQAAQACAAEAAAAhAAMAAQACAAEAAAAhAAIAAQACAAAAAAAgAAgAAQABAAIAAAAgAAcAAQABAAEAAAAgAAYAAQABAAEAAAAgAAUAAQABAAEAAAAgAAQAAQABAAEAAAAgAAIAAQABAAAAAAAfAAgAAQABAAIAAAAfAAcAAQABAAEAAAAfAAYAAQABAAEAAAAfAAUAAQABAAEAAAAfAAQAAQABAAEAAAAfAAMAAQABAAEAAAAfAAIAAQABAAAAAAAeAAgAAQABAAIAAAAeAAcAAQABAAEAAAAeAAYAAQABAAEAAAAeAAUAAQABAAEAAAAeAAQAAQABAAEAAAAeAAMAAQABAAEAAAAeAAIAAQABAAAAAAAdAAgAAQABAAIAAAAdAAcAAQABAAEAAAAdAAYAAQABAAEAAAAdAAUAAQABAAEAAAAdAAQAAQABAAEAAAAdAAMAAQABAAEAAAAdAAIAAQABAAAAAAAcAAgAAQABAAIAAAAcAAcAAQABAAEAAAAcAAYAAQABAAEAAAAcAAUAAQABAAEAAAAcAAQAAQABAAEAAAAcAAMAAQABAAEAAAAcAAIAAQABAAAAAAAbAAgAAQABAAIAAAAbAAcAAQABAAEAAAAbAAYAAQABAAEAAAAbAAUAAQABAAEAAAAbAAQAAQABAAEAAAAbAAMAAQABAAEAAAAbAAIAAQABAAAAAAAaAAgAAQABAAIAAAAaAAcAAQABAAEAAAAaAAYAAQABAAEAAAAaAAUAAQABAAEAAAAaAAQAAQABAAEAAAAaAAMAAQAAAAEAAAAaAAIAAQAAAAAAAAAZAAgAAQABAAIAAAAZAAcAAQABAAEAAAAZAAYAAQABAAEAAAAZAAUAAQABAAEAAAAZAAQAAQABAAAAAAAYAAgAAQABAAIAAAAYAAcAAQABAAEAAAAYAAYAAQABAAEAAAAYAAUAAQABAAEAAAAYAAQAAQABAAAAAAAXAAgAAQABAAIAAAAXAAcAAQABAAEAAAAXAAYAAQABAAEAAAAXAAUAAQABAAEAAAAXAAQAAQABAAAAAAAWAAgAAQAAAAIAAAAWAAcAAQABAAEAAAAWAAYAAQABAAEAAAAWAAUAAQABAAEAAAAWAAQAAQABAAEAAAAWAAMAAQACAAEAAAAWAAIAAQACAAAAAAAVAAcAAQABAAIAAAAVAAYAAQABAAEAAAAVAAUAAQABAAEAAAAVAAQAAQABAAEAAAAVAAMAAQABAAEAAAAVAAIAAQABAAAAAAAUAAcAAQABAAIAAAAUAAYAAQABAAEAAAAUAAUAAQABAAEAAAAUAAQAAQABAAEAAAAUAAMAAQABAAEAAAAUAAIAAQABAAAAAAATAAcAAQABAAIAAAATAAYAAQABAAEAAAATAAUAAQABAAEAAAATAAQAAQABAAEAAAATAAMAAQABAAEAAAATAAIAAQABAAAAAAASAAgAAQADAAIAAAASAAcAAQAAAAEAAAASAAYAAQABAAEAAAASAAUAAQABAAEAAAASAAQAAQABAAEAAAASAAMAAQABAAEAAAASAAIAAQABAAAAAAARAAYAAQABAAIAAAARAAUAAQABAAEAAAARAAQAAQABAAEAAAARAAMAAQABAAEAAAARAAIAAQABAAAAAAAQAAYAAQABAAIAAAAQAAUAAQABAAEAAAAQAAQAAQABAAEAAAAQAAMAAQABAAEAAAAQAAIAAQABAAAAAAAPAAYAAQABAAIAAAAPAAUAAQABAAEAAAAPAAQAAQABAAEAAAAPAAMAAQABAAEAAAAPAAIAAQABAAAAAAAOAAYAAQABAAIAAAAOAAUAAQABAAEAAAAOAAQAAQABAAEAAAAOAAMAAQABAAEAAAAOAAIAAQABAAAAAAANAAgAAQACAAIAAAANAAcAAQACAAEAAAANAAYAAQABAAEAAAANAAUAAQABAAEAAAANAAQAAQABAAEAAAANAAMAAQABAAEAAAANAAIAAQABAAAAAAAMAAgAAQABAAIAAAAMAAcAAQABAAEAAAAMAAYAAQABAAEAAAAMAAUAAQABAAEAAAAMAAQAAQABAAEAAAAMAAMAAQABAAEAAAAMAAIAAQABAAAAAAALAAgAAQABAAEAAAALAAcAAQABAAEAAAALAAYAAQABAAEAAAALAAUAAQABAAEAAAALAAQAAQABAAEAAAALAAMAAQABAAEAAAALAAIAAQABAAAAAAAKAAgAAQABAAEAAAAKAAcAAQABAAEAAAAKAAYAAQABAAEAAAAKAAUAAQABAAEAAAAKAAQAAQABAAEAAAAKAAMAAQABAAEAAAAKAAIAAQABAAAAAAAJAAgAAQABAAEAAAAJAAcAAQABAAEAAAAJAAYAAQABAAEAAAAJAAUAAQABAAEAAAAJAAQAAQABAAEAAAAJAAMAAQABAAEAAAAJAAIAAQABAAAAAAAIAAYAAQABAAEAAAAIAAUAAQABAAEAAAAIAAQAAQABAAEAAAAHAAYAAQAAAAEAAAAHAAUAAQAAAAEAAAAHAAQAAQAAAAEAAAAEAAYAAQADAAEAAAAEAAUAAQADAAEAAAAIAAMAAQABAAEAAAAIAAIAAQABAAAAAAAHAAMAAQAAAAEAAAAHAAIAAQABAAAAAAAgAAMAAQABAAEAAAAIAAgAAQABAAEAAAAIAAcAAQABAAEAAAAHAAgAAQABAAIAAAAHAAcAAQAAAAEAAAAGAAgAAQABAAMAAAAFAAgAAQABAAMAAAAEAAgAAQAAAAIAAAAEAAcAAQADAAEAAAAGAAIAAQABAAMAAAAFAAIAAQABAAIAAAAEAAQAAQADAAEAAAAEAAMAAQADAAEAAAAEAAIAAQABAAEAAAAVAP//AQACAAIAAAAVAP7/AQACAAEAAAAVAP3/AQADAAEAAAAVAPz/AQACAAAAAAAUAP//AQABAAIAAAAUAP7/AQABAAAAAAAUAPz/AQABAAMAAAATAP//AQABAAIAAAATAP7/AQABAAAAAAATAPz/AQABAAMAAAASAP//AQABAAIAAAASAP7/AQABAAAAAAASAPz/AQABAAMAAAARAP//AQABAAIAAAARAP7/AQABAAEAAAARAP3/AQACAAEAAAARAPz/AQABAAAAAAAQAP//AQABAAIAAAAQAP7/AQABAAEAAAAQAP3/AQABAAEAAAAQAPz/AQABAAAAAAAPAP//AQABAAIAAAAPAP7/AQABAAEAAAAPAP3/AQABAAEAAAAPAPz/AQABAAAAAAAOAP//AQAAAAIAAAAOAP7/AQAAAAEAAAAOAP3/AQAAAAEAAAAOAPz/AQAAAAAAAAAfAP//AQACAAIAAAAfAP7/AQACAAEAAAAfAP3/AQACAAEAAAAfAPz/AQACAAAAAAAeAP//AQABAAIAAAAeAP7/AQABAAEAAAAeAP3/AQABAAEAAAAeAPz/AQABAAAAAAAdAP//AQABAAIAAAAdAP7/AQABAAEAAAAdAP3/AQABAAEAAAAdAPz/AQABAAAAAAAcAP//AQABAAIAAAAcAP7/AQABAAEAAAAcAP3/AQABAAEAAAAcAPz/AQABAAAAAAAbAP//AQAAAAIAAAAbAP7/AQAAAAEAAAAbAP3/AQAAAAEAAAAbAPz/AQAAAAAAAAALAAsAAQACAAIAAAALAAoAAQACAAEAAAALAAkAAQACAAEAAAAKAAsAAQABAAIAAAAKAAoAAQABAAEAAAAKAAkAAQABAAEAAAAJAAsAAQABAAIAAAAJAAoAAQABAAEAAAAJAAkAAQABAAEAAAAIAAsAAQAAAAIAAAAIAAoAAQAAAAEAAAAIAAkAAQAAAAEAAAAFAAEAAQACAAEAAAAFAAAAAQACAAEAAAAFAP//AQACAAAAAAAEAAEAAQABAAEAAAAEAAAAAQABAAEAAAAEAP//AQABAAAAAAADAAIAAQAAAAIAAAADAAEAAQAAAAEAAAADAAAAAQAAAAEAAAADAP//AQAAAAAAAAA=") +tile_set = ExtResource("6_ooh1h") + +[node name="Paths" type="TileMapLayer" parent="TileMapLayers" unique_id=2017548496] +tile_map_data = PackedByteArray("AAAeAAUAAQALAAEAAAAdAAUAAQAGAAEAAAAcAAUAAQAGAAMAAAAbAAUAAQAGAAMAAAAaAAUAAQAGAAMAAAAZAAUAAQAGAAMAAAAYAAUAAQAGAAMAAAAXAAUAAQAGAAMAAAAWAAUAAQAGAAMAAAAVAAUAAQAGAAMAAAAUAAUAAQAGAAMAAAATAAUAAQAGAAMAAAASAAUAAQAGAAMAAAARAAUAAQAGAAMAAAAQAAUAAQAGAAMAAAAPAAUAAQAGAAMAAAAOAAUAAQAGAAMAAAANAAUAAQAGAAMAAAAMAAUAAQAGAAMAAAALAAUAAQAGAAMAAAAKAAUAAQAGAAMAAAAJAAUAAQAFAAMAAAAfAAYAAQAHAAIAAAAfAAUAAQAHAAEAAAAfAAQAAQAHAAAAAAAeAAYAAQAGAAIAAAAeAAQAAQAGAAAAAAAdAAYAAQAFAAIAAAAdAAQAAQAFAAAAAAATAP3/AQAIAAEAAAATAPz/AQAIAAAAAAATAP7/AQAIAAIAAAA=") +tile_set = ExtResource("6_ooh1h") + +[node name="Fences" type="TileMapLayer" parent="TileMapLayers" unique_id=1630992728] +tile_set = ExtResource("7_wsa58") + +[node name="BridgeShadow" type="TileMapLayer" parent="TileMapLayers" unique_id=672619778] +tile_map_data = PackedByteArray("AAAaAP//AwACAAMAAAAZAP//AwACAAMAAAAYAP//AwACAAMAAAAXAP//AwACAAMAAAAWAP//AwACAAMAAAALAPz/AwACAAMAAAAMAPz/AwACAAMAAAANAPz/AwACAAMAAAAQAPn/AwACAAMAAAAPAPn/AwACAAMAAAAKAPn/AwACAAMAAAALAPn/AwACAAMAAAAHAPn/AwACAAMAAAAIAPn/AwACAAMAAAASAPj/AwACAAMAAAAaAPz/AwACAAMAAAAgAPz/AwACAAMAAAA=") +tile_set = ExtResource("8_ir1lv") +metadata/_edit_lock_ = true + +[node name="Bridges" type="TileMapLayer" parent="TileMapLayers" unique_id=1986468518] +tile_map_data = PackedByteArray("AAASAAIAAwAAAAMAAAASAAEAAwAAAAIAAAASAAAAAwAAAAIAAAASAP//AwAAAAEAAAAZAAsAAwAAAAMAAAAZAAoAAwAAAAIAAAAZAAkAAwAAAAIAAAAZAAgAAwAAAAEAAAAbAP//AwACAAAAAAAaAP//AwABAAAAAAAZAP//AwABAAAAAAAYAP//AwABAAAAAAAXAP//AwABAAAAAAAWAP//AwABAAAAAAAVAP//AwAAAAAAAAAKAA0AAwAAAAMAAAAKAAwAAwAAAAIAAAAKAAsAAwAAAAEAAAAdAPr/AwAAAAEAAAAdAPv/AwAAAAIAAAAdAPz/AwAAAAMAAAAZAPz/AwAAAAAAAAAaAPz/AwABAAAAAAAbAPz/AwACAAAAAAAhAPz/AwACAAAAAAAgAPz/AwABAAAAAAAfAPz/AwAAAAAAAAA=") +tile_set = ExtResource("8_ir1lv") +metadata/height = 0 + +[node name="CliffShadows" type="TileMapLayer" parent="TileMapLayers" unique_id=1831008475] +tile_map_data = PackedByteArray("AAAHAAAAAAAAAAAAAAAIAP//AAAAAAAAAAAIAAAAAAAAAAAAAAAJAPz/AAAAAAAAAAAJAP3/AAAAAAAAAAAJAP7/AAAAAAAAAAAJAAAAAAAAAAAAAAAKAPz/AAAAAAAAAAAKAP3/AAAAAAAAAAAKAP7/AAAAAAAAAAAKAP//AAAAAAAAAAAKAAAAAAAAAAAAAAAOAPz/AAAAAAAAAAAOAP3/AAAAAAAAAAAOAP7/AAAAAAAAAAAPAPz/AAAAAAAAAAAQAPz/AAAAAAAAAAAQAP3/AAAAAAAAAAAQAP7/AAAAAAAAAAAcAAEAAAAAAAAAAAAcAAIAAAAAAAAAAAAcAAMAAAAAAAAAAAAdAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAEAAAAAAAAAAAAeAAIAAAAAAAAAAAAeAAMAAAAAAAAAAAAPAP7/AAAAAAAAAAAdAAMAAAAAAAAAAAAIAPj/AAAAAAAAAAAIAPn/AAAAAAAAAAAIAPz/AAAAAAAAAAAJAPj/AAAAAAAAAAAJAPn/AAAAAAAAAAAKAPj/AAAAAAAAAAAKAPn/AAAAAAAAAAACAPf/AAAAAAAAAAACAPj/AAAAAAAAAAACAPn/AAAAAAAAAAACAPr/AAAAAAAAAAACAPv/AAAAAAAAAAACAPz/AAAAAAAAAAACAP3/AAAAAAAAAAACAP7/AAAAAAAAAAADAPf/AAAAAAAAAAADAPr/AAAAAAAAAAADAPv/AAAAAAAAAAADAP//AAAAAAAAAAAEAPf/AAAAAAAAAAAEAPn/AAAAAAAAAAAEAPz/AAAAAAAAAAAEAP3/AAAAAAAAAAAEAP//AAAAAAAAAAAFAPf/AAAAAAAAAAAFAPn/AAAAAAAAAAAFAPz/AAAAAAAAAAAFAP7/AAAAAAAAAAAFAP//AAAAAAAAAAAGAPf/AAAAAAAAAAAGAPj/AAAAAAAAAAAGAPn/AAAAAAAAAAAGAPz/AAAAAAAAAAAMAPn/AAAAAAAAAAANAPn/AAAAAAAAAAAOAPn/AAAAAAAAAAARAPj/AAAAAAAAAAARAPn/AAAAAAAAAAARAPr/AAAAAAAAAAATAPj/AAAAAAAAAAA=") +tile_set = ExtResource("9_m23oo") +metadata/_edit_lock_ = true + +[node name="Cliffs" type="TileMapLayer" parent="TileMapLayers" unique_id=1942530617] +tile_map_data = PackedByteArray("AAAKAP//BAACAAIAAAAKAP7/BAACAAEAAAAKAP3/BAACAAEAAAAKAPz/BAACAAEAAAAKAPv/BAACAAAAAQAJAP//BAABAAIAAAAJAP7/BAABAAEAAAAJAP3/BAAAAAEAAAAJAPz/BAAAAAEAAAAJAPv/BAABAAAAAQAIAP//BAABAAIAAAAIAP7/BAAAAAAAAAAHAP//BAAAAAQAAAAQAP3/BAACAAIAAAAQAPz/BAACAAEAAAAQAPv/BAACAAAAAAAPAP3/BAABAAIAAQAPAPz/BAABAAEAAAAPAPv/BAABAAAAAAAOAP3/BAAAAAIAAAAOAPz/BAAAAAEAAAAOAPv/BAAAAAAAAQAPAP7/BAADAAcAAAAeAAIABAACAAIAAAAeAAEABAACAAEAAAAeAAAABAACAAEAAAAeAP//BAACAAAAAAAdAAIABAABAAIAAQAdAAEABAABAAEAAAAdAAAABAABAAEAAAAdAP//BAAAAAAAAAAcAAIABAAAAAIAAAAcAAEABAAAAAEAAAAcAAAABAAAAAAAAAAdAAMABAABAAcAAAAKAPj/BAACAAIAAQAKAPf/BAACAAAAAAAJAPj/BAABAAIAAQAJAPf/BAABAAAAAAAIAPj/BAAAAAIAAQAIAPf/BAAAAAAAAAAIAPv/BAAAAAQAAAAGAPj/BAACAAIAAQAFAP7/BAACAAIAAQAFAP3/BAACAAAAAAAFAPv/BAABAAQAAAAEAP7/BAABAAIAAQAEAP3/BAABAAEAAAAEAPz/BAACAAEAAAAEAPv/BAABAAAAAAAEAPj/BAABAAIAAAAEAPf/BAABAAEAAAAEAPb/BAABAAAAAAADAP7/BAAAAAIAAQADAP3/BAABAAEAAAADAPz/BAABAAEAAAADAPv/BAABAAEAAAADAPr/BAACAAEAAAADAPn/BAACAAEAAAADAPj/BAABAAEAAAADAPf/BAABAAEAAAADAPb/BAABAAAAAAACAP3/BAAAAAIAAAACAPz/BAAAAAEAAAACAPv/BAAAAAEAAAACAPr/BAAAAAEAAAACAPn/BAAAAAEAAAACAPj/BAAAAAEAAAACAPf/BAAAAAEAAAACAPb/BAAAAAAAAAAGAPv/BAACAAQAAAAOAPj/BAACAAQAAQANAPj/BAABAAQAAAAMAPj/BAAAAAQAAQARAPn/BAADAAIAAAARAPj/BAADAAEAAQARAPf/BAADAAAAAQAGAPf/BAACAAEAAAAGAPb/BAACAAAAAAAFAPj/BAABAAIAAAAFAPf/BAABAAEAAAAFAPb/BAABAAAAAAATAPf/BAADAAQAAQADAP//BAAAAAcAAAAEAP//BAABAAcAAAAFAP//BAACAAcAAAA=") +tile_set = ExtResource("10_t64ph") + +[node name="Bridges_Level1" type="TileMapLayer" parent="TileMapLayers" unique_id=1340428238] +tile_map_data = PackedByteArray("AAAKAPv/AwAAAAAAAAALAPv/AwABAAAAAAAMAPv/AwABAAAAAAANAPv/AwABAAAAAAAOAPv/AwACAAAAAAAJAPv/AwAAAAMAAAAJAPr/AwAAAAIAAAAJAPn/AwAAAAIAAAAJAPj/AwAAAAEAAAARAPj/AwACAAAAAAAQAPj/AwABAAAAAAAPAPj/AwABAAAAAAAOAPj/AwAAAAAAAAAKAPj/AwABAAAAAAALAPj/AwABAAAAAAAMAPj/AwACAAAAAAAGAPj/AwAAAAAAAAAHAPj/AwABAAAAAAAIAPj/AwABAAAAAAATAPf/AwACAAAAAAASAPf/AwABAAAAAAARAPf/AwAAAAAAAAA=") +tile_set = ExtResource("8_ir1lv") +metadata/height = 1 + +[node name="Void" type="TileMapLayer" parent="TileMapLayers" unique_id=2125320263] +texture_filter = 1 +material = ExtResource("11_ed2id") +tile_set = ExtResource("12_qsid1") + +[node name="OnTheGround" type="Node2D" parent="." unique_id=180784555] +y_sort_enabled = true + +[node name="Player" parent="OnTheGround" unique_id=296354958 instance=ExtResource("13_k62uw")] +position = Vector2(640, 360) +player_name = "StoryWeaver" +sprite_frames = ExtResource("14_y4k7c") + +[node name="Camera2D" type="Camera2D" parent="OnTheGround/Player" unique_id=2102827971] +limit_enabled = false +limit_left = 128 +limit_top = -128 +limit_right = 2240 +limit_bottom = 848 +editor_draw_limits = true + +[node name="CollectibleItem" parent="OnTheGround" unique_id=327991066 instance=ExtResource("15_xwn5o")] +position = Vector2(1945, 338) +item = SubResource("Resource_g27r7") +target = 1 + +[node name="InTheWater" type="Node2D" parent="." unique_id=2028481663] +z_index = -1 +y_sort_enabled = true + +[node name="WaterRock" parent="InTheWater" unique_id=200189883 instance=ExtResource("17_3aosk")] +position = Vector2(234, 607) diff --git a/tiles/elevation_2.tres b/tiles/elevation_2.tres index 38588d2818..ec167cd5fe 100644 --- a/tiles/elevation_2.tres +++ b/tiles/elevation_2.tres @@ -44,6 +44,7 @@ polygon = PackedVector2Array(-32, -0.385544, -26.6025, -16.9639, -19.1244, -25.2 [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_yc5yt"] texture = ExtResource("1_hkim0") texture_region_size = Vector2i(64, 64) +0:0/next_alternative_id = 2 0:0/0 = 0 0:0/0/y_sort_origin = 10 0:0/0/terrain_set = 0 @@ -53,6 +54,16 @@ texture_region_size = Vector2i(64, 64) 0:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 32, -32, 32) 0:0/0/terrains_peering_bit/right_side = 0 0:0/0/terrains_peering_bit/bottom_side = 0 +0:0/1 = 1 +0:0/1/y_sort_origin = 10 +0:0/1/terrain_set = 0 +0:0/1/terrain = 0 +0:0/1/probability = 0.0 +0:0/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_yc5yt") +0:0/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 32, -32, 32) +0:0/1/terrains_peering_bit/right_side = 0 +0:0/1/terrains_peering_bit/bottom_side = 0 +1:0/next_alternative_id = 2 1:0/0 = 0 1:0/0/y_sort_origin = 10 1:0/0/terrain_set = 0 @@ -63,6 +74,17 @@ texture_region_size = Vector2i(64, 64) 1:0/0/terrains_peering_bit/right_side = 0 1:0/0/terrains_peering_bit/bottom_side = 0 1:0/0/terrains_peering_bit/left_side = 0 +1:0/1 = 1 +1:0/1/y_sort_origin = 10 +1:0/1/terrain_set = 0 +1:0/1/terrain = 0 +1:0/1/probability = 0.0 +1:0/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_l50s2") +1:0/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 32, -32, 32) +1:0/1/terrains_peering_bit/right_side = 0 +1:0/1/terrains_peering_bit/bottom_side = 0 +1:0/1/terrains_peering_bit/left_side = 0 +2:0/next_alternative_id = 2 2:0/0 = 0 2:0/0/y_sort_origin = 10 2:0/0/terrain_set = 0 @@ -72,6 +94,16 @@ texture_region_size = Vector2i(64, 64) 2:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 32, -32, 32) 2:0/0/terrains_peering_bit/bottom_side = 0 2:0/0/terrains_peering_bit/left_side = 0 +2:0/1 = 1 +2:0/1/y_sort_origin = 10 +2:0/1/terrain_set = 0 +2:0/1/terrain = 0 +2:0/1/probability = 0.0 +2:0/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_hqjx3") +2:0/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 32, -32, 32) +2:0/1/terrains_peering_bit/bottom_side = 0 +2:0/1/terrains_peering_bit/left_side = 0 +3:0/next_alternative_id = 2 3:0/0 = 0 3:0/0/y_sort_origin = 10 3:0/0/terrain_set = 0 @@ -80,6 +112,15 @@ texture_region_size = Vector2i(64, 64) 3:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -16, 0, -32, 32, -16, 32, 32, 24, 32, 24, -8, 0, -24, -24, -8, -24, 32, -32, 32) 3:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 32, -32, 32) 3:0/0/terrains_peering_bit/bottom_side = 0 +3:0/1 = 1 +3:0/1/y_sort_origin = 10 +3:0/1/terrain_set = 0 +3:0/1/terrain = 0 +3:0/1/probability = 0.0 +3:0/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_rtvgy") +3:0/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 32, -32, 32) +3:0/1/terrains_peering_bit/bottom_side = 0 +0:1/next_alternative_id = 2 0:1/0 = 0 0:1/0/y_sort_origin = 26 0:1/0/terrain_set = 0 @@ -90,6 +131,16 @@ texture_region_size = Vector2i(64, 64) 0:1/0/terrains_peering_bit/right_side = 0 0:1/0/terrains_peering_bit/bottom_side = 0 0:1/0/terrains_peering_bit/top_side = 0 +0:1/1 = 1 +0:1/1/y_sort_origin = 26 +0:1/1/terrain_set = 0 +0:1/1/terrain = 0 +0:1/1/probability = 0.0 +0:1/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_jmclm") +0:1/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 32, -32, 32) +0:1/1/terrains_peering_bit/right_side = 0 +0:1/1/terrains_peering_bit/bottom_side = 0 +0:1/1/terrains_peering_bit/top_side = 0 1:1/0 = 0 1:1/0/y_sort_origin = 26 1:1/0/terrain_set = 0 @@ -100,6 +151,7 @@ texture_region_size = Vector2i(64, 64) 1:1/0/terrains_peering_bit/bottom_side = 0 1:1/0/terrains_peering_bit/left_side = 0 1:1/0/terrains_peering_bit/top_side = 0 +2:1/next_alternative_id = 2 2:1/0 = 0 2:1/0/y_sort_origin = 26 2:1/0/terrain_set = 0 @@ -110,6 +162,16 @@ texture_region_size = Vector2i(64, 64) 2:1/0/terrains_peering_bit/bottom_side = 0 2:1/0/terrains_peering_bit/left_side = 0 2:1/0/terrains_peering_bit/top_side = 0 +2:1/1 = 1 +2:1/1/y_sort_origin = 26 +2:1/1/terrain_set = 0 +2:1/1/terrain = 0 +2:1/1/probability = 0.0 +2:1/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_jmclm") +2:1/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 32, -32, 32) +2:1/1/terrains_peering_bit/bottom_side = 0 +2:1/1/terrains_peering_bit/left_side = 0 +2:1/1/terrains_peering_bit/top_side = 0 3:1/next_alternative_id = 3 3:1/0 = 0 3:1/0/y_sort_origin = 26 @@ -122,7 +184,16 @@ texture_region_size = Vector2i(64, 64) 3:1/0/terrains_peering_bit/bottom_side = 0 3:1/0/terrains_peering_bit/top_side = 0 3:1/1 = 1 +3:1/1/y_sort_origin = 26 +3:1/1/terrain_set = 0 +3:1/1/terrain = 0 +3:1/1/probability = 0.0 +3:1/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_jmclm") +3:1/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 32, -32, 32) +3:1/1/terrains_peering_bit/bottom_side = 0 +3:1/1/terrains_peering_bit/top_side = 0 0:2/size_in_atlas = Vector2i(1, 2) +0:2/next_alternative_id = 2 0:2/0 = 0 0:2/0/texture_origin = Vector2i(0, -32) 0:2/0/terrain_set = 0 @@ -132,6 +203,15 @@ texture_region_size = Vector2i(64, 64) 0:2/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 96, -32, 96) 0:2/0/terrains_peering_bit/right_side = 0 0:2/0/terrains_peering_bit/top_side = 0 +0:2/1 = 1 +0:2/1/texture_origin = Vector2i(0, -32) +0:2/1/terrain_set = 0 +0:2/1/terrain = 0 +0:2/1/probability = 0.0 +0:2/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_1srhd") +0:2/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 96, -32, 96) +0:2/1/terrains_peering_bit/right_side = 0 +0:2/1/terrains_peering_bit/top_side = 0 1:2/size_in_atlas = Vector2i(1, 2) 1:2/next_alternative_id = 2 1:2/0 = 0 @@ -146,7 +226,16 @@ texture_region_size = Vector2i(64, 64) 1:2/0/terrains_peering_bit/top_side = 0 1:2/1 = 1 1:2/1/texture_origin = Vector2i(0, -32) +1:2/1/terrain_set = 0 +1:2/1/terrain = 0 +1:2/1/probability = 0.0 +1:2/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_6jiih") +1:2/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 96, -32, 96) +1:2/1/terrains_peering_bit/right_side = 0 +1:2/1/terrains_peering_bit/left_side = 0 +1:2/1/terrains_peering_bit/top_side = 0 2:2/size_in_atlas = Vector2i(1, 2) +2:2/next_alternative_id = 2 2:2/0 = 0 2:2/0/texture_origin = Vector2i(0, -32) 2:2/0/terrain_set = 0 @@ -156,7 +245,17 @@ texture_region_size = Vector2i(64, 64) 2:2/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 96, -32, 96) 2:2/0/terrains_peering_bit/left_side = 0 2:2/0/terrains_peering_bit/top_side = 0 +2:2/1 = 1 +2:2/1/texture_origin = Vector2i(0, -32) +2:2/1/terrain_set = 0 +2:2/1/terrain = 0 +2:2/1/probability = 0.0 +2:2/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_qpeek") +2:2/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 96, -32, 96) +2:2/1/terrains_peering_bit/left_side = 0 +2:2/1/terrains_peering_bit/top_side = 0 3:2/size_in_atlas = Vector2i(1, 2) +3:2/next_alternative_id = 2 3:2/0 = 0 3:2/0/texture_origin = Vector2i(0, -32) 3:2/0/terrain_set = 0 @@ -165,7 +264,16 @@ texture_region_size = Vector2i(64, 64) 3:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -32, -24, -32, -24, 32, 24, 32, 24, -32, 32, -32, 32, 96, -32, 96) 3:2/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 96, -32, 96) 3:2/0/terrains_peering_bit/top_side = 0 +3:2/1 = 1 +3:2/1/texture_origin = Vector2i(0, -32) +3:2/1/terrain_set = 0 +3:2/1/terrain = 0 +3:2/1/probability = 0.0 +3:2/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_qhdiu") +3:2/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, -32, 32, -32, 32, 96, -32, 96) +3:2/1/terrains_peering_bit/top_side = 0 0:4/size_in_atlas = Vector2i(1, 2) +0:4/next_alternative_id = 2 0:4/0 = 0 0:4/0/texture_origin = Vector2i(0, -32) 0:4/0/y_sort_origin = 10 @@ -175,7 +283,17 @@ texture_region_size = Vector2i(64, 64) 0:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-24, -24, 32, -32, 32, -24, -16, -16, -24, 32, 32, 32, 32, 96, -32, 96, -32, 32) 0:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 96, -32, 96) 0:4/0/terrains_peering_bit/right_side = 0 +0:4/1 = 1 +0:4/1/texture_origin = Vector2i(0, -32) +0:4/1/y_sort_origin = 10 +0:4/1/terrain_set = 0 +0:4/1/terrain = 0 +0:4/1/probability = 0.0 +0:4/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_kbenk") +0:4/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 96, -32, 96) +0:4/1/terrains_peering_bit/right_side = 0 1:4/size_in_atlas = Vector2i(1, 2) +1:4/next_alternative_id = 2 1:4/0 = 0 1:4/0/texture_origin = Vector2i(0, -32) 1:4/0/y_sort_origin = 10 @@ -187,7 +305,18 @@ texture_region_size = Vector2i(64, 64) 1:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 96, -32, 96) 1:4/0/terrains_peering_bit/right_side = 0 1:4/0/terrains_peering_bit/left_side = 0 +1:4/1 = 1 +1:4/1/texture_origin = Vector2i(0, -32) +1:4/1/y_sort_origin = 10 +1:4/1/terrain_set = 0 +1:4/1/terrain = 0 +1:4/1/probability = 0.0 +1:4/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_y1c8q") +1:4/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 96, -32, 96) +1:4/1/terrains_peering_bit/right_side = 0 +1:4/1/terrains_peering_bit/left_side = 0 2:4/size_in_atlas = Vector2i(1, 2) +2:4/next_alternative_id = 2 2:4/0 = 0 2:4/0/texture_origin = Vector2i(0, -32) 2:4/0/y_sort_origin = 10 @@ -197,7 +326,17 @@ texture_region_size = Vector2i(64, 64) 2:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -32, 24, -24, 32, 32, 32, 96, -32, 96, -32, 32, 24, 32, 16, -16, -32, -24) 2:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 96, -32, 96) 2:4/0/terrains_peering_bit/left_side = 0 +2:4/1 = 1 +2:4/1/texture_origin = Vector2i(0, -32) +2:4/1/y_sort_origin = 10 +2:4/1/terrain_set = 0 +2:4/1/terrain = 0 +2:4/1/probability = 0.0 +2:4/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_em2qm") +2:4/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 96, -32, 96) +2:4/1/terrains_peering_bit/left_side = 0 3:4/size_in_atlas = Vector2i(1, 2) +3:4/next_alternative_id = 2 3:4/0 = 0 3:4/0/texture_origin = Vector2i(0, -32) 3:4/0/y_sort_origin = 10 @@ -206,6 +345,14 @@ texture_region_size = Vector2i(64, 64) 3:4/0/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_nwor3") 3:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-32, -16, 0, -32, 32, -16, 32, 96, -24, 32, 24, 32, 24, -8, 0, -24, -24, -8, -24, 32, 32, 96, -32, 96) 3:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 96, -32, 96) +3:4/1 = 1 +3:4/1/texture_origin = Vector2i(0, -32) +3:4/1/y_sort_origin = 10 +3:4/1/terrain_set = 0 +3:4/1/terrain = 0 +3:4/1/probability = 0.0 +3:4/1/occlusion_layer_0/polygon_0/polygon = SubResource("OccluderPolygon2D_nwor3") +3:4/1/physics_layer_1/polygon_0/points = PackedVector2Array(-32, 10.1605, 32, 10.725, 32, 96, -32, 96) 0:7/0 = 0 1:7/0 = 0 2:7/0 = 0 diff --git a/tools/add_elevation_alternative_tiles.gd b/tools/add_elevation_alternative_tiles.gd new file mode 100644 index 0000000000..2270aa81c0 --- /dev/null +++ b/tools/add_elevation_alternative_tiles.gd @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 + +@tool +class_name AddElevationAlternativeTiles +extends EditorScript + +const ELEVATION_TILESET_PATH = "res://tiles/elevation_2.tres" +const SOURCE_ID := 0 +const WALLS := 0 + + +func _run() -> void: + var tiles := load(ELEVATION_TILESET_PATH) as TileSet + var source := tiles.get_source(SOURCE_ID) as TileSetAtlasSource + for i: int in source.get_tiles_count(): + var coords := source.get_tile_id(i) + var tile_data := source.get_tile_data(coords, 0) + + # Don't create alts for stairs + if tile_data.get_collision_polygons_count(WALLS) == 0: + continue + + if not source.has_alternative_tile(coords, 1): + var alt_id := source.create_alternative_tile(coords, 1) + if alt_id != 1: + prints("oh no", coords, alt_id) + + var alt_tile_data := source.get_tile_data(coords, 1) + + # Duplicate all properties from the base tile as a baseline + for x in tile_data.get_property_list(): + alt_tile_data.set(x["name"], tile_data.get(x["name"])) + + # Remove wall collisions + alt_tile_data.set_collision_polygons_count(WALLS, 0) + + # Don't place it when drawing random tiles or terrains + alt_tile_data.probability = 0.0 + + ResourceSaver.save(tiles) diff --git a/tools/add_elevation_alternative_tiles.gd.uid b/tools/add_elevation_alternative_tiles.gd.uid new file mode 100644 index 0000000000..ad2860883a --- /dev/null +++ b/tools/add_elevation_alternative_tiles.gd.uid @@ -0,0 +1 @@ +uid://byniul4wf1q4k