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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
extends Node
signal mode_changed
signal path_grid_changed
var debug = false
enum Mode {
DEFAULT,
BUILD,
}
var mode: Mode = Mode.DEFAULT :
set(value):
mode = value
mode_changed.emit()
var current_builder_element
var score: int :
set(value):
score = value
get_tree().current_scene.get_node("%Score").text = str(score)
var path_grid: AStarGrid2D
var map: TileMapLayer
func initialize_stage(tilemap: TileMapLayer):
map = tilemap
path_grid = AStarGrid2D.new()
path_grid.region = map.get_used_rect()
path_grid.cell_size = map.tile_set.tile_size
path_grid.offset = map.tile_set.tile_size / 2
path_grid.diagonal_mode = AStarGrid2D.DIAGONAL_MODE_AT_LEAST_ONE_WALKABLE
path_grid.update()
for tower in get_tree().current_scene.get_node("Towers").get_children():
fill_tower_region(tower, true)
func place_tower(tower: Tower, position: Vector2):
tower.global_position = position
fill_tower_region(tower, true)
get_tree().current_scene.get_node("Towers").add_child(tower)
Game.score += 1
path_grid_changed.emit()
func remove_tower(tower: Tower):
destroy_tower(tower)
Game.score -= 1
func destroy_tower(tower: Tower):
fill_tower_region(tower, false)
tower.queue_free()
path_grid_changed.emit()
func select_tower(tower: Tower):
tower.is_selected = true
func deselect_tower():
if Tower.selected_tower:
Tower.selected_tower.is_selected = false
get_tree().current_scene.get_node("%Tower").text = ""
func fill_tower_region(tower: Tower, solid = true):
var region = tower.get_region().size.snapped(path_grid.cell_size)
path_grid.fill_solid_region(
Rect2i(
map.local_to_map(tower.global_position),
(region / path_grid.cell_size)
),
solid
)
func spawn_mob(mob: Mob, spawn: Spawn):
mob.global_position = spawn.spawn_position
mob.target = spawn.next_node
mob.hp = randi_range(50, 200)
mob.speed = randi_range(50, 150)
#mob.get_node("Sprite2D").modulate = Color(randf_range(0, 1), randf_range(0, 1), randf_range(0, 1))
return mob
func start_build_mode():
Game.mode = Game.Mode.BUILD
var scene = preload("res://BuilderElement.tscn")
var builder_element = scene.instantiate()
var tower = preload("res://Tower.tscn").instantiate() as Tower
tower.attack_range = [
Game.map.tile_set.tile_size.x * 2,
Game.map.tile_set.tile_size.x * 3,
Game.map.tile_set.tile_size.x * 4,
].pick_random()
builder_element.element = tower
get_tree().current_scene.add_child(builder_element)
current_builder_element = builder_element
func stop_build_mode():
current_builder_element.queue_free()
Game.mode = Game.Mode.DEFAULT
|