DEADSOFTWARE

update copyrights
[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 "my.h"
26 #include "monster.h"
28 #define MAXSR 20
30 smoke_t sm[MAXSMOK];
32 static int sr_r,sxr[MAXSR],syr[MAXSR];
33 static int lsm;
35 static void *burnsnd;
36 static int burntm=0;
38 void SMK_init (void) {
39 int i;
41 for(i=0;i<MAXSMOK;++i) {sm[i].t=0;}
42 lsm=0;
43 burntm=0;
44 }
46 void SMK_alloc (void) {
47 int i;
48 burnsnd=Z_getsnd("BURN");
49 for(i=0;i<MAXSR;++i) {
50 sxr[i]=myrand(256*2+1)-256;
51 syr[i]=myrand(256*2+1)-256;
52 }
53 sr_r=0;
54 }
56 static void inclast(void) {
57 if(++lsm>=MAXSMOK) lsm=0;
58 }
60 void SMK_act (void) {
61 int i,ox,oy;
62 static obj_t o;
64 if(burntm) --burntm;
65 for(i=0;i<MAXSMOK;++i) if(sm[i].t) {
66 if(sm[i].s) {
67 ox=sm[i].x;oy=sm[i].y;
68 sm[i].xv=Z_dec(sm[i].xv,20);
69 sm[i].yv=Z_dec(sm[i].yv,20);
70 sm[i].x+=sm[i].xv/2;sm[i].y+=sm[i].yv/2;
71 if(!Z_canfit(sm[i].x>>8,(sm[i].y>>8)+3,3,7)) {
72 sm[i].x=ox;sm[i].y=oy;
73 }else if(Z_inwater(sm[i].x>>8,(sm[i].y>>8)+3,3,7)) {
74 sm[i].x=ox;sm[i].y=oy;
75 }
76 ox=sm[i].x;oy=sm[i].y;
77 sm[i].x+=sm[i].xv/2;sm[i].y+=sm[i].yv/2;
78 if(!Z_canfit(sm[i].x>>8,(sm[i].y>>8)+3,3,7)) {
79 sm[i].x=ox;sm[i].y=oy;
80 }else if(Z_inwater(sm[i].x>>8,(sm[i].y>>8)+3,3,7)) {
81 sm[i].x=ox;sm[i].y=oy;
82 }
83 if(sm[i].o!=-3) {
84 o.x=sm[i].x>>8;o.y=sm[i].y>>8;
85 o.xv=sm[i].xv>>10;o.yv=sm[i].yv>>10;
86 o.vx=o.vy=0;
87 if(!(g_time&3)) Z_hit(&o,1,sm[i].o,HIT_FLAME);
88 }
89 }else{
90 ox=sm[i].x;oy=sm[i].y;
91 sm[i].xv=Z_dec(sm[i].xv,20);
92 sm[i].yv=Z_dec(sm[i].yv,20);
93 sm[i].x+=sm[i].xv;sm[i].y+=sm[i].yv;
94 if(!Z_canfit(sm[i].x>>8,(sm[i].y>>8)+3,3,7)) {
95 sm[i].x=ox;sm[i].y=oy;
96 }else if(Z_inwater(sm[i].x>>8,(sm[i].y>>8)+3,3,7)) {
97 sm[i].x=ox;sm[i].y=oy;
98 }
99 }
100 --sm[i].t;
104 static void SMK_add (int x, int y, int xv, int yv, byte t, byte s, short o) {
105 int i;
107 if(!Z_canfit(x>>8,(y>>8)+3,3,7)) return;
108 if(Z_inwater(x>>8,(y>>8)+3,3,7)) {FX_bubble(x>>8,y>>8,xv,yv,1);return;}
109 i=lsm;
110 sm[i].x=x;sm[i].y=y;
111 sm[i].xv=xv;sm[i].yv=yv;
112 sm[i].t=t;sm[i].s=s;
113 sm[i].o=o;
114 inclast();
117 void SMK_gas (int x0, int y0, int xr, int yr, int xv, int yv, int k) {
118 int i,x,y;
119 static int sxv,syv;
121 xv=-xv;yv=-yv;
122 sxv=xv*k;syv=yv*k;
123 k=max(abs(xv),abs(yv));
124 if(!k) return;
125 for(i=0;i<=k;i+=3) {
126 x=((xv*i/k+x0)<<8)+sxr[sr_r]*xr;
127 y=((yv*i/k+y0)<<8)+syr[sr_r]*yr;
128 if(++sr_r>=MAXSR) sr_r=0;
129 SMK_add(x,y,sxv,syv,SMSN*3,0,-3);
133 void SMK_flame (int x0, int y0, int ox, int oy, int xr, int yr, int xv, int yv, int k, int o) {
134 int i,x,y;
135 static int sxv,syv;
137 sxv=xv*k;syv=yv*k;
138 xv=xv-(ox<<8);yv=yv-(oy<<8);
139 k=max(abs(xv),abs(yv));
140 if(!k) return;
141 if(!burntm) burntm=Z_sound(burnsnd,128);
142 for(i=0;i<=k;i+=200) {
143 x=xv*i/k+(x0<<8)+sxr[sr_r]*xr;
144 y=yv*i/k+(y0<<8)+syr[sr_r]*yr;
145 if(++sr_r>=MAXSR) sr_r=0;
146 SMK_add(x,y,sxv,syv,FLSN,1,o);