Skip to content

formatGRF

extrazi edited this page Apr 24, 2021 · 5 revisions


english
EN

Table of Contents

Format pliku GRF

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'.

Nagłówek pliku (tylko format 2)

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 (formaty 1 i 2)

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 sprite (tylko format 2)

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.

Normalne sprite'y

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 .

'Kaflowe' sprite'y

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.

Algorytm kompresji

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:
długość bez znaku __ = -(kod >> 3);
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.

I to wszystko, co brakowało wiedzieć o pliku GRF!

. -

Clone this wiki locally