0.7 i Linux

Jak co jakiś czas zerknąłem na stronę VCMI. Bardzo zaskoczył mnie fakt otwarcia źródeł :D. Od razu zrobiłem svn co aby co i jak :). Zauważyłem bardzo ciekawe pliki, a dokładniej to pliki od autotoolsa (makefile, configure itd).

Oczywiście musiałem sprawdzić czy uda mi się skompilować jednak nic mi nie wychodzi. Mogę parę błędów podać. Pierwsze to

Ale zostają zignorowane. Następnie

I tu już nie chce iść dalej. Wywaliłem więc tą linijkę ( AX_BOOST_BASE(1.33) ) i poszlo.
To bardziej nie problem skryptu ale przydało by się ustalić jakąs zmienna dla lui ponieważ szuka llua a ja mam przynajmniej 3 lua na pc i żadna nie identyfikuję się jako llua (llua50, llua5.1 i llua5.1-svn). Wystarczy coś jak LUA_LDFLAGS
Poszło dalej, jednak zatrzymuję się na

Niestety ale nigdzie nie moge znaleźć tego pliku :stuck_out_tongue: Może ktoś pomoże?

Mam jednak nadzieje, że kompilacja na Linuksie jest możliwa ^^. Tak czy siak postaram się jeszcze dzisiaj ponownie napisać o VCMI na gry.ubuntu.pl

Pozdrawiam

W zakresie tych plików autotoolsa, to niestety nie jestem w stanie wiele pomóc, gdyż ich nie tworzyłem, nie utrzymywałem i nie używałem.
Okiem nieuzbrojonym jednak patrząc, to radziłbym po prostu wyharatać z tychże plików wszelkie wzmianki o Lui, w tym lstate.h. Nie powinna być już do niczego potrzeba.
Co do boosta, to nie wiem skąd to 1.33, skoro wymaganą wersją jest 1.36 lub nowsza.

VCMI powinno się dać w miarę gładko zbudować na Linuksie, zwłaszcza skoro pod MinGW-em się kompiluje (choć chyba z umiarkowanie szczęśliwymi owocami). Problemem mogą być właśnie te pliki konfiguracyjne, ale chyba nie jest wielkim problemem stworzenie ich w razie potrzeby od nowa.

Podzielę się jeszcze kompletem potrzebnych bibliotek i wersjami w jakich je posiadam, bo widzę, że dane z tych configure’ów są jakieś podejrzane:

  • SDL 1.2.13 (od niedawna, wcześniej miałem 1.2.11 i nie było różnic)
  • SDL_TTF 2.0.8 (nowszy też niby działa, ale jakoś inaczej wyświetla)
  • SDL_Image 1.2.5
  • SDL_Mixer 1.2.7
  • zlib 1.2.3
  • boost 1.37.0

No to wszystko udało mi się ominąć… poza jednym

Coś w 0.7 z AI było robione ale skoro mówisz, że ten autotools jest już zapomniany to też nikt nie zadbał aby odpowiednie rzeczy znalazły się w AI :). Jakieś rady?

Dałem pusty makefile.in. Zobaczymy co z tego wyjdzie.

Znów ja :stuck_out_tongue:
Cały lib poszedł a client nie przeszedł. Mam ten sam boost co ty ale pełno błędów:
wklej.org/id/49518/txt

Wydaje mi się że masz inne nazwy libów bosta niż te z makefile, u mnie np jest: libboost_thread-mgw34-mt-1_37.lib a w makefile jest o ile się nie mylę to zamiast mgw32 jest gcc.

Rozwiązanie było oczywiste :stuck_out_tongue:
dopisałem tylko na sztywno -lboost_system-mt -lboost_thread-mt -lboost_filesystem-mt oraz -I/usr/include/boost do makefile, ale niestety pusty makefile.in nie był genialnym pomysłem bo

chyba, że ich nie trzeba kompilować a są tylko icludowane. Jeśli tak to właśnie udało mi się skomplować bo mam 2 binarki :smiley: vcmclient i vcmiserver. Nie wiem do końca po co vcmiserver ale client mam wgrać teraz do folderu heroes3 (z obiema dodatkami?) i z wogiem?

obie binarki skopiuj, bo client uuchamia server w trakcie :slight_smile:

