1
2extends Sprite
3
4export var player = -1
5export var position_on_map = Vector2(0,0)
6const MAX_HICCUP_DEPTH = 5
7var move_positions = []
8var current_map_terrain
9var current_map
10var health_bar
11var icon_shield
12var anim
13var teleport_anim
14var type = 0
15var type_name = ''
16var type_name_label = ''
17var kills = 0
18
19var life
20var max_life
21var attack
22var plain
23var road
24var river
25var max_ap
26var limited_ap
27var attack_ap
28var max_attacks_number
29var ap
30var attacks_number
31var visibility
32
33var group = 'unit'
34
35var explosion_template = preload('res://particle/explosion.xscn')
36var explosion_big_template = preload('res://particle/explosion_big.xscn')
37var explosion
38var floating_damage_template = preload('res://particle/hit_points.xscn')
39var floating_damage
40var die = false
41var active = 1
42var parent
43
44var sprite_offset_for_64x64 = Vector2(0,8);
45
46var story_markers = {}
47
48func set_no_ap_idle():
49    if ap == 0:
50        self.anim.play('idle_no_ap')
51    else:
52        self.anim.play('move')
53
54func force_no_ap_idle():
55    self.anim.play('idle_no_ap')
56
57func set_ap(value):
58    ap = value
59    self.set_no_ap_idle()
60
61func get_ap():
62    return ap;
63
64func get_player():
65    return player
66
67func get_unit_type():
68    return type
69
70func get_type():
71    return type
72
73func get_pos_map():
74    return position_on_map
75
76func add_move(position):
77    self.move_positions.push_back(position)
78
79func get_initial_pos():
80    position_on_map = current_map_terrain.world_to_map(self.get_pos())
81    self.add_move(position_on_map)
82    return position_on_map
83
84func get_stats():
85    return {'life' : life, 'attack' : attack, 'ap' : get_ap(), 'attack_ap': attack_ap, 'attacks_number' : attacks_number}
86
87func set_stats(new_stats):
88    life = new_stats.life
89    attack = new_stats.attack
90    ap = new_stats.ap
91    attacks_number = new_stats.attacks_number
92    self.update_healthbar()
93    self.update_shield()
94    self.set_no_ap_idle()
95
96func set_hp(hp):
97    self.life = hp
98    self.update_healthbar()
99
100func update_ap(new_ap):
101    ap = new_ap
102    self.update_shield()
103    self.set_no_ap_idle()
104
105func reset_ap(limit_ap):
106    if (limit_ap):
107        self.ap = self.limited_ap
108    else:
109        self.ap = self.max_ap
110
111    attacks_number = max_attacks_number
112    self.update_shield()
113    self.update_healthbar()
114    self.set_no_ap_idle()
115
116func set_pos_map(new_position):
117    if new_position.x > position_on_map.x:
118        self.set_flip_h(true)
119    elif new_position.x < position_on_map.x:
120        self.set_flip_h(false)
121    if new_position.y < position_on_map.y:
122        self.set_flip_h(true)
123    elif new_position.y > position_on_map.y:
124        self.set_flip_h(false)
125
126    self.set_pos(current_map_terrain.map_to_world(new_position) + sprite_offset_for_64x64)
127    self.add_move(position_on_map)
128    position_on_map = new_position
129    self.teleport_anim.play('in')
130
131func check_hiccup(new_position):
132    var depth = MAX_HICCUP_DEPTH
133    var count = move_positions.size()
134    if count == 0:
135        return false
136
137    if MAX_HICCUP_DEPTH > count:
138        depth = count
139
140    var start = count - depth - 1
141    if start < 0:
142        start = 0
143
144    for index in range(start, count - 1):
145        if new_position == move_positions[index]:
146            return true
147
148    return false
149
150func can_attack():
151    if self.ap >= self.attack_ap && self.attacks_number > 0:
152        return true
153    return false
154
155func can_defend():
156    if self.ap >= self.attack_ap:
157        return true
158    return false
159
160func can_capture_buildings():
161    if self.type == 0:
162        return true
163    return false
164
165func die():
166    if self.is_inside_tree():
167        self.queue_free()
168    else:
169        self.call_deferred("free")
170
171func set_damaged():
172    return
173
174func get_life_status():
175    return self.life / (self.max_life * 1.0 )
176
177func update_healthbar():
178    var life_status = self.get_life_status()
179    var new_frame = floor((1.0 - life_status)*10)
180    if new_frame > 9:
181        new_frame = 9
182    self.health_bar.set_frame(new_frame)
183
184func show_explosion():
185    self.get_node("/root/game").action_controller.exploding = true
186    explosion = explosion_template.instance()
187    explosion.unit = self
188    self.add_child(explosion)
189
190func show_big_explosion():
191    self.get_node("/root/game").action_controller.exploding = true
192    explosion = explosion_big_template.instance()
193    explosion.unit = self
194    self.add_child(explosion)
195    current_map.shake_camera()
196
197func clear_explosion():
198    self.remove_child(explosion)
199    explosion.call_deferred("free")
200    self.get_node("/root/game").action_controller.exploding = false
201    if die:
202        parent.remove_child(self)
203        self.die()
204
205func show_floating_damage(amount):
206    floating_damage = floating_damage_template.instance()
207    floating_damage.set_text(str(amount))
208    floating_damage.unit = self
209    self.add_child(floating_damage)
210
211func clear_floating_damage():
212    self.remove_child(floating_damage)
213    floating_damage.call_deferred("free")
214
215func die_after_explosion(ysort):
216    self.remove_from_group('units')
217    die = true
218    parent = self.get_parent()
219    self.show_big_explosion()
220
221func update_shield():
222    if ap >= attack_ap:
223        self.icon_shield.show()
224    else:
225        self.icon_shield.hide()
226
227func score_kill():
228    kills = kills + 1
229
230func take_all_ap():
231    self.ap = 0
232    self.icon_shield.hide()
233    self.set_no_ap_idle()
234
235func fix_initial_pos():
236    self.set_pos(self.get_pos() + sprite_offset_for_64x64)
237
238func get_type_name():
239    return tr(self.type_name_label)
240
241func can_attack_unit_type(defender):
242    if type == 1 && defender.type == 2:
243        return false
244
245    return true
246
247func _ready():
248    self.add_to_group("units")
249    self.anim = self.get_node("anim")
250    self.teleport_anim = self.get_node("teleport_anim")
251    if self.get_node("/root/game"):
252        self.current_map_terrain = self.get_node("/root/game").current_map_terrain
253        self.current_map = self.get_node("/root/game").current_map
254    self.health_bar = self.get_node("health")
255    self.icon_shield = self.get_node("shield")
256    self.fix_initial_pos()
257    self.anim.play("move")
258    self.teleport_anim.play('in')
259    pass
260
261
262