99 lines
14 KiB
Python
99 lines
14 KiB
Python
"""Register the authoritative battle integration, preserving other work and legacy document bytes."""
|
||
import json
|
||
from pathlib import Path
|
||
|
||
ROOT=Path(__file__).resolve().parents[1]
|
||
MARK='## 权威技能协议与正式战场接入(2026-10-21)'
|
||
def read(path):return json.loads((ROOT/path).read_text(encoding='utf-8-sig'))
|
||
def append(path,text):
|
||
target=ROOT/path
|
||
if MARK.encode('utf-8') not in target.read_bytes():
|
||
with target.open('ab') as f:f.write(('\n\n'+MARK+'\n\n'+text.strip()+'\n').encode('utf-8'))
|
||
|
||
def main():
|
||
folder=ROOT/'Doc/Design/Combat/Runtime'
|
||
reports={key:read('Doc/Design/Combat/Runtime/'+key+'.json') for key in ('server_validation','unity_network','unity_domain','unity_anchors','unity_assets','config_validation')}
|
||
assert all(r['status'] in ('pass','formal_runtime_contract_validated') for r in reports.values())
|
||
deployment=read('Tools/output/combat_runtime/deployment.json');assert deployment['status']=='enabled' and deployment['gameStatesUnchanged']
|
||
(folder/'deployment.json').write_text(json.dumps(deployment,indent=2),encoding='utf-8')
|
||
text='''# 权威技能协议与正式战场接入
|
||
|
||
2026-10-21完成。独立火喵/岩团团样例已推广到正式战斗:十伙伴的普攻/主动技能及五敌人普攻,共25个技能;覆盖20主线关卡和5个属性挑战。8080本地开发服已更新,health返回combatProtocol=1;未发布Player或生产服。
|
||
|
||
## 版本与配置
|
||
|
||
- `Config/Combat/skill_runtime_v1.json` 是正式逻辑表,protocol=1、logicVersion=1,新战斗快照标记rulesVersion=3。原proposal保持design_only/runtimeEnabled=false,两个校验器分别报告设计和正式运行时状态,避免把旧设计文件当成正式入口。
|
||
- `greenfield.json` 保持battleRules=2,兼容旧客户端及旧挑战。新版客户端只在battle.begin/challenge.begin发送combatProtocol=1;没有该字段的旧客户端仍得到原规则。新客户端连接旧服务端时,也能接收旧规则战斗。
|
||
- CMake将正式技能表编入程序。开战原子保存原玩法配置、技能定义、gameplayHash、skillsHash、权威结果及完整事件轨迹;旧进行中战斗不会因新配置或程序重启重新计算。
|
||
|
||
## 逻辑内核
|
||
|
||
`combat_slice` 已由独立样例内核推广为共享纯数据内核,`combat_runtime` 从冻结玩法参数与正式技能表构造战斗。单位id为伙伴id或100+敌人槽;时间50ms整数tick、血量/攻击千分之一单位、位置毫米、倍率万分比。数值量化及前摇会改变新规则的节奏,不宣称与旧规则结果等价。
|
||
|
||
三波刷怪、多路前排阻挡/移动/漏怪、主动技能优先的单动作通道、前摇/释放/后摇、绝对冷却、投射物到达伤害、伤害/治疗/护盾/减速类型化行为、首领控制折扣、护盾和减速的刷新/过期均已接入。行为数组按actionId顺序执行;同cast/action/target不能重复命中。释放前死亡取消,释放后的火球独立存续,目标丢失不换目标,死亡和战斗结束只发一次。
|
||
|
||
开局预计算仍由服务端授权。battle.finish继续使用已冻结结果,忽略客户端won和elapsed字段;最早结算时间由readyAt约束,放弃/重试/首通奖励沿用原幂等事务。没有战中手动输入。
|
||
|
||
## 分页与恢复
|
||
|
||
| 操作 | 行为 |
|
||
| --- | --- |
|
||
| battle.begin/challenge.begin | 新客户端声明combatProtocol=1;返回snapshot和不含events的trace manifest |
|
||
| GET /game/state | 返回原场次的traceId/traceHash/初态/终态摘要,供重连恢复 |
|
||
| POST /game/command:battle.events | 按本玩家pendingBattle、activityId、traceId鉴权;cursor与limit读取事件,limit≤256 |
|
||
| battle.finish/abandon | 原事务结算;关闭后删除活动轨迹,后续分页返回activity_missing |
|
||
|
||
分页读取不修改日历、revision、钱包或operation log。每页返回原始JSON payload字符串及SHA256;客户端逐页校验、按原顺序拼接并核对整条traceHash,再开始播放。错误页、缺页、重复/乱序事件或不支持的版本不会回退成本地算伤害。请求可重试,持久化命令队列与分页读取分开。恢复当前实现从头重播原轨迹,沿用同一battleId及readyAt,不重新开战或发奖。
|
||
|
||
事件上限50000,正式内核最多2400tick。当前120组矩阵最大3626事件/299734字节(事件JSON),按需分页预载后开始播放;不是把全事件塞进每次存档响应。
|
||
|
||
## 客户端与表现
|
||
|
||
- `CombatTrace.cs`:协议DTO、版本/实体/事件顺序校验;`PrototypeApi.LoadCombat`:授权分页、哈希校验与有界重试。
|
||
- `PrototypeBattle.Trace.cs`:只读战斗模型。Tick只应用事件,不运行旧伤害/技能计算;血量、护盾、减速、死亡、漏怪、技能次数和统计都取服务器轨迹。
|
||
- `PrototypeFlow`:新旧战斗分支共存。新分支由同一时钟驱动动作、弹道、VFX/SFX与数据;低帧率仍消费全部数据事件,跳过过期一次性声音。结束、放弃、换页与禁用清理池。
|
||
- `BattleSkillPresentation.prefab`:5类特效、36个池实例、8个技能音源,复用已有5条TangoFlux音效和敌人反馈池。火焰伙伴有蓄力/发射/命中,其他投射物按元素着色;治疗/减速沿用现有标识。各伙伴更丰富的专属美术及余下4条计划音效未在本批补制。
|
||
- 15种角色的attackImpact读取各自原制作配方,分段采样原Attack以对齐逻辑释放点;零前摇护盾保持Idle并播放护盾。AnimationEvent不授权伤害。
|
||
- 战场持久化19个`SkillMuzzle`(10伙伴+9敌人槽),局部-Z为前,随角色朝向和T2体型缩放,可在Prefab调节;不在运行时创建挂点/材质/粒子对象。BuildPrototype重建、后续敌人替换均保留此约定。
|
||
|
||
## 验证
|
||
|
||
- 三组CTest全部通过:原样例、旧事务/规则5192项断言、正式技能协议与120组关卡/进化/阵容矩阵(覆盖25技能,超过30万项事件断言)。涵盖治疗相邻路线、首领减速、复合行为、未来波次、确定性、分页只读、账号隔离、快照变化不重算、旧客户端、属性挑战及幂等奖励。
|
||
- 23份C++导出轨迹→C#只读模型,覆盖全部20关及3套T2终章阵容;最终血量、护盾、减速、位置、死亡/漏怪、统计完全一致,错误序列被拒绝。
|
||
- 真正EventSystem UI+HTTP,18083专用数据库的1-5全T2六人阵容,1876事件。服务端进程重启后恢复相同battleId与traceHash,2×实播后最终状态与服务器奖励/统计一致;暂停、静音、火球、护盾、敌人攻击和结束清理通过。
|
||
- 最终Prefab挂点实播通过,T2火喵发射点与持久化挂点世界坐标一致;截图 `Assets/Screenshots/battle_skills_anchors.png`。完整UI截图 `battle_skills_network.png`。
|
||
- 真实账号与偏好已恢复。开发服更新前一致性SQLite备份及旧程序保留;重启后全部账号game_states与备份比较一致,包括已有冻结战斗。期间Windows旧进程文件锁曾延迟替换,确认进程完全退出后更新成功。部署回执 `deployment.json`。
|
||
|
||
矩阵用于验证执行、确定性和代表阵容可通关;首日实际解锁阵容的细致平衡、微信真机帧耗/内存、全部伙伴专属特效音效仍需后续验收。
|
||
|
||
## 入口
|
||
|
||
```powershell
|
||
cmake --build AIServer/build-g1 --config Release --target aiserver combat_runtime_tests game_tests combat_slice_tests
|
||
ctest --test-dir AIServer/build-g1 -C Release --output-on-failure
|
||
AIServer/build-g1/Release/combat_runtime_tests.exe Doc/Design/Combat/Runtime/server_validation.json Tools/output/combat_runtime/traces
|
||
python Tools/validate_skill_runtime.py
|
||
```
|
||
|
||
Unity Pipeline:`BuildBattleSkills.Build`(制作/挂点)、`VerifyBattleRuntime.Assets`/`Domain`(检查);实战测试使用专用18083账号,Begin→重启专用服务→ResumeAndFinish→Cleanup,勿对真实账号运行测试入口。开发服实际程序在AIServer/build/Release,运行中Windows会锁定exe;不要直接构建覆盖运行中的文件。新版本应先在其他输出目录验证,等待旧进程完全退出后替换。
|
||
'''
|
||
(folder/'Production.md').write_text(text,encoding='utf-8')
|
||
append('Doc/ResDesc_Config.md','''正式表 `Config/Combat/skill_runtime_v1.json`,protocol1/logicVersion1,25技能。`AIServer/src/combat_runtime.*`+共享`combat_slice.*`编入服务端,按冻结配置生成权威事件;`battle.events`最多256条只读分页,逐页/全轨迹SHA256,保留旧协议与幂等奖励。客户端 `CombatTrace.cs`/`PrototypeBattle.Trace.cs`、PrototypeApi.LoadCombat和PrototypeFlow消费事件,不计算新规则伤害。新开战斗快照rulesVersion3,旧客户端和旧挑战保留原规则。
|
||
|
||
制作/检查:`AIClient/AgentScripts/BuildBattleSkills.cs`、`VerifyBattleRuntime.cs`、`Tools/validate_skill_runtime.py`、`write_combat_runtime_report.py`;回执与制作记录 `Doc/Design/Combat/Runtime/`。8080开发服已启用,SQLite及旧程序备份路径见deployment.json。''')
|
||
append('Doc/ResDesc_Effect.md','''新增 `AIClient/Assets/Bundles/Combat/BattleSkillPresentation.prefab` 并嵌入正式PrototypeArena,复用5种SkillSlice粒子Prefab,36池实例、8音源;火球按权威arrival tick移动及回收,按元素着色,cast/entity租约负责蓄力与护盾清理。19个SkillMuzzle经Pipeline持久化,局部-Z前向、随T2缩放;动画、特效与数据同钟,暂停/倍速/过期声音抑制/切场清理通过。治疗/减速沿用现有标识,完整专属特效仍待补。见 `Doc/Design/Combat/Runtime/Production.md`。''')
|
||
append('Doc/ResDesc_Animation.md','''正式战斗复用原10伙伴/5敌人的Idle/Walk/Attack,没有改写成品动画。BattleSkillPresentation读取各角色原配方attackImpact,经Pipeline持久化15项映射,将原Attack前摇/释放/后摇分段对齐权威tick;零前摇护盾不强制跳到攻击中间姿势。AnimationEvent不决定伤害,旧规则继续原Animator播放。''')
|
||
append('Doc/ResDesc_Model.md','''正式PrototypeArena新增19个可调SkillMuzzle空挂点(10伙伴+9敌人槽),Pipeline持久化、局部-Z前向,T2体型缩放同步作用于挂点;角色网格/骨架/原三动作不变。后续BuildPrototype重建和ApplyFormalEnemies替换保留挂点。实播回执 `Doc/Design/Combat/Runtime/unity_anchors.json`。''')
|
||
append('Doc/ResDesc_Sound.md','''此前生成的 `Sound/SFX/BattleSkills/Sfx_{FireCharge,FireLaunch,FireHit,RockHit,Shield}.wav` 已从独立样例推广到正式BattleSkillPresentation的8音源池,按权威释放/命中/护盾事件播放;与敌人反馈池合计有界16音源,技能池总音量预算0.3。暂停/静音/低帧率过期声音跳过/结束和禁用清理通过。本批无新增音频,仍为5/9计划音效生成;源任务与TangoFlux许可记录沿用BattleSkills/Slice。''')
|
||
append('Doc/ResDesc_Picture.md','''`AIClient/Assets/Screenshots/battle_skills_network.png`:1080×1920真实UI/HTTP的1-5全T2技能战斗,包含暂停/双速按钮及正式伙伴模型。`battle_skills_anchors.png`:900×1200最终Prefab持久化挂点与T2弹道实播检查。均由Unity Pipeline渲染,生成与检查入口VerifyBattleRuntime。''')
|
||
append('Doc/ResDesc.md','''新技能协议与正式战场已接通,覆盖10伙伴/5敌人/20主线关/5属性挑战;新客户端按权威轨迹播放,旧规则保留。8080本地开发服已更新,原账号存档核对不变。见 [Runtime/Production.md](Design/Combat/Runtime/Production.md),相关资源登记见Config/Effect/Animation/Model/Sound/Picture。''')
|
||
append('Doc/Design/G0_Implementation.md','''新客户端battle.begin/challenge.begin声明combatProtocol1,服务端冻结25技能与配置、结果和事件,分页只读获取。PrototypeBattle.Trace仅应用权威事件,统一动作/特效/音效及数据时钟;旧客户端与旧战斗仍走原规则。正式战场持久化技能池和19个可调挂点,T2缩放同步。
|
||
|
||
120组C++关卡/进化/阵容矩阵覆盖25技能;23份跨关轨迹在C#最终状态与统计一致;18083真实UI全T2的1-5经服务重启恢复相同场次,实播/结算通过。8080开发服已更新,旧程序与SQLite一致性备份保留,全部game_states核对不变。制作记录 `Doc/Design/Combat/Runtime/Production.md`。未发布Player或生产服,真机性能与完整伙伴专属音效特效仍待完成。''')
|
||
append('Doc/Design/Combat/SkillSystem.md','''本阶段已完成正式 `skill_runtime_v1.json`、25技能权威内核、分页协议和客户端正式战场接入;8080开发服已启用。原proposal仍为设计样例,正式验证器为 `Tools/validate_skill_runtime.py`。旧挑战不重算,新客户端使用快照rulesVersion3;新旧规则数值节奏不等价。详细边界、测试、部署和待补美术见 [Runtime/Production.md](Runtime/Production.md)。''')
|
||
append('Doc/Design/Combat/SkillSlice/Production.md','''后续已将独立样例推广到正式技能协议与全关战场,见 [../Runtime/Production.md](../Runtime/Production.md)。本页保留独立样例的原始制作记录;正式配置、分页、恢复与客户端入口以Runtime文档为准。''')
|
||
append('GameDesign.md','''正式战斗新增客户端能力协商:combatProtocol1使用服务端冻结技能表与权威事件轨迹(快照rulesVersion3),统一动作/弹道/命中/数据处理;旧客户端/在途挑战继续原规则。现覆盖25技能、20主线关和5属性挑战。核心仍为自动战斗,胜负与幂等奖励由服务端决定。当前详细实施及剩余专属表现/真机验收见 `Doc/Design/Combat/Runtime/Production.md`。''')
|
||
print('Registered authoritative skill protocol, formal battle presentation, testing and development deployment')
|
||
|
||
if __name__=='__main__':main()
|