username 和 player 都指用户名,游戏相关的我叫 player。
参数:{username: string, message: string}
参数:users: Record<string, PlayerState>
参数:users: Record<string, boolean>
参数:{ role: Role, players: Array<string> }
players 是进入游戏的所有玩家,同时也是发言顺序。
如果你不在 players 里说明你没准备,roles 应该是 undefined。
参数:{ username: string, state: GameState, config: ConfigType, players?: Array<string>, roles?: Record<string, string>, day?: number}
export interface ConfigType {
roles: Record<Role, number>
target: Target,
pass: Array<string>
}
接下来是游戏相关
游戏开始时,服务器会发送 gameState,state 是 werewolf,代表狼人开始刀人。
参数:{ state: GameState, dead: Array<number>, seerResult: boolean, waiting: number, voteResult: Record<number, number>, witchInventory: WitchInventory, werewolfKilled: Array<number>, discussPlayers: Array<string> }
dead 代表在上一轮死亡的人,不会重复发送。
如果上一个 state 是 hunter,那么这个 state 应该有猎人带走人。
如果 state 是 discuss 那么 waiting 有意义。
如果 waiting 是你的 id 那么到你发言了。
如果上一个 state 是 seer 并且你是预言家,那么 seerResult 代表是不是狼人(true 是狼人),不然 seerResult 无意义。
如果上一个 state 是 vote 这次还是 vote,说明平票了,重新投票,同时 voteResult 有东西。
如果现在是 morning,那么我会发 werewolfKilled,如果女巫有救人那里面就没东西。
在如下情况中会有意义:
state === 'morning'代表昨晚死的人。state === 'witch'并且你的角色是女巫,代表昨晚被刀的人。state === 'voteend'代表被票的人,同时第i号人票了voteResult[i]号人(是-1代表弃票了)。
猎人刀人单独发送 hunterKilled。
参数:{ player: number, target: number }
参数:player: number
参数:{ player: string, message: string }
遗言什么的都算 discuss,前端遗言也发 sendDiscuss。
参数:{ team: number, roles: Record<string, string> }(游戏意外退出为 0,好人为 1,狼人为 2,方便后续扩展)。
参数:{ select: Record<number, number>, confirm: Record<number, boolean> }
参数:roles: Record<string, string>
参数:username: string
参数:message: string
参数:id: number
代表选了这个人。
确定要刀这个人。
不确定了。
当所有存活狼人都确定刀人,后端就会执行刀人。
参数:id: number
预言家验人,验完预言家收到的 witch state 包里会有 seerResult: true / false,true 是狼人,false 是好人。
女巫救人。
参数:id: number
女巫毒人。
女巫结束回合。
参数 id: number
投票,不能取消。
前端可以选择很多次,但是点了确定就会发送 voteConfirm,前端投票界面应该变灰点不了,锁定状态。上面的三个包也是同样道理。
如果 id 不合法视为弃票,前端记得做弃票,发个不合法 id 就行,比如 -1。
参数 message: string
发送讨论 / 遗言。如果内容是 pass 或者 过 就轮到下一个人了。
参数 id: number
如果 id 不在 [0, playersCount) 视为放弃发动猎人技能。
export type PlayerState =
| 'unready'
| 'ready'
| 'alive'
| 'spec'
export type Role =
| 'villager'
| 'werewolf'
| 'seer'
| 'witch'
| 'hunter'
export type GameState =
| 'idle'
| 'morning'
| 'discuss'
| 'vote'
| 'voteend'
| 'werewolf'
| 'witch'
| 'seer'
idle -> werewolf (所有玩家都准备时)
werewolf -> seer(预言家死亡也会播报此事件并且等待随机时长)
seer -> witch(女巫死亡也会播报此事件并且等待随机时长)
witch -> morning(morning 用于发送第一晚的遗言以及发动猎人技能)
morning -> discuss(第一晚且遗言结束 / 猎人技能未发动 / 不是猎人,猎人击杀的会加入 dead)
discuss -> vote(所有玩家发言完毕)
vote -> voteend(所有玩家投票完毕,同时播报死亡玩家,并且等他说遗言或发动猎人技能)
注意说遗言的时候,名字确实在 dead 里但是不等于死了要在事件处理完才算死!!!
voteend -> werewolf(遗言结束,猎人击杀的会加入 dead)
这是一次循环