Russian thread

Это проблема синхронизации.
То же самое в городе (если выбрано больше 1 постройки в день). Покупаешь здание, оно еще не отрисовалось, снова идешь в Таун Халл, и снова его покупаешь (или другое здание), в итоге тоже можно словить креш.
как мне кажется, решение тут элементарное - если была нажата управляющая кнопка (или куплено здание в городе) блокировать нажатие всех управляющих кнопок (заход в Таун Халл), пока запланированное действие не выполнится, и сервер не вернет ОК.

То есть ты хочешь сказать, что для построек выделяется отдельный поток? Оно, например, понятно в плане АИ для противника и АИ, которое используется в автоматической битве. В оригинале, ЕМНИП, пока анимация появления постройки не закончится, зайти куда-нибудь было нельзя. В любом случае, элементарное решение проблемы сейчас не исправит проблем синхронизации в будущем.

Нет. Идет доступ к существу, ожидающего команды. А так как его нет - то падает. Хмм… Пожалуй, вырублю включение автобоя во время хода противника.

Тоже ничего общего с синхронизацией. Здание начинает появляться на экране только после ответа от сервера. Медленное появление здания делается исключительно на клиенте.
Возможно идет из-за того, что появление еще одного здания требует создать заново экран города.

Если ничего не знаешь, то можешь хотя бы молчать? Надоело уже…

Но иконки то в Таун Холле не блокируются и не делаются золотыми же? И их можно нажимать. Что я еще мог подумать кроме синхронизации?
Тогда надо блокировать Таун Холл до того, как клиент все прорисует.

Ещё одно падение, ничего не предвещало беды :frowning: Это был последний противник, причем, если мне не показалось, убил я его каким-то заклинанием.

Warning: an orphaned child!
battleCanCastSpell called when no battle!

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffde886700 (LWP 4630)]
0x00007ffff79e8e95 in __find<std::_Rb_tree_const_iterator<EBattleStackState::EBattleStackState>, EBattleStackState::EBattleStackState> (
    __val=@0x7fffde885bfc: EBattleStackState::WAITING, __last=..., __first=...)
    at /usr/include/c++/4.8/bits/stl_algo.h:139
139	      while (__first != __last && !(*__first == __val))
(gdb) bt
#0  0x00007ffff79e8e95 in __find<std::_Rb_tree_const_iterator<EBattleStackState::EBattleStackState>, EBattleStackState::EBattleStackState> (
    __val=@0x7fffde885bfc: EBattleStackState::WAITING, __last=..., __first=...)
    at /usr/include/c++/4.8/bits/stl_algo.h:139
#1  find<std::_Rb_tree_const_iterator<EBattleStackState::EBattleStackState>, EBattleStackState::EBattleStackState> (
    __val=@0x7fffde885bfc: EBattleStackState::WAITING, __last=..., __first=...)
    at /usr/include/c++/4.8/bits/stl_algo.h:4441
#2  vstd::contains<std::set<EBattleStackState::EBattleStackState, std::less<EBattleStackState::EBattleStackState>, std::allocator<EBattleStackState::EBattleStackState> >, EBattleStackState::EBattleStackState> (c=..., 
    i=i@entry=@0x7fffde885bfc: EBattleStackState::WAITING)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/lib/../Global.h:284
#3  0x00007ffff7a4056d in CStack::waited (this=<optimized out>, 
    turn=turn@entry=0)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/lib/BattleState.cpp:964
#4  0x000000000050fd13 in CBattleInterface::blockUI (
    this=this@entry=0x7fffcee87de0, on=<optimized out>)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CBattleInterface.cpp:1908
#5  0x0000000000514786 in CBattleInterface::setActiveStack (
    this=this@entry=0x7fffcee87de0, stack=<optimized out>)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CBattleInterf---Type <return> to continue, or q <return> to quit---
