Это проблема синхронизации.
То же самое в городе (если выбрано больше 1 постройки в день). Покупаешь здание, оно еще не отрисовалось, снова идешь в Таун Халл, и снова его покупаешь (или другое здание), в итоге тоже можно словить креш.
как мне кажется, решение тут элементарное - если была нажата управляющая кнопка (или куплено здание в городе) блокировать нажатие всех управляющих кнопок (заход в Таун Халл), пока запланированное действие не выполнится, и сервер не вернет ОК.
То есть ты хочешь сказать, что для построек выделяется отдельный поток? Оно, например, понятно в плане АИ для противника и АИ, которое используется в автоматической битве. В оригинале, ЕМНИП, пока анимация появления постройки не закончится, зайти куда-нибудь было нельзя. В любом случае, элементарное решение проблемы сейчас не исправит проблем синхронизации в будущем.
Нет. Идет доступ к существу, ожидающего команды. А так как его нет - то падает. Хмм… Пожалуй, вырублю включение автобоя во время хода противника.
Тоже ничего общего с синхронизацией. Здание начинает появляться на экране только после ответа от сервера. Медленное появление здания делается исключительно на клиенте.
Возможно идет из-за того, что появление еще одного здания требует создать заново экран города.
Если ничего не знаешь, то можешь хотя бы молчать? Надоело уже…
Но иконки то в Таун Холле не блокируются и не делаются золотыми же? И их можно нажимать. Что я еще мог подумать кроме синхронизации?
Тогда надо блокировать Таун Холл до того, как клиент все прорисует.
Ещё одно падение, ничего не предвещало беды Это был последний противник, причем, если мне не показалось, убил я его каким-то заклинанием.
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 раз за битву?
В любом случае, не надо ругаться.
Тоже не связано
Память связанная с отрядами в бою удалена, но пара указателей на нее еще осталась. В итоге падает как только идет обращение по адресу, который уже вернули операционной системе. В деревьях много узлов раскиданных по памяти поэтому больше шанс попасть в такой адрес.
Продублируй на багтрекер - похоже и вправду на бой, кончившийся кастом. Мне тут уж больно долго ковыряться прийдется.
А как часто меняются остальные кнопки, например ожидание/защита? Или кнопка каста?
Вообще я там где-то уже создавал похожий тикет.
Про деревья: имхо, балансировка - самое страшное, что было в деревьях. По воспоминаниям с первого курса.
По поводу кнопок: обычно во время игры я об этом не задумываюсь А так вообще удивительно, что во время битвы всё это не тормозит безбожно. Хотя, полагаю, смена состояний кнопок - отнюдь не самое страшное и сложное в битве.
Нашел: bugs.vcmi.eu/view.php?id=1627
Попробовал пару раз повторить заканчивая бой разными заклинаниями - безуспешно.
И чтобы не ловить фейлы на этом все нормальные люди уже пользуются готовыми библиотеками, а не пишут все с нуля
Угадал. В редких случаях бывают сложные расчеты, но обычно ~95% времени - это отрисовка графики. Процесс элементарный, но ее много. Очень много.
Не удалось мне нормально сегодня поиграть
Перешел во вторую миссию, а там на тебе (смотри скриншот). И никак я лесопилку взять под свой контроль не могу, потому что туман войны не рассеялся.
А при попытке загрузить игру предыдущей миссии словил ещё одно падение. Воспроизвести больше не получается.
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) и хоть немного описать что делалось до падения.
То, что падает при отрисовке существа я вижу, а что привело к этому или какое существо это было - не видно.
Угу, что-то я и не подумал про пэйстбин.
А что привело - ну лично я без понятия. Это была обычная битва, всадник атаковал кого-то (косяк, я не запомнил, кого), никаких заклинаний в этот момент не кастовалось, битва как всегда автоматическая.
Ещё одну проблему словил
Убил красного игрока, вроде все хорошо, осталось пройти через ворота и что-то там доделать. Но вот беда, в гарнизоне сидят существа красного игрока, сам гарнизон нейтрального цвета, но атаковать его я не могу. Скриншоты прилагаю.
Это не из-за цвета - гарнизон не был отмечен как объект в который “сверху” зайти можно. Исправил.
Что значит “сверху”? По которому щелкнуть можно? Obj::GARRISON2 - вот это?
Понятно, что не из-за цвета, я сначала подумал, что если противник побежден, то все его владения становятся нейтральными, и… а хрен знает, что тогда.
Ага, оно.
Большинство объектов посетить сверху (с севера) нельзя - в здания можно заходить или снизу или сбоку. Кроме тех, что в списке исключений. И этого гарнизона там не было.
А на этой карте - клетка прямо справа от гарнизона заблокирована горой. Зайти в него можно только сверху (с северо-востока).
bAutofight->block(curInt->isAutoFightOn || activeStack);
Кажется, это плохая проверка. Теперь кнопка активна, когда ходит противник, чуть только он походил, я на кнопку нажать не могу.
По поводу гарнизона - видимо, это подействовало бы только при свежей игре? В смысле, я загрузил сохранение, все так же нельзя было атаковать гарнизон.
И вот ещё, заканчиваю эту миссию, перехожу в меню следующей и игра падает, каждый раз по-новому. Посмотришь, у тебя не падает?
Games.tar (3.45 MB)