blob: 0f1003ba67ab14a630a326c6a91c18145bc57fa4 (
plain)
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
|
extends StaticBody2D
@onready var sprite_node = $Sprite2D
@onready var util = preload("res://scripts/util.gd")
@onready var game_stats_config = preload("res://resources/game_stats_config.tres")
var tower_data : Dictionary
var tower_key : String
var target : CharacterBody2D
var _idle_texture : Texture
var _attack_texture : Texture
func set_tower_stats(tower_index : int):
var collision_shape = $Tower/CollisionShape2D
collision_shape.shape = CircleShape2D.new()
tower_data = game_stats_config.defenders[tower_index].duplicate(true)
tower_key = tower_data["desc"]
reset_tower_range()
func reset_tower_range():
$Tower/CollisionShape2D.shape.radius = tower_data["range"]
func reset_tower_sprite():
_idle_texture = util.get_tile_texture(tower_data["sprite_idle"])
_attack_texture = util.get_tile_texture(tower_data["sprite_attacking"])
_idle_state()
func select_target() -> void:
var targets : Array = _find_targets()
# this is all to select the furthest target on the track
var curr : PathFollow2D = null
for i in targets:
if curr == null:
curr = i.get_node("../")
else:
if i.get_parent().get_progress() > curr.get_progress():
curr = i.get_node("../")
_update_state_machine(curr)
func _find_targets() -> Array:
var targets : Array = get_node("Tower").get_overlapping_bodies()
var tmp : Array = []
for i in targets:
if "Crawler" in i.name:
tmp.append(i)
return tmp
func _update_state_machine(curr : PathFollow2D) -> void:
if (curr == null):
target = null
_idle_state()
else:
target = curr.get_child(0)
_attack_state()
func _on_tower_body_entered(body: Node2D) -> void:
if target == null && "Crawler" in body.name:
$FireTimer.start(tower_data["fire_rate"])
func _attack_state():
sprite_node.texture = _attack_texture
func _idle_state():
sprite_node.texture = _idle_texture
func apply_upgrade(effects: Dictionary):
for key in effects.keys():
if key in tower_data:
tower_data[key] = effects[key]
reset_tower_range()
reset_tower_sprite()
# extending classes should override below
func _on_fire_timer_timeout() -> void:
pass
|