20 MB_COMMENT
= -1, MB_END
= 0,
21 MB_WALLNAMES
, MB_BACK
, MB_WTYPE
, MB_FRONT
, MB_THING
, MB_SWITCH
,
27 typedef struct map_header_t
{
32 typedef struct map_block_t
{
38 typedef struct old_thing_t
{
44 static map_block_t blk
;
46 static int G_load (FILE *h
) {
49 myfread(g_music
, 8, 1, h
);
51 // F_randmus(g_music);
59 static int IT_load (FILE *h
) {
64 for (i
= 0; blk
.sz
> 0; ++i
, blk
.sz
-= 8) {
73 if (it
[i
].t
&& (it
[i
].s
& THF_DM
) && !g_dm
) {
78 for (i
= 0, j
= -1; i
< m
; ++i
) {
79 if (it
[i
].t
== TH_PLR1
) {
86 ERR_fatal("Предмет игрок_1 не найден");
88 dm_pos
[0].x
= it
[j
].o
.x
;
89 dm_pos
[0].y
= it
[j
].o
.y
;
90 dm_pos
[0].d
= it
[j
].s
& THF_DIR
;
92 for (i
= 0, j
= -1; i
< m
; ++i
) {
93 if (it
[i
].t
== TH_PLR2
) {
100 ERR_fatal("Предмет игрок_2 не найден");
102 dm_pos
[1].x
= it
[j
].o
.x
;
103 dm_pos
[1].y
= it
[j
].o
.y
;
104 dm_pos
[1].d
= it
[j
].s
& THF_DIR
;
106 for (i
= 0, j
= 0; i
< m
; ++i
) {
107 if (it
[i
].t
== TH_DMSTART
) {
109 dm_pos
[j
].x
= it
[i
].o
.x
;
110 dm_pos
[j
].y
= it
[i
].o
.y
;
111 dm_pos
[j
].d
= it
[i
].s
& THF_DIR
;
118 ERR_fatal("Меньше 2-ух точек DM");
122 dm_pl1p
= myrand(dm_pnum
);
124 dm_pl2p
= myrand(dm_pnum
);
125 } while (dm_pl2p
== dm_pl1p
);
131 PL_spawn(&pl1
, dm_pos
[dm_pl1p
].x
, dm_pos
[dm_pl1p
].y
, dm_pos
[dm_pl1p
].d
);
133 PL_spawn(&pl2
, dm_pos
[dm_pl2p
].x
, dm_pos
[dm_pl2p
].y
, dm_pos
[dm_pl2p
].d
);
135 for (i
= 0; i
< m
; ++i
) {
136 if (it
[i
].t
>= TH_CLIP
&& it
[i
].t
< TH_DEMON
) {
138 it
[i
].t
= it
[i
].t
- TH_CLIP
+ I_CLIP
;
139 if (it
[i
].t
>= I_KEYR
&& it
[i
].t
<= I_KEYB
) {
142 } else if (it
[i
].t
>= TH_DEMON
) {
143 MN_spawn(it
[i
].o
.x
, it
[i
].o
.y
, it
[i
].s
& THF_DIR
, it
[i
].t
- TH_DEMON
+ MN_DEMON
);
152 static int SW_load (FILE *h
) {
157 for (i
= 0; i
< MAXSW
&& blk
.sz
> 0; ++i
, blk
.sz
-= 9) {
158 sw
[i
].x
= myfread8(h
);
159 sw
[i
].y
= myfread8(h
);
160 sw
[i
].t
= myfread8(h
);
161 sw
[i
].tm
= myfread8(h
); // unused
162 sw
[i
].a
= myfread8(h
);
163 sw
[i
].b
= myfread8(h
);
164 sw
[i
].c
= myfread8(h
);
165 sw
[i
].d
= myfread8(h
); // unused
166 sw
[i
].f
= myfread8(h
);
170 if (sw
[i
].t
== SW_SECRET
) {
179 static void unpack (void *buf
, int len
, void *obuf
) {
182 unsigned char *p
= buf
;
183 unsigned char *q
= obuf
;
189 step
= p
[i
] | p
[i
+ 1] << 8;
193 memset(&q
[j
], id
, step
);
198 static int read_array (void *p
, FILE *h
) {
202 myfread(p
, FLDW
* FLDH
, 1, h
);
205 buf
= malloc(blk
.sz
);
207 ERR_fatal("Не хватает памяти");
209 myfread(buf
, blk
.sz
, 1, h
);
210 unpack(buf
, blk
.sz
, p
);
219 static int W_load (FILE *h
) {
225 memset(walf
, 0, sizeof(walf
));
226 for (i
= 1; i
< 256 && blk
.sz
> 0; i
++, blk
.sz
-= 9) {
228 walf
[i
] = myfread8(h
) ? 1 : 0; // ???
230 if (strncasecmp(s
, "VTRAP01", 8) == 0) {
237 return read_array(fldb
, h
);
239 return read_array(fld
, h
);
241 return read_array(fldf
, h
);
243 sky_type
= myfread16(h
);
250 void F_loadmap (char n
[8]) {
257 fseek(h
, wad
[r
].o
, SEEK_SET
);
258 myfread(hdr
.id
, 8, 1, h
);
259 hdr
.ver
= myfread16(h
);
260 if (memcmp(hdr
.id
, "Doom2D\x1A", 8) != 0) {
261 ERR_fatal("%.8s не является уровнем", n
);
264 blk
.t
= myfread16(h
);
265 blk
.st
= myfread16(h
);
266 blk
.sz
= myfread32(h
);
267 if(blk
.t
== MB_END
) {
270 if(blk
.t
== MB_COMMENT
) {
271 fseek(h
, blk
.sz
, SEEK_CUR
);
274 o
= ftell(h
) + blk
.sz
;
279 ERR_fatal("Неизвестный блок %d(%d) в уровне %.8s", blk
.t
, blk
.st
, n
);
284 fseek(h
, o
, SEEK_SET
);