|
一、能改变城市内三个列表顺序的操作
三个列表指“未”武将、“完”武将,城内部队。像出征时,取消出征操作要使出征部队回到原来位置;像AI操作时,不要动不动就排序城内部队,AI排序过了的“录像回放”也一定要让排序。
一旦城市被攻陷,部队/武将去哪个城是严格按照列表中顺序来的。
二、怎么会出现以下的一连同一个地点出发的move命令- [command]
- [move]
- x="19,18,17,16,15"
- y="5,4,4,3,3"
- [/move]
- [/command]
- [command]
- [move]
- x="19,18,17,16,15"
- y="5,4,4,3,3"
- [/move]
- [/command]
复制代码 可能原因:一些操作执行后,该有清空undo_stack!举个例子,把N个武将从A城移动B城,但不清空undo_stack;
1:把部队从(19,5)移动到(15,3);(命令池中多一条move命令)
2:N个武将被从A城移动B城;(命令池中多一条move_heros命令)
3:玩家按下“撤消”,由于undo_stack不空,部队根据undo_stack从(15,3)移回到了(19,5),同时命令池中最上那条move_heros命令被删除。
4:玩家又把部队从(19,5)移动到(15,3);(命令池中多一条move命令)
————于是致出现以上写的两条连续move命令。
解决,该把undo_stack清空的就该清掉,该清掉操作有:移动武将、征兵、解散部队、建造。
unit_map::scout_unit_部队计算路程时,要使用pathfind::emergency_path_calculator,而不是pathfind::shortest_path_calculator。
即使已使能“忽略zoc”,shortest_path_calculator依旧和地图当前部队分布相关,也就是说,同样是两个城市,不同时刻用它计算路程时可能会出不一样结果。这就可能造成两个问题。
- 回放不同步。回放时总是使用“最早”计算出路程,而且一直用到结束;实时时,要是出现中途加载存档,这时再计算路程,由于部队分布和一开始不一样,这就造成这个路程可能和开始时不一样。
- 中途加载,可能会出现不能正确反映路程情况。shortest_path_calculator会考虑到部队分布,而这种路径是不应该考虑部队。
emergency_path_calculator在计算路程时只和地形有关,和部队分布无关。但这里要注意一个问题,一旦将来支持动态改地图,这时需要把缓存的路程清空,以让重新计算。
mr_data.own_cities类型是std::map<int, enemy_data>,不能是std::map<artifical*, enemty_data>。
std::map是排序容器,使用std::map<artifical*, enemty_data>时,它会按“artifical*”指针值进行排序,这就造成不同运行实例时各城市顺序可能不一样,从而导致回放不同步。使用std::map<int, enemy_data>,其中“int”是cityno,这会保证每次运行城市顺序都是一致。
移动力须保持同步
一只部队处于被挑衅,假设在位置上它既不能移动又不能攻击,在进入end_turn前,实时情况下它的移动力要被置0,由于被置0,它下回合不会进入resting状态。可在录像情况下,由于该部队什么命令也没有,它的移动力没变化,依旧保持满,致使会让进入resting状态。——由于一个没resting、一个有resting,导致出来hp不同步。
解决办法
实时时应该把修改了移动以命令形式发向回放器。
当前解决办法是增加个能一不能进入resting状态判断(no_enter_resting)。接下要做部队任务,可能会和这个有关,到时再决定怎么改。
|
|