Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8526 maxcodehac 1
/*
2
 * fireworks.c
3
 * Copyright (C) 1998 Brainchild Design - http://brainchilddesign.com/
4
 *
5
 * Copyright (C) 2001 Chuck Mason 
6
 *
7
 * Copyright (C) 2002 Florian Schulze 
8
 *
9
 * This file is part of Jump'n'Bump.
10
 *
11
 * Jump'n'Bump is free software; you can redistribute it and/or modify
12
 * it under the terms of the GNU General Public License as published by
13
 * the Free Software Foundation; either version 2 of the License, or
14
 * (at your option) any later version.
15
 *
16
 * Jump'n'Bump is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
 */
25
 
26
#include "globals.h"
27
 
28
extern unsigned int ban_map[17][22];
29
 
30
void fireworks(void)
31
{
32
	char *handle;
33
	int c1, c2;
34
	int s1, s2, s3;
35
	char pal[768];
36
	struct {
37
		int used, direction, colour;
38
		int x, y;
39
		int x_add, y_add;
40
		int timer;
41
		int anim, frame, frame_tick, image;
42
	} rabbits[20];
43
	struct {
44
		int x, y;
45
		int old_x, old_y;
46
		int col;
47
		int back[2];
48
	} stars[300];
49
 
50
	register_background(NULL, NULL);
51
 
52
	if ((handle = dat_open("level.pcx")) == 0) {
53
		strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
54
		return;
55
	}
56
	read_pcx(handle, mask_pic, JNB_WIDTH*JNB_HEIGHT, pal);
57
 
58
	memset(mask_pic, 0, JNB_WIDTH*JNB_HEIGHT);
59
	register_mask(mask_pic);
60
 
61
	recalculate_gob(&rabbit_gobs, pal);
62
	recalculate_gob(&object_gobs, pal);
63
 
64
	memset(ban_map, 0, sizeof(ban_map));
65
 
66
	fillpalette(0, 0, 0);
67
 
68
	draw_begin();
69
 
70
	for (c2 = JNB_HEIGHT - 63; c2 < JNB_HEIGHT; c2++) {
71
		clear_lines(0, c2, 1, get_color((c2 - 192) >> 2, pal));
72
		clear_lines(1, c2, 1, get_color((c2 - 192) >> 2, pal));
73
	}
74
 
75
	draw_end();
76
 
77
	setpalette(0, 256, pal);
78
 
79
	for (c1 = 0; c1 < 20; c1++)
80
		rabbits[c1].used = 0;
81
 
82
	rabbits[0].used = 1;
83
	rabbits[0].colour = rnd(4);
84
	rabbits[0].x = (int) (150 + rnd(100)) << 16;
85
	rabbits[0].y = 256 << 16;
86
	rabbits[0].x_add = ((int) rnd(65535) << 1) - 65536;
87
	if (rabbits[0].x_add > 0)
88
		rabbits[0].direction = 0;
89
	else
90
		rabbits[0].direction = 1;
91
	rabbits[0].y_add = -262144 + (rnd(16384) * 5);
92
	rabbits[0].timer = 30 + rnd(150);
93
	rabbits[0].anim = 2;
94
	rabbits[0].frame = 0;
95
	rabbits[0].frame_tick = 0;
96
	rabbits[0].image = player_anims[rabbits[0].anim].frame[rabbits[0].frame].image + rabbits[0].colour * 18 + rabbits[0].direction * 9;
97
 
98
	draw_begin();
99
	for (c1 = 0; c1 < 300; c1++) {
100
		s1 = rnd(JNB_WIDTH);
101
		s2 = rnd(JNB_HEIGHT);
102
		s3 = 30 - rnd(7);
103
		stars[c1].x = stars[c1].old_x = (s1 << 16);
104
		stars[c1].y = stars[c1].old_y = (s2 << 16);
105
		stars[c1].col = s3;
106
		stars[c1].back[0] = stars[c1].back[1] = get_pixel(0, s1, s2);
107
	}
108
	draw_end();
109
 
110
	dj_set_nosound(0);
111
 
112
	main_info.page_info[0].num_pobs = 0;
113
	main_info.page_info[1].num_pobs = 0;
114
	main_info.view_page = 0;
115
	main_info.draw_page = 1;
116
 
117
	while (key_pressed(1) == 0) {
118
 
119
		dj_mix();
120
		intr_sysupdate();
121
 
122
		for (c1 = 0; c1 < 300; c1++) {
123
			stars[c1].old_x = stars[c1].x;
124
			stars[c1].old_y = stars[c1].y;
125
			stars[c1].y -= (int) (31 - stars[c1].col) * 16384;
126
			if ((stars[c1].y >> 16) < 0)
127
				stars[c1].y += JNB_HEIGHT << 16;
128
			if ((stars[c1].y >> 16) >= JNB_HEIGHT)
129
				stars[c1].y -= JNB_HEIGHT << 16;
130
		}
131
 
132
		for (c1 = 0, c2 = 0; c1 < 20; c1++) {
133
			if (rabbits[c1].used == 1)
134
				c2++;
135
		}
136
		if ((c2 == 0 && rnd(10000) < 200) || (c2 == 1 && rnd(10000) < 150) || (c2 == 2 && rnd(10000) < 100) || (c2 == 3 && rnd(10000) < 50)) {
137
			for (c1 = 0; c1 < 20; c1++) {
138
				if (rabbits[c1].used == 0) {
139
					rabbits[c1].used = 1;
140
					rabbits[c1].colour = rnd(4);
141
					rabbits[c1].x = (int) (150 + rnd(100)) << 16;
142
					rabbits[c1].y = 256 << 16;
143
					rabbits[c1].x_add = ((int) rnd(65535) << 1) - 65536;
144
					if (rabbits[c1].x_add > 0)
145
						rabbits[c1].direction = 0;
146
					else
147
						rabbits[c1].direction = 1;
148
					rabbits[c1].y_add = -262144 + (rnd(16384) * 5);
149
					rabbits[c1].timer = 30 + rnd(150);
150
					rabbits[c1].anim = 2;
151
					rabbits[c1].frame = 0;
152
					rabbits[c1].frame_tick = 0;
153
					rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
154
					break;
155
				}
156
			}
157
		}
158
 
159
		dj_mix();
160
 
161
		main_info.page_info[main_info.draw_page].num_pobs = 0;
162
 
163
		for (c1 = 0; c1 < 20; c1++) {
164
			if (rabbits[c1].used == 1) {
165
				rabbits[c1].y_add += 2048;
166
				if (rabbits[c1].y_add > 36864 && rabbits[c1].anim != 3) {
167
					rabbits[c1].anim = 3;
168
					rabbits[c1].frame = 0;
169
					rabbits[c1].frame_tick = 0;
170
					rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
171
				}
172
				rabbits[c1].x += rabbits[c1].x_add;
173
				rabbits[c1].y += rabbits[c1].y_add;
174
				if ((rabbits[c1].x >> 16) < 16 || (rabbits[c1].x >> 16) > JNB_WIDTH || (rabbits[c1].y >> 16) > JNB_HEIGHT) {
175
					rabbits[c1].used = 0;
176
					continue;
177
				}
178
				rabbits[c1].timer--;
179
				if (rabbits[c1].timer <= 0) {
180
					rabbits[c1].used = 0;
181
					for (c2 = 0; c2 < 6; c2++)
182
						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);
183
					for (c2 = 0; c2 < 6; c2++)
184
						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);
185
					for (c2 = 0; c2 < 6; c2++)
186
						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);
187
					for (c2 = 0; c2 < 8; c2++)
188
						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);
189
					for (c2 = 0; c2 < 10; c2++)
190
						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);
