通讯协议
Pick
logic -> client:"Pick"
发送该名玩家剩余可选鱼编号,以及这轮该名玩家是否是先手(若为1则是先手)。
client -> logic:"Pick"
发送选择的四条鱼的编号。如果选择的鱼包括拟态鱼,选择中将拟态鱼的编号视为12,并额外发送拟态鱼模仿鱼的编号。
Assert
logic -> client: "Assert"
{
"Action": "Assert",
"EnemyAssert": AssertInfo,
"EnemyAction": ActionInfo,
"MyAction": ActionInfo,
"GameInfo": GameInfo
}
发送当前游戏局面信息,对方上回合的断言信息和行动信息,我方上回合的行动信息。
client -> logic:
选择断言,发送断言的位置和断言的内容。
选择不断言,发送不断言的指示。
Action
logic -> client: "Action"
发送当前游戏局面,以及该玩家本回合的断言信息。
client -> logic:
选择发动主动技能,发送我方行动鱼的位置,选择的我方及敌方鱼目标的列表。
选择发动普通攻击,发送我方行动鱼的位置,选择的敌方鱼的位置。
Finish
logic -> client: "Finish"
{
"Action": "Finish",
"Result": "Win"/"Lose",
"isStateLimitExceed": true/false,
"MyAssert": AssertInfo
}
我方断言阶段结束游戏,发送我方本轮输赢结果(Win表示赢),本轮是否是由于到达回合数上限结束(true表示是),我方本回合的断言信息。
{
"Action": "Finish",
"Result": "Win"/"Lose",
"isStateLimitExceed": true/false,
"MyAction": ActionInfo
}
我方行动阶段结束游戏,发送我方本轮输赢结果(Win表示赢),本轮是否是由于到达回合数上限结束(true表示是),我方本回合的行动信息。
{
"Action": "Finish",
"Result": "Win"/"Lose",
"isStateLimitExceed": true/false,
"EnemyAssert": AssertInfo,
"MyAction": ActionInfo
}
敌方断言阶段结束游戏,发送我方本轮输赢结果(Win表示赢),本轮是否是由于到达回合数上限结束(true表示是),敌方本回合的断言信息,和我方上回合的行动信息。
{
"Action": "Finish",
"Result": "Win"/"Lose",
"isStateLimitExceed": true/false,
"EnemyAssert": AssertInfo,
"EnemyAction": ActionInfo,
"MyAction": ActionInfo
}
敌方行动阶段结束游戏,发送我方本轮输赢结果(Win表示赢),本轮是否是由于到达回合数上限结束(true表示是),敌方本回合的断言及行动信息,我方上回合的行动信息。
(建议)client -> logic:
Info
GameInfo的格式:
{
"EnemyFish": [-1, 1, 12, -1],
"EnemyHP": [0, 100, 150, 50],
"MyFish": [1, -2, 10, 12],
"MyHP": [150, 150, 100, 100],
"MyATK": [100, 170, 100, 240]
}
包括敌方鱼的编号、敌方鱼的血量、我方鱼的编号、我方鱼的血量和我方鱼的攻击力,以上信息均根据位置号排列(MyHp的第0项就是我方0号鱼的血量)。
敌方未暴露鱼的编号会是-1,只有被断言出来的鱼才会给出真实编号。
我方未暴露鱼的编号会是真实编号,被断言出来则编号是真实编号的相反数。
所以涉及拟态鱼的编号都是12。
我方或敌方鱼在死亡时,血量会是0。
AssertInfo的格式:
包括断言位置号、断言内容(断言这个位置是哪个编号的鱼)以及断言结果(成功还是失败)。
如果断言阶段没有断言,AssertInfo为Json::nullValue
。
ActionInfo的格式:
{
"ActionFish": 1,
"skill": {
"targets":
[
{
"pos": pos,
"isEnemy": true/false,
"value": value
},
// ...
],
"type": type,
"isSkill": true/false
},
"hit": [
{
"target": target,
"isEnemy": true/false,
"value": value,
"traceable": traceable,
"time": time
},
// ...
],
"passive": [
{
"type": type,
"source": source,
"isEnemy": true/false,
"value": value,
"time": time
},
// ...
]
}
其中 skill
描述主动行为(包括主动技能和普通攻击),hit
是伤害信息列表(记录所有受伤结算),passive
为该次行动触发的被动技能或延时效果列表(记录所有被动技能或延时效果结算),ActionFish
表示做出行动的鱼的位置。
skill
:
key |
value |
---|---|
type |
字符串类型,表示主动行动类型 |
isSkill |
boolean 类型,为true表示这是一次主动技能,为false表示这是一次普通攻击 |
targets |
数组类型,行动作用目标的列表,其中的每个元素有 pos 属性,为 number 类型,描述目标的位置;isEnemy 属性,为boolean 类型,描述目标是否属于敌方阵营(相对于收信者而非行动者,true表示属于敌方阵营);value 属性为 number 类型,描述受到的期望伤害值 |
type |
描述 | targets[].value |
---|---|---|
"aoe" |
群体伤害 | 该目标期望受到的伤害值 |
"infight" |
伤害队友 | 队友期望受到的伤害值 |
"crit" |
暴击 | 该目标期望受到的伤害值 |
"subtle" |
无作为 | targets 为空数组 [] |
"normalattack" |
普通攻击 | 该目标期望受到的伤害值 |
hit
:数组类型,其中每个元素为一个对象类型,表示一个实际伤害事件(一次受伤结算)
key |
value |
---|---|
target |
number 类型,表示受伤目标的位置 |
isEnemy |
boolean 类型,表示受伤目标是否属于敌方阵营(相对于收信者而非行动者,true表示属于敌方阵营) |
value |
number 类型,表示受到的实际伤害值 |
traceable |
boolean 类型,当且仅当存在伤害来源,也即该伤害由直接攻击(普通攻击、aoe 或暴击型主动技能)造成时,为 true |
time |
number 类型,表示该事件的时间戳,即结算中的顺序(对于每次行动,时间戳从1开始连续计数,任意两个事件时间戳不同,保证hit 中按时间戳单调顺序排列元素 ) |
passive
:数组类型,其中每个元素为一个对象类型,表示一个被动技能或延时效果触发事件(一次被动或效果结算)
key |
value |
---|---|
type |
字符串类型,被动技能类型 |
source |
number 类型,引发该事件的目标的位置(不等于发动该事件的鱼的位置,如护友反伤型被动) |
isEnemy |
boolean 类型,表示引发该事件的目标是否属于敌方阵营(相对于收信者而非行动者,true表示属于敌方阵营) |
value |
number 类型,与被动技能或延时效果有关的值 |
time |
number 类型,表示该事件的时间戳,即结算中的顺序(对于每次行动,时间戳从1开始连续计数,任意两个事件时间戳不同,保证passive 中按时间戳单调顺序排列元素 ) |
type |
描述 | value |
---|---|---|
"counter" |
膨胀反伤 | 无意义 |
"deflect" |
承伤 | 无意义 |
"reduce" |
减伤 | 减伤比例(闪避是0,减伤buff是0.3) |
"heal" |
回血 | 实际回血量(考虑了和400取min) |
"explode" |
爆炸 | 无意义 |