More code cleanups. Separated some stuff into new functions.
[crow/jumpnbump.git] / fireworks.c
1 #include "globals.h"
2
3 extern unsigned int ban_map[17][22];
4
5 void fireworks(void)
6 {
7         FILE *handle;
8         int c1, c2;
9         int s1, s2, s3;
10         char pal[768];
11         struct {
12                 char used, direction, colour;
13                 int x, y;
14                 int x_add, y_add;
15                 int timer;
16                 int anim, frame, frame_tick, image;
17         } rabbits[20];
18         struct {
19                 int x, y;
20                 int old_x, old_y;
21                 char col, back[2];
22         } stars[300];
23
24         clear_page(0, 0);
25         clear_page(1, 0);
26
27         if ((handle = dat_open("level.pcx", datfile_name, "rb")) == 0) {
28                 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
29                 return;
30         }
31         read_pcx(handle, mask_pic, 102400, pal);
32         fclose(handle);
33
34         memset(mask_pic, 0, 102400);
35
36         memset(ban_map, 0, sizeof(ban_map));
37
38         fillpalette(0, 0, 0);
39
40         for (c2 = 193; c2 < 256; c2++)
41                 clear_lines(0, c2, 1, (c2 - 192) >> 2);
42
43         setpalette(0, 256, pal);
44
45         for (c1 = 0; c1 < 20; c1++)
46                 rabbits[c1].used = 0;
47
48         rabbits[0].used = 1;
49         rabbits[0].colour = (char)rnd(4);
50         rabbits[0].x = (int) (150 + rnd(100)) << 16;
51         rabbits[0].y = 256 << 16;
52         rabbits[0].x_add = ((int) rnd(65535) << 1) - 65536;
53         if (rabbits[0].x_add > 0)
54                 rabbits[0].direction = 0;
55         else
56                 rabbits[0].direction = 1;
57         rabbits[0].y_add = -262144 + (rnd(16384) * 5);
58         rabbits[0].timer = 30 + rnd(150);
59         rabbits[0].anim = 2;
60         rabbits[0].frame = 0;
61         rabbits[0].frame_tick = 0;
62         rabbits[0].image = player_anims[rabbits[0].anim].frame[rabbits[0].frame].image + rabbits[0].colour * 18 + rabbits[0].direction * 9;
63
64         for (c1 = 0; c1 < 300; c1++) {
65                 s1 = rnd(400);
66                 s2 = rnd(256);
67                 s3 = 30 - rnd(7);
68                 stars[c1].x = stars[c1].old_x = (s1 << 16);
69                 stars[c1].y = stars[c1].old_y = (s2 << 16);
70                 stars[c1].col = s3;
71 #ifdef DOS
72                 outportw(0x3ce, ((s1 & 3) << 8) + 0x04);
73                 stars[c1].back[0] = stars[c1].back[1] = *(char *) (0xa0000 + s2 * 100 + (s1 >> 2) - __djgpp_base_address);
74 #else
75                 stars[c1].back[0] = stars[c1].back[1] = *(char *) get_vgaptr(0, s1, s2);
76 #endif
77         }
78
79         dj_set_nosound(0);
80
81         main_info.page_info[0].num_pobs = 0;
82         main_info.page_info[1].num_pobs = 0;
83         main_info.view_page = 0;
84         main_info.draw_page = 1;
85
86         while (key_pressed(1) == 0) {
87
88                 dj_mix();
89                 intr_sysupdate();
90
91                 for (c1 = 0; c1 < 300; c1++) {
92                         stars[c1].old_x = stars[c1].x;
93                         stars[c1].old_y = stars[c1].y;
94                         stars[c1].y -= (int) (31 - stars[c1].col) * 16384;
95                         if ((stars[c1].y >> 16) < 0)
96                                 stars[c1].y += 256 << 16;
97                         if ((stars[c1].y >> 16) >= 256)
98                                 stars[c1].y -= 256 << 16;
99                 }
100
101                 for (c1 = 0, c2 = 0; c1 < 20; c1++) {
102                         if (rabbits[c1].used == 1)
103                                 c2++;
104                 }
105                 if ((c2 == 0 && rnd(10000) < 200) || (c2 == 1 && rnd(10000) < 150) || (c2 == 2 && rnd(10000) < 100) || (c2 == 3 && rnd(10000) < 50)) {
106                         for (c1 = 0; c1 < 20; c1++) {
107                                 if (rabbits[c1].used == 0) {
108                                         rabbits[c1].used = 1;
109                                         rabbits[c1].colour = (char)rnd(4);
110                                         rabbits[c1].x = (int) (150 + rnd(100)) << 16;
111                                         rabbits[c1].y = 256 << 16;
112                                         rabbits[c1].x_add = ((int) rnd(65535) << 1) - 65536;
113                                         if (rabbits[c1].x_add > 0)
114                                                 rabbits[c1].direction = 0;
115                                         else
116                                                 rabbits[c1].direction = 1;
117                                         rabbits[c1].y_add = -262144 + (rnd(16384) * 5);
118                                         rabbits[c1].timer = 30 + rnd(150);
119                                         rabbits[c1].anim = 2;
120                                         rabbits[c1].frame = 0;
121                                         rabbits[c1].frame_tick = 0;
122                                         rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
123                                         break;
124                                 }
125                         }
126                 }
127
128                 dj_mix();
129
130                 main_info.page_info[main_info.draw_page].num_pobs = 0;
131
132                 for (c1 = 0; c1 < 20; c1++) {
133                         if (rabbits[c1].used == 1) {
134                                 rabbits[c1].y_add += 2048;
135                                 if (rabbits[c1].y_add > 36864 && rabbits[c1].anim != 3) {
136                                         rabbits[c1].anim = 3;
137                                         rabbits[c1].frame = 0;
138                                         rabbits[c1].frame_tick = 0;
139                                         rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
140                                 }
141                                 rabbits[c1].x += rabbits[c1].x_add;
142                                 rabbits[c1].y += rabbits[c1].y_add;
143                                 if ((rabbits[c1].x >> 16) < 16 || (rabbits[c1].x >> 16) > 400 || (rabbits[c1].y >> 16) > 256) {
144                                         rabbits[c1].used = 0;
145                                         continue;
146                                 }
147                                 rabbits[c1].timer--;
148                                 if (rabbits[c1].timer <= 0) {
149                                         rabbits[c1].used = 0;
150                                         for (c2 = 0; c2 < 6; c2++)
151                                                 add_object(OBJ_FUR, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 44 + rabbits[c1].colour * 8);
152                                         for (c2 = 0; c2 < 6; c2++)
153                                                 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 76);
154                                         for (c2 = 0; c2 < 6; c2++)
155                                                 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 77);
156                                         for (c2 = 0; c2 < 8; c2++)
157                                                 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 78);
158                                         for (c2 = 0; c2 < 10; c2++)
159                                                 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 79);
160                                         dj_play_sfx(SFX_DEATH, SFX_DEATH_FREQ, 64, 0, 0, -1);
161                                         continue;
162                                 }
163                                 rabbits[c1].frame_tick++;
164                                 if (rabbits[c1].frame_tick >= player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].ticks) {
165                                         rabbits[c1].frame++;
166                                         if (rabbits[c1].frame >= player_anims[rabbits[c1].anim].num_frames)
167                                                 rabbits[c1].frame = player_anims[rabbits[c1].anim].restart_frame;
168                                         rabbits[c1].frame_tick = 0;
169                                 }
170                                 rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
171                                 if (rabbits[c1].used == 1)
172                                         add_pob(main_info.draw_page, rabbits[c1].x >> 16, rabbits[c1].y >> 16, rabbits[c1].image, rabbit_gobs);
173                         }
174                 }
175
176                 dj_mix();
177
178                 update_objects();
179
180                 for (c1 = 0; c1 < 300; c1++) {
181 #ifdef DOS
182                         outportw(0x3ce, (((stars[c1].x >> 16) & 3) << 8) + 0x04);
183                         outportw(0x3c4, ((1 << ((stars[c1].x >> 16) & 3)) << 8) + 0x02);
184                         stars[c1].back[main_info.draw_page] = *(char *) (0xa0000 + ((int) main_info.draw_page << 15) + (stars[c1].y >> 16) * 100 + (stars[c1].x >> 18) - __djgpp_base_address);
185                         *(char *) (0xa0000 + ((int) main_info.draw_page << 15) + (stars[c1].y >> 16) * 100 + (stars[c1].x >> 18) - __djgpp_base_address) = stars[c1].col;
186 #else
187                         stars[c1].back[main_info.draw_page] = *(char *) get_vgaptr(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16);
188                         *(char *) get_vgaptr(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16) = stars[c1].col;
189 #endif
190                 }
191
192                 dj_mix();
193
194                 draw_pobs(main_info.draw_page);
195
196                 main_info.draw_page ^= 1;
197                 main_info.view_page ^= 1;
198
199                 flippage(main_info.view_page);
200
201                 wait_vrt(1);
202
203                 redraw_pob_backgrounds(main_info.draw_page);
204
205                 dj_mix();
206                 intr_sysupdate();
207
208                 for (c1 = 299; c1 >= 0; c1--) {
209 #ifdef DOS
210                         outportw(0x3c4, ((1 << ((stars[c1].old_x >> 16) & 3)) << 8) + 0x02);
211                         *(char *) (0xa0000 + ((int) main_info.draw_page << 15) + (stars[c1].old_y >> 16) * 100 + (stars[c1].old_x >> 18) - __djgpp_base_address) = stars[c1].back[main_info.draw_page];
212 #else
213                         *(char *) get_vgaptr(main_info.draw_page, stars[c1].old_x >> 16, stars[c1].old_y >> 16) = stars[c1].back[main_info.draw_page];
214 #endif
215                 }
216
217         }
218
219         dj_set_nosound(1);
220
221 }
222