Files
mtgodot-poc/project/playable_skill_matrix.gd
T
shenleiandClaude Opus 5 f39a55fdd5 feat(playable): 首个 Mac 联网内测版 STB-01 soak 工具与发布状态文档
- 新增 script/playable_soak.sh:先做 soak 配置/资源校验,无 --allow-gameplay
  只校验不启动客户端;N(>=10) 次独立正常退出运行 + 墙钟 soak,失败即停止后续
  运行并记 BLOCKED;写本批次 release-manifest.json 后聚合
- run_client_gate.sh:确认的故障代理对所有 suite 启动(共享场景的退出运行也经代理);
  soak 超时下限只约束 soak 客户端(validate_soak 增加 soak_client 参数)
- 新增本地 127.0.0.1 故障代理、RSS 采样/内存判定、窗口/指标/流程模块及其测试
- forest_mob_render_test 输出 PASS/FAIL 标记,供 rendering_batch_test.sh 识别
- 新增 docs/FIRST-MAC-PLAYABLE-STATUS.md:如实记录 PASS/BLOCKED、已知问题与环境需求
- .gitignore 排除本地场景配置、凭据文件与运行输出

离线回归:rendering_batch_test.sh failures=0,playable_gate_test.sh PASS,
node 夹具测试 PASS。未联网运行,未重建候选包。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ft3kXpNdLbKEfg5uDLfqVF
2026-09-11 22:06:48 +09:00

65 lines
2.5 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.
extends SceneTree
## CBT-01 技能矩阵检查:读取 test/playable/skill-cases.json(或 --matrix 指定的本地副本),
## 按职业校验并输出可直接放入场景配置的 skill_cases。只读数据,不连网络、不读凭据。
##
## godot --headless --path project --script playable_skill_matrix.gd -- --job WARRIOR [--matrix PATH]
##
## stdout: 一行 "SKILL_MATRIX {json}"。exit 0 = READY1 = 矩阵错误,2 = 存在未确认条目(BLOCKED)。
const Config = preload("res://testing/playable_config.gd")
const SkillTable = preload("res://ui/skill_table.gd")
func _init() -> void:
var args := OS.get_cmdline_user_args()
var job := ""
var matrix_path := ProjectSettings.globalize_path("res://").path_join("../test/playable/skill-cases.json").simplify_path()
var i := 0
while i < args.size():
match args[i]:
"--job":
i += 1
job = String(args[i]).to_upper() if i < args.size() else ""
"--matrix":
i += 1
matrix_path = args[i] if i < args.size() else ""
"--help":
print("usage: playable_skill_matrix.gd -- --job WARRIOR|ASSASSIN|SURA|SHAMAN [--matrix PATH]")
quit(0)
return
_:
printerr("SKILL_MATRIX: unknown argument %s" % args[i])
quit(1)
return
i += 1
var result := check(matrix_path, job)
print("SKILL_MATRIX " + JSON.stringify(result))
quit({"READY": 0, "BLOCKED": 2}.get(result.status, 1))
static func check(matrix_path: String, job: String) -> Dictionary:
var out := {"status": "FAIL", "job": job, "errors": [], "blocked": [], "not_applicable": [], "skill_cases": []}
var file := FileAccess.open(matrix_path, FileAccess.READ)
if file == null:
out.errors.append("skill matrix cannot be opened")
return out
var parsed: Variant = JSON.parse_string(file.get_as_text())
if not (parsed is Dictionary):
out.errors.append("skill matrix is not a JSON object")
return out
var table := SkillTable.new()
var loaded := false
for lang in ["en", "common"]:
if table.load_file(AssetRoot.path().path_join("locale/locale/%s/skilldesc.txt" % lang)):
loaded = true
break
var resolved := Config.skill_matrix_cases(parsed, job, table if loaded else null)
out.errors = resolved.errors
if not loaded:
out.errors.append("skilldesc.txt is unavailable; skill ownership cannot be checked")
out.blocked = resolved.blocked
out.not_applicable = resolved.not_applicable
out.skill_cases = resolved.cases
if out.errors.is_empty():
out.status = "BLOCKED" if not out.blocked.is_empty() else "READY"
return out