ace.cpp:1662
#6  0x000000000051f593 in CBattleInterface::activateStack (
    this=this@entry=0x7fffcee87de0)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CBattleInterface.cpp:1692
#7  0x000000000051f763 in CBattleInterface::stackActivated (
    this=this@entry=0x7fffcee87de0, stack=stack@entry=0x7fffcd91b950)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CBattleInterface.cpp:1028
#8  0x00000000005d71b1 in CPlayerInterface::activeStack (
    this=this@entry=0x7fffcd743258, stack=0x7fffcd91b950)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/CPlayerInterface.cpp:777
#9  0x00000000005bfbd0 in CClient::waitForMoveAndSend (this=0x7fffcc000a90, 
    color=...)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/Client.cpp:120
#10 0x00000000006b14ba in operator() (a1=..., p=<optimized out>, 
    this=<optimized out>) at /usr/include/boost/bind/mem_fn_template.hpp:165
#11 operator()<boost::_mfi::mf1<void, CClient, PlayerColor>, boost::_bi::list0>
    (a=<synthetic pointer>, f=..., this=<optimized out>)
    at /usr/include/boost/bind/bind.hpp:313
#12 operator() (this=<optimized out>)
    at /usr/include/boost/bind/bind_template.hpp:20
---Type <return> to continue, or q <return> to quit---
#13 boost::detail::thread_data<boost::_bi::bind_t<void, boost::_mfi::mf1<void, CClient, PlayerColor>, boost::_bi::list2<boost::_bi::value<CClient*>, boost::_bi::value<PlayerColor> > > >::run (this=<optimized out>)
    at /usr/include/boost/thread/detail/thread.hpp:117
#14 0x00007ffff6ddd94a in ?? ()
   from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.53.0
#15 0x00007ffff6bbcf6e in start_thread (arg=0x7fffde886700)
    at pthread_create.c:311
#16 0x00007ffff40b19cd in clone ()
    at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
(gdb) 

Иногда, глядя на все эти Rb_tree_const_iterator, я думаю, что у кого-то проблемы с перестроением красно-черных деревьев. Потому что уже который раз вижу эту строчку.

То есть состояние кнопки будет меняться на разрешено\запрещено 100500 раз за битву? :slight_smile:

В любом случае, не надо ругаться.

Тоже не связано :slight_smile:
Память связанная с отрядами в бою удалена, но пара указателей на нее еще осталась. В итоге падает как только идет обращение по адресу, который уже вернули операционной системе. В деревьях много узлов раскиданных по памяти поэтому больше шанс попасть в такой адрес.

Продублируй на багтрекер - похоже и вправду на бой, кончившийся кастом. Мне тут уж больно долго ковыряться прийдется.

А как часто меняются остальные кнопки, например ожидание/защита? Или кнопка каста?

Вообще я там где-то уже создавал похожий тикет.

Про деревья: имхо, балансировка - самое страшное, что было в деревьях. По воспоминаниям с первого курса.

По поводу кнопок: обычно во время игры я об этом не задумываюсь :slight_smile: А так вообще удивительно, что во время битвы всё это не тормозит безбожно. Хотя, полагаю, смена состояний кнопок - отнюдь не самое страшное и сложное в битве. :slight_smile:

Нашел: bugs.vcmi.eu/view.php?id=1627

Попробовал пару раз повторить заканчивая бой разными заклинаниями - безуспешно.

И чтобы не ловить фейлы на этом все нормальные люди уже пользуются готовыми библиотеками, а не пишут все с нуля :slight_smile:

Угадал. В редких случаях бывают сложные расчеты, но обычно ~95% времени - это отрисовка графики. Процесс элементарный, но ее много. Очень много.

Не удалось мне нормально сегодня поиграть :frowning:
Перешел во вторую миссию, а там на тебе (смотри скриншот). И никак я лесопилку взять под свой контроль не могу, потому что туман войны не рассеялся.


