80 lines
2.1 KiB
GDScript
80 lines
2.1 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
|
|
put_card_in_tower_base(tower_base)
|
|
|
|
|
|
func put_card_in_tower_base(tower_base: TowerBase) -> void:
|
|
if hero.hand.size <= 0:
|
|
return
|
|
var card: Card = hero.selected_card
|
|
var energy_cost: int = card.cost
|
|
if hero.energy < energy_cost:
|
|
return
|
|
if tower_base.has_card:
|
|
tower_base.remove_card()
|
|
hero.hand.remove_at(hero.hand.contents.find(card))
|
|
hero.check_removal()
|
|
#hero.card_sprites[hero.hand_selected_index].queue_free()
|
|
#hero.card_sprites.remove_at(hero.hand_selected_index)
|
|
#if !hero.hand.contents.has(card):
|
|
#hero.decrement_selected()
|
|
tower_base.add_card(card, multiplayer.get_unique_id())
|
|
hero.discard_pile.add(card)
|
|
hero.place_card_audio.play()
|
|
hero.energy -= energy_cost
|
|
|
|
|
|
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
|