Files
AIGame/Tools/write_combat_runtime_report.py
T

99 lines
14 KiB
Python
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.
"""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()