diff --git a/src/files.c b/src/files.c
index 597d149f4cbad222c65e64b1f0e5dcdfc9d12d59..a659f26c47a0569307e1d07479c3b17e6ee890e1 100644 (file)
--- a/src/files.c
+++ b/src/files.c
-/*
- Copyright (C) Prikol Software 1996-1997
- Copyright (C) Aleksey Volynskov 1996-1997
- Copyright (C) <ARembo@gmail.com> 2011
-
- This file is part of the Doom2D:Rembo project.
-
- Doom2D:Rembo is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License version 2 as
- published by the Free Software Foundation.
-
- Doom2D:Rembo is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, see <http://www.gnu.org/licenses/> or
- write to the Free Software Foundation, Inc.,
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-*/
+/* Copyright (C) 1996-1997 Aleksey Volynskov
+ * Copyright (C) 2011 Rambo
+ * Copyright (C) 2020 SovietPony
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License ONLY.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
#include "glob.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
-#include <sys/stat.h>
+#ifdef UNIX
+# include <sys/stat.h>
+#endif
#include "files.h"
#include "map.h"
#include "my.h"
#include "switch.h"
#include "weapons.h"
#include "error.h"
+#include "cp866.h"
typedef struct {
byte n, i, v, d;
} dmv;
int d_start, d_end;
-byte savname[7][24];
-byte savok[7];
mwad_t wad[MAX_WAD];
-map_block_t blk;
+char wads[MAX_WADS][__MAX_PATH];
+FILE* wadh[MAX_WADS];
static byte seq[255];
static byte seqn;
static int s_start, s_end;
static int wad_num;
-static char wads[MAX_WADS][__MAX_PATH];
-static FILE* wadh[MAX_WADS];
-
static char f_drive[__MAX_DRIVE];
static char f_dir[__MAX_DIR];
static char f_name[__MAX_FNAME];
memset(wads,0,sizeof(wads));
}
-static char *getsavfpname (int n, int ro) {
- static char fn[]="savgame0.dat";
- fn[7]=n+'0';
-#ifndef WIN32
- static char p[100];
- char *e = getenv("HOME");
- strncpy(p,e,60);
- strcat(p,"/.doom2d-rembo");
- if (!ro) mkdir(p, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
- strcat(p,"/");
- strcat(p,fn);
-#else
- strcpy(p,fn);
-#endif
- return p;
-}
-
-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;
- 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) {
- 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) {
- short ver;
- 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("Не могу открыть файл2: %s", wads[i]);
}
mysplitpath(wads[i], f_drive, f_dir, f_name, f_ext);
- if (strcasecmp(f_ext, ".lmp") == 0) {
+ if (cp866_strcasecmp(f_ext, ".lmp") == 0) {
for (k = 0; k < MAX_WAD; ++k) {
- if (strncasecmp(wad[k].n, f_name, 8) == 0) {
+ if (cp866_strncasecmp(wad[k].n, f_name, 8) == 0) {
wad[k].o = 0;
wad[k].l = myfilelength(h);
wad[k].f = i;
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) {
+ if (cp866_strncasecmp(wad[k].n, w.n, 8) == 0) {
wad[k].o = w.o;
wad[k].l = w.l;
wad[k].f = i;
*/
// get resource id
-int F_findres (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) {
+ if (cp866_strncasecmp(wad[i].n, n, 8) == 0) {
return i;
}
}
}
// get resource id
-int F_getresid (char *n) {
+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) {
+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;
}
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_loadmap (char n[8]) {
- int r, o;
- FILE *h;
- map_header_t hdr;
- W_init();
- 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(;;) {
- 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) {
int i;