@icon("res://assets/icons/player.svg") class_name Player extends CharacterBody2D ## signals signal turn_finished ## export variables @export var attributes: PlayerAttributes ## The attributes resource that defines the player's abilities, vitals etc. ## regular variables var is_active: bool = false: set = set_active var player_label_offset: Vector2 ## 'onready' variables ## child nodes @onready var player_camera: Camera2D = $PlayerCamera @onready var player_label: PlayerLabel = $PlayerLabel @onready var player_nav: NavigationAgent2D = $PlayerNav @onready var player_reach_area: Area2D = $PlayerReachArea @onready var nav_target_sprite: Sprite2D = $NavTargetSprite @onready var player_sprite: Sprite2D = $PlayerSprite @onready var player_ui: CanvasLayer = $PlayerUI #@onready var end_turn_button: Button = %EndTurnButton ## Overrides func _ready() -> void: _connect_signals() #set_player_attributes(attributes) if attributes: _set_player_label_values(attributes) _set_player_sprite(attributes.player_texture) player_label_offset = player_label.position func _process(_delta: float) -> void: _set_player_label_position() if is_active: _set_nav_sprite_position() func _physics_process(_delta: float) -> void: _set_desired_velocity() if get_last_slide_collision(): var collision = get_last_slide_collision() var collider = collision.get_collider() if collider is Ball: collider.apply_central_impulse(collision.get_normal() * -2.0) func _input(event: InputEvent) -> void: if event.is_action_pressed("end_turn"): end_turn() if event is InputEventMouseButton and event.is_pressed() and event.button_index == 1: var click_position_global = get_global_mouse_position() print_debug("%s wants to navigate to %s" % [attributes.player_name, click_position_global]) player_nav.target_position = click_position_global var target_distance = player_nav.distance_to_target() print_debug("That's %s pixels/cm away" % target_distance) ## Setters func set_active(active: bool) -> void: is_active = active if is_active: print_debug("%s says: 'My turn!'" % attributes.player_name) player_camera.enabled = true player_camera.make_current() nav_target_sprite.visible = true set_process_input(true) else: print_debug("%s says: 'It's not my turn'" % attributes.player_name) player_camera.enabled = false nav_target_sprite.visible = false set_process_input(false) ## Actions func end_turn() -> void: print_debug("%s says: I'd like my turn to end." % attributes.player_name) is_active = false turn_finished.emit() ## Helper functions func _connect_signals() -> void: player_nav.connect("velocity_computed", on_velocity_computed) player_reach_area.connect("body_entered", on_player_reach_area_body_entered) player_reach_area.connect("body_exited", on_player_reach_area_body_exited) func _set_desired_velocity() -> void: var desired_velocity: Vector2 = global_position.direction_to(player_nav.get_next_path_position()) * attributes.speed player_nav.velocity = desired_velocity func _set_player_label_position() -> void: player_label.global_position = global_position + player_label_offset func _set_nav_sprite_position() -> void: nav_target_sprite.global_position = get_global_mouse_position() func _set_player_label_values(attributes_resource: PlayerAttributes) -> void: player_label.player_name = attributes_resource.player_name player_label.player_number = attributes_resource.player_number player_label.player_position = attributes_resource.player_position func _set_player_sprite(texture: Texture2D) -> void: player_sprite.texture = texture ## Signal handlers func on_player_reach_area_body_entered(body: PhysicsBody2D) -> void: if body is Player: print_debug((body.attributes.player_name) + " has entered %s's reach area" % attributes.player_name) elif body is Ball: print_debug("The ball has entered %s's reach area" % attributes.player_name) func on_player_reach_area_body_exited(body: PhysicsBody2D) -> void: if body is Player: print_debug((body.attributes.player_name) + " has exited %s's reach area" % attributes.player_name) elif body is Ball: print_debug("The ball has exited %s's reach area" % attributes.player_name) func on_velocity_computed(safe_velocity: Vector2) -> void: look_at(player_nav.get_next_path_position()) velocity = safe_velocity move_and_slide()