ChronoSpace/scenes/spaceShip/spaceShip.gd

147 lines
3.7 KiB
GDScript

class_name Spaceship extends CharacterBody2D
@onready var hurtArea = $hurtArea
@onready var sprite = $Sprite2D
@onready var weaponNode = $weaponNode
@onready var invincibleTimer = $invincibleTimer
@onready var MINIGUN = preload("res://scenes/weapon/minigun/minigun.tscn")
@onready var RAILGUN = preload("res://scenes/weapon/railgun/railgun.tscn")
@onready var SHOTGUN = preload("res://scenes/weapon/shotgun/shotgun.tscn")
@onready var radiationDamageTimer = $radiationDamageTimer
@onready var radiationDamage = $radiationDamage
@export var shotgunTexture: Texture2D
@export var minigunTexture: Texture2D
@export var railgunTexture: Texture2D
@export var minHealth: int = 0
@export var maxHealth: int = 100
@onready var health: int = maxHealth
@export var speed: int = 800
@export var acceleration: float = 0.8
@export var pushback: int = 500
@export var timeGhost: TimeGhost = null
@export var weapon: Weapon = null
var currentWeapon: PackedScene
@export var invincible: bool = false
var currentRadiationDamage: int = 1
signal destroyed
func _init() -> void:
health = maxHealth
func _ready() -> void:
invincibleTimer.wait_time = Globals.currentDelay * 3
shortInvincibility()
func damage(amount: int):
if not invincible:
if health - amount <= minHealth:
if timeGhost == null:
emit_signal("destroyed")
if self.is_in_group("enemy"):
Globals.enemyDestroyed()
destroy()
shortInvincibility()
health = maxHealth
else:
health -= amount
func heal(amount: int):
if health + amount >= maxHealth:
health = maxHealth
else:
health += amount
func destroy():
if timeGhost == null:
destroyed.emit()
queue_free()
else:
timeGhost.destroy()
func attack():
if weapon != null:
weapon.attack()
await get_tree().create_timer(Globals.currentDelay).timeout
if timeGhost != null:
timeGhost.attack()
func moveTimeGhost(_position: Vector2, _rotation: float):
await get_tree().create_timer(Globals.currentDelay).timeout
if timeGhost != null:
timeGhost.global_position = _position
timeGhost.rotation = _rotation
timeGhost.moveTimeGhost(_position, _rotation)
func changeWeapon(_weapon: PackedScene):
currentWeapon = _weapon
var newWeapon = _weapon.instantiate()
for i in weaponNode.get_children():
i.queue_free()
weaponNode.add_child(newWeapon)
weapon = newWeapon
if newWeapon is Shotgun:
sprite.texture = shotgunTexture
elif newWeapon is Minigun:
sprite.texture = minigunTexture
elif newWeapon is Railgun:
sprite.texture = railgunTexture
await get_tree().create_timer(Globals.currentDelay).timeout
if timeGhost != null:
timeGhost.changeWeapon(_weapon)
#match newWeapon:
#Shotgun:
#sprite.texture = shotgunTexture
#Minigun:
#sprite.texture = minigunTexture
#Railgun:
#sprite.texture = railgunTexture
#
func addTimeGhost(_timeGhost: TimeGhost):
if timeGhost == null:
timeGhost = _timeGhost
timeGhost.setSpaceship(self)
timeGhost.changeWeapon(currentWeapon)
else:
timeGhost.addTimeGhost(_timeGhost)
func shortInvincibility():
if invincibleTimer.is_stopped():
invincible = true
invincibleTimer.start()
func _on_invincible_timer_timeout() -> void:
invincible = false
func _on_hurt_area_area_entered(area: Area2D) -> void:
if area.get_parent().is_in_group("obstacle"):
velocity = Vector2.UP.rotated(rad_to_deg(global_position.angle_to(area.global_position))) * -pushback
area.get_parent().queue_free()
func inceraseMaxhealth(increase: int):
maxHealth += increase
health += increase
func applyRadiation(amount: int):
if radiationDamageTimer.is_stopped():
currentRadiationDamage = amount
radiationDamageTimer.start()
func _on_radiation_damge_timer_timeout() -> void:
radiationDamage.play()
damage(currentRadiationDamage)