X-Git-Url: https://deadsoftware.ru/gitweb?p=flatwaifu.git;a=blobdiff_plain;f=src%2Ffiles.c;h=47aaa71eb1a65a2b2997471566b3fa3795f5456d;hp=97e69eb73e31dd94fb53f6a8722b3fccf42f9463;hb=563dffaf02ff36da4054f937fcc9f99a072e15bf;hpb=a2115940e7643dcb1b87286f3d19fe95f7b79bd3 diff --git a/src/files.c b/src/files.c index 97e69eb..47aaa71 100644 --- a/src/files.c +++ b/src/files.c @@ -22,135 +22,58 @@ #include "glob.h" #include -//#include -#include -//#include #include #include -//#include -#include "vga.h" -#include "error.h" -#include "sound.h" -//#include "snddrv.h" -#include "memory.h" +#include +#include "files.h" +#include "map.h" +#include "my.h" +#include "game.h" #include "view.h" +#include "dots.h" +#include "smoke.h" +#include "fx.h" #include "items.h" +#include "monster.h" +#include "player.h" #include "switch.h" -#include "files.h" -#include "map.h" - - -char *S_getinfo(void); - -extern void *snd_drv; +#include "weapons.h" +#include "error.h" +#include "cp866.h" -typedef struct{ - byte n,i,v,d; -}dmv; +typedef struct { + byte n, i, v, d; +} dmv; -byte seq[255],seqn; -dmv *pat=NULL; -unsigned *patp; -void **dmi; +int d_start, d_end; +mwad_t wad[MAX_WAD]; +map_block_t blk; +static byte seq[255]; +static byte seqn; static int inum=0; +static dmv *pat=NULL; +static unsigned *patp; +static void **dmi; -void G_savegame(FILE*); -void W_savegame(FILE*); -void DOT_savegame(FILE*); -void SMK_savegame(FILE*); -void FX_savegame(FILE*); -void IT_savegame(FILE*); -void MN_savegame(FILE*); -void PL_savegame(FILE*); -void SW_savegame(FILE*); -void WP_savegame(FILE*); - -void G_loadgame(FILE*); -void W_loadgame(FILE*); -void DOT_loadgame(FILE*); -void SMK_loadgame(FILE*); -void FX_loadgame(FILE*); -void IT_loadgame(FILE*); -void MN_loadgame(FILE*); -void PL_loadgame(FILE*); -void SW_loadgame(FILE*); -void WP_loadgame(FILE*); - -byte savname[7][24],savok[7]; - -int d_start,d_end,m_start,m_end,s_start,s_end,wad_num; -mwad_t wad[MAX_WAD]; +static int m_start, m_end; +static int s_start, s_end; +static int wad_num; -char wads[MAX_WADS][__MAX_PATH]; +static char wads[MAX_WADS][__MAX_PATH]; static FILE* wadh[MAX_WADS]; -char f_drive[__MAX_DRIVE],f_dir[__MAX_DIR],f_name[__MAX_FNAME],f_ext[__MAX_EXT], - f_path[__MAX_PATH]; +static char f_drive[__MAX_DRIVE]; +static char f_dir[__MAX_DIR]; +static char f_name[__MAX_FNAME]; +static char f_ext[__MAX_EXT]; -void F_startup(void) { +void F_startup (void) { logo("F_startup: настройка файловой системы\n"); memset(wads,0,sizeof(wads)); } -void F_getsavnames(void) { - - int i; FILE *h; - static char n[]="SAVGAME0.DAT"; - short ver; - - for(i=0;i<7;++i) { - n[7]=i+'0';memset(savname[i],0,24);savok[i]=0; - if((h=fopen(n,"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; - } -} - -void F_savegame(int n,char *s) { - - FILE* h; - static char fn[]="SAVGAME0.DAT"; - - fn[7]=n+'0'; - if((h=fopen(fn,"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_loadgame(int n) { - FILE* h; - static char fn[]="SAVGAME0.DAT"; - short ver; - - fn[7]=n+'0'; - if((h=fopen(fn,"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); -} - -void F_addwad(char *fn) { +void F_addwad (const char *fn) { int i; 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 = myfread32(h); // num + o = myfread32(h); // offset + fseek(h, o, SEEK_SET); + for (j = 0; j < n; ++j) { + w.o = myfread32(h); // offset + w.l = myfread32(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 (cp866_strcasecmp(f_ext, ".lmp") == 0) { + for (k = 0; k < MAX_WAD; ++k) { + if (cp866_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 = myfread32(h); // num + o = myfread32(h); // offset + fseek(h, o, SEEK_SET); + for (j = 0; j < n; ++j) { + 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 (cp866_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 // (called from M_startup) -void F_allocres(void) { +void F_allocres (void) { d_start=F_getresid("D_START"); d_end=F_getresid("D_END"); m_start=F_getresid("M_START"); @@ -246,7 +212,7 @@ void F_allocres(void) { } // load resource -void F_loadres(int r,void *p,dword o,dword l) { +void F_loadres (int r, void *p, dword o, dword l) { int oo; FILE *fh; @@ -264,145 +230,167 @@ void F_loadres(int r,void *p,dword o,dword l) { } - -void F_saveres(int r,void *p,dword o,dword l) { - - int oo; - FILE* fh; - oo=ftell(fh=wadh[wad[r].f]); - if(fseek(fh,wad[r].o+o,SEEK_SET)!=0) +/* +// unused +void F_saveres(int r, void *p, dword o, dword l) { + FILE* fh = wadh[wad[r].f]; + int oo = ftell(fh); + if (fseek(fh, wad[r].o + o, SEEK_SET) != 0) { ERR_fatal("Ошибка при чтении файла"); - myfwrite(p,l,1,fh); - fseek(fh,oo,SEEK_SET); - + } + myfwrite(p, l, 1, fh); + fseek(fh, oo, SEEK_SET); } +*/ // get resource id -int F_getresid(char *n) { +int F_findres (const char n[8]) { int i; - - for(i=0;i=m_end) i=m_start; for(++i;;++i) { if(i>=m_end) i=m_start+1; - if (strcasecmp(wad[i].n,"MENU") == 0 || - strcasecmp(wad[i].n,"INTERMUS") == 0 || - strcasecmp(wad[i].n,"\x8a\x8e\x8d\x85\x96\x0") == 0) + if (cp866_strcasecmp(wad[i].n,"MENU") == 0 || + cp866_strcasecmp(wad[i].n,"INTERMUS") == 0 || + cp866_strcasecmp(wad[i].n,"\x8a\x8e\x8d\x85\x96\x0") == 0) continue; - if(strncasecmp(wad[i].n,"DMI",3)!=0) break; + if(cp866_strncasecmp(wad[i].n,"DMI",3)!=0) break; } memcpy(s,wad[i].n,8); } -void F_randmus(char *s) { - int n = myrand(10); - int i; - for (i=0; i