From b557833edb6155f0145eb4418dcd4e23bdb74a2c Mon Sep 17 00:00:00 2001 From: Varylios Date: Tue, 26 Aug 2025 13:03:22 +0200 Subject: [PATCH] refactor: extract PlayerManager from world.gd --- Globals/EventBus.gd | 10 ++- Levels/world.gd | 156 ----------------------------------- Levels/world.tscn | 23 +++++- Scripts/PlayerManager.gd | 144 ++++++++++++++++++++++++++++++++ Scripts/PlayerManager.gd.uid | 1 + Towers/tower.gd | 10 +-- game_menu.gd | 16 +++- 7 files changed, 191 insertions(+), 169 deletions(-) create mode 100644 Scripts/PlayerManager.gd create mode 100644 Scripts/PlayerManager.gd.uid diff --git a/Globals/EventBus.gd b/Globals/EventBus.gd index eec4b3c..6e3cd38 100644 --- a/Globals/EventBus.gd +++ b/Globals/EventBus.gd @@ -3,7 +3,7 @@ extends Node #Emitter : TowerButton.gd #Subscriber : World.gd -signal tower_selected(tower : PackedScene, tower_button : TowerButton) +signal tower_selected(tower : PackedScene) #Emitter : World.gd @@ -53,3 +53,11 @@ signal money_spent(_value : int) #Emitter : spawner.gd #Subscriber : cube.gd signal player_has_won() + +#Emitter : PlayerManager.gd +#Subscriber : game_menu.gd +signal open_shop() + +#Emitter : PlayerManager.gd +#Subscriber : game_menu.gd +signal close_shop() diff --git a/Levels/world.gd b/Levels/world.gd index 213f67a..c156813 100644 --- a/Levels/world.gd +++ b/Levels/world.gd @@ -1,162 +1,6 @@ extends Node3D -#TODO Get rid of tower_blueprint, remake player controler -@onready var tower_blueprint = preload("res://Towers/tower.tscn") - - -@onready var selected_tower : Tower -@onready var selected_tower_button : TowerButton = $CanvasLayer/GameMenu/VBoxContainer/PierreButton - -@onready var cam : Camera3D = $Camera3D -@onready var selector : Node3D = $Selector -@onready var the_cube : TheCube = %TheCube - -var tower_count : int = 0: - set(value): - tower_count = value - EventBus.tower_count_changed.emit(tower_count) - - -var team_in_action : Array[Tower]: - set(value): - team_in_action = value - EventBus.team_in_action_changed.emit(team_in_action) - - -var team_in_rest : Array[Tower] -var target_tower : Tower -var in_build_menu : bool = false - var selected_collider : CollisionObject3D func _ready() -> void: $Spawner.spawn_next_wave() - $CanvasLayer/GameMenu.visible = in_build_menu - EventBus.tower_selected.connect(_on_EventBus_tower_selected) - - -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(tower_blueprint) - if selected_collider is TheCube: - open_shop() - else: - close_shop() - - if Input.is_action_just_pressed("rest"): - close_shop() - if target_tower: - send_to_rest(target_tower) - - -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(): - selector.visible = false - selected_collider = null - return - - var collider : CollisionObject3D = ray_result.get("collider") - selected_collider = collider - - selector.visible = true - selector.global_position = collider.global_position - selector.global_position += Vector3(0.0,0.2,0.0) - - if selected_collider is Tower: - target_tower = collider - else: - target_tower = null - -# Refactoriser ce code -func build_tower(scene : PackedScene) -> void: - if !selector.visible: - return - - var temp_tower : Tower = scene.instantiate() - - - #Move existing tower - for tower : Tower in team_in_action: - if tower.tower_name == temp_tower.tower_name: - move_tower(tower) - return - - #Send to action a resting tower - for tower : Tower in team_in_rest: - if tower.tower_name == temp_tower.tower_name: - move_tower(tower) - send_to_action(tower) - return - - #Build Tower - if temp_tower.price < the_cube.money: - #Can't build - print("Too costly") - return - else : - #Can build - EventBus.money_spent.emit(temp_tower.price) - temp_tower.tower_button = selected_tower_button - tower_count += 1 - $Towers.add_child(temp_tower) - EventBus.tower_builded.emit(temp_tower) - selected_tower_button.tower_in_game = temp_tower - send_to_action(temp_tower) - move_tower(temp_tower) - - - -func move_tower(tower : Tower): - tower.global_position = selector.global_position - - -func send_to_rest(tower : Tower): - team_in_action.erase(tower) - team_in_rest.append(tower) - tower.is_rest = true - EventBus.team_in_action_changed.emit(team_in_action) - - -func send_to_action(tower : Tower): - team_in_rest.erase(tower) - team_in_action.append(tower) - tower.is_rest = false - EventBus.team_in_action_changed.emit(team_in_action) - -func open_shop(): - if in_build_menu: - close_shop() - return - - in_build_menu = true - $CanvasLayer/GameMenu.visible = in_build_menu - - - -func close_shop(): - in_build_menu = false - $CanvasLayer/GameMenu.visible = in_build_menu - - -func _on_EventBus_tower_selected(tower : PackedScene, tower_button : TowerButton): - tower_blueprint = tower - selected_tower_button = tower_button - - -func _on_cube_icon_pressed() -> void: - open_shop() diff --git a/Levels/world.tscn b/Levels/world.tscn index a45fee8..c88dec7 100644 --- a/Levels/world.tscn +++ b/Levels/world.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=18 format=3 uid="uid://ky0uewndeuwv"] +[gd_scene load_steps=20 format=3 uid="uid://ky0uewndeuwv"] [ext_resource type="Script" uid="uid://qqid42jkpkmv" path="res://Levels/world.gd" id="1_fj7yv"] [ext_resource type="PackedScene" uid="uid://d1f6m15niwgt" path="res://Tiles/tile.tscn" id="3_aqk2v"] +[ext_resource type="Script" uid="uid://caf3yamufmhd4" path="res://Scripts/PlayerManager.gd" id="3_ju8gl"] [ext_resource type="PackedScene" uid="uid://d17sleiqkdoo2" path="res://Assets/GLB format/selection-a.glb" id="3_tlwt5"] [ext_resource type="PackedScene" uid="uid://do7gm1gjhu1t5" path="res://Tiles/road.tscn" id="4_036b0"] [ext_resource type="Script" uid="uid://tpon511km4al" path="res://spawner.gd" id="5_036b0"] @@ -35,14 +36,31 @@ adjustment_enabled = true adjustment_contrast = 1.3 adjustment_saturation = 1.2 +[sub_resource type="GDScript" id="GDScript_ju8gl"] +script/source = "extends Node3D + +class_name TowerList + +func _ready() -> void: + child_entered_tree.connect(_on_child_entered_tree) + child_exiting_tree.connect(_on_child_exiting_tree) + +func _on_child_entered_tree(child): + EventBus.tower_count_changed.emit(get_children().count()) + +func _on_child_exiting_tree(child): + EventBus.team_in_action_changed.emit(get_children().count()) +" + [node name="World" type="Node3D"] script = ExtResource("1_fj7yv") [node name="Camera3D" type="Camera3D" parent="."] transform = Transform3D(-0.992981, -0.0586822, 0.10269, -0.00234758, 0.877843, 0.478943, -0.118251, 0.47534, -0.871819, 5.87173, 2.81458, -3.88415) -[node name="Selector" parent="." instance=ExtResource("3_tlwt5")] +[node name="PlayerManager" parent="." instance=ExtResource("3_tlwt5")] visible = false +script = ExtResource("3_ju8gl") [node name="Map" type="Node3D" parent="."] @@ -198,5 +216,6 @@ transform = Transform3D(-0.0471892, 0, 1.99944, 0, 2, 0, -1.99944, 0, -0.0471892 transform = Transform3D(1.08365, 0, 1.68098, 0, 2, 0, -1.68098, 0, 1.08365, 1.44235, 0, 4.63481) [node name="Towers" type="Node3D" parent="."] +script = SubResource("GDScript_ju8gl") [connection signal="timeout" from="Spawner/SpawnTimer" to="Spawner" method="_on_spawn_timer_timeout"] diff --git a/Scripts/PlayerManager.gd b/Scripts/PlayerManager.gd new file mode 100644 index 0000000..fdf7a6b --- /dev/null +++ b/Scripts/PlayerManager.gd @@ -0,0 +1,144 @@ +extends Node3D + +class_name PlayerManager + + +#TODO Get rid of tower_blueprint +@onready var tower_blueprint = preload("res://Towers/tower.tscn") + +@onready var selected_tower : Tower = null + +@onready var cam : Camera3D = $"../Camera3D" +@onready var the_cube : TheCube = %TheCube + +var tower_count : int = 0: + set(value): + tower_count = value + EventBus.tower_count_changed.emit(tower_count) + + +var team_in_action : Array[Tower]: + set(value): + team_in_action = value + EventBus.team_in_action_changed.emit(team_in_action) + + +var team_in_rest : Array[Tower] +var target_tower : Tower + +var selected_collider : CollisionObject3D + +func _ready() -> void: + EventBus.tower_selected.connect(_on_EventBus_tower_selected) + +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"): + EventBus.close_shop.emit() + if target_tower: + send_to_rest() + +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 + + var collider : CollisionObject3D = ray_result.get("collider") + selected_collider = collider + + visible = true + global_position = collider.global_position + global_position += Vector3(0.0,0.2,0.0) + + if selected_collider is Tower: + target_tower = collider + else: + target_tower = null + +# Refactoriser ce code +func build_tower() -> void: + if !visible: + return + + var temp_tower : Tower = tower_blueprint.instantiate() + + + #Move existing tower + for tower : Tower in team_in_action: + if tower.tower_name == temp_tower.tower_name: + move_tower() + return + + #Send to action a resting tower + for tower : Tower in team_in_rest: + if tower.tower_name == temp_tower.tower_name: + move_tower() + send_to_action() + return + + #Build Tower + if temp_tower.price < the_cube.money: + #Can't build + print("Too costly") + return + else : + #Can build + EventBus.money_spent.emit(temp_tower.price) + tower_count += 1 + $"../Towers".add_child(temp_tower) + EventBus.tower_builded.emit(temp_tower) + selected_tower = temp_tower + send_to_action() + move_tower() + + + +func move_tower(): + selected_tower.global_position = global_position + + +func send_to_rest(): + team_in_action.erase(selected_tower) + team_in_rest.append(selected_tower) + selected_tower.is_rest = true + EventBus.team_in_action_changed.emit(team_in_action) + + +func send_to_action(): + team_in_rest.erase(selected_tower) + team_in_action.append(selected_tower) + selected_tower.is_rest = false + EventBus.team_in_action_changed.emit(team_in_action) + + +func _on_EventBus_tower_selected(tower : PackedScene): + # TODO: Remove tower_blueprint + print("pouette") + # tower_blueprint = tower + +# TODO: Utile ? +func _on_cube_icon_pressed() -> void: + pass + #open_shop() diff --git a/Scripts/PlayerManager.gd.uid b/Scripts/PlayerManager.gd.uid new file mode 100644 index 0000000..c74d4a0 --- /dev/null +++ b/Scripts/PlayerManager.gd.uid @@ -0,0 +1 @@ +uid://caf3yamufmhd4 diff --git a/Towers/tower.gd b/Towers/tower.gd index 6ab2e4d..ed4dbd4 100644 --- a/Towers/tower.gd +++ b/Towers/tower.gd @@ -24,8 +24,6 @@ var bullet : PackedScene = preload("res://Bullets/bullet.tscn") @export var energy_cost : float = 50.0 @onready var energy_bar : EnergyBar3D = $EnergyBar3D -var tower_button : TowerButton = null - var energy : float = max_energy: set(value): energy = clampf(value, 0.0, max_energy) @@ -63,7 +61,7 @@ func get_available_upgrades() -> Array[TowerUpgrade]: continue else: # If they have a condition, check for the previously bought upgrades - for owned_upgrade in tower_upgrades: #Check + for owned_upgrade in tower_upgrades: #Check if shop_upgrade.condition == owned_upgrade: available_upgrades.append(shop_upgrade) return available_upgrades @@ -84,7 +82,7 @@ func _ready() -> void: func _process(delta: float) -> void: if is_rest: return - + if is_instance_valid(current): if can_shoot && not is_exhausted: shoot() @@ -97,7 +95,7 @@ func _process(delta: float) -> void: func shoot() -> void: energy -= energy_cost - + var temp_bullet : Bullet = bullet.instantiate() temp_bullet.target = current temp_bullet.bullet_damage = bullet_damage @@ -129,7 +127,7 @@ func choose_target(_current_targets : Array) -> void: else: if i.get_parent().get_progress() > current_target.get_parent().get_progress(): current_target = i - + current = current_target diff --git a/game_menu.gd b/game_menu.gd index 9d000d5..3f0fae8 100644 --- a/game_menu.gd +++ b/game_menu.gd @@ -4,19 +4,27 @@ var selected_tower func _ready() -> void: EventBus.tower_selected.connect(_on_EventBus_tower_selected) + EventBus.open_shop.connect(open_shop) + EventBus.close_shop.connect(close_shop) +func open_shop(): + if visible: + close_shop() + return -func _on_EventBus_tower_selected(tower : PackedScene, tower_button : TowerButton): + visible = true + +func close_shop(): + visible = false + +func _on_EventBus_tower_selected(tower : PackedScene): selected_tower = tower - func _on_button_return_desktop_pressed() -> void: get_tree().quit() - func _on_button_back_to_start_screen_pressed() -> void: Transition.goto("res://UI/start_menu.tscn") - func _on_button_continue_pressed() -> void: visible = false