Imported contents: kraptor_final_apr_03_2004.tar.gz
[kraptor.git] / src / clima.c
blobde89a9f56e13a5e0a690f6d7e998715aa564353f
1 // ------------------------------------
2 // clima.c
3 // ------------------------------------
4 // Modulo de efectos climaticos
5 // Por Kronoman
6 // En memoria de mi querido padre
7 // Copyright (c) 2002, Kronoman
8 // ------------------------------------
11 #include <allegro.h>
12 #include "clima.h"
13 #include "azar.h"
14 #include "global.h"
16 static CLIMA_P clima_p[MAX_CLIMA_P]; // contenedor de particulas
17 static int clima_cant = 0; // cantidad de particulas 0..MAX_CLIMA_P
19 // auxiliar que reinicia una particula individual
20 // parametros:
21 // idem a init_clima,
22 // i es el indice de la particula
23 static void reinit_clima_part(BITMAP *bmp, int c, int t, int d, int i )
25 int c2;
26 int minx = 50, miny = 50 , maxx = 100 , maxy = 150; // velocidades minimas y maximas
28 // info extra
29 clima_p[i].t = t;
30 clima_p[i].d = d;
32 // iniciar coordenadas de las particulas y direccion
33 clima_p[i].y = itofix( rand_ex(0, bmp->h) );
34 clima_p[i].x = itofix( rand_ex(0, bmp->w) );
36 // color y radio
37 switch (t)
39 case 0: // lluvia
40 c2 = rand_ex(200, 255);
41 clima_p[i].col = makecol(0,128,c2); // tonos de azul
42 clima_p[i].r = 1;
43 minx = 80;
44 maxx = 120;
45 miny = 60;
46 maxy = 180;
47 break;
49 case 1: // nieve
50 c2 = rand_ex(192, 255);
51 clima_p[i].col = makecol(c2,c2,c2); // tono de gris
52 clima_p[i].r = rand_ex(1,5); // radio
53 minx = 40;
54 maxx = 110;
55 miny = 50;
56 maxy = 150;
57 break;
59 default: // error, el tipo no existe, no poner clima
60 clima_cant = 0;
61 return;
62 break;
65 // velocidad de particulas
66 clima_p[i].dx = ftofix( (float)rand_ex(minx, maxx) / 10.0);
67 clima_p[i].dy = ftofix( (float)rand_ex(miny, maxy) / 10.0);
69 // si hay que ir a la izquierda...
70 if (d == 0) clima_p[i].dx = fixmul(clima_p[i].dx , itofix(-1)); // a la izquierda
74 // Inicializa el clima
75 // Parametros:
76 // bmp = bitmap de buffer
77 // c = cantidad de particulas
78 // t = tipo: 0 = lluvia, 1 = nieve, etc
79 // d = direccion de caida: 0 = izquierda, 1 = derecha
81 void init_clima(BITMAP *bmp, int c, int t, int d)
83 int i;
84 if (c < 1 || c > MAX_CLIMA_P)
86 clima_cant = 0;
87 return;
89 // iniciar particulas
91 for (i=0; i < c; i ++)
93 reinit_clima_part(bmp, c, t, d, i );
94 } // fin for
96 clima_cant = c;
100 // mueve el clima
101 // parametros:
102 // bmp = bitmap de uso
103 void mover_clima(BITMAP *bmp)
105 int i;
106 for (i=0; i < clima_cant; i ++)
108 // mover clima
109 clima_p[i].x = fixadd(clima_p[i].x, clima_p[i].dx);
110 clima_p[i].y = fixadd(clima_p[i].y, clima_p[i].dy);
111 // reiniciar particula si se sale
112 if (clima_p[i].x < 0 || fixtoi(clima_p[i].x) > bmp->w ||
113 clima_p[i].y < 0 || fixtoi(clima_p[i].y) > bmp->h)
115 reinit_clima_part(bmp, clima_cant, clima_p[i].t, clima_p[i].d, i );
117 } // fin for
121 // dibuja el clima
122 // parametros:
123 // bmp = bitmap de uso
124 void dibuja_clima(BITMAP *bmp)
126 int i;
127 for (i=0; i < clima_cant; i ++)
129 switch (clima_p[i].t)
131 case 0: // lluvia
133 if (nivel_detalle > 9)
135 drawing_mode(DRAW_MODE_TRANS, NULL, 0,0); // lluvia transparente, cool!
136 triangle(bmp,
137 fixtoi(clima_p[i].x),
138 fixtoi(clima_p[i].y),
139 fixtoi(fixadd(clima_p[i].x, clima_p[i].dx)),
140 fixtoi(fixadd(clima_p[i].y, clima_p[i].dy)),
141 fixtoi(clima_p[i].x),
142 fixtoi(clima_p[i].y)+(rand()%4)+1,
143 clima_p[i].col);
144 solid_mode();
146 else
148 line(bmp,
149 fixtoi(clima_p[i].x),
150 fixtoi(clima_p[i].y),
151 fixtoi(fixadd(clima_p[i].x, clima_p[i].dx)),
152 fixtoi(fixadd(clima_p[i].y, clima_p[i].dy)),
153 clima_p[i].col);
155 break;
157 case 1: // nieve
158 circlefill(bmp,
159 fixtoi(clima_p[i].x),
160 fixtoi(clima_p[i].y),
161 clima_p[i].r,
162 clima_p[i].col);
163 break;
165 default: // error, el tipo no existe, no dibujar
166 break;
168 } // fin for