А при попытке загрузить игру предыдущей миссии словил ещё одно падение. :frowning: Воспроизвести больше не получается.

Trying connection to 127.0.0.1:3030  (0)
Established connection with VCMI 0.94b (server)
	Connecting to the server: 10
Server opened savegame properly.
Sent info to server: 0
[New Thread 0x7fffc6ffd700 (LWP 8752)]
[Thread 0x7fffdddf7700 (LWP 8746) exited]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffc6ffd700 (LWP 8752)]
0x0000000000644c82 in CTerrainRect::showPath (this=this@entry=0x7fffb5e161a8, 
    extRect=extRect@entry=0x7fffb5e161f8, to=to@entry=0xd07330)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/CAdvmapInterface.cpp:140
140	/build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/CAdvmapInterface.cpp: Нет такого файла или каталога.
(gdb) bt
#0  0x0000000000644c82 in CTerrainRect::showPath (
    this=this@entry=0x7fffb5e161a8, extRect=extRect@entry=0x7fffb5e161f8, 
    to=to@entry=0xd07330)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/CAdvmapInterface.cpp:140
#1  0x00000000006453bd in CTerrainRect::show (this=this@entry=0x7fffb5e161a8, 
    to=to@entry=0xd07330)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/CAdvmapInterface.cpp:272
#2  0x00000000006455d1 in CAdvMapInt::show (this=0x7fffb5e15320, to=0xd07330)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/CAdvmapInterface.cpp:758
#3  0x000000000064b090 in CAdvMapInt::showAll (this=0x7fffb5e15320, 
    to=0xd07330)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/CAdvmapInterface.cpp:679
#4  0x000000000053c774 in CGuiHandler::totalRedraw (
    this=this@entry=0x95f9e0 <GH>)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/gui/CGuiHandler.cpp:150
#5  0x000000000053e4ab in CGuiHandler::pushInt (this=0x95f9e0 <GH>, 
    newInt=0x7fffb5e15320)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/gui/CGuiHandler.cpp:---Type <return> to continue, or q <return> to quit---
115
#6  0x00000000005d60da in CPlayerInterface::playerStartsTurn (
    this=0x7fffb9147f38, player=...)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/CPlayerInterface.cpp:2562
#7  0x00000000006ad061 in YourTurn::applyCl (this=0x7fffcc5716b0, 
    cl=0x7fffb8764340)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/NetPacksClient.cpp:789

#8  0x00000000005be7e9 in CClient::handlePack (this=this@entry=0x7fffb8764340, 
    pack=0x7fffcc5716b0)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/Client.cpp:516
#9  0x00000000005beb70 in CClient::run (this=0x7fffb8764340)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/Client.cpp:150
#10 0x00007ffff6ddd94a in ?? ()
   from /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.53.0
#11 0x00007ffff6bbcf6e in start_thread (arg=0x7fffc6ffd700)
    at pthread_create.c:311
#12 0x00007ffff40b19cd in clone ()
    at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
(gdb) 

Туман войны - десинхронизация между сервером и клиентом? У кого-то из героев были скилы/арты влияющие на радиус обзора? Или были в прошлом сценарии?

Битые имена героев - только заметил. Если в лаунчере в настройках поставить кодировку Win1251 / Cyrillic, то vcmi должен работать с русским. Проверь на всякий случай. (пройдет только с новыми сейвами)

Падение - вместо “bt” помог бы “bt full”. Читабельность будет на нуле но инфы побольше выдаст.

Про десинхронизацию вроде ничего не было в консоли, у Жемчужины в предыдущей миссии был артефакт +1 к радиусу обзора. Если словлю падение ещё раз, будет bt full.

Упало во время битви. Кусок бэктрейса:
[hide]

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffdfffe700 (LWP 17163)]
CCreatureAnimation::nextFrameT<4> (this=0x7fffb2c29670, dest=0xcfb6a0, 
    rotate=false)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CCreatureAnimation.cpp:357
