1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
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_upgrades_at(tile_position : Vector2i) -> Array:
if _towers.has(tile_position):
return _towers[tile_position].tower_data["upgrades"]
return []
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)
|