Files
Embalming_Girl_Client/Doc/Game.md
T
2026-06-18 17:29:28 +08:00

399 lines
34 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.
# 《冰冷的她醒来之前》数字版开发指导文档
## 1. 项目概述
### 技术选型
- **客户端**C++20 + Qt6 (Widgets 模式,非 QML)
- **服务端**Go 1.22+
- **通信层**WebSocket + JSON(游戏逻辑与信令);WebRTC(实时语音媒体传输)
- **语音架构**:客户端点对点(P2P)或选择性转发(SFU),服务端提供信令中继与房间管理
- **架构模式**:客户端-服务器架构,服务端持有绝对权威
### 核心设计原则
1. **服务端绝对权威**:所有游戏状态、逻辑判定、胜负计算、随机过程(洗牌)均由服务端完成。客户端仅负责渲染与输入采集。
2. **状态快照同步**:服务端以完整游戏状态快照的形式向客户端广播,客户端在收到快照后更新本地视图。禁止客户端本地预测游戏结果。
3. **信息隔离**:反面朝上的卡牌、其他玩家的手牌内容、尚未结算的质疑牌等敏感信息,在未被服务端授权前不得向客户端传输。客户端无法通过内存读取或抓包获知隐藏信息。
4. **数据可配置化**:卡牌的具体属性(名称、人力值、优先顺序、胜利条件、效果描述、张数配置)全部外置为配置文件,由用户自行填写,程序只读取配置运行。
---
## 2. 客户端架构说明
### 2.1 渲染框架
采用 Qt6 Widgets + QGraphicsScene 构建游戏主场景。场景按功能划分为若干逻辑层:
- **背景层**:桌面、环境装饰
- **公共区域层**:少女的尸体牌、调和区、信息提示牌
- **玩家区域层**:每个玩家对应一个独立面板,包含其已使用特技区、质疑区、手牌数量指示器
- **本地手牌层**:当前玩家自己的手牌,以可交互的卡牌视图呈现
- **动画层**:卡牌移动、翻转、传递的过渡动画覆盖在所有层之上
- **UI控件层**:行动菜单、弹窗、倒计时、日志面板
### 2.2 卡牌视图对象
每张卡牌对应一个独立的图形对象,具备以下状态:
- **正面/反面**:正面显示卡牌的立绘与文字,反面显示统一的卡背图案
- **选中/未选中**:高亮边框或抬升效果
- **可用/禁用**:根据当前回合阶段,不可操作的卡牌降低透明度或置灰
- **锁定**:暂时退出玩家的手牌进入锁定状态,不可被交互
卡牌对象的正面图像资源通过卡牌类型标识符从外部加载,程序不硬编码任何卡牌美术资源路径。
### 2.3 动画系统
关键动画效果包括:
- **放置动画**:卡牌从手牌区飞向目标区域(调和区、质疑区、已使用区)
- **翻转动画**:结算阶段时,反面朝上的卡牌逐渐翻转为正面,使用缩放模拟3D翻转
- **传递动画**:新闻部等效果导致手牌在玩家之间传递时,卡牌沿贝塞尔曲线路径飞行
- **高亮动画**:需要玩家做出选择时,可选目标脉冲闪烁
动画播放期间应阻塞玩家输入,防止在动画未完成时发送操作指令。
### 2.4 实时语音模块
客户端集成独立的语音通信子系统,与游戏逻辑模块解耦。
**音频采集与播放**
- 使用平台原生音频 API 或 Qt Multimedia 模块进行麦克风采集与扬声器播放
- 支持 16kHz/48kHz 采样率,单声道,Opus 编码
- 本地播放其他玩家的音频流,支持独立音量调节
**网络传输**
- 媒体流通过 WebRTC 传输,信令复用现有的 WebSocket 连接
- 支持两种拓扑模式:
- **P2P 网状网络**:3-4 人房间时,各客户端直接互连,服务端仅转发信令
- **SFU 选择性转发**:5-6 人房间或 P2P 连接失败时,由服务端语音中继模块转发混音后的音频流
**信令流程**
- 玩家加入房间后,通过 WebSocket 发送语音就绪通知
- 服务端广播房间内其他玩家的语音端点信息(WebRTC SDP offer/answer 与 ICE candidate 通过 WebSocket 隧道传输)
- 连接建立后,音频通道与游戏通道并行运行
**语音交互界面**
- 每位玩家头像旁显示语音状态指示器:
- 静音(麦克风关闭)
- 发言中(语音活动检测触发,显示声波动画)
- 连接异常
- 全局语音开关按钮:一键关闭/开启麦克风
- 独立音量滑块:可单独调节每位玩家的接收音量
- 可选的按键发言模式(按住空格键说话)
**语音与游戏联动**
- 玩家暂时退出或断开连接时,自动将其语音通道静音
- 结算阶段动画播放期间,语音保持畅通,不强制静音
---
## 3. 服务端架构说明
### 3.1 并发模型
服务端采用 Go 的 Goroutine + Channel 模型。每个游戏房间由一个独立的逻辑 Goroutine 管理,该 Goroutine 内部维护一个事件循环,按顺序处理玩家输入、效果结算、状态广播。同一房间内的所有操作串行执行,避免并发竞争。网络 I/O 与游戏逻辑解耦,WebSocket 连接层将玩家消息投递到对应房间的 Channel 中。
### 3.2 房间管理
服务端维护一个房间列表,每个房间包含:
- 房间唯一标识
- 玩家列表(含连接状态、语音就绪状态)
- 当前游戏状态机
- 历史日志(用于断线重连后同步)
房间支持的状态:等待中、设置中、进行中、结算中、已结束。
### 3.3 游戏状态机
游戏生命周期划分为以下主阶段,顺序不可逆:
1. **等待阶段**:玩家加入、准备、房主发起开始
2. **设置阶段**:根据人数计算调和目标值,从牌库中移除指定卡牌,构建本局牌库
3. **发牌阶段**:洗牌并均分到手牌,确定起始玩家
4. **进行阶段**:主循环,玩家依次行动
5. **结算阶段**:全员暂时退出后,依次执行调和判定、质疑判定、胜利判定
6. **结束阶段**:公布结果,房间回到等待状态或自动解散
进行阶段内部可细分为子状态:
- 等待选牌
- 等待选择行动方式(特技/调和/质疑)
- 等待选择目标(质疑对象或特技目标)
- 效果结算中
- 等待效果响应(如其他玩家选牌)
- 回合结束检查
### 3.4 效果系统架构
效果系统采用策略模式或接口驱动模式。每张卡牌的能力对应一个独立的效果处理器。效果处理器注册到全局效果表中,通过卡牌类型标识符查找触发。
效果处理器需声明以下能力:
- **触发时机**:打出时触发、回合开始时触发、回合结束时触发、结算阶段触发
- **是否需要响应**:是否需要向其他玩家发送选择请求并等待回复
- **响应类型**:选牌、选人、确认、二选一
- **是否可被取消**:在何种条件下效果失效(如目标不存在、玩家已退出)
效果结算采用链式或队列式处理:若一张卡牌的效果引发了另一张卡牌的条件(如外星人回应优等生),则效果管理器按顺序入队,依次处理。
### 3.5 实时语音中继模块
服务端运行一个与游戏逻辑并行的语音信令与媒体中继层。
**信令中继**
- 复用现有 WebSocket 连接,不额外开放端口
- 定义语音专属信令消息类型:SDP offer、SDP answer、ICE candidate、语音就绪、语音断开
- 收到某玩家的信令后,向目标玩家转发,服务端不解析 SDP 内容
**SFU 媒体中继(可选)**
- 当房间人数大于 4 人或 P2P 打洞失败时,启用 SFU 模式
- 服务端接收各客户端的音频流,进行混音或选择性转发
- 使用 Go 的 WebRTC 库(如 pion/webrtc)实现
- 混音策略:最多同时转发 3 路音频,避免带宽爆炸;优先转发最近发言者
**语音房间管理**
- 语音频道生命周期与游戏房间绑定:房间创建时初始化语音会话,房间销毁时关闭
- 玩家加入房间后,可选择是否加入语音(默认不自动开启麦克风)
- 玩家断线时,服务端通知其他客户端移除该玩家的音频轨道
---
## 4. 通信协议框架
### 4.1 传输层
基于 WebSocket 的全双工通信,消息载荷为 JSON。所有消息包含统一的元数据:消息类型、时间戳、序列号(用于丢包检测与断线重连)。
### 4.2 客户端向服务端发送的消息类型
- **加入/离开房间**
- **准备/取消准备**
- **开始游戏**(仅房主)
- **选择手牌**(从手牌中指定一张)
- **确认行动**(选择特技、调和或质疑,质疑需附带目标玩家标识)
- **效果响应**(在效果处理器要求下,选择特定卡牌或玩家,或确认/取消)
- **聊天消息**(可选)
- **语音信令**WebRTC SDP/ICE,透传至目标玩家)
- **语音状态**(麦克风开启/关闭)
### 4.3 服务端向客户端广播的消息类型
- **房间状态同步**(玩家列表、准备状态、房主)
- **游戏开始通知**(附带初始配置)
- **完整状态快照**(游戏进行中的核心同步消息,包含所有公开信息与当前玩家自己的私有信息)
- **卡牌移动事件**(某张卡牌从某区域移动到某区域,是否反面朝上)
- **卡牌翻转事件**(结算时翻开调和区或质疑区)
- **效果触发通知**(告知所有玩家某效果正在结算,以及需要响应的玩家)
- **请求选择**(向特定玩家发送弹窗请求,要求其在限时内做出选择)
- **玩家暂时退出通知**
- **结算阶段通知**(进入调和判定、质疑判定、胜利判定)
- **游戏结束通知**(获胜者列表、结局类型)
- **错误通知**(非法操作、超时、网络异常)
- **语音信令转发**(将某玩家的 SDP/ICE 转发给目标玩家)
- **语音状态同步**(广播某玩家的麦克风开启/关闭状态)
### 4.4 状态快照的信息隔离策略
状态快照是服务端向客户端同步的核心机制,必须严格遵守信息隔离:
- **自己的手牌**:完整传输卡牌标识符、类型、人力值、优先顺序
- **他人的手牌**:仅传输数量,不传输任何卡牌内容
- **调和区**:游戏进行中仅传输卡牌标识符与放置顺序,不传输类型和人力值;结算阶段由服务端单独发送翻转事件
- **质疑区**:对质疑对象(被放置卡牌的玩家)是否可见由服务端决定;对非对象玩家,仅传输质疑区存在卡牌的数量或标识符,不传输内容
- **已使用区(特技区)**:正面朝上,完整传输所有信息
- **牌库**:不传输
### 4.5 语音信令消息格式
语音相关消息复用现有 WebSocket 通道,通过消息类型字段区分:
- **SDP Offer**:发起方发送,包含目标玩家 ID 与 SDP 字符串
- **SDP Answer**:响应方发送,包含目标玩家 ID 与 SDP 字符串
- **ICE Candidate**:双方交换网络候选路径,包含目标玩家 ID、候选类型、地址信息
- **Voice Ready**:客户端通知服务端本地语音引擎初始化完成
- **Voice Toggle**:客户端通知服务端麦克风开启或关闭,服务端广播给房间内其他玩家
---
## 5. 游戏逻辑核心流程
### 5.1 设置与发牌
根据玩家人数,从完整牌库中按配置移除指定类型和数量的卡牌,形成本局牌库。洗牌后按人数均分为手牌。持有特定起始标记卡牌的玩家成为起始玩家;若该卡牌已被移除,则随机指定。
### 5.2 回合流程
当前玩家从手牌中选择一张卡牌,并选择以下三种行动之一:
1. **特技**:将卡牌正面朝上放置于自己的已使用区,并触发该卡牌的效果。部分卡牌持有即生效,无需打出;打出后可能不产生额外效果。
2. **调和**:将卡牌反面朝上放置于调和区(尸体旁)。放置时记录先后顺序。
3. **质疑**:将卡牌反面朝上放置于另一名玩家的质疑区。不可质疑自己。
回合结束时,若玩家手牌仅剩最后一张,则该玩家暂时退出游戏。退出后不再参与回合轮转,其手牌被锁定(不再受到移动手牌类效果的影响),但仍可成为质疑目标。
### 5.3 效果失效与边界情况
效果系统需处理以下边界情况:
- 若效果的目标已不存在(如目标玩家已退出,或目标区域为空),则效果立即中止。
- 某些卡牌的效果需要持有者存活到特定时机才能生效;若持有者在效果生效前已退出,则效果自然失效。
- 暂时退出的玩家跳过需要其主动响应的效果(如新闻部传递手牌时跳过已退出者,将牌传给其左手边未退出的玩家)。
### 5.4 结算阶段
当所有玩家均暂时退出后,进入结算阶段,分为三个顺序执行的判定:
**调和判定**:翻开调和区所有卡牌,统计人力值总和。若总和达到或超过目标值,则调和成功;否则调和失败。
**质疑判定**:将每个玩家质疑区的卡牌全部改为正面朝上,分别计算各玩家质疑区的人力值合计。合计值最高的一名或多名玩家被视为犯罪嫌疑人而受到监禁。若所有玩家的合计值相同(包括全为零),则无人被监禁。人力值为负数的卡牌在质疑判定时视为零。
**胜利判定**:按照优先顺序由低到高(从第一优先到第五优先)依次检查每名玩家的最后一张手牌。若某优先顺序下有玩家满足其胜利条件,则这些玩家立即获胜,后续优先顺序不再检查。若同一优先顺序下有多名玩家满足条件,则他们共同获胜或共同失败。即使被监禁的玩家也可以参加胜利判定。
### 5.5 结局类型
- **正常胜利**:一至多名玩家满足胜利条件
- **全灭结局**:没有任何玩家满足胜利条件
- **混沌模式变体**:可在设置阶段开启。该模式下,玩家最后一张手牌也可以通过能力效果转移,但玩家仍然处于暂时退出状态。
---
## 6. 界面交互设计规范
### 6.1 主界面布局
界面采用横向宽屏布局,中央为公共区域,四周为玩家面板。
- **顶部**:房间信息、当前回合玩家指示、剩余时间倒计时、全局语音开关按钮
- **中央上方**:其他玩家的面板,以头像或名称标识,显示其手牌数量、已使用区、质疑区;头像旁显示语音状态指示灯
- **中央**:少女的尸体牌与调和区。调和区以横向排列的卡牌槽位展示,卡牌反面朝上时显示卡背,结算时依次翻开
- **底部**:当前玩家自己的手牌区,以扇形或横向排列展示,支持点击选中
- **底部操作栏**:选中卡牌后弹出行动按钮(特技、调和、质疑)。选择质疑后,其他玩家头像高亮,点击目标后确认
- **右下角**:游戏日志面板,滚动显示操作记录
- **左侧边栏(可选)**:房间内玩家列表与独立音量控制滑块
### 6.2 交互状态机
客户端界面需维护一个与服务器对应的本地交互状态:
- **空闲**:等待自己或他人的回合,禁止操作
- **选牌中**:自己的回合,可点击手牌,选中后弹出行动菜单
- **选目标中**:已选择质疑或需要指定目标的特技,等待点击目标玩家
- **等待响应**:自己的效果处理中,或等待其他玩家响应效果
- **选择响应中**:服务端要求自己选择卡牌或玩家作为效果响应
- **观看结算**:结算阶段,观看动画,禁止操作
### 6.3 信息提示与辅助
- 鼠标悬停在卡牌上时,显示该卡牌的详细说明(从配置读取)
- 调和区显示当前放置顺序编号
- 当效果需要玩家做出选择时,界面中央弹出模态对话框,附带倒计时条
- 超时未操作则自动执行默认行为或视为放弃(由服务端定义超时惩罚)
### 6.4 语音交互细节
- 发言者头像边框高亮或显示绿色脉冲环,直观指示当前谁在说话
- 玩家手动关闭麦克风时,头像旁显示静音图标
- 语音连接质量不佳时,显示弱网警告图标
- 提供全局静音按钮(仅关闭接收,不影响发送)用于专注思考
---
## 7. 关键机制实现要点
### 7.1 信息隔离的技术实现
信息隔离是防止作弊的核心。服务端在构建状态快照时,必须为每个玩家生成定制化的视图:
- 遍历所有卡牌,根据卡牌位置、朝向、以及当前接收快照的玩家身份,决定该卡牌在此快照中暴露哪些字段
- 卡牌内容字段(类型、人力值、优先顺序)仅在卡牌正面朝上且对该玩家可见时填充;否则留空或设为占位符
- 客户端渲染器根据卡牌内容是否存在,决定显示正面图像还是卡背图像
### 7.2 断线重连
玩家断线后,服务端保留其游戏状态一段时间。重连时,服务端向该玩家发送当前完整状态快照,客户端重建界面。若断线期间有需要该玩家响应的效果,应延长等待时间或为其选择默认选项。语音连接随游戏连接一并重建。
### 7.3 时序与并发
- 所有玩家操作必须带服务端时间戳排序
- 效果结算期间,房间应处于“结算中”状态,拒绝新的玩家操作(聊天与语音除外)
- 动画播放时间由客户端本地控制,但逻辑上服务端在发送事件后立即进入下一状态,不等待客户端动画完成。客户端通过队列缓冲事件,保证动画按顺序播放
### 7.4 配置热加载
卡牌库、设置规则、胜利条件等应存储于外部配置文件(如 JSON)。服务端启动时加载,游戏房间创建时复制一份配置快照,防止运行中修改配置影响已开局的房间。用户自行填写卡牌内容、人力值、优先顺序、张数、胜利条件、效果文本等字段,程序仅校验数据类型和逻辑一致性(如优先顺序范围、人力值范围)。
---
## 8. 开发阶段建议
### 第一阶段:网络与框架
实现 WebSocket 连接、房间管理、玩家加入离开、准备开始。客户端完成主界面布局与卡牌对象的基本显示。
### 第二阶段:核心循环
实现发牌、回合轮转、三种基础行动(特技/调和/质疑)、暂时退出机制。确保状态快照能正确同步,信息隔离生效。
### 第三阶段:效果系统
搭建效果处理器框架。逐个实现卡牌效果,重点处理需要多玩家响应的复杂效果(如手牌传递、交换、查看)。确保效果失效边界情况被覆盖。
### 第四阶段:语音集成
集成 WebRTC 或音频库,实现信令交换、P2P/SFU 媒体传输、语音状态指示器。先在等待房间中测试语音稳定性,再集成到游戏流程中。
### 第五阶段:结算与动画
实现三阶段结算流程。客户端配合完成卡牌翻转动画、结算结果展示。处理共同胜利、全灭结局等分支。
### 第六阶段: polish 与变体
添加混沌模式、音效、断线重连、观战模式、游戏日志导出。
---
## 9. 卡牌信息配置表
以下表格为游戏核心配置模板,请对照实体卡牌逐一填写。**程序启动时读取此表,运行时不再修改。**
### 9.1 基础卡牌属性表
| 序号 | 卡牌类型标识符(英文,程序内使用) | 中文名称 | 人力值 (MP) | 优先顺序 | 胜利条件简述 | 效果触发时机 | 效果描述(玩家可见文本) | 单卡张数 | 备注 |
| :--: | :--------------------------------- | :------- | :---------: | :------: | :--------------------- | :----------- | :----------------------------------------------------------- | :------: | :--- |
| 1 | honor_student | 优等生 | 2 | 4 | 调和成功即可获胜 | | 除你之外的所有玩家闭上眼睛,然后持犯人牌的玩家吐出舌头。等他们将舌头收回后所有玩家睁开眼睛。(一边发号施令一边进行游戏) | 3 | |
| 2 | health_committee_member | 保健委员 | 1 | 4 | 调和成功即可获胜 | | 你可以选择1张其他玩家已使用(正面朝上)的非保健委员的牌,将它加入自己的手牌中。 | 2 | |
| 3 | accomplice | 共犯 | 0 | 3 | 犯人获胜即可获胜 | | 将1张放在任意玩家面前质疑位置的牌转移到1名其他玩家面前。 | 1 | |
| 4 | library_committee_member | 图书委员 | 1 | 4 | 调和成功即可获胜 | | 你可以查看放在调和位置的所有卡牌。(※查看时注意不要改变卡牌的摆放顺序) | 3 | |
| 5 | alien | 外星人 | -1 | 1 | 被监禁即可获胜 | | 当你持有这张牌时,若有人使用了优等生的特技,你可以伸出舌头,装作是犯人来回应他。当你正面打出这张牌时,不会产生任何效果。 | 1 | |
| 6 | young_lady | 大小姐 | 1 | 4 | 调和成功即可获胜 | | 随机抽取1名其他玩家的1张手牌,然后选择1张自己的手牌保持反面朝上的状态返还给他。(你可以将抽到的那张返还给他) | 3 | |
| 7 | student_council_president | 学生会长 | 3 | 4 | 调和成功即可获胜 | | 持有者成为起始玩家(只需宣称持有即可)。正面打出时不会产生任何效果。 | 1 | |
| 8 | go_home_club | 归宅部 | 0 | 5 | 没有任何人获胜即可获胜 | | 你可以将1张自己的手牌和1张放在调和位置上的牌交换。 | 3 | |
| 9 | infected_person | 感染者 | 0 | 2 | 调和失败即可获胜 | | 在你的下一个回合开始时,若这张牌仍然正面朝上摆在你面前,则可以将调和位置的1张牌加入自己的手牌中。 | 1 | |
| 10 | newspaper_club | 新闻部 | 1 | 4 | 调和成功即可获胜 | | 每位玩家选择1张自己的手牌,将它保持反面朝上的状态传给自己左手边的玩家。 | 3 | |
| 11 | culprit | 犯人 | 0 | 3 | 不被监禁即可获胜 | | 这张牌无论是正面朝上还是反面朝上都无法被使用。(但可因其他卡牌的能力效果而进行移动) | 1 | |
| 12 | class_monitor | 班长 | 2 | 4 | 调和成功即可获胜 | | 选择1名玩家,双方各选择1张自己的手牌,然后保持反面朝上的状态转交给对方。(也可以选择一个人和自己换牌) | 2 | |
| 13 | discipline_committee_member | 风纪委员 | 1 | 4 | 调和成功即可获胜 | | 你可以查看一名玩家的所有手牌。 | 2 | |
| 14 | | | | | | | | | |
| 15 | | | | | | | | | |
> **字段说明**
>
> - **卡牌类型标识符**:程序代码中使用的枚举名或键名,建议英文驼峰命名,如 `StudentCouncilPresident`
> - **优先顺序**:胜利判定时的检查顺序,数字越小越早检查(1 最先,5 最后)
> - **效果触发时机**:可选值:`持有即生效` / `打出时触发` / `回合开始时触发` / `回合结束时触发` / `结算阶段触发`
> - **单卡张数**:该卡牌在完整牌库中的总张数
### 9.2 游戏设置规则表(按人数移除卡牌)
| 玩家人数 | 调和目标值 | 需移除的卡牌类型 | 本局总牌数 | 每人手牌数 |
| :------: | :--------: | :----------------------------------------------------------- | :--------: | :--------: |
| 3 | 9 | 图书委员×1、共犯×1、优等生×1、风纪委员×1、大小姐×1、新闻部×1、归宅部×1 | 18 | 6 |
| 4 | 8 | 图书委员×1 | 24 | 6 |
| 5 | 7 | 无(使用全部卡牌) | 25 | 5 |
| 6 | 6 | 图书委员×1 | 24 | 4 |
> **填写说明**
>
> - **调和目标值**:通常为 `12 - 玩家人数`,请确认实体规则
> - **需移除的卡牌类型标识符**:填写从完整牌库中移除的卡牌,多张请用逗号分隔
> - **每人手牌数**:总牌数 ÷ 人数,确认是否整除
### 9.3 特殊规则对照表
| 规则项 | 实体规则描述 | 程序实现要点 |
| :------------------------- | :----------------------------------------------------------- | :----------------------------------------------------------- |
| **起始玩家确定方式** | 持有"学生会长"的玩家成为起始玩家,只需宣称自己持有这张牌即可,并不需要第一张就打出 | 发牌完成后,服务端遍历所有玩家手牌,找到持有学生会长卡的玩家设为当前回合玩家。若该卡被移除(本局未加入牌库),则随机指定一名玩家为起始玩家。 |
| **犯人卡使用限制** | 这张牌无论是正面朝上还是反面朝上都无法被使用,但可因其他卡牌的能力效果而进行移动 | 行动验证阶段,若玩家选择犯人卡进行特技/调和/质疑,服务端直接拒绝并返回错误。犯人卡仅能通过班长交换、大小姐抽牌、新闻部传递、归宅部交换、共犯转移等被动方式移动。 |
| **感染者效果失效条件** | 若你在剩余手牌不到2张时使用这张牌,你无法活到下一个回合,效果自然失效 | 服务端允许玩家打出感染者,但在效果系统中标记:若打出后该玩家手牌数≤1(立即退出),则感染者效果标记为失效,下回合开始时不再触发选牌请求。 |
| **暂时退出后手牌锁定范围** | 手牌将被锁定,不再受到移动手牌的能力效果影响,但可以被质疑 | 退出玩家的手牌添加"locked"标记。效果系统处理移动手牌类效果(班长、大小姐、新闻部)时跳过这些卡牌。质疑操作不受影响,仍可正常被放置质疑牌。 |
| **质疑区MP合计为负时处理** | 质疑的合计值不会是负数。若合计值是-1,则将它当作0 | 结算阶段计算质疑区MP总和时,对每张卡牌取 `max(0, mp)`。外星人MP=-1,在质疑区贡献0点。 |
| **归宅部与犯人联动规则** | 归宅部可以将1张手牌和1张调和位置的牌交换。若犯人通过归宅部效果进入调和区,则可能出现"其实根本就没有犯人"的结局 | 允许交换。若犯人牌被换入调和区,调和判定阶段统计MP时犯人牌贡献0点(与实际MP一致)。归宅部持有者手牌中不再持有犯人。 |
| **混沌模式与基础模式差异** | 混沌模式中,玩家的最后一张手牌也可以用能力进行转移,但玩家仍然处于暂时退出的状态 | 开启混沌模式后,效果系统处理移动手牌效果时,不跳过仅剩1张手牌的玩家(允许其手牌被交换、传递、抽走)。但该玩家仍标记为已退出,不再参与回合轮转。 |
| **全灭结局触发条件** | 没有任何人能获得胜利而结束游戏的情况 | 胜利判定阶段按优先顺序1→5依次检查,若所有优先顺序下均无人满足胜利条件,则广播全灭结局。 |
### 9.4 卡牌效果详细规格表(供程序逻辑参考)
| 卡牌名称 | 是否需要选择目标 | 目标类型 | 是否影响他人手牌 | 是否影响调和区 | 是否影响质疑区 | 效果失效条件 | 响应超时处理 |
| :----------- | :----------------- | :----------------------------------------------------------- | :----------------------: | :----------------------: | :------------: | :----------------------------------------------------------- | :----------------------------------------------------------- |
| **学生会长** | 否 | 无 | 否 | 否 | 否 | 无(持有即生效,打出不产生效果) | 无 |
| **班长** | 是 | 先选择1名玩家,再双方各选1张自己的手牌 | 是 | 否 | 否 | 目标玩家已退出;目标玩家手牌为空 | 超时自动随机选择1张手牌完成交换 |
| **优等生** | 否(自动触发) | 无(向所有其他玩家发送闭眼指令,向持犯人牌玩家发送提示,向外星人持有者发送是否回应提示) | 否 | 否 | 否 | 其他玩家全部已退出;场上无犯人牌 | 犯人玩家超时未确认吐舌头视为不回应;外星人持有者超时未确认视为不装作犯人 |
| **风纪委员** | 是 | 选择1名玩家 | 否(仅查看,不移动) | 否 | 否 | 目标玩家已退出;目标玩家手牌为空 | 无(纯信息展示,无需超时处理) |
| **大小姐** | 是 | 系统随机选择1名其他玩家并随机抽其1张手牌,然后自己选择1张手牌返还 | 是 | 否 | 否 | 无其他玩家;被抽牌玩家手牌为空 | 超时自动将抽到的牌原路返还,或随机选择1张自己的手牌返还 |
| **新闻部** | 否(但需全员响应) | 每位未退出玩家选择自己的1张手牌 | 是 | 否 | 否 | 无 | 每位玩家超时自动随机选择1张手牌传递;已退出玩家自动跳过 |
| **归宅部** | 是 | 选择自己的1张手牌 + 选择调和区1张牌 | 否 | 是 | 否 | 调和区无卡牌;自己手牌为空 | 超时自动取消效果 |
| **图书委员** | 否 | 无 | 否 | 否(仅查看,不改变顺序) | 否 | 调和区无卡牌 | 无(纯信息展示) |
| **保健委员** | 是 | 选择其他玩家已使用区(SkillZone)中的1张非保健委员牌 | 是(从已使用区移入手牌) | 否 | 否 | 所有玩家已使用区为空;或仅有保健委员 | 超时自动随机选择1张符合条件的牌,若无则取消效果 |
| **外星人** | 否(被动触发) | 无 | 否 | 否 | 否 | 无人使用优等生特技;正面打出时无效果 | 收到优等生触发通知后,超时未响应视为不装作犯人 |
| **感染者** | 是(延迟触发) | 下回合开始时选择调和区1张牌 | 否 | 是 | 否 | 打出后手牌≤2(立即退出,无法活到下回合);下回合开始时此牌不在已使用区;调和区无卡牌 | 超时自动随机选择1张调和区卡牌加入手牌,或放弃效果 |
| **犯人** | N/A | N/A | N/A | N/A | N/A | 无法主动使用 | N/A |
| **共犯** | 是 | 先选择任意质疑区1张牌,再选择1名其他玩家 | 否 | 否 | 是 | 全房间质疑区无卡牌 | 超时自动随机选择1张质疑区卡牌和1名随机其他玩家完成转移 |
> **字段说明**
> - **目标类型**:该效果是否需要玩家选择目标,以及目标的类型
> - **是否影响他人手牌**:效果是否会导致其他玩家的手牌数量或内容发生变化
> - **响应超时处理**:若需要其他玩家响应(如新闻部选牌),超时后如何处理(自动随机选择 / 跳过该玩家 / 效果取消)
---
> **文档说明**:本文档为框架性指导,所有涉及具体卡牌属性(人力值、优先顺序、效果描述、卡牌张数、移除规则)的字段均留空,由开发者根据实体卡牌自行填入配置文件。文档不涉及具体代码实现与项目目录结构。