169 lines
4.6 KiB
GDScript
169 lines
4.6 KiB
GDScript
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.tscn")
|
|
Tower.TYPES.ALINE: return load("res://Towers/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()
|
|
selected_tower.tower_type = selected_tower_type
|
|
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
|
|
|
|
prints(selected_tower.is_rest, selected_tower.builded)
|
|
|
|
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)
|