d09022738cc1b2dc8dfcb4e076acec08581e885e
1 /* Copyright (C) 1996-1997 Aleksey Volynskov
2 * Copyright (C) 2011 Rambo
3 * Copyright (C) 2020 SovietPony
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 3 of the License ONLY.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
37 MB_COMMENT
= -1, MB_END
= 0,
38 MB_WALLNAMES
, MB_BACK
, MB_WTYPE
, MB_FRONT
, MB_THING
, MB_SWITCH
,
44 typedef struct map_header_t
{
49 typedef struct map_block_t
{
55 typedef struct old_thing_t
{
61 static map_block_t blk
;
63 static int G_load (FILE *h
) {
66 myfread(g_music
, 8, 1, h
);
68 // F_randmus(g_music);
76 static int IT_load (FILE *h
) {
81 for (i
= 0; blk
.sz
> 0; ++i
, blk
.sz
-= 8) {
90 if (it
[i
].t
&& (it
[i
].s
& THF_DM
) && !g_dm
) {
95 for (i
= 0, j
= -1; i
< m
; ++i
) {
96 if (it
[i
].t
== TH_PLR1
) {
103 ERR_fatal("Предмет игрок_1 не найден");
105 dm_pos
[0].x
= it
[j
].o
.x
;
106 dm_pos
[0].y
= it
[j
].o
.y
;
107 dm_pos
[0].d
= it
[j
].s
& THF_DIR
;
109 for (i
= 0, j
= -1; i
< m
; ++i
) {
110 if (it
[i
].t
== TH_PLR2
) {
117 ERR_fatal("Предмет игрок_2 не найден");
119 dm_pos
[1].x
= it
[j
].o
.x
;
120 dm_pos
[1].y
= it
[j
].o
.y
;
121 dm_pos
[1].d
= it
[j
].s
& THF_DIR
;
123 for (i
= 0, j
= 0; i
< m
; ++i
) {
124 if (it
[i
].t
== TH_DMSTART
) {
126 dm_pos
[j
].x
= it
[i
].o
.x
;
127 dm_pos
[j
].y
= it
[i
].o
.y
;
128 dm_pos
[j
].d
= it
[i
].s
& THF_DIR
;
135 ERR_fatal("Меньше 2-ух точек DM");
139 dm_pl1p
= myrand(dm_pnum
);
141 dm_pl2p
= myrand(dm_pnum
);
142 } while (dm_pl2p
== dm_pl1p
);
148 PL_spawn(&pl1
, dm_pos
[dm_pl1p
].x
, dm_pos
[dm_pl1p
].y
, dm_pos
[dm_pl1p
].d
);
150 PL_spawn(&pl2
, dm_pos
[dm_pl2p
].x
, dm_pos
[dm_pl2p
].y
, dm_pos
[dm_pl2p
].d
);
152 for (i
= 0; i
< m
; ++i
) {
153 if (it
[i
].t
>= TH_CLIP
&& it
[i
].t
< TH_DEMON
) {
155 it
[i
].t
= it
[i
].t
- TH_CLIP
+ I_CLIP
;
156 if (it
[i
].t
>= I_KEYR
&& it
[i
].t
<= I_KEYB
) {
159 } else if (it
[i
].t
>= TH_DEMON
) {
160 MN_spawn(it
[i
].o
.x
, it
[i
].o
.y
, it
[i
].s
& THF_DIR
, it
[i
].t
- TH_DEMON
+ MN_DEMON
);
169 static int SW_load (FILE *h
) {
174 for (i
= 0; i
< MAXSW
&& blk
.sz
> 0; ++i
, blk
.sz
-= 9) {
175 sw
[i
].x
= myfread8(h
);
176 sw
[i
].y
= myfread8(h
);
177 sw
[i
].t
= myfread8(h
);
178 sw
[i
].tm
= myfread8(h
); // unused
179 sw
[i
].a
= myfread8(h
);
180 sw
[i
].b
= myfread8(h
);
181 sw
[i
].c
= myfread8(h
);
182 sw
[i
].d
= myfread8(h
); // unused
183 sw
[i
].f
= myfread8(h
);
187 if (sw
[i
].t
== SW_SECRET
) {
196 static void unpack (void *buf
, int len
, void *obuf
) {
199 unsigned char *p
= buf
;
200 unsigned char *q
= obuf
;
206 step
= p
[i
] | p
[i
+ 1] << 8;
210 memset(&q
[j
], id
, step
);
215 static int read_array (void *p
, FILE *h
) {
219 myfread(p
, FLDW
* FLDH
, 1, h
);
222 buf
= malloc(blk
.sz
);
224 ERR_fatal("Не хватает памяти");
226 myfread(buf
, blk
.sz
, 1, h
);
227 unpack(buf
, blk
.sz
, p
);
236 static int W_load (FILE *h
) {
242 memset(walf
, 0, sizeof(walf
));
243 for (i
= 1; i
< 256 && blk
.sz
> 0; i
++, blk
.sz
-= 9) {
245 walf
[i
] = myfread8(h
) ? 1 : 0; // ???
247 if (strncasecmp(s
, "VTRAP01", 8) == 0) {
254 return read_array(fldb
, h
);
256 return read_array(fld
, h
);
258 return read_array(fldf
, h
);
260 sky_type
= myfread16(h
);
267 void F_loadmap (char n
[8]) {
274 fseek(h
, wad
[r
].o
, SEEK_SET
);
275 myfread(hdr
.id
, 8, 1, h
);
276 hdr
.ver
= myfread16(h
);
277 if (memcmp(hdr
.id
, "Doom2D\x1A", 8) != 0) {
278 ERR_fatal("%.8s не является уровнем", n
);
281 blk
.t
= myfread16(h
);
282 blk
.st
= myfread16(h
);
283 blk
.sz
= myfread32(h
);
284 if(blk
.t
== MB_END
) {
287 if(blk
.t
== MB_COMMENT
) {
288 fseek(h
, blk
.sz
, SEEK_CUR
);
291 o
= ftell(h
) + blk
.sz
;
296 ERR_fatal("Неизвестный блок %d(%d) в уровне %.8s", blk
.t
, blk
.st
, n
);
301 fseek(h
, o
, SEEK_SET
);