mirror of
https://github.com/Kaisaan/lostkefin.git
synced 2025-06-18 16:45:40 -04:00
95 lines
2.5 KiB
Markdown
95 lines
2.5 KiB
Markdown
# Graphics Formats
|
|
|
|
*Ys V: Lost Kefin - Kingdom of Sand* uses unique file formats for different graphics.
|
|
|
|
**Note: All values are stored in Little Endian unless otherwise specified.**
|
|
|
|
# HGK Files
|
|
|
|
3D Model files?
|
|
|
|
# HGB Files
|
|
|
|
Textures for 3D models. 2-dimensional, 32BPP (RGBA8888) encoded.
|
|
|
|
# Sprite Files
|
|
|
|
`.bin` files whose filenames end with `_anm`.
|
|
`graphics.py` can be used to extract all sprites from a given file.
|
|
|
|
## Header
|
|
|
|
The `NAXA5010` file header indicates that it is a sprite file.
|
|
|
|
|Offset|Description|
|
|
|---|---|
|
|
|$00-$07|Always `4E 41 58 41 35 30 31 30` or `NAXA5010` in ASCII|
|
|
|$08-$0B|Palette size , either $10 or $100|
|
|
|$0C-$0F|Palette Data offset, always `$20000000`|
|
|
|$10-$13|Offset to Image Data|
|
|
|$14-$17|Offset to Animation Data|
|
|
|$18-$19|Unknown, sometimes matches Image Width|
|
|
|$1A-$1B|Unknown, sometimes matches Image Height|
|
|
|$1C-$1F|Unknown, always `$00000000`|
|
|
|
|
## Palette
|
|
|
|
The Palette (or CLUT) data always starts at $20 in the file and is either $10 colours or $100 colours. Each colour is 32 bits in RGBA8 format.
|
|
The size of the palette determines if the image data is either 4 bits per pixel or 8 bits per pixel respectively.
|
|
**The Palette data is Swizzled**
|
|
|
|
## Animation Data
|
|
|
|
I don't understand yet how this data is used but there are some patterns that emerge when comparing different files.
|
|
|
|
### Header
|
|
|
|
The animation data starts with an info for the number of entries each file has.
|
|
|
|
|Size|Description|
|
|
|---|---|
|
|
|$4|Number of entries |
|
|
|$4|Entry offset , calculated as (Animation Data Offest + Entry Offset)|
|
|
|
|
The header is padded with `FF FF FF FF`.
|
|
|
|
### Entry
|
|
|
|
Entries can have multiple frames
|
|
|
|
|Size|Description|
|
|
|---|---|
|
|
|$10|Number of frames|
|
|
|$60|Size of each frame info|
|
|
|
|
### Frames
|
|
|
|
Frames are also used for static images.
|
|
|
|
|Size|Description|
|
|
|---|---|
|
|
|$4|Frame length (in frames)|
|
|
|$2|Usually set to `$01`, image will appear|
|
|
|$2|Image Index number|
|
|
|$2|Horizontal offset|
|
|
|$2|Vertical offset|
|
|
|$4|Unknown value again|
|
|
|
|
The rest of each frame is usually empty and padded to be a total of $60 bytes.
|
|
|
|
## Image Data
|
|
|
|
The image data is $10 bytes long per image. It is located based on the offset in the file header. They are formatted as follows:
|
|
|Size|Description|
|
|
|---|---|
|
|
|$2|Image Width in-game?|
|
|
|$2|Image Height in-game?|
|
|
|$2|Image Data Width|
|
|
|$2|Image Data Height|
|
|
|$4|Image Offset, calculated as (Image Data Offset + Image Offset)|
|
|
|$4|Image Index|
|
|
|
|
## Images
|
|
|
|
Images are indexed on the palette info.
|
|
The size (in bytes) of each image's data is Image Data Width * Image Data Height |