191
					dj_play_sfx(SFX_DEATH, SFX_DEATH_FREQ, 64, 0, 0, -1);
192
					continue;
193
				}
194
				rabbits[c1].frame_tick++;
195
				if (rabbits[c1].frame_tick >= player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].ticks) {
196
					rabbits[c1].frame++;
197
					if (rabbits[c1].frame >= player_anims[rabbits[c1].anim].num_frames)
198
						rabbits[c1].frame = player_anims[rabbits[c1].anim].restart_frame;
199
					rabbits[c1].frame_tick = 0;
200
				}
201
				rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
202
				if (rabbits[c1].used == 1)
203
					add_pob(main_info.draw_page, rabbits[c1].x >> 16, rabbits[c1].y >> 16, rabbits[c1].image, &rabbit_gobs);
204
			}
205
		}
206
 
207
		dj_mix();
208
 
209
		update_objects();
210
 
211
		draw_begin();
212
 
213
		for (c1 = 0; c1 < 300; c1++) {
214
			stars[c1].back[main_info.draw_page] = get_pixel(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16);
215
			set_pixel(main_info.draw_page, stars[c1].x >> 16, stars[c1].y >> 16, get_color(stars[c1].col, pal));
216
		}
217
 
218
		dj_mix();
219
 
220
		draw_pobs(main_info.draw_page);
221
 
222
		draw_end();
223
 
224
		main_info.draw_page ^= 1;
225
		main_info.view_page ^= 1;
226
 
227
		flippage(main_info.view_page);
228
 
229
		wait_vrt(1);
230
 
231
		draw_begin();
232
 
233
		redraw_pob_backgrounds(main_info.draw_page);
234
 
235
		dj_mix();
236
		intr_sysupdate();
237
 
238
		for (c1 = 299; c1 >= 0; c1--) {
239
			set_pixel(main_info.draw_page, stars[c1].old_x >> 16, stars[c1].old_y >> 16, stars[c1].back[main_info.draw_page]);
240
		}
241
 
242
		draw_end();
243
 
244
	}
245
 
246
	dj_set_nosound(1);
247
 
248
}
249