X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Ffiles.c;h=ef33a03d24265c6228e6a8a39f6b1987cfc90e04;hb=da79be9b6a4134aa9cd19e6f5909fedb20d318cb;hp=bc6abd937019f0423658c761db7b8bc7b8c2f572;hpb=ea7819e2f4224e9a5c9be063f9524c8e67a94c36;p=flatwaifu.git diff --git a/src/files.c b/src/files.c index bc6abd9..ef33a03 100644 --- a/src/files.c +++ b/src/files.c @@ -22,24 +22,16 @@ #include "glob.h" #include -//#include -//#include #include #include -//#include -#include "vga.h" +#include #include "error.h" -#include "sound.h" -//#include "snddrv.h" -#include "memory.h" #include "view.h" #include "items.h" #include "switch.h" #include "files.h" #include "map.h" -#include - char *S_getinfo(void); extern void *snd_drv; @@ -111,60 +103,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); + myfread16(&ver, 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 + myfread16(&ver, 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) { @@ -188,67 +188,120 @@ 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; +void F_initwads (void) { + int i, j, k, p; FILE *h; char s[4]; - int n,o; + int n, o; wad_t w; logo("F_initwads: подключение WAD-файлов\n"); - for(i=0;i=MAX_WAD) ERR_failinit("Слишком много элементов WAD'а"); - memcpy(wad[p].n,w.n,8); - wad[p].o=w.o;wad[p].l=w.l;wad[p].f=0; - ++p; + for (i = 0; i < MAX_WAD; ++i) { + wad[i].n[0] = 0; + } + + logo(" подключается %s\n", wads[0]); + if ((wadh[0] = h = fopen(wads[0], "rb")) == NULL) { + ERR_failinit("Не могу открыть файл: %s", wads[0]); + } + + s[0] = '\0'; + myfread(s, 1, 4, h); + if (strncmp(s, "IWAD", 4) != 0 && strncmp(s, "PWAD", 4) != 0) { + ERR_failinit("Нет подписи IWAD или PWAD (1)"); + } + + p = 0; // wad number + n = myread_int32(h); // num + o = myread_int32(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 + myfread(w.n, 1, 8, h); // name + if (p >= MAX_WAD) { + ERR_failinit("Слишком много элементов WAD'а"); + } + wad[p].o = w.o; + wad[p].l = w.l; + memcpy(wad[p].n, w.n, 8); + wad[p].f = 0; + ++p; } + //fclose(h); - for(i=1;i=MAX_WAD) { - if(p>=MAX_WAD) ERR_failinit("Слишком много элементов WAD'а"); - memset(wad[p].n,0,8); - strncpy(wad[p].n,f_name,8); - wad[p].o=0L;wad[p].l=myfilelength(h);wad[p].f=i; - ++p; - } - continue; - } - *s=0;myfread(s,1,4,h); - if(strncmp(s,"IWAD",4)!=0 && strncmp(s,"PWAD",4)!=0) - ERR_failinit("Нет подписи IWAD или PWAD"); - myfread(&n,1,4,h);myfread(&o,1,4,h);fseek(h,o,SEEK_SET); - for(j=0;j=MAX_WAD) { - if(p>=MAX_WAD) ERR_failinit("Слишком много элементов WAD'а"); - memcpy(wad[p].n,w.n,8); - wad[p].o=w.o;wad[p].l=w.l;wad[p].f=i; - ++p; + + for (i = 1; i < MAX_WADS; ++i) { + if (wads[i][0] != 0) { + logo(" подключается %s\n", wads[i]); + if ((wadh[i] = h = fopen(wads[i], "rb")) == NULL) { + ERR_failinit("Не могу открыть файл2: %s", wads[i]); + } + mysplitpath(wads[i], f_drive, f_dir, f_name, f_ext); + if (strcasecmp(f_ext, ".lmp") == 0) { + for (k = 0; k < MAX_WAD; ++k) { + if (strncasecmp(wad[k].n, f_name, 8) == 0) { + wad[k].o = 0; + wad[k].l = myfilelength(h); + wad[k].f = i; + break; + } + if (k >= MAX_WAD) { + if (p >= MAX_WAD) { + ERR_failinit("Слишком много элементов WAD'а"); + } + memset(wad[p].n, 0, 8); + strncpy(wad[p].n, f_name, 8); + wad[p].o = 0; + wad[p].l = myfilelength(h); + wad[p].f = i; + ++p; + } + } + + s[0] = '\0'; + myfread(s, 1, 4, h); + 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 + fseek(h, o, SEEK_SET); + for (j = 0; j < n; ++j) { + w.o = myread_int32(h); // offset + w.l = myread_int32(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) { + wad[k].o = w.o; + wad[k].l = w.l; + wad[k].f = i; + break; + } + if (k >= MAX_WAD) { + if (p >= MAX_WAD) { + ERR_failinit("Слишком много элементов WAD'а"); + } + memcpy(wad[p].n, w.n, 8); + wad[p].o = w.o; + wad[p].l = w.l; + wad[p].f = i; + ++p; + } + } + } } } - } - wad_num=p; - + } + + wad_num = p; } // allocate resources @@ -364,62 +417,77 @@ void F_randmus(char *s) { } // reads bytes from file until CR -void F_readstr(FILE* h,char *s,int m) { - int i; - static char c; - - for(i=0;;) { - c=13; - myfreadc(&c,1,1,h); - if(c==13) break; - if(i