7c69aeab6ac4e48e168747732a49982b4a17e05b
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
42 extern dword walf
[256];
46 extern void *walp
[256];
48 static void *bulsnd
[2];
56 int Z_dec(int a
,int b
) {
57 if(abs(a
)<=b
) return 0;
63 void *Z_getsnd(char n
[6]) {
66 //if(snd_type==-1) return NULL;
67 strncpy(s
+2,n
,6);s
[0]='D';
70 int id
= F_getresid(s
);
71 int loaded
= M_was_locked(id
);
72 snd_t
*snd
= M_lock(id
);
73 if (snd
!= NULL
&& !loaded
) {
74 snd
->len
= int2host(snd
->len
);
75 snd
->rate
= int2host(snd
->rate
);
76 snd
->lstart
= int2host(snd
->lstart
);
77 snd
->llen
= int2host(snd
->llen
);
82 int Z_sound(void *s
,int v
) {
83 //if(snd_type==-1) return 0;
86 return F_getreslen(((int*)s
)[-1])/605;
89 #define GAS_START (MN__LAST-MN_DEMON+5)
90 #define GAS_TOTAL (MN__LAST-MN_DEMON+16+10)
93 bulsnd
[0]=Z_getsnd("BUL1");
94 bulsnd
[1]=Z_getsnd("BUL2");
97 int Z_canstand(int x
,int y
,int r
) {
103 if(y
>=FLDH
|| y
<0) return 0;
105 if(x
>=FLDW
) x
=FLDW
-1;
107 if(fld
[y
][i
]==1 || fld
[y
][i
]==2 || fld
[y
][i
]==4)
109 else if(!((walf
[fldf
[y
][i
]]|walf
[fldb
[y
][i
]])&2)) return 1;
113 int Z_hitceil(int x
,int y
,int r
,int h
) {
119 if(y
>=FLDH
|| y
<0) return 0;
121 if(x
>=FLDW
) x
=FLDW
-1;
123 if(fld
[y
][i
]==1 || fld
[y
][i
]==2)
125 else if(!((walf
[fldf
[y
][i
]]|walf
[fldb
[y
][i
]])&2)) return 1;
129 int Z_canfit(int x
,int y
,int r
,int h
) {
138 if(x
>=FLDW
) x
=FLDW
-1;
139 if(y
>=FLDH
) y
=FLDH
-1;
142 if(fld
[j
][i
]==1 || fld
[j
][i
]==2)
144 else if(!((walf
[fldf
[j
][i
]]|walf
[fldb
[j
][i
]])&2)) return 0;
148 int Z_inlift(int x
,int y
,int r
,int h
) {
157 if(x
>=FLDW
) x
=FLDW
-1;
158 if(y
>=FLDH
) y
=FLDH
-1;
161 if(fld
[j
][i
]==9 || fld
[j
][i
]==10) return fld
[j
][i
]-8;
165 int Z_isblocked(int x
,int y
,int r
,int h
,int xv
) {
176 if(x
>=FLDW
) x
=FLDW
-1;
177 if(y
>=FLDH
) y
=FLDH
-1;
180 if(fld
[j
][i
]==8) return 1;
184 int Z_istrapped(int x
,int y
,int r
,int h
) {
193 if(x
>=FLDW
) x
=FLDW
-1;
194 if(y
>=FLDH
) y
=FLDH
-1;
197 if(fld
[j
][i
]==255) return 1;
201 void Z_set_speed(obj_t
*o
,int s
) {
204 if(!(m
=max(abs(o
->xv
),abs(o
->yv
)))) m
=1;
205 o
->xv
=o
->xv
*s
/m
;o
->yv
=o
->yv
*s
/m
;
210 int Z_inwater(int x
,int y
,int r
,int h
) {
219 if(x
>=FLDW
) x
=FLDW
-1;
220 if(y
>=FLDH
) y
=FLDH
-1;
223 if(fld
[j
][i
]>=5 && fld
[j
][i
]<=7) {wfront
=fldf
[j
][i
];return 1;}
227 int Z_getacid(int x
,int y
,int r
,int h
) {
229 static byte tab
[4]={0,5,10,20};
238 if(x
>=FLDW
) x
=FLDW
-1;
239 if(y
>=FLDH
) y
=FLDH
-1;
242 if(fld
[j
][i
]==6) a
|=1;
243 else if(fld
[j
][i
]==7) a
|=2;
247 int Z_canbreathe(int x
,int y
,int r
,int h
) {
256 if(x
>=FLDW
) x
=FLDW
-1;
257 if(y
>=FLDH
) y
=FLDH
-1;
258 if(sx
>x
|| sy
>y
) return 1;
261 if(fld
[j
][i
]==0 || fld
[j
][i
]==3 || fld
[j
][i
]==9 || fld
[j
][i
]==10) return 1;
265 int Z_overlap(obj_t
*a
,obj_t
*b
) {
266 if(a
->x
- a
->r
> b
->x
+ b
->r
) return 0;
267 if(a
->x
+ a
->r
< b
->x
- b
->r
) return 0;
268 if(a
->y
<= b
->y
- b
->h
) return 0;
269 if(a
->y
- a
->h
>= b
->y
) return 0;
273 void Z_kickobj(obj_t
*o
,int x
,int y
,int pwr
) {
276 dx
=o
->x
-x
;dy
=o
->y
-o
->h
/2-y
;
277 if(!(m
=max(abs(dx
),abs(dy
)))) m
=1;
278 o
->vx
+=(long)dx
*pwr
/m
;
279 o
->vy
+=(long)dy
*pwr
/m
;
282 int Z_cansee(int x
,int y
,int xd
,int yd
) {
293 if(!xd
&& !yd
) return 1;
294 if((xd
=abs(xd
)) > (yd
=abs(yd
))) d
=xd
; else d
=yd
;
297 if(x
<0 || x
>=FLDW
*8 || y
<0 || y
>=FLDH
*8) return 0;
298 if((bmap
[y
>>5][x
>>5]&BM_WALL
)) {
299 if(fld
[y
>>3][x
>>3]==1 || fld
[y
>>3][x
>>3]==2) return 0;
300 if((xe
+=(xd
<<3))>=d
) {
303 if((ye
+=(yd
<<3))>=d
) {
309 else{m
=x
&31;if(sx
>0) m
^=31; ++m
;}
311 else{s
=y
&31;if(sy
>0) s
^=31; ++s
;}
312 if((s
<m
&& s
!=0) || m
==0) m
=s
;
314 x
+=(xd
*m
+xe
)/d
*sx
;xe
=(xd
*m
+xe
)%d
;
315 y
+=(yd
*m
+ye
)/d
*sy
;ye
=(yd
*m
+ye
)%d
;
321 int Z_look(obj_t
*a
,obj_t
*b
,int d
) {
322 if(Z_sign(b
->x
-a
->x
)!=d
*2-1) return 0;
323 return Z_cansee(a
->x
,a
->y
-a
->h
/2,b
->x
,b
->y
-b
->h
/2);
326 #define wvel(v) if((xv=abs(v)+1)>5) v=Z_dec(v,xv/2-2)
330 int Z_moveobj(obj_t
*p
) {
331 static int x
,y
,xv
,yv
,r
,h
,lx
,ly
,st
;
335 switch(Z_inlift(x
=p
->x
,y
=p
->y
,r
=p
->r
,h
=p
->h
)) {
337 if(++p
->yv
>MAX_YV
) --p
->yv
;
340 if(--p
->yv
< -5) ++p
->yv
;
343 if(p
->yv
> 5) {--p
->yv
;break;}
346 if((inw
=Z_inwater(x
,y
,r
,h
))!=0) {
353 p
->vx
=Z_dec(p
->vx
,1);
354 p
->vy
=Z_dec(p
->vy
,1);
355 xv
=p
->xv
+p
->vx
;yv
=p
->yv
+p
->vy
;
357 if(x
<-100 || x
>=FLDW
*8+100 || y
<-100 || y
>=FLDH
*8+100)
361 x
+=(abs(xv
)<=7)?xv
:((xv
>0)?7:-7);
362 if(z_mon
) if(Z_isblocked(x
,y
,r
,h
,xv
)) st
|=Z_BLOCK
;
363 if(!Z_canfit(x
,y
,r
,h
)) {
365 else if(xv
<0) x
=((lx
-r
)&0xFFF8)+r
;
366 else x
=((lx
+r
)&0xFFF8)-r
+7;
367 xv
=p
->xv
=p
->vx
=0;st
|=Z_HITWALL
;
369 xv
-=(abs(xv
)<=7)?xv
:((xv
>0)?7:-7);
372 y
+=(abs(yv
)<=7)?yv
:((yv
>0)?7:-7);
374 if(yv
<0 && Z_hitceil(x
,y
,r
,h
)) {
375 y
=((ly
-h
+1)&0xFFF8)+h
-1;
376 yv
=p
->vy
=1;p
->yv
=0;st
|=Z_HITCEIL
;
378 if(yv
>0 && Z_canstand(x
,y
,r
)) {
380 yv
=p
->yv
=p
->vy
=0;st
|=Z_HITLAND
;
382 yv
-=(abs(yv
)<=7)?yv
:((yv
>0)?7:-7);
385 if(Z_inwater(x
,y
,r
,h
)) {
387 if(!inw
) st
|=Z_HITWATER
;
388 }else if(inw
) st
|=Z_HITAIR
;
392 void Z_splash(obj_t
*p
,int n
) {
393 Z_sound(bulsnd
[0],128);
394 DOT_water(p
->x
,p
->y
-p
->h
/2,p
->xv
+p
->vx
,p
->yv
+p
->vy
,n
,
395 (intptr_t)walp
[wfront
]-1);
398 void Z_calc_time(dword t
,word
*h
,word
*m
,word
*s
)
411 #define SWAP_VAR(a, b) do { unsigned char t = a; a = b; b = t; } while(0)
413 int16_t short2swap (int16_t x
) {
419 SWAP_VAR(y
.a
[0], y
.a
[1]);
423 int32_t int2swap (int32_t x
) {
429 SWAP_VAR(y
.a
[0], y
.a
[3]);
430 SWAP_VAR(y
.a
[1], y
.a
[2]);
436 int16_t short2host (int16_t x
) {
438 return short2swap(x
);
444 int32_t int2host (int32_t x
) {