1 /* Copyright (C) 1996-1997 Aleksey Volynskov
2 * Copyright (C) 2011 Rambo
3 * Copyright (C) 2020 SovietPony
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, version 3 of the License ONLY.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
31 static int sr_r
,sxr
[MAXSR
],syr
[MAXSR
];
37 void SMK_init (void) {
40 for(i
=0;i
<MAXSMOK
;++i
) {sm
[i
].t
=0;}
45 void SMK_alloc (void) {
47 burnsnd
=Z_getsnd("BURN");
48 for(i
=0;i
<MAXSR
;++i
) {
49 sxr
[i
]=myrand(256*2+1)-256;
50 syr
[i
]=myrand(256*2+1)-256;
55 static void inclast(void) {
56 if(++lsm
>=MAXSMOK
) lsm
=0;
64 for(i
=0;i
<MAXSMOK
;++i
) if(sm
[i
].t
) {
66 ox
=sm
[i
].x
;oy
=sm
[i
].y
;
67 sm
[i
].xv
=Z_dec(sm
[i
].xv
,20);
68 sm
[i
].yv
=Z_dec(sm
[i
].yv
,20);
69 sm
[i
].x
+=sm
[i
].xv
/2;sm
[i
].y
+=sm
[i
].yv
/2;
70 if(!Z_canfit(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
71 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
72 }else if(Z_inwater(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
73 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
75 ox
=sm
[i
].x
;oy
=sm
[i
].y
;
76 sm
[i
].x
+=sm
[i
].xv
/2;sm
[i
].y
+=sm
[i
].yv
/2;
77 if(!Z_canfit(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
78 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
79 }else if(Z_inwater(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
80 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
83 o
.x
=sm
[i
].x
>>8;o
.y
=sm
[i
].y
>>8;
84 o
.xv
=sm
[i
].xv
>>10;o
.yv
=sm
[i
].yv
>>10;
86 if(!(g_time
&3)) Z_hit(&o
,1,sm
[i
].o
,HIT_FLAME
);
89 ox
=sm
[i
].x
;oy
=sm
[i
].y
;
90 sm
[i
].xv
=Z_dec(sm
[i
].xv
,20);
91 sm
[i
].yv
=Z_dec(sm
[i
].yv
,20);
92 sm
[i
].x
+=sm
[i
].xv
;sm
[i
].y
+=sm
[i
].yv
;
93 if(!Z_canfit(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
94 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
95 }else if(Z_inwater(sm
[i
].x
>>8,(sm
[i
].y
>>8)+3,3,7)) {
96 sm
[i
].x
=ox
;sm
[i
].y
=oy
;
103 static void SMK_add (int x
, int y
, int xv
, int yv
, byte t
, byte s
, short o
) {
106 if(!Z_canfit(x
>>8,(y
>>8)+3,3,7)) return;
107 if(Z_inwater(x
>>8,(y
>>8)+3,3,7)) {FX_bubble(x
>>8,y
>>8,xv
,yv
,1);return;}
110 sm
[i
].xv
=xv
;sm
[i
].yv
=yv
;
116 void SMK_gas (int x0
, int y0
, int xr
, int yr
, int xv
, int yv
, int k
) {
122 k
=max(abs(xv
),abs(yv
));
125 x
=((xv
*i
/k
+x0
)<<8)+sxr
[sr_r
]*xr
;
126 y
=((yv
*i
/k
+y0
)<<8)+syr
[sr_r
]*yr
;
127 if(++sr_r
>=MAXSR
) sr_r
=0;
128 SMK_add(x
,y
,sxv
,syv
,SMSN
*3,0,-3);
132 void SMK_flame (int x0
, int y0
, int ox
, int oy
, int xr
, int yr
, int xv
, int yv
, int k
, int o
) {
137 xv
=xv
-(ox
<<8);yv
=yv
-(oy
<<8);
138 k
=max(abs(xv
),abs(yv
));
140 if(!burntm
) burntm
=Z_sound(burnsnd
,128);
141 for(i
=0;i
<=k
;i
+=200) {
142 x
=xv
*i
/k
+(x0
<<8)+sxr
[sr_r
]*xr
;
143 y
=yv
*i
/k
+(y0
<<8)+syr
[sr_r
]*yr
;
144 if(++sr_r
>=MAXSR
) sr_r
=0;
145 SMK_add(x
,y
,sxv
,syv
,FLSN
,1,o
);