357	/build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CCreatureAnimation.cpp: Нет такого файла или каталога.

(gdb) bt full
#0  CCreatureAnimation::nextFrameT<4> (this=0x7fffb2c29670, dest=0xcfb6a0, 
    rotate=false)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CCreatureAnimation.cpp:357
        j = 0
        type = <optimized out>
        length = 1
        lineData = <optimized out>
        destX = 156
        destY = 625
        totalRowLength = 28
        currentOffset = 4
        i = 187
        offset = <optimized out>
        reader = {<boost::noncopyable_::noncopyable> = {<No data fields>}, 
          stream = 0x7fffaafb08f0}
        spriteWidth = 148
        leftMargin = 110
        topMargin = 157
        baseOffset = 503275
        fullWidth = <optimized out>
        spriteHeight = <optimized out>
        rightMargin = <optimized out>
---Type <return> to continue, or q <return> to quit---
        specialPalette = {_M_elems = {{r = 0 '\000', g = 0 '\000', 
              b = 0 '\000', unused = 0 '\000'}, {r = 0 '\000', g = 0 '\000', 
              b = 0 '\000', unused = 64 '@'}, {r = 0 '\000', g = 0 '\000', 
              b = 0 '\000', unused = 128 '\200'}, {r = 0 '\000', g = 0 '\000', 
              b = 0 '\000', unused = 128 '\200'}, {r = 0 '\000', g = 0 '\000', 
              b = 0 '\000', unused = 128 '\200'}, {r = 0 '\000', g = 0 '\000', 
              b = 0 '\000', unused = 0 '\000'}, {r = 0 '\000', g = 0 '\000', 
              b = 0 '\000', unused = 127 '\177'}, {r = 0 '\000', g = 0 '\000', 
              b = 0 '\000', unused = 63 '?'}}}
#1  0x0000000000539313 in CCreatureAnimation::nextFrame (this=<optimized out>, 
    dest=dest@entry=0xcfb6a0, attacker=attacker@entry=true)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CCreatureAnimation.cpp:384
No locals.
#2  0x0000000000515319 in CBattleInterface::showStacks (
    this=this@entry=0x7fffb1395ab0, to=to@entry=0xcfb6a0, stacks=...)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CBattleInterface.cpp:3357
        stack = 0x7fffb19b3fd0
        __for_range = @0x7fffdfff8300: {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
            _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, 
---Type <return> to continue, or q <return> to quit---
              _M_start = 0x7fffdb8ed140, _M_finish = 0x7fffdb8ed148, 
              _M_end_of_storage = 0x7fffdb8ed148}}, <No data fields>}
#3  0x00000000005163bc in CBattleInterface::showAliveStacks (
    this=0x7fffb1395ab0, to=0xcfb6a0, stacks=...)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CBattleInterface.cpp:3321
        getAmountBoxBackground = {__this = 0x7fffb1395ab0}
#4  0x000000000051e02a in CBattleInterface::__lambda24::operator() (
    __closure=__closure@entry=0x7fffdfff83e0, hex=...)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CBattleInterface.cpp:3250
        to = @0x7fffdfff83d8: 0xcfb6a0
        this = 0x7fffb1395ab0
