diff --git a/scenes/game_elements/props/tileomatic/tileomatic.gd b/scenes/game_elements/props/tileomatic/tileomatic.gd new file mode 100644 index 000000000..f8088c84a --- /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 000000000..387ce9a3b --- /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 000000000..0594eb886 --- /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 38588d281..ec167cd5f 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 000000000..2270aa81c --- /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 000000000..ad2860883 --- /dev/null +++ b/tools/add_elevation_alternative_tiles.gd.uid @@ -0,0 +1 @@ +uid://byniul4wf1q4k