diff --git a/src/files.c b/src/files.c
index 220d72cd254e4e9957ef83d5ff325aad2c4b4a83..f7037cf435be55a4cee9f25d344a48ee0389f3ef 100644 (file)
--- a/src/files.c
+++ b/src/files.c
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
-#include "error.h"
+#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"
-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;
+byte savname[7][24];
+byte savok[7];
+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));
}
-char *getsavfpname(int n, int ro)
-{
+static char *getsavfpname (int n, int ro) {
static char fn[]="savgame0.dat";
fn[7]=n+'0';
#ifndef WIN32
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) {
+void F_addwad (const char *fn) {
int i;
for(i=0;i<MAX_WADS;++i) if(wads[i][0]==0) {
ERR_failinit("Не могу добавить WAD %s",fn);
}
-
-int myfilelength(FILE *h)
-{
+static int myfilelength (FILE *h) {
int pos = ftell(h);
fseek (h, 0, SEEK_END);
int len = ftell(h);
return len;
}
-extern void mysplitpath(const char* path, char* drv, char* dir, char* name, char* ext);
-
// 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;++i) wad[i].n[0]=0;
- logo(" подключается %s\n",wads[0]);
- if((wadh[0]=h=fopen(wads[0],"rb"))==NULL)//if((wadh[0]=h=open(wads[0],O_RDWR|O_BINARY))==-1)
- ERR_failinit("Не могу открыть файл: %s",wads[0]);//sys_errlist[errno]);
- *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,p=0;j<n;++j) {
- myfread(&w,1,16,h);
- 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=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_WADS;++i) if(wads[i][0]!=0) {
-
- logo(" подключается %s\n",wads[i]);
- if((wadh[i]=h=fopen(wads[i], "rb"))==NULL) //if((wadh[i]=h=open(wads[i],O_RDONLY|O_BINARY))==-1)
- ERR_failinit("Не могу открыть файл2: %s",wads[i]);//sys_errlist[errno]);
- 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=0L;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=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<n;++j) {
- myfread(&w,1,16,h);
- 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;
+
+ 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 = 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 (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");
}
// 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;
}
-
-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<wad_num;++i) if(strncasecmp(wad[i].n,n,8)==0) return i;
- ERR_fatal("F_getresid: ресурс %.8s не найден",n);
+ for (i = 0; i < wad_num; i++) {
+ if (strncasecmp(wad[i].n, n, 8) == 0) {
+ return i;
+ }
+ }
return -1;
}
// get resource id
-int F_findres(char *n) {
- int i;
-
- for(i=0;i<wad_num;++i) if(strncasecmp(wad[i].n,n,8)==0) return i;
- return -1;
+int F_getresid (const char n[8]) {
+ int i = F_findres(n);
+ if (i == -1) {
+ ERR_fatal("F_getresid: ресурс %.8s не найден", n);
+ }
+ return i;
}
-void F_getresname(char *n,int r) {
- memcpy(n,wad[r].n,8);
+void F_getresname (char n[8], int r) {
+ memcpy(n, wad[r].n, 8);
}
// get sprite id
-int F_getsprid(char n[4],int s,int d) {
+int F_getsprid (const char n[4], int s, int d) {
int i;
byte a,b;
return -1;
}
-int F_getreslen(int r) {
+int F_getreslen (int r) {
return wad[r].l;
}
-void F_nextmus(char *s) {
+void F_nextmus (char *s) {
int i;
i=F_findres(s);
if(i<=m_start || i>=m_end) i=m_start;
memcpy(s,wad[i].n,8);
}
-void F_randmus(char *s) {
- int n = myrand(10);
- int i;
- for (i=0; i<n; i++) {
- F_nextmus(s);
- }
+void F_randmus (char *s) {
+ int i;
+ int n = myrand(10);
+ for (i = 0; i < n; i++) {
+ F_nextmus(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<m) s[i++]=c;
+void F_readstr (FILE* h, char *s, int m) {
+ int i = 0;
+ size_t len = 0;
+ static char c = 0;
+ while (i < m) {
+ c = 13;
+ len = myfreadc(&c, 1, 1, h);
+ if (len == 0 || c == 13 || c == 10) {
+ break;
+ }
+ s[i] = c;
+ i++;
}
- s[i]=0;
+ s[i] = 0;
}
+/*
+// unused
// reads bytes from file until NUL
-void F_readstrz(FILE* h,char *s,int m) {
- int i;
- static char c;
-
- for(i=0;;) {
- c=0;
- myfreadc(&c,1,1,h);
- if(c==0) break;
- if(i<m) s[i++]=c;
+void F_readstrz (FILE* h,char *s,int m) {
+ int i = 0;
+ size_t len = 0;
+ static char c = 0;
+ while (i < m) {
+ c = 0;
+ len = myfreadc(&c, 1, 1, h);
+ if (len == 0 || c == 0) {
+ break;
+ }
+ s[i] = c;
+ i++;
}
- s[i]=0;
+ s[i] = 0;
}
+*/
-map_block_t blk;
-
-void F_loadmap(char n[8]) {
-
- int r;
+void F_loadmap (char n[8]) {
+ 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);
- 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);
- 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) {