#5  0x000000000051e305 in CBattleInterface::showBattlefieldObjects (
    this=this@entry=0x7fffb1395ab0, to=to@entry=0xcfb6a0)
    at /build/buildd/vcmi-0.94+svn3407~ubuntu13.10.1/client/battle/CBattleInterface.cpp:3274
        data = @0x7fffdfffd568: {
          walls = {<std::_Vector_base<int, std::allocator<int> >> = {
              _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                _M_end_of_storage = 0x0}}, <No data fields>}, 
          dead = {<std::_Vector_base<CStack const*, std::allocator<CStack const*---Type <return> to continue, or q <return> to quit---
> >> = {
              _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                _M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>}, 
          alive = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
              _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, 
                _M_start = 0x7fffab2f00c0, _M_finish = 0x7fffab2f00c8, 
                _M_end_of_storage = 0x7fffab2f00c8}}, <No data fields>}, 
          effects = {<std::_Vector_base<BattleEffect const*, std::allocator<BattleEffect const*> >> = {
              _M_impl = {<std::allocator<BattleEffect const*>> = {<__gnu_cxx::new_allocator<BattleEffect const*>> = {<No data fields>}, <No data fields>}, 
                _M_start = 0x0, _M_finish = 0x0, 
                _M_end_of_storage = 0x0}}, <No data fields>}, 
          obstacles = {<std::_Vector_base<std::shared_ptr<CObstacleInstance const>, std::allocator<std::shared_ptr<CObstacleInstance const> > >> = {
              _M_impl = {<std::allocator<std::shared_ptr<CObstacleInstance const> >> = {<__gnu_cxx::new_allocator<std::shared_ptr<CObstacleInstance const> >> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                _M_end_of_storage = 0x0}}, <No data fields>}}
        __for_begin = 0x7fffdfffd568
---Type <return> to continue, or q <return> to quit---
        showHexEntry = {__to = @0x7fffdfff83d8, __this = 0x7fffb1395ab0}
        objects = {beforeAll = {
            walls = {<std::_Vector_base<int, std::allocator<int> >> = {
                _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                  _M_end_of_storage = 0x0}}, <No data fields>}, 
            dead = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                  _M_finish = 0x0, 
                  _M_end_of_storage = 0x0}}, <No data fields>}, 
            alive = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                  _M_finish = 0x0, 
                  _M_end_of_storage = 0x0}}, <No data fields>}, 
            effects = {<std::_Vector_base<BattleEffect const*, std::allocator<BattleEffect const*> >> = {
                _M_impl = {<std::allocator<BattleEffect const*>> = {<__gnu_cxx::new_allocator<BattleEffect const*>> = {<No data fields>}, <No data fields>}, 
                  _M_start = 0x0, _M_finish = 0x0, 
---Type <return> to continue, or q <return> to quit---
                  _M_end_of_storage = 0x0}}, <No data fields>}, 
            obstacles = {<std::_Vector_base<std::shared_ptr<CObstacleInstance const>, std::allocator<std::shared_ptr<CObstacleInstance const> > >> = {
                _M_impl = {<std::allocator<std::shared_ptr<CObstacleInstance const> >> = {<__gnu_cxx::new_allocator<std::shared_ptr<CObstacleInstance const> >> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                  _M_end_of_storage = 0x0}}, <No data fields>}}, afterAll = {
            walls = {<std::_Vector_base<int, std::allocator<int> >> = {
                _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                  _M_end_of_storage = 0x0}}, <No data fields>}, 
            dead = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                  _M_finish = 0x0, 
                  _M_end_of_storage = 0x0}}, <No data fields>}, 
            alive = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                  _M_finish = 0x0, 
                  _M_end_of_storage = 0x0}}, <No data fields>}, 
