190 lines
6.0 KiB
GDScript
190 lines
6.0 KiB
GDScript
extends CharacterBody3D
|
|
|
|
var player
|
|
@export var health = 3
|
|
@export var number_of_drops = 3
|
|
|
|
@export var SPEED = 3.0
|
|
const MAX_LV = 10
|
|
const MAX_AV = 10
|
|
|
|
@export var player_path : NodePath
|
|
@export var bullet : Resource
|
|
@export var casing : Resource
|
|
@export var bullet_speed = 150
|
|
@export var bullet_drop = .1
|
|
@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
|
|
|
|
@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
|
|
@onready var casing_ejector = $TurretLook/Turret/CasingEjector
|
|
@onready var prefire_timer = $Timers/prefire_timer
|
|
@onready var postfire_timer = $Timers/postfire_timer
|
|
@onready var knocked_timer = $Timers/knocked_timer
|
|
@onready var stunned_timer = $Timers/stunned_timer
|
|
@onready var turret_look_next = $TurretLookNext
|
|
@onready var spider_look_next = $SpiderLookNext
|
|
@onready var body = $body
|
|
@onready var audio_fire = $AUIDO/Fire
|
|
@onready var turret = $TurretLook/Turret
|
|
@onready var turret_material = turret.get_surface_override_material(2)
|
|
@onready var turret_look = $TurretLook
|
|
@onready var outline_meshes = [$TurretLook/Turret/turretoutline,
|
|
$body/leg1/foot1/foot1outline,
|
|
$body/leg1/leg1outline,
|
|
$body/leg2/foot2/foot2outline,
|
|
$body/leg2/leg2outline,
|
|
$body/leg3/foot3/foot3outline,
|
|
$body/leg3/leg3outline,
|
|
$body/leg4/foot4/foot4outline,
|
|
$body/leg4/leg4outline,
|
|
$body/bodyoutline]
|
|
|
|
var gravity = 9.8
|
|
var particlespawn
|
|
var rng = RandomNumberGenerator.new()
|
|
var rand_select
|
|
var rand_item
|
|
var body_look_to
|
|
var distance_to_player
|
|
var hive_velocity
|
|
var hive_nav_point
|
|
var knocked = false
|
|
var stunned = false
|
|
|
|
func _ready():
|
|
player = level_control.player
|
|
turret_material.emission_enabled = false
|
|
|
|
#randomly start the postfire timer so enemy turrets aren't synced
|
|
var random_time = rng.randf_range(0,5)
|
|
await get_tree().create_timer(random_time).timeout
|
|
postfire_timer.start()
|
|
|
|
|
|
func _process(delta):
|
|
|
|
# Navigation
|
|
if !knocked:
|
|
if hive_velocity:
|
|
velocity = hive_velocity
|
|
|
|
if !stunned:
|
|
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)
|
|
|
|
#apply gravity
|
|
if !is_on_floor():
|
|
velocity.y -= gravity * delta
|
|
|
|
move_and_slide()
|
|
|
|
|
|
func _on_area_3d_body_part_hit(dam,bullet_damage):
|
|
health -= dam * bullet_damage
|
|
print("health: " + str(health))
|
|
if health <= 0:
|
|
#remove from parent array
|
|
get_parent().minions.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)
|
|
|
|
#pickup drop
|
|
while number_of_drops > 0:
|
|
var rand_item = level_control.pickup_spawn()
|
|
var lv_x = rng.randf_range(-MAX_LV,MAX_LV)
|
|
var lv_y = rng.randf_range(0,MAX_LV)
|
|
var lv_z = rng.randf_range(-MAX_LV,MAX_LV)
|
|
var av_x = rng.randf_range(-MAX_AV,MAX_AV)
|
|
var av_y = rng.randf_range(-MAX_AV,MAX_AV)
|
|
var av_z = rng.randf_range(-MAX_AV,MAX_AV)
|
|
|
|
# Random Item Drop
|
|
#rand_item = rand_select.instantiate()
|
|
rand_item.position = self.global_position
|
|
rand_item.transform.basis = self.global_transform.basis
|
|
rand_item.linear_velocity += self.global_transform.basis * Vector3(lv_x,lv_y,lv_z)
|
|
rand_item.angular_velocity += self.global_transform.basis * Vector3(av_x,av_y,av_z)
|
|
get_tree().get_root().add_child(rand_item)
|
|
number_of_drops -= 1
|
|
|
|
queue_free()
|
|
|
|
|
|
func _on_prefire_timer_timeout():
|
|
#barrel 1 fire
|
|
var instance_bullet = bullet.instantiate()
|
|
instance_bullet.position = barrel_1.global_position
|
|
instance_bullet.transform.basis = barrel_1.global_transform.basis
|
|
instance_bullet.bullet_speed = bullet_speed
|
|
instance_bullet.bullet_drop = bullet_drop
|
|
instance_bullet.random_spread_amt = random_spread_amt
|
|
instance_bullet.bullet_damage = bullet_damage
|
|
instance_bullet.fired_by = self
|
|
get_tree().get_root().add_child(instance_bullet)
|
|
|
|
#barrel 2 fire
|
|
var instance_bullet2 = bullet.instantiate()
|
|
instance_bullet2.position = barrel_2.global_position
|
|
instance_bullet2.transform.basis = barrel_2.global_transform.basis
|
|
instance_bullet2.bullet_speed = bullet_speed
|
|
instance_bullet2.bullet_drop = bullet_drop
|
|
instance_bullet2.random_spread_amt = random_spread_amt
|
|
instance_bullet2.bullet_damage = bullet_damage
|
|
instance_bullet2.fired_by = self
|
|
get_tree().get_root().add_child(instance_bullet2)
|
|
turret_material.emission_enabled = false
|
|
|
|
var instance_casing = casing.instantiate()
|
|
instance_casing.position = casing_ejector.global_position
|
|
instance_casing.transform.basis = casing_ejector.global_transform.basis
|
|
var instance_casing2 = casing.instantiate()
|
|
instance_casing2.position = casing_ejector.global_position
|
|
instance_casing2.transform.basis = casing_ejector.global_transform.basis
|
|
get_tree().get_root().add_child(instance_casing)
|
|
get_tree().get_root().add_child(instance_casing2)
|
|
|
|
audio_fire.play()
|
|
|
|
prefire_timer.stop()
|
|
postfire_timer.start()
|
|
|
|
|
|
func _on_postfire_timer_timeout():
|
|
if turret_look_next.is_colliding() and turret_look_next.get_collider().is_in_group("player") and !stunned:
|
|
prefire_timer.start()
|
|
turret_material.emission_enabled = true
|
|
else:
|
|
postfire_timer.start()
|
|
|
|
|
|
func _on_knocked_timer_timeout():
|
|
print("KNOCK TIMEOUT")
|
|
velocity = Vector3(0,0,0)
|
|
knocked = false
|
|
|
|
|
|
func _on_stunned_timer_timeout():
|
|
print("STUN TIMEOUT")
|
|
stunned = false
|