Files
Decked-Out-Defense/card_placing_tool.gd
2025-10-27 01:25:15 +11:00

85 lines
2.2 KiB
GDScript

class_name CardPlacingTool
extends Node3D
@export var hero: Hero
@export var ray: RayCast3D
var enabled: bool = false
var tower_preview: Tower
var tower_preview_card: Card
var last_tower_base: TowerBase
var ray_collider: Object
func reset() -> void:
delete_tower_preview()
func _process(_delta: float) -> void:
if !enabled:
reset()
return
if !ray_collider or hero.hand.size == 0 or ray_collider.has_card:
delete_tower_preview()
if ray.is_colliding() and ray.get_collider() is TowerBase:
ray_collider = ray.get_collider()
if hero.hand.size > 0 and !ray_collider.has_card:
if ray_collider != last_tower_base or hero.selected_card != tower_preview_card:
spawn_tower_preview()
else:
ray_collider = null
func interact() -> void:
if ray.is_colliding() and ray.get_collider() is TowerBase:
var tower_base: TowerBase = ray.get_collider() as TowerBase
if hero.game_manager.card_gameplay:
if hero.hand.size > 0:
place_card(tower_base)
else:
if tower_base.has_card:
remove_card(tower_base)
elif hero.hand.size > 0:
place_card(tower_base)
func place_card(tower_base: TowerBase) -> void:
var card: Card = hero.selected_card
var energy_cost: int = card.cost
if hero.game_manager.card_gameplay and hero.energy < energy_cost:
return
remove_card(tower_base)
hero.hand.remove_at(hero.hand.contents.find(card))
tower_base.add_card(card, multiplayer.get_unique_id())
hero.place_card_audio.play()
if hero.game_manager.card_gameplay:
hero.discard_pile.add(card)
hero.energy -= energy_cost
func remove_card(tower_base: TowerBase) -> void:
if tower_base.has_card:
tower_base.remove_card()
func spawn_tower_preview() -> void:
delete_tower_preview()
var card: Card = hero.selected_card
last_tower_base = ray_collider as TowerBase
tower_preview_card = card
tower_preview = card.turret_scene.instantiate() as Tower
tower_preview.stats = card.tower_stats
tower_preview.position = Vector3.UP
tower_preview.preview_range(true)
last_tower_base.add_child(tower_preview)
func delete_tower_preview() -> void:
last_tower_base = null
if is_instance_valid(tower_preview):
tower_preview.queue_free()
tower_preview = null
tower_preview_card = null