Files
fps_project_1/scripts/spider.gd
2024-07-18 13:45:37 -05:00

155 lines
5.1 KiB
GDScript

extends CharacterBody3D
var player = null
@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 = 5
@onready var nav_agent = $NavigationAgent3D
@onready var target = $body/target
@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 retarget_timer = $Timers/retarget_timer
@onready var turret_look_next = $TurretLookNext
@onready var spider_look_next = $SpiderLookNext
@onready var body = $body
@onready var turret = $TurretLook/Turret
@onready var turret_material = turret.mesh.surface_get_material(2)
var stamina = load("res://assets/stamina_pickup.tscn")
var ammo = load("res://assets/ammo_pickup.tscn")
var money = load("res://assets/money_1.tscn")
var die_particles = load("res://assets/die_particles.tscn")
@onready var turret_look = $TurretLook
var particlespawn
var rng = RandomNumberGenerator.new()
var rand_select
var rand_item
var body_look_to
func _ready():
player = get_node(player_path)
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):
velocity = Vector3.ZERO
# Navigation
nav_agent.set_target_position(player.global_transform.origin)
var next_nav_point = nav_agent.get_next_path_position()
velocity = (next_nav_point - global_transform.origin).normalized() * SPEED
#FIX BODY ROTATION
#spider_look_next.look_at(Vector3(player.global_position.x, global_position.y, player.global_position.z), Vector3.UP)
#self.rotation = lerp(self.rotation, spider_look_next.rotation, 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)
move_and_slide()
func _on_area_3d_body_part_hit(dam,bullet_damage):
health -= dam * bullet_damage
print("health: " + str(health))
if health <= 0:
particlespawn = die_particles.instantiate()
particlespawn.position = self.global_position
particlespawn.transform.basis = self.global_transform.basis
get_parent().add_child(particlespawn)
#pickup drop
while number_of_drops > 0:
var rand_selector = int(round(rng.randf_range(1,3)))
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)
match rand_selector:
1:
rand_select = stamina
2:
rand_select = ammo
3:
rand_select = money
# 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_parent().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
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
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)
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"):
prefire_timer.start()
turret_material.emission_enabled = true