fuzzyworld

godot-shooter / change-html-template / files / Enemy.gd

Branch change-html-template · default branch · all branches

Enemy.gd

Blame: the commit that last changed each line · file · history

b856550a 2023-10-30 Pavel Safronov1extends KinematicBody2D
f398dcb9 2023-11-02 Pavel Safronov2class_name Enemy
b856550a 2023-10-30 Pavel Safronov3
4onready var ray_cast_2d: RayCast2D = $RayCast2D
cf2013fa 2023-11-02 Pavel Safronov5onready var damage_points = $DamagePoints
5b18ed86 2023-11-01 Pavel Safronov6const Utils = preload("res://Utils.gd")
7const Explosion = preload("res://Explosion.tscn")
cf2013fa 2023-11-02 Pavel Safronov8const Smoke = preload("res://Smoke.tscn")
b856550a 2023-10-30 Pavel Safronov9
ad6f22a5 2023-11-02 Pavel Safronov10export var move_speed = 40
09081ce6 2023-11-06 Pavel Safronov11export var turn_rate = 0.01
e9f8f8f2 2023-11-01 Pavel Safronov12export var health = -1
b856550a 2023-10-30 Pavel Safronov13export var max_health = 10
1d4ba5a6 2023-11-02 Pavel Safronov14export var is_targeted = false
52220002 2023-11-06 Pavel Safronov15export var is_invincible = false
5b18ed86 2023-11-01 Pavel Safronov16signal enemy_killed
b856550a 2023-10-30 Pavel Safronov17
18var velocity = Vector2.ZERO
19var dead = false
20
e9f8f8f2 2023-11-01 Pavel Safronov21func _ready() -> void:
539576dd 2023-11-07 Pavel Safronov22 $AnimationPlayer.play("fade_in")
cf2013fa 2023-11-02 Pavel Safronov23 if health < 0 or health > max_health:
e9f8f8f2 2023-11-01 Pavel Safronov24 health = max_health
cf2013fa 2023-11-02 Pavel Safronov25 else:
26 var hurt_points = max_health - health
27 health = max_health
28 for i in hurt_points:
29 hurt()
e9f8f8f2 2023-11-01 Pavel Safronov30
236d1677 2023-11-01 Pavel Safronov31func _process(_delta: float) -> void:
614e7fb1 2023-10-31 Pavel Safronov32 $Graphics/Alive/Container/HealthLabel.text = "%s / %s" % [health, max_health]
33 $Graphics/Alive/Container.global_rotation = 0
1d4ba5a6 2023-11-02 Pavel Safronov34 $Graphics/Alive/Target.visible = is_targeted
1b4613d1 2023-11-06 Pavel Safronov35 $Graphics/Alive/Target.global_rotation = 0
614e7fb1 2023-10-31 Pavel Safronov36
8c2ffd3f 2023-11-02 Pavel Safronov37func _physics_process(_delta: float) -> void:
b856550a 2023-10-30 Pavel Safronov38 if dead:
39 return
e496c548 2023-11-06 Pavel Safronov40
41 velocity = move_and_slide(velocity)
42 global_rotation = velocity.angle() + PI/2.0
43
b856550a 2023-10-30 Pavel Safronov44 var ray_length = ray_cast_2d.cast_to.length()
f398dcb9 2023-11-02 Pavel Safronov45 if ray_cast_2d.is_colliding():
e496c548 2023-11-06 Pavel Safronov46 var players = get_tree().get_nodes_in_group("player")
47 var player: Player = players[0]
48 var dist_to_player = global_position.distance_to(player.global_position)
f398dcb9 2023-11-02 Pavel Safronov49 if ray_cast_2d.get_collider() == player and dist_to_player < (ray_length + 5):
50 player.hurt(2)
51 var explosion = Explosion.instance()
52 explosion.transform = transform
53 get_parent().add_child(explosion)
54 kill()
b856550a 2023-10-30 Pavel Safronov55
e496c548 2023-11-06 Pavel Safronov56func turn_towards(pos: Vector2):
57 var to_dir = (pos - global_position).normalized()
58 var curr_dir = velocity.normalized()
59 var dir_diff = to_dir - curr_dir
09081ce6 2023-11-06 Pavel Safronov60 var change = dir_diff.normalized() * turn_rate * move_speed
e496c548 2023-11-06 Pavel Safronov61 velocity = (velocity + change).normalized() * move_speed
62
b856550a 2023-10-30 Pavel Safronov63func hurt():
52220002 2023-11-06 Pavel Safronov64 if dead || is_invincible:
b856550a 2023-10-30 Pavel Safronov65 return
66 health -= 1
cf2013fa 2023-11-02 Pavel Safronov67 var smoke = Smoke.instance()
68 var smoke_pos = get_damage_point_on_body()
69 smoke.position = smoke_pos
70 add_child(smoke)
b856550a 2023-10-30 Pavel Safronov71 if health <= 0:
72 kill()
73
74func kill():
52220002 2023-11-06 Pavel Safronov75 if dead || is_invincible:
b856550a 2023-10-30 Pavel Safronov76 return
77 dead = true
78 $Graphics/Alive.hide()
969fd5af 2023-11-06 Pavel Safronov79 $CollisionPolygon2D.set_deferred("disabled", true)
c6faad15 2023-10-31 Pavel Safronov80 var explosion = Explosion.instance()
81 explosion.connect("explosion_done", self, "_on_death_explosion_finished")
82 $Graphics.add_child(explosion)
b856550a 2023-10-30 Pavel Safronov83 z_index = -1
5b18ed86 2023-11-01 Pavel Safronov84 emit_signal("enemy_killed")
c6faad15 2023-10-31 Pavel Safronov85
86func _on_death_explosion_finished():
cf2013fa 2023-11-02 Pavel Safronov87 $AnimationPlayer.play("fade_out")
88
89func get_damage_point_on_body() -> Vector2:
90 var child_count = damage_points.get_child_count()
91 var random_index = randi() % child_count
92 var random_child: Position2D = damage_points.get_child(random_index)
93 return random_child.position
969fd5af 2023-11-06 Pavel Safronov94
95func remove_thyself():
96 queue_free()
115aa5d1 2023-11-07 Pavel Safronov97
98func _on_Area2D_body_entered(body: Node) -> void:
99 var players = get_tree().get_nodes_in_group("player")
100 var player: Player = players[0]
101 var is_player = body == player
102 if is_player:
103 player.hurt(2)
104 var explosion = Explosion.instance()
105 explosion.transform = transform
106 get_parent().add_child(explosion)
107 kill()
108