2be63ad59fe73929b9eaeaaf3d865203aa68c459
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 static smoke_t sm
[MAXSMOK
];
46 static int sr_r
,sxr
[MAXSR
],syr
[MAXSR
];
49 static void *spr
[SMSN
],*fspr
[FLSN
];
54 0xBC,0xBA,0xB8,0xB6,0xB4,0xB2,0xB0,0xD5,0xD6,0xD7,0xA1,0xA0,0xE3,0xE2,0xE1,0xE0
57 void SMK_savegame (FILE *h
) {
59 for (i
= n
= 0; i
< MAXSMOK
; ++i
) {
65 for (i
= 0; i
< MAXSMOK
; ++i
) {
67 myfwrite32(sm
[i
].x
, h
);
68 myfwrite32(sm
[i
].y
, h
);
69 myfwrite32(sm
[i
].xv
, h
);
70 myfwrite32(sm
[i
].xv
, h
);
71 myfwrite8(sm
[i
].t
, h
);
72 myfwrite8(sm
[i
].s
, h
);
73 myfwrite16(sm
[i
].o
, h
);
78 void SMK_loadgame (FILE *h
) {
81 for (i
= 0; i
< n
; ++i
) {
82 sm
[i
].x
= myfread32(h
);
83 sm
[i
].y
= myfread32(h
);
84 sm
[i
].xv
= myfread32(h
);
85 sm
[i
].xv
= myfread32(h
);
86 sm
[i
].t
= myfread8(h
);
87 sm
[i
].s
= myfread8(h
);
88 sm
[i
].o
= myfread16(h
);
95 for(i
=0;i
<MAXSMOK
;++i
) {sm
[i
].t
=0;}
100 void SMK_alloc(void) {
103 burnsnd
=Z_getsnd("BURN");
104 for(i
=0;i
<SMSN
;++i
) spr
[i
]=Z_getspr("SMOK",i
,0,NULL
);
105 for(i
=0;i
<FLSN
;++i
) fspr
[i
]=Z_getspr("FLAM",i
,0,NULL
);
106 for(i
=0;i
<MAXSR
;++i
) {
107 sxr
[i
]=myrand(256*2+1)-256;
108 syr
[i
]=myrand(256*2+1)-256;
113 static void inclast(void) {
114 if(++lsm
>=MAXSMOK
) lsm
=0;
122 for(i
=0;i
<MAXSMOK
;++i
) if(sm
[i
].t
) {
124 ox
=sm
[i
].x
;oy
=sm
[i
].y
;
125 sm
[i
].xv
=Z_dec(sm
[i
].xv
,20);
126 sm
[i
].yv
=Z_dec(sm
[i
].yv
,20);
127 sm
[i
].x
+=sm
[i
].xv
/2;sm
[i
].y
+=sm
[i
].yv
/2;
128 if(!Z_canfit(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
129 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
130 }else if(Z_inwater(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
131 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
133 ox
=sm
[i
].x
;oy
=sm
[i
].y
;
134 sm
[i
].x
+=sm
[i
].xv
/2;sm
[i
].y
+=sm
[i
].yv
/2;
135 if(!Z_canfit(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
136 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
137 }else if(Z_inwater(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
138 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
141 o
.x
=sm
[i
].x
>>8;o
.y
=sm
[i
].y
>>8;
142 o
.xv
=sm
[i
].xv
>>10;o
.yv
=sm
[i
].yv
>>10;
144 if(!(g_time
&3)) Z_hit(&o
,1,sm
[i
].o
,HIT_FLAME
);
147 ox
=sm
[i
].x
;oy
=sm
[i
].y
;
148 sm
[i
].xv
=Z_dec(sm
[i
].xv
,20);
149 sm
[i
].yv
=Z_dec(sm
[i
].yv
,20);
150 sm
[i
].x
+=sm
[i
].xv
;sm
[i
].y
+=sm
[i
].yv
;
151 if(!Z_canfit(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
152 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
153 }else if(Z_inwater(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
154 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
161 void SMK_draw(void) {
164 for(i
=0;i
<MAXSMOK
;++i
) if(sm
[i
].t
) switch(sm
[i
].s
) {
166 if((s
=sm
[i
].t
)>=(SMSN
-1)*3) s
=0; else s
=SMSN
-1-s
/3;
167 V_sprf((sm
[i
].x
>>8)-w_x
+WD
/2,(sm
[i
].y
>>8)-w_y
+HT
/2+1+w_o
,spr
[s
],&smoke_sprf
);//V_sprf((sm[i].x>>8)-w_x+100,(sm[i].y>>8)-w_y+50+w_o,spr[s],&smoke_sprf);
170 if((s
=sm
[i
].t
)>=(FLSN
-1)) s
=0; else s
=FLSN
-1-s
;
171 V_sprf((sm
[i
].x
>>8)-w_x
+WD
/2,(sm
[i
].y
>>8)-w_y
+HT
/2+1+w_o
,fspr
[s
],&flame_sprf
);//V_sprf((sm[i].x>>8)-w_x+100,(sm[i].y>>8)-w_y+50+w_o,fspr[s],&flame_sprf);
176 void SMK_add(int x
,int y
,int xv
,int yv
,byte t
,byte s
,short o
) {
179 if(!Z_canfit(x
>>8,(y
>>8)+3,3,7)) return;
180 if(Z_inwater(x
>>8,(y
>>8)+3,3,7)) {FX_bubble(x
>>8,y
>>8,xv
,yv
,1);return;}
183 sm
[i
].xv
=xv
;sm
[i
].yv
=yv
;
189 void SMK_gas(int x0
,int y0
,int xr
,int yr
,int xv
,int yv
,int k
) {
195 k
=max(abs(xv
),abs(yv
));
198 x
=((xv
*i
/k
+x0
)<<8)+sxr
[sr_r
]*xr
;
199 y
=((yv
*i
/k
+y0
)<<8)+syr
[sr_r
]*yr
;
200 if(++sr_r
>=MAXSR
) sr_r
=0;
201 SMK_add(x
,y
,sxv
,syv
,SMSN
*3,0,-3);
205 void SMK_flame(int x0
,int y0
,int ox
,int oy
,int xr
,int yr
,int xv
,int yv
,int k
,int o
) {
210 xv
=xv
-(ox
<<8);yv
=yv
-(oy
<<8);
211 k
=max(abs(xv
),abs(yv
));
213 if(!burntm
) burntm
=Z_sound(burnsnd
,128);
214 for(i
=0;i
<=k
;i
+=200) {
215 x
=xv
*i
/k
+(x0
<<8)+sxr
[sr_r
]*xr
;
216 y
=yv
*i
/k
+(y0
<<8)+syr
[sr_r
]*yr
;
217 if(++sr_r
>=MAXSR
) sr_r
=0;
218 SMK_add(x
,y
,sxv
,syv
,FLSN
,1,o
);