From ca8cfee1e801e110f5989caa889326886ef83d96 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 6 Mar 2024 09:25:28 -0600 Subject: [PATCH] Added basic build menu and placement --- assets/scifi_tilesheet@2.png | Bin 122580 -> 122881 bytes .../advanced/advanced_building_group.tres | 14 +++ .../buildings/basic/basic_building_group.tres | 16 ++++ data/buildings/basic/harvester_building.tres | 18 ++++ data/buildings/basic/warehouse_building.tres | 20 ++++ {scripts => data/buildings}/building.gd | 3 +- data/buildings/building_base.gd | 13 +++ data/buildings/building_base.tscn | 8 ++ data/buildings/building_group.gd | 7 ++ data/buildings/corruptor.tres | 5 +- data/buildings/hub.tres | 10 +- .../build/advanced/build_advanced.tres | 13 +++ .../advanced/interaction_build_advanced.gd | 6 ++ .../interactions/build/basic/build_basic.tres | 13 +++ .../build/basic/interaction_build_basic.gd | 6 ++ data/interactions/build/interaction_build.gd | 6 +- project.godot | 10 +- scene/build_menu.tscn | 89 ++++++++++++++++++ scene/interaction_bar.tscn | 14 +++ scene/player.tscn | 1 + scripts/build_menu.gd | 67 +++++++++++++ scripts/cell_data.gd | 10 +- scripts/interaction_bar.gd | 13 +++ scripts/interaction_wheel.gd | 3 + scripts/player.gd | 39 ++++++-- 25 files changed, 377 insertions(+), 27 deletions(-) create mode 100644 data/buildings/advanced/advanced_building_group.tres create mode 100644 data/buildings/basic/basic_building_group.tres create mode 100644 data/buildings/basic/harvester_building.tres create mode 100644 data/buildings/basic/warehouse_building.tres rename {scripts => data/buildings}/building.gd (58%) create mode 100644 data/buildings/building_base.gd create mode 100644 data/buildings/building_base.tscn create mode 100644 data/buildings/building_group.gd create mode 100644 data/interactions/build/advanced/build_advanced.tres create mode 100644 data/interactions/build/advanced/interaction_build_advanced.gd create mode 100644 data/interactions/build/basic/build_basic.tres create mode 100644 data/interactions/build/basic/interaction_build_basic.gd create mode 100644 scene/build_menu.tscn create mode 100644 scene/interaction_bar.tscn create mode 100644 scripts/build_menu.gd create mode 100644 scripts/interaction_bar.gd diff --git a/assets/scifi_tilesheet@2.png b/assets/scifi_tilesheet@2.png index a90388e35443e1c21e74b65bab7c92753faf887d..bbc1acf267bf5de9b4ca96b2c6c975d26f359b8d 100644 GIT binary patch delta 18862 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 Lu6{1-oD!M<7)+w< delta 18495 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 diff --git a/data/buildings/advanced/advanced_building_group.tres b/data/buildings/advanced/advanced_building_group.tres new file mode 100644 index 0000000..c471109 --- /dev/null +++ b/data/buildings/advanced/advanced_building_group.tres @@ -0,0 +1,14 @@ +[gd_resource type="Resource" script_class="BuildingGroup" load_steps=4 format=3 uid="uid://cfeob1arfvw6p"] + +[ext_resource type="Script" path="res://data/buildings/building_group.gd" id="1_5u0lh"] +[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_hpowi"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_24mqt"] +atlas = ExtResource("1_hpowi") +region = Rect2(1088, 576, 64, 64) + +[resource] +script = ExtResource("1_5u0lh") +name = "Advanced" +atlas_texture = SubResource("AtlasTexture_24mqt") +buildings = Array[Resource("res://data/buildings/building.gd")]([]) diff --git a/data/buildings/basic/basic_building_group.tres b/data/buildings/basic/basic_building_group.tres new file mode 100644 index 0000000..579156d --- /dev/null +++ b/data/buildings/basic/basic_building_group.tres @@ -0,0 +1,16 @@ +[gd_resource type="Resource" script_class="BuildingGroup" load_steps=6 format=3 uid="uid://dqv53okb3evb7"] + +[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_p1crr"] +[ext_resource type="Script" path="res://data/buildings/building_group.gd" id="1_xphre"] +[ext_resource type="Resource" uid="uid://d38xgwstvtcm4" path="res://data/buildings/basic/harvester_building.tres" id="2_7d7fa"] +[ext_resource type="Resource" uid="uid://cta6ngelbwo8b" path="res://data/buildings/basic/warehouse_building.tres" id="3_vxs34"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_nleix"] +atlas = ExtResource("1_p1crr") +region = Rect2(1024, 576, 64, 64) + +[resource] +script = ExtResource("1_xphre") +name = "Basic" +atlas_texture = SubResource("AtlasTexture_nleix") +buildings = Array[Resource("res://data/buildings/building.gd")]([ExtResource("2_7d7fa"), ExtResource("3_vxs34")]) diff --git a/data/buildings/basic/harvester_building.tres b/data/buildings/basic/harvester_building.tres new file mode 100644 index 0000000..99958d6 --- /dev/null +++ b/data/buildings/basic/harvester_building.tres @@ -0,0 +1,18 @@ +[gd_resource type="Resource" script_class="Building" load_steps=5 format=3 uid="uid://d38xgwstvtcm4"] + +[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_8uuv4"] +[ext_resource type="Script" path="res://data/buildings/building.gd" id="1_s0c8c"] +[ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="2_ppxqc"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_5nxx0"] +atlas = ExtResource("1_8uuv4") +region = Rect2(1088, 128, 64, 64) + +[resource] +script = ExtResource("1_s0c8c") +atlas_texture = SubResource("AtlasTexture_5nxx0") +name = "Harvester" +description = "Harvests nearby" +cost = { +ExtResource("2_ppxqc"): 100 +} diff --git a/data/buildings/basic/warehouse_building.tres b/data/buildings/basic/warehouse_building.tres new file mode 100644 index 0000000..923800a --- /dev/null +++ b/data/buildings/basic/warehouse_building.tres @@ -0,0 +1,20 @@ +[gd_resource type="Resource" script_class="Building" load_steps=6 format=3 uid="uid://cta6ngelbwo8b"] + +[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_24f36"] +[ext_resource type="Script" path="res://data/buildings/building.gd" id="1_aylgh"] +[ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="2_s5ve8"] +[ext_resource type="Resource" uid="uid://dr00rd4f42jqe" path="res://data/game_resources/gem/gem_resource.tres" id="3_y57vu"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_pbx2g"] +atlas = ExtResource("1_24f36") +region = Rect2(1024, 64, 64, 64) + +[resource] +script = ExtResource("1_aylgh") +atlas_texture = SubResource("AtlasTexture_pbx2g") +name = "Warehouse" +description = "Allows storage of more materials" +cost = { +ExtResource("2_s5ve8"): 500, +ExtResource("3_y57vu"): 200 +} diff --git a/scripts/building.gd b/data/buildings/building.gd similarity index 58% rename from scripts/building.gd rename to data/buildings/building.gd index 28c3b77..e0bab39 100644 --- a/scripts/building.gd +++ b/data/buildings/building.gd @@ -1,8 +1,7 @@ class_name Building extends Resource -@export var corruption_pattern: ExpansionBase -@export var atlas_texture_region: Vector2i +@export var atlas_texture: AtlasTexture @export var name: String @export var description: String @export var cost: Dictionary diff --git a/data/buildings/building_base.gd b/data/buildings/building_base.gd new file mode 100644 index 0000000..5fa848f --- /dev/null +++ b/data/buildings/building_base.gd @@ -0,0 +1,13 @@ +extends Node2D +class_name BuildingBase + +var _building_data: Building + +@onready var sprite_2d: Sprite2D = $Sprite2D + +func initialize(data: Building, grid_location: Vector2i) -> void: + _building_data = data + position = Grid.grid_to_world_center(grid_location) + +func _ready() -> void: + sprite_2d.texture = _building_data.atlas_texture diff --git a/data/buildings/building_base.tscn b/data/buildings/building_base.tscn new file mode 100644 index 0000000..9448382 --- /dev/null +++ b/data/buildings/building_base.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=3 uid="uid://kij6k2k1rmxb"] + +[ext_resource type="Script" path="res://data/buildings/building_base.gd" id="1_odhat"] + +[node name="BuildingBase" type="Node2D"] +script = ExtResource("1_odhat") + +[node name="Sprite2D" type="Sprite2D" parent="."] diff --git a/data/buildings/building_group.gd b/data/buildings/building_group.gd new file mode 100644 index 0000000..481a5c1 --- /dev/null +++ b/data/buildings/building_group.gd @@ -0,0 +1,7 @@ +extends Resource +class_name BuildingGroup + +@export var name: String +@export var atlas_texture: AtlasTexture + +@export var buildings: Array[Building] diff --git a/data/buildings/corruptor.tres b/data/buildings/corruptor.tres index 06304a5..67ac0bd 100644 --- a/data/buildings/corruptor.tres +++ b/data/buildings/corruptor.tres @@ -1,12 +1,11 @@ [gd_resource type="Resource" script_class="Building" load_steps=4 format=3 uid="uid://bgwoy0uh2cpvu"] [ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="1_5s38g"] -[ext_resource type="Script" path="res://scripts/building.gd" id="1_ssts7"] [ext_resource type="Resource" uid="uid://dr00rd4f42jqe" path="res://data/game_resources/gem/gem_resource.tres" id="2_u1tpw"] +[ext_resource type="Script" path="res://data/buildings/building.gd" id="3_bd7jk"] [resource] -script = ExtResource("1_ssts7") -atlas_texture_region = Vector2i(14, 7) +script = ExtResource("3_bd7jk") name = "Corruptor" description = "A building which only functions to spread corruption, and does it well" cost = { diff --git a/data/buildings/hub.tres b/data/buildings/hub.tres index f6cd42c..be4574e 100644 --- a/data/buildings/hub.tres +++ b/data/buildings/hub.tres @@ -1,16 +1,10 @@ -[gd_resource type="Resource" script_class="Building" load_steps=5 format=3 uid="uid://c6vv3hyn5sd7o"] +[gd_resource type="Resource" script_class="Building" load_steps=3 format=3 uid="uid://c6vv3hyn5sd7o"] -[ext_resource type="Script" path="res://scripts/expansion_patterns/expansion_square_pattern.gd" id="1_attvt"] -[ext_resource type="Script" path="res://scripts/building.gd" id="1_ssd30"] +[ext_resource type="Script" path="res://data/buildings/building.gd" id="1_ssd30"] [ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="2_d8jrj"] -[sub_resource type="Resource" id="Resource_nqpn0"] -script = ExtResource("1_attvt") - [resource] script = ExtResource("1_ssd30") -corruption_pattern = SubResource("Resource_nqpn0") -atlas_texture_region = Vector2i(17, 7) name = "Hub" description = "Main cheap base that corrupts a square" cost = { diff --git a/data/interactions/build/advanced/build_advanced.tres b/data/interactions/build/advanced/build_advanced.tres new file mode 100644 index 0000000..e93998c --- /dev/null +++ b/data/interactions/build/advanced/build_advanced.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="InteractionBuildBasic" load_steps=4 format=3 uid="uid://kqcdiin4k3jr"] + +[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_ce8rd"] +[ext_resource type="Script" path="res://data/interactions/build/basic/interaction_build_basic.gd" id="2_xgp0x"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_fxfd2"] +atlas = ExtResource("1_ce8rd") +region = Rect2(1088, 576, 64, 64) + +[resource] +script = ExtResource("2_xgp0x") +name = "Advanced" +image = SubResource("AtlasTexture_fxfd2") diff --git a/data/interactions/build/advanced/interaction_build_advanced.gd b/data/interactions/build/advanced/interaction_build_advanced.gd new file mode 100644 index 0000000..1f4e8a3 --- /dev/null +++ b/data/interactions/build/advanced/interaction_build_advanced.gd @@ -0,0 +1,6 @@ +extends Interaction +class_name InteractionBuildAdvanced + +func interact_at(pos: Vector2i, root: Node) -> Array[Interaction]: + print("Building at: %s" % pos) + return [] diff --git a/data/interactions/build/basic/build_basic.tres b/data/interactions/build/basic/build_basic.tres new file mode 100644 index 0000000..684bf9c --- /dev/null +++ b/data/interactions/build/basic/build_basic.tres @@ -0,0 +1,13 @@ +[gd_resource type="Resource" script_class="InteractionBuildBasic" load_steps=4 format=3 uid="uid://k4dq7122cnu0"] + +[ext_resource type="Script" path="res://data/interactions/build/basic/interaction_build_basic.gd" id="1_8f33m"] +[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_qfmuq"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_w7o8k"] +atlas = ExtResource("1_qfmuq") +region = Rect2(1024, 576, 64, 64) + +[resource] +script = ExtResource("1_8f33m") +name = "Basic" +image = SubResource("AtlasTexture_w7o8k") diff --git a/data/interactions/build/basic/interaction_build_basic.gd b/data/interactions/build/basic/interaction_build_basic.gd new file mode 100644 index 0000000..c487920 --- /dev/null +++ b/data/interactions/build/basic/interaction_build_basic.gd @@ -0,0 +1,6 @@ +extends Interaction +class_name InteractionBuildBasic + +func interact_at(pos: Vector2i, root: Node) -> Array[Interaction]: + print("Building at: %s" % pos) + return [] diff --git a/data/interactions/build/interaction_build.gd b/data/interactions/build/interaction_build.gd index 78d7694..d814a19 100644 --- a/data/interactions/build/interaction_build.gd +++ b/data/interactions/build/interaction_build.gd @@ -1,6 +1,8 @@ extends Interaction class_name InteractionBuild +const BUILD_ADVANCED = preload("res://data/interactions/build/advanced/build_advanced.tres") +const BUILD_BASIC = preload("res://data/interactions/build/basic/build_basic.tres") + func interact_at(pos: Vector2i, root: Node) -> Array[Interaction]: - print("Building at: %s" % pos) - return [] + return [BUILD_BASIC, BUILD_ADVANCED] diff --git a/project.godot b/project.godot index af1e204..42e8f98 100644 --- a/project.godot +++ b/project.godot @@ -77,12 +77,18 @@ move_down={ , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null) ] } -select={ +interact={ "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) +"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":69,"key_label":0,"unicode":101,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null) ] } +build={ +"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":66,"key_label":0,"unicode":98,"echo":false,"script":null) +, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":false,"script":null) +] +} [rendering] diff --git a/scene/build_menu.tscn b/scene/build_menu.tscn new file mode 100644 index 0000000..79fc58b --- /dev/null +++ b/scene/build_menu.tscn @@ -0,0 +1,89 @@ +[gd_scene load_steps=3 format=3 uid="uid://cym5p3olst2nc"] + +[ext_resource type="Script" path="res://scripts/build_menu.gd" id="1_v2c78"] + +[sub_resource type="Theme" id="Theme_0djom"] + +[node name="BuildMenu" type="CanvasLayer"] +script = ExtResource("1_v2c78") + +[node name="MarginContainer" type="MarginContainer" parent="."] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 128 +theme_override_constants/margin_top = 128 +theme_override_constants/margin_right = 128 +theme_override_constants/margin_bottom = 128 + +[node name="PanelContainer" type="PanelContainer" parent="MarginContainer"] +layout_mode = 2 +theme = SubResource("Theme_0djom") + +[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/PanelContainer"] +layout_mode = 2 + +[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/PanelContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="BuildingGroups" type="ItemList" parent="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +auto_height = true + +[node name="ScrollContainer2" type="ScrollContainer" parent="MarginContainer/PanelContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Buildings" type="ItemList" parent="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer2/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +auto_height = true + +[node name="DetailsContainer" type="VBoxContainer" parent="MarginContainer/PanelContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_stretch_ratio = 3.0 + +[node name="Title" type="Label" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"] +layout_mode = 2 +text = "Select a building" +horizontal_alignment = 1 + +[node name="HSeparator" type="HSeparator" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"] +layout_mode = 2 + +[node name="Description" type="Label" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"] +visible = false +layout_mode = 2 +text = " " + +[node name="BuildMaterials" type="GridContainer" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"] +visible = false +layout_mode = 2 +columns = 2 + +[node name="BuildButtonsContainer" type="HBoxContainer" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"] +visible = false +layout_mode = 2 +alignment = 1 + +[node name="BuildButton" type="Button" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer/BuildButtonsContainer"] +layout_mode = 2 +text = "Build +" + +[connection signal="item_selected" from="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer/VBoxContainer/BuildingGroups" to="." method="_on_building_groups_item_selected"] +[connection signal="item_selected" from="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer2/VBoxContainer/Buildings" to="." method="_on_buildings_item_selected"] +[connection signal="pressed" from="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer/BuildButtonsContainer/BuildButton" to="." method="_on_build_button_pressed"] diff --git a/scene/interaction_bar.tscn b/scene/interaction_bar.tscn new file mode 100644 index 0000000..37c4eea --- /dev/null +++ b/scene/interaction_bar.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=2 format=3 uid="uid://dfr3hvxqo4fqf"] + +[ext_resource type="Script" path="res://scripts/interaction_bar.gd" id="1_qwnlc"] + +[node name="InteractionBar" type="ProgressBar"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_right = -1092.0 +offset_bottom = -628.0 +grow_horizontal = 2 +grow_vertical = 2 +show_percentage = false +script = ExtResource("1_qwnlc") diff --git a/scene/player.tscn b/scene/player.tscn index 4a9c530..9c649cb 100644 --- a/scene/player.tscn +++ b/scene/player.tscn @@ -82,6 +82,7 @@ size = Vector2(40, 45) [node name="Player" type="CharacterBody2D"] motion_mode = 1 script = ExtResource("1_j0htm") +SPEED = null [node name="Sprite" type="AnimatedSprite2D" parent="."] sprite_frames = SubResource("SpriteFrames_tj1nq") diff --git a/scripts/build_menu.gd b/scripts/build_menu.gd new file mode 100644 index 0000000..164208a --- /dev/null +++ b/scripts/build_menu.gd @@ -0,0 +1,67 @@ +extends CanvasLayer + +signal build(building: Building) + +var groups_visible: Array[BuildingGroup] = [] +var buildings_visible: Array[Building] = [] +var selected_building: Building + +const ADVANCED_BUILDING_GROUP = preload("res://data/buildings/advanced/advanced_building_group.tres") +const BASIC_BUILDING_GROUP = preload("res://data/buildings/basic/basic_building_group.tres") + +@onready var building_groups: ItemList = $MarginContainer/PanelContainer/HBoxContainer/ScrollContainer/VBoxContainer/BuildingGroups +@onready var buildings: ItemList = $MarginContainer/PanelContainer/HBoxContainer/ScrollContainer2/VBoxContainer/Buildings + +@onready var title: Label = $MarginContainer/PanelContainer/HBoxContainer/DetailsContainer/Title +@onready var description: Label = $MarginContainer/PanelContainer/HBoxContainer/DetailsContainer/Description +@onready var build_materials: GridContainer = $MarginContainer/PanelContainer/HBoxContainer/DetailsContainer/BuildMaterials +@onready var build_buttons_container: HBoxContainer = $MarginContainer/PanelContainer/HBoxContainer/DetailsContainer/BuildButtonsContainer + +func _ready() -> void: + _add_building_group(BASIC_BUILDING_GROUP) + _add_building_group(ADVANCED_BUILDING_GROUP) + +func _add_building_group(group: BuildingGroup) -> void: + building_groups.add_item(group.name, group.atlas_texture) + groups_visible.append(group) + +func _on_building_groups_item_selected(index: int) -> void: + buildings.clear() + buildings_visible.clear() + for building in groups_visible[index].buildings: + buildings_visible.append(building) + buildings.add_item(building.name, building.atlas_texture) + + description.hide() + build_materials.hide() + build_buttons_container.hide() + selected_building = null + + +func _on_buildings_item_selected(index: int) -> void: + selected_building = buildings_visible[index] + title.text = selected_building.name + description.text = selected_building.description + + for child in build_materials.get_children(): + child.queue_free() + for res: GameResource in selected_building.cost.keys(): + var image = TextureRect.new() + var texture = AtlasTexture.new() + texture.atlas = preload("res://assets/scifi_tilesheet@2.png") + texture.region = Rect2(64 * res.atlas_location, Vector2(64, 64)) + image.texture = texture + build_materials.add_child(image) + var label = Label.new() + label.text = str(selected_building.cost[res]) + build_materials.add_child(label) + + description.show() + build_materials.show() + build_buttons_container.show() + + +func _on_build_button_pressed() -> void: + if selected_building: + build.emit(selected_building) + queue_free() diff --git a/scripts/cell_data.gd b/scripts/cell_data.gd index cb1615c..2f48ebe 100644 --- a/scripts/cell_data.gd +++ b/scripts/cell_data.gd @@ -1,8 +1,8 @@ class_name CellData extends Resource -const BUILD = preload("res://data/interactions/build.tres") -const GATHER = preload("res://data/interactions/gather.tres") +const BUILD = preload("res://data/interactions/build/build.tres") +const GATHER = preload("res://data/interactions/gather/gather.tres") @export var layer_info: Dictionary = { Constants.TilemapLayers.CORRUPTION: false @@ -40,6 +40,12 @@ func is_corrupted() -> bool: func has_layer(layer: int) -> bool: return layer_info.has(layer) +func is_interactable() -> bool: + return has_resource() or has_building() + +func is_buildable() -> bool: + return not has_resource() or not has_building() + func get_interaction_options() -> Array[Interaction]: var interactions: Array[Interaction] = [] if has_resource(): diff --git a/scripts/interaction_bar.gd b/scripts/interaction_bar.gd new file mode 100644 index 0000000..c34eaf9 --- /dev/null +++ b/scripts/interaction_bar.gd @@ -0,0 +1,13 @@ +extends ProgressBar +class_name InteractionBar + +signal interaction_finished + +func _ready() -> void: + var tween = get_tree().create_tween() + tween.tween_property(self, "value", 100, 3) + tween.tween_callback(_cleanup_gather) + +func _cleanup_gather() -> void: + interaction_finished.emit() + self.queue_free() diff --git a/scripts/interaction_wheel.gd b/scripts/interaction_wheel.gd index da97734..b18814d 100644 --- a/scripts/interaction_wheel.gd +++ b/scripts/interaction_wheel.gd @@ -40,6 +40,9 @@ func _process(delta: float) -> void: if next_interactions.is_empty(): closed.emit() queue_free() + else: + interactions = next_interactions + _ready() func _get_selection_index(angle: float) -> int: var adjusted_angle = fposmod(angle + (PI / 2.0), 2.0 * PI) diff --git a/scripts/player.gd b/scripts/player.gd index 8ad05ba..2a91c31 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -6,10 +6,15 @@ class_name Player var last_direction = 0 var interaction_location: Vector2i var _interaction_options: InteractionWheel +var _interacting := false +var _attempting_build: Building +var _build_placement: Sprite2D @onready var sprite: AnimatedSprite2D = $Sprite @onready var interaction_timer: Timer = $InteractionTimer -const INTERACTION_WHEEL = preload("res://scene/interaction_wheel.tscn") +const INTERACTION_BAR = preload("res://scene/interaction_bar.tscn") +const BUILD_MENU = preload("res://scene/build_menu.tscn") +const BUILDING_BASE = preload("res://data/buildings/building_base.tscn") func _physics_process(delta: float) -> void: var input_direction := Input.get_vector("move_left", "move_right", "move_up", "move_down") @@ -27,15 +32,33 @@ func _physics_process(delta: float) -> void: Grid.set_selected_tile(interaction_location) else: sprite.stop() + + if _build_placement: + _build_placement.position = Grid.grid_to_world_center(interaction_location) func _input(event: InputEvent) -> void: - if event.is_action_pressed("select") and not _interaction_options: - var interactions: Array[Interaction] = Grid.get_location_data(interaction_location).get_interaction_options() - if interactions.size() > 0: - _interaction_options = INTERACTION_WHEEL.instantiate() - _interaction_options.initialize(interaction_location, interactions) - _interaction_options.closed.connect(_on_interation_options_closed) - add_sibling(_interaction_options) + if event.is_action_pressed("interact"): + if _attempting_build and Grid.get_location_data(interaction_location).is_buildable(): + var build: BuildingBase = BUILDING_BASE.instantiate() + build.initialize(_attempting_build, interaction_location) + add_sibling(build) + if not _interacting and Grid.get_location_data(interaction_location).is_interactable(): + var interaction = INTERACTION_BAR.instantiate() + interaction.position = Grid.grid_to_world_center(interaction_location) - Vector2(30,10) + _interacting = true + add_sibling(interaction) + if event.is_action_pressed("build"): + var build_menu = BUILD_MENU.instantiate() + build_menu.build.connect(_on_build_menu_build) + add_sibling(build_menu) + +func _on_build_menu_build(building: Building) -> void: + print("Building: %s" % building.name) + _attempting_build = building + _build_placement = Sprite2D.new() + _build_placement.texture = _attempting_build.atlas_texture + _build_placement.self_modulate = Color(1, 0, 0, 0.4) + add_sibling(_build_placement) func _on_interation_options_closed() -> void: _interaction_options = null