DEADSOFTWARE

save: move save code to separated file
[flatwaifu.git] / src / files.c
index 97e69eb73e31dd94fb53f6a8722b3fccf42f9463..47aaa71eb1a65a2b2997471566b3fa3795f5456d 100644 (file)
 
 #include "glob.h"
 #include <stdio.h>
-//#include <conio.h>
-#include <malloc.h>
-//#include <dos.h>
 #include <string.h>
 #include <stdlib.h>
-//#include <sys\stat.h>
-#include "vga.h"
-#include "error.h"
-#include "sound.h"
-//#include "snddrv.h"
-#include "memory.h"
+#include <sys/stat.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"
+#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_WADS;++i) if(wads[i][0]==0) {
@@ -159,9 +82,7 @@ void F_addwad(char *fn) {
   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);
@@ -169,74 +90,119 @@ int myfilelength(FILE *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];
-  long 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 (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<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 (cp866_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, char *dir) {
   int i;
-  byte a,b;
-
-  s+='A';d+='0';
-  for(i=s_start+1;i<s_end;++i)
-    if(strncasecmp(wad[i].n,n,4)==0 && (wad[i].n[4]==s || wad[i].n[6]==s)) {
-      if(wad[i].n[4]==s) a=wad[i].n[5]; else a=0;
-      if(wad[i].n[6]==s) b=wad[i].n[7]; else b=0;
-      if(a=='0') return i;
-      if(b=='0') return(i|0x8000);
-      if(a==d) return i;
-      if(b==d) return(i|0x8000);
+  byte a, b;
+  s += 'A';
+  d += '0';
+  for (i = s_start + 1; i < s_end; i++) {
+    if (cp866_strncasecmp(wad[i].n, n, 4) == 0 && (wad[i].n[4] == s || wad[i].n[6] == s)) {
+      a = wad[i].n[4] == s ? wad[i].n[5] : 0;
+      b = wad[i].n[6] == s ? wad[i].n[7] : 0;
+      if (a == '0' || b == '0' || a == d || b == d) {
+        if (dir != NULL) {
+          *dir = a != '0' && b == '0' || a != d && b == d;
+        }
+        return i;
+      }
     }
-  ERR_fatal("F_getsprid: изображение %.4s%c%c не найдено",n,(byte)s,(byte)d);
+  }
+  ERR_fatal("F_getsprid: image %.4s%c%c not found", n, s, d);
   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;
   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<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) {