[network] 恢复数据包

操作分“实际执行的操作”和“恢复出的操作”。恢复,指的是“实际执行的操作”它执行完后生成一个数据包,而后游戏则可以根据“它的状态”和这个数据包恢复出一个和实际执行操作一模一样的操作。

恢复数据包有两个作用

1:多人对战时在网络间流动,使各玩家实现同步。

2:作为录像存档主要数据,用于回放游戏录像。

 

一、恢复数据包主要数据类型

注:

1:恢复数据包中所有坐标都基于mod坐标系。

移动

[command]
	[move]
		x="11,12,13"
		y="13,13,14"
	[/move]
[/command]

它表示是一个移动操作。移动路径是(11,13)--->(12,13)--->(13,14)。

如果最后一个坐标是城市,像以上的(13,14),则这次移动将倒致部队入城。

 

出征

[command]
	[recall]
		value="5"
		x="19,20,21,22,23,24,25,26"
		y="2,2,3,3,3,3,3,3"
	[/recall]
[command]

它表示一个出征操作。出征地是(19,2)(x,y中的第一个坐标),出征部队在城内部队索引是5([color=Red]经过排序[/color])。对于出征,它一定伴随移动,x、y中的其它坐标就示出该次的移动路径。

 

征兵

[command]
	[recruit]
		heros="2"
		value="4"
		x="19"
		y="2"
	[/recruit]
	[random]
		value="27689"
	[/random]
	[random]
		value="17076"
	[/random]
[/command]

它表示一个征兵操作。征兵地是(19,2),征出的兵种在该阵营可征兵兵种中的索引是4。部队只有一个武将,武将编号是2。生成部队特质时使用随机数是27689和17076。

 

校验和

[command]
	[checksum]
		value="IfZ5MiVsmkKku8hq3uykIhRdzYopaa9hhq1zb4>j-fm.de94io29gi9074N4,4lL>hf0Pc9IAWW+PLh+KEDj-90caRkSEWAW6A9b0Xb26>1K0m4f6+HI+kIMTnTg-AFX"
		x="19"
		y="2"
	[/checksum]
[/command]

它表示一次核对校验和,它不表示一个游戏操作,很大目的是为调试,一般情况下不发送。为找出程序问题,尤其是数据是否一致性问题,像招一个部队后要验证本地玩家A生成的部队和网络玩家B恢复出部队是否是同一数据,这时A就从新部队中的关键参数计算出一个校验和,发给玩家B。B玩家由恢复出部队按同样计算公式计算出一个校验和,然后检查计算出的值和收到A发来的是否一致就可判断出数据是否有问题。

value:计算出的校验和。

x,y:在基于它之上计算出的校验和,该坐标上应该有部队。

 

建造

[command]
	[build]
		artifical="25,4"
		builder="26,3"
		city="47,2"
		type="market"
	[/build]
	[random]
		value="23532"
	[/random]
	[random]
		value="9745"
	[/random]
[/command]

它表示一次建操作。要建造的建筑物位在city指定城市经济区内,放在artifical指定格子,建造者站在builder指示格子,type指示建筑物类型。两个random是产生两个特质时使用的随机数。

注:[color=Red]建造出的建筑物,在势力归属上属于建造者所在城市,但经济区所在城市决定它的数值。[/color]

 

系统通知/聊天

系统通知

[command]
	[speak]
		id="server"
		message="ancientcc has left the game."
	[/speak]
[/command]

服务器向客户端群发通知,通知玩家ancientcc退出了游戏。

群发聊天包

[command]
	[speak]
		id="ancientcc"
		side=1
		message="daf" // 聊天内容
	[/speak]
[/command]

ancientcc玩家向所有玩家群发消息,消息内空是daf。

和队友聊天的聊天包(发向“wei”同盟),team_name="observer"指的是所有观察身份玩家

[command]
	[speak]
		id="ancientcc"
		side=1
		team_name=wei
		message="daf" // 聊天内容
	[/speak]
[/command]

ancientcc玩家向所和它同队的玩家(都属于wei同盟)群发消息,消息内空是daf。

 

显示升级

[command]
	[advance_unit]
		x="47"
		y="5"
	[/advance_unit]
[/command]

它表示一个升级操作,要升级单位在(47,5)处。注:这包后面必须跟有一个[choose]包,以用于选择升级到哪个兵种(即使只有一个兵种这个[choose]不能少)。

 

升级时升级到哪个兵种

[command]
	[choose]
		value="0"
	[/choose]
[/command]

它表示升级时升级到哪个兵种。

 

选择

[command]
	[input]
		value=1
		text=abcdef
	[/input]
[/command]

它表示是一个选择操作。在出来的菜单中选择#1(第二行)。

value:指的是选项菜单选择的那项索引。

text:指的是玩家输入文本(当前不支持)。

对话框显示逻辑

  1. game_events模式触发[message]。
  2. 发现[message]内有选项菜单,调用mp_sync::get_user_choice。
  3. 在实时状态下,mp_sync::get_user_choice显示玩家选择菜单,形成[input]块,并形成[command]写入记录器。在回放状态下,mp_sync::get_user_choice从记录器中读出[input]块。也就是说,不论是实时还是回放,mp_sync::get_user_choice都会形成一个[input]块。

 

重编

[command]
	type=30
	[armory]
		city="15,33"
		diff="0,3,31,32,81,2,2,10,4"
	[/armory]
[/command]

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

 

二、轮到一玩家时,只能是该玩家发恢复命令。一旦其它玩家有发命令,会产生类似以下错误。

比较需要注意,像在一开始时,在[init_side]前,尽量不让要有命令,这些

 

全部评论: 0

    写评论: