itrpg/scripts/player.gd
2025-03-30 21:59:38 +02:00

119 lines
3.5 KiB
GDScript

extends CharacterBody2D
@onready var collision_shape_2d: CollisionShape2D = $CollisionShape2D
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
@onready var player: CharacterBody2D = $"."
var hovered = null
var selected = null
var hover_indicator = preload("res://assets/sprites/ui/ui_icons_green_down4.png")
var selected_indicator = preload("res://assets/sprites/ui/ui_icons_blue_down4.png")
var map_renderer = null
func set_map_renderer(renderer):
map_renderer = renderer
func _ready():
var hover_sprite = Sprite2D.new()
hover_sprite.texture = hover_indicator
hover_sprite.position.y = -15
hover_sprite.visible = false
hover_sprite.name = "HoverIndicator"
hover_sprite.z_index = 100
player.add_child(hover_sprite)
func toggle_selection():
selected = !selected
if selected:
get_node("HoverIndicator").texture = selected_indicator
# Tell the map renderer to darken everything
if map_renderer:
map_renderer.darken_all_except_player(self)
else:
get_node("HoverIndicator").texture = hover_indicator
# Reset darkening
if map_renderer:
map_renderer.reset_darkening()
# Keep indicator visible when selected
get_node("HoverIndicator").visible = selected or hovered == player
var player_data = {
"stats": {
"health": 100,
"mana": 100,
"speed": 3,
"attack": 10,
"defense": 5,
"actionpoints": 5,
},
"inventory": [],
"name": "Hero"
}
func _input(event):
if event is InputEventMouseMotion:
check_hover()
func _unhandled_input(event):
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and event.pressed:
# If we're being hovered and clicked
if hovered == player:
toggle_selection()
func check_hover():
var mouse_pos = get_global_mouse_position()
var was_hovered = hovered != null
# print("Mouse pos: ", mouse_pos, " Player pos: ", player.position)
if hovered:
hovered.get_node("HoverIndicator").visible = false
hovered = null
if player.has_node("CollisionShape2D"):
var collision = player.get_node("CollisionShape2D")
var shape = collision.shape
var local_pos = player.to_local(mouse_pos)
if shape is RectangleShape2D:
var extents = shape.extents
if local_pos.x >= -extents.x and local_pos.x <= extents.x and \
local_pos.y >= -extents.y and local_pos.y <= extents.y:
hovered = player
player.get_node("HoverIndicator").visible = true
if (was_hovered != (hovered != null)) and map_renderer:
map_renderer.set_unit_hover_state(hovered != null)
func set_unit_position(x, y, z):
var z_layer = z
var x_position = x + 16
var y_position = y
# Update the main node position
global_position = Vector2(x_position, y_position)
# Update the visual z-index directly
animated_sprite.z_index = z_layer
# Keep sprite centered at node position
animated_sprite.position = Vector2.ZERO
print("Player Z-Layer: ", z_layer)
print("Player position updated to: ", global_position)
func get_sprite_size():
return collision_shape_2d.shape
func _process(_delta: float):
check_hover()
play_player_animation("idle")
func play_player_animation(state="idle"):
if state == "idle":
animated_sprite.play("down")