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
34 extern map_block_t blk
;
45 static sw_t sw
[MAXSW
];
47 static void *sndswn
,*sndswx
,*sndnoway
,*sndbdo
,*sndbdc
,*sndnotele
;
52 void SW_savegame (FILE *h
) {
54 for (n
= MAXSW
- 1; n
>= 0 && sw
[n
].t
== 0; n
--) {
59 for (i
= 0; i
< n
; i
++) {
60 myfwrite8(sw
[i
].x
, h
);
61 myfwrite8(sw
[i
].y
, h
);
62 myfwrite8(sw
[i
].t
, h
);
63 myfwrite8(sw
[i
].tm
, h
);
64 myfwrite8(sw
[i
].a
, h
);
65 myfwrite8(sw
[i
].b
, h
);
66 myfwrite8(sw
[i
].c
, h
);
67 myfwrite8(sw
[i
].d
, h
);
68 myfwrite8(sw
[i
].f
, h
);
70 myfwrite32(sw_secrets
, h
);
73 void SW_loadgame (FILE *h
) {
76 for (i
= 0; i
< n
; i
++) {
77 myfread8(&sw
[i
].x
, h
);
78 myfread8(&sw
[i
].y
, h
);
79 myfread8(&sw
[i
].t
, h
);
80 myfread8(&sw
[i
].tm
, h
);
81 myfread8(&sw
[i
].a
, h
);
82 myfread8(&sw
[i
].b
, h
);
83 myfread8(&sw
[i
].c
, h
);
84 myfread8(&sw
[i
].d
, h
);
85 myfread8(&sw
[i
].f
, h
);
87 myfread32(&sw_secrets
, h
);
90 int SW_load (FILE *h
) {
95 for (i
= 0; i
< MAXSW
&& blk
.sz
> 0; ++i
, blk
.sz
-= 9) {
96 myfread8(&sw
[i
].x
, h
);
97 myfread8(&sw
[i
].y
, h
);
98 myfread8(&sw
[i
].t
, h
);
99 myfread8(&sw
[i
].tm
, h
); // unused
100 myfread8(&sw
[i
].a
, h
);
101 myfread8(&sw
[i
].b
, h
);
102 myfread8(&sw
[i
].c
, h
);
103 myfread8(&sw
[i
].d
, h
); // unused
104 myfread8(&sw
[i
].f
, h
);
108 if (sw
[i
].t
== SW_SECRET
) {
117 void SW_alloc(void) {
118 sndswn
=Z_getsnd("SWTCHN");
119 sndswx
=Z_getsnd("SWTCHX");
120 sndnoway
=Z_getsnd("NOWAY");
121 sndbdo
=Z_getsnd("BDOPN");
122 sndbdc
=Z_getsnd("BDCLS");
123 sndnotele
=Z_getsnd("NOTELE");
129 for(i
=0;i
<MAXSW
;++i
) sw
[i
].t
=0;
133 static byte cht
,chto
,chf
,f_ch
;
135 static void door(byte x
,byte y
) {
138 if(x
>=FLDW
|| y
>=FLDH
) return;
139 if(fld
[y
][x
]!=cht
) return;
141 for(;x
&& fld
[y
][x
-1]==cht
;--x
);
142 for(;ex
<FLDW
&& fld
[y
][ex
]==cht
;++ex
);
143 memset(fld
[y
]+x
,chto
,ex
-x
);
144 if(f_ch
) memset(fldf
[y
]+x
,chf
,ex
-x
);
151 void Z_water_trap(obj_t
*o
) {
154 if((y
=o
->y
)>=FLDH
*CELH
+o
->h
) return;
155 if((x
=o
->x
)<0 || o
->x
>FLDW
*CELW
) return;
163 cht
=5;chto
=255;f_ch
=0;
168 void Z_untrap(byte t
) {
172 for(p
=(byte
*)fld
,n
=FLDW
*FLDH
;n
;--n
,++p
)
176 static void opendoor(int i
) {
179 swsnd
=Z_sound(sndbdo
,128);
180 j
=fldf
[sw
[i
].b
][sw
[i
].a
];
181 cht
=2;chto
=3;chf
=0;f_ch
=1;
182 door(sw
[i
].a
,sw
[i
].b
);
183 fldf
[sw
[i
].b
][sw
[i
].a
]=j
;
187 static int shutdoor(int i
) {
190 cht
=3;chto
=255;chf
=fldf
[sw
[i
].b
][sw
[i
].a
];f_ch
=1;
191 door(sw
[i
].a
,sw
[i
].b
);
193 if(Z_chktrap(0,0,-3,HIT_SOME
)) {
194 j
=fldf
[sw
[i
].b
][sw
[i
].a
];
196 door(sw
[i
].a
,sw
[i
].b
);
197 fldf
[sw
[i
].b
][sw
[i
].a
]=j
;
201 door(sw
[i
].a
,sw
[i
].b
);
203 swsnd
=Z_sound(sndbdc
,128);
211 for(i
=0;i
<MAXSW
;++i
) if(sw
[i
].t
) {
212 if(sw
[i
].tm
) --sw
[i
].tm
;
214 case SW_DOOR5
: case SW_DOOR
: case SW_SHUTDOOR
:
216 if(fld
[sw
[i
].b
][sw
[i
].a
]!=3) {sw
[i
].d
=0;break;}
217 if(--sw
[i
].d
==0) if(!shutdoor(i
)) sw
[i
].d
=9;
221 if(fld
[sw
[i
].b
][sw
[i
].a
]!=2) {sw
[i
].d
=0;break;}
222 if(--sw
[i
].d
==0) {opendoor(i
);sw
[i
].tm
=18;}
228 static int doortime(int t
) {
230 case SW_DOOR5
: return 90;
235 void SW_cheat_open(void) {
238 for(i
=0;i
<MAXSW
;++i
) if(sw
[i
].t
&& !sw
[i
].tm
) switch(sw
[i
].t
) {
239 case SW_DOOR
: case SW_DOOR5
:
241 if(fld
[sw
[i
].b
][sw
[i
].a
]!=2) break;
242 SW_press(sw
[i
].x
*CELW
+4,sw
[i
].y
*CELH
+4,1,1,0xFF,-3);
247 int SW_press(int x
,int y
,int r
,int h
,byte t
,int o
) {
250 sx
=(x
-r
)/CELW
;sy
=(y
-h
+1)/CELH
;
251 x
=(x
+r
)/CELW
;y
/=CELH
;
252 for(i
=p
=0;i
<MAXSW
;++i
) if(sw
[i
].t
&& !sw
[i
].tm
) {
253 if(sw
[i
].x
>=sx
&& sw
[i
].x
<=x
&& sw
[i
].y
>=sy
&& sw
[i
].y
<=y
&& ((sw
[i
].f
&0x8F)&t
)) {
254 if(sw
[i
].f
&0x70) if((sw
[i
].f
&(t
&0x70))!=(sw
[i
].f
&0x70)) continue;
257 g_exit
=1;sw
[i
].tm
=9;swsnd
=Z_sound(sndswx
,128);break;
259 g_exit
=2;sw
[i
].tm
=9;swsnd
=Z_sound(sndswx
,128);break;
260 case SW_DOOR
: case SW_DOOR5
:
261 switch(fld
[sw
[i
].b
][sw
[i
].a
]) {
263 opendoor(i
);sw
[i
].tm
=9;sw
[i
].d
=doortime(sw
[i
].t
);break;
265 if(shutdoor(i
)) {sw
[i
].tm
=9;sw
[i
].d
=0;}
267 if(!swsnd
) swsnd
=Z_sound(sndnoway
,128);
273 SW_press((dword
)sw
[i
].a
*8+4,(dword
)sw
[i
].b
*8+12,8,16,(t
&0x70)|0x80,o
);
277 if(!Z_canfit((dword
)sw
[i
].a
*8+4,(dword
)sw
[i
].b
*8+7,r
,h
)) {
278 if(!swsnd
) swsnd
=Z_sound(sndnotele
,128);
280 }Z_teleobj(o
,(dword
)sw
[i
].a
*8+4,(dword
)sw
[i
].b
*8+7);
284 if(fld
[sw
[i
].b
][sw
[i
].a
]!=2) break;
289 if(fld
[sw
[i
].b
][sw
[i
].a
]!=3) break;
290 if(shutdoor(i
)) {sw
[i
].tm
=1;sw
[i
].d
=0;}
292 if(!swsnd
) swsnd
=Z_sound(sndnoway
,128);
295 case SW_SHUTTRAP
: case SW_TRAP
:
296 if(fld
[sw
[i
].b
][sw
[i
].a
]!=3) break;
297 cht
=3;chto
=255;chf
=fldf
[sw
[i
].b
][sw
[i
].a
];f_ch
=1;
298 door(sw
[i
].a
,sw
[i
].b
);
299 Z_chktrap(1,100,-3,HIT_TRAP
);
301 door(sw
[i
].a
,sw
[i
].b
);
303 swsnd
=Z_sound(sndswn
,128);
304 sw
[i
].tm
=1;sw
[i
].d
=20;
307 if(fld
[sw
[i
].b
][sw
[i
].a
]==10) {
308 cht
=10;chto
=9;f_ch
=0;
309 }else if(fld
[sw
[i
].b
][sw
[i
].a
]==9) {
310 cht
=9;chto
=10;f_ch
=0;
312 door(sw
[i
].a
,sw
[i
].b
);
314 swsnd
=Z_sound(sndswx
,128);
318 if(fld
[sw
[i
].b
][sw
[i
].a
]!=10) break;
319 cht
=10;chto
=9;f_ch
=0;
320 door(sw
[i
].a
,sw
[i
].b
);
322 swsnd
=Z_sound(sndswx
,128);
326 if(fld
[sw
[i
].b
][sw
[i
].a
]!=9) break;
327 cht
=9;chto
=10;f_ch
=0;
328 door(sw
[i
].a
,sw
[i
].b
);
330 swsnd
=Z_sound(sndswx
,128);
334 if(o
!=-1 && o
!=-2) break;
335 if(o
==-1) ++pl1
.secrets
;
337 sw
[i
].tm
=1;sw
[i
].t
=0;break;
340 {fldb
[sw
[i
].y
][sw
[i
].x
]=walswp
[fldb
[sw
[i
].y
][sw
[i
].x
]];p
=1;}
341 if(sw
[i
].tm
==1) sw
[i
].tm
=0;