From 10d44a8f7b3b4d085220f05eb3d2ae20c37b03c8 Mon Sep 17 00:00:00 2001 From: Martin Felis Date: Sat, 14 Sep 2024 12:45:42 +0200 Subject: [PATCH] Added tool slot selection, some progress on the BuildSystem. --- assets/resources/fence_fortified.png | Bin 5582 -> 2142 bytes assets/resources/fence_fortified.png.import | 2 +- assets/resources/fence_fortified.tscn | 3 - .../Previews => resources}/floor.png | Bin .../Previews => resources}/floor.png.import | 6 +- assets/resources/floor.tscn | 5 + data/items/fence_fortified.tres | 4 +- data/items/floor.tres | 12 + data/recipes/floor.tres | 11 + game_ui.gd | 17 ++ inventory.gd | 16 +- objects/player.gd | 29 ++- objects/player.tscn | 5 - project.godot | 36 ++- root_ui.tscn | 233 ++++++++++++++++-- scenes/game.gd | 23 ++ scenes/game.tscn | 15 +- systems/BuildSystem.gd | 66 ++++- ui/game_menu_ui.gd | 2 +- ui/item_grid.gd | 2 +- ui/item_slot.gd | 10 +- ui/item_slot.tscn | 61 ++++- ui/theme_preview.tscn | 30 +++ ui/ui_theme.tres | 94 ++++++- ui/ui_theme_panel_style.tres | 4 +- utils/SpringDamper.gd | 1 - world/level.tscn | 2 +- 27 files changed, 628 insertions(+), 61 deletions(-) rename assets/{3rdparty/kenney/survival-kit/Previews => resources}/floor.png (100%) rename assets/{3rdparty/kenney/survival-kit/Previews => resources}/floor.png.import (70%) create mode 100644 assets/resources/floor.tscn create mode 100644 data/items/floor.tres create mode 100644 data/recipes/floor.tres create mode 100644 scenes/game.gd create mode 100644 ui/theme_preview.tscn diff --git a/assets/resources/fence_fortified.png b/assets/resources/fence_fortified.png index 72a9fa58c64dcc79c5ec353c27a462e57a99fc78..6317057a48a729a664a4b9cfb943234bf5fac116 100644 GIT binary patch literal 2142 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 diff --git a/assets/resources/fence_fortified.png.import b/assets/resources/fence_fortified.png.import index 08653b0..e4d7a41 100644 --- a/assets/resources/fence_fortified.png.import +++ b/assets/resources/fence_fortified.png.import @@ -2,7 +2,7 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cx3x4l20q17xh" +uid="uid://d4cjmc3svg7ie" path="res://.godot/imported/fence_fortified.png-1ae65c603e478020bc26d4e987d66517.ctex" metadata={ "vram_texture": false diff --git a/assets/resources/fence_fortified.tscn b/assets/resources/fence_fortified.tscn index 8a55776..09000f6 100644 --- a/assets/resources/fence_fortified.tscn +++ b/assets/resources/fence_fortified.tscn @@ -3,6 +3,3 @@ [ext_resource type="PackedScene" uid="uid://cg5cy35mk8nba" path="res://assets/3rdparty/kenney/survival-kit/Models/fence-fortified.glb" id="1_bm7wh"] [node name="fence-fortified" instance=ExtResource("1_bm7wh")] - -[node name="fence-fortified" parent="." index="0"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.222241) diff --git a/assets/3rdparty/kenney/survival-kit/Previews/floor.png b/assets/resources/floor.png similarity index 100% rename from assets/3rdparty/kenney/survival-kit/Previews/floor.png rename to assets/resources/floor.png diff --git a/assets/3rdparty/kenney/survival-kit/Previews/floor.png.import b/assets/resources/floor.png.import similarity index 70% rename from assets/3rdparty/kenney/survival-kit/Previews/floor.png.import rename to assets/resources/floor.png.import index d462144..05b45df 100644 --- a/assets/3rdparty/kenney/survival-kit/Previews/floor.png.import +++ b/assets/resources/floor.png.import @@ -3,15 +3,15 @@ importer="texture" type="CompressedTexture2D" uid="uid://cwplac1y0x13c" -path="res://.godot/imported/floor.png-7ce8f44de2a77036c73a390ab70d03ae.ctex" +path="res://.godot/imported/floor.png-b9879e04f7313063744ab2deb5053a27.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://assets/3rdparty/kenney/survival-kit/Previews/floor.png" -dest_files=["res://.godot/imported/floor.png-7ce8f44de2a77036c73a390ab70d03ae.ctex"] +source_file="res://assets/resources/floor.png" +dest_files=["res://.godot/imported/floor.png-b9879e04f7313063744ab2deb5053a27.ctex"] [params] diff --git a/assets/resources/floor.tscn b/assets/resources/floor.tscn new file mode 100644 index 0000000..4c11ac0 --- /dev/null +++ b/assets/resources/floor.tscn @@ -0,0 +1,5 @@ +[gd_scene load_steps=2 format=3 uid="uid://bfn60u0e11o8u"] + +[ext_resource type="PackedScene" uid="uid://putll6r03s1i" path="res://assets/3rdparty/kenney/survival-kit/Models/floor.glb" id="1_i3lij"] + +[node name="floor2" instance=ExtResource("1_i3lij")] diff --git a/data/items/fence_fortified.tres b/data/items/fence_fortified.tres index 5d97213..d5eca2a 100644 --- a/data/items/fence_fortified.tres +++ b/data/items/fence_fortified.tres @@ -1,12 +1,12 @@ [gd_resource type="Resource" script_class="Item" load_steps=4 format=3 uid="uid://c714vj3s6cnqg"] -[ext_resource type="Texture2D" uid="uid://cx3x4l20q17xh" path="res://assets/resources/fence_fortified.png" id="1_hyv8l"] +[ext_resource type="Texture2D" uid="uid://d4cjmc3svg7ie" path="res://assets/resources/fence_fortified.png" id="1_hyv8l"] [ext_resource type="Script" path="res://model/item.gd" id="1_u43c0"] [ext_resource type="PackedScene" uid="uid://dv60qx8nqw3vg" path="res://assets/resources/fence_fortified.tscn" id="2_8ttdv"] [resource] script = ExtResource("1_u43c0") -name = "" +name = "Fence Fortified" scene = ExtResource("2_8ttdv") icon = ExtResource("1_hyv8l") max_stack_size = 64 diff --git a/data/items/floor.tres b/data/items/floor.tres new file mode 100644 index 0000000..712779c --- /dev/null +++ b/data/items/floor.tres @@ -0,0 +1,12 @@ +[gd_resource type="Resource" script_class="Item" load_steps=4 format=3 uid="uid://cepy03xrewibs"] + +[ext_resource type="Texture2D" uid="uid://cwplac1y0x13c" path="res://assets/resources/floor.png" id="1_fe6dh"] +[ext_resource type="Script" path="res://model/item.gd" id="1_piayo"] +[ext_resource type="PackedScene" uid="uid://bfn60u0e11o8u" path="res://assets/resources/floor.tscn" id="2_1360y"] + +[resource] +script = ExtResource("1_piayo") +name = "Floor" +scene = ExtResource("2_1360y") +icon = ExtResource("1_fe6dh") +max_stack_size = 64 diff --git a/data/recipes/floor.tres b/data/recipes/floor.tres new file mode 100644 index 0000000..0882333 --- /dev/null +++ b/data/recipes/floor.tres @@ -0,0 +1,11 @@ +[gd_resource type="Resource" script_class="Recipe" load_steps=4 format=3 uid="uid://dbij72n3ia8te"] + +[ext_resource type="Script" path="res://model/recipe.gd" id="1_sqajm"] +[ext_resource type="Resource" uid="uid://dmjr6pmb17l2y" path="res://data/items/woodplanks.tres" id="1_y7d3a"] +[ext_resource type="Resource" uid="uid://cepy03xrewibs" path="res://data/items/floor.tres" id="2_m3y1r"] + +[resource] +script = ExtResource("1_sqajm") +name = "Floor" +ingredients = Array[Resource("res://model/item.gd")]([ExtResource("1_y7d3a"), ExtResource("1_y7d3a")]) +results = Array[Resource("res://model/item.gd")]([ExtResource("2_m3y1r")]) diff --git a/game_ui.gd b/game_ui.gd index d563ac4..6b3d682 100644 --- a/game_ui.gd +++ b/game_ui.gd @@ -42,6 +42,23 @@ func activate_game_scene(game_scene:Node3D) -> void: game_menu_ui.hide() +func _process(_delta): + if _player == null: + # TODO: make sure game ui is deactivated when no game running + return + + assert(_player != null and tool_container.get_child_count() >= _player.selected_tool_slot_index) + + for i in range(tool_container.get_child_count()): + var item_slot:ItemSlot = tool_container.get_child(i) as ItemSlot + + assert(item_slot != null) + + if i == _player.selected_tool_slot_index: + item_slot.highlighted = true + else: + item_slot.highlighted = false + func _on_message_timer_timeout(): %MessagesContainer.visible = false diff --git a/inventory.gd b/inventory.gd index 3fa0805..822d8f1 100644 --- a/inventory.gd +++ b/inventory.gd @@ -2,10 +2,18 @@ class_name Inventory var _content:Array[ItemStack] = [] const INVENTORY_SIZE:int = 36 +const INVENTORY_TOOL_START:int = 36 - 9 func _init() -> void: clear() +func get_free_tool_stack_index() -> int: + for i:int in range(INVENTORY_TOOL_START, _content.size()): + if _content[i].count == 0: + return i + + return -1 + func get_free_item_stack_index() -> int: for i:int in range(_content.size()): if _content[i].count == 0: @@ -25,7 +33,13 @@ func add_item(item:Item) -> bool: item_stack.count = item_stack.count + 1 return true - var item_stack_index:int = get_free_item_stack_index() + # First try to put it into the tool stacks... + var item_stack_index:int = get_free_tool_stack_index() + + # ... and if that failed try use the regular inventory. + if item_stack_index < 0: + item_stack_index = get_free_item_stack_index() + if item_stack_index >= 0: _content[item_stack_index].item = item _content[item_stack_index].count = 1 diff --git a/objects/player.gd b/objects/player.gd index f2552cd..d9dc132 100644 --- a/objects/player.gd +++ b/objects/player.gd @@ -12,6 +12,7 @@ const JUMP_VELOCITY = 2.5 # Get the gravity from the project settings to be synced with RigidBody nodes. var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") var inventory:Inventory = Inventory.new() +var selected_tool_slot_index:int = 0 var look_direction:Vector3 = Vector3.BACK var look_direction_damper:SpringDamper = SpringDamper.new(Vector3.ZERO) @@ -68,6 +69,30 @@ func on_item_picked_up(item:Item): func get_actionable_global_transform() -> Vector3: return build_location.global_position + +func _handle_tool_slot_input_events(_event:InputEvent) -> bool: + var key_event:InputEventKey = _event as InputEventKey + + if key_event and key_event.is_released(): + if key_event.keycode >= KEY_1 and key_event.keycode <= KEY_9: + selected_tool_slot_index = key_event.keycode - KEY_1 + get_viewport().set_input_as_handled() + return true + + if _event.is_action_released("item_next"): + selected_tool_slot_index = (selected_tool_slot_index + 1) % (inventory.get_tool_item_stacks().size()) + get_viewport().set_input_as_handled() + return true + + if _event.is_action_released("item_prev"): + var tool_slot_size = inventory.get_tool_item_stacks().size() + selected_tool_slot_index = (selected_tool_slot_index + tool_slot_size - 1) % (tool_slot_size) + get_viewport().set_input_as_handled() + return true + + return false + + func _unhandled_input(_event: InputEvent) -> void: if Input.is_action_just_pressed("ui_accept"): var actionables = actionable_detector.get_overlapping_areas() @@ -83,4 +108,6 @@ func _unhandled_input(_event: InputEvent) -> void: get_viewport().set_input_as_handled() return - + + if _handle_tool_slot_input_events(_event): + return diff --git a/objects/player.tscn b/objects/player.tscn index 185dd41..554ddfb 100644 --- a/objects/player.tscn +++ b/objects/player.tscn @@ -48,8 +48,3 @@ shape = SubResource("SphereShape3D_wrkyq") [node name="BuildLocation" type="Node3D" parent="Geometry"] unique_name_in_owner = true transform = Transform3D(2.5, 0, 0, 0, 2.5, 0, 0, 0, 2.5, 0, 0, 2.4682) - -[node name="Camera3D" type="Camera3D" parent="."] -unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 0.639707, 0.768619, 0, -0.768619, 0.639707, 0, 2.23862, 1.4653) -current = true diff --git a/project.godot b/project.godot index 32868c4..d6efd38 100644 --- a/project.godot +++ b/project.godot @@ -31,6 +31,10 @@ project/assembly_name="UIAndInteractionTests" enabled=PackedStringArray("res://addons/dialogue_manager/plugin.cfg") +[gui] + +theme/custom="res://ui/ui_theme.tres" + [input] ui_accept={ @@ -123,9 +127,36 @@ toggle_inventory={ } interaction={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"echo":false,"script":null) -, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) +"events": [Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) , Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":108,"echo":false,"script":null) +] +} +toggle_build_mode={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"echo":false,"script":null) +] +} +rotate_clockwise={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":99,"echo":false,"script":null) +, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +rotate_counter_clockwise={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":101,"echo":false,"script":null) +, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +item_next={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +item_prev={ +"deadzone": 0.5, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null) ] } @@ -135,4 +166,5 @@ locale/translations_pot_files=PackedStringArray("res://dialogue/bridge_builder_m [layer_names] +3d_physics/layer_1="World" 3d_physics/layer_5="Actionables" diff --git a/root_ui.tscn b/root_ui.tscn index 70668cd..1586df4 100644 --- a/root_ui.tscn +++ b/root_ui.tscn @@ -1,15 +1,199 @@ -[gd_scene load_steps=11 format=3 uid="uid://c73t0nbuqp68e"] +[gd_scene load_steps=33 format=3 uid="uid://c73t0nbuqp68e"] [ext_resource type="Script" path="res://root_ui.gd" id="1_7fnkg"] [ext_resource type="PackedScene" uid="uid://bo788o53t4rbq" path="res://scenes/startup_scene.tscn" id="2_1untt"] [ext_resource type="PackedScene" uid="uid://cqie4cy0uy1t0" path="res://scenes/game.tscn" id="3_w1gpn"] -[ext_resource type="Theme" uid="uid://dmk7hc81l8gbw" path="res://ui/ui_theme.tres" id="4_el4q2"] +[ext_resource type="Texture2D" uid="uid://bnwqllx51sdg2" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/buttonLong_grey.png" id="4_3iys8"] [ext_resource type="Script" path="res://game_ui.gd" id="5_jkbjp"] +[ext_resource type="StyleBox" uid="uid://bh2a2lhk5hwi1" path="res://ui/ui_theme_panel_style.tres" id="5_o771r"] +[ext_resource type="Texture2D" uid="uid://b4quo8qstm60p" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/panelInset_blue.png" id="6_tso5a"] [ext_resource type="Script" path="res://ui/inventory_dialog.gd" id="6_y58iw"] +[ext_resource type="FontFile" uid="uid://cjxqdamvrjlij" path="res://assets/fonts/upheaval/upheavtt.ttf" id="7_mj4qa"] [ext_resource type="PackedScene" uid="uid://dp3fi0g53qrt2" path="res://ui/item_slot.tscn" id="7_pv315"] [ext_resource type="PackedScene" uid="uid://bwui4acukq4x6" path="res://ui/ItemGrid.tscn" id="8_anyub"] [ext_resource type="Script" path="res://ui/game_menu_ui.gd" id="9_g2mav"] [ext_resource type="Script" path="res://ui/item_grid.gd" id="10_5ufsm"] +[ext_resource type="Texture2D" uid="uid://57o4ow08ky5q" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/buttonSquare_blue_pressed.png" id="10_rpger"] +[ext_resource type="Texture2D" uid="uid://beaqo323661rh" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/panel_blue.png" id="11_jrvnp"] +[ext_resource type="Texture2D" uid="uid://bi6q381bmdonq" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/buttonSquare_grey.png" id="12_033wf"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1ume3"] +content_margin_left = 4.0 +content_margin_top = 4.0 +content_margin_right = 4.0 +content_margin_bottom = 4.0 +bg_color = Color(0.1, 0.1, 0.1, 0.3) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 +corner_detail = 5 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rm8a3"] +content_margin_left = 4.0 +content_margin_top = 4.0 +content_margin_right = 4.0 +content_margin_bottom = 4.0 +bg_color = Color(1, 1, 1, 0.75) +draw_center = false +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 +corner_detail = 5 +expand_margin_left = 2.0 +expand_margin_top = 2.0 +expand_margin_right = 2.0 +expand_margin_bottom = 2.0 + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_a84rd"] +texture = ExtResource("4_3iys8") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +modulate_color = Color(0.621524, 0.621524, 0.621524, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_votra"] +texture = ExtResource("4_3iys8") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color(0.509286, 0.509286, 0.509286, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_bpyb5"] +texture = ExtResource("4_3iys8") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color(0.408329, 0.408329, 0.408329, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_72pk6"] +texture = ExtResource("6_tso5a") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 1 +modulate_color = Color(0.821789, 0.821789, 0.821789, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_kl7i7"] +texture = ExtResource("6_tso5a") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color(0.821789, 0.821789, 0.821789, 1) + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_supoq"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_72rto"] +texture = ExtResource("10_rpger") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +axis_stretch_horizontal = 1 +axis_stretch_vertical = 1 +modulate_color = Color(1, 0.0666667, 0.156863, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_th1h8"] +texture = ExtResource("12_033wf") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +axis_stretch_horizontal = 1 +axis_stretch_vertical = 1 + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_47eau"] +texture = ExtResource("10_rpger") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_lnfi0"] +texture = ExtResource("11_jrvnp") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xw22e"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_tyjme"] + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_22g74"] +texture = ExtResource("6_tso5a") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +axis_stretch_horizontal = 2 +axis_stretch_vertical = 2 +modulate_color = Color(0.760784, 0.760784, 0.760784, 1) + +[sub_resource type="Theme" id="Theme_4dhdu"] +default_font = ExtResource("7_mj4qa") +default_font_size = 24 +Button/colors/font_color = Color(0.875, 0.875, 0.875, 1) +Button/colors/font_disabled_color = Color(0.875, 0.875, 0.875, 0.5) +Button/colors/font_focus_color = Color(0.95, 0.95, 0.95, 1) +Button/colors/font_hover_color = Color(0.95, 0.95, 0.95, 1) +Button/colors/font_hover_pressed_color = Color(1, 1, 1, 1) +Button/colors/font_outline_color = Color(1, 1, 1, 1) +Button/colors/font_pressed_color = Color(1, 1, 1, 1) +Button/colors/icon_disabled_color = Color(1, 1, 1, 0.4) +Button/colors/icon_focus_color = Color(1, 1, 1, 1) +Button/colors/icon_hover_color = Color(1, 1, 1, 1) +Button/colors/icon_hover_pressed_color = Color(1, 1, 1, 1) +Button/colors/icon_normal_color = Color(1, 1, 1, 1) +Button/colors/icon_pressed_color = Color(1, 1, 1, 1) +Button/constants/h_separation = 4 +Button/constants/icon_max_width = 0 +Button/constants/outline_size = 0 +Button/styles/disabled = SubResource("StyleBoxFlat_1ume3") +Button/styles/focus = SubResource("StyleBoxFlat_rm8a3") +Button/styles/hover = SubResource("StyleBoxTexture_a84rd") +Button/styles/normal = SubResource("StyleBoxTexture_votra") +Button/styles/panel = ExtResource("5_o771r") +Button/styles/pressed = SubResource("StyleBoxTexture_bpyb5") +Control/styles/normal = SubResource("StyleBoxTexture_72pk6") +ItemList/styles/normal = SubResource("StyleBoxTexture_kl7i7") +Label/colors/font_color = Color(1, 1, 1, 1) +Label/colors/font_outline_color = Color(1, 1, 1, 1) +Label/colors/font_shadow_color = Color(0.223103, 0.223103, 0.223103, 0.843137) +Label/constants/line_spacing = 3 +Label/constants/outline_size = 0 +Label/constants/shadow_offset_x = 1 +Label/constants/shadow_offset_y = 1 +Label/constants/shadow_outline_size = 1 +Label/fonts/font = ExtResource("7_mj4qa") +Label/styles/normal = SubResource("StyleBoxEmpty_supoq") +Label/styles/panel = SubResource("StyleBoxTexture_72rto") +MarginContainer/styles/normal = SubResource("StyleBoxTexture_th1h8") +Panel/styles/highlighted = SubResource("StyleBoxTexture_72rto") +Panel/styles/normal = SubResource("StyleBoxTexture_47eau") +Panel/styles/panel = SubResource("StyleBoxTexture_lnfi0") +PanelContainer/styles/panel = SubResource("StyleBoxEmpty_xw22e") +RedButton/styles/panel = SubResource("StyleBoxFlat_tyjme") +Tree/styles/panel = SubResource("StyleBoxTexture_22g74") [node name="RootUI" type="CanvasLayer"] unique_name_in_owner = true @@ -17,8 +201,9 @@ script = ExtResource("1_7fnkg") startup_scene = ExtResource("2_1untt") game_scene = ExtResource("3_w1gpn") -[node name="MainMenuUI" type="PanelContainer" parent="."] +[node name="MainMenuUI" type="Panel" parent="."] unique_name_in_owner = true +visible = false anchors_preset = 8 anchor_left = 0.5 anchor_top = 0.5 @@ -30,10 +215,14 @@ offset_right = 199.0 offset_bottom = 134.5 grow_horizontal = 2 grow_vertical = 2 -theme = ExtResource("4_el4q2") [node name="MarginContainer" type="MarginContainer" parent="MainMenuUI"] -layout_mode = 2 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 theme_override_constants/margin_left = 60 theme_override_constants/margin_top = 60 theme_override_constants/margin_right = 60 @@ -87,7 +276,7 @@ theme_override_constants/margin_bottom = 8 layout_mode = 2 text = "Quit" -[node name="NewGameUI" type="PanelContainer" parent="."] +[node name="NewGameUI" type="Panel" parent="."] unique_name_in_owner = true visible = false anchors_preset = 8 @@ -101,10 +290,14 @@ offset_right = 291.0 offset_bottom = 144.0 grow_horizontal = 2 grow_vertical = 2 -theme = ExtResource("4_el4q2") [node name="MarginContainer" type="MarginContainer" parent="NewGameUI"] -layout_mode = 2 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 theme_override_constants/margin_left = 60 theme_override_constants/margin_top = 60 theme_override_constants/margin_right = 60 @@ -176,7 +369,6 @@ text = "Start [node name="GameUI" type="Control" parent="."] unique_name_in_owner = true -visible = false layout_mode = 3 anchors_preset = 15 anchor_right = 1.0 @@ -186,7 +378,6 @@ grow_vertical = 2 size_flags_horizontal = 3 size_flags_vertical = 3 mouse_filter = 1 -theme = ExtResource("4_el4q2") script = ExtResource("5_jkbjp") [node name="MessagesContainer" type="MarginContainer" parent="GameUI"] @@ -278,7 +469,7 @@ text = "Recipes" unique_name_in_owner = true layout_mode = 2 size_flags_vertical = 3 -theme = ExtResource("4_el4q2") +theme = SubResource("Theme_4dhdu") item_count = 2 item_0/text = "Blab" item_1/text = "Bloobalb" @@ -384,7 +575,7 @@ layout_mode = 2 size_flags_horizontal = 4 size_flags_vertical = 4 -[node name="GameMenuUI" type="PanelContainer" parent="GameUI"] +[node name="GameMenuUI" type="Panel" parent="GameUI"] unique_name_in_owner = true visible = false layout_mode = 1 @@ -399,11 +590,16 @@ offset_right = 199.0 offset_bottom = 215.0 grow_horizontal = 2 grow_vertical = 2 -theme = ExtResource("4_el4q2") +theme = SubResource("Theme_4dhdu") script = ExtResource("9_g2mav") [node name="MarginContainer" type="MarginContainer" parent="GameUI/GameMenuUI"] -layout_mode = 2 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 theme_override_constants/margin_left = 60 theme_override_constants/margin_top = 60 theme_override_constants/margin_right = 60 @@ -497,6 +693,15 @@ columns = 9 script = ExtResource("10_5ufsm") slot_scene = ExtResource("7_pv315") +[node name="ItemSlot" parent="GameUI/ToolSlots/PanelContainer/ToolContainer" instance=ExtResource("7_pv315")] +layout_mode = 2 + +[node name="ItemSlot2" parent="GameUI/ToolSlots/PanelContainer/ToolContainer" instance=ExtResource("7_pv315")] +layout_mode = 2 + +[node name="ItemSlot3" parent="GameUI/ToolSlots/PanelContainer/ToolContainer" instance=ExtResource("7_pv315")] +layout_mode = 2 + [node name="Scene" type="Node3D" parent="."] unique_name_in_owner = true diff --git a/scenes/game.gd b/scenes/game.gd new file mode 100644 index 0000000..93e7e5d --- /dev/null +++ b/scenes/game.gd @@ -0,0 +1,23 @@ +extends Node3D + +@onready var camera = %Camera +@onready var player = %Player + +@onready var build_system = %BuildSystem + +var _player_camera_offset:Vector3 = Vector3.ZERO + +# Called when the node enters the scene tree for the first time. +func _ready(): + _player_camera_offset = camera.global_position - player.global_position + Vector3.UP * 1 + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta): + if build_system.is_active: + player.process_mode = Node.PROCESS_MODE_DISABLED + else: + player.process_mode = Node.PROCESS_MODE_ALWAYS + + camera.global_position = player.global_position + _player_camera_offset + camera.look_at(player.global_position) diff --git a/scenes/game.tscn b/scenes/game.tscn index 60d6ded..633fee6 100644 --- a/scenes/game.tscn +++ b/scenes/game.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=9 format=3 uid="uid://cqie4cy0uy1t0"] +[gd_scene load_steps=10 format=3 uid="uid://cqie4cy0uy1t0"] +[ext_resource type="Script" path="res://scenes/game.gd" id="1_kl6si"] [ext_resource type="PackedScene" uid="uid://ch0s3dxx3rpir" path="res://objects/player.tscn" id="2_rjgxk"] [ext_resource type="Script" path="res://systems/QuestSystem.gd" id="4_8oxap"] [ext_resource type="Script" path="res://systems/BuildSystem.gd" id="4_iqdys"] -[ext_resource type="Resource" uid="uid://c714vj3s6cnqg" path="res://data/items/fence_fortified.tres" id="5_ii2f8"] [ext_resource type="PackedScene" uid="uid://dmagdl5pi6jdj" path="res://world/level.tscn" id="6_svjo8"] +[ext_resource type="Resource" uid="uid://cepy03xrewibs" path="res://data/items/floor.tres" id="6_xdkny"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_y65pc"] @@ -18,6 +19,7 @@ ambient_light_source = 3 ambient_light_color = Color(0.662452, 0.662452, 0.662452, 1) [node name="Game" type="Node3D"] +script = ExtResource("1_kl6si") [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_v85yo") @@ -31,17 +33,20 @@ shadow_enabled = true [node name="Player" parent="." instance=ExtResource("2_rjgxk")] unique_name_in_owner = true +[node name="Camera" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.662829, 0.748771, 0, -0.748771, 0.662829, 0, 2.12698, 2.04901) + [node name="QuestSystem" type="Node" parent="."] script = ExtResource("4_8oxap") [node name="BuildSystem" type="Node" parent="."] +unique_name_in_owner = true script = ExtResource("4_iqdys") -build_item = ExtResource("5_ii2f8") +build_item = ExtResource("6_xdkny") [node name="BuildPreview" type="Node3D" parent="BuildSystem"] unique_name_in_owner = true [node name="BuiltStructures" type="Node" parent="BuildSystem"] unique_name_in_owner = true - -[editable path="Player"] diff --git a/systems/BuildSystem.gd b/systems/BuildSystem.gd index f625599..0af0226 100644 --- a/systems/BuildSystem.gd +++ b/systems/BuildSystem.gd @@ -1,12 +1,19 @@ class_name BuildSystem extends Node +const CAMERA_SPEED = 4.0 + @onready var build_preview = %BuildPreview @onready var player = %Player @onready var built_structures = %BuiltStructures +@onready var camera:Camera3D = %Camera + @export var build_item:Item = null +var camera_velocity:Vector3 = Vector3.ZERO +var is_active:bool = false + # Called when the node enters the scene tree for the first time. func _ready(): pass # Replace with function body. @@ -21,13 +28,46 @@ func update_build_preview_item() -> void: if build_preview.get_child_count() == 0 and build_item != null: build_preview.add_child(build_item.scene.instantiate()) -# Called every frame. 'delta' is the elapsed time since the previous frame. + +func move_build_camera(delta): + var input_dir = Input.get_vector("walk_left", "walk_right", "walk_forward", "walk_back") + var direction = (camera.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() + if direction: + camera_velocity.x = direction.x * CAMERA_SPEED + camera_velocity.z = direction.z * CAMERA_SPEED + else: + camera_velocity.x = move_toward(camera_velocity.x, 0, CAMERA_SPEED) + camera_velocity.z = move_toward(camera_velocity.z, 0, CAMERA_SPEED) + + camera_velocity.y = 0 + + camera.global_position = camera.global_position + camera_velocity * delta + + +func update_build_preview(): + var mouse_view_coords = get_viewport().get_mouse_position() # / get_viewport().get_visible_rect().size + var mouse_ray_origin = camera.project_ray_origin(mouse_view_coords) + var mouse_ray_normal = camera.project_ray_normal(mouse_view_coords) + + var world_space_state = camera.get_world_3d().direct_space_state + var ray_query:PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(mouse_ray_origin, mouse_ray_origin + mouse_ray_normal * 100) + var ray_result:Dictionary = world_space_state.intersect_ray(ray_query) + + if not ray_result.is_empty() and Vector3.UP.dot(ray_result["normal"]) > 0.9: + var build_location:Vector3 = ray_result["position"] + build_location = Vector3(roundf(build_location.x * 4), build_location.y, roundf(build_location.z * 4)) * 0.25 + build_preview.global_position = build_location + + func _physics_process(_delta): + if not is_active: + return + update_build_preview_item() - var build_location:Vector3 = player.get_actionable_global_transform() - build_location = Vector3(roundf(build_location.x * 2), build_location.y, roundf(build_location.z * 2)) * 0.5 - build_preview.global_position = build_location + #move_build_camera(delta) + + update_build_preview() if build_item != null and Input.is_action_just_pressed("interaction"): var new_structure:Node3D = build_item.scene.instantiate() @@ -35,3 +75,21 @@ func _physics_process(_delta): built_structures.add_child(new_structure) get_viewport().set_input_as_handled() return + + +func _unhandled_input(_event: InputEvent) -> void: + if Input.is_action_just_pressed("toggle_build_mode"): + is_active = not is_active + get_viewport().set_input_as_handled() + return + + if not is_active: + build_preview.hide() + return + + build_preview.show() + + if Input.is_action_just_pressed("rotate_clockwise"): + build_preview.global_basis = build_preview.basis.rotated(Vector3.UP, deg_to_rad(45)) + if Input.is_action_just_pressed("rotate_counter_clockwise"): + build_preview.global_basis = build_preview.basis.rotated(Vector3.UP, -deg_to_rad(45)) diff --git a/ui/game_menu_ui.gd b/ui/game_menu_ui.gd index 8839776..2f637ae 100644 --- a/ui/game_menu_ui.gd +++ b/ui/game_menu_ui.gd @@ -1,4 +1,4 @@ -extends PanelContainer +extends Panel func _unhandled_key_input(event:InputEvent): var key_event:InputEventKey = event as InputEventKey diff --git a/ui/item_grid.gd b/ui/item_grid.gd index b9f6fd3..164be6f 100644 --- a/ui/item_grid.gd +++ b/ui/item_grid.gd @@ -16,7 +16,7 @@ func displayStacks(item_stacks:Array[ItemStack]): if item_stack != null: slot.display(item_stack) - + var item_count = rows * columns while get_child_count() < item_count: diff --git a/ui/item_slot.gd b/ui/item_slot.gd index 1123142..fd53ce3 100644 --- a/ui/item_slot.gd +++ b/ui/item_slot.gd @@ -1,17 +1,23 @@ class_name ItemSlot -extends PanelContainer +extends Panel enum { ALLOW_DRAG = 1, ALLOW_DROP = 2 } +@onready var highlight_panel = %HighlightPanel @onready var texture_rect:TextureRect = %TextureRect @onready var count_label = %CountLabel var drag_drop_flags:int = 0 var _item_stack:ItemStack = null +var highlighted:bool = false : set = _set_highlighted + +func _set_highlighted(new_state): + highlight_panel.visible = new_state + func set_drag_drop_flags(flags:int) -> void: drag_drop_flags = flags @@ -22,6 +28,8 @@ func _process(_delta)->void: if _item_stack == null: return + theme_type_variation = "PanelHighlighted" + if _item_stack.count == 0: texture_rect.texture = null update_quantity_text(0) diff --git a/ui/item_slot.tscn b/ui/item_slot.tscn index f3edd6a..3d793f0 100644 --- a/ui/item_slot.tscn +++ b/ui/item_slot.tscn @@ -1,18 +1,69 @@ -[gd_scene load_steps=2 format=3 uid="uid://dp3fi0g53qrt2"] +[gd_scene load_steps=4 format=3 uid="uid://dp3fi0g53qrt2"] [ext_resource type="Script" path="res://ui/item_slot.gd" id="1_7v5l8"] +[ext_resource type="Texture2D" uid="uid://16ro4vt2obea" path="res://assets/resources/tree_log.png" id="2_v3rb5"] -[node name="ItemSlot" type="PanelContainer"] +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_vadli"] +bg_color = Color(0.6, 0.6, 0.6, 0) +border_width_left = 4 +border_width_top = 4 +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(1, 1, 1, 1) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 +expand_margin_left = 3.0 +expand_margin_top = 3.0 +expand_margin_right = 3.0 +expand_margin_bottom = 3.0 +anti_aliasing = false + +[node name="ItemSlot" type="Panel"] custom_minimum_size = Vector2(64, 64) script = ExtResource("1_7v5l8") +[node name="HighlightPanel" type="Panel" parent="."] +unique_name_in_owner = true +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_vadli") + [node name="TextureRect" type="TextureRect" parent="."] unique_name_in_owner = true -layout_mode = 2 +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -32.0 +offset_top = -32.0 +offset_right = 32.0 +offset_bottom = 32.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("2_v3rb5") expand_mode = 3 -[node name="CountLabel" type="Label" parent="."] +[node name="CountLabel" type="Label" parent="TextureRect"] unique_name_in_owner = true -layout_mode = 2 +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -10.0 +offset_top = -23.0 +grow_horizontal = 0 +grow_vertical = 0 size_flags_horizontal = 8 size_flags_vertical = 8 +text = "4" diff --git a/ui/theme_preview.tscn b/ui/theme_preview.tscn new file mode 100644 index 0000000..ecb0dae --- /dev/null +++ b/ui/theme_preview.tscn @@ -0,0 +1,30 @@ +[gd_scene load_steps=3 format=3 uid="uid://viy2a4n6vl74"] + +[ext_resource type="PackedScene" uid="uid://bwui4acukq4x6" path="res://ui/ItemGrid.tscn" id="1_1xrix"] +[ext_resource type="PackedScene" uid="uid://dp3fi0g53qrt2" path="res://ui/item_slot.tscn" id="2_gy0b5"] + +[node name="ThemePreview" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Panel" type="PanelContainer" parent="."] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="ItemGrid" parent="Panel" instance=ExtResource("1_1xrix")] +layout_mode = 2 + +[node name="ItemSlot2" parent="Panel/ItemGrid" instance=ExtResource("2_gy0b5")] +layout_mode = 2 +theme_type_variation = &"HighlightedPanel" + +[node name="ItemSlot3" parent="Panel/ItemGrid" instance=ExtResource("2_gy0b5")] +layout_mode = 2 + +[node name="ItemSlot4" parent="Panel/ItemGrid" instance=ExtResource("2_gy0b5")] +layout_mode = 2 diff --git a/ui/ui_theme.tres b/ui/ui_theme.tres index 0202215..39dde98 100644 --- a/ui/ui_theme.tres +++ b/ui/ui_theme.tres @@ -1,10 +1,44 @@ -[gd_resource type="Theme" load_steps=14 format=3 uid="uid://dmk7hc81l8gbw"] +[gd_resource type="Theme" load_steps=21 format=3 uid="uid://dmk7hc81l8gbw"] [ext_resource type="FontFile" uid="uid://cjxqdamvrjlij" path="res://assets/fonts/upheaval/upheavtt.ttf" id="1_7nu7u"] [ext_resource type="Texture2D" uid="uid://bnwqllx51sdg2" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/buttonLong_grey.png" id="1_46x8x"] [ext_resource type="Texture2D" uid="uid://b4quo8qstm60p" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/panelInset_blue.png" id="2_oiu0i"] -[ext_resource type="Texture2D" uid="uid://beaqo323661rh" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/panel_blue.png" id="2_p2gq5"] [ext_resource type="StyleBox" uid="uid://bh2a2lhk5hwi1" path="res://ui/ui_theme_panel_style.tres" id="4_g0sjm"] +[ext_resource type="Texture2D" uid="uid://devo76y2eb4k5" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/panel_beigeLight.png" id="5_h2fxn"] +[ext_resource type="Texture2D" uid="uid://beaqo323661rh" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/panel_blue.png" id="8_caxsj"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_1ume3"] +content_margin_left = 4.0 +content_margin_top = 4.0 +content_margin_right = 4.0 +content_margin_bottom = 4.0 +bg_color = Color(0.1, 0.1, 0.1, 0.3) +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 +corner_detail = 5 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rm8a3"] +content_margin_left = 4.0 +content_margin_top = 4.0 +content_margin_right = 4.0 +content_margin_bottom = 4.0 +bg_color = Color(1, 1, 1, 0.75) +draw_center = false +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +corner_radius_top_left = 3 +corner_radius_top_right = 3 +corner_radius_bottom_right = 3 +corner_radius_bottom_left = 3 +corner_detail = 5 +expand_margin_left = 2.0 +expand_margin_top = 2.0 +expand_margin_right = 2.0 +expand_margin_bottom = 2.0 [sub_resource type="StyleBoxTexture" id="StyleBoxTexture_a84rd"] texture = ExtResource("1_46x8x") @@ -44,6 +78,21 @@ axis_stretch_horizontal = 2 axis_stretch_vertical = 1 modulate_color = Color(0.821789, 0.821789, 0.821789, 1) +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_k8b76"] +texture = ExtResource("8_caxsj") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 +modulate_color = Color(1, 0, 0, 1) + +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_1pdgo"] +texture = ExtResource("5_h2fxn") +texture_margin_left = 8.0 +texture_margin_top = 8.0 +texture_margin_right = 8.0 +texture_margin_bottom = 8.0 + [sub_resource type="StyleBoxTexture" id="StyleBoxTexture_kl7i7"] texture = ExtResource("2_oiu0i") texture_margin_left = 8.0 @@ -56,8 +105,8 @@ modulate_color = Color(0.821789, 0.821789, 0.821789, 1) [sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_supoq"] -[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_47eau"] -texture = ExtResource("2_p2gq5") +[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_g78k6"] +texture = ExtResource("8_caxsj") texture_margin_left = 8.0 texture_margin_top = 8.0 texture_margin_right = 8.0 @@ -65,6 +114,10 @@ texture_margin_bottom = 8.0 axis_stretch_horizontal = 2 axis_stretch_vertical = 2 +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xw22e"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_tyjme"] + [sub_resource type="StyleBoxTexture" id="StyleBoxTexture_22g74"] texture = ExtResource("2_oiu0i") texture_margin_left = 8.0 @@ -78,10 +131,32 @@ modulate_color = Color(0.760784, 0.760784, 0.760784, 1) [resource] default_font = ExtResource("1_7nu7u") default_font_size = 24 +Button/colors/font_color = Color(0.875, 0.875, 0.875, 1) +Button/colors/font_disabled_color = Color(0.875, 0.875, 0.875, 0.5) +Button/colors/font_focus_color = Color(0.95, 0.95, 0.95, 1) +Button/colors/font_hover_color = Color(0.95, 0.95, 0.95, 1) +Button/colors/font_hover_pressed_color = Color(1, 1, 1, 1) +Button/colors/font_outline_color = Color(1, 1, 1, 1) +Button/colors/font_pressed_color = Color(1, 1, 1, 1) +Button/colors/icon_disabled_color = Color(1, 1, 1, 0.4) +Button/colors/icon_focus_color = Color(1, 1, 1, 1) +Button/colors/icon_hover_color = Color(1, 1, 1, 1) +Button/colors/icon_hover_pressed_color = Color(1, 1, 1, 1) +Button/colors/icon_normal_color = Color(1, 1, 1, 1) +Button/colors/icon_pressed_color = Color(1, 1, 1, 1) +Button/constants/h_separation = 4 +Button/constants/icon_max_width = 0 +Button/constants/outline_size = 0 +Button/styles/disabled = SubResource("StyleBoxFlat_1ume3") +Button/styles/focus = SubResource("StyleBoxFlat_rm8a3") Button/styles/hover = SubResource("StyleBoxTexture_a84rd") Button/styles/normal = SubResource("StyleBoxTexture_votra") +Button/styles/panel = ExtResource("4_g0sjm") Button/styles/pressed = SubResource("StyleBoxTexture_bpyb5") Control/styles/normal = SubResource("StyleBoxTexture_72pk6") +HighlightedPanel/base_type = &"Panel" +HighlightedPanel/styles/normal = SubResource("StyleBoxTexture_k8b76") +HighlightedPanel/styles/panel = SubResource("StyleBoxTexture_1pdgo") ItemList/styles/normal = SubResource("StyleBoxTexture_kl7i7") Label/colors/font_color = Color(1, 1, 1, 1) Label/colors/font_outline_color = Color(1, 1, 1, 1) @@ -93,8 +168,11 @@ Label/constants/shadow_offset_y = 1 Label/constants/shadow_outline_size = 1 Label/fonts/font = ExtResource("1_7nu7u") Label/styles/normal = SubResource("StyleBoxEmpty_supoq") -MarginContainer/styles/normal = ExtResource("4_g0sjm") -Panel/styles/normal = SubResource("StyleBoxTexture_47eau") -Panel/styles/panel = ExtResource("4_g0sjm") -PanelContainer/styles/panel = ExtResource("4_g0sjm") +Label/styles/panel = null +MarginContainer/styles/normal = null +Panel/styles/highlighted = null +Panel/styles/normal = null +Panel/styles/panel = SubResource("StyleBoxTexture_g78k6") +PanelContainer/styles/panel = SubResource("StyleBoxEmpty_xw22e") +RedButton/styles/panel = SubResource("StyleBoxFlat_tyjme") Tree/styles/panel = SubResource("StyleBoxTexture_22g74") diff --git a/ui/ui_theme_panel_style.tres b/ui/ui_theme_panel_style.tres index a25963b..d3b7549 100644 --- a/ui/ui_theme_panel_style.tres +++ b/ui/ui_theme_panel_style.tres @@ -1,9 +1,9 @@ [gd_resource type="StyleBoxTexture" load_steps=2 format=3 uid="uid://bh2a2lhk5hwi1"] -[ext_resource type="Texture2D" uid="uid://beaqo323661rh" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/panel_blue.png" id="1_2n7cr"] +[ext_resource type="Texture2D" uid="uid://57o4ow08ky5q" path="res://assets/3rdparty/kenney/ui-pack-rpg-expansion/PNG/buttonSquare_blue_pressed.png" id="1_2u4x2"] [resource] -texture = ExtResource("1_2n7cr") +texture = ExtResource("1_2u4x2") texture_margin_left = 8.0 texture_margin_top = 8.0 texture_margin_right = 8.0 diff --git a/utils/SpringDamper.gd b/utils/SpringDamper.gd index a5cb720..3ec3982 100644 --- a/utils/SpringDamper.gd +++ b/utils/SpringDamper.gd @@ -33,7 +33,6 @@ func calc(x, xt, h:float): func calc_clamped_speed(x, xt, h:float, s_max:float): var x_old = x - var v_old = v var x_new = calc(x, xt, h) var vel_new = (x_new - x_old) / h diff --git a/world/level.tscn b/world/level.tscn index 41bdc78..623d3f3 100644 --- a/world/level.tscn +++ b/world/level.tscn @@ -33,7 +33,7 @@ cell_center_x = false cell_center_y = false cell_center_z = false data = { -"cells": PackedInt32Array(1, 65534, 655374, 1, 65531, 655374, 4, 65534, 655374, 4, 65531, 655374, 65534, 1, 655374, 1, 1, 655374, 4, 1, 655374, 7, 1, 655374, 7, 65534, 655374, 7, 65531, 655374, 7, 65528, 655374, 4, 65528, 13, 13, 1, 13, 13, 65534, 13, 13, 65531, 13, 13, 65528, 13, 65531, 65528, 1048590, 65531, 65531, 1048590, 65531, 65534, 1048590, 65531, 1, 1048590, 65531, 65525, 1048590, 65534, 65525, 1048590, 1, 65525, 1048590, 4, 65525, 1048590, 7, 65525, 1048590, 13, 65525, 13, 7, 65522, 1048590, 4, 65522, 1048590, 1, 65522, 1048590, 65534, 65522, 1048590, 65531, 65522, 1048590, 65531, 4, 1048590, 65534, 4, 1048590, 1, 4, 1048590, 4, 4, 1048590, 7, 4, 1048590, 65543, 65527, 9, 65541, 65527, 9, 131067, 65527, 9, 131066, 65529, 1441801, 131066, 4, 1441801, 131068, 5, 655369, 131071, 5, 655369, 65538, 5, 655369, 65541, 5, 655369, 65543, 5, 9, 65544, 4, 1441801, 65544, 1, 1441801, 15, 65521, 13, 15, 65522, 13, 15, 65523, 13, 15, 65524, 13, 15, 65525, 13, 15, 65526, 13, 16, 65527, 13, 16, 65528, 13, 15, 65528, 13, 15, 65529, 13, 15, 65530, 13, 65534, 65528, 13, 65534, 65529, 13, 65534, 65530, 13, 65534, 65531, 13, 65534, 65532, 13, 65534, 65533, 13, 65534, 65534, 13, 65534, 65535, 13, 65535, 65535, 13, 65535, 65534, 13, 65535, 65533, 13, 65535, 65532, 13, 65535, 65531, 13, 65535, 65530, 13, 65535, 65529, 13, 65535, 65528, 13, 65535, 65527, 13, 65534, 65527, 13, 65533, 65527, 13, 65533, 65526, 13, 65532, 65528, 13, 65533, 65528, 13, 0, 65528, 13, 0, 65527, 13, 1, 65527, 13, 1, 65528, 13, 2, 65528, 13, 3, 65528, 13, 5, 65528, 13, 12, 65521, 13, 12, 65522, 13, 12, 65523, 13, 12, 65524, 13, 12, 65525, 13, 12, 65526, 13, 12, 65527, 13, 12, 65528, 13, 12, 65529, 13, 12, 65530, 13, 12, 65531, 13, 12, 65532, 13, 12, 65533, 13, 12, 65534, 13, 12, 65535, 13, 12, 0, 13, 12, 1, 13, 12, 2, 13, 13, 65521, 13, 13, 65522, 13, 13, 65523, 13, 13, 65524, 13, 13, 65526, 13, 13, 65527, 13, 13, 65529, 13, 13, 65530, 13, 13, 65532, 13, 13, 65533, 13, 13, 65535, 13, 13, 0, 13, 13, 2, 13, 14, 65521, 13, 14, 65522, 13, 14, 65523, 13, 14, 65524, 13, 14, 65525, 13, 14, 65526, 13, 14, 65527, 13, 14, 65528, 13, 14, 65529, 13, 14, 65530, 13, 14, 65531, 13, 14, 65532, 13, 14, 65533, 13, 14, 65534, 13, 14, 65535, 13, 14, 0, 13, 14, 1, 13, 14, 2, 13, 15, 65527, 13, 15, 65531, 13, 15, 65532, 13, 15, 65533, 13, 15, 65534, 13, 15, 65535, 13, 15, 0, 13, 15, 1, 13, 15, 2, 13, 16, 65521, 13, 16, 65522, 13, 16, 65523, 13, 16, 65524, 13, 16, 65525, 13, 16, 65526, 13, 16, 65529, 13, 16, 65530, 13, 16, 65531, 13, 16, 65532, 13, 16, 65533, 13, 16, 65534, 13, 16, 65535, 13, 16, 0, 13, 16, 1, 13, 16, 2, 13, 17, 65521, 13, 17, 65522, 13, 17, 65523, 13, 17, 65524, 13, 17, 65525, 13, 17, 65526, 13, 17, 65527, 13, 17, 65528, 13, 17, 65529, 13, 17, 65530, 13, 17, 65531, 13, 17, 65532, 13, 17, 65533, 13, 17, 65534, 13, 17, 65535, 13, 17, 0, 13, 17, 1, 13, 17, 2, 13, 18, 65521, 13, 18, 65522, 13, 18, 65523, 13, 18, 65524, 13, 18, 65525, 13, 18, 65526, 13, 18, 65527, 13, 18, 65528, 13, 18, 65529, 13, 18, 65530, 13, 18, 65531, 13, 18, 65532, 13, 18, 65533, 13, 18, 65534, 13, 18, 65535, 13, 18, 0, 13, 18, 1, 13, 18, 2, 13, 19, 65521, 13, 19, 65522, 13, 19, 65523, 13, 19, 65524, 13, 19, 65525, 13, 19, 65526, 13, 19, 65527, 13, 19, 65528, 13, 19, 65529, 13, 19, 65530, 13, 19, 65531, 13, 19, 65532, 13, 19, 65533, 13, 19, 65534, 13, 19, 65535, 13, 19, 0, 13, 19, 1, 13, 19, 2, 13, 20, 65521, 13, 20, 65522, 13, 20, 65523, 13, 20, 65524, 13, 20, 65525, 13, 20, 65526, 13, 20, 65527, 13, 20, 65528, 13, 20, 65529, 13, 20, 65530, 13, 20, 65531, 13, 20, 65532, 13, 20, 65533, 13, 20, 65534, 13, 20, 65535, 13, 20, 0, 13, 20, 1, 13, 20, 2, 13, 21, 65521, 13, 21, 65522, 13, 21, 65523, 13, 21, 65524, 13, 21, 65525, 13, 21, 65526, 13, 21, 65527, 13, 21, 65528, 13, 21, 65529, 13, 21, 65530, 13, 21, 65531, 13, 21, 65532, 13, 21, 65533, 13, 21, 65534, 13, 21, 65535, 13, 21, 0, 13, 21, 1, 13, 21, 2, 13, 22, 65521, 13, 22, 65522, 13, 22, 65523, 13, 22, 65524, 13, 22, 65525, 13, 22, 65526, 13, 22, 65527, 13, 22, 65528, 13, 22, 65529, 13, 22, 65530, 13, 22, 65531, 13, 22, 65532, 13, 22, 65533, 13, 22, 65534, 13, 22, 65535, 13, 22, 0, 13, 22, 1, 13, 22, 2, 13, 23, 65521, 13, 23, 65522, 13, 23, 65523, 13, 23, 65524, 13, 23, 65525, 13, 23, 65526, 13, 23, 65527, 13, 23, 65528, 13, 23, 65529, 13, 23, 65530, 13, 23, 65531, 13, 23, 65532, 13, 23, 65533, 13, 23, 65534, 13, 23, 65535, 13, 23, 0, 13, 23, 1, 13, 23, 2, 13, 24, 65521, 13, 24, 65522, 13, 24, 65523, 13, 24, 65524, 13, 24, 65525, 13, 24, 65526, 13, 24, 65527, 13, 24, 65528, 13, 24, 65529, 13, 24, 65530, 13, 24, 65531, 13, 24, 65532, 13, 24, 65533, 13, 24, 65534, 13, 24, 65535, 13, 24, 0, 13, 24, 1, 13, 24, 2, 13, 25, 65521, 13, 25, 65522, 13, 25, 65523, 13, 25, 65524, 13, 25, 65525, 13, 25, 65526, 13, 25, 65527, 13, 25, 65528, 13, 25, 65529, 13, 25, 65530, 13, 25, 65531, 13, 25, 65532, 13, 25, 65533, 13, 25, 65534, 13, 25, 65535, 13, 25, 0, 13, 25, 1, 13, 25, 2, 13, 26, 65521, 13, 26, 65522, 13, 26, 65523, 13, 26, 65524, 13, 26, 65525, 13, 26, 65526, 13, 26, 65527, 13, 26, 65528, 13, 26, 65529, 13, 26, 65530, 13, 26, 65531, 13, 26, 65532, 13, 26, 65533, 13, 26, 65534, 13, 26, 65535, 13, 26, 0, 13, 26, 1, 13, 26, 2, 13, 27, 65521, 13, 27, 65522, 13, 27, 65523, 13, 27, 65524, 13, 27, 65525, 13, 27, 65526, 13, 27, 65527, 13, 27, 65528, 13, 27, 65529, 13, 27, 65530, 13, 27, 65531, 13, 27, 65532, 13, 27, 65533, 13, 27, 65534, 13, 27, 65535, 13, 27, 0, 13, 27, 1, 13, 27, 2, 13, 28, 65521, 13, 28, 65522, 13, 28, 65523, 13, 28, 65524, 13, 28, 65525, 13, 28, 65526, 13, 28, 65527, 13, 28, 65528, 13, 28, 65529, 13, 28, 65530, 13, 28, 65531, 13, 28, 65532, 13, 28, 65533, 13, 28, 65534, 13, 28, 65535, 13, 28, 0, 13, 28, 1, 13, 28, 2, 13, 29, 65521, 13, 29, 65522, 13, 29, 65523, 13, 29, 65524, 13, 29, 65525, 13, 29, 65526, 13, 29, 65527, 13, 29, 65528, 13, 29, 65529, 13, 29, 65530, 13, 29, 65531, 13, 29, 65532, 13, 29, 65533, 13, 29, 65534, 13, 29, 65535, 13, 29, 0, 13, 29, 1, 13, 29, 2, 13, 30, 65521, 13, 30, 65522, 13, 30, 65523, 13, 30, 65524, 13, 30, 65525, 13, 30, 65526, 13, 30, 65527, 13, 30, 65528, 13, 30, 65529, 13, 30, 65530, 13, 30, 65531, 13, 30, 65532, 13, 30, 65533, 13, 30, 65534, 13, 30, 65535, 13, 30, 0, 13, 30, 1, 13, 30, 2, 13, 31, 65521, 13, 31, 65522, 13, 31, 65523, 13, 31, 65524, 13, 31, 65525, 13, 31, 65526, 13, 31, 65527, 13, 31, 65528, 13, 31, 65529, 13, 31, 65530, 13, 31, 65531, 13, 31, 65532, 13, 31, 65533, 13, 31, 65534, 13, 31, 65535, 13, 31, 0, 13, 31, 1, 13, 31, 2, 13, 32, 65521, 13, 32, 65522, 13, 32, 65523, 13, 32, 65524, 13, 32, 65525, 13, 32, 65526, 13, 32, 65527, 13, 32, 65528, 13, 32, 65529, 13, 32, 65530, 13, 32, 65531, 13, 32, 65532, 13, 32, 65533, 13, 32, 65534, 13, 32, 65535, 13, 32, 0, 13, 32, 1, 13, 32, 2, 13, 3, 65517, 13, 0, 65517, 13, 65535, 65517, 13, 131067, 65532, 655377, 131066, 65532, 27, 131066, 65533, 27, 131067, 65533, 655377, 131066, 65534, 27, 131067, 65535, 655377, 131066, 0, 655377, 131067, 1, 655377, 131064, 65525, 27, 131063, 65525, 655377, 131063, 65526, 655377, 131064, 65526, 27, 131062, 65524, 655377, 65539, 65528, 655377, 65552, 65516, 27, 65550, 65517, 27, 65549, 65517, 27, 65547, 65517, 27, 65546, 65518, 27, 65545, 65518, 27, 65544, 65518, 27, 65543, 65517, 27, 65543, 65516, 27, 65544, 65516, 27, 65545, 65516, 27, 65547, 65516, 27, 65548, 65515, 27, 65548, 65516, 27, 65549, 65516, 27, 65550, 65516, 27, 65551, 65515, 27, 65552, 65515, 27, 65552, 65517, 27, 65551, 65517, 27, 65548, 65517, 27, 65546, 65517, 27, 65546, 65516, 27, 65545, 65515, 27, 65544, 65515, 27, 65543, 65515, 27, 65542, 65517, 27, 65542, 65518, 27, 65542, 65519, 27, 65543, 65519, 27, 65544, 65519, 27, 65545, 65520, 27, 65544, 65520, 27, 65543, 65520, 27, 65542, 65520, 27, 65541, 65520, 27, 65540, 65520, 27, 65539, 65519, 27, 65537, 65519, 27, 131070, 65519, 27, 131067, 65519, 27, 131066, 65519, 27, 131064, 65519, 27, 131065, 65519, 27, 131068, 65519, 27, 131069, 65519, 27, 65536, 65520, 27, 65538, 65520, 27, 65539, 65520, 27, 65537, 65520, 27, 131071, 65520, 27, 131070, 65520, 27, 131068, 65520, 27, 131067, 65520, 27, 131066, 65520, 27, 131065, 65520, 27, 131065, 65521, 27, 131064, 65521, 27, 131064, 65522, 27, 131064, 65523, 27, 131064, 65524, 27, 131065, 65526, 27, 65545, 65521, 27, 65546, 65522, 27, 65546, 65523, 27, 65546, 65524, 27, 65545, 65525, 27, 65545, 65526, 27, 65546, 65525, 27, 65546, 65526, 27, 65546, 65520, 27, 65546, 65521, 27, 65547, 65520, 27, 65547, 65519, 27, 65548, 65519, 27, 65550, 65519, 27, 65551, 65519, 27, 65552, 65519, 27, 65553, 65519, 27, 65554, 65519, 27, 65555, 65519, 27, 65553, 65520, 27, 65552, 65520, 27, 65549, 65519, 27, 65551, 65520, 27, 65550, 65520, 27, 65549, 65520, 27, 65548, 65520, 27, 65554, 65525, 27, 65554, 65526, 27, 65554, 65527, 27, 65554, 65528, 27, 65554, 65529, 27, 65555, 65529, 27, 65556, 65529, 27, 65556, 65528, 27, 65555, 65528, 27, 65553, 65527, 27, 131066, 65531, 27, 131066, 65530, 27, 131066, 65535, 27) +"cells": PackedInt32Array(1, 65534, 655374, 1, 65531, 655374, 4, 65534, 655374, 4, 65531, 655374, 65534, 1, 655374, 1, 1, 655374, 4, 1, 655374, 7, 1, 655374, 7, 65534, 655374, 7, 65531, 655374, 7, 65528, 655374, 4, 65528, 13, 13, 1, 13, 13, 65534, 13, 13, 65531, 13, 13, 65528, 13, 65531, 65528, 1048590, 65531, 65531, 1048590, 65531, 65534, 1048590, 65531, 1, 1048590, 65531, 65525, 1048590, 65534, 65525, 1048590, 1, 65525, 1048590, 4, 65525, 1048590, 7, 65525, 1048590, 13, 65525, 13, 7, 65522, 1048590, 4, 65522, 1048590, 1, 65522, 1048590, 65534, 65522, 1048590, 65531, 65522, 1048590, 65531, 4, 1048590, 65534, 4, 1048590, 1, 4, 1048590, 4, 4, 1048590, 7, 4, 1048590, 65543, 65527, 9, 65541, 65527, 9, 131067, 65527, 9, 131066, 65529, 1441801, 131066, 4, 1441801, 131068, 5, 655369, 131071, 5, 655369, 65538, 5, 655369, 65541, 5, 655369, 65543, 5, 9, 65544, 4, 1441801, 65544, 1, 1441801, 15, 65521, 13, 15, 65522, 13, 15, 65523, 13, 15, 65524, 13, 15, 65525, 13, 15, 65526, 13, 16, 65527, 13, 16, 65528, 13, 15, 65528, 13, 15, 65529, 13, 15, 65530, 13, 65534, 65528, 13, 65534, 65529, 13, 65534, 65530, 13, 65534, 65531, 13, 65534, 65532, 13, 65534, 65533, 13, 65534, 65534, 13, 65534, 65535, 13, 65535, 65535, 13, 65535, 65534, 13, 65535, 65533, 13, 65535, 65532, 13, 65535, 65531, 13, 65535, 65530, 13, 65535, 65529, 13, 65535, 65528, 13, 65535, 65527, 13, 65534, 65527, 13, 65533, 65527, 13, 65533, 65526, 13, 65532, 65528, 13, 65533, 65528, 13, 0, 65528, 13, 0, 65527, 13, 1, 65527, 13, 1, 65528, 13, 2, 65528, 13, 3, 65528, 13, 5, 65528, 13, 12, 65521, 13, 12, 65522, 13, 12, 65523, 13, 12, 65524, 13, 12, 65525, 13, 12, 65526, 13, 12, 65527, 13, 12, 65528, 13, 12, 65529, 13, 12, 65530, 13, 12, 65531, 13, 12, 65532, 13, 12, 65533, 13, 12, 65534, 13, 12, 65535, 13, 12, 0, 13, 12, 1, 13, 12, 2, 13, 13, 65521, 13, 13, 65522, 13, 13, 65523, 13, 13, 65524, 13, 13, 65526, 13, 13, 65527, 13, 13, 65529, 13, 13, 65530, 13, 13, 65532, 13, 13, 65533, 13, 13, 65535, 13, 13, 0, 13, 13, 2, 13, 14, 65521, 13, 14, 65522, 13, 14, 65523, 13, 14, 65524, 13, 14, 65525, 13, 14, 65526, 13, 14, 65527, 13, 14, 65528, 13, 14, 65529, 13, 14, 65530, 13, 14, 65531, 13, 14, 65532, 13, 14, 65533, 13, 14, 65534, 13, 14, 65535, 13, 14, 0, 13, 14, 1, 13, 14, 2, 13, 15, 65527, 13, 15, 65531, 13, 15, 65532, 13, 15, 65533, 13, 15, 65534, 13, 15, 65535, 13, 15, 0, 13, 15, 1, 13, 15, 2, 13, 16, 65521, 13, 16, 65522, 13, 16, 65523, 13, 16, 65524, 13, 16, 65525, 13, 16, 65526, 13, 16, 65529, 13, 16, 65530, 13, 16, 65531, 13, 16, 65532, 13, 16, 65533, 13, 16, 65534, 13, 16, 65535, 13, 16, 0, 13, 16, 1, 13, 16, 2, 13, 17, 65521, 13, 17, 65522, 13, 17, 65523, 13, 17, 65524, 13, 17, 65525, 13, 17, 65526, 13, 17, 65527, 13, 17, 65528, 13, 17, 65529, 13, 17, 65530, 13, 17, 65531, 13, 17, 65532, 13, 17, 65533, 13, 17, 65534, 13, 17, 65535, 13, 17, 0, 13, 17, 1, 13, 17, 2, 13, 18, 65521, 13, 18, 65522, 13, 18, 65523, 13, 18, 65524, 13, 18, 65525, 13, 18, 65526, 13, 18, 65527, 13, 18, 65528, 13, 18, 65529, 13, 18, 65530, 13, 18, 65531, 13, 18, 65532, 13, 18, 65533, 13, 18, 65534, 13, 18, 65535, 13, 18, 0, 13, 18, 1, 13, 18, 2, 13, 19, 65521, 13, 19, 65522, 13, 19, 65523, 13, 19, 65524, 13, 19, 65525, 13, 19, 65526, 13, 19, 65527, 13, 19, 65528, 13, 19, 65529, 13, 19, 65530, 13, 19, 65531, 13, 19, 65532, 13, 19, 65533, 13, 19, 65534, 13, 19, 65535, 13, 19, 0, 13, 19, 1, 13, 19, 2, 13, 20, 65521, 13, 20, 65522, 13, 20, 65523, 13, 20, 65524, 13, 20, 65525, 13, 20, 65526, 13, 20, 65527, 13, 20, 65528, 13, 20, 65529, 13, 20, 65530, 13, 20, 65531, 13, 20, 65532, 13, 20, 65533, 13, 20, 65534, 13, 20, 65535, 13, 20, 0, 13, 20, 1, 13, 20, 2, 13, 21, 65521, 13, 21, 65522, 13, 21, 65523, 13, 21, 65524, 13, 21, 65525, 13, 21, 65526, 13, 21, 65527, 13, 21, 65528, 13, 21, 65529, 13, 21, 65530, 13, 21, 65531, 13, 21, 65532, 13, 21, 65533, 13, 21, 65534, 13, 21, 65535, 13, 21, 0, 13, 21, 1, 13, 21, 2, 13, 22, 65521, 13, 22, 65522, 13, 22, 65523, 13, 22, 65524, 13, 22, 65525, 13, 22, 65526, 13, 22, 65527, 13, 22, 65528, 13, 22, 65529, 13, 22, 65530, 13, 22, 65531, 13, 22, 65532, 13, 22, 65533, 13, 22, 65534, 13, 22, 65535, 13, 22, 0, 13, 22, 1, 13, 22, 2, 13, 23, 65521, 13, 23, 65522, 13, 23, 65523, 13, 23, 65524, 13, 23, 65525, 13, 23, 65526, 13, 23, 65527, 13, 23, 65528, 13, 23, 65529, 13, 23, 65530, 13, 23, 65531, 13, 23, 65532, 13, 23, 65533, 13, 23, 65534, 13, 23, 65535, 13, 23, 0, 13, 23, 1, 13, 23, 2, 13, 24, 65521, 13, 24, 65522, 13, 24, 65523, 13, 24, 65524, 13, 24, 65525, 13, 24, 65526, 13, 24, 65527, 13, 24, 65528, 13, 24, 65529, 13, 24, 65530, 13, 24, 65531, 13, 24, 65532, 13, 24, 65533, 13, 24, 65534, 13, 24, 65535, 13, 24, 0, 13, 24, 1, 13, 24, 2, 13, 25, 65521, 13, 25, 65522, 13, 25, 65523, 13, 25, 65524, 13, 25, 65525, 13, 25, 65526, 13, 25, 65527, 13, 25, 65528, 13, 25, 65529, 13, 25, 65530, 13, 25, 65531, 13, 25, 65532, 13, 25, 65533, 13, 25, 65534, 13, 25, 65535, 13, 25, 0, 13, 25, 1, 13, 25, 2, 13, 26, 65521, 13, 26, 65522, 13, 26, 65523, 13, 26, 65524, 13, 26, 65525, 13, 26, 65526, 13, 26, 65527, 13, 26, 65528, 13, 26, 65529, 13, 26, 65530, 13, 26, 65531, 13, 26, 65532, 13, 26, 65533, 13, 26, 65534, 13, 26, 65535, 13, 26, 0, 13, 26, 1, 13, 26, 2, 13, 27, 65521, 13, 27, 65522, 13, 27, 65523, 13, 27, 65524, 13, 27, 65525, 13, 27, 65526, 13, 27, 65527, 13, 27, 65528, 13, 27, 65529, 13, 27, 65530, 13, 27, 65531, 13, 27, 65532, 13, 27, 65533, 13, 27, 65534, 13, 27, 65535, 13, 27, 0, 13, 27, 1, 13, 27, 2, 13, 28, 65521, 13, 28, 65522, 13, 28, 65523, 13, 28, 65524, 13, 28, 65525, 13, 28, 65526, 13, 28, 65527, 13, 28, 65528, 13, 28, 65529, 13, 28, 65530, 13, 28, 65531, 13, 28, 65532, 13, 28, 65533, 13, 28, 65534, 13, 28, 65535, 13, 28, 0, 13, 28, 1, 13, 28, 2, 13, 29, 65521, 13, 29, 65522, 13, 29, 65523, 13, 29, 65524, 13, 29, 65525, 13, 29, 65526, 13, 29, 65527, 13, 29, 65528, 13, 29, 65529, 13, 29, 65530, 13, 29, 65531, 13, 29, 65532, 13, 29, 65533, 13, 29, 65534, 13, 29, 65535, 13, 29, 0, 13, 29, 1, 13, 29, 2, 13, 30, 65521, 13, 30, 65522, 13, 30, 65523, 13, 30, 65524, 13, 30, 65525, 13, 30, 65526, 13, 30, 65527, 13, 30, 65528, 13, 30, 65529, 13, 30, 65530, 13, 30, 65531, 13, 30, 65532, 13, 30, 65533, 13, 30, 65534, 13, 30, 65535, 13, 30, 0, 13, 30, 1, 13, 30, 2, 13, 31, 65521, 13, 31, 65522, 13, 31, 65523, 13, 31, 65524, 13, 31, 65525, 13, 31, 65526, 13, 31, 65527, 13, 31, 65528, 13, 31, 65529, 13, 31, 65530, 13, 31, 65531, 13, 31, 65532, 13, 31, 65533, 13, 31, 65534, 13, 31, 65535, 13, 31, 0, 13, 31, 1, 13, 31, 2, 13, 32, 65521, 13, 32, 65522, 13, 32, 65523, 13, 32, 65524, 13, 32, 65525, 13, 32, 65526, 13, 32, 65527, 13, 32, 65528, 13, 32, 65529, 13, 32, 65530, 13, 32, 65531, 13, 32, 65532, 13, 32, 65533, 13, 32, 65534, 13, 32, 65535, 13, 32, 0, 13, 32, 1, 13, 32, 2, 13, 3, 65517, 13, 0, 65517, 13, 65535, 65517, 13, 131067, 65532, 655377, 131066, 65532, 27, 131066, 65533, 27, 131067, 65533, 655377, 131066, 65534, 27, 131067, 65535, 655377, 131066, 0, 655377, 131067, 1, 655377, 131064, 65525, 27, 131063, 65525, 655377, 131063, 65526, 655377, 131064, 65526, 27, 131062, 65524, 655377, 65539, 65528, 655377, 65552, 65516, 27, 65550, 65517, 27, 65549, 65517, 27, 65547, 65517, 27, 65546, 65518, 27, 65545, 65518, 27, 65544, 65518, 27, 65543, 65517, 27, 65543, 65516, 27, 65544, 65516, 27, 65545, 65516, 27, 65547, 65516, 27, 65548, 65515, 27, 65548, 65516, 27, 65549, 65516, 27, 65550, 65516, 27, 65551, 65515, 27, 65552, 65515, 27, 65552, 65517, 27, 65551, 65517, 27, 65548, 65517, 27, 65546, 65517, 27, 65546, 65516, 27, 65545, 65515, 27, 65544, 65515, 27, 65543, 65515, 27, 65542, 65517, 27, 65542, 65518, 27, 65542, 65519, 27, 65543, 65519, 27, 65544, 65519, 27, 65545, 65520, 27, 65544, 65520, 27, 65543, 65520, 27, 65542, 65520, 27, 65541, 65520, 27, 65540, 65520, 27, 65539, 65519, 27, 65537, 65519, 27, 131070, 65519, 27, 131067, 65519, 27, 131066, 65519, 27, 131064, 65519, 27, 131065, 65519, 27, 131068, 65519, 27, 131069, 65519, 27, 65536, 65520, 27, 65538, 65520, 27, 65539, 65520, 27, 65537, 65520, 27, 131071, 65520, 27, 131070, 65520, 27, 131068, 65520, 27, 131067, 65520, 27, 131066, 65520, 27, 131065, 65520, 27, 131065, 65521, 27, 131064, 65521, 27, 131064, 65522, 27, 131064, 65523, 27, 131064, 65524, 27, 131065, 65526, 27, 65545, 65521, 27, 65546, 65522, 27, 65546, 65523, 27, 65546, 65524, 27, 65545, 65525, 27, 65545, 65526, 27, 65546, 65525, 27, 65546, 65526, 27, 65546, 65520, 27, 65546, 65521, 27, 65547, 65520, 27, 65547, 65519, 27, 65548, 65519, 27, 65550, 65519, 27, 65551, 65519, 27, 65552, 65519, 27, 65553, 65519, 27, 65554, 65519, 27, 65555, 65519, 27, 65553, 65520, 27, 65552, 65520, 27, 65549, 65519, 27, 65551, 65520, 27, 65550, 65520, 27, 65549, 65520, 27, 65548, 65520, 27, 65554, 65525, 27, 65554, 65526, 27, 65554, 65527, 27, 65554, 65528, 27, 65554, 65529, 27, 65555, 65529, 27, 65556, 65529, 27, 65556, 65528, 27, 65555, 65528, 27, 65553, 65527, 27, 131066, 65531, 27, 131066, 65530, 27, 131066, 65535, 27, 65536, 65529, 17, 65537, 65531, 18) } metadata/_editor_floor_ = Vector3(0, 1, 0)