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