extends KinematicBody2D
class_name playerkinematic
var counter
var i_am_in_cooldown: bool
var wait_time = .1
var walled = false
export var id = 1
export var fireoffset = 2
onready var animationState = $AnimationTree.get("parameters/playback")
onready var HitEffect = preload("res://effects/HitEffect.tscn")
onready var hitSound = $AudioStreamPlayer
const ExplosionEffect = preload("res://effects/ExplosionEffect.tscn")
var attack = preload("res://bullets/scenes/Laser.tscn")
export(int) var SPEED = 100
onready var timer = $Timer
var movementpenalty = 20
var velocity = Vector2.ZERO
signal player_death
var ACCELERATION = 500
var FRICTION = 20
var recoil = 40
var input_vector = Vector2.ZERO
var USE_TOUCH = OS.has_touchscreen_ui_hint()
onready var splitshotu
onready var rocketsu
onready var lasersu
onready var flaku
onready var beamu
onready var fire = $Fire
var amount = 1
var target = null
var firing = false
var thrusting_last_frame = false
var shake_intensity = .3
var quant = 30
var shake_duration = .2
func _ready():
playerstats.gun = "lasers"
$MobileJoystick/TouchScreenButton.visible = USE_TOUCH
$MobileJoystick/MobileControls/Attack.visible = USE_TOUCH
$"MobileJoystick/MobileControls/Change gun".visible = USE_TOUCH
$AnimationTree.active = true
lasersu = playerstats.lasers
rocketsu = playerstats.rockets
splitshotu = playerstats.splitshot
flaku = playerstats.flak
beamu = playerstats.beam
func create_hit_effect():
Game.instance_scene_on_main(HitEffect, global_position)
func _physics_process(delta):
input_vector.x = Input.get_axis("left_%s" % id, "right_%s" % id)
input_vector.y = Input.get_axis("up_%s" % id, "down_%s" % id)
if Game.keyboard:
input_vector = input_vector.normalized()
if $MobileJoystick/TouchScreenButton.in_use:
input_vector = $MobileJoystick/TouchScreenButton.force
#makes a input vector based off of inputs, and supports controllers
# fire particle code
var fire_dir = input_vector * -1
fire.direction = fire_dir
if input_vector.x > 0 or input_vector.y != 0:
fire.emitting = true
fire.initial_velocity = input_vector.x * 40
else:
fire.emitting = false
if input_vector != Vector2.ZERO:
if not thrusting_last_frame:
$thrustsfxin.playing = true
if not $thrustsfxloop.playing:
$thrustsfxloop.playing = true
thrusting_last_frame = true
else:
if thrusting_last_frame:
$thrustsfxloop.playing = false
$thrustsfxend.playing = true
if $thrustsfxin.playing:
$thrustsfxin.playing = false
thrusting_last_frame = false
if input_vector != Vector2.ZERO: #moves ya
velocity = velocity.move_toward(input_vector * SPEED, ACCELERATION * delta)
$AnimationTree.set("parameters/Turn/blend_position", input_vector)
animationState.travel("Turn")
else:
#stops you
animationState.travel("Idle")
velocity = velocity.move_toward(Vector2.ZERO, FRICTION * delta)
if firing:
SPEED = movementpenalty
if not i_am_in_cooldown:
if randi() % quant == quant - 1:
Glitch.apply(.1, amount)
else:
SPEED = 100
if not i_am_in_cooldown and Input.is_action_pressed("shoot_%s" % id):
shoot()
elif not Input.is_action_pressed("shoot_%s" % id):
firing = false
if Input.is_action_just_pressed("change_gun_%s" % id):
match playerstats.gun:
"lasers":
rockets()
"rockets":
lasers()
# "splitshot":
# lasers()
# "flak":
# lasers()
velocity = move_and_slide(velocity)
func _on_TouchScreenButton_force(force):
input_vector = force
func _on_Ship_area_entered(area):
if not area.is_in_group("pbullet") and not area.is_in_group("Player"):
qfreenplay(area)
func qfreenplay(q):
q.queue_free()
play()
func _on_Ship_body_entered(body):
if not body.is_in_group("Player") and not body.is_in_group("pbullet"):
qfreenplay(body)
func play():
hitSound.play()
func _on_AudioStreamPlayer_finished():
playerstats.hp -= 1
if playerstats.hp <= 0:
$AnimationPlayer.play("Die Anim")
func _go_into_cooldown():
i_am_in_cooldown = true
timer.start(wait_time)
yield(timer, "timeout")
i_am_in_cooldown = false
func flak():
if flaku:
wait_time = .001
shake_intensity = .03
shake_duration = .04
enemy_damage.min_damage = 15
enemy_damage.max_damage = 30
movementpenalty = 0
quant = 20
amount = .5
recoil = 1
attack = preload("res://bullets/scenes/Flak.tscn")
playerstats.gun = "flak"
func rockets():
if rocketsu:
shake_intensity = .4
shake_duration = .3
wait_time = 1
amount = 1
quant = 4
enemy_damage.min_damage = 10
enemy_damage.max_damage = 30
movementpenalty = 60
recoil = 200
attack = preload("res://bullets/scenes/missile.tscn")
playerstats.gun = "rockets"
func lasers():
if lasersu:
amount = 1
shake_intensity = .3
shake_duration = .2
wait_time = .1
quant = 20
enemy_damage.min_damage = 4
enemy_damage.max_damage = 9
movementpenalty = 20
recoil = 20
attack = preload("res://bullets/scenes/Laser.tscn")
playerstats.gun = "lasers"
func splitshot():
if splitshotu:
quant = 40
wait_time = 0.05
shake_intensity = .2
amount = .5
shake_duration = .2
enemy_damage.min_damage = .5
enemy_damage.max_damage = 1
recoil = 12
movementpenalty = 130
attack = preload("res://bullets/scenes/SplitShot.tscn")
playerstats.gun = "splitshot"
func shoot(): #shoot
_go_into_cooldown()
if !firing:
firing = true
Shake.shake(shake_intensity, shake_duration)
match playerstats.gun:
"rockets":
var muzzles = $Muzzles/RocketMuzzle.get_children()
for muzzle in muzzles:
var bullet = fire(muzzle.global_position, attack)
bullet.start(target)
"lasers":
var muzzles = $Muzzles/LaserMuzzle.get_children()
for muzzle in muzzles:
fire(muzzle.global_position, attack)
"splitshot":
var muzzles = $Muzzles/SplitMuzzle.get_children()
for muzzle in muzzles:
fire(muzzle.global_position, attack)
"flak":
var muzzles = $Muzzles/FlakMuzzle.get_children()
for muzzle in muzzles:
fire(muzzle.global_position, attack)
# warning-ignore:function_conflicts_variable
func fire(global_pos, Bullet):
var bullet = Game.instance_scene_on_main(Bullet, global_pos)
if playerstats.power:
bullet.powered_up = true
if not self.is_on_wall():
velocity.x -= recoil
else:
velocity.x -= recoil / 10
return bullet
func _exit_tree():
playerstats.alive = false
Game.instance_scene_on_main(ExplosionEffect, global_position)
emit_signal("player_death")
func _on_target_getter_target(_target):
target = _target