extends Node var game_stats_config = preload("res://resources/game_stats_config.tres") @onready var _tiles : TileMapLayer = get_node("../Map/TileMapLayer") var _towers : Dictionary var _tower_data : Array[Dictionary] = [ { "scene": preload("res://scenes/warlock.tscn"), "cost": game_stats_config.defenders[0]["cost"], }, { "scene": preload("res://scenes/wyvern.tscn"), "cost": game_stats_config.defenders[1]["cost"], }, ] func _ready(): _towers = {} func handle_tower_key(tower_index : int, tile_position : Vector2i): if is_tile_occupied(tile_position): _handle_upgrade(tower_index, _towers[tile_position]) elif is_valid_placement_tile(tile_position): _handle_place_tower(tower_index, tile_position) func _handle_upgrade(upgrade_index : int, tower : StaticBody2D): var upgrades = tower.tower_data["upgrades"] if upgrades.size() > upgrade_index: var upgrade_cost = upgrades[upgrade_index]["cost"] if GameData.get_life() >= upgrade_cost: GameData.subtract_life(upgrade_cost) tower.apply_upgrade(upgrades[upgrade_index]["effects"]) upgrades[upgrade_index]["is_valid"] = false func _handle_place_tower(tower_index : int, tile_position : Vector2i): if _tower_data.size() > tower_index: var tower = _tower_data[tower_index] var tower_cost = tower["cost"] if GameData.get_life() >= tower_cost: GameData.subtract_life(tower_cost) var tmp = tower["scene"].instantiate() add_child(tmp) tmp.global_position = tile_position _occupy_tile(tile_position, tmp) func get_tower_at(tile_position : Vector2i): if _towers.has(tile_position): return _towers[tile_position] return null func is_valid_placement_tile(tile_position : Vector2i): var tile_coords = _tiles.get_cell_atlas_coords(_tiles.local_to_map(tile_position)) return (tile_coords == (Vector2i(-1, -1))) func is_tile_occupied(tile_position : Vector2i): return _towers.has(tile_position) func _occupy_tile(tile_position, tower): _towers[tile_position] = tower func _free_tile(tile_position): _towers.erase(tile_position)