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
33 extern int hit_xv
,hit_yv
;
35 void bfg_fly(int x
,int y
,int own
);
37 enum{NONE
=0,ROCKET
,PLASMA
,APLASMA
,BALL1
,BALL2
,BALL7
,BFGBALL
,BFGHIT
,
49 static void *snd
[14],*spr
[49*2];
50 static char sprd
[49*2];
51 static weapon_t wp
[MAXWPN
];
53 static void throw(int,int,int,int,int,int,int,int);
55 void WP_savegame (FILE *h
) {
57 for (n
= MAXWPN
- 1; n
>= 0 && wp
[n
].t
== 0; n
--) {
62 for (i
= 0; i
< n
; i
++) {
63 myfwrite32(wp
[i
].o
.x
, h
);
64 myfwrite32(wp
[i
].o
.y
, h
);
65 myfwrite32(wp
[i
].o
.xv
, h
);
66 myfwrite32(wp
[i
].o
.yv
, h
);
67 myfwrite32(wp
[i
].o
.vx
, h
);
68 myfwrite32(wp
[i
].o
.vy
, h
);
69 myfwrite32(wp
[i
].o
.r
, h
);
70 myfwrite32(wp
[i
].o
.h
, h
);
71 myfwrite8(wp
[i
].t
, h
);
72 myfwrite8(wp
[i
].s
, h
);
73 myfwrite32(wp
[i
].own
, h
);
74 myfwrite16(wp
[i
].target
, h
);
78 void WP_loadgame (FILE *h
) {
81 for (i
= 0; i
< n
; i
++) {
82 wp
[i
].o
.x
= myfread32(h
);
83 wp
[i
].o
.y
= myfread32(h
);
84 wp
[i
].o
.xv
= myfread32(h
);
85 wp
[i
].o
.yv
= myfread32(h
);
86 wp
[i
].o
.vx
= myfread32(h
);
87 wp
[i
].o
.vy
= myfread32(h
);
88 wp
[i
].o
.r
= myfread32(h
);
89 wp
[i
].o
.h
= myfread32(h
);
90 wp
[i
].t
= myfread8(h
);
91 wp
[i
].s
= myfread8(h
);
92 wp
[i
].own
= myfread32(h
);
93 wp
[i
].target
= myfread16(h
);
99 static char nm
[14][6]={
117 spr
[i
*2]=Z_getspr("MISL",i
,1,sprd
+i
*2);
118 spr
[i
*2+1]=Z_getspr("MISL",i
,2,sprd
+i
*2+1);
121 spr
[i
*2]=Z_getspr("PLSS",i
-4,1,sprd
+i
*2);
122 spr
[i
*2+1]=Z_getspr("PLSS",i
-4,2,sprd
+i
*2+1);
125 spr
[i
*2]=Z_getspr("PLSE",i
-6,1,sprd
+i
*2);
126 spr
[i
*2+1]=Z_getspr("PLSE",i
-6,2,sprd
+i
*2+1);
129 spr
[i
*2]=Z_getspr("APLS",i
-11,1,sprd
+i
*2);
130 spr
[i
*2+1]=Z_getspr("APLS",i
-11,2,sprd
+i
*2+1);
133 spr
[i
*2]=Z_getspr("APBX",i
-13,1,sprd
+i
*2);
134 spr
[i
*2+1]=Z_getspr("APBX",i
-13,2,sprd
+i
*2+1);
137 spr
[i
*2]=Z_getspr("BFS1",i
-18,1,sprd
+i
*2);
138 spr
[i
*2+1]=Z_getspr("BFS1",i
-18,2,sprd
+i
*2+1);
141 spr
[i
*2]=Z_getspr("BFE1",i
-20,1,sprd
+i
*2);
142 spr
[i
*2+1]=Z_getspr("BFE1",i
-20,2,sprd
+i
*2+1);
145 spr
[i
*2]=Z_getspr("BFE2",i
-26,1,sprd
+i
*2);
146 spr
[i
*2+1]=Z_getspr("BFE2",i
-26,2,sprd
+i
*2+1);
149 spr
[i
*2]=Z_getspr("MISL",i
-30+4,1,sprd
+i
*2);
150 spr
[i
*2+1]=Z_getspr("MISL",i
-30+4,2,sprd
+i
*2+1);
153 spr
[i
*2]=Z_getspr("BAL1",i
-32,1,sprd
+i
*2);
154 spr
[i
*2+1]=Z_getspr("BAL1",i
-32,2,sprd
+i
*2+1);
157 spr
[i
*2]=Z_getspr("BAL7",i
-37,1,sprd
+i
*2);
158 spr
[i
*2+1]=Z_getspr("BAL7",i
-37,2,sprd
+i
*2+1);
161 spr
[i
*2]=Z_getspr("BAL2",i
-42,1,sprd
+i
*2);
162 spr
[i
*2+1]=Z_getspr("BAL2",i
-42,2,sprd
+i
*2+1);
165 spr
[i
*2]=Z_getspr("MANF",i
-47,1,sprd
+i
*2);
166 spr
[i
*2+1]=Z_getspr("MANF",i
-47,2,sprd
+i
*2+1);
168 for(i
=0;i
<14;++i
) snd
[i
]=Z_getsnd(nm
[i
]);
174 for(i
=0;i
<MAXWPN
;++i
) wp
[i
].t
=NONE
;
181 for(i
=0;i
<MAXWPN
;++i
) if(wp
[i
].t
) {
182 if(wp
[i
].t
==ROCKET
|| wp
[i
].t
==REVF
)
183 SMK_gas(wp
[i
].o
.x
+Z_sign(wp
[i
].o
.xv
)*2,
184 wp
[i
].o
.y
-wp
[i
].o
.h
/2,3,3,
185 wp
[i
].o
.xv
+wp
[i
].o
.vx
,wp
[i
].o
.yv
+wp
[i
].o
.vy
,64
187 --wp
[i
].o
.yv
;st
=Z_moveobj(&wp
[i
].o
);
188 if(st
&Z_FALLOUT
) {wp
[i
].t
=0;continue;}
189 if(st
&Z_HITWATER
) switch(wp
[i
].t
) {
190 case PLASMA
: case APLASMA
:
194 Z_splash(&wp
[i
].o
,wp
[i
].o
.r
+wp
[i
].o
.h
);break;
198 if(Z_getobjpos(wp
[i
].target
,&o
))
199 throw(i
,wp
[i
].o
.x
,wp
[i
].o
.y
-2,o
.x
+o
.xv
+o
.vx
,o
.y
+o
.yv
+o
.vy
,2,5,12);
201 if(wp
[i
].s
>=2) {if(++wp
[i
].s
>=8) wp
[i
].t
=0; break;}
202 if(st
&Z_HITAIR
) Z_set_speed(&wp
[i
].o
,12);
203 if(st
&(Z_HITWALL
|Z_HITCEIL
|Z_HITLAND
)) {
204 wp
[i
].s
=2;wp
[i
].o
.xv
=wp
[i
].o
.yv
=0;Z_sound(snd
[4],128);
205 Z_explode(wp
[i
].o
.x
,wp
[i
].o
.y
,30,wp
[i
].own
);break;}
206 else if(Z_hit(&wp
[i
].o
,10,wp
[i
].own
,HIT_SOME
)) {
207 wp
[i
].s
=2;wp
[i
].o
.xv
=wp
[i
].o
.yv
=0;Z_sound(snd
[4],128);
208 Z_explode(wp
[i
].o
.x
,wp
[i
].o
.y
-wp
[i
].o
.h
/2,30,wp
[i
].own
);break;}
209 bfg_fly(wp
[i
].o
.x
,wp
[i
].o
.y
-wp
[i
].o
.h
/2,wp
[i
].own
);
214 Z_sound(snd
[12],128);
215 Z_water_trap(&wp
[i
].o
);
216 Z_chktrap(1,10,wp
[i
].own
,HIT_ELECTRO
);
225 {if(++wp
[i
].s
>=((wp
[i
].t
==BALL1
|| wp
[i
].t
==BALL7
|| wp
[i
].t
==BALL2
|| wp
[i
].t
==MANF
)?8:12)) wp
[i
].t
=0; break;}
226 if(st
&Z_HITAIR
) Z_set_speed(&wp
[i
].o
,16);
227 if(st
&(Z_HITWALL
|Z_HITCEIL
|Z_HITLAND
))
228 {wp
[i
].s
=2;wp
[i
].o
.xv
=wp
[i
].o
.yv
=0;Z_sound(snd
[7],128);break;}
229 else if(Z_hit(&wp
[i
].o
,(wp
[i
].t
==BALL7
|| wp
[i
].t
==MANF
)?40:((wp
[i
].t
==BALL2
)?20:5),wp
[i
].own
,HIT_SOME
))
230 {wp
[i
].s
=2;wp
[i
].o
.xv
=wp
[i
].o
.yv
=0;Z_sound(snd
[7],128);break;}
234 Z_sound(snd
[8],40);Z_sound(snd
[13],128);
235 Z_water_trap(&wp
[i
].o
);
236 Z_chktrap(1,1000,wp
[i
].own
,HIT_ELECTRO
);
240 if(wp
[i
].s
>=2) {if(++wp
[i
].s
>=14) wp
[i
].t
=0; break;}
241 else if(st
&(Z_HITWALL
|Z_HITCEIL
|Z_HITLAND
)) {
242 Z_bfg9000(wp
[i
].o
.x
,wp
[i
].o
.y
,wp
[i
].own
);
243 wp
[i
].s
=2;wp
[i
].o
.xv
=wp
[i
].o
.yv
=0;Z_sound(snd
[8],128);break;}
244 else if(Z_hit(&wp
[i
].o
,100,wp
[i
].own
,HIT_BFG
)) {
245 Z_bfg9000(wp
[i
].o
.x
,wp
[i
].o
.y
,wp
[i
].own
);
246 wp
[i
].s
=2;wp
[i
].o
.xv
=wp
[i
].o
.yv
=0;Z_sound(snd
[8],128);break;}
247 bfg_fly(wp
[i
].o
.x
,wp
[i
].o
.y
-wp
[i
].o
.h
/2,wp
[i
].own
);
250 if(++wp
[i
].s
>=8) wp
[i
].t
=0;
260 for(i
=0;i
<MAXWPN
;++i
) {
263 case NONE
: default: break;
267 d
=(wp
[i
].o
.xv
>0)?1:0;
268 x
=abs(wp
[i
].o
.xv
);y
=wp
[i
].o
.yv
;s
=0;
269 if(y
<0) {if(-y
>=x
) s
=30;}
270 else if(y
>0) if(y
>=x
/2) s
=31;
271 }else {s
=(d
-2)/2+1;d
=0;}
274 if((s
=wp
[i
].s
)>=2) {s
/=2;break;}
280 if((s
=wp
[i
].s
)>=2) s
=s
/2+1;
282 case PLASMA
: s
+=4;break;
283 case APLASMA
: s
+=11;break;
284 case BALL1
: s
+=32;break;
285 case BALL2
: s
+=42;break;
286 case BALL7
: s
+=37;d
=(wp
[i
].o
.xv
>=0)?1:0;break;
287 case MANF
: s
+=47;d
=(wp
[i
].o
.xv
>=0)?1:0;break;
290 if((s
=wp
[i
].s
)>=2) s
=s
/2+1;
293 s
=wp
[i
].s
/2+26;break;
295 if(s
>=0) Z_drawspr(wp
[i
].o
.x
,wp
[i
].o
.y
,spr
[s
*2+d
],sprd
[s
*2+d
]);
299 void WP_gun(int x
,int y
,int xd
,int yd
,int o
,int v
) {
305 f
=BM_MONSTER
|BM_WALL
;
306 if(o
!=-1) f
|=BM_PLR1
;
307 if(o
!=-2) f
|=BM_PLR2
;
314 if(!xd
&& !yd
) return;
315 if((xd
=abs(xd
)) > (yd
=abs(yd
))) d
=xd
; else d
=yd
;
321 if(x
<0 || x
>=FLDW
*8 || y
<0 || y
>=FLDH
*8) break;
322 if(((m
=bmap
[y
>>5][x
>>5])&f
)) {
323 if(m
&BM_WALL
) if(fld
[y
>>3][x
>>3]==1 || fld
[y
>>3][x
>>3]==2) {
324 for(x
=lx
,y
=ly
,xe
=ye
=0;fld
[y
>>3][x
>>3]!=1 && fld
[y
>>3][x
>>3]!=2;) {
326 if((xe
+=xd
)>=d
) {xe
-=d
;x
+=sx
;}
327 if((ye
+=yd
)>=d
) {ye
-=d
;y
+=sy
;}
329 DOT_spark(lx
,ly
,sx
*10,sy
*10,1);
332 if(m
&(BM_MONSTER
|BM_PLR1
|BM_PLR2
)) if(Z_gunhit(x
,y
,o
,sx
*v
,sy
*v
)) break;
334 if((xe
+=(xd
<<3))>=d
) {
337 if((ye
+=(yd
<<3))>=d
) {
342 else{m
=x
&31;if(sx
>0) m
^=31; ++m
;}
344 else{s
=y
&31;if(sy
>0) s
^=31; ++s
;}
345 if((s
<m
&& s
!=0) || m
==0) m
=s
;
347 x
+=(xd
*m
+xe
)/d
*sx
;xe
=(xd
*m
+xe
)%d
;
348 y
+=(yd
*m
+ye
)/d
*sy
;ye
=(yd
*m
+ye
)%d
;
353 void WP_punch(int x
,int y
,int d
,int own
) {
356 o
.x
=x
;o
.y
=y
;o
.r
=12;o
.h
=26;
357 o
.xv
=o
.yv
=o
.vx
=o
.vy
=0;
358 if(Z_hit(&o
,d
,own
,HIT_SOME
)) Z_sound(snd
[9],128);
361 int WP_chainsaw(int x
,int y
,int d
,int own
) {
364 o
.x
=x
;o
.y
=y
;o
.r
=12;o
.h
=26;
365 o
.xv
=o
.yv
=o
.vx
=o
.vy
=0;
366 if(Z_hit(&o
,d
,own
,HIT_SOME
)) return 1;
370 static void throw(int i
,int x
,int y
,int xd
,int yd
,int r
,int h
,int s
) {
373 wp
[i
].o
.x
=x
;wp
[i
].o
.y
=y
+h
/2;
375 if(!(m
=max(abs(xd
),abs(yd
)))) m
=1;
376 wp
[i
].o
.xv
=xd
*s
/m
;wp
[i
].o
.yv
=yd
*s
/m
;
377 wp
[i
].o
.r
=r
;wp
[i
].o
.h
=h
;
378 wp
[i
].o
.vx
=wp
[i
].o
.vy
=0;
381 void WP_rocket(int x
,int y
,int xd
,int yd
,int o
) {
384 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
386 wp
[i
].t
=ROCKET
;wp
[i
].s
=(xd
>=x
)?1:0;
388 throw(i
,x
,y
,xd
,yd
,2,5,12);
393 void WP_revf(int x
,int y
,int xd
,int yd
,int o
,int t
) {
396 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
398 wp
[i
].t
=REVF
;wp
[i
].s
=(xd
>=x
)?1:0;
399 wp
[i
].own
=o
;wp
[i
].target
=t
;
400 throw(i
,x
,y
,xd
,yd
,2,5,12);
405 void WP_plasma(int x
,int y
,int xd
,int yd
,int o
) {
408 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
410 wp
[i
].t
=PLASMA
;wp
[i
].s
=0;
412 throw(i
,x
,y
,xd
,yd
,2,5,16);
417 void WP_ball1(int x
,int y
,int xd
,int yd
,int o
) {
420 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
421 wp
[i
].t
=BALL1
;wp
[i
].s
=0;
423 throw(i
,x
,y
,xd
,yd
,2,5,16);
428 void WP_ball2(int x
,int y
,int xd
,int yd
,int o
) {
431 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
432 wp
[i
].t
=BALL2
;wp
[i
].s
=0;
434 throw(i
,x
,y
,xd
,yd
,2,5,16);
439 void WP_ball7(int x
,int y
,int xd
,int yd
,int o
) {
442 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
443 wp
[i
].t
=BALL7
;wp
[i
].s
=0;
445 throw(i
,x
,y
,xd
,yd
,2,5,16);
450 void WP_aplasma(int x
,int y
,int xd
,int yd
,int o
) {
453 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
455 wp
[i
].t
=APLASMA
;wp
[i
].s
=0;
457 throw(i
,x
,y
,xd
,yd
,2,5,16);
462 void WP_manfire(int x
,int y
,int xd
,int yd
,int o
) {
465 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
467 wp
[i
].t
=MANF
;wp
[i
].s
=0;
469 throw(i
,x
,y
,xd
,yd
,5,11,16);
474 void WP_bfgshot(int x
,int y
,int xd
,int yd
,int o
) {
477 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
478 wp
[i
].t
=BFGBALL
;wp
[i
].s
=0;
480 throw(i
,x
,y
,xd
,yd
,5,12,16);
485 void WP_bfghit(int x
,int y
,int o
) {
488 for(i
=0;i
<MAXWPN
;++i
) if(!wp
[i
].t
) {
489 wp
[i
].t
=BFGHIT
;wp
[i
].s
=0;
490 wp
[i
].o
.x
=x
;wp
[i
].o
.y
=y
;
491 wp
[i
].o
.xv
=wp
[i
].o
.yv
=0;
492 wp
[i
].o
.r
=0;wp
[i
].o
.h
=1;
493 wp
[i
].o
.vx
=wp
[i
].o
.vy
=0;
499 void WP_pistol(int x
,int y
,int xd
,int yd
,int o
) {
501 WP_gun(x
,y
,xd
,yd
,o
,1);
503 WP_gun(x
,y
+1,xd
,yd
+1,o
,1);
504 WP_gun(x
,y
-1,xd
,yd
-1,o
,1);
508 void WP_mgun(int x
,int y
,int xd
,int yd
,int o
) {
509 Z_sound(snd
[11],128);
510 WP_gun(x
,y
,xd
,yd
,o
,1);
513 void WP_shotgun(int x
,int y
,int xd
,int yd
,int o
) {
519 WP_gun(x
,y
+j
,xd
,yd
+j
,o
,i
&1);
523 void WP_dshotgun(int x
,int y
,int xd
,int yd
,int o
) {
527 for(i
=(g_dm
)?25:20;i
>=0;--i
) {
529 WP_gun(x
,y
+j
,xd
,yd
+j
,o
,(i%3
)?0:1);
533 void WP_ognemet(int x
,int y
,int xd
,int yd
,int xv
,int yv
,int o
) {
536 m
=abs(xd
-x
);if(!m
) m
=abs(yd
-y
);
537 SMK_flame(x
,y
,xv
,yv
,2,2,(xd
-x
)*3000/m
,(yd
-y
)*3000/m
,1,o
);