2017-07-29 22:28:46 +01:00
|
|
|
extends KinematicBody2D
|
2017-07-29 15:49:55 +01:00
|
|
|
|
2017-08-24 20:50:28 +01:00
|
|
|
var ExplosionEffect = load("res://ExplosionEffect.tscn")
|
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
onready var sprite = get_node("Sprite")
|
2017-07-30 17:30:10 +01:00
|
|
|
onready var camera = get_node("Camera2D")
|
2017-07-30 22:15:53 +01:00
|
|
|
onready var left_particles = get_node("Sprite/LeftThruster")
|
|
|
|
onready var right_particles = get_node("Sprite/RightThruster")
|
|
|
|
onready var engine_particles = get_node("Sprite/Engine")
|
2017-07-30 21:25:42 +01:00
|
|
|
onready var left_gun = get_node("Sprite/LeftGun")
|
|
|
|
onready var right_gun = get_node("Sprite/RightGun")
|
2017-08-13 00:32:41 +01:00
|
|
|
onready var audio = get_node("SamplePlayer")
|
2017-07-29 15:49:55 +01:00
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
var mov_speed = 64 # pixels per second
|
|
|
|
var ship_vel = Vector2(0, 0)
|
|
|
|
var ship_max_vel = 100 # pixels per second
|
|
|
|
var ship_accel = 25 # pixels per second.. per second?
|
2017-07-30 22:47:29 +01:00
|
|
|
var ship_turn_speed = deg2rad(180) # degrees per second.. i guess?
|
2017-07-30 20:57:41 +01:00
|
|
|
var ship_dir = Vector2(1, 0)
|
2017-07-29 22:28:46 +01:00
|
|
|
var ship_mass = 61
|
2017-07-29 15:49:55 +01:00
|
|
|
|
2017-08-24 20:50:28 +01:00
|
|
|
var ship_health = 100
|
|
|
|
var player_is_dead = false
|
|
|
|
|
2017-07-30 20:57:41 +01:00
|
|
|
var is_moving = false
|
2017-08-13 00:32:41 +01:00
|
|
|
var missiles_locked_on = 0
|
|
|
|
var is_engine_playing = false
|
|
|
|
var enemy_missiles = Array()
|
|
|
|
|
|
|
|
var bleep_timer = 0
|
|
|
|
var bleep_delay = 0.5
|
2017-07-29 15:49:55 +01:00
|
|
|
|
|
|
|
func _ready():
|
|
|
|
set_fixed_process(true)
|
2017-07-30 22:15:53 +01:00
|
|
|
left_particles.set_emitting(false)
|
|
|
|
right_particles.set_emitting(false)
|
2017-09-04 20:21:45 +01:00
|
|
|
left_gun.set_owner(type())
|
|
|
|
right_gun.set_owner(type())
|
2017-08-12 17:02:52 +01:00
|
|
|
|
|
|
|
func type():
|
|
|
|
return "Player"
|
|
|
|
|
|
|
|
func do_damage(v):
|
2017-08-24 20:50:28 +01:00
|
|
|
ship_health -= v
|
2017-08-12 21:29:25 +01:00
|
|
|
|
|
|
|
func get_kinematic_position():
|
|
|
|
return get_global_pos() + ship_vel
|
2017-08-04 19:53:05 +01:00
|
|
|
|
2017-08-13 00:32:41 +01:00
|
|
|
func on_enemy_missile_lock(m):
|
|
|
|
enemy_missiles.append(m)
|
|
|
|
missiles_locked_on += 1
|
|
|
|
|
|
|
|
func on_enemy_missile_lock_lost(m):
|
|
|
|
enemy_missiles.erase(m)
|
|
|
|
missiles_locked_on -= 1
|
|
|
|
if missiles_locked_on <= 0:
|
2017-08-13 00:43:46 +01:00
|
|
|
pass
|
2017-08-13 00:32:41 +01:00
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
func turn_towards(delta, pos):
|
2017-07-29 15:49:55 +01:00
|
|
|
|
2017-07-30 17:30:10 +01:00
|
|
|
var target_dir = (pos - get_global_pos()).normalized()
|
2017-07-29 22:28:46 +01:00
|
|
|
var cpd = target_dir.dot(ship_dir.rotated(deg2rad(90)))
|
2017-07-29 15:49:55 +01:00
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
var as = asin(cpd)
|
|
|
|
var ca = clamp(as, (-ship_turn_speed) * delta, (ship_turn_speed) * delta)
|
2017-07-30 22:15:53 +01:00
|
|
|
|
|
|
|
left_particles.set_param(Particles2D.PARAM_LINEAR_VELOCITY, 400 * abs(ca))
|
|
|
|
right_particles.set_param(Particles2D.PARAM_LINEAR_VELOCITY, 400 * abs(ca))
|
2017-07-30 22:31:47 +01:00
|
|
|
|
2017-07-30 22:15:53 +01:00
|
|
|
if ca < -0.01:
|
|
|
|
left_particles.set_emitting(false)
|
|
|
|
right_particles.set_emitting(true)
|
|
|
|
elif ca > 0.01:
|
|
|
|
left_particles.set_emitting(true)
|
|
|
|
right_particles.set_emitting(false)
|
|
|
|
else:
|
|
|
|
left_particles.set_emitting(false)
|
|
|
|
right_particles.set_emitting(false)
|
2017-07-29 15:49:55 +01:00
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
ship_dir = ship_dir.rotated(-ca)
|
2017-08-13 00:32:41 +01:00
|
|
|
|
|
|
|
func get_closest_missile_distance():
|
|
|
|
var min_dist = 1000
|
|
|
|
for m in enemy_missiles:
|
|
|
|
var mis_dist = get_global_pos().distance_to(m.get_global_pos())
|
|
|
|
if mis_dist < min_dist:
|
|
|
|
min_dist = mis_dist
|
|
|
|
return min_dist
|
2017-08-24 20:50:28 +01:00
|
|
|
|
|
|
|
func player_explode():
|
|
|
|
# create explosion effect
|
|
|
|
var new_ee = ExplosionEffect.instance()
|
|
|
|
get_tree().get_root().add_child(new_ee)
|
|
|
|
new_ee.set_global_pos(get_global_pos())
|
|
|
|
player_is_dead = true
|
2017-08-04 19:53:05 +01:00
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
func _fixed_process(delta):
|
|
|
|
|
2017-08-24 20:50:28 +01:00
|
|
|
if ship_health <= 0 and not player_is_dead:
|
|
|
|
player_explode()
|
|
|
|
|
|
|
|
if player_is_dead:
|
|
|
|
return
|
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
var mov_delta = Vector2(0, 0)
|
2017-07-30 17:30:10 +01:00
|
|
|
turn_towards(delta, get_global_mouse_pos())
|
2017-08-04 19:53:05 +01:00
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
if Input.is_action_pressed("player_move_forwards"):
|
2017-07-30 20:57:41 +01:00
|
|
|
is_moving = true
|
2017-07-29 22:28:46 +01:00
|
|
|
mov_delta += -ship_dir
|
|
|
|
elif Input.is_action_pressed("player_move_backwards"):
|
|
|
|
mov_delta += ship_dir
|
2017-07-30 20:57:41 +01:00
|
|
|
else:
|
|
|
|
is_moving = false
|
2017-08-04 19:53:05 +01:00
|
|
|
|
2017-07-30 19:46:44 +01:00
|
|
|
if Input.is_action_pressed("player_attack_primary"):
|
2017-07-30 21:49:58 +01:00
|
|
|
left_gun.fire(delta, ship_vel, -ship_dir)
|
|
|
|
right_gun.fire(delta, ship_vel, -ship_dir)
|
2017-07-30 19:46:44 +01:00
|
|
|
elif Input.is_action_pressed("player_attack_secondary"):
|
|
|
|
pass
|
2017-07-30 21:49:58 +01:00
|
|
|
|
2017-07-30 19:46:44 +01:00
|
|
|
if Input.is_action_pressed("player_switch_up"):
|
|
|
|
pass
|
|
|
|
elif Input.is_action_pressed("player_switch_down"):
|
|
|
|
pass
|
2017-08-13 00:32:41 +01:00
|
|
|
|
|
|
|
# get closest enemy missile, calc distance
|
|
|
|
var closest_missile_dist = get_closest_missile_distance()
|
|
|
|
|
|
|
|
if closest_missile_dist == 1000:
|
|
|
|
bleep_delay = 0.5
|
|
|
|
else:
|
|
|
|
bleep_delay = closest_missile_dist / 1000
|
|
|
|
|
|
|
|
bleep_timer += delta
|
|
|
|
if missiles_locked_on > 0 and bleep_timer > bleep_delay:
|
|
|
|
if closest_missile_dist > 10:
|
|
|
|
audio.play("friendly_blip")
|
|
|
|
bleep_timer = 0
|
|
|
|
|
|
|
|
if is_moving and not is_engine_playing:
|
|
|
|
is_engine_playing = true
|
|
|
|
# audio.play("engine")
|
|
|
|
elif not is_moving:
|
|
|
|
is_engine_playing = false
|
|
|
|
# audio.stop(0)
|
2017-07-29 15:49:55 +01:00
|
|
|
|
2017-08-12 22:54:09 +01:00
|
|
|
set_rot(ship_dir.angle())
|
2017-07-29 15:49:55 +01:00
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
var new_vel = (ship_vel + (mov_delta * (delta * ship_accel))).clamped(ship_max_vel)
|
|
|
|
var diff = new_vel - ship_vel
|
|
|
|
ship_vel += diff
|
2017-07-29 15:49:55 +01:00
|
|
|
|
2017-07-29 22:28:46 +01:00
|
|
|
self.move(ship_vel)
|
|
|
|
ship_vel = ship_vel / (delta * ship_mass)
|
2017-07-30 20:57:41 +01:00
|
|
|
|
2017-07-30 22:15:53 +01:00
|
|
|
engine_particles.set_emitting(is_moving)
|