Files
JWeBot/docs/cs-major-autochess-design.md
T
2026-10-15 18:08:55 +08:00

673 lines
17 KiB
Markdown
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.
# CS Major 自走棋设计稿
本文档定义一个完全本地、确定性结算、以 CS 职业选手为棋子的群聊
小游戏方案。赛事包装统一为“第 n 届 IEM 盐田 Major”。AI 默认负责主持、
裁判、播报和剧情生成;主持人也可显式加入一支本地确定性 AI 战队。
## 1. 设计目标
1. 做成一个多人报名、多人运营、多人对战的群聊自走棋。
2. 玩法重心放在每轮选秀和阵容运营,而不是复杂微操。
3. 用 Major 赛事包装训练赛、小组单循环、淘汰赛和终局剧情。
4. 结算逻辑必须完全本地、可重放、可持久化、可回档验证。
5. 每一段剧情都要落档,且剧情只能在数值结算之后生成。
## 2. 核心体验
一句话定义:
`三轮赛前选秀 -> 轮次训练赛拿资源 -> D 牌与布阵 -> BO3 小组单循环 -> BO5 淘汰赛 -> 保存每轮赛报与剧情`
玩家感受到的乐趣应当主要来自:
- 第一轮从固定 10 人教练池里抢体系教练;
- 第二、三轮公开选手池里抢关键卡;
- 决定要不要保经济还是强行 D 牌;
- 赌阵容成型时点;
- 看小组单循环和淘汰赛赛报;
- 看最终冠军剧情与本届 Major 档案。
## 3. 对局对象与规模
### 3.1 报名
- 开局命令由任意玩家发起。
- 其他玩家在报名窗口内加入。
- 建议一局支持 `2~8` 名真人玩家。
- 主持人可在报名阶段发送 `/自走棋加AI战队`:
- 两名真人时加入 AI 战队 A、B;
- 三名真人时加入一支 AI 战队。
- 两种测试模式都补满四队,先进行 BO3 小组单循环,再按排名生成
`1v4`、`2v3` 半决赛。
- AI 占一个参赛席位,但不对应群成员,也不调用在线模型。
- AI 使用确定性规则选秀、买牌、调整首发和选择克制战术;为便于测试,
AI 阵容战力会有明确折扣。
### 3.2 玩家初始状态
每位玩家开局拥有:
- 生命值:`100`
- 金币:`10`
- 教练:赛前第一轮选秀决定
- 初始选手:赛前第二、三轮选秀决定,系统随后补齐阵容
- 阵容位:固定 `5 个选手位 + 1 个教练位`,比赛时必须全部上场
- 备战席:`3 格`
- 连胜/连败计数:`0`
- 本局独立事件档案编号
三轮选秀完成后,系统按已选核心确定性补齐每队 `5 名首发 + 3 名备战`
和常驻教练,保证训练赛开始时就是完整阵容。
## 4. 选手池设计
### 4.1 选手来源
只使用“近期非常出名”的职业选手。第一期池子优先覆盖以下俱乐部与明星:
- Spirit
- Vitality
- Falcons
- G2
- FaZe
- NAVI
- MOUZ
- The MongolZ
- Astralis
- Liquid
- FURIA
- Eternal Fire
选手数据不是对真实比赛数据的一比一复刻,而是基于公众认知做游戏化映射。
0.6.7 起本地维护 `100+` 名棋子和 `18` 名教练元数据;运行期不在线抓取
或改写数值。首轮教练选秀仍固定展示 10 个候选,保证聊天窗口可读。
### 4.2 费用层级
选手分为 `1~5 费`,越高费越稀有,基础数值和成长更强。
示例分层:
- `5 费`:donk、ZywOo
- `4 费`:m0NESY、NiKo、ropz、frozen
- `3 费`:apEX、b1t、xertioN、w0nderful、malbsMd
- `2 费`:辅助型或中坚选手
- `1 费`:前期过渡与羁绊补齐牌
正式实现时应维护一份固定的选手静态表,不允许运行期随意漂移。
### 4.3 定位
只保留三个核心定位:
- `步枪手`
- `狙击手`
- `指挥`
定位不是羁绊,而是战斗中的属性倾向与技能触发来源。
### 4.4 羁绊
只保留两类羁绊:
1. `战队羁绊`
2. `国家羁绊`
战队羁绊可来自:
- 当前主战队;
- 历史待过的关键战队;
- 每名选手最多挂 `3` 条战队标签,避免过度泛化。
国家羁绊只有 `1` 条。
## 5. 选手数值
### 5.1 基础数值轴
为避免面板过宽,第一期只展示三个主数值:
- `火力`
- `稳定`
- `残局`
其中指挥位额外拥有隐藏或显式的 `指挥` 修正值,用于影响全队。
### 5.2 数值范围
- 1 费:`52~68`
- 2 费:`60~76`
- 3 费:`68~84`
- 4 费:`78~92`
- 5 费:`88~98`
要求同费位内部也要有明显差异,不能所有 4 费都只有一两点波动。
### 5.3 派生战斗权重
可先采用以下简单模型:
`单卡战力 = 火力 * 0.45 + 稳定 * 0.30 + 残局 * 0.25 + 星级修正 + 羁绊修正 + 教练修正`
若定位是狙击手,可给火力更高上限;
若定位是指挥,可给团队修正更高权重。
### 5.4 属性与定位克制
战斗不能只比较总战力后掷骰子。三项主属性形成闭环:
- `稳定克火力`:稳定阵容能吸收强攻的第一波冲击;
- `火力克残局`:前期人数优势会压缩残局发挥空间;
- `残局克稳定`:高残局能力能打破按部就班的默认局面。
三个定位也形成轻量闭环:
- `狙击手克步枪手`
- `步枪手克指挥`
- `指挥克狙击手`
玩家每回合可选择 `/战术 火力|稳定|残局`。战术选择会强化对应属性,
并在克制对方战术时获得额外修正。属性、定位和战术的总克制修正上限
应明显高于随机波动,让调阵和判断对手比运气更重要。
## 6. 升星规则
- `3 张同名 = 2 星`
- `9 张同名 = 3 星`
升星收益建议:
- 2 星:基础战力乘 `1.35`
- 3 星:基础战力乘 `1.80`
升星后保留原有羁绊与定位,不改变标签。
## 7. 教练系统
教练位不是普通战斗单位,但始终与 5 名选手一起上场。
### 7.1 教练等级作用
教练只提供额外的全队战术加成,不控制上场人数,也不占用选手位。
建议加成:
- 1 级:全队战力 `+2%`
- 2 级:全队战力 `+4%`
- 3 级:全队战力 `+6%`
- 4 级:全队战力 `+8%`
- 5 级:全队战力 `+10%`
### 7.2 教练获取
教练由第一轮公共选秀决定,本届赛事内不能用金币升级教练。不同教练
自带等级、属性倾向和全队加成。
高费选手的商店概率随赛事进程推进,不再绑定教练等级。
## 8. 每轮 6 人选秀
这是本模式的核心。
### 8.1 固定规则
- 每轮只展示 `6` 名候选选手。
- 这 `6` 人对所有玩家公开可见。
- 每位玩家始终保有 5 名首发;购买的新选手进入备战席或与同名选手合成。
- 调整阵容时必须用备战席选手替换首发,不能让首发少于 5 人。
- 第一版采用“公开同池、各自购买”的简化方案:
- 所有人看到同一组 6 人;
- 某个玩家选择后,不会把该候选从其他玩家界面里抢空;
- 但底层共享总卡池仍然会影响后续刷新概率。
- 每名候选都必须展示完整数据:
- 编号 `1~6`
- 选手名
- 费用
- 定位
- 国家
- 主战队
- 历史战队
- 主数值
- 玩家通过编号选择,不输入复杂自然语言。
### 8.2 选秀指令
建议指令面如下:
```text
/自走棋开始
/自走棋报名
/自走棋加AI战队
/自走棋状态
/选1
/选2
/选3
/选4
/选5
/选6
/选7
/选8
/选9
/选10
/刷新
/锁定
/战术 火力|稳定|残局
/上阵 备战编号 [首发位]
/出售 备战编号
/阵容
/赛程
/结束回合
```
中文是主命令,英文别名可以后补。
### 8.3 刷新与锁定
- 第一轮教练选秀展示固定 10 名教练;第二、三轮选手选秀展示 6 名选手。
- 训练赛和正赛运营阶段默认展示一组 6 人商店。
- 玩家可支付金币执行刷新。
- 玩家可锁定本轮 6 人,使下一轮仍保留同一组候选。
### 8.4 顺位
- 开赛后三轮公共选秀,第一轮选教练,第二、三轮选选手。
- 第二轮使用反向顺序,避免种子靠前者连续先手。
- AI 轮次会自动选择,真人只在轮到自己时使用 `/选N`。
第一期建议先做“公开同池、各自结算”,避免群聊交互过重。
## 9. 回合流程
建议一整回合拆成五段:
1. `回合开始播报`
2. `6 人选秀 / 刷新 / 升级 / 调阵`
3. `训练赛 / 赛事挑战 / PvP 结算`
4. `回合结算与经济发放`
5. `剧情归档`
## 10. 训练赛与赛事挑战
训练赛不再是阈值型 PvE。它是正式小组赛前的多轮真实对阵,用来给玩家
检验阵容、获取金币并自然插入 D 牌窗口。媒体日和赞助挑战仍作为赛事内
插曲出现,但只提供资源变动,不淘汰玩家。
### 10.1 活动类型
- 训练赛
- 媒体日
- 赞助挑战
- 本地陪练队热身
### 10.2 训练赛作用
训练赛按参赛队伍生成 round-robin 轮次。四队测试局会有三轮训练赛,
每队在训练阶段遇到另外三支队伍;奇数队伍时轮空队会与本地陪练队热身。
训练赛只发放金币,不记录小组胜负,也不扣生命。
每轮训练赛结束后进入运营窗口:
- `/刷新` 即 D 牌,消耗金币换一组 6 人商店;
- `/选1~/选6` 买入商店选手,重复卡自动累积星级;
- `/锁定` 保留当前商店;
- `/上阵` 调整 5 人首发;
- `/战术 火力|稳定|残局` 改变下一场的回合倾向。
### 10.3 训练赛结算逻辑
训练赛使用与正式比赛相同的单图 MR15 逐回合模拟,只是赛制为 BO1。
胜方获得更多金币,负方也有保底金币,保证测试局能继续运营。
媒体日和赞助挑战根据阵容完整度、教练、战术和本地确定性随机因子发放
金币,但播报不展示“目标/发挥”这类计算日志,只写剧情和奖励。
## 11. PvP 赛制
### 11.1 赛事包装
整局赛事名称固定为:
`第 n 届 IEM 盐田 Major`
### 11.2 按参赛人数生成赛制
- `2 人`:直接进入决赛。
- `3 支队伍`:进行完整单循环,前 2 名进入决赛。
- `4 人`:不打小组赛,按报名种子直接进行 `1v4`、`2v3` 半决赛。
- `5~8 人`:进行完整小组单循环,每两支队伍只交手一次,前 4 名晋级。
奇数队伍的小组比赛日会有一队轮空,但不会获得胜场。
小组赛每场采用 `BO3`。
### 11.3 小组排名
小组赛首先按胜场排序;同胜场依次比较:
1. 相互交手结果;
2. 当前完整五人阵容战力;
3. 剩余生命值;
4. 固定种子编号。
所有配对在开赛时一次性生成并落档,不允许运行中根据结果重排赛程。
### 11.4 淘汰赛
- 四强固定为 `小组第 1 vs 第 4`、`第 2 vs 第 3`。
- 3 人赛制由小组第 1、2 名直接进入决赛。
- 4 人赛制使用报名种子 `1v4`、`2v3`。
- 2 人赛制直接进入决赛。
- 半决赛胜者进入总决赛,决出本届冠军。
- 半决赛和总决赛均采用 `BO5`。
## 12. 战斗结算
### 12.1 目标
战斗要做到:
- 本地确定性;
- 单轮可解释;
- 支持战报;
- 不依赖在线模型。
### 12.2 简化模型
建议第一期采用“阵容总分 + 对位修正”的轻量模型。
#### 步骤 1:计算阵容基础战力
`阵容基础战力 = 5 名首发选手战力总和`
#### 步骤 2:加上团队修正
团队修正来源:
- 战队羁绊
- 国家羁绊
- 教练等级提供的全队百分比加成
- 装备/战术卡
- 连胜或特殊事件 buff
#### 步骤 3:计算克制修正
依次计算:
1. `稳定 > 火力 > 残局 > 稳定` 的属性对位;
2. `狙击手 > 步枪手 > 指挥 > 狙击手` 的定位对位;
3. 双方本回合主动选择的战术对位。
克制结果必须进入结构化战报,明确展示双方修正值。
#### 步骤 4:加入小幅波动
只允许 `-2% ~ +2%` 的确定性哈希波动。单次运气不能覆盖成型阵容的
属性、定位和战术克制优势。
#### 步骤 5:计算比分
单图采用 `MR15`:
- 常规时间先到 `16` 分获胜;
- 常规时间 `15-15` 进入加时;
- 加时可产生 `19-17`,多轮加时可产生 `22-20` 等比分;
- 每次加时除结构化单图结果外,必须额外生成一段加时剧情并落档。
小组赛按 BO3 先赢 2 图,淘汰赛按 BO5 先赢 3 图。系列赛战报必须展示
大比分、每张图比分、加时次数和克制修正。
## 13. 剧情系统与落档
这是本模式的强制要求。
### 13.1 归档原则
必须先结算,后写剧情。
即:
1. 固化数值结果;
2. 存档回合事实;
3. 基于事实生成文字赛报;
4. 再把文字赛报作为附加档案保存。
### 13.2 必须落档的节点
- 开局报名完成
- 每轮 6 人选秀结果
- 每次刷新和关键升星
- 每轮训练赛和赛事挑战结果
- 每场 PvP 结果
- 小组赛排名、晋级和淘汰节点
- 淘汰赛对阵与结果
- 冠军总结
### 13.3 档案结构
建议至少保存两类记录:
1. `结构化事件档`
2. `文本剧情档`
结构化事件档用于回放和调试;
文本剧情档用于玩家阅读。
示例:
```json
{
"run_id": "major_0001",
"round": 4,
"phase": "group_2",
"event_type": "pvp_result",
"player_a": "Jacky",
"player_b": "Alice",
"winner": "Jacky",
"score_band": "close_win",
"roster_a_power": 418,
"roster_b_power": 403
}
```
## 14. 数据持久化设计
建议新增以下 SQLite 表。
### 14.1 对局主表
`autochess_runs`
- run_id
- group_fingerprint
- season_number
- state
- created_at
- updated_at
### 14.2 玩家状态表
`autochess_players`
- run_id
- person_key
- display_name
- hp
- gold
- coach_level
- coach_xp
- wins
- losses
- streak
- board_json
- bench_json
- shop_json
- locked_shop
### 14.3 选秀记录表
`autochess_shop_events`
- run_id
- round_number
- person_key
- visible_pool_json
- action_type
- action_payload_json
- created_at
### 14.4 战斗结果表
`autochess_battles`
- run_id
- round_number
- phase
- battle_type
- player_a
- player_b
- result_json
- created_at
### 14.5 剧情归档表
`autochess_story_logs`
- run_id
- round_number
- phase
- story_type
- story_text
- facts_json
- source_event_id
- created_at
### 14.6 幂等与重放表
`autochess_action_replay`
- run_id
- person_key
- round_number
- event_id
- action_kind
- response_text
- created_at
## 15. 回放与幂等
因为群聊环境会出现重复事件、OCR 重读和命令重放,必须保证:
- 同一事件只执行一次;
- 同一回合不能重复发奖或重复扣款;
- 同一段剧情不能重复写多份版本;
- 回合失败时整段事务回滚。
建议沿用现有本地游戏的幂等思路,为自走棋单独增加 action replay 表。
## 16. 指令交互风格
建议所有回复都遵循现有小游戏风格:
多段回复优先。一次主持动作可以拆成欢迎语、参赛名单、种子顺序、候选池、
状态面板、操作指引等多条消息,每条保持在发送上限内。
例如:
```text
欢迎来到第一轮选秀,本轮选教练。
选择顺序:Jacky、Alice、AI 战队 A、AI 战队 B
1. zonic|5级教练|冠军体系|火78 稳92 残88|全队+9%
...
现在轮到 @Jacky 做出选择,使用 /选1~/选10。
```
### 16.1 Taffy 主持状态机
主持人必须承担完整赛事主持,而不是只在结算时出现;输出不需要每句都带
`Taffy:` 前缀。
开赛时必须包含:
- `欢迎大家来到第 n 届 IEM 盐田 Major`
- 本届参赛者和种子
- 当前人数对应的完整赛制
- 小组赛 BO3、淘汰赛 BO5、单图 MR15 和加时规则
- 三轮选秀规则和当前选择玩家
- 训练赛、小组赛和淘汰赛的当前阶段
赛前选秀按顺序逐人选择。进入阵容准备、训练赛运营和小组赛运营后,
所有相关真人发送 `/结束回合` 即可自动推进,不需要主持人手动结算。
淘汰赛只等待当前对阵中的真人,已经淘汰的玩家不会再被提示准备。
```text
Jacky 选择了 zonic!
现在轮到 @Alice 做出选择,使用 /选1~/选10。
训练赛第 1/3 轮对阵:Team Jacky vs Team Alayak;AI 战队 A vs AI 战队 B
本轮训练结束。现在是运营窗口:/刷新 是 D 牌,/选1~/选6 是买店内选手;
所有真人发送 /结束回合 后进入下一轮训练。
```
以下节点都必须由 Taffy 主持并落档:
- 报名开启和新选手加入
- AI 测试战队加入
- 赛制与种子公布
- 三轮选秀候选池、选择结果和选秀完成
- 每轮训练赛对阵、比分、金币和运营提示
- 媒体日或赞助挑战
- 每场 BO3/BO5 对阵与结果
- 每张加时地图
- 小组排名和前四晋级
- 1v4、2v3 半决赛
- 总决赛和冠军颁奖
## 17. 实现顺序建议
建议按三个阶段落地。
### 第一阶段:最小可玩版
- 建局 / 报名 / 状态
- 每轮 6 人选秀
- 买卡、卖卡、升星
- 教练等级
- 简化训练赛
- 简化 PvP
- 基础剧情归档
### 第二阶段:赛事化增强
- 小组单循环完整配对
- 1v4、2v3 淘汰赛树
- 羁绊与装备系统细化
- 战报模板优化
### 第三阶段:内容扩展
- 在 100+ 人本地卡池基础上增加新赛季棋子
- 更多俱乐部和国家
- 特殊赛事事件
- 更细的剧情风格与本届 Major 年鉴
## 18. 第一版明确不做的内容
为保证能上线,第一版先不做:
- 实时地图微操
- 复杂技能动画
- 过多职业分类
- 在线爬取实时战队数据
- 大量开放文本输入解析
## 19. 最终结论
这套模式最适合按“强运营、轻操作、重赛报”路线实现。
最重要的三个锚点已经确定:
1. `每轮固定 6 人公开选秀`
2. `训练赛与挑战负责资源,PvP 负责小组单循环与淘汰赛`
3. `每一段剧情都必须落档`
如果按这个设计推进,实现出来的成品会更像一场可回放、可复盘、
可连载的本地 Major 模拟器,而不是一个只有数值结算的普通抽卡游戏。