39cfba1eb9b411d644dfaacaef5bdcb9b87d92b2
[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                 int 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                 int col;
22                 pixel_t back[2];
23         } stars[300];
24
25         register_background(NULL, NULL);
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         register_mask(mask_pic);
36
37         recalculate_gob(&rabbit_gobs, pal);
38         recalculate_gob(&object_gobs, pal);
39
40         memset(ban_map, 0, sizeof(ban_map));
41
42         fillpalette(0, 0, 0);
43
44         draw_begin();
45
46         for (c2 = 193; c2 < 256; c2++) {
47                 clear_lines(0, c2, 1, get_color((c2 - 192) >> 2, pal));
48                 clear_lines(1, c2, 1, get_color((c2 - 192) >> 2, pal));
49         }
50
51         draw_end();
52
53         setpalette(0, 256, pal);
54
55         for (c1 = 0; c1 < 20; c1++)
56                 rabbits[c1].used = 0;
57
58         rabbits[0].used = 1;
59         rabbits[0].colour = rnd(4);
60         rabbits[0].x = (int) (150 + rnd(100)) << 16;
61         rabbits[0].y = 256 << 16;
62         rabbits[0].x_add = ((int) rnd(65535) << 1) - 65536;
63         if (rabbits[0].x_add > 0)
64                 rabbits[0].direction = 0;
65         else
66                 rabbits[0].direction = 1;
67         rabbits[0].y_add = -262144 + (rnd(16384) * 5);
68         rabbits[0].timer = 30 + rnd(150);
69         rabbits[0].anim = 2;
70         rabbits[0].frame = 0;
71         rabbits[0].frame_tick = 0;
72         rabbits[0].image = player_anims[rabbits[0].anim].frame[rabbits[0].frame].image + rabbits[0].colour * 18 + rabbits[0].direction * 9;
73
74         draw_begin();
75         for (c1 = 0; c1 < 300; c1++) {
76                 s1 = rnd(400);
77                 s2 = rnd(256);
78                 s3 = 30 - rnd(7);
79                 stars[c1].x = stars[c1].old_x = (s1 << 16);
80                 stars[c1].y = stars[c1].old_y = (s2 << 16);
81                 stars[c1].col = s3;
82                 stars[c1].back[0] = stars[c1].back[1] = get_pixel(0, s1, s2);
83         }
84         draw_end();
85
86         dj_set_nosound(0);
87
88         main_info.page_info[0].num_pobs = 0;
89         main_info.page_info[1].num_pobs = 0;
90         main_info.view_page = 0;
91         main_info.draw_page = 1;
92
93         while (key_pressed(1) == 0) {
94
95                 dj_mix();
96                 intr_sysupdate();
97
98                 for (c1 = 0; c1 < 300; c1++) {
99                         stars[c1].old_x = stars[c1].x;
100                         stars[c1].old_y = stars[c1].y;
101                         stars[c1].y -= (int) (31 - stars[c1].col) * 16384;
102                         if ((stars[c1].y >> 16) < 0)
103                                 stars[c1].y += JNB_HEIGHT << 16;
104                         if ((stars[c1].y >> 16) >= JNB_HEIGHT)
105                                 stars[c1].y -= JNB_HEIGHT << 16;
106                 }
107
108                 for (c1 = 0, c2 = 0; c1 < 20; c1++) {
109                         if (rabbits[c1].used == 1)
110                                 c2++;
111                 }
112                 if ((c2 == 0 && rnd(10000) < 200) || (c2 == 1 && rnd(10000) < 150) || (c2 == 2 && rnd(10000) < 100) || (c2 == 3 && rnd(10000) < 50)) {
113                         for (c1 = 0; c1 < 20; c1++) {
114                                 if (rabbits[c1].used == 0) {
115                                         rabbits[c1].used = 1;
116                                         rabbits[c1].colour = rnd(4);
117                                         rabbits[c1].x = (int) (150 + rnd(100)) << 16;
118                                         rabbits[c1].y = 256 << 16;
119                                         rabbits[c1].x_add = ((int) rnd(65535) << 1) - 65536;
120                                         if (rabbits[c1].x_add > 0)
121                                                 rabbits[c1].direction = 0;
122                                         else
123                                                 rabbits[c1].direction = 1;
124                                         rabbits[c1].y_add = -262144 + (rnd(16384) * 5);
125                                         rabbits[c1].timer = 30 + rnd(150);
126                                         rabbits[c1].anim = 2;
127                                         rabbits[c1].frame = 0;
128                                         rabbits[c1].frame_tick = 0;
129                                         rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
130                                         break;
131                                 }
132                         }
133                 }
134
135                 dj_mix();
136
137                 main_info.page_info[main_info.draw_page].num_pobs = 0;
138
139                 for (c1 = 0; c1 < 20; c1++) {
140                         if (rabbits[c1].used == 1) {
141                                 rabbits[c1].y_add += 2048;
142                                 if (rabbits[c1].y_add > 36864 && rabbits[c1].anim != 3) {
143                                         rabbits[c1].anim = 3;
144                                         rabbits[c1].frame = 0;
145                                         rabbits[c1].frame_tick = 0;
146                                         rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
147                                 }
148                                 rabbits[c1].x += rabbits[c1].x_add;
149                                 rabbits[c1].y += rabbits[c1].y_add;
150                                 if ((rabbits[c1].x >> 16) < 16 || (rabbits[c1].x >> 16) > 400 || (rabbits[c1].y >> 16) > 256) {
151                                         rabbits[c1].used = 0;
152                                         continue;
153                                 }
154                                 rabbits[c1].timer--;
155                                 if (rabbits[c1].timer <= 0) {
156                                         rabbits[c1].used = 0;
157                                         for (c2 = 0; c2 < 6; c2++)
158                                                 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);
159                                         for (c2 = 0; c2 < 6; c2++)
160                                                 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);
161                                         for (c2 = 0; c2 < 6; c2++)
162                                                 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);
163                                         for (c2 = 0; c2 < 8; c2++)
164                                                 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);
165                                         for (c2 = 0; c2 < 10; c2++)
166                                                 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);
167                                         dj_play_sfx(SFX_DEATH, SFX_DEATH_FREQ, 64, 0, 0, -1);
168                                         continue;
169                                 }
170                                 rabbits[c1].frame_tick++;
171                                 if (rabbits[c1].frame_tick >= player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].ticks) {
172                                         rabbits[c1].frame++;
173                                         if (rabbits[c1].frame >= player_anims[rabbits[c1].anim].num_frames)
174                                                 rabbits[c1].frame = player_anims[rabbits[c1].anim].restart_frame;
175                                         rabbits[c1].frame_tick = 0;
176                                 }
177                                 rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
178                                 if (rabbits[c1].used == 1)
179                                         add_pob(main_info.draw_page, rabbits[c1].x >> 16, rabbits[c1].y >> 16, rabbits[c1].image, &rabbit_gobs);
180                         }
181                 }
182
183                 dj_mix();
184
185                 update_objects();
186
187                 draw_begin();
188
189                 for (c1 = 0; c1 < 300; c1++) {
190                         stars[c1].back[main_info.draw_page] = get_pixel(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16);
191                         set_pixel(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16, get_color(stars[c1].col, pal));
192                 }
193
194                 dj_mix();
195
196                 draw_pobs(main_info.draw_page);
197                 
198                 draw_end();
199
200                 main_info.draw_page ^= 1;
201                 main_info.view_page ^= 1;
202
203                 flippage(main_info.view_page);
204
205                 wait_vrt(1);
206
207                 draw_begin();
208
209                 redraw_pob_backgrounds(main_info.draw_page);
210
211                 dj_mix();
212                 intr_sysupdate();
213
214                 for (c1 = 299; c1 >= 0; c1--) {
215                         set_pixel(main_info.draw_page, stars[c1].old_x >> 16, stars[c1].old_y >> 16, stars[c1].back[main_info.draw_page]);
216                 }
217
218                 draw_end();
219
220         }
221
222         dj_set_nosound(1);
223
224 }
225