226 lines
6.5 KiB
GDScript
226 lines
6.5 KiB
GDScript
extends CharacterBody2D
|
|
|
|
|
|
const SPEED := 300.0
|
|
var health := 30.0 # represented in seconds
|
|
var newHealth := -1.0
|
|
|
|
@onready var bullet = preload("res://assets/scenes/playerBullet.tscn")
|
|
@onready var gun = $gun
|
|
@onready var gunSprite = $gun/sprite
|
|
@onready var animations = $AnimationPlayer
|
|
@onready var shootsfx = $shootsfx
|
|
@onready var hitsfx = $hitsfx
|
|
@onready var dashRect = $MeshInstance2D
|
|
@onready var poly = $Polygon2D
|
|
|
|
signal transitionStart(seconds)
|
|
|
|
var speedUp := 0.0
|
|
var speedScale := 2.0
|
|
var damageScale := 1.0
|
|
var minDamageScale := 1.0
|
|
|
|
var dashTimer := 0.0
|
|
|
|
var dashVel := Vector2.ZERO
|
|
var knockback := Vector2.ZERO
|
|
|
|
var flip := false
|
|
var ticks = 0
|
|
var tickToDel = 0
|
|
|
|
var frameData = {} # keep position, rotation and velocity for now
|
|
|
|
var amountTransition := 0.0
|
|
var transitioning := false
|
|
var transitionState = [false, false, false]
|
|
var targetState = []
|
|
|
|
var dead := false
|
|
|
|
var damage_stack := 1.0
|
|
|
|
var shotgun := 0
|
|
|
|
func heal(seconds):
|
|
damage_stack *= pow(1.1, Globals.unlockedUpgrades.get("thoseWereTheDays", 0))
|
|
|
|
newHealth = health + seconds
|
|
transitionStart.emit(seconds)
|
|
#print(frameData)
|
|
targetState = frameData[max(tickToDel, ticks - (int(floor(seconds)) * 20))]
|
|
transitioning = true
|
|
|
|
func healNoMove(seconds):
|
|
newHealth = health + seconds
|
|
|
|
func _process(delta: float) -> void:
|
|
if damageScale > minDamageScale: damageScale -= delta
|
|
damageScale = max(damageScale, minDamageScale)
|
|
|
|
shotgun = Globals.unlockedUpgrades.get("shotgun", 0)
|
|
if shotgun > 0:
|
|
gunSprite.region_rect = Rect2(64, 80, 32, 16)
|
|
else:
|
|
gunSprite.region_rect = Rect2(0, 112, 16, 16)
|
|
#ticks += 1
|
|
|
|
dashRect.position.y = 31 * dashTimer / Globals.DASH_WAIT / 2 - 31.0 / 2
|
|
dashRect.scale.y = dashTimer / Globals.DASH_WAIT
|
|
|
|
if health < 10:
|
|
poly.position = Vector2(randi_range(-(10 - health) / 5,(10 - health) / 5), randi_range(-(10 - health) / 5,(10 - health) / 5))
|
|
|
|
if health <= 0 and not dead:
|
|
$explode.emitting = true
|
|
$explode.unlock = true
|
|
$explode.reparent(get_parent())
|
|
$PointLight2D.reparent(get_parent())
|
|
dead = true
|
|
hide()
|
|
|
|
|
|
var grayscaleVal := 1.0
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if dead: return
|
|
|
|
if newHealth != -1:
|
|
health += (newHealth - health) * 3 * delta
|
|
|
|
if abs(health - newHealth) < 1:
|
|
health = newHealth
|
|
newHealth = -1
|
|
|
|
if transitioning:
|
|
|
|
grayscaleVal += - grayscaleVal * 10 * delta
|
|
|
|
position += (targetState[0] - position) * 5 * delta / Engine.time_scale
|
|
rotation += (targetState[1] - rotation) * 5 * delta / Engine.time_scale
|
|
velocity += (targetState[2] - velocity) * 5 * delta / Engine.time_scale
|
|
|
|
Engine.time_scale += (0.5 - Engine.time_scale) * 5 * delta / Engine.time_scale
|
|
|
|
#
|
|
#position = position.round()
|
|
#rotation = round(rotation)
|
|
#velocity = velocity.round()
|
|
|
|
#print((position - targetState[0]).length(), " ", abs(rotation - targetState[1]), " ", (velocity - targetState[2]).length())
|
|
|
|
if (position - targetState[0]).length() < 2:
|
|
position = targetState[0]
|
|
transitionState[0] = true
|
|
if abs(rotation - targetState[1]) < 0.05:
|
|
rotation = targetState[1]
|
|
transitionState[1] = true
|
|
if (velocity - targetState[2]).length() < 2:
|
|
velocity = targetState[2]
|
|
transitionState[2] = true
|
|
|
|
if transitionState.count(true) == len(transitionState):
|
|
transitioning = false
|
|
transitionState = [false, false, false]
|
|
targetState = []
|
|
health = ceil(health)
|
|
amountTransition = 0
|
|
|
|
return
|
|
|
|
grayscaleVal += (1-grayscaleVal) * 2 * delta
|
|
|
|
var direction := Input.get_vector("moveLeft", "moveRight", "moveUp", "moveDown")
|
|
velocity = direction * SPEED
|
|
|
|
if Globals.unlockedUpgrades.get("fasterFaster", 0) > 0:
|
|
velocity *= pow(1.15, Globals.unlockedUpgrades["fasterFaster"])
|
|
|
|
gun.rotation += gun.get_angle_to(get_global_mouse_position()) * 7 * delta
|
|
#print(fposmod(gun.rotation + PI, PI * 2) - PI)
|
|
var truerot = fposmod(gun.rotation + PI, PI * 2) - PI
|
|
if truerot < -PI / 2 or truerot > PI / 2:
|
|
gun.scale.y += (-1 - gun.scale.y) * 10 * delta
|
|
flip = true
|
|
else:
|
|
gun.scale.y += (1 - gun.scale.y) * 10 * delta
|
|
flip = false
|
|
|
|
|
|
var ang = gun.rotation + gun.get_angle_to(get_global_mouse_position())
|
|
if Input.is_action_just_pressed("dash") and dashTimer == 0:
|
|
dashVel = Vector2(cos(ang), sin(ang)) * Globals.DASH_LENGTH * pow(1.5, Globals.unlockedUpgrades.get("dashMachine", 0))
|
|
dashTimer = Globals.DASH_WAIT * pow(0.8, Globals.unlockedUpgrades.get("dashMachine", 0))
|
|
|
|
if dashTimer > 0: dashTimer -= delta
|
|
else: dashTimer = 0
|
|
|
|
if Input.is_action_just_pressed("shoot"):
|
|
if not animations.is_playing():
|
|
#var ang = gun.rotation + gun.get_angle_to(get_global_mouse_position())
|
|
if shotgun > 0:
|
|
for ind in range(-shotgun, shotgun + 1):
|
|
var instantiated = bullet.instantiate()
|
|
instantiated.global_position = global_position# + Vector2(cos(ang + ind * 0.2) * 16, sin(ang + ind * 0.3) * 16)
|
|
instantiated.velocity.x = cos(ang + ind * 0.2) * 700
|
|
instantiated.velocity.y = sin(ang + ind * 0.2) * 700
|
|
get_parent().add_child(instantiated)
|
|
else:
|
|
var instantiated = bullet.instantiate()
|
|
instantiated.global_position = global_position
|
|
instantiated.velocity.x = cos(ang) * 700
|
|
instantiated.velocity.y = sin(ang) * 700
|
|
get_parent().add_child(instantiated)
|
|
|
|
shootsfx.play()
|
|
|
|
if flip: animations.play("shoot_flip")
|
|
else: animations.play("shoot")
|
|
|
|
#if Input.is_action_just_pressed("debugKey"):
|
|
#targetState = frameData[ticks - 40]
|
|
#transitioning = true
|
|
|
|
if speedUp > 0:
|
|
Engine.time_scale += (speedScale - Engine.time_scale) * delta / Engine.time_scale
|
|
speedUp -= delta / speedScale
|
|
else:
|
|
speedScale = 1
|
|
Engine.time_scale += (1 - Engine.time_scale) * 2 * delta / Engine.time_scale
|
|
|
|
velocity += knockback
|
|
velocity += dashVel
|
|
knockback += -knockback * 5 * delta
|
|
dashVel += -dashVel * 5 * delta
|
|
|
|
move_and_slide()
|
|
|
|
|
|
func _on_framesave_timeout() -> void:
|
|
frameData[ticks] = [position, rotation, velocity]
|
|
ticks += 1
|
|
|
|
if ticks > 240:
|
|
frameData.erase(tickToDel)
|
|
tickToDel += 1
|
|
|
|
|
|
func _on_hitbox_area_entered(area: Area2D) -> void:
|
|
var themeta = area.get_meta("pickup", 0)
|
|
#print("floyd")
|
|
#
|
|
if themeta != 0:
|
|
area.get_node("particles").emitting = true
|
|
area.get_node("particles").reparent(get_parent())
|
|
healNoMove(3)
|
|
area.queue_free()
|
|
|
|
$"../hud/AnimationPlayer2".play("global/popItUp")
|
|
|
|
if area.has_meta("kaboom"):
|
|
speedScale = 2 * pow(0.8, Globals.unlockedUpgrades.get("rollback", 0))
|
|
speedUp = 0.5
|
|
damageScale += 2 * pow(0.8, Globals.unlockedUpgrades.get("rollback", 0))
|
|
knockback = Vector2(sin(rotation) * 2000 * [0.5, -0.5].pick_random(), cos(rotation) * 2000 * [0.5, -0.5].pick_random())
|