No i pupcia :stuck_out_tongue:

VCMI_Client_log.txt :

Jak w czymś mogę pomóc to piście.

AI to są osobne dynamiczne biblioteki. Obecnie są dwa AI, z czego jedno nic nie robi, więc zostaje drugie - GeniusAI.
Skryptów do budowania go nie ma, ale składa się z dwóch plików na krzyż, więc kompilacja nie powinna być problemem. Są to CGeniusAI.cpp DLLMain.cpp - zbudować, zlinkować z VCMI_lib i powinno starczyć.

Mało! Powinieneś mieć jeszcze VCMI_lib (libvcmi). Chyba, że Ci go statycznie włączyło w obręb pozostałych binarek. Sprawdź, co się dzieje z libem?

Wygląda, jakby znajdował więcej tekstów z opisem wydarzenia po wejściu do kopalni niż nazw kopalń. (Dość ewidentne wyjście poza zakres).
Możesz się tym plikom przyjrzeć i sprawdzić, czemu je źle łapie, albo doraźnie zablokować crasha dodając sprawdzanie zakresu przed wpisaniem tekstu wydarzenia w wektor (dodaj ‘if(i < mines.size())’ przed ‘mines*.second = temp;’).*

A mogę się spytać gdzie mam to dopisać? Tak przy okazji zaktualizowałem pliki dla autotoolsa i już ładnie configure oraz makefile generuję… mogę podesłać jak chcecie.

Już nie musisz, sam dopisałem i wgrałem na repozytorium, wystarczy, że uaktualnisz źródła (r714). Sprawdzanie zakresu zawsze lepiej mieć. :wink:
Z plikami może zaczekajmy, aż całość będzie owocować działającymi binarkami.

Niestety, dalej nic.

Creating console and logfile: 0
Loading settings: 30000
VCMI 0.7b (client)
	Initializing screen: 50000
	Initializing minors: 0
	Initializing fonts: 0
	Initializing sound: 20000
Initializing screen, fonts and sound handling: 100000
Loading .lod files: 90000
		Reading OBJNAMES 
		Reading ADVEVENT 
		Reading XTRAINFO 
		Reading MINENAME 
		Reading MINEEVNT 
./vcmiclient 
Starting... 
Creating console and logfile: 10000
Loading settings: 20000
VCMI 0.7b (client)
	Initializing screen: 30000
	Initializing minors: 0
	Initializing fonts: 0
	Initializing sound: 30000
Initializing screen, fonts and sound handling: 90000
Loading .lod files: 90000
terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr
Aborted (core dumped)

i jeszcze gdb (nie wiem czy w ogóle się przyda)

[Thread debugging using libthread_db enabled]
Starting... 
[New Thread 0xb736b700 (LWP 8682)]
[New Thread 0xb736ab90 (LWP 8685)]
Creating console and logfile: 0
Loading settings: 30000
VCMI 0.7b (client)
[New Thread 0xb2a01b90 (LWP 8686)]
[Thread 0xb2a01b90 (LWP 8686) exited]
[New Thread 0xb2a01b90 (LWP 8687)]
	Initializing screen: 50000
	Initializing minors: 0
	Initializing fonts: 0
[New Thread 0xb66cdb90 (LWP 8688)]
[New Thread 0xb5eccb90 (LWP 8689)]
	Initializing sound: 20000
Initializing screen, fonts and sound handling: 100000
Loading .lod files: 90000
terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr

Program received signal SIGABRT, Aborted.
[Switching to Thread 0xb736b700 (LWP 8682)]
0xb7f3e430 in __kernel_vsyscall ()

Zastanawia mnie dlaczego te liczby w stosunku do wersji Windowsowej są tak wielkie… Windowsowa wersja wyrzuca

Creating console and logfile: 0
Loading settings: 5
VCMI 0.7 (client)
	Initializing screen: 365
	Initializing minors: 1
	Initializing fonts: 14
	Initializing sound: 61
Initializing screen, fonts and sound handling: 447
Loading .lod files: 105

Może pomoże coś fakt, że system plików w Linuksie widzi różnice między dużym a małym znakiem przez co Config to nie to samo co config. Może po prostu jakiegoś pliku nie potrafi znaleźć i przez to odczytać…

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