extends SceneTree ## Boss 回归测试(时间驱动,与无头模式实际帧率无关): ## A) 独立 Boss:5s 内进场并开始弹幕;秒杀后 4s 内完成爆炸链释放 ## B) Game 集成:spawn_boss 血条显示→击杀后血条隐藏、得分 +5000 ## 运行:godot --headless -s tests/boss_test.gd var _phase := 0 var _time := 0.0 var _boss: Boss var _game: Game var _bullets: Node2D var _bullet_time := 0.0 var _phase_time := 0.0 var _score_before := 0 var _fails: Array[String] = [] func _initialize() -> void: _bullets = Node2D.new() _bullets.add_to_group("enemy_bullets") root.add_child(_bullets) _boss = Boss.new() _boss.setup(1.0) root.add_child(_boss) print("[boss_test] phase A: standalone boss") func _fail(msg: String) -> void: _fails.append(msg) print("[FAIL] " + msg) func _process(delta: float) -> bool: _time += delta _phase_time += delta match _phase: 0: if _bullets.get_child_count() > 0: _bullet_time += delta if _phase_time >= 5.0: if not _boss._entered: _fail("boss did not enter (pos.y=%.1f)" % _boss.position.y) if _bullet_time < 0.4: _fail("boss fired too little (%.2fs bullet time)" % _bullet_time) _boss.apply_damage(99999) _next_phase() 1: if not is_instance_valid(_boss): print("[boss_test] phase A done: %.2fs bullet time, death chain freed boss" % _bullet_time) _next_phase() elif _phase_time > 4.0: _fail("death chain did not free boss in 4s") _next_phase() 2: _game = (load("res://scenes/game.tscn") as PackedScene).instantiate() root.add_child(_game) _score_before = _game.score _boss = _game.spawn_boss(1.0) if not _game._boss_bar_bg.visible: _fail("boss bar not shown after spawn") _boss.apply_damage(99999) _next_phase() 3: if _phase_time >= 4.0: if _game._boss_bar_bg.visible: _fail("boss bar still visible after death") if _game.score < _score_before + 5000: _fail("score not credited: %d -> %d" % [_score_before, _game.score]) else: print("[boss_test] phase B done: score %d -> %d" % [_score_before, _game.score]) if _fails.is_empty(): print("[boss_test] PASS") else: print("[boss_test] FAIL: %d issue(s)" % _fails.size()) quit(0 if _fails.is_empty() else 1) return true return false func _next_phase() -> void: _phase += 1 _phase_time = 0.0