DEADSOFTWARE

portability: avoid errors on some compilers
[flatwaifu.git] / src / smoke.c
1 /* Copyright (C) 1996-1997 Aleksey Volynskov
2 * Copyright (C) 2011 Rambo
3 * Copyright (C) 2020 SovietPony
4 *
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.
8 *
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.
13 *
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/>.
16 */
18 #include "glob.h"
19 #include <stdlib.h>
20 #include "view.h"
21 #include "smoke.h"
22 #include "game.h"
23 #include "fx.h"
24 #include "misc.h"
25 #include "monster.h"
27 #define MAXSR 20
29 smoke_t sm[MAXSMOK];
31 static int sr_r,sxr[MAXSR],syr[MAXSR];
32 static int lsm;
34 static void *burnsnd;
35 static int burntm=0;
37 void SMK_init (void) {
38 int i;
40 for(i=0;i<MAXSMOK;++i) {sm[i].t=0;}
41 lsm=0;
42 burntm=0;
43 }
45 void SMK_alloc (void) {
46 int i;
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;
51 }
52 sr_r=0;
53 }
55 static void inclast(void) {
56 if(++lsm>=MAXSMOK) lsm=0;
57 }
59 void SMK_act (void) {
60 int i,ox,oy;
61 static obj_t o;
63 if(burntm) --burntm;
64 for(i=0;i<MAXSMOK;++i) if(sm[i].t) {
65 if(sm[i].s) {
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;
74 }
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;
81 }
82 if(sm[i].o!=-3) {
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;
85 o.vx=o.vy=0;
86 if(!(g_time&3)) Z_hit(&o,1,sm[i].o,HIT_FLAME);
87 }
88 }else{
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;
97 }
98 }
99 --sm[i].t;
103 static void SMK_add (int x, int y, int xv, int yv, byte t, byte s, short o) {
104 int i;
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;}
108 i=lsm;
109 sm[i].x=x;sm[i].y=y;
110 sm[i].xv=xv;sm[i].yv=yv;
111 sm[i].t=t;sm[i].s=s;
112 sm[i].o=o;
113 inclast();
116 void SMK_gas (int x0, int y0, int xr, int yr, int xv, int yv, int k) {
117 int i,x,y;
118 static int sxv,syv;
120 xv=-xv;yv=-yv;
121 sxv=xv*k;syv=yv*k;
122 k=max(abs(xv),abs(yv));
123 if(!k) return;
124 for(i=0;i<=k;i+=3) {
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) {
133 int i,x,y;
134 static int sxv,syv;
136 sxv=xv*k;syv=yv*k;
137 xv=xv-(ox<<8);yv=yv-(oy<<8);
138 k=max(abs(xv),abs(yv));
139 if(!k) return;
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);