X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Ffiles.c;h=8189375ee5814b9cba20e68889608cbfdaa85b90;hb=67cafb35d421f7c8ba7ce3ed0aee639731f43bf9;hp=eb6d36e943bbbda1b55d1082d79d7b04c473aade;hpb=e5c2eddc151a59db4e611a77901732d7c15fde90;p=flatwaifu.git diff --git a/src/files.c b/src/files.c index eb6d36e..8189375 100644 --- a/src/files.c +++ b/src/files.c @@ -1,535 +1,161 @@ -/* - Copyright (C) Prikol Software 1996-1997 - Copyright (C) Aleksey Volynskov 1996-1997 - Copyright (C) 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 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 . + */ #include "glob.h" #include #include #include -#include -#include "error.h" -#include "view.h" -#include "items.h" -#include "switch.h" +#include #include "files.h" -#include "map.h" - -char *S_getinfo(void); - -extern void *snd_drv; - -typedef struct{ - byte n,i,v,d; -}dmv; - -byte seq[255],seqn; -dmv *pat=NULL; -unsigned *patp; -void **dmi; - -static int inum=0; - -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]; +#include "error.h" -char wads[MAX_WADS][__MAX_PATH]; -static FILE* wadh[MAX_WADS]; +#include "map.h" // MAP_load -char f_drive[__MAX_DRIVE],f_dir[__MAX_DIR],f_name[__MAX_FNAME],f_ext[__MAX_EXT], - f_path[__MAX_PATH]; +#include "common/streams.h" +#include "common/files.h" +#include "common/wadres.h" +#include "common/cp866.h" -void F_startup(void) { - logo("F_startup: настройка файловой системы\n"); - memset(wads,0,sizeof(wads)); -} +int d_start, d_end; +static int m_start, m_end; +static int s_start, s_end; -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_startup (void) { + logo("F_startup: setup file system\n"); } -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; +void F_addwad (const char *fn) { + static int i = 0; + static FILE_Stream wadh[MAX_WADS]; + if (i < MAX_WADS) { + if (FILE_Open(&wadh[i], fn, "rb")) { + if (WADRES_addwad(&wadh[i].base)) { + i += 1; + } else { + ERR_failinit("Invalid WAD %s", fn); + } + } else { + ERR_failinit("Unable to add WAD %s", fn); + } + } else { + ERR_failinit("Too many wads"); } } -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_loadgame(int n) { - FILE* h; - 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); -} - -void F_addwad(char *fn) { - int i; - - for(i=0;i= 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; +int F_getresid (const char n[8]) { + int i = F_findres(n); + if (i == -1) { + ERR_fatal("F_getresid: resource %.8s not found", n); } - - //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) { - 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; - } - } + return i; +} + +void F_getresname (char n[8], int r) { + WADRES_getname(r, n); +} + +int F_getsprid (const char n[4], int s, int d, char *dir) { + s += 'A'; + d += '0'; + for (int i = s_start + 1; i < s_end; i++) { + char wn[8]; + byte a, b; + WADRES_getname(i, wn); + if (cp866_strncasecmp(wn, n, 4) == 0 && (wn[4] == s || wn[6] == s)) { + a = wn[4] == s ? wn[5] : 0; + b = wn[6] == s ? wn[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; } } - } - - wad_num = p; -} - -// allocate resources -// (called from M_startup) -void F_allocres(void) { - d_start=F_getresid("D_START"); - d_end=F_getresid("D_END"); - m_start=F_getresid("M_START"); - m_end=F_getresid("M_END"); - s_start=F_getresid("S_START"); - s_end=F_getresid("S_END"); -} - -// load resource -void F_loadres(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) - ERR_fatal("Ошибка при чтении файла"); - - if((dword)myfreadc(p,1,l,fh)!=l) - ERR_fatal("Ошибка при загрузке ресурса %.8s",wad[r].n); - - fseek(fh,oo,SEEK_SET); - -} - - -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) - ERR_fatal("Ошибка при чтении файла"); - myfwrite(p,l,1,fh); - fseek(fh,oo,SEEK_SET); - -} - -// get resource id -int F_getresid(char *n) { - 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) - continue; - - if(strncasecmp(wad[i].n,"DMI",3)!=0) break; +void F_nextmus (char *s) { + int 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= m_end) { + i = m_start + 1; } - s[i] = c; - i++; - } - s[i] = 0; -} - -// reads bytes from file until NUL -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) { + WADRES_getname(i, s); + if (cp866_strcasecmp(s, "MENU") == 0 || + cp866_strcasecmp(s, "INTERMUS") == 0 || + cp866_strcasecmp(s, "\x8a\x8e\x8d\x85\x96\x0") == 0) { + continue; + } + if (cp866_strncasecmp(s, "DMI", 3) != 0) { break; } - s[i] = c; - i++; - } - s[i] = 0; -} - -map_block_t blk; - -void F_loadmap(char n[8]) { - - int r; - 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); - hdr.ver = short2host(hdr.ver); - if(memcmp(hdr.id,"Doom2D\x1A",8)!=0) - ERR_fatal("%.8s не является уровнем",n); - for(;;) { - myfread(&blk,1,sizeof(blk),h); - blk.t = short2host(blk.t); - blk.st = short2host(blk.st); - blk.sz = int2host(blk.sz); - 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) { - +void F_randmus (char *s) { int i; - - if(!pat) return; - S_stopmusic(); - free(pat);free(patp); - for(i=0;i