test: 八项无头回归测试(道具/弹道/Boss/海面/地面单位/浮游炮/炸弹/冒烟模拟)

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-08-31 00:31:48 +08:00
parent 3c6f31b503
commit 5f6258e3d4
16 changed files with 1113 additions and 0 deletions
+65
View File
@@ -0,0 +1,65 @@
extends SceneTree
## 冒烟测试(时间驱动,与无头模式实际帧率无关):
## 主动模式:模拟移动+按住开火跑满 110s,覆盖波次→Boss 战→下一轮全链路;
## idle 模式:站桩 75s 被打死,覆盖掉命/游戏结束。
## 运行:godot --headless -s tests/smoke_sim.gd [-- idle]
const ACTIVE_DURATION := 110.0
const IDLE_DURATION := 75.0
var _time := 0.0
var _duration := ACTIVE_DURATION
var _next_print := 10.0
var _next_bomb := 30.0
var game: Game
var idle := false
func _initialize() -> void:
idle = OS.get_cmdline_user_args().has("idle")
if idle:
_duration = IDLE_DURATION
var scene := load("res://scenes/game.tscn") as PackedScene
game = scene.instantiate()
root.add_child(game)
if not idle:
Input.action_press("fire")
print("[smoke] game scene instantiated (idle=%s)" % str(idle))
func _process(delta: float) -> bool:
# 游戏结束确认后会切回标题场景,模拟随之终止
if not is_instance_valid(game):
print("[smoke] left game scene (back to title) — stopping simulation")
return true
_time += delta
if not idle:
# 左右往返扫射(1.5s 周期),模拟真实操作
if fmod(_time, 1.5) < 0.75:
Input.action_release("move_left")
Input.action_press("move_right")
else:
Input.action_release("move_right")
Input.action_press("move_left")
# 每 10 秒打印一次局面快照
if _time >= _next_print:
_next_print += 10.0
var boss_alive := is_instance_valid(game._boss)
print("[smoke] t=%ds state=%d score=%d lives=%d bombs=%d boss=%s bar=%s enemies=%d pbullets=%d ebullets=%d" % [
int(_time), game.state, game.score, game.lives, game.player.bombs,
str(boss_alive), str(game._boss_bar_bg.visible and boss_alive),
(game.get_node("Enemies") as Node2D).get_child_count(),
(game.get_node("PlayerBullets") as Node2D).get_child_count(),
(game.get_node("EnemyBullets") as Node2D).get_child_count(),
])
# 主动模式每 30 秒投一颗炸弹(无头无法可靠模拟 just_pressed 边沿,直调公开接口)
if not idle and _time >= _next_bomb:
_next_bomb += 30.0
game.player.use_bomb()
if _time >= _duration:
print("[smoke] finished, no crash")
return true
return false