0.7 i Linux

Wygląda na ten sam bug z wczytywaniem map, do któéego dotarł Dikamilo. Problem nietyle z Linuksem, ile z GCC. Nie mam na to dobrego pomysłu.
Przerobiłem na razie kod odpowiadający za wczytywanie map. Uaktualnij źródła i wypróbuj. Nawet jeśli nie zadziała, to przynajmniej powinno się ciekawiej wysypywać. :wink:

Więc ukłony bo najwyraźniej już dobrze wczytuje mapy. Ignorując problem z myszką postanowiłem uruchomić grę. Kiedy wybiorę mapę z oryginalnych Herosów (czyli tych polskich) to jest taki log:

gdb

Gdy wybiorę mapę z WoG

gdb

Jako że nasze “problemy” tyczą się praktycznie tego samego, pozwolę sobie napisać w tym temacie.

Więc, wprowadzone zmiany są na duży plus. Jednak pojawił się następny problem, mianowicie z połączeniem do serwera, gdy wybieram mapę (obojętnie z jakiej wersji), client ładuje serwer następnie serwer zamyka się i gra stoi, w logach widać to:

client:

...
Initialization CPreGame (together): 953
Initialization of VCMI (together): 3859
Preparing shared memory and starting server: 32
Waiting for server... 2344
Establishing connection...
Found endpoints:
	0: 127.0.0.1:3030
Trying connection to 127.0.0.1:3030  (0)

Przy niektórych mapach klient wywala takie coś:

Establishing connection...
Found endpoints:
	0: 127.0.0.1:3030
Trying connection to 127.0.0.1:3030  (0)

Cannot establish connection! Retrying within 2 seconds
Establishing connection...
Found endpoints:
	0: 127.0.0.1:3030
Trying connection to 127.0.0.1:3030  (0)
Problem with connecting: 
system:10061
Something went wrong... checking for error info
system:10061

server:

...
CVCMIServer created!
Listening for connections at port 3030
We've accepted someone... 
Próbowano przeprowadzić próbę na obiekcie, który nie jest gniazdem

Mam podlinkowane liby wsock32 oraz ws2_32 (od winsock) w serverze i dll. gdb nie pokazuje nic, bo to serwer się wychacza.

===
Podam jeszcze niezbędnie zmiany aby VCMI dal się skompilować na mingw, może będzieice chcieli to dodać :]

  • problem z konsolą (gra nie loguje do okna tylko do 2 lików txt):
    w CMP.cpp dodać po includach:
#if __MINGW32__
#undef main
#endif
  • undefined reference to genRect i SDL_PutPixelWithoutRefresh
    Przenieść wymienione funkcie (inline) z SDL_Exceptions.cpp do SDL_Exceptions.h

Najlepiej by było, gdybyś zrobił z tego łatkę ( .diff / .patch) i mi podesłał/załączył - wgrałbym na repozytorium i byś nie miał konfliktu :wink:

Serwer wywala się na wczytywaniu mapy.

Start gry wygląda tak - po wyborze mapy, klient uruchamia serwer, czeka nań, łączy się i wysyła nazwę mapy i ustawienia początkowe. Potem czekamy, aż serwer odeśle nam swoje informacje. Następnie klient wczytuje mapę.
Serwer po otrzymaniu informacji startowych wczytuje mapę i dopiero potem przekazuje resztę informacji klientowi. Jeżeli serwer na wczytywaniu mapy się wykrzaczy, pójdzie za nim i klient (bo połączenie się popsuje).

Tak właśnie było w tym przypadku - klient się wysypał, bo połączenie z serwerem siadło. A siadło, bo serwer się wysypał na tej mapie.
Żeby powiedzieć coś więcej, musiałbym znać mapę i zobaczyć stos wywołań serwera w chwili crasha. Ten z klienta mówi tylko: “to nie ja!”. :wink:

O, już bardzo daleko zaszedł. To ostatni krok przed rozpoczęciem rozgrywki - wczytanie AI. Pewnie nie jest w stanie wczytać pliku AI/GeniusAI.dll - przypuszczam, że zbudowaną bibliotekę z AI nazwało inaczej. Możesz zmienić jej nazwę, albo zmienić nazwę szukanego pliku w config/settings.txt (wpis defaultAI=GeniusAI.dll;).

Oto łatka w załączniku, zmiany które wymieniłem w poprzednim poście + pliki projektów dla Code::Blocks.

“Popełniłem” :wink:
Dzięki!

Jak byś mógł jeszcze tego wgrać, bo w tamtym kilka błędów było (nie sprawdziłem przed wysłaniem) :slight_smile:
mingw_r718.rar (5.66 KB)

Zrobione, sam zresztą powinienem był uważniej rzucić okiem. :wink:
Co do samego błędu, na którym utknąłeś, to nie bardzo mam pomysł. Sieć coś dziwnie działa. Zastanawiające o tyle, że Skoruppa przez ten etap przebrnął akurat dość bezboleśnie, więc to raczej nie problem stricte związany z GCC.

