OpenTTD #Polska - Polskie forum gry OpenTTD [ARCHIWUM]
INNE Podstawy kodowania NewGRF-ów - Wersja do druku

+- OpenTTD #Polska - Polskie forum gry OpenTTD [ARCHIWUM] (https://forum.openttd.pl)
+-- Dział: OpenTTD (https://forum.openttd.pl/forumdisplay.php?fid=1)
+--- Dział: Dodatki (https://forum.openttd.pl/forumdisplay.php?fid=27)
+--- Wątek: INNE Podstawy kodowania NewGRF-ów (/showthread.php?tid=788)



Podstawy kodowania NewGRF-ów - bvader95 - 21-02-2011

Cześć wszystkim.
Ktoś prosił o kurs pisania NewGRF. Ja troszkę tego liznąłem i chyba jestem gotów na przekazanie tej wiedzy innym osobom.

Uwaga: tutorial traktuje o języku NML. Jeśli nie przeraża cię natłok liczb heksadecymalnych, spróbuj NFO. Kurs po angielsku na TTDPatch Wiki:
http://wiki.ttdpatch.net/tiki-index.php?page=NewGraphicsSpecs

1. Instalacja

Po pierwsze, musisz przygotować sobie środowisko do pracy. Niestety, to trochę skomplikowane.
Musisz pobrać:
- Interpreter języka Python:
http://python.org

UWAGA/WARNING/ACHTUNG! - Pobierz wersję 2.7, na wersji 3.3 NML nie zadziała.

- Dodatkowe biblioteki do interpretera
Python Image Library (PIL):
http://www.pythonware.com/products/pil/
PLY:
http://www.dabeaz.com/ply/
-No i oczywiście NML:
http://bundles.openttdcoop.org/nml/nightlies/LATEST/
Wybierasz nml-r_tu.jest.jakaś.liczba.src.tar.gz i pobierasz. Każdy archiwizator to otworzy. Jeśli nie masz, pobierz 7-zip
http://7-zip.org

Jeśli już pobrałeś instalator Pythona, zainstaluj go, a PIL i PLY wrzuć do folderu C:/tu_zainstalowałem_pythona/lib

Następnie kliknij prawym przyciskiem na ikonę Mój Komputer, wybierz Właściwości...
[Obrazek: 353tutorial1.png]

W okienku "Właściwości systemu" wybieramy zakładkę "Zaawansowane" i przycisk "Zmienne środowiskowe". Jeśli w zmiennych systemowych znajduje się zmienna PATH, edytujemy ją, dodając po średniku ścieżkę do Pythona. Jeśli takiej zmiennej nie ma, tworzymy ją.

Jeśli masz Linuksa, pobierz wszystko co trzeba używając wbudowanego menedżera pakietów i możesz od razu przystąpić do pracy. (dlatego lubię Pingwiny).

2. Od czegoś trzeba zacząć

Uwaga - na tym etapie zakładam, że nie rozwaliłeś monitora, nie połamałeś klawiatury i nie wyrzuciłeś komputera przez okno próbując zainstalować wszystko co trzeba pod Windowsem.

Odpal dowolny edytor tekstu. Napisz w nim takie coś:
Kod:
grf {
    grfid: "BV01";
    name: string(STR_GRF_NAME);
    desc: string(STR_GRF_DESCRIPTION);
    version: 1;
    min_compatible_version: 1;
}

A więc teraz rozłóżmy to na kawałki.
grfid: - czterobajtowy identyfikator GRF-u. "Cztery bajty" tu oznacza "cztery znaki". Z reguły pierwsze dwa znaki są inicjałami bądź skrótem nicku twórcy (tu: BV - BarthVader), zaś trzeci i czwarty są dowolne.
name: - nazwa GRF-u zapisana w postaci łańcucha znaków, wyświetlana w oknie wyboru GRFu - więcej niżej
desc: - skrót od description - opis GRF-u, wyświetlany w oknie wyboru GRF-u
version: - wersja GRF-u, w połączeniu z min_compatible_version informuje o wstecznej kompatybilności z poprzednimi wersjami GRF-u. Generalnie unika się stosowania tych parametrów.

No to napisałeś swój pierwszy GRF, który na razie nie robi nic. Zapisz efekt pracy, z rozszerzeniem .pnml lub .nml

Następna lekcja - budowanie GRF-u.


RE: Podstawy kodowania NewGRF-ów - bvader95 - 22-02-2011

3. Stringi zwykłe i stringi dosłowne. Tłumaczenie

Jeśli uważałeś na poprzedniej lekcji, zauważyłeś w kodzie dwa rodzaje stringów - łańcuchów znaków.

Kod:
grfid: "BV01";

To jest przykład stringa dosłownego, ang. literal string. Jest on niezmienny bez względu na język. Raczej rzadko stosowany. Podawany w cudzysłowie.
Kod:
name: string(STR_GRF_NAME);
    desc: string(STR_GRF_DESCRIPTION);
To są stringi zwykłe, zależne od języka. Ogólny schemat: string(nazwa_stringa). Jak widać, tego typu stringi nie są podane w kodzie, a w zewnętrznym pliku. Teraz zademonstrujmy, jak utworzyć ten plik. Utwórz w folderze, gdzie znajduje się plik .pnml folder "lang" (albo jakiejkolwiek innej, ale "lang", jak się później okaże, jest najlepszym wyborem). W tym folderze utwórz plik english.lng (e-en-gie-el-i-es-ha-kropka-el-en-gie, w tym wypadku inna nazwa nie wchodzi w grę). Zacznij go taką linijką:
Kod:
##grflangid 0x01
Ta linijka, a konkretniej dwa ostatnie znaki w tej linijce informują nas o języku, w jakim są niżej wymienione stringi. W tym wypadku jest to brytyjska odmiana angielskiego. Polski ma ID 30. Więcej ID znajdziesz w specyfikacji NML.
Dalej znajdują się brzmienia stringów w danym języku, podane w taki sposób:
Kod:
PAX_WAGON_BDNU                :Wagon pasażerski Bdnu
PAX_WAGON_ADNU                :Wagon pasażerski Adnu
PAX_WAGON_ABDNU               :Wagon pasażerski ABdnu
...
nazwa_stringa                 :brzmienie
Zapisz plik. Jeszcze dziś o kompilacji.

----------------
@Mouse - Ja bym wolał, żeby można było się wypowiedzieć na temat kursu, żebym wiedział jak go pisać, żeby wszystkim odpowiadało.


RE: Podstawy kodowania NewGRF-ów - Rysh - 22-02-2011

(21-02-2011, 23:29)mouse napisał(a):
Rezerwacja!
For future use only!
Wszystkie posty nad/pod tym będą usuwane/ukrywane, dopóki bvader95 nie poinformuje o zakończeniu prac.

(22-02-2011, 17:58)bvader95 napisał(a): @Mouse - Ja bym wolał, żeby można było się wypowiedzieć na temat kursu, żebym wiedział jak go pisać, żeby wszystkim odpowiadało.
Burdel się zrobił. Wątek podzielony.


RE: Podstawy kodowania NewGRF-ów - bvader95 - 23-02-2011

Popełniłem błąd - napisałem zanim pomyślałem. Od nowa.
Kod:
grf {
grfid: "BV01";
name: string(STR_GRF_NAME);
desc: string(STR_GRF_DESCRIPTION);
version: 13;
min_compatible_version: 1;
}
Od nowa. To jest blok "grf" w którym deklaruje się podstawowe dane GRF-u. Musi się on pojawić w każdym GRF-ie.

grfid: czteroznakowe ID, dzięki któremu GRF jest odróżniany od innych i nie można go wczytać dwa razy
name: nazwa GRF-u
desc: opis GRF-u, wyświetlany w Ustawieniach NewGRF
version: wersja GRF-u, w postaci numerka
min_compatible_version: najstarsza wersja GRF-u, z którą zgodna jest wersja obecna.

Wszystkie nazwy (pojazdów, budynków, przedsiębiorstw), a także opis GRF-u nie są podane bezpośrednio w kodzie. W kodzie podaje się tylko odsyłacz do osobnego pliku językowego.

Kod:
name: string(STR_GRF_NAME);
oznacza, że w miejscu nazwy GRF-u wyświetli się zdanie STR_GRF_NAME w języku, jakim posługuje się OTTD, lub po angielsku, jeśli GRF nie jest przetłumaczony na ten język.

Przykład pliku językowego.
Kod:
##grflangid 0x01
STR_GRF_NAME                   :Polish PKP Set Extended RC2
STR_GRF_DESCRIPTION            :Coding: BarthVader, Drawing: Czajnikowiec, Alkomat, creators of original PKP Set

Najwygodniej zrobić osobny podfolder na pliki językowe w tym samym folderze, w którym znajduje się projekt.

Pierwsza linijka informuje kompilator, że to jest plik językowy. Dwie ostatnie cyfry mówią jaki to język. Lista możliwych dwóch ostatnich cyfr:
http://hg.openttdcoop.org/nml/raw-file/tip/docs/language-files.html#language-files
(na stronie jest tabelka po angielsku).

UWAGA!
  • Musi istnieć co najmniej jeden plik językowy. Nazw nie można podawać bezpośrednio w kodzie.
  • Musisz utworzyć plik językowy w języku angielskim (odmiana brytyjska), w którym znajdą się wszystkie użyte przez ciebie zdania. Jeśli planujesz napisać GRF tylko po polsku, to i tak plik językowy musi być zakodowany jak dla brytyjskiego angielskiego. W takim wypadku NML nie zaakceptuje tzw. "ogonków", wyrzucając błąd podobny do poniższego:

    Kod:
    nmlc: The default language file ("./POLSKIE_DROGI/lang/english.lng") contains non-utf8 characters

  • Plik z angielskim językiem musi nazywać się "english.lng", z polskim - "polish.lng", z każdym innym "angielska_nazwa_języka.lng"


Generalnie to podsumowanie lekcji 2 i 3. Wypowiedzcie się w dyskusji, czy może być. Jeśli tak, dalsza część będzie utrzymana w tym stylu, i poproszę admina o wywalenie wszystkich części poza tą o instalacji.