b7058172d4dd025e4af6de4efbbb1ee0949c3a71
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
45 extern dword walf
[256];
49 extern void *walp
[256];
51 static void *sth
[22],*bfh
[160-'!'],*sfh
[160-'!'],*bulsnd
[2],*stone
, *stone2
, *keys
[3];
52 static int prx
=0,pry
=0;
60 int Z_dec(int a
,int b
) {
61 if(abs(a
)<=b
) return 0;
67 void *Z_getspr(char n
[4],int s
,int d
,char *dir
) {
71 if(dir
) *dir
=(h
&0x8000)?1:0;
73 return V_getvgaimg(h
);
76 void *Z_getsnd(char n
[6]) {
79 //if(snd_type==-1) return NULL;
80 strncpy(s
+2,n
,6);s
[0]='D';
83 int id
= F_getresid(s
);
84 int loaded
= M_was_locked(id
);
85 snd_t
*snd
= M_lock(id
);
86 if (snd
!= NULL
&& !loaded
) {
87 snd
->len
= int2host(snd
->len
);
88 snd
->rate
= int2host(snd
->rate
);
89 snd
->lstart
= int2host(snd
->lstart
);
90 snd
->llen
= int2host(snd
->llen
);
95 int Z_sound(void *s
,int v
) {
96 //if(snd_type==-1) return 0;
99 return F_getreslen(((int*)s
)[-1])/605;
102 #define GAS_START (MN__LAST-MN_DEMON+5)
103 #define GAS_TOTAL (MN__LAST-MN_DEMON+16+10)
105 void Z_initst(void) {
108 static char nm
[22][8]={
109 "STTNUM0","STTNUM1","STTNUM2","STTNUM3","STTNUM4",
110 "STTNUM5","STTNUM6","STTNUM7","STTNUM8","STTNUM9",
111 "STTMINUS","STTPRCNT",
112 "FISTA0","CSAWA0","PISTA0","SHOTA0","SGN2A0","MGUNA0","LAUNA0",
113 "PLASA0","BFUGA0","GUN2A0"
116 stone
=V_loadvgaimg("STONE");
117 stone2
=V_loadvgaimg("STONE2");
118 keys
[0]=V_loadvgaimg("KEYRA0");
119 keys
[1]=V_loadvgaimg("KEYGA0");
120 keys
[2]=V_loadvgaimg("KEYBA0");
122 sth
[i
]=V_loadvgaimg(nm
[i
]);
124 for(i
='!';i
<160;++i
) {
126 bfh
[i
-'!']=V_getvgaimg(F_findres(s
));
127 if(!(i
&15)) logo_gas(GAS_START
+((i
-'!')>>4),GAS_TOTAL
);
129 for(i
='!';i
<160;++i
) {
130 sprintf(s
,"STCFN%03d",i
);
131 sfh
[i
-'!']=V_getvgaimg(F_findres(s
));
132 if(!(i
&15)) logo_gas(GAS_START
+8+((i
-'!')>>4),GAS_TOTAL
);
135 for(i
='0';i
<='9';++i
) {
137 bfh
[i
-'!']=V_loadvgaimg(s
);
139 bfh
[':'-'!']=V_loadvgaimg("WICOLON");
140 bulsnd
[0]=Z_getsnd("BUL1");
141 bulsnd
[1]=Z_getsnd("BUL2");
144 void Z_putbfch(int c
) {
147 if(c
>32 && c
<160) p
=bfh
[c
-'!']; else p
=NULL
;
154 void Z_putsfch(int c
) {
157 if(c
>32 && c
<160) p
=sfh
[c
-'!']; else p
=NULL
;
164 void Z_gotoxy(int x
,int y
) {prx
=x
;pry
=y
;}
166 void Z_printbf(char *s
,...) {
174 for(i
=0;buf
[i
];++i
) switch(buf
[i
]) {
180 Z_putbfch((byte
)buf
[i
]);
184 void Z_printsf(char *s
,...) {
192 for(i
=0;buf
[i
];++i
) switch(buf
[i
]) {
198 Z_putsfch((byte
)buf
[i
]);
202 void Z_drawspr(int x
,int y
,void *p
,char d
) {
203 if(d
) V_spr2(x
-w_x
+WD
/2,y
-w_y
+HT
/2+1+w_o
,p
);//if(d) V_spr2(x-w_x+100,y-w_y+HT/2+1+w_o,p);
204 else V_spr(x
-w_x
+WD
/2,y
-w_y
+HT
/2+1+w_o
,p
);//else V_spr(x-w_x+100,y-w_y+HT/2+1+w_o,p);
208 V_pic(SCRW
-120,w_o
,stone
);//V_pic(200,w_o,stone);
209 int y
= ((vgaimg
*)stone
)->h
;
211 V_pic(SCRW
-120,w_o
+y
,stone2
);
212 y
+=((vgaimg
*)stone
)->h
;
217 void Z_drawstlives(char n
) {
218 V_setrect(SCRW
-40,30,w_o
,40);Z_clrst();//V_setrect(280,30,w_o,40);Z_clrst();
219 V_spr(SCRW
-35,w_o
+17,sth
[n
]);//V_spr(285,w_o+17,sth[n]);
222 void Z_drawstkeys(byte k
) {
225 V_setrect(SCRW
-120,70,w_o
+77,23);Z_clrst();//V_setrect(200,70,w_o+77,23);Z_clrst();
226 for(k
>>=4,n
=0,x
=SCRW
-75;n
<3;++n
,k
>>=1,x
+=9)//for(k>>=4,n=0,x=245;n<3;++n,k>>=1,x+=9)
227 if(k
&1) V_spr(x
,w_o
+91,keys
[n
]);
230 void Z_drawstair(int a
) {
231 V_setrect(SCRW
-120,120,w_o
+49,2);Z_clrst();//V_setrect(200,120,w_o+49,2);Z_clrst();
233 if(a
>MAXAIR
) a
=MAXAIR
;
236 V_clr(SCRW
-110,a
,w_o
+49,2,0xC8);//V_clr(210,a,w_o+49,2,0xC8);
239 void Z_drawstprcnt(int y
,int n
) {
243 V_setrect(SCRW
-120,70,y
*19+7+w_o
,19);Z_clrst();//V_setrect(200,70,y*19+7+w_o,19);Z_clrst();
244 sprintf(s
,"%3d%%",n
);
245 l
=strlen(s
);x
=SCRW
-110;//l=strlen(s);x=210;
246 for(i
=0;i
<l
;++i
,x
+=14) {
247 if(s
[i
]>='0' && s
[i
]<='9') c
=s
[i
]-'0';
248 else if(s
[i
]=='-') c
=10;
249 else if(s
[i
]=='%') c
=11;
252 V_spr(x
,y
*19+7+w_o
,sth
[c
]);
256 void Z_drawstnum(int n
) {
260 V_setrect(SCRW
-50,50,w_o
+77,23);Z_clrst();//V_setrect(270,50,w_o+77,23);Z_clrst();
263 l
=strlen(s
);x
=(115-l
*14)+SCRW
-120;//l=strlen(s);x=(115-l*14)+200;
264 for(i
=0;i
<l
;++i
,x
+=14) {
265 if(s
[i
]>='0' && s
[i
]<='9') c
=s
[i
]-'0';
266 else if(s
[i
]=='-') c
=10;
267 else if(s
[i
]=='%') c
=11;
270 V_spr(x
,w_o
+77+5,sth
[c
]);
274 void Z_drawstwpn(int n
,int a
) {
279 V_setrect(SCRW
-120,120,w_o
+58,23);Z_clrst();//V_setrect(200,120,w_o+58,23);Z_clrst();
280 if(i
>=0) V_spr(SCRW
-88,w_o
+58+19,sth
[i
+12]);//if(i>=0) V_spr(232,w_o+58+19,sth[i+12]);
283 l
=strlen(s
);x
=SCRW
-10-l
*14;//l=strlen(s);x=310-l*14;
284 for(i
=0;i
<l
;++i
,x
+=14) {
285 if(s
[i
]>='0' && s
[i
]<='9') c
=s
[i
]-'0';
286 else if(s
[i
]=='-') c
=10;
287 else if(s
[i
]=='%') c
=11;
290 V_spr(x
,w_o
+58+2,sth
[c
]);
297 void Z_drawmanspr(int x
,int y
,void *p
,char d
,byte color
) {
298 if(d
) V_manspr2(x
-w_x
+WD
/2,y
-w_y
+HT
/2+1+w_o
,p
,color
);//if(d) V_manspr2(x-w_x+100,y-w_y+HT/2+1+w_o,p,color);
299 else V_manspr(x
-w_x
+WD
/2,y
-w_y
+HT
/2+1+w_o
,p
,color
);//else V_manspr(x-w_x+100,y-w_y+HT/2+1+w_o,p,color);
302 int Z_canstand(int x
,int y
,int r
) {
308 if(y
>=FLDH
|| y
<0) return 0;
310 if(x
>=FLDW
) x
=FLDW
-1;
312 if(fld
[y
][i
]==1 || fld
[y
][i
]==2 || fld
[y
][i
]==4)
314 else if(!((walf
[fldf
[y
][i
]]|walf
[fldb
[y
][i
]])&2)) return 1;
318 int Z_hitceil(int x
,int y
,int r
,int h
) {
324 if(y
>=FLDH
|| y
<0) return 0;
326 if(x
>=FLDW
) x
=FLDW
-1;
328 if(fld
[y
][i
]==1 || fld
[y
][i
]==2)
330 else if(!((walf
[fldf
[y
][i
]]|walf
[fldb
[y
][i
]])&2)) return 1;
334 int Z_canfit(int x
,int y
,int r
,int h
) {
343 if(x
>=FLDW
) x
=FLDW
-1;
344 if(y
>=FLDH
) y
=FLDH
-1;
347 if(fld
[j
][i
]==1 || fld
[j
][i
]==2)
349 else if(!((walf
[fldf
[j
][i
]]|walf
[fldb
[j
][i
]])&2)) return 0;
353 int Z_inlift(int x
,int y
,int r
,int h
) {
362 if(x
>=FLDW
) x
=FLDW
-1;
363 if(y
>=FLDH
) y
=FLDH
-1;
366 if(fld
[j
][i
]==9 || fld
[j
][i
]==10) return fld
[j
][i
]-8;
370 int Z_isblocked(int x
,int y
,int r
,int h
,int xv
) {
381 if(x
>=FLDW
) x
=FLDW
-1;
382 if(y
>=FLDH
) y
=FLDH
-1;
385 if(fld
[j
][i
]==8) return 1;
389 int Z_istrapped(int x
,int y
,int r
,int h
) {
398 if(x
>=FLDW
) x
=FLDW
-1;
399 if(y
>=FLDH
) y
=FLDH
-1;
402 if(fld
[j
][i
]==255) return 1;
406 void Z_set_speed(obj_t
*o
,int s
) {
409 if(!(m
=max(abs(o
->xv
),abs(o
->yv
)))) m
=1;
410 o
->xv
=o
->xv
*s
/m
;o
->yv
=o
->yv
*s
/m
;
415 int Z_inwater(int x
,int y
,int r
,int h
) {
424 if(x
>=FLDW
) x
=FLDW
-1;
425 if(y
>=FLDH
) y
=FLDH
-1;
428 if(fld
[j
][i
]>=5 && fld
[j
][i
]<=7) {wfront
=fldf
[j
][i
];return 1;}
432 int Z_getacid(int x
,int y
,int r
,int h
) {
434 static byte tab
[4]={0,5,10,20};
443 if(x
>=FLDW
) x
=FLDW
-1;
444 if(y
>=FLDH
) y
=FLDH
-1;
447 if(fld
[j
][i
]==6) a
|=1;
448 else if(fld
[j
][i
]==7) a
|=2;
452 int Z_canbreathe(int x
,int y
,int r
,int h
) {
461 if(x
>=FLDW
) x
=FLDW
-1;
462 if(y
>=FLDH
) y
=FLDH
-1;
463 if(sx
>x
|| sy
>y
) return 1;
466 if(fld
[j
][i
]==0 || fld
[j
][i
]==3 || fld
[j
][i
]==9 || fld
[j
][i
]==10) return 1;
470 int Z_overlap(obj_t
*a
,obj_t
*b
) {
471 if(a
->x
- a
->r
> b
->x
+ b
->r
) return 0;
472 if(a
->x
+ a
->r
< b
->x
- b
->r
) return 0;
473 if(a
->y
<= b
->y
- b
->h
) return 0;
474 if(a
->y
- a
->h
>= b
->y
) return 0;
478 void Z_kickobj(obj_t
*o
,int x
,int y
,int pwr
) {
481 dx
=o
->x
-x
;dy
=o
->y
-o
->h
/2-y
;
482 if(!(m
=max(abs(dx
),abs(dy
)))) m
=1;
483 o
->vx
+=(long)dx
*pwr
/m
;
484 o
->vy
+=(long)dy
*pwr
/m
;
487 int Z_cansee(int x
,int y
,int xd
,int yd
) {
498 if(!xd
&& !yd
) return 1;
499 if((xd
=abs(xd
)) > (yd
=abs(yd
))) d
=xd
; else d
=yd
;
502 if(x
<0 || x
>=FLDW
*8 || y
<0 || y
>=FLDH
*8) return 0;
503 if((bmap
[y
>>5][x
>>5]&BM_WALL
)) {
504 if(fld
[y
>>3][x
>>3]==1 || fld
[y
>>3][x
>>3]==2) return 0;
505 if((xe
+=(xd
<<3))>=d
) {
508 if((ye
+=(yd
<<3))>=d
) {
514 else{m
=x
&31;if(sx
>0) m
^=31; ++m
;}
516 else{s
=y
&31;if(sy
>0) s
^=31; ++s
;}
517 if((s
<m
&& s
!=0) || m
==0) m
=s
;
519 x
+=(xd
*m
+xe
)/d
*sx
;xe
=(xd
*m
+xe
)%d
;
520 y
+=(yd
*m
+ye
)/d
*sy
;ye
=(yd
*m
+ye
)%d
;
526 int Z_look(obj_t
*a
,obj_t
*b
,int d
) {
527 if(Z_sign(b
->x
-a
->x
)!=d
*2-1) return 0;
528 return Z_cansee(a
->x
,a
->y
-a
->h
/2,b
->x
,b
->y
-b
->h
/2);
531 #define wvel(v) if((xv=abs(v)+1)>5) v=Z_dec(v,xv/2-2)
535 int Z_moveobj(obj_t
*p
) {
536 static int x
,y
,xv
,yv
,r
,h
,lx
,ly
,st
;
540 switch(Z_inlift(x
=p
->x
,y
=p
->y
,r
=p
->r
,h
=p
->h
)) {
542 if(++p
->yv
>MAX_YV
) --p
->yv
;
545 if(--p
->yv
< -5) ++p
->yv
;
548 if(p
->yv
> 5) {--p
->yv
;break;}
551 if((inw
=Z_inwater(x
,y
,r
,h
))!=0) {
558 p
->vx
=Z_dec(p
->vx
,1);
559 p
->vy
=Z_dec(p
->vy
,1);
560 xv
=p
->xv
+p
->vx
;yv
=p
->yv
+p
->vy
;
562 if(x
<-100 || x
>=FLDW
*8+100 || y
<-100 || y
>=FLDH
*8+100)
566 x
+=(abs(xv
)<=7)?xv
:((xv
>0)?7:-7);
567 if(z_mon
) if(Z_isblocked(x
,y
,r
,h
,xv
)) st
|=Z_BLOCK
;
568 if(!Z_canfit(x
,y
,r
,h
)) {
570 else if(xv
<0) x
=((lx
-r
)&0xFFF8)+r
;
571 else x
=((lx
+r
)&0xFFF8)-r
+7;
572 xv
=p
->xv
=p
->vx
=0;st
|=Z_HITWALL
;
574 xv
-=(abs(xv
)<=7)?xv
:((xv
>0)?7:-7);
577 y
+=(abs(yv
)<=7)?yv
:((yv
>0)?7:-7);
579 if(yv
<0 && Z_hitceil(x
,y
,r
,h
)) {
580 y
=((ly
-h
+1)&0xFFF8)+h
-1;
581 yv
=p
->vy
=1;p
->yv
=0;st
|=Z_HITCEIL
;
583 if(yv
>0 && Z_canstand(x
,y
,r
)) {
585 yv
=p
->yv
=p
->vy
=0;st
|=Z_HITLAND
;
587 yv
-=(abs(yv
)<=7)?yv
:((yv
>0)?7:-7);
590 if(Z_inwater(x
,y
,r
,h
)) {
592 if(!inw
) st
|=Z_HITWATER
;
593 }else if(inw
) st
|=Z_HITAIR
;
597 void Z_splash(obj_t
*p
,int n
) {
598 Z_sound(bulsnd
[0],128);
599 DOT_water(p
->x
,p
->y
-p
->h
/2,p
->xv
+p
->vx
,p
->yv
+p
->vy
,n
,
600 (int)walp
[wfront
]-1);
603 void Z_calc_time(dword t
,word
*h
,word
*m
,word
*s
)
616 #define SWAP_VAR(a, b) do { unsigned char t = a; a = b; b = t; } while(0)
618 int16_t short2swap (int16_t x
) {
624 SWAP_VAR(y
.a
[0], y
.a
[1]);
628 int32_t int2swap (int32_t x
) {
634 SWAP_VAR(y
.a
[0], y
.a
[3]);
635 SWAP_VAR(y
.a
[1], y
.a
[2]);
641 int16_t short2host (int16_t x
) {
643 return short2swap(x
);
649 int32_t int2host (int32_t x
) {