SDL中文论坛

标题: 恢复数据包 [打印本页]

作者: ancientcc    时间: 2020-9-5 18:39
标题: 恢复数据包
操作分“实际执行的操作”和“恢复出的操作”。恢复,指的是“实际执行的操作”它执行完后生成一个数据包,而后游戏则可以根据“它的状态”和这个数据包恢复出一个和实际执行操作一模一样的操作。

恢复数据包有两个作用
1:多人对战时在网络间流动,使各玩家实现同步。
2:作为录像存档主要数据,用于回放游戏录像。

恢复数据包主要数据类型
注:
1:恢复数据包中所有坐标都基于mod坐标系。

移动
  1. [command]
  2.         [move]
  3.                 x="11,12,13"
  4.                 y="13,13,14"
  5.         [/move]
  6. [/command]
复制代码
它表示是一个移动操作。移动路径是(11,13)--->(12,13)--->(13,14)。
如果最后一个坐标是城市,像以上的(13,14),则这次移动将倒致部队入城。

出征
  1. [command]
  2.         [recall]
  3.                 value="5"
  4.                 x="19,20,21,22,23,24,25,26"
  5.                 y="2,2,3,3,3,3,3,3"
  6.         [/recall]
  7. [command]
复制代码
它表示一个出征操作。出征地是(19,2)(x,y中的第一个坐标),出征部队在城内部队索引是5(经过排序)。对于出征,它一定伴随移动,x、y中的其它坐标就示出该次的移动路径。

征兵
  1. [command]
  2.         [recruit]
  3.                 heros="2"
  4.                 value="4"
  5.                 x="19"
  6.                 y="2"
  7.         [/recruit]
  8.         [random]
  9.                 value="27689"
  10.         [/random]
  11.         [random]
  12.                 value="17076"
  13.         [/random]
  14. [/command]
复制代码
它表示一个征兵操作。征兵地是(19,2),征出的兵种在该阵营可征兵兵种中的索引是4。部队只有一个武将,武将编号是2。生成部队特质时使用随机数是27689和17076。


校验和
  1. [command]
  2.         [checksum]
  3.                 value="IfZ5MiVsmkKku8hq3uykIhRdzYopaa9hhq1zb4>j-fm.de94io29gi9074N4,4lL>hf0Pc9IAWW+PLh+KEDj-90caRkSEWAW6A9b0Xb26>1K0m4f6+HI+kIMTnTg-AFX"
  4.                 x="19"
  5.                 y="2"
  6.         [/checksum]
复制代码
[/command]
它表示一次核对校验和,它不表示一个游戏操作,很大目的是为调试,一般情况下不发送。为找出程序问题,尤其是数据是否一致性问题,像招一个部队后要验证本地玩家A生成的部队和网络玩家B恢复出部队是否是同一数据,这时A就从新部队中的关键参数计算出一个校验和,发给玩家B。B玩家由恢复出部队按同样计算公式计算出一个校验和,然后检查计算出的值和收到A发来的是否一致就可判断出数据是否有问题。
value:计算出的校验和。
x,y:在基于它之上计算出的校验和,该坐标上应该有部队。

建造
  1. [command]
  2.         [build]
  3.                 artifical="25,4"
  4.                 builder="26,3"
  5.                 city="47,2"
  6.                 type="market"
  7.         [/build]
  8.         [random]
  9.                 value="23532"
  10.         [/random]
  11.         [random]
  12.                 value="9745"
  13.         [/random]
  14. [/command]
复制代码
它表示一次建操作。要建造的建筑物位在city指定城市经济区内,放在artifical指定格子,建造者站在builder指示格子,type指示建筑物类型。两个random是产生两个特质时使用的随机数。
注:建造出的建筑物,在势力归属上属于建造者所在城市,但经济区所在城市决定它的数值。

系统通知/聊天

  1. 系统通知
  2. [command]
  3.         [speak]
  4.                 id="server"
  5.                 message="ancientcc has left the game."
  6.         [/speak]
  7. [/command]
  8. 服务器向客户端群发通知,通知玩家ancientcc退出了游戏。
复制代码

  1. 群发聊天包
  2. [command]
  3.         [speak]
  4.                 id="ancientcc"
  5.                 side=1
  6.                 message="daf" // 聊天内容
  7.         [/speak]
  8. [/command]
  9. ancientcc玩家向所有玩家群发消息,消息内空是daf。
复制代码
  1. 和队友聊天的聊天包(发向“wei”同盟),team_name="observer"指的是所有观察身份玩家
  2. [command]
  3.         [speak]
  4.                 id="ancientcc"
  5.                 side=1
  6.                 team_name=wei
  7.                 message="daf" // 聊天内容
  8.         [/speak]
  9. [/command]
  10. ancientcc玩家向所和它同队的玩家(都属于wei同盟)群发消息,消息内空是daf。
复制代码


显示升级
  1. [command]
  2.         [advance_unit]
  3.                 x="47"
  4.                 y="5"
  5.         [/advance_unit]
  6. [/command]
复制代码
它表示一个升级操作,要升级单位在(47,5)处。注:这包后面必须跟有一个[choose]包,以用于选择升级到哪个兵种(即使只有一个兵种这个[choose]不能少)。

升级时升级到哪个兵种
  1. [command]
  2.         [choose]
  3.                 value="0"
  4.         [/choose]
  5. [/command]
复制代码
它表示升级时升级到哪个兵种。

选择

  1. [command]
  2.         [input]
  3.                 value=1
  4.                 text=abcdef
  5.         [/input]
  6. [/command]
复制代码
它表示是一个选择操作。在出来的菜单中选择#1(第二行)。
value:指的是选项菜单选择的那项索引。
text:指的是玩家输入文本(当前不支持)。
对话框显示逻辑

重编

  1. [command]
  2.         type=30
  3.         [armory]
  4.                 city="15,33"
  5.                 diff="0,3,31,32,81,2,2,10,4"
  6.         [/armory]
  7. [/command]
复制代码
它表示一次重编操作。要重编是发生在city指定城市内,diff字段指示此次重编后造成的部队变动情况。diff数值格式。
  1. [部队索引,部队数中武将数,各武将编号]+
复制代码
对diff="0,3,31,32,81,2,2,10,4"来说,经过重编后,部队#0内有三个武将,分别是31、32、81;部队#2内有两个武将,分别是10、4。注:部队#1在重编过程中没变换。
(, 下载次数: 2854)

作者: ancientcc    时间: 2020-9-5 18:40
轮到一玩家时,只能是该玩家发恢复命令。一旦其它玩家有发命令,会产生类似以下错误。
(, 下载次数: 3073)
比较需要注意,像在一开始时,在[init_side]前,尽量不让要有命令,这些命令极有可能导致各玩家都要发。




欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3