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