Skip to content

Data Structure

Vincent Chi edited this page Dec 31, 2019 · 5 revisions

適用範圍

版本 版本 檔案名稱規則 檔案名稱(台服)
1.0 神獸傳奇 + 魔弓傳奇 GraphicInfo_*.bin GraphicInfo_66.bin
2.0 龍之沙漏 GraphicInfoEx_*.bin GraphicInfoEx_5.bin
3.0 樂園之卵(精靈) GraphicInfoV3_*.bin GraphicInfoV3_19.bin
3.0 樂園之卵 Puk2/GraphicInfo_PUK2_*.bin Puk2/GraphicInfo_PUK2_2.bin
4.0 天界騎士與星詠之歌姬 Puk3/GraphicInfo_PUK3_*.bin Puk3/GraphicInfo_PUK3_1.bin
5.0 砂之記憶與覺醒之光 GraphicInfo_Joy_*.bin GraphicInfo_Joy_125.bin
6.0 輪迴之守 GraphicInfo_Joy_EX_*.bin GraphicInfo_Joy_EX_80.bin
7.0 天使降臨 GraphicInfo_Joy_CH*.bin GraphicInfo_Joy_CH*.bin

規則

以目前台服為準

  1. 以下檔案不會動態更新
    • GraphicInfo_66.bin
    • GraphicInfoEx_5.bin
    • GraphicInfoV3_19.bin
    • Puk2/GraphicInfo_PUK2_2.bin
    • Puk3/GraphicInfo_PUK3_1.bin
    • GraphicInfo_Joy_CH1.bin
  2. GraphicInfo_Joy_CH*.bin 最後更新時間是 2016 年底,剛好是 7.0 上線的時間,猜測內容為 7.0 的資料
  3. 目前有兩個檔案會做動態更新,故猜測後續圖檔更新等資料都是修改此檔案
    • GraphicInfo_Joy_*.bin, GraphicInfo_Joy_EX_*.bin
    • GraphicInfo_Joy_*.bin 自 2016 年底後就沒有更新,猜測在 7.0 之後只更新 GraphicInfo_Joy_EX_*.bin

資料結構

適用於 1.0 ~ 5.0,尚找不到後續資料,推測可以直接應用

結構

名稱 資料型態 說明
編號 uint32_t 圖片在該版本檔案的編號
地址 uint32_t 圖片在數據檔案中的起始位址
數據長度 uint32_t 圖片在數據檔案中的長度
X 軸偏移量 int32_t 通常為負數,表示圖片在與實際位置的 X 軸偏移量
Y 軸偏移量 int32_t 通常為負數,表示圖片在與實際位置的 Y 軸偏移量
寬度 uint32_t 圖片寬度
高度 uint32_t 圖片高度
佔地格數(東) uint8_t 與 X/Y 偏移量一起使用,表示合併後的效果佔用大小
佔地格數(南) uint8_t 與 X/Y 偏移量一起使用,表示合併後的效果佔用大小
標記 uint8_t 只適用於地圖元件,0 表示不可穿越;1 表示可穿越
未知 char[5] 未知,推測可能為了對齊使用,通常皆為 0
地圖編號 uint32_t 地圖索引檔的編號,用於反查

規則

  • 原則上編號從 0 起始,並順序遞增
    • 實務上並不一定從 0 開始,也不一定是順序遞增
    • 可能因為被其它工具修改過導致中間存在空白或亂序
  • 與地圖無關的圖像(如人物、寵物等)地圖編號一律為 0
  • 1.0 及 2.0 中,所有地面圖像大小(寬x高)均為 64x47、偏移量(X 軸xY 軸)為 -32x-24

實現(C 語言)

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

struct GraphicInfo {
    uint32_t id;
    uint32_t address;
    uint32_t length;
    int32_t  offset_x;
    int32_t  offset_y;
    uint32_t width;
    uint32_t height;
    uint8_t  tile_east;
    uint8_t  tile_south;
    uint8_t  access;
    char     _unknown[5];
    uint32_t map;
} __attribute__ ((packed));

int main() {
    FILE * graphic_info = fopen("GraphicInfo.bin", "rb");

    assert(sizeof(struct GraphicInfo) == 40); // Ensure struct GraphicInfo is 40 bytes.

    struct GraphicInfo buffer;

    while(fread(&buffer, sizeof(struct GraphicInfo), 1, graphic_info) != 1) { 
        // printf("%u %u %u %d %d %u %u %d %d %d %c%c%c%c%c %d", 
        //     buffer.id, buffer.address, buffer.length, buffer.offset_x, buffer.offset_y
        //     buffer.width, buffer.height, buffer.tile_east, buffer.tile_south, buffer.access
        //     buffer._unknown[0], buffer._unknown[1], buffer._unknown[2], buffer._unknown[3], buffer.unknown[4], 
        //     buffer.map);
    }

    fclose(graphic_info);
}
Clone this wiki locally
You can’t perform that action at this time.