8ec410d34eb61f6b842ab19cece7c90e1c3b312e
[rocksndiamonds.git] / src / game_em / synchro_3.c
1 /* third part of synchro.
2  *
3  * handle global elements.
4  *
5  * this should be spread over the frames for reduced cpu load.
6  */
7
8 #include "main_em.h"
9
10
11 void synchro_3(void)
12 {
13   int x;
14   int y;
15   int count;
16   unsigned int random;
17
18   /* update variables */
19
20   if (lev.score > 9999)
21     lev.score = 9999;
22
23   if (lev.android_move_cnt-- == 0)
24     lev.android_move_cnt = lev.android_move_time;
25   if (lev.android_clone_cnt-- == 0)
26     lev.android_clone_cnt = lev.android_clone_time;
27   if (lev.ball_state)
28     if (lev.ball_cnt-- == 0)
29       lev.ball_cnt = lev.ball_time;
30   if (lev.lenses_cnt)
31     lev.lenses_cnt--;
32   if (lev.magnify_cnt)
33     lev.magnify_cnt--;
34   if (lev.wheel_cnt)
35     lev.wheel_cnt--;
36   if (lev.wind_cnt)
37     lev.wind_cnt--;
38   if (lev.wonderwall_time && lev.wonderwall_state)
39     lev.wonderwall_time--;
40
41   if (lev.wheel_cnt)
42     play_element_sound(lev.wheel_x, lev.wheel_y, SOUND_wheel, Xwheel);
43
44   /* grow amoeba */
45
46   random = RandomEM;
47
48   for (count = lev.amoeba_time; count--;)
49   {
50     x = (random >> 10) % (WIDTH - 2);
51     y = (random >> 20) % (HEIGHT - 2);
52     switch (Cave[x][y])
53     {
54       case Xblank:
55       case Xacid_splash_e:
56       case Xacid_splash_w:
57       case Xgrass:
58       case Xdirt:
59       case Xsand:
60       case Xplant:
61       case Yplant:
62         if (tab_amoeba[Cave[x][y-1]] ||
63             tab_amoeba[Cave[x+1][y]] ||
64             tab_amoeba[Cave[x][y+1]] ||
65             tab_amoeba[Cave[x-1][y]])
66           Cave[x][y] = Xdrip;
67     }
68
69     random = random * 129 + 1;
70   }
71
72   RandomEM = random;
73
74   /* handle explosions */
75
76   for (y = 1; y < HEIGHT - 1; y++)
77     for (x = 1; x < WIDTH - 1; x++)
78     {
79       switch (Cave[x][y])
80       {
81         case Znormal:
82           Cave[x][y] = Xboom_1;
83           Cave[x][y-1] = tab_explode_normal[Cave[x][y-1]];
84           Cave[x-1][y] = tab_explode_normal[Cave[x-1][y]];
85           Cave[x+1][y] = tab_explode_normal[Cave[x+1][y]];
86           Cave[x][y+1] = tab_explode_normal[Cave[x][y+1]];
87           Cave[x-1][y-1] = tab_explode_normal[Cave[x-1][y-1]];
88           Cave[x+1][y-1] = tab_explode_normal[Cave[x+1][y-1]];
89           Cave[x-1][y+1] = tab_explode_normal[Cave[x-1][y+1]];
90           Cave[x+1][y+1] = tab_explode_normal[Cave[x+1][y+1]];
91           break;
92
93         case Zdynamite:
94           Cave[x][y] = Xboom_1;
95           Cave[x][y-1] = tab_explode_dynamite[Cave[x][y-1]];
96           Cave[x-1][y] = tab_explode_dynamite[Cave[x-1][y]];
97           Cave[x+1][y] = tab_explode_dynamite[Cave[x+1][y]];
98           Cave[x][y+1] = tab_explode_dynamite[Cave[x][y+1]];
99           Cave[x-1][y-1] = tab_explode_dynamite[Cave[x-1][y-1]];
100           Cave[x+1][y-1] = tab_explode_dynamite[Cave[x+1][y-1]];
101           Cave[x-1][y+1] = tab_explode_dynamite[Cave[x-1][y+1]];
102           Cave[x+1][y+1] = tab_explode_dynamite[Cave[x+1][y+1]];
103           break;
104       }
105     }
106
107   /* triple buffering */
108
109   for (y = 0; y < HEIGHT; y++)
110     for (x = 0; x < WIDTH; x++)
111       Next[x][y] = Cave[x][y];
112 }