58 lines
2.6 KiB
GDScript
58 lines
2.6 KiB
GDScript
extends Node2D
|
|
|
|
const ENEMY := preload("res://scenes/game/enemy_ship.tscn")
|
|
|
|
func _ready() -> void:
|
|
GameState.start_new_run()
|
|
var enemy := ENEMY.instantiate()
|
|
add_child(enemy)
|
|
enemy.set_physics_process(false)
|
|
enemy.absorption = Vector3.ZERO
|
|
enemy.max_hull = 125.0
|
|
enemy.hull = 125.0
|
|
enemy.max_shields = 50.0
|
|
enemy.shields = 50.0
|
|
# Four hits consume the shield; none of that absorbed damage reaches hull.
|
|
for hit in 4:
|
|
enemy.take_research_weapon_hit(12.5,false,DamageTypes.Type.ENERGY,0.0,-1)
|
|
assert(is_equal_approx(enemy.hull,125.0))
|
|
assert(enemy.shields == 0.0 and not enemy.is_queued_for_deletion())
|
|
# Regeneration immediately restores a fraction of a point, making the ring visible again.
|
|
enemy.regenerate_defenses(0.1)
|
|
assert(is_equal_approx(enemy.shields,0.05))
|
|
enemy.take_research_weapon_hit(12.5,false,DamageTypes.Type.ENERGY,0.0,-1)
|
|
assert(is_equal_approx(enemy.hull,112.55))
|
|
# Overflow applies only the unabsorbed portion, including research multipliers.
|
|
enemy.hull = 125.0
|
|
enemy.shields = 5.0
|
|
enemy.take_research_weapon_hit(15.0,false,DamageTypes.Type.ENERGY,0.0,-1)
|
|
assert(enemy.shields == 0.0 and is_equal_approx(enemy.hull,115.0))
|
|
GameState.captain.expedition.alien_skills = {"shields":true,"hull":true}
|
|
enemy.hull = 125.0
|
|
enemy.shields = 11.0
|
|
enemy.take_research_weapon_hit(20.0,false,DamageTypes.Type.ENERGY,0.0,-1)
|
|
assert(is_equal_approx(enemy.hull,114.0))
|
|
GameState.captain.expedition.alien_skills.clear()
|
|
# A projectile hitting both shield interception and hull can only damage once.
|
|
enemy.hull = 125.0
|
|
enemy.shields = 0.0
|
|
var projectile := preload("res://scenes/game/weapon_projectile.tscn").instantiate()
|
|
projectile.configure(Vector2.ZERO,Vector2.RIGHT,ItemDefinition.WeaponKind.PLASMA,500,12.5,500)
|
|
add_child(projectile)
|
|
projectile.set_physics_process(false)
|
|
projectile._apply_damage_once(enemy)
|
|
projectile._apply_damage_once(enemy)
|
|
assert(is_equal_approx(enemy.hull,112.5))
|
|
# Full hull takes ten additional 12.5-damage hits after an exactly depleted shield.
|
|
enemy.hull = 125.0
|
|
enemy.shields = 0.0
|
|
for hit in 9:
|
|
enemy.take_research_weapon_hit(12.5,false,DamageTypes.Type.ENERGY,0.0,-1)
|
|
assert(enemy.hull > 0.0 and not enemy.is_queued_for_deletion())
|
|
assert(is_equal_approx(enemy.hull,12.5))
|
|
enemy.take_research_weapon_hit(12.5,false,DamageTypes.Type.ENERGY,0.0,-1)
|
|
assert(enemy.hull == 0.0 and enemy.is_queued_for_deletion())
|
|
print("ENEMY SHIELD DAMAGE AUDIT PASS: no hull damage under full absorption, exact shield break survives, correct overflow/research scaling, no duplicate projectile damage, 10 hull hits after shield break; instant 0.05 shield regeneration confirmed")
|
|
await get_tree().process_frame
|
|
get_tree().quit()
|