8918203274c4155ec9123ccd700ead1c0176ad05
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
36 extern map_block_t blk
;
41 static int tsndtm
,rsndtm
;
45 void IT_savegame (FILE *h
) {
47 for (n
= MAXITEM
- 1; n
>= 0 && it
[n
].t
== 0; n
--) {
52 for (i
= 0; i
< n
; i
++) {
53 myfwrite32(it
[i
].o
.x
, h
);
54 myfwrite32(it
[i
].o
.y
, h
);
55 myfwrite32(it
[i
].o
.xv
, h
);
56 myfwrite32(it
[i
].o
.yv
, h
);
57 myfwrite32(it
[i
].o
.vx
, h
);
58 myfwrite32(it
[i
].o
.vy
, h
);
59 myfwrite32(it
[i
].o
.r
, h
);
60 myfwrite32(it
[i
].o
.h
, h
);
61 myfwrite32(it
[i
].t
, h
);
62 myfwrite32(it
[i
].s
, h
);
64 myfwrite32(itm_rtime
, h
);
67 void IT_loadgame (FILE *h
) {
70 for (i
= 0; i
< n
; i
++) {
71 it
[i
].o
.x
= myfread32(h
);
72 it
[i
].o
.y
= myfread32(h
);
73 it
[i
].o
.xv
= myfread32(h
);
74 it
[i
].o
.yv
= myfread32(h
);
75 it
[i
].o
.vx
= myfread32(h
);
76 it
[i
].o
.vy
= myfread32(h
);
77 it
[i
].o
.r
= myfread32(h
);
78 it
[i
].o
.h
= myfread32(h
);
79 it
[i
].t
= myfread32(h
);
80 it
[i
].s
= myfread32(h
);
82 itm_rtime
= myfread32(h
);
85 void IT_alloc (void) {
87 static char nm
[][6] = {
88 "ITEMUP", "WPNUP", "GETPOW", "ITMBK"
90 for (i
= 0; i
< 4; ++i
) {
91 snd
[i
] = Z_getsnd(nm
[i
]);
93 for (i
= 0; i
< MAXITEM
; ++i
) {
102 for(i
=0;i
<MAXITEM
;++i
) {
104 it
[i
].o
.xv
=it
[i
].o
.yv
=it
[i
].o
.vx
=it
[i
].o
.vy
=0;
109 int IT_load (FILE *h
) {
114 for (i
= 0; blk
.sz
> 0; ++i
, blk
.sz
-= 8) {
123 if (it
[i
].t
&& (it
[i
].s
& THF_DM
) && !g_dm
) {
128 for (i
= 0, j
= -1; i
< m
; ++i
) {
129 if (it
[i
].t
== TH_PLR1
) {
136 ERR_fatal("Предмет игрок_1 не найден");
138 dm_pos
[0].x
= it
[j
].o
.x
;
139 dm_pos
[0].y
= it
[j
].o
.y
;
140 dm_pos
[0].d
= it
[j
].s
& THF_DIR
;
142 for (i
= 0, j
= -1; i
< m
; ++i
) {
143 if (it
[i
].t
== TH_PLR2
) {
150 ERR_fatal("Предмет игрок_2 не найден");
152 dm_pos
[1].x
= it
[j
].o
.x
;
153 dm_pos
[1].y
= it
[j
].o
.y
;
154 dm_pos
[1].d
= it
[j
].s
& THF_DIR
;
156 for (i
= 0, j
= 0; i
< m
; ++i
) {
157 if (it
[i
].t
== TH_DMSTART
) {
159 dm_pos
[j
].x
= it
[i
].o
.x
;
160 dm_pos
[j
].y
= it
[i
].o
.y
;
161 dm_pos
[j
].d
= it
[i
].s
& THF_DIR
;
168 ERR_fatal("Меньше 2-ух точек DM");
172 dm_pl1p
= myrand(dm_pnum
);
174 dm_pl2p
= myrand(dm_pnum
);
175 } while (dm_pl2p
== dm_pl1p
);
181 PL_spawn(&pl1
, dm_pos
[dm_pl1p
].x
, dm_pos
[dm_pl1p
].y
, dm_pos
[dm_pl1p
].d
);
183 PL_spawn(&pl2
, dm_pos
[dm_pl2p
].x
, dm_pos
[dm_pl2p
].y
, dm_pos
[dm_pl2p
].d
);
185 for (i
= 0; i
< m
; ++i
) {
186 if (it
[i
].t
>= TH_CLIP
&& it
[i
].t
< TH_DEMON
) {
188 it
[i
].t
= it
[i
].t
- TH_CLIP
+ I_CLIP
;
189 if (it
[i
].t
>= I_KEYR
&& it
[i
].t
<= I_KEYB
) {
192 } else if (it
[i
].t
>= TH_DEMON
) {
193 MN_spawn(it
[i
].o
.x
, it
[i
].o
.y
, it
[i
].s
& THF_DIR
, it
[i
].t
- TH_DEMON
+ MN_DEMON
);
202 static void takesnd(int t
) {
205 if(t
<=I_CELP
|| (t
>=I_BPACK
&& t
<=I_BFG
) || t
==I_GUN2
)
206 {tsndtm
=Z_sound(snd
[1],128);return;}
207 if(t
==I_MEGA
|| t
==I_INVL
|| t
==I_SUPER
)
208 {tsndtm
=Z_sound(snd
[2],192);return;}
209 tsndtm
=Z_sound(snd
[0],256);
217 for(i
=0;i
<MAXITEM
;++i
) if(it
[i
].t
)
220 FX_ifog(it
[i
].o
.x
,it
[i
].o
.y
);
221 if(!rsndtm
) rsndtm
=Z_sound(snd
[3],128);
225 case I_ARM1
: case I_ARM2
:
226 if(++it
[i
].s
>=18) it
[i
].s
=0; break;
227 case I_MEGA
: case I_INVL
:
228 case I_SUPER
: case I_RTORCH
: case I_GTORCH
: case I_BTORCH
:
229 if(++it
[i
].s
>=8) it
[i
].s
=0; break;
230 case I_GOR1
: case I_FCAN
:
231 if(++it
[i
].s
>=6) it
[i
].s
=0; break;
234 if((j
=Z_moveobj(&it
[i
].o
))&Z_FALLOUT
) {it
[i
].t
=0;continue;}
235 else if(j
&Z_HITWATER
) Z_splash(&it
[i
].o
,it
[i
].o
.r
+it
[i
].o
.h
);
237 if(Z_overlap(&it
[i
].o
,&pl1
.o
))
238 if(PL_give(&pl1
,it
[i
].t
&0x7FFF)) {
240 if(_2pl
) if((it
[i
].t
&0x7FFF)>=I_KEYR
&& (it
[i
].t
&0x7FFF)<=I_KEYB
) continue;
241 if(!(it
[i
].s
=-itm_rtime
) || (it
[i
].t
&0x8000)) it
[i
].t
=0;
244 if(_2pl
) if(Z_overlap(&it
[i
].o
,&pl2
.o
))
245 if(PL_give(&pl2
,it
[i
].t
&0x7FFF)) {
247 if((it
[i
].t
&0x7FFF)>=I_KEYR
&& (it
[i
].t
&0x7FFF)<=I_KEYB
) continue;
248 if(!(it
[i
].s
=-itm_rtime
) || (it
[i
].t
&0x8000)) it
[i
].t
=0;
254 void IT_spawn(int x
,int y
,int t
) {
257 for(i
=0;i
<MAXITEM
;++i
) if(!it
[i
].t
) {
258 it
[i
].t
=t
|0x8000;it
[i
].s
=0;
259 it
[i
].o
.x
=x
;it
[i
].o
.y
=y
;
260 it
[i
].o
.xv
=it
[i
].o
.yv
=it
[i
].o
.vx
=it
[i
].o
.vy
=0;
261 it
[i
].o
.r
=10;it
[i
].o
.h
=8;
266 void IT_drop_ammo(int t
,int n
,int x
,int y
) {
267 static int an
[8]={10,4,1,40,50,25,5,100};
271 for(a
=an
[t
-I_CLIP
];n
>=a
;n
-=a
)
272 IT_spawn(x
+myrand(3*2+1)-3,y
-myrand(7),t
);
273 if(t
>=I_AMMO
) {t
-=4;goto again
;}