---Type <return> to continue, or q <return> to quit---
            effects = {<std::_Vector_base<BattleEffect const*, std::allocator<BattleEffect const*> >> = {
                _M_impl = {<std::allocator<BattleEffect const*>> = {<__gnu_cxx::new_allocator<BattleEffect const*>> = {<No data fields>}, <No data fields>}, 
                  _M_start = 0x0, _M_finish = 0x0, 
                  _M_end_of_storage = 0x0}}, <No data fields>}, 
            obstacles = {<std::_Vector_base<std::shared_ptr<CObstacleInstance const>, std::allocator<std::shared_ptr<CObstacleInstance const> > >> = {
                _M_impl = {<std::allocator<std::shared_ptr<CObstacleInstance const> >> = {<__gnu_cxx::new_allocator<std::shared_ptr<CObstacleInstance const> >> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                  _M_end_of_storage = 0x0}}, <No data fields>}}, hex = {
            _M_elems = {{
                walls = {<std::_Vector_base<int, std::allocator<int> >> = {
                    _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                dead = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
---Type <return> to continue, or q <return> to quit---
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                alive = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                effects = {<std::_Vector_base<BattleEffect const*, std::allocator<BattleEffect const*> >> = {
                    _M_impl = {<std::allocator<BattleEffect const*>> = {<__gnu_cxx::new_allocator<BattleEffect const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                obstacles = {<std::_Vector_base<std::shared_ptr<CObstacleInstance const>, std::allocator<std::shared_ptr<CObstacleInstance const> > >> = {
                    _M_impl = {<std::allocator<std::shared_ptr<CObstacleInstance const> >> = {<__gnu_cxx::new_allocator<std::shared_ptr<CObstacleInstance const> >> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}}, {
                walls = {<std::_Vector_base<int, std::allocator<int> >> = {
                    _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
---Type <return> to continue, or q <return> to quit---
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                dead = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                alive = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, 
                      _M_start = 0x7fffdb3c00f0, _M_finish = 0x7fffdb3c00f8, 
                      _M_end_of_storage = 0x7fffdb3c00f8}}, <No data fields>}, 
                effects = {<std::_Vector_base<BattleEffect const*, std::allocator<BattleEffect const*> >> = {
                    _M_impl = {<std::allocator<BattleEffect const*>> = {<__gnu_cxx::new_allocator<BattleEffect const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                obstacles = {<std::_Vector_base<std::shared_ptr<CObstacleInstance const>, std::allocator<std::shared_ptr<CObstacleInstance const> > >> = {
                    _M_impl = {<std::allocator<std::shared_ptr<CObstacleInstance const> >> = {<__gnu_cxx::new_allocator<std::shared_ptr<CObstacleInstance const>---Type <return> to continue, or q <return> to quit---
 >> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}}, {
                walls = {<std::_Vector_base<int, std::allocator<int> >> = {
                    _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                dead = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                alive = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                effects = {<std::_Vector_base<BattleEffect const*, std::allocator<BattleEffect const*> >> = {
                    _M_impl = {<std::allocator<BattleEffect const*>> = {<__gnu_cxx::new_allocator<BattleEffect const*>> = {<No data fields>}, <No data fields>},---Type <return> to continue, or q <return> to quit---
 _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                obstacles = {<std::_Vector_base<std::shared_ptr<CObstacleInstance const>, std::allocator<std::shared_ptr<CObstacleInstance const> > >> = {
                    _M_impl = {<std::allocator<std::shared_ptr<CObstacleInstance const> >> = {<__gnu_cxx::new_allocator<std::shared_ptr<CObstacleInstance const> >> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}}, {
                walls = {<std::_Vector_base<int, std::allocator<int> >> = {
                    _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                dead = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                alive = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
---Type <return> to continue, or q <return> to quit---
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                effects = {<std::_Vector_base<BattleEffect const*, std::allocator<BattleEffect const*> >> = {
                    _M_impl = {<std::allocator<BattleEffect const*>> = {<__gnu_cxx::new_allocator<BattleEffect const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                obstacles = {<std::_Vector_base<std::shared_ptr<CObstacleInstance const>, std::allocator<std::shared_ptr<CObstacleInstance const> > >> = {
                    _M_impl = {<std::allocator<std::shared_ptr<CObstacleInstance const> >> = {<__gnu_cxx::new_allocator<std::shared_ptr<CObstacleInstance const> >> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}}, {
                walls = {<std::_Vector_base<int, std::allocator<int> >> = {
                    _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                dead = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
---Type <return> to continue, or q <return> to quit---
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                alive = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, 
                      _M_start = 0x7fffa9b6e520, _M_finish = 0x7fffa9b6e528, 
                      _M_end_of_storage = 0x7fffa9b6e528}}, <No data fields>}, 
                effects = {<std::_Vector_base<BattleEffect const*, std::allocator<BattleEffect const*> >> = {
                    _M_impl = {<std::allocator<BattleEffect const*>> = {<__gnu_cxx::new_allocator<BattleEffect const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                obstacles = {<std::_Vector_base<std::shared_ptr<CObstacleInstance const>, std::allocator<std::shared_ptr<CObstacleInstance const> > >> = {
                    _M_impl = {<std::allocator<std::shared_ptr<CObstacleInstance const> >> = {<__gnu_cxx::new_allocator<std::shared_ptr<CObstacleInstance const> >> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}}, {
                walls = {<std::_Vector_base<int, std::allocator<int> >> = {
                    _M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
---Type <return> to continue, or q <return> to quit---
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                dead = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, 
                      _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                alive = {<std::_Vector_base<CStack const*, std::allocator<CStack const*> >> = {
                    _M_impl = {<std::allocator<CStack const*>> = {<__gnu_cxx::new_allocator<CStack const*>> = {<No data fields>}, <No data fields>}, 
                      _M_start = 0x7fffab1cc940, _M_finish = 0x7fffab1cc948, 
                      _M_end_of_storage = 0x7fffab1cc948}}, <No data fields>}, 
                effects = {<std::_Vector_base<BattleEffect const*, std::allocator<BattleEffect const*> >> = {
                    _M_impl = {<std::allocator<BattleEffect const*>> = {<__gnu_cxx::new_allocator<BattleEffect const*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, 
                      _M_end_of_storage = 0x0}}, <No data fields>}, 
                obstacles = {<std::_Vector_base<std::shared_ptr<CObstacleInstance const>, std::allocator<std::shared_ptr<CObstacleInstance const> > >> = {
                    _M_impl = {<std::allocator<std::shared_ptr<CObstacleInstance

[/hide]

Лучше лог целиком давать (и заливать например на pastebin.com) и хоть немного описать что делалось до падения.
То, что падает при отрисовке существа я вижу, а что привело к этому или какое существо это было - не видно.

Угу, что-то я и не подумал про пэйстбин.
А что привело - ну лично я без понятия. Это была обычная битва, всадник атаковал кого-то (косяк, я не запомнил, кого), никаких заклинаний в этот момент не кастовалось, битва как всегда автоматическая.

Ещё одну проблему словил :frowning:
Убил красного игрока, вроде все хорошо, осталось пройти через ворота и что-то там доделать. Но вот беда, в гарнизоне сидят существа красного игрока, сам гарнизон нейтрального цвета, но атаковать его я не могу. Скриншоты прилагаю.




Это не из-за цвета - гарнизон не был отмечен как объект в который “сверху” зайти можно. Исправил.

Что значит “сверху”? По которому щелкнуть можно? Obj::GARRISON2 - вот это?
Понятно, что не из-за цвета, я сначала подумал, что если противник побежден, то все его владения становятся нейтральными, и… а хрен знает, что тогда.

Ага, оно.

Большинство объектов посетить сверху (с севера) нельзя - в здания можно заходить или снизу или сбоку. Кроме тех, что в списке исключений. И этого гарнизона там не было.

А на этой карте - клетка прямо справа от гарнизона заблокирована горой. Зайти в него можно только сверху (с северо-востока).

bAutofight->block(curInt->isAutoFightOn || activeStack);
Кажется, это плохая проверка. :slight_smile: Теперь кнопка активна, когда ходит противник, чуть только он походил, я на кнопку нажать не могу.
По поводу гарнизона - видимо, это подействовало бы только при свежей игре? В смысле, я загрузил сохранение, все так же нельзя было атаковать гарнизон.

И вот ещё, заканчиваю эту миссию, перехожу в меню следующей и игра падает, каждый раз по-новому. Посмотришь, у тебя не падает?
Games.tar (3.45 MB)