Files
spellforge/scenes/main/combat_test.gd
T
joywayerandClaude Opus 5 6f11f4c402 fix(attr): 修复调试场景因 cpu_limit 基准改为 0 而退化;记录 cast_delay_mod 快照时序
combat_test 绕过 CombatManager 直接 equip_wand,拿不到 _rebuild_wand 注入的
"core" 份额,导致 cpu_limit=0 触发守卫报错、MAX_OPS 由 200 退化为 40。
镜像 _rebuild_wand 的做法在该场景自行注入(先 remove 再 add),仅修本次弄坏
的部分;该场景整体绕过 CombatManager(如从不设 mana_leech)属既有分歧,不在
本次范围内。

_cast_interval 仅在 equip_wand 时快照,install_spell 只调 _rebuild_wand 不调
equip_wand,实际再同步点是每波开战的 _transition_to_battle。行为不改,加注释
记下时序,免得后续属性商店的实现者误以为购买即时生效。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 11:38:08 +08:00

66 lines
2.0 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## CombatTest — S1 最小战斗调试场景
## 目标:玩家自动发射 spark_bolt,子弹命中敌人,敌人死亡,屏幕显示击杀数
## 验收:P-S1-01 ~ P-S1-05
extends Node2D
const SPAWN_ENEMIES: int = 50 # S1 验收:50 只散兵(充分验证伤害)
var _player_node: Node2D = null
var _perf_label: Label = null
var _spawned: bool = false
func _ready() -> void:
_setup_debug_ui()
PlayerManager.set_player_node(_player_node)
# 装备法杯:wand_basic + spark_bolt
var loadout: Dictionary = WandPreset.make_default_loadout()
# 本场景绕过 CombatManager,故须自行注入法杖运算力份额(否则 cpu_limit=0 → MAX_OPS 退化)
PlayerStats.remove_modifiers_from("core")
PlayerStats.add_modifier("cpu_limit", "flat", float(loadout["core"].cpu_limit), "core")
PlayerManager.equip_wand(loadout["core"], loadout["compiled"])
_run_spawn()
func _process(_delta: float) -> void:
_update_perf_ui()
func _run_spawn() -> void:
var arena: float = 600.0
for _i in SPAWN_ENEMIES:
EnemyManager.spawn_enemy(
Vector2(randf_range(-arena, arena), randf_range(-arena, arena)),
50.0 # P-S1-01: HP = 50spark_bolt 卷 3 伤
)
_spawned = true
print("[CombatTest S1] 生成完成: %d 敌人, wand_basic+spark_bolt 装备" % SPAWN_ENEMIES)
func _update_perf_ui() -> void:
if not _spawned or not _perf_label:
return
_perf_label.text = (
"FPS: %.1f\n敌人: %d\n击杀: %d\n子弹: %d\nTick: %d\n池: %s" % [
Engine.get_frames_per_second(),
EnemyManager.get_active_count(),
PlayerManager.kill_count,
BulletManager.get_active_count(),
TimeManager.game_tick,
DamageContextPool.get_pool_usage()
]
)
func _setup_debug_ui() -> void:
var canvas := CanvasLayer.new()
canvas.name = "DebugUI"
add_child(canvas)
var perf := Label.new()
perf.name = "PerfLabel"
perf.position = Vector2(16, 16)
perf.add_theme_font_size_override("font_size", 18)
canvas.add_child(perf)
_perf_label = perf
var p := Node2D.new()
p.name = "Player"
add_child(p)
_player_node = p