0.7 i Linux

Zapewne inaczej zaimplementowano funkcję clock(), z której brane są te wartości. Ale to raczej niczego nie powinno psuć.

Nie, te wszystkie pliki są wewnątrz archiwum .lod. Jeżeli do samego archiwum się dobrał - a dobrał - to już jego obsługa jest w pełni z naszej strony.

Ech, głupi jestem. Elegancko błąd wskazał na substr, a ja naiwnie kombinuję z wektorem. Coś z przetwarzaniem tych plików tekstowych jest nie tak.
Jaką wersję H3 masz tam wgraną? Zwykłą, angielską?

Najlepiej byłoby, jakbyś przeleciał to gdb. Ostatni wypis na log to hch/CGeneralTextHandler.cpp linia 237. Następny jest w linii 251. Nie dochodzi doń, wysypuje się więc gdzie pomiędzy tym. Sypie funkcja substr, więc może być to wywołanie 244. Crash może być, gdy string w tempie ma mniej niż dwa znaki, ale to zdecydowanie nie ma prawa mieć miejsca dla poprawnego tekstu. Alternatywnie błąd może jeszcze być wewnątrz wołanej linię wyżej funkcji loadToIt.
Przejedź po tym, sprawdź w którym momencie i miejscu następuje crash. Jakie w tym momencie są wartości zmiennych - i, it, buf, temp, mines (o ile gdb potrafi to jakoś ładnie wyświetlić).

Złota Edycja. Polska z CD Projektu. Wog angielski.

Na razie mam coś takiego

Nie wiem czy pomoże. Bardziej chyba debugować nie potrafię :stuck_out_tongue: zobacze co jeszcze gdb potrafi…

O, stos wywołań. Widzimy, że sypie linijka 244, zgodnie z przypuszczeniem. Jakbyś ustawił watche na wspomniane zmienne i postawił breakpointa w tejże linii, to może bym wiedział więcej.
Ale… polska wersja może psuć.
Wypakuj to:
forum.vcmi.eu/files/data_119.zip
do podfolderu /Data i sprawdź, czy się coś naprawiło / zmieniło.

Wgrałem i są postępy:

gdb

Dziwne, wynika z tego, że czcionki się nie wczytały. (wołanie funkcji drukującej z NULLowym fontem)
Sprawdź, czy oba pliki (Fonts\georgia.ttf i Fonts\tnrb.ttf) są osiągalne z poziomu głównego pliku wykonywalnego.
Czcionki są wczytywane w CMT.cpp w l.97 - 101. Sprawdź wartości otrzymywanych wskaźników (wszystko NULL-e?). Możesz za tym kontrolnie dodać ‘tlog0 << TTF_GetError();’, co powinno wyrzucić na wyjście treść ew. błędu przy ich wczytywaniu.

Haha, dałeś mi dobrą wskazówkę :smiley: chodziło o dużą literę :stuck_out_tongue: on szukał w “Fonts” a ja miałem “fonts”. Potem jeszcze kilka błędów i się uruchomiło :slight_smile:

Ale z jakiś powodów myszka działa jakby była pijana xD Raz szybciej raz wolniej ale zdecydowanie wolniej niż naprawdę przez co dojadę do końca ekranu a ona zaraz za mną… pomijajac to, pomimo, że denerwujące dałem na Single Scenario->Start i gra się wyłącza (możliwe, że znów problem z polską wersją…). Ach i każda mapa jest dla niego corrupted (czyżby znowu polska wersja?)

logi:

gdb (tylko końcówka)

ok, więc coś odkryłem. Jakaś funkcja odwołuję się do folderu maps przez co jak jest Maps to gra się nie włącza. Jednak jak dam maps to on szuka znów map w Maps… podpowiesz mi gdzie to zmienić aby i tu i tu było z małej literki?

EDIT:

Chyba znalazłem

pliczkiTemp.push_back("Maps/"+(dir->path().leaf()));

w cpregame.cpp

Jednak po zmianie, gra się wywala (taki sam efekt otrzymuję jak po prostu skopiuję folder Maps jako maps (aby mieć dwa))

gdb

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);