Closed adrianheine closed 7 years ago
It`s hard to reproduce such errors without replays.
Blocked by https://github.com/ozkriff/zoc/issues/25
@adrianheine @bjorn3 @atallahade I hope it's fixed now.
I've managed to find the problem just with logs:
https://gist.github.com/ozkriff/4c08134264f95d42933b5973410d507e
The problem was the forgotten return
statement in State::add_unit
method. I have no idea how that whole check has slipped in :( .
Пол субботы отлаживался, в итоге нашел что я return
в очень неудачном месте забыл.
Это вообще кусок какой-то старой логики из пользовательского интерфейса, но оно как-то постепенно перекочевало в самое ядро игры. Косяк был в том, что очки подкреплений проверялись и уменьшались на стоимость юнита не только при событии CreateUnit
, но и при ShowUnit
. Если юнит появлялся-исчезал несколько раз, то он высасывал все очки подкрепления у своего хозяина. Но только в состоянии врага хозяина. В итоге какой-то из ShowUnit
из-за этого тупого return просто молча не срабатывал и состояния совсем рассинхронизировались - в Истинном Состоянии и в состоянии его хозяина юнит был, а вот у других игроков этого юнита уже могло и не быть. Ну и игра потом падала в состоянии какого-то из врагов, которому приходило событие о том, что несуществующий юнит что-то сделал.
Принтов просто немеряно добавил, пока не сообразил в чем дело:
https://gist.github.com/ozkriff/4c08134264f95d42933b5973410d507e
Хорошо что я додумался сделать "до-после" распечатки идентификаторов всех отрядов в каждом из состояний:
State 'player.before' [14 15 19 17 1 18 5 13 12 6 8 7D 9 3 10 16 ]
State 'player.after' [14 15 19 17 20 1 18 5 13 12 6 8 7D 9 3 10 16 ]
С ними при поиске в логе по идентификатору юнита, на котором все упало, сразу стало видно, что один из ShowUnit событий не приводит к появлению новых юнитов в состоянии.
В общем, сферическая в вакууме удачно завалившая логическая ошибка
Closing it for now
With c815eb029d6cbed8847470b2d54fa205b2286084 (I think while AI enemy moved):