2 Copyright (C) Prikol Software 1996-1997
3 Copyright (C) Aleksey Volynskov 1996-1997
4 Copyright (C) <ARembo@gmail.com> 2011
6 This file is part of the Doom2D:Rembo project.
8 Doom2D:Rembo is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License version 2 as
10 published by the Free Software Foundation.
12 Doom2D:Rembo is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, see <http://www.gnu.org/licenses/> or
19 write to the Free Software Foundation, Inc.,
20 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
30 //#include <sys\stat.h>
43 char *S_getinfo(void);
58 void G_savegame(FILE*);
59 void W_savegame(FILE*);
60 void DOT_savegame(FILE*);
61 void SMK_savegame(FILE*);
62 void FX_savegame(FILE*);
63 void IT_savegame(FILE*);
64 void MN_savegame(FILE*);
65 void PL_savegame(FILE*);
66 void SW_savegame(FILE*);
67 void WP_savegame(FILE*);
69 void G_loadgame(FILE*);
70 void W_loadgame(FILE*);
71 void DOT_loadgame(FILE*);
72 void SMK_loadgame(FILE*);
73 void FX_loadgame(FILE*);
74 void IT_loadgame(FILE*);
75 void MN_loadgame(FILE*);
76 void PL_loadgame(FILE*);
77 void SW_loadgame(FILE*);
78 void WP_loadgame(FILE*);
80 byte savname
[7][24],savok
[7];
82 int d_start
,d_end
,m_start
,m_end
,s_start
,s_end
,wad_num
;
85 char wads
[MAX_WADS
][__MAX_PATH
];
86 static FILE* wadh
[MAX_WADS
];
88 char f_drive
[__MAX_DRIVE
],f_dir
[__MAX_DIR
],f_name
[__MAX_FNAME
],f_ext
[__MAX_EXT
],
91 void F_startup(void) {
92 logo("F_startup: настройка файловой системы\n");
93 memset(wads
,0,sizeof(wads
));
96 void F_getsavnames(void) {
99 static char n
[]="SAVGAME0.DAT";
103 n
[7]=i
+'0';memset(savname
[i
],0,24);savok
[i
]=0;
104 if((h
=fopen(n
,"rb"))==NULL
) continue; //if((h=open(n,O_RDONLY|O_BINARY))==-1) continue;
105 myfread(savname
[i
],1,24,h
);ver
=-1;myfread(&ver
,1,2,h
);
106 fclose(h
);savname
[i
][23]=0;savok
[i
]=(ver
==3)?1:0;//savok[i]=(ver==2)?1:0;
110 void F_savegame(int n
,char *s
) {
113 static char fn
[]="SAVGAME0.DAT";
116 if((h
=fopen(fn
,"wb"))==NULL
) return;
117 myfwrite(s
,1,24,h
);myfwrite("\3\0",1,2,h
);//myfwrite("\2\0",1,2,h);
132 void F_loadgame(int n
) {
134 static char fn
[]="SAVGAME0.DAT";
138 if((h
=fopen(fn
,"rb"))==NULL
) return;//if((h=open(fn,O_BINARY|O_RDONLY))==-1) return;
139 fseek(h
,24,SEEK_SET
);myfread(&ver
,1,2,h
);if(ver
!=3) return;//if(ver!=2) return;
153 void F_addwad(char *fn
) {
156 for(i
=0;i
<MAX_WADS
;++i
) if(wads
[i
][0]==0) {
157 strcpy(wads
[i
],fn
);return;
159 ERR_failinit("Не могу добавить WAD %s",fn
);
163 int myfilelength(FILE *h
)
166 fseek (h
, 0, SEEK_END
);
168 fseek (h
, pos
, SEEK_SET
);
172 extern void mysplitpath(const char* path
, char* drv
, char* dir
, char* name
, char* ext
);
174 // build wad directory
175 void F_initwads(void) {
182 logo("F_initwads: подключение WAD-файлов\n");
183 for(i
=0;i
<MAX_WAD
;++i
) wad
[i
].n
[0]=0;
184 logo(" подключается %s\n",wads
[0]);
185 if((wadh
[0]=h
=fopen(wads
[0],"rb"))==NULL
)//if((wadh[0]=h=open(wads[0],O_RDWR|O_BINARY))==-1)
186 ERR_failinit("Не могу открыть файл: %s",wads
[0]);//sys_errlist[errno]);
187 *s
=0;myfread(s
,1,4,h
);
188 if(strncmp(s
,"IWAD",4)!=0 && strncmp(s
,"PWAD",4)!=0)
189 ERR_failinit("Нет подписи IWAD или PWAD");
190 myfread(&n
,1,4,h
);myfread(&o
,1,4,h
);fseek(h
,o
,SEEK_SET
);
191 for(j
=0,p
=0;j
<n
;++j
) {
193 if(p
>=MAX_WAD
) ERR_failinit("Слишком много элементов WAD'а");
194 memcpy(wad
[p
].n
,w
.n
,8);
195 wad
[p
].o
=w
.o
;wad
[p
].l
=w
.l
;wad
[p
].f
=0;
199 for(i
=1;i
<MAX_WADS
;++i
) if(wads
[i
][0]!=0) {
201 logo(" подключается %s\n",wads
[i
]);
202 if((wadh
[i
]=h
=fopen(wads
[i
], "rb"))==NULL
) //if((wadh[i]=h=open(wads[i],O_RDONLY|O_BINARY))==-1)
203 ERR_failinit("Не могу открыть файл2: %s",wads
[i
]);//sys_errlist[errno]);
204 mysplitpath(wads
[i
],f_drive
,f_dir
,f_name
,f_ext
);
205 if(strcasecmp(f_ext
,".lmp")==0) {
206 for(k
=0;k
<MAX_WAD
;++k
) if(strncasecmp(wad
[k
].n
,f_name
,8)==0)
207 {wad
[k
].o
=0L;wad
[k
].l
=myfilelength(h
);wad
[k
].f
=i
;break;}
209 if(p
>=MAX_WAD
) ERR_failinit("Слишком много элементов WAD'а");
210 memset(wad
[p
].n
,0,8);
211 strncpy(wad
[p
].n
,f_name
,8);
212 wad
[p
].o
=0L;wad
[p
].l
=myfilelength(h
);wad
[p
].f
=i
;
217 *s
=0;myfread(s
,1,4,h
);
218 if(strncmp(s
,"IWAD",4)!=0 && strncmp(s
,"PWAD",4)!=0)
219 ERR_failinit("Нет подписи IWAD или PWAD");
220 myfread(&n
,1,4,h
);myfread(&o
,1,4,h
);fseek(h
,o
,SEEK_SET
);
223 for(k
=0;k
<MAX_WAD
;++k
) if(strncasecmp(wad
[k
].n
,w
.n
,8)==0)
224 {wad
[k
].o
=w
.o
;wad
[k
].l
=w
.l
;wad
[k
].f
=i
;break;}
226 if(p
>=MAX_WAD
) ERR_failinit("Слишком много элементов WAD'а");
227 memcpy(wad
[p
].n
,w
.n
,8);
228 wad
[p
].o
=w
.o
;wad
[p
].l
=w
.l
;wad
[p
].f
=i
;
237 // allocate resources
238 // (called from M_startup)
239 void F_allocres(void) {
240 d_start
=F_getresid("D_START");
241 d_end
=F_getresid("D_END");
242 m_start
=F_getresid("M_START");
243 m_end
=F_getresid("M_END");
244 s_start
=F_getresid("S_START");
245 s_end
=F_getresid("S_END");
249 void F_loadres(int r
,void *p
,dword o
,dword l
) {
255 oo
=ftell(fh
=wadh
[wad
[r
].f
]);
257 if(fseek(fh
,wad
[r
].o
+o
,SEEK_SET
)!=0)
258 ERR_fatal("Ошибка при чтении файла");
260 if((dword
)myfreadc(p
,1,l
,fh
)!=l
)
261 ERR_fatal("Ошибка при загрузке ресурса %.8s",wad
[r
].n
);
263 fseek(fh
,oo
,SEEK_SET
);
268 void F_saveres(int r
,void *p
,dword o
,dword l
) {
272 oo
=ftell(fh
=wadh
[wad
[r
].f
]);
273 if(fseek(fh
,wad
[r
].o
+o
,SEEK_SET
)!=0)
274 ERR_fatal("Ошибка при чтении файла");
276 fseek(fh
,oo
,SEEK_SET
);
281 int F_getresid(char *n
) {
284 for(i
=0;i
<wad_num
;++i
) if(strncasecmp(wad
[i
].n
,n
,8)==0) return i
;
285 ERR_fatal("F_getresid: ресурс %.8s не найден",n
);
290 int F_findres(char *n
) {
293 for(i
=0;i
<wad_num
;++i
) if(strncasecmp(wad
[i
].n
,n
,8)==0) return i
;
297 void F_getresname(char *n
,int r
) {
298 memcpy(n
,wad
[r
].n
,8);
302 int F_getsprid(char n
[4],int s
,int d
) {
307 for(i
=s_start
+1;i
<s_end
;++i
)
308 if(strncasecmp(wad
[i
].n
,n
,4)==0 && (wad
[i
].n
[4]==s
|| wad
[i
].n
[6]==s
)) {
309 if(wad
[i
].n
[4]==s
) a
=wad
[i
].n
[5]; else a
=0;
310 if(wad
[i
].n
[6]==s
) b
=wad
[i
].n
[7]; else b
=0;
312 if(b
=='0') return(i
|0x8000);
314 if(b
==d
) return(i
|0x8000);
316 ERR_fatal("F_getsprid: изображение %.4s%c%c не найдено",n
,(byte
)s
,(byte
)d
);
320 int F_getreslen(int r
) {
324 void F_nextmus(char *s
) {
327 if(i
<=m_start
|| i
>=m_end
) i
=m_start
;
329 if(i
>=m_end
) i
=m_start
+1;
331 if (strcasecmp(wad
[i
].n
,"MENU") == 0 ||
332 strcasecmp(wad
[i
].n
,"INTERMUS") == 0 ||
333 strcasecmp(wad
[i
].n
,"\x8a\x8e\x8d\x85\x96\x0") == 0)
336 if(strncasecmp(wad
[i
].n
,"DMI",3)!=0) break;
338 memcpy(s
,wad
[i
].n
,8);
341 void F_randmus(char *s
) {
344 for (i
=0; i
<n
; i
++) {
349 // reads bytes from file until CR
350 void F_readstr(FILE* h
,char *s
,int m
) {
363 // reads bytes from file until NUL
364 void F_readstrz(FILE* h
,char *s
,int m
) {
379 void F_loadmap(char n
[8]) {
388 fseek(h
=wadh
[wad
[r
].f
],wad
[r
].o
,SEEK_SET
);
389 myfread(&hdr
,1,sizeof(hdr
),h
);
390 if(memcmp(hdr
.id
,"Doom2D\x1A",8)!=0)
391 ERR_fatal("%.8s не является уровнем",n
);
393 myfread(&blk
,1,sizeof(blk
),h
);
394 if(blk
.t
==MB_END
) break;
395 if(blk
.t
==MB_COMMENT
)
396 {fseek(h
,blk
.sz
,SEEK_CUR
);continue;}
402 ERR_fatal("Неизвестный блок %d(%d) в уровне %.8s",blk
.t
,blk
.st
,n
);
408 /*void F_freemus(void) {
414 free(pat);free(patp);
415 for(i=0;i<inum;++i) if(dmi[i]!=NULL) free(dmi[i]);
422 /*void F_loadmus(char n[8]) {
431 struct{byte t;char n[13];word r;}di;
433 if((r=F_findres(n))==-1) return;
434 fseek(h=wadh[wad[r].f],wad[r].o,SEEK_SET);
435 myfread(&d,1,sizeof(d),h);
436 if(memcmp(d.id,"DMM",4)!=0) return;
437 if(!(pat=malloc(d.psz<<2))) return;
438 myfread(pat,1,d.psz<<2,h);
439 myfread(&seqn,1,1,h);if(seqn) myfread(seq,1,seqn,h);
440 inum=0;myfread(&inum,1,1,h);
441 if(!(dmi=malloc(inum*4))) {free(pat);pat=NULL;return;}
442 if(!(patp=malloc((word)d.pat*32))) {free(pat);free(dmi);pat=NULL;return;}
443 for(i=0;i<inum;++i) {
445 myfread(&di,1,16,h);o=ftell(h);
446 for(r=0;r<12;++r) if(di.n[r]=='.') di.n[r]=0;
447 if((r=F_findres(di.n))==-1) continue;
448 if(!(dmi[i]=malloc(wad[r].l+8))) continue;
450 F_loadres(r,dmi[i],0,2);
451 F_loadres(r,(int*)dmi[i]+1,2,2);
452 F_loadres(r,(int*)dmi[i]+2,4,2);
453 F_loadres(r,(int*)dmi[i]+3,6,2);
454 F_loadres(r,(int*)dmi[i]+4,8,wad[r].l-8);
457 for(i=r=0,j=(word)d.pat<<3;i<j;++i) {
459 while(pat[r++].v!=0x80);