關於gmc結構

2021-08-21 07:24:21 字數 4284 閱讀 4300

例如伏魔記

(資料是可以用c直接讀取的)

0x0 :lib

0x3 伏魔記 00 0

0x0e 全域性色彩位元組數: 2或4,建議選擇4

0x0f 非零有壓縮,0無壓縮,建議選擇有壓縮1

0x10開始 三位元組索引(與lib一致索引)(unsigned char restype ,unsigned char type ,unsigned char index) ...;

0x2000 開始 四位元組位址(相對檔案頭偏移) (unsigned int mdataoffset)...

typedef struct gmcheadstru gmchead; //16位元組資訊頭 

gmchead mygmchead;

typedef struct gmcindexstrugmcindex;

gmcindex allgmcindex[2726]; //與lib一致的索引,0x10開始, (0x2000-16)的索引空間最多2725個資源

unsigned int allgmcaddr[2725];//位址是真實位址,0x2000開始

初始化讀取如下:

file* file;

/* 裝載原始檔資料到緩衝區 */

if((file = fopen("dat.gmc", "rb")) == null)

// 測試檔案頭

fread(&mygmchead,16,1,file);

char teststr[4];

memset (teststr,0,4);

memcpy(teststr,mygmchead.ckheadstr,3);

if(stricmp(teststr,"gmc"))

//判斷畫素位元組大小

if(mygmchead.sizeofpixcel!=4)

//讀取索引和位址

fseek(file,16,seek_set);

fread(&allgmcindex,0x2000-16,1,file);

fseek(file,0x2000,seek_set);

fread(&allgmcaddr,2725<<2,1,file);

索引查詢方法

unsigned int getgmcaddr(int rtype, int otype, int oindex)

return 0;

}

讀取案例:

int resaddress=getgmcaddr(5,2,1);

printf("mysrs resaddress=%d\n",(int)resaddress);

fseek(file,resaddress,seek_set);

srs *mysrs=readsrs(file);

resaddress=getgmcaddr(7,1,1);

printf("mpic resaddress=%d\n",(int)resaddress);

fseek(file,resaddress,seek_set);

pic*mpic=readpic(file);

#include "zlib\zlib.h"

#pragma comment(lib,"zlib\\release\\zlib.lib")

使用了zlib讀取需匯入zlib庫

資源資料只有動畫 和資料不一樣,其他例如指令碼、npc、地圖等資料與lib一致。

地圖分割為32*32,npc大多數也是32的倍數,最常見rpg素材是32分割,原始碼中已經收集齊幾乎所有符合這種rpg彩色的npc素材和地圖素材。

戰鬥背景320*200(**於仙劍98資源),也就是主視窗至少320*200(因為仙劍98也是這麼大視窗)

地圖資源多數是**於軒轅劍之楓之舞地圖。

pic資料 mdataoffset +0

頭6位元組,依次是

mwidth,mheight,mnumber,mtransparent
typedef struct picheadstru pichead;

typedef struct pixcelstru pixcel;

typedef struct picstr pic;

mdataoffset +6 是畫素資料,可以壓縮

例如讀取案例

pic* readpic(file* file)

fread(&mypic->myphead,6,1,file); //讀取頭

printf("pic w=%d,h=%d,n=%d,t=%d\n",(int)mypic->myphead.mwidth,(int)mypic->myphead.mheight,

(int) mypic->myphead.mnumber,(int)mypic->myphead.mtransparent);

if(!mygmchead.iscomressed)

fread(mypic->pixs,picpixsize,1,file); //直接讀取

}else

fread(fbuf, 1, flen, file);//讀取已壓縮資料

// memcpy(&ulen,fbuf+ flen-4, 4); /* 獲取緩衝區大小 */

//printf("解壓畫素位元組數=%d\n",ulen);

/* 解壓縮資料 */

int failed_number=0;

while(failed_number < 4)

if(uncompress(ubuf, &ulen, fbuf, flen) != z_ok)

else

}if(failed_number==4)

free(fbuf);//釋放已壓縮資料的快取

mypic->pixs=(pixcel *)ubuf;/* 儲存解壓縮後的資料到目標檔案 */

}//測試畫素(0,1)紅值

//printf( "(0,1)畫素 r=%d\n",(mypic->pixs+(1*mypic->myphead.mwidth+0))->red);

return mypic;

}

用完後釋放

void freepic(pic* despic)
srs資料mdataoffset +0是資料頭,依次
mtype,mindex ,mframenum,mimagenum ,mstartframe ,mendframe
mdataoffset +6是幀資料,大小7*mframenum
typedef struct srsheadstru  srshead;

typedef struct framestru srsframe;

typedef struct srsstru srs;

mdataoffset +6+7*mframenum是資料

讀取srs方法

srs * readsrs(file* file) 

fread(&mysrs->srshead,6,1,file);

if((mysrs->mframes= (srsframe*)malloc(7*mysrs->srshead.mframenum )) == null)

int i;//必須迴圈讀取,因為編譯器結構體大小判斷不准,每幀讀取7位元組

for (i=0;isrshead.mframenum;i++)fread(mysrs->mframes,7/*必須數字7*/ ,1,file);

if((mysrs->pics= (pic**)malloc( mysrs->srshead.mimagenum<<2)) == null)

pic * frampic;

for (i=0;isrshead.mimagenum;i++)

mysrs->pics[i]=frampic;

}return mysrs;

}

用完後釋放

void freesrs(srs * dessrs)

free(dessrs->mframes);

free(dessrs);

}

例子原始碼vc6(親測,已編譯通過)

關於檔案結構

根目錄,所有的目錄 檔案 裝置都在 之下,就是linux檔案系統的組織者,也是最上級的領導者。bin bin 就是二進位制 binary 英文縮寫。在一般的系統當中,都可以在這個目錄下找到linux常用的命令。系統所需要的那些命令位於此目錄。boot linux的核心及引導系統程式所需要的檔案目錄,...

關於結構體

關鍵字struct表示定義的是結構體的資料型別,緊隨其後的識別符號student是結構體型別名。花括號中依次列舉該型別的每個成員資料型別及其名稱,每個成員的資料型別可以是基本資料型別或者自定義資料型別,但是不能重名。結構的成員也成為域。結構體型別的定義以乙個分號結束。由於資料型別僅是為變數分配儲存空...

關於結構體

結構不可以定義無參的建構函式,缺省內置乙個 結構只能定義有參的建構函式,通過建構函式初始所有成員變數 結構可以不使用操作符new來例項化,但是在使用該結構時必須先給所有成員初始化 結構不能繼承,也不能被繼承 結構可以實現介面 結構不能存在受保護的成員,虛成員還有抽象成員 1.結構是值型別的,不是引用...