X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Ffiles.c;h=f6ef6b5303dd1e740d4875a436ee075581ecdf14;hb=584adc9c1911a6941ef07443a6fc6ff922d7c8ea;hp=eb6d36e943bbbda1b55d1082d79d7b04c473aade;hpb=e5c2eddc151a59db4e611a77901732d7c15fde90;p=flatwaifu.git diff --git a/src/files.c b/src/files.c index eb6d36e..f6ef6b5 100644 --- a/src/files.c +++ b/src/files.c @@ -31,6 +31,7 @@ #include "switch.h" #include "files.h" #include "map.h" +#include "my.h" char *S_getinfo(void); @@ -103,60 +104,68 @@ char *getsavfpname(int n, int ro) return p; } -void F_getsavnames(void) { - - int i; FILE *h; +void F_getsavnames (void) { + int i; + FILE *h; short ver; char *p; - - for(i=0;i<7;++i) { - p = getsavfpname(i,1); - memset(savname[i],0,24);savok[i]=0; - if((h=fopen(p,"rb"))==NULL) continue; //if((h=open(n,O_RDONLY|O_BINARY))==-1) continue; - myfread(savname[i],1,24,h);ver=-1;myfread(&ver,1,2,h); - fclose(h);savname[i][23]=0;savok[i]=(ver==3)?1:0;//savok[i]=(ver==2)?1:0; + for (i = 0; i < 7; ++i) { + p = getsavfpname(i, 1); + memset(savname[i], 0, 24); + savok[i] = 0; + h = fopen(p, "rb"); + if (h != NULL) { + ver = -1; + myfread(savname[i], 24, 1, h); + ver = myfread16(h); + savname[i][23] = 0; + savok[i] = (ver == 3) ? 1 : 0; + fclose(h); + } } } -void F_savegame(int n,char *s) { - - FILE* h; - char *p; - p=getsavfpname(n,0); - if((h=fopen(p,"wb"))==NULL) return; - myfwrite(s,1,24,h);myfwrite("\3\0",1,2,h);//myfwrite("\2\0",1,2,h); - G_savegame(h); - W_savegame(h); - DOT_savegame(h); - SMK_savegame(h); - FX_savegame(h); - IT_savegame(h); - MN_savegame(h); - PL_savegame(h); - SW_savegame(h); - WP_savegame(h); - fclose(h); +void F_savegame (int n, char *s) { + char *p = getsavfpname(n, 0); + FILE *h = fopen(p, "wb"); + if (h != NULL) { + myfwrite(s, 24, 1, h); // slot name + myfwrite16(3, h); // version + G_savegame(h); + W_savegame(h); + DOT_savegame(h); + SMK_savegame(h); + FX_savegame(h); + IT_savegame(h); + MN_savegame(h); + PL_savegame(h); + SW_savegame(h); + WP_savegame(h); + fclose(h); + } } -void F_loadgame(int n) { - FILE* h; +void F_loadgame (int n) { short ver; - char *p; - p=getsavfpname(n,1); - - if((h=fopen(p,"rb"))==NULL) return;//if((h=open(fn,O_BINARY|O_RDONLY))==-1) return; - fseek(h,24,SEEK_SET);myfread(&ver,1,2,h);if(ver!=3) return;//if(ver!=2) return; - G_loadgame(h); - W_loadgame(h); - DOT_loadgame(h); - SMK_loadgame(h); - FX_loadgame(h); - IT_loadgame(h); - MN_loadgame(h); - PL_loadgame(h); - SW_loadgame(h); - WP_loadgame(h); - fclose(h); + char *p = getsavfpname(n, 1); + FILE *h = fopen(p, "rb"); + if (h != NULL) { + fseek(h, 24, SEEK_SET); // skip name + ver = myfread16(h); // version + if (ver == 3) { + G_loadgame(h); + W_loadgame(h); + DOT_loadgame(h); + SMK_loadgame(h); + FX_loadgame(h); + IT_loadgame(h); + MN_loadgame(h); + PL_loadgame(h); + SW_loadgame(h); + WP_loadgame(h); + } + fclose(h); + } } void F_addwad(char *fn) { @@ -180,12 +189,6 @@ int myfilelength(FILE *h) extern void mysplitpath(const char* path, char* drv, char* dir, char* name, char* ext); -static int myread_int32 (FILE *f) { - int x; - myfread(&x, 4, 1, f); - return int2host(x); -} - // build wad directory void F_initwads (void) { int i, j, k, p; @@ -211,12 +214,12 @@ void F_initwads (void) { } p = 0; // wad number - n = myread_int32(h); // num - o = myread_int32(h); // offset + n = myfread32(h); // num + o = myfread32(h); // offset fseek(h, o, SEEK_SET); for (j = 0; j < n; ++j) { - w.o = myread_int32(h); // offset - w.l = myread_int32(h); // len + w.o = myfread32(h); // offset + w.l = myfread32(h); // len myfread(w.n, 1, 8, h); // name if (p >= MAX_WAD) { ERR_failinit("Слишком много элементов WAD'а"); @@ -263,12 +266,12 @@ void F_initwads (void) { if (strncmp(s, "IWAD", 4) != 0 && strncmp(s, "PWAD", 4) != 0) { ERR_failinit("Нет подписи IWAD или PWAD (2)"); } - n = myread_int32(h); // num - o = myread_int32(h); // offset + n = myfread32(h); // num + o = myfread32(h); // offset fseek(h, o, SEEK_SET); for (j = 0; j < n; ++j) { - w.o = myread_int32(h); // offset - w.l = myread_int32(h); // len + w.o = myfread32(h); // offset + w.o = myfread32(h); // len myfread(w.n, 1, 8, h); // name for (k = 0; k < MAX_WAD; ++k) { if (strncasecmp(wad[k].n, w.n, 8) == 0) { @@ -445,36 +448,41 @@ void F_readstrz(FILE* h,char *s,int m) { map_block_t blk; void F_loadmap(char n[8]) { - - int r; + int r, o; FILE *h; map_header_t hdr; - int o; - W_init(); - r=F_getresid(n); - fseek(h=wadh[wad[r].f],wad[r].o,SEEK_SET); - myfread(&hdr,1,sizeof(hdr),h); - hdr.ver = short2host(hdr.ver); - if(memcmp(hdr.id,"Doom2D\x1A",8)!=0) - ERR_fatal("%.8s не является уровнем",n); + r = F_getresid(n); + h = wadh[wad[r].f]; + fseek(h, wad[r].o, SEEK_SET); + myfread(hdr.id, 8, 1, h); + hdr.ver = myfread16(h); + if (memcmp(hdr.id, "Doom2D\x1A", 8) != 0) { + ERR_fatal("%.8s не является уровнем", n); + } for(;;) { - myfread(&blk,1,sizeof(blk),h); - blk.t = short2host(blk.t); - blk.st = short2host(blk.st); - blk.sz = int2host(blk.sz); - if(blk.t==MB_END) break; - if(blk.t==MB_COMMENT) - {fseek(h,blk.sz,SEEK_CUR);continue;} - o=ftell(h)+blk.sz; - if(!G_load(h)) - if(!W_load(h)) - if(!IT_load(h)) - if(!SW_load(h)) - ERR_fatal("Неизвестный блок %d(%d) в уровне %.8s",blk.t,blk.st,n); - fseek(h,o,SEEK_SET); + blk.t = myfread16(h); + blk.st = myfread16(h); + blk.sz = myfread32(h); + if(blk.t == MB_END) { + break; + } + if(blk.t == MB_COMMENT) { + fseek(h, blk.sz, SEEK_CUR); + continue; + } + o = ftell(h) + blk.sz; + if(!G_load(h)) { + if(!W_load(h)) { + if(!IT_load(h)) { + if(!SW_load(h)) { + ERR_fatal("Неизвестный блок %d(%d) в уровне %.8s", blk.t, blk.st, n); + } + } + } + } + fseek(h, o, SEEK_SET); } - } /*void F_freemus(void) {