[RElog] – Oel (Pompowacze) port z C64 (część 3)

Wstępny kod portu

Hej, od ostatniego wpisu o porcie do gry Oel minęła już chwila, mimo niezbyt dużej ilości wolnego czasu na ten projekt znalazłem chwilę aby coś przy nim podłubać, a dzisiaj chciałbym przedstawić co udało mi się osiągnąć Mówimy o zmianach do commit’a [0c41b6f].

Przede wszystkim postanowiłem zabrać się za mapę zmiennych, jak pamiętacie z poprzedniego wpisu, to byłą dość słabo uzupełniona. Aby ją uzupełnić można było wybrać dwa podejścia:

  1. Długa i nieciekawa analiza, także podczas runtime
  2. Zgadywanie przez tłumaczenie stringów.

Oczywiście wybrałem prostszą opcję, a więc (2).

Tłumaczenie stringów


Oryginalny kod źródłowy został napisany przy użyciu mieszanego języka niemieckiego z odrobiną angielskiego. Szczególnie w niemieckim zdarzają się błędy w słowach i drobne przekręcenia, co nie pomaga w tłumaczeniu przy praktycznie zerowej znajomości tego języka.

Jak być może pamiętacie, to już wcześniej zrobiłem sobie pliczek [notes/strings.txt] do którego zrzuciłem wszystkie stringi z kodu źródłowego, zacząłem w nim także zawierać „ręcznie” robione tłumaczenia tekstów.

Przy użyciu jakże wyrafinowanej metody: „skopiuj tekst do schowka, wklej do Google Translate, skopiuj tłumaczenie i wklej do pliku” dociągnąłem do około ~100 tekstów (na ~250). Możecie sobie tylko wyobrazić jak taka robota jest nudna i czasochłonna, dlatego znudzony tą robotą napisałem sobie prosty skrypt w Pythonie który zajął się automatycznym tłumaczeniem tekstów:

Dla większej czytelności wyciąłem część stringów do przetłumaczenia. Sam skrypt (umieszczony pod ścieżką [scripts/translate.py]), wykorzystuje jak się później okazało niespieraną już bibliotekę GoSlate, na szczęście mi zadziałała poprawnie.

Całość wymagała jeszcze paru ręcznych poprawek (z racji pojawienia się literówek w oryginalnych tekstach), samo wykonanie skryptu z ręcznymi poprawkami skróciło czas tłumaczeń z wielu godzin do ~10min łącznie z napisaniem skryptu (Praise the Python!).

„Finalna” lista stringów wygląda następująco:

Na koniec tego rozdziału mam ogromną prośbę do osób znających język niemiecki (jeżeli znacie takie osoby to możecie przekazać moją prośbę do nich): powyższy listing tłumaczeń na pewno w wielu miejscach jest mało doskonały i chciałbym Was prosić o poprawienie powyższych tłumaczeń (tłumaczenia na język polski też są mile widziane).

Najbardziej aktualne tłumaczenia tekstów znajdują się pod [tym linkiem], jeżeli ktoś jest zainteresowany tłumaczeniem lub zna osoby gotowe podjąć się tłumaczenia to prosiłbym o kontakt (mail, fb, komentarz).

Mapa zmiennych


Gdy już mamy tłumaczenia tekstów, to samo zgadywanie funkcjonalności zmiennych stało się znacznie prostsze. Skupiłem się głównie na tablicach, które mogą przechowywać dość ważne informacje opisujące graczy, rafinerie, itp.

Samo zgadywanie odbywało się dość schematycznie:

  1. Wybierz zmienną, np ta
  2. Wyszukaj jej powtórzenia w kodzie przy użyciu komendy:  grep -C 3 listing.bas -e "ta("
  3. Znajdź string opisujący zmienną w okolicach wystąpień znalezionego miejsca użycia zmiennej

Tym sposobem załatwiłem większość tablic, chciałbym też zauważyć, że część zmiennych wciąż nie jest zawarta w pliku [notes/variables.txt], ale czas na nie przyjdzie z czasem w miarę potrzeb.

Piszemy port


Wreszcie dochodzimy do miejsca w którym chciałbym się z Wami podzielić bardzo wczesnym kodem portu do gry. Jak (chyba) wspominałem w pierwszym poście będę kod pisał w C++ przy użyciu SFML (biblioteka graficzna), jako IDE wybrałem ostatecznie [CLion]. Postanowiłem też lekko zmodyfikowaną wariację [stylu pisania Google].

Kod portu znajduje się w repo pod ścieżką [src/]. Tutaj będę przedstawiał i omawiał jedynie fragmenty kodu, ciekawscy pełnego kodu muszą kierować się na repo.

Myślę, że jako tako udało mi się odwzorować klasę Gracza, który prawdopodobnie wzbogaci się jedynie o metody do operowania na pieniądzach, posiadanym majątku, etc.

Powyższa klasa operuje oczywiście na zmiennych znalezionych w oryginalnym kodzie gry, dla przypomnienia:

Jak widzimy zaproponowane nazwy zmiennych w pliku variables.txt nie do końca pokrywają się z tymi w kodzie, powód jest prosty: w kodzie piszemy obiektowo, wg innych zasad więc nazwy są inne. Te w pliku variables.txt mają jedynie za zadanie ułatwić analizę kodu w języku BASIC oraz ewentualne cofnięcie się do pierwotnych nazw.

Oprócz tego zacząłem pisać sobie kod emulujący warstwę graficzną, w tym celu przepisałem wszystkie kolory z Commodore na ich odpowiedniki w SFML (do tego posłużyłem się [tabelą kolorów]):

Z ciekawszych rzeczy to rozpisałem sobie także szkielet pod inicjalizację zmiennych oraz pętle wewnątrz gry (menu, główna pętla).

Jeżeli zwrócicie uwagę, to podczas grania na ekranie główny ekran gry otoczony jest [ramką], samą ramkę i tło głównego ekranu postanowiłem emulować zwykłym prostokątem z obwódką:

Jak widać z powyższych listingów część wartości jest wpisana na sztywno i wkrótce zostanie podmieniona na te bardziej poprawne zgadzające się z samą grą. Obecne są jedynie dla testów.

W omawianej wersji kodu widzimy analogiczną inicjalizację  do tej z oryginalnego kodu, a sama kolejność wykonania poszczególnych instrukcji jest zachowana, np:

Ma odpowiednika w C++ (z dodatkową kontrolą błędów):

W obecnej wersji kod wchodzi do menu skąd jesteśmy w stanie wyjść i zobaczyć jedynie ekran z ramką.

W najbliższej wersji chciałbym stworzyć w miarę wierną kopię menu z gry wraz z jego pełną funkcjonalnością, a więc ze wszystkimi elementami poprzedzającymi właściwą rozgrywkę.

Podsumowanie


Od ostatniego momentu nieco się podziało z projektem, na koniec chciałbym przypomnieć jeszcze raz o swojej prośbie odnośnie tłumaczeń tekstów (jeżeli jesteście sami gotowi przetłumaczyć teksty lub znacie kogoś takiego to dajcie znać).

Tradycyjnie zapraszam Was do komentowania, a także śledzenia bloga przez fb, Twittera, G+ (linki do Social Media są w panelu po prawej). Jeżeli uważacie, że komuś z Waszych znajomych może spodobać się ten artykuł to oczywiście zachęcam do podzielenia się z nim linkiem do bloga ;)

W kolejnym wpisie z tej serii mam nadzieję przedstawić Wam przynajmniej w pełni działające menu, także do przeczytania i..

Code ON!