Randoloot/tests/items/enemy_shield_damage_audit.gd
2026-10-26 21:06:32 +01:00

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()