该技能包用于在 React Native 游戏中建立一套可发布、可验证的关卡表。核心思路是:关卡不靠手工绘制,而由种子加难度生成,即每个关卡表示为 { level, seed, difficulty, stars },棋盘由引擎的 create(seed, difficulty) 生成;同一 seed 在各设备上产生相同关卡,表格保持很小,存档也能精确重放。
主要能力:
- 关卡表生成:pack-<n>.json 只由 scripts/levels/generate-levels.ts 依据游戏的 LevelPlan 生成,并经仓库 Prettier 格式化,禁止手工编辑或复制关卡包。
- 可通关性证明:par 类游戏由精确求解器在记录的 par 下证明;游玩中随机抽取未来的游戏由 createWitnessSolver(固定机器人种子的合理玩家)证明;每条证明线都通过真实引擎的 verifyLine 重放。
- 星级规则:统一由 starsFor 计算。par 关卡在 par 及以内 3 星、par+2 以内 2 星、完成 1 星;计分类为 [win, two, three] 三个递增整数阈值。
- 难度曲线:难度不下降,后续关卡包不再更简单,第 3 关之后不会是一步即解。
- 每日关卡:由 dailySeed(dateKey, salt) 与每日难度生成,salt 为 16 位且各游戏不共用,发布后固定不变;同一日期所有玩家得到相同每日关卡,无需服务器。
- 数据金样:锁定关卡包边界关卡和至少三个每日日期(含跨年对),变更需显式 -u 且带 Gate-Change 尾注。
- 契约声明:contracts/levels.json 声明每个游戏的 packCount、levelsPerPack、starRule、daily、endless;第一个包 0 星解锁,后续包解锁星数为之前各包星数之和的一半。
- 纯确定性约束:levels 目录代码只导入 src/core 及游戏自身规则,不使用 Math.random、时钟、**、Intl 或不精确 Math,保证 Jest、生成器、iOS/Android Hermes 生成结果逐位一致。
- 检查脚本:check-levels.mjs 重新生成并比对取值与字节,报告难度曲线、格式、越区导入、缺失金样等问题,直至输出 RESULT: PASS。
使用方式(按资料工作流):先确定数值调优并通过平衡模拟,再安装关卡工具包(含 game-rules-engine 与 seeded-determinism-and-golden-vectors,精确固定 fast-check 版本);测试先行编写求解器与关卡计划;在 contracts/levels.json 声明游戏并合并关卡包名称的多语言键;运行生成器写出关卡包并重新 --check 校验;组装 LevelsSpec 并运行契约测试;编写并读取金样快照;最后执行 eslint、prettier、typecheck 和 Jest(unit 与 golden)并通过检查脚本。
适用场景:需要为移动游戏批量生成可证明可通关的关卡表、按星解锁关卡包、每日固定关卡与无服务器一致性的项目。
限制与注意:资料给出的是具体工程约束,未提供图形界面、托管服务、价格或平台支持范围;非 TypeScript/Jest 项目或没有 src/games/<game-id>/levels/、contracts/levels.json、求解器与关卡工具包的应用会被判定为 NOT APPLICABLE。反模式包括手工改关卡包、复制模板快照、把 budget-exceeded 当作不可解、随意改每日 salt 或每日难度、用 Math.random 选种子、手写星级数字等。