Now may build more than one if resources allow building placement is red/green for indicating success
88 lines
3.1 KiB
GDScript
88 lines
3.1 KiB
GDScript
extends CharacterBody2D
|
|
class_name Player
|
|
|
|
@export var SPEED := 4
|
|
|
|
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_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")
|
|
velocity = input_direction * SPEED / delta
|
|
move_and_slide()
|
|
|
|
if input_direction:
|
|
if _interaction_options:
|
|
_interaction_options.queue_free()
|
|
_on_interation_options_closed()
|
|
sprite.play("walk")
|
|
last_direction = input_direction.angle() + PI / 2
|
|
rotation = last_direction
|
|
interaction_location = Grid.world_to_grid(position) + Vector2i(input_direction.round())
|
|
Grid.set_selected_tile(interaction_location)
|
|
else:
|
|
sprite.stop()
|
|
|
|
if _build_placement:
|
|
_build_placement.position = Grid.grid_to_world_center(interaction_location)
|
|
_build_placement.self_modulate = Color(0, 1, 0, 0.5) if Grid.get_location_data(interaction_location).is_buildable() else Color(1, 0, 0, 0.4)
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("interact"):
|
|
if _attempting_build and Grid.get_location_data(interaction_location).is_buildable():
|
|
_build()
|
|
elif not _interacting and Grid.get_location_data(interaction_location).is_interactable():
|
|
var interaction = INTERACTION_BAR.instantiate()
|
|
interaction.interaction_finished.connect(_on_interaction_finished)
|
|
interaction.grid_position = interaction_location
|
|
_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_interaction_finished() -> void:
|
|
_interacting = false
|
|
|
|
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 _build() -> void:
|
|
ResourceManager.use_resources(_attempting_build.cost)
|
|
var build: BuildingBase = BUILDING_BASE.instantiate()
|
|
build.initialize(_attempting_build, interaction_location)
|
|
add_sibling(build)
|
|
Grid.change_location_building(interaction_location, build)
|
|
|
|
if not ResourceManager.has_resources(_attempting_build.cost):
|
|
_attempting_build = null
|
|
_build_placement.queue_free()
|
|
_build_placement = null
|
|
|
|
func _on_interation_options_closed() -> void:
|
|
_interaction_options = null
|
|
|
|
func _unhandled_input(event):
|
|
if event is InputEventMouseButton:
|
|
match event.button_index:
|
|
MOUSE_BUTTON_WHEEL_DOWN:
|
|
$Camera2D.zoom -= Vector2(0.01, 0.01)
|
|
MOUSE_BUTTON_WHEEL_UP:
|
|
$Camera2D.zoom += Vector2(0.01, 0.01)
|