Naprawiłem :slight_smile: Trzeba było dodać flagę _WIN32_WINNT <- sam boost asio o to krzyczał :slight_smile:

Wszystkie mapy ładują się poprawnie, wiec nie ma tego problemu który występuje u Skoruppa.

Pierwszy błąd prawie na 100% powoduję polska wersja :stuck_out_tongue: Drugi pewnie powoduję brak AI bo wstyd się przyznać ale nie skompilowałem. Dikamilo: jak kompilujesz AI? (tak, po prostu mi nie wychodzi :P)

Ja importowałem projekt Visuala i dolinkowałem mu liba VCMI, dodatkowo takie #defines:

WIN32
_WINDOWS
_USRDLL
GENIUS_EXPORTS

Mam jeszcze w projekcie podana ścieżkę do include i libs z boosta ale żaden lib nie jest potrzebny :slight_smile:

A pliki w projekcie to:
CGeniusAI.h
CGeniusAI.cpp
DLLMain.cpp

A mógłby mi ktoś wygenerować makefile? Bo ja jestem chyba zbyt wielki amator :stuck_out_tongue:

EDIT:
Czego bym nie próbował to zawsze

Może coś źle robię…

Zaktualizuj źródła tam jest patch który to poprawia, albo zmień (CGeniusAI.h):

void CBattleLogic::PrintBattleAction(const BattleAction &action); 

na

void PrintBattleAction(const BattleAction &action); 

Tak, dokładnie rewizja 719 (lub nowsza :wink: ).
Po tej poprawce już powinno działać.

Gra się crashuje przy zapisywaniu zaraz po tym:

System message from server: Serializing game info...

Czy to odtwarzalne? Czy zachodzi na wszystkich mapach?
Spróbuj zdebugować sewer, bo wpis w logu jest mało pomocny (serializacja informacji o grze, to dość sporo pracy).

Tak zachodzi na każdej mapie, a co do debugowania, to za bardzo nie wiem jak się za to wziąć, attach to PID nie bardzo działa, frezuje całą aplikacje, a z miejsca tego nie zrobię bo serwer jest przecież uruchamiany z poziomu klienta.

Podczas kompilacji GeniusAI

/usr/lib/gcc/i486-linux-gnu/4.3.3/../../../../lib/crt1.o: In function `_start':
/build/buildd/glibc-2.9/csu/../sysdeps/i386/elf/start.S:115: undefined reference to `main'
collect2: ld returned 1 exit status

nie wiem czy tu mój błąd czy z coś innego.

Wydaje mi się że nie kompilujesz tego jako lib.

===

Co jak co ale debbugera to ja obsługiwać nie potrafię :smiley: Tutaj log z crasha przy zapisie gry:

