extends Node3D class_name PlayerManager enum STATE { IDLE, PLACING } var _state := STATE.IDLE @onready var selected_tower : Tower = null var selected_tower_type : Tower.TYPES = Tower.TYPES.NONE @onready var cam : Camera3D = $"../Camera3D" @onready var the_cube : TheCube = %TheCube @onready var selection_icon : Sprite3D = $Sprite3DSelection var towers : Dictionary var selected_collider : CollisionObject3D static func getResourceTowerByType(towerId : Tower.TYPES) -> PackedScene: match towerId: Tower.TYPES.PIERRE: return load("res://Towers/Pierre/pierre.tscn") Tower.TYPES.ALINE: return load("res://Towers/Aline/aline.tscn") _: return null func _ready() -> void: EventBus.tower_selected.connect(selectTower) #$AnimationPlayer.play("arrow_bobbing") func _process(delta: float) -> void: handle_player_controls() if Input.is_action_just_pressed("build"): if not selected_collider: return if selected_collider.collision_layer == 1: build_tower() if selected_collider is TheCube: EventBus.open_shop.emit() else: EventBus.close_shop.emit() if Input.is_action_just_pressed("rest"): if _state == STATE.PLACING: quit_placing() EventBus.close_shop.emit() if selected_collider is Tower: selected_collider.is_rest = true emitTeamChanges() func handle_player_controls() -> void: var space_state : PhysicsDirectSpaceState3D = get_world_3d().direct_space_state var mouse_pos : Vector2 = get_viewport().get_mouse_position() var origin : Vector3 = cam.project_ray_origin(mouse_pos) var end : Vector3 = origin + cam.project_ray_normal(mouse_pos) * 100 var ray : PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(origin, end) ray.collide_with_bodies = true var ray_result : Dictionary = space_state.intersect_ray(ray) if ray_result.is_empty(): visible = false selected_collider = null return selected_collider = ray_result.get("collider") visible = true selection_icon.visible = false global_position = selected_collider.global_position global_position += Vector3(0.0,0.02,0.0) if _state == STATE.PLACING: selected_tower.sprite.modulate = "ff4545c8" #If the tower can't be placed he is red selection_icon.visible = false if selected_collider is BuildTile: #if we are placing a tower, hide the selector model selected_tower.sprite.modulate = "61ff45c8" #If the tower can be placed he is green func place_tower() -> void: _state = STATE.PLACING var towerBlueprint = getResourceTowerByType(selected_tower_type) if !towerBlueprint: selected_tower = null selected_tower_type = Tower.TYPES.NONE return selected_tower = towerBlueprint.instantiate() towers.set(selected_tower_type, selected_tower) add_child(selected_tower) selected_tower.can_shoot = false selected_tower.collision_layer = 0 selected_tower.show_price_tag() func quit_placing() -> void: _state = STATE.IDLE # Refactoriser ce code func build_tower() -> void: if !visible || !selected_tower: return if not selected_tower.builded && selected_tower.price > the_cube.money: #Can't build print("Too costly") return if selected_tower.is_rest: if not selected_tower.builded: #Build Tower EventBus.money_spent.emit(selected_tower.price) selected_tower.can_shoot = true selected_tower.collision_layer = 3 selected_tower.sprite.modulate = "ffffffff" selected_tower.hide_price_tag() selected_tower.builded = true EventBus.tower_builded.emit(selected_tower) remove_child(selected_tower) $"../Towers".add_child(selected_tower) quit_placing() selected_tower.is_rest = false print(selected_tower.tower_type) move_tower() emitTeamChanges() func selectTower(towerType : Tower.TYPES): if selected_tower && not selected_tower.builded: selected_tower.visible = false if towerType == selected_tower_type: selected_tower = null selected_tower_type = Tower.TYPES.NONE _state = STATE.IDLE return selected_tower_type = towerType if towers.has(towerType): _state = STATE.IDLE selected_tower = towers.get(towerType) selected_tower.visible = true else: place_tower() func move_tower(): selected_tower.global_position = global_position func emitTeamChanges() -> void: var team_in_action : int = 0 var team_in_rest : int = 0 var tower_count : int = 0 for towerType in towers: var tower : Tower = towers[towerType] if tower.builded: tower_count += 1 if tower.is_rest: team_in_rest += 1 else: team_in_action += 1 EventBus.team_in_action_changed.emit(team_in_action) EventBus.team_in_rest_changed.emit(team_in_rest) EventBus.tower_count_changed.emit(tower_count)