-
Notifications
You must be signed in to change notification settings - Fork 0
formatGRF
extrazi edited this page Apr 29, 2021
·
5 revisions
- Plik GRF to zbiór "sprite'ów" , definiujących prawie wszystko
- które możesz zobaczyć w grze. 'Sprites' mogą być grafiką, ale także definiować
- wiele niewizualnych właściwości elementów gry, takich jak pojazdy.
- Istnieją dwa różne formaty plików. Starszy format 1 po prostu
- składa się z jednego 'sprite' po drugim, aż do końca pliku,
- bez nagłówka ani innych metainformacji, z wyjątkiem sumy kontrolnej w pliku
- sam koniec pliku.
- Format 2 składa się z nagłówka, po którym następuje sekcja danych zawierająca wszystko
- sprite'y nie będące obrazami, po których następuje sekcja sprite'ów zawierająca rzeczywisty plik
- grafika.
- Wszystkie liczby w pliku GRF są przechowywane w kolejności bajtów 'little-endian'.
- Format 2 GRF zaczyna się od nagłówka z następującymi bajtami:
00 00 47 52 46 82 0D 0A 1A 0A
DWORD sprite_offs
- Liczba bajtów do przeskoczenia po tym DWORD, aby osiągnąć początek
- sekcja 'sprites'.
BYTE data_compr
- Format kompresji sekcji danych.
00 Bez kompresji inne Nie określono
- Sekcja danych składa się z 'sprites' w następującym formacie:
WORD rozmiar (format 1) DWORD rozmiar (format 2)
- Rozmiar aktualnego 'sprite', bez niego. Znaczenie
- zależy od kolejnego bajtu informacyjnego.
BYTE Info
- Wartość kodowana bitami, która określa typ tego 'sprite' .
FF Pseudo sprite, który zawiera dane niebędące obrazami, zobacz NewGraphicsSpecs dla szczegółów. W przypadku pseudo 'sprite' rozmiar *nie* obejmuje bajtu informacyjnego. FD (dotyczy tylko formatu 2) Odniesienie do sekcji sprite. Rozmiar tak *nie* dołączaj bajtu informacyjnego. inne (ważne tylko w formacie 1) Normalny sprite z danymi obrazu, patrz szczegóły w sekcji "Normal sprites" . Jeśli ustawiony jest bit 2, size jest długością sprite'a w pliku łącznie z bajtem informacyjnym.
- Jeśli nie jest ustawiony, musisz zdekodować dane obrazu, aby się tego dowiedzieć
- gdzie zaczyna się następny 'sprite' .
DANE 'data'
- Długość danych zależy od rozmiaru i informacji.
- Jeśli wartością informacji jest FD, jest to pojedynczy DWORD zawierający ID
- który jest wyszukiwany w sekcji sprite i przetwarzany zamiast
- ten 'sprite' .
Sekcje danych są zakończone słowem WORD (format 1) / DWORD (format 2) wartości 0.
- W przypadku GRF formatu 1 następuje czterobajtowa suma kontrolna. Algorytm do obliczenia
- jest nieznany, ale i tak nigdy nie jest przetwarzany przez grę.
- Sekcja 'sprites' składa się z wpisów w następującym formacie:
DWORD id
- ID używany do odniesienia do wpisu z sekcji danych.
DWORD rozmiar
- Długość następujących danych w pliku.
BYTE info
- Wartość kodowana bitami, która określa typ tego 'sprite' .
FF Dane niebędące obrazami, na przykład dźwięki. Zobacz NewGraphicsSpecs dla szczegółów. <br> others Dane obrazu, zobacz sekcję "Normal sprites" po szczegóły.
DANE 'data'
- rozmiar-1 bajtów danych.
- Dozwolonych jest wiele wpisów z tym samym ID. ID należy regulować
- rosnąco.
Sekcja sprite'a jest zakończona znakiem DWORD o wartości 0, co oznacza że 0 nigdy nie jest prawidłowym ID.
- Zwykłe 'sprites' zawierają widoczną grafikę gry. Dokładny format
- zależy od formatu pliku. W przypadku plików formatu 1 normalne sprite'y występują w
- sekcja danych, podczas gdy dla plików formatu 2 znajdują się one w 'sprite'
- Sekcja.
- W przypadku plików GRF w formacie 1 bajt informacji ma następujące znaczenie:
- Bit Val Znaczenie
0 1 Indeks koloru 0 jest przezroczysty (zawsze powinien być ustawiony). 1 2 Rozmiar jest rozmiarem skompresowanym, jeśli został ustawiony.
- Jeśli ten bit jest ustawiony, podany rozmiar jest po prostu rozmiarem w
- plik. Jeśli nie jest ustawiony, *musisz* go zdekompresować, aby się dowiedzieć
- jak duży jest w pliku.
3 8 Ma przezroczystość (to znaczy jest kaflem), patrz poniżej. 6 40h Dokładny rozmiar tego 'sprite' jest znaczący. Jeśli nie jest ustawiony, grfcodec może próbować usunąć zbędne przezroczyste piksele. inne Niezdefiniowane.
- Dla formatu 2 GRF bajt informacyjny ma następujące znaczenie:
- Bit Val Znaczenie
0 1 Format piksela zawiera komponenty RGB. 1 2 Format pikseli zawiera składnik alfa. 2 4 Format pikseli zawiera komponent maski/palety. 3 8 Ma przezroczystość (to znaczy jest kaflem), patrz poniżej. 6 40h Dokładny rozmiar tego 'sprite' jest znaczący. Jeśli nie jest ustawiony, grfcodec może próbować usunąć zbędne przezroczyste piksele. inne Niezdefiniowane.
- Komponenty pikseli są uporządkowane R, G, B, A, M, bez komponentów
- pominięty bez wypełnienia. W przypadku formatu pliku 1 format piksela jest niejawnie
- zdefiniowane jako tylko składnik palety.
BYTE zoom_level (tylko format 2)
- Poziom powiększenia aktualnego 'sprite' , zdefiniowane są następujące wartości:
00 normalny zoom 01 Powiększenie 4x 02 Powiększenie 2x 03 2x oddalenie 04 4x oddalenie 05 8-krotne pomniejszenie
BYTE ydim (format 1) WORD ydim (format 2)
- Ile linii jest w 'sprite' (wymiar y)
WORD xdim
- Ile jest kolumn (wymiar x)
WORD xrel
- Przesunięcie poziome. Odsunięcie jest liczone od podstawy
- koordynaty dla każdego 'sprite' .
WORD yrel
- Przesunięcie pionowe.
DWORD uncomp_size (format 2, tylko jeśli ustawiony jest bit informacji 3)
- Nieskompresowany rozmiar danych obrazu zakodowanego jako kafle.
- Po tym następuje rzeczywiste skompresowane dane. Jeśli bit informacji 3 nie jest
- zestaw, dane są po prostu strumieniem bajtów od lewej do prawej i
- od góry do dołu, tworząc piksele xdim*ydim .
- Jeśli bit informacji 3 jest ustawiony, 'sprite' jest kaflem i ma jakieś specjalne
- informacje o przejrzystości, które są zakodowane w następujący sposób. Każda linia jest
- zakodowane oddzielnie i podzielone na "kawałki". Każdy fragment zawiera
- pikseli, ale fragmenty mogą pominąć kilka pikseli, które są wtedy
- przezroczysty.
- Dane sprite'a zaczynają się od listy przesunięć WORD dla
- format 1 GRF i format 2 GRF z nieskompresowanym rozmiarem poniżej 65536
- bajtów. Jeśli rozmiar jest większy w formacie 2 GRF, zostanie uruchomiony 'sprite'
- z listą offsetów DWORD. Każda linia ma jedno przesunięcie. Te
- określić, od którego przesunięcia zaczyna się każda linia, licząc od pierwszych danych
- bajt.
- Następnie postępuj zgodnie z fragmentami dla linii:
BYTE cinfo (format 1) WORD cinfo (format 2, jeśli szerokość> 256)
- Wysoki bit jest ustawiany, jeśli jest to ostatni fragment wiersza. Plik
- linia nie musi być całkowicie wypełniona, wszystkie pozostałe piksele są
- po prostu przejrzysty. Niższe siedem / piętnaście bitów daje długość
- ten fragment w pikselach.
BYTE cofs (format 1) WORD cofs (format 2, jeśli szerokość> 256)
- x offset, od którego zaczyna się ten fragment. Piksele między tym
- fragment, a ostatni będzie przezroczysty.
- Następnie wykonaj bajty (odpowiednio cinfo & 0x7f lub cinfo & 0x7fff )
- pikseli.
- Zastosowana kompresja jest odmianą algorytmu LZ77, która
- wykrywa nadmiarowość i bezstratnie zmniejsza rozmiar danych. Tutaj jest
- jak skompresowane dane wyglądają w pliku GRF.
- Skompresowany strumień zawiera wskaźnik do wcześniejszej lokalizacji
- i długość, co oznacza, że te bajty są kopiowane z pliku
- w danej lokalizacji lub zawiera długość i dosłowny fragment, którym jest
- skopiowane do strumienia wyjściowego.
BYTE kod ''(code)''
- Wysoki bit kodu pokazuje, czy jest to fragment dosłownie
- nie ustawiono) lub powtórzenie wcześniejszych danych (set).
- Znaczenie kolejnych bajtów zależy od tego, czy wysoki bit
- kod jest ustawiony.
- Jeśli wysoki bit nie jest ustawiony, poniżej znajduje się code&0x7f bajtów
- dane dosłowne.
- Jeśli ustawiony jest wysoki bit, kod ma nieco inne znaczenie.
- Bity od 3 do 7 mają teraz trzy bity o wartości długości, określającej, ile
- dane należy skopiować z wcześniejszej lokalizacji. Bity od 0 do 2 to
- wysokie bity przesunięcia, przy czym najniższe bity znajdują się w następnym bajcie.
BYTE lofs
- Niskie bity przesunięcia
- Użyj tego, aby wyodrębnić długość i przesunięcie:
offset długi bez znaku = ((kod & 7) << 8) | 'lofów' (lofs) ;
- Ważne jest, aby zmienne były bez znaku i miały co najmniej dwa bajty
- duży.
- Przesunięcie jest liczone wstecz od bieżącej lokalizacji. Więc ty
- odejmij przesunięcie od swojej pozycji w strumieniu wyjściowym i skopiuj
- podana liczba bajtów.