E:\Install\Heroes3>gdb.exe VCMI_server.exe 1280
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-mingw32"...
Attaching to program `E:\Install\Heroes3/VCMI_server.exe', process 1280
[Switching to thread 1280.0x560]

(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
[Switching to thread 1280.0x224]
0x00486c38 in std::string::length () at iostream:77
77        static ios_base::Init __ioinit;

(gdb) bt
#0  0x00486c38 in std::string::length () at iostream:77
#1  0x00455aef in COSer<CSaveFile>::saveSerializable (this=0x162f87c,
    data=@0xd990f4) at Connection.h:275
#2  0x0044298c in SaveSerializable<CSaveFile, std::string>::invoke (
    s=@0x162f87c, data=@0xd990f4) at Connection.h:69
#3  0x00459122 in COSer<CSaveFile>::save<std::string> (this=0x162f87c,
    data=@0xd990f4) at Connection.h:240
#4  0x0045c296 in COSer<CSaveFile>::operator<< <std::string> (this=0x162f87c,
    t=@0xd990f4) at Connection.h:185
#5  0x0045a4a2 in COSer<CSaveFile>::operator&<std::string> (this=0x162f87c,
    t=@0xd990f4) at Connection.h:192
#6  0x004369dd in PlayerInfo::serialize<COSer<CSaveFile> > (this=0xd990d4,
    h=@0x162f87c, version=63) at map.h:129
#7  0x00455de0 in COSer<CSaveFile>::saveSerializable<PlayerInfo> (
    this=0x162f87c, data=@0xd990d4) at Connection.h:245
#8  0x00442388 in SaveSerializable<CSaveFile, PlayerInfo>::invoke (
    s=@0x162f87c, data=@0xd990d4) at Connection.h:69
#9  0x004581f2 in COSer<CSaveFile>::save<PlayerInfo> (this=0x162f87c,
    data=@0xd990d4) at Connection.h:240
#10 0x0045ae56 in COSer<CSaveFile>::operator<< <PlayerInfo> (this=0x162f87c,
    t=@0xd990d4) at Connection.h:185
#11 0x00455db0 in COSer<CSaveFile>::saveSerializable<PlayerInfo> (
    this=0x162f87c, data=@0xd141f4) at Connection.h:253
---Type <return> to continue, or q <return> to quit---
#12 0x00442d28 in SaveSerializable<CSaveFile, std::vector<PlayerInfo, std::alloc
ator<PlayerInfo> > >::invoke (s=@0x162f87c, data=@0xd141f4) at Connection.h:69
#13 0x004595c6 in COSer<CSaveFile>::save<std::vector<PlayerInfo, std::allocator<
PlayerInfo> > > (this=0x162f87c, data=@0xd141f4) at Connection.h:240
#14 0x0045c8c6 in COSer<CSaveFile>::operator<< <std::vector<PlayerInfo, std::all
ocator<PlayerInfo> > > (this=0x162f87c, t=@0xd141f4) at Connection.h:185
#15 0x0045a802 in COSer<CSaveFile>::operator&<std::vector<PlayerInfo, std::alloc
ator<PlayerInfo> > > (this=0x162f87c, t=@0xd141f4) at Connection.h:192
#16 0x00435e61 in CMapHeader::serialize<COSer<CSaveFile> > (this=0xd14198,
    h=@0x162f87c, Version=63) at map.h:226
#17 0x00455ca8 in COSer<CSaveFile>::saveSerializable<CMapHeader> (
    this=0x162f87c, data=@0xd14198) at Connection.h:245
#18 0x00442350 in SaveSerializable<CSaveFile, CMapHeader>::invoke (
    s=@0x162f87c, data=@0xd14198) at Connection.h:69
#19 0x00458186 in COSer<CSaveFile>::save<CMapHeader> (this=0x162f87c,
    data=@0xd14198) at Connection.h:240
#20 0x0045adc6 in COSer<CSaveFile>::operator<< <CMapHeader> (this=0x162f87c,
    t=@0xd14198) at Connection.h:185
#21 0x0040dbdd in CGameHandler::handleConnection (this=0x22fb54, players=
          {_M_t = {_M_impl = {<std::allocator<std::_Rb_tree_node<int> >> = {<__g
nu_cxx::new_allocator<std::_Rb_tree_node<int> >> = {<No data fields>}, <No data
fields>}, _M_key_compare = {<> = {<No data fields>}, <No data fields>}, _M_heade
r = {_M_color = 14095560, _M_parent = 0xd91e80, _M_left = 0x0, _M_right = 0x7c91
---Type <return> to continue, or q <return> to quit---
0098}, _M_node_count = 2009244481}}}, c=@0xd714c8) at CGameHandler.cpp:460
#22 0x00483091 in boost::_mfi::mf2<void, CGameHandler, std::set<int, std::less<i
nt>, std::allocator<int> >, CConnection&>::operator() (this=0x24b050,
    p=0x22fb54, a1=
          {_M_t = {_M_impl = {<std::allocator<std::_Rb_tree_node<int> >> = {<__g
nu_cxx::new_allocator<std::_Rb_tree_node<int> >> = {<No data fields>}, <No data
fields>}, _M_key_compare = {<> = {<No data fields>}, <No data fields>}, _M_heade
r = {_M_color = 14095560, _M_parent = 0xd87748, _M_left = 0xd91e80, _M_right = 0
xd714c8}, _M_node_count = 2292564}}}, a2=@0xd714c8) at mem_fn_template.hpp:274
#23 0x00461e8c in boost::_bi::list3<boost::_bi::value<CGameHandler*>, boost::_bi
::value<std::set<int, std::less<int>, std::allocator<int> > >, boost::reference_
wrapper<CConnection> >::operator()<boost::_mfi::mf2<void, CGameHandler, std::set
<int, std::less<int>, std::allocator<int> >, CConnection&>, boost::_bi::list0>
    (this=0x24b058, f=@0x24b050, a=@0x162ff0f) at bind.hpp:371
#24 0x00462d1d in boost::_bi::bind_t<void, boost::_mfi::mf2<void, CGameHandler,
std::set<int, std::less<int>, std::allocator<int> >, CConnection&>, boost::_bi::
list3<boost::_bi::value<CGameHandler*>, boost::_bi::value<std::set<int, std::les
s<int>, std::allocator<int> > >, boost::reference_wrapper<CConnection> > >::oper
ator() (this=0x24b050) at bind_template.hpp:20
#25 0x0046e294 in boost::detail::thread_data<boost::_bi::bind_t<void, boost::_mf
i::mf2<void, CGameHandler, std::set<int, std::less<int>, std::allocator<int> >,
CConnection&>, boost::_bi::list3<boost::_bi::value<CGameHandler*>, boost::_bi::v
alue<std::set<int, std::less<int>, std::allocator<int> > >, boost::reference_wra

Cannot access memory at address 0x1630000

Jesteś wielki a mi wróciła wiara w to, że jednak potrafię kompilować :stuck_out_tongue: wystarczyło dodać -shared. Zaraz przetestuję i zobaczę :slight_smile: