Added basic build menu and placement
This commit is contained in:
67
scripts/build_menu.gd
Normal file
67
scripts/build_menu.gd
Normal file
@@ -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()
|
||||
@@ -1,8 +0,0 @@
|
||||
class_name Building
|
||||
extends Resource
|
||||
|
||||
@export var corruption_pattern: ExpansionBase
|
||||
@export var atlas_texture_region: Vector2i
|
||||
@export var name: String
|
||||
@export var description: String
|
||||
@export var cost: Dictionary
|
||||
@@ -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():
|
||||
|
||||
13
scripts/interaction_bar.gd
Normal file
13
scripts/interaction_bar.gd
Normal file
@@ -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()
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user