Frontier-of-Hell/scripts/enemies/enemy.gd

97 lines
2.4 KiB
GDScript3
Raw Normal View History

2023-10-06 14:25:13 +02:00
extends PathFollow2D
var config = null
var enemy_id: int = 0
var health: int = 0
2023-10-07 17:13:27 +02:00
var damage: int = 0
var speed: float = 0
var reward: int = 0
2023-10-06 19:02:54 +02:00
var direction_progress = []
var direction = []
2023-11-19 11:49:32 +01:00
var current_direction = ''
2023-10-06 14:25:13 +02:00
2023-10-16 19:12:44 +02:00
var enemy_vol = Vector2(1,1)
var old_enemy_pos
2023-10-27 11:48:38 +02:00
var max_health: int = 0
2023-10-20 20:52:37 +02:00
var is_slow: bool = false
2023-11-19 11:49:32 +01:00
var is_dead: bool = false
2023-10-16 19:12:44 +02:00
2023-10-06 14:25:13 +02:00
func set_config(config_path):
config = load(config_path).new()
func set_enemy(id: int):
enemy_id = id
health = config.enemy[enemy_id]['health']
2023-10-07 17:13:27 +02:00
damage = config.enemy[enemy_id]['damage']
2023-10-06 14:25:13 +02:00
speed = config.enemy[enemy_id]['speed']
reward = config.enemy[enemy_id]['reward']
2023-10-27 11:48:38 +02:00
max_health = health
$EnemyBody/HealthBar.max_value = max_health
$EnemyBody/HealthBar.visible = false
2023-10-06 19:02:54 +02:00
2023-10-14 15:16:53 +02:00
func set_direction(type: int):
var path_direction = config.game['path_direction'][type]
2023-10-06 19:02:54 +02:00
for x in path_direction:
direction_progress.append(x['progress'])
direction.append(x['direction'])
2023-10-06 14:25:13 +02:00
2023-10-16 19:12:44 +02:00
func _ready():
old_enemy_pos = global_position
2023-10-06 14:25:13 +02:00
func _process(delta):
update_healthbar()
2023-10-06 19:02:54 +02:00
change_direction(get_progress())
2023-11-19 11:49:32 +01:00
if !is_dead:
if health < 1:
is_dead = true
$EnemyBody.remove_from_group("Enemy")
$EnemyBody/AnimatedSprite2D.play("{direction}_dead".format({"direction": current_direction}))
get_tree().current_scene.on_enemy_reward(reward)
$EnemyBody/DeadTimer.start()
set_progress(get_progress() + speed * delta)
enemy_vol = global_position - old_enemy_pos
old_enemy_pos = global_position
else:
$EnemyBody/HealthBar.visible = false
2023-10-06 19:02:54 +02:00
func change_direction(current_progress):
if !direction_progress.is_empty():
if current_progress > direction_progress[0]:
$EnemyBody/AnimatedSprite2D.play(direction[0])
2023-11-19 11:49:32 +01:00
current_direction = direction[0]
2023-10-06 19:02:54 +02:00
direction_progress.erase(direction_progress[0])
direction.erase(direction[0])
2023-10-06 14:25:13 +02:00
func update_healthbar():
2023-10-06 17:47:24 +02:00
$EnemyBody/HealthBar.value = health
2023-10-06 14:25:13 +02:00
2023-10-27 11:48:38 +02:00
if health < max_health:
2023-10-06 17:47:24 +02:00
$EnemyBody/HealthBar.visible = true
2023-10-06 14:25:13 +02:00
2023-10-08 12:51:55 +02:00
func hit(value : int):
health = health - value
2023-10-07 17:13:27 +02:00
2023-10-20 20:52:37 +02:00
func slow():
var slowTimer = $EnemyBody/SlowTimer
if is_slow:
slowTimer.stop()
slowTimer.start()
else:
$EnemyBody/AnimatedSprite2D.modulate = Color(0.0627, 0.3137, 0.4588, 1)
2023-10-20 20:52:37 +02:00
speed = speed - (0.3 * speed)
is_slow = true
slowTimer.wait_time = 6.0
slowTimer.start()
func _on_slow_timer_timeout():
$EnemyBody/AnimatedSprite2D.modulate = Color(1, 1, 1, 1)
2023-10-20 20:52:37 +02:00
speed = config.enemy[enemy_id]['speed']
is_slow = false
2023-11-19 11:49:32 +01:00
func _on_dead_timer_timeout():
destroy()
2023-10-07 17:13:27 +02:00
func destroy():
2023-11-19 11:49:32 +01:00
queue_free()