added enemy state machine with idle, stunned, and dead states
This commit is contained in:
@@ -5,12 +5,10 @@ signal last_enemy_dead()
|
||||
|
||||
var player
|
||||
var last_enemy : bool = false
|
||||
|
||||
@export var start_health = 3
|
||||
@export var SPEED = 3.0
|
||||
@export var loot_amount = 2
|
||||
const MAX_LV = 10
|
||||
const MAX_AV = 10
|
||||
@export var nav_agent : NavigationAgent3D
|
||||
|
||||
@export_enum("Enemy", "Trap") var enemy_type: int
|
||||
@export var bullet : Resource
|
||||
@@ -20,17 +18,13 @@ const MAX_AV = 10
|
||||
@export var random_spread_amt = .01
|
||||
@export var bullet_damage = 1
|
||||
@export var turret_look_speed = 6
|
||||
@export var stamina : Resource
|
||||
@export var ammo : Resource
|
||||
@export var money : Resource
|
||||
@export var health_pickup : Resource
|
||||
@export var die_particles : Resource
|
||||
@export var damage_number : Resource
|
||||
@export_group("Taunts")
|
||||
@export var taunts : Array[String] = []
|
||||
|
||||
|
||||
@onready var level_control = get_tree().current_scene
|
||||
@onready var nav_agent = $NavigationAgent3D
|
||||
@onready var movement_shape = $MovementShape
|
||||
@onready var barrel_1 = $TurretLook/Turret/Barrel1
|
||||
@onready var barrel_2 = $TurretLook/Turret/Barrel2
|
||||
@@ -90,52 +84,7 @@ func _ready():
|
||||
|
||||
|
||||
func _process(delta):
|
||||
|
||||
# Navigation
|
||||
if !knocked:
|
||||
if hive_velocity:
|
||||
velocity = hive_velocity
|
||||
|
||||
if !stunned:
|
||||
stunned_stars.visible = false
|
||||
#Sightline
|
||||
if turret_look_next.get_collider() != null:
|
||||
if turret_look_next.get_collider().is_in_group("player"):
|
||||
player_in_view = true
|
||||
player_last_seen = turret_look_next.get_collider().global_position
|
||||
if player != null:
|
||||
spider_look_next.look_at(Vector3(player.global_position.x, 0, player.global_position.z), Vector3.UP)
|
||||
body.rotation.y = lerp(body.rotation.y, spider_look_next.rotation.y, delta * 1)
|
||||
turret_look_next.look_at(player.global_position,Vector3.UP)
|
||||
turret_look.rotation = lerp(turret_look.rotation,turret_look_next.rotation,delta * turret_look_speed)
|
||||
else:
|
||||
body.rotation.y = lerp(body.rotation.y, body.rotation.y + 10, delta * .1)
|
||||
turret_look.rotation.y = lerp(turret_look.rotation.y,turret_look.rotation.y - 10,delta * .5)
|
||||
stunned_stars.visible = true
|
||||
|
||||
#apply gravity
|
||||
if !is_on_floor():
|
||||
velocity.y -= gravity * delta
|
||||
|
||||
move_and_slide()
|
||||
|
||||
if dying:
|
||||
turret.global_rotation.y += 200 * delta
|
||||
#fire(barrel_1)
|
||||
#fire(barrel_2)
|
||||
|
||||
if can_die:
|
||||
die()
|
||||
|
||||
|
||||
func _on_area_3d_body_part_hit(dam,bullet_damage):
|
||||
health_bar_sprite.visible = true
|
||||
health_bar_sprite.health_update()
|
||||
if !dying:
|
||||
health -= dam * bullet_damage
|
||||
if health <= 0:
|
||||
dying_throws()
|
||||
|
||||
|
||||
func _on_prefire_timer_timeout():
|
||||
fire(barrel_1)
|
||||
@@ -187,58 +136,6 @@ func spawn_casing():
|
||||
instance_casing.player_velocity = velocity * transform.basis
|
||||
get_tree().get_root().add_child(instance_casing)
|
||||
|
||||
func dying_throws():
|
||||
dying = true
|
||||
drop_loot(loot_amount)
|
||||
|
||||
func die():
|
||||
#remove from parent array
|
||||
get_parent().enemies.erase(self)
|
||||
level_control.enemy_count()
|
||||
particlespawn = die_particles.instantiate()
|
||||
particlespawn.position = self.global_position
|
||||
particlespawn.transform.basis = self.global_transform.basis
|
||||
get_tree().get_root().add_child(particlespawn)
|
||||
|
||||
drop_loot(loot_amount)
|
||||
if GameGlobals.last_hit_path == str(get_path()):
|
||||
GameGlobals.last_hit_path = null
|
||||
|
||||
SignalBus.emit_signal("enemy_killed")
|
||||
queue_free()
|
||||
|
||||
func drop_loot(number_of_drops):
|
||||
#pickup drop
|
||||
while number_of_drops > 0:
|
||||
|
||||
var pickup_spawn = level_control.ITEM_PICKUP.instantiate()
|
||||
var item_stats = level_control.pickup_spawn(false)
|
||||
|
||||
##SET VARIABLES
|
||||
pickup_spawn.pickup_type = item_stats["pickup_type"]
|
||||
pickup_spawn.ammo_type = item_stats["ammo_type"]
|
||||
pickup_spawn.value = item_stats["value"]
|
||||
|
||||
var lv_x = randf_range(-MAX_LV,MAX_LV)
|
||||
var lv_y = randf_range(0,MAX_LV)
|
||||
var lv_z = randf_range(-MAX_LV,MAX_LV)
|
||||
var av_x = randf_range(-MAX_AV,MAX_AV)
|
||||
var av_y = randf_range(-MAX_AV,MAX_AV)
|
||||
var av_z = randf_range(-MAX_AV,MAX_AV)
|
||||
|
||||
# Random Item Drop
|
||||
pickup_spawn.position = self.global_position + Vector3(0,2,0) #added height to spawn location since origin is on the ground
|
||||
pickup_spawn.transform.basis = self.global_transform.basis
|
||||
pickup_spawn.linear_velocity += self.global_transform.basis * Vector3(lv_x,lv_y,lv_z)
|
||||
pickup_spawn.angular_velocity += self.global_transform.basis * Vector3(av_x,av_y,av_z)
|
||||
await get_tree().create_timer(.05).timeout
|
||||
get_tree().get_root().add_child(pickup_spawn)
|
||||
number_of_drops -= 1
|
||||
|
||||
if number_of_drops <= 0:
|
||||
can_die = true
|
||||
|
||||
|
||||
|
||||
func save():
|
||||
var save_dict = {
|
||||
|
||||
Reference in New Issue
Block a user