6 char menu_cur_pal[768];
10 "by Brainchild Design in 1998.",
11 "Code by Mattias Brynervall.",
12 "Graphics by Martin Magnusson",
13 "and Andreas Brynervall.",
14 "Music by Anders Nilsson.",
15 "Linux port by Chuck Mason.",
16 "Visit our homepage at:",
17 "http://www.algonet.se/~mattiasb",
18 "Jump 'n Bump is e-mailware.",
19 "That means you're supposed to send us an e-mail!",
20 "Write for example where you're from",
21 "and what you thought about this game.",
22 "If you do that, you will greatly encourage us",
23 "to make more games for you!",
24 "Send your e-mail to: matbr656@student.liu.se",
25 "Oh, and by the way, there's a lot of secrets!",
26 "If you can't find them, you'd better ask us...",
27 "If you'd like to contact a specific member of BCD,",
28 "these are their e-mail addresses:",
29 "Andreas Brynervall: andreasb@acc.umu.se",
30 "Mattias Brynervall: matbr656@student.liu.se",
31 "Martin Magnusson: marma102@student.liu.se",
32 "Anders Nilsson: equel@swipnet.se",
36 #define NUM_MESSAGES (sizeof(message)/sizeof(char *))
42 char end_loop_flag, new_game_flag, fade_flag;
43 char mod_vol = 0, mod_fade_direction = 0;
45 int fade_dir, fade_count, fade_tick;
52 mod_fade_direction = 1;
53 dj_ready_mod(MOD_MENU);
54 dj_set_mod_volume(mod_vol);
55 dj_set_sfx_volume(64);
59 memset(fade_pal, 0, 48);
60 setpalette(240, 16, fade_pal);
65 cur_message = NUM_MESSAGES - 1;
67 main_info.page_info[0].num_pobs = 0;
68 main_info.page_info[1].num_pobs = 0;
69 main_info.view_page = 0;
70 main_info.draw_page = 1;
72 esc_pressed = key_pressed(1);
73 end_loop_flag = new_game_flag = 0;
80 if (key_pressed(1) == 1 && esc_pressed == 0) {
83 memset(menu_pal, 0, 768);
84 mod_fade_direction = 0;
85 } else if (key_pressed(1) == 0)
88 if (main_info.mouse_enabled == 1)
90 if (main_info.joy_enabled == 1)
92 for (c1 = 0; c1 < 4; c1++) {
93 if (end_loop_flag == 1 && new_game_flag == 1) {
94 if ((player[c1].x >> 16) > (165 + c1 * 2)) {
95 if (player[c1].x_add < 0)
96 player[c1].x_add += 16384;
98 player[c1].x_add += 12288;
99 if (player[c1].x_add > 98304L)
100 player[c1].x_add = 98304L;
101 player[c1].direction = 0;
102 if (player[c1].anim == 0) {
104 player[c1].frame = 0;
105 player[c1].frame_tick = 0;
106 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
108 player[c1].enabled = 1;
110 if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 0) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 0)) {
111 if (player[c1].y_add < 0) {
112 player[c1].y_add += 32768;
113 if (player[c1].y_add > 0)
114 player[c1].y_add = 0;
117 player[c1].y_add += 12288;
118 if (player[c1].y_add > 36864 && player[c1].anim != 3) {
120 player[c1].frame = 0;
121 player[c1].frame_tick = 0;
122 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
124 player[c1].y += player[c1].y_add;
125 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
126 if ((player[c1].y >> 16) > (160 + c1 * 2)) {
127 player[c1].y = (160L + c1 * 2) << 16;
128 player[c1].y_add = 0;
129 if (player[c1].anim != 0 && player[c1].anim != 1) {
131 player[c1].frame = 0;
132 player[c1].frame_tick = 0;
133 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
137 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
138 player[c1].y = (138L + c1 * 2) << 16;
139 player[c1].y_add = 0;
140 if (player[c1].anim != 0 && player[c1].anim != 1) {
142 player[c1].frame = 0;
143 player[c1].frame_tick = 0;
144 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
146 if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 0) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 0))
147 player[c1].jump_ready = 1;
150 player[c1].x += player[c1].x_add;
151 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
152 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (190 + c1 * 2)) {
153 player[c1].x = (165L + c1 * 2) << 16;
154 player[c1].x_add = 0;
156 if ((player[c1].x >> 16) > (190 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
157 player[c1].x = (208L + c1 * 2) << 16;
158 player[c1].x_add = 0;
162 if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_LEFT) == 1 && key_pressed(KEY_PL3_RIGHT) == 1) || (c1 == 3 && key_pressed(KEY_PL4_LEFT) == 1 && key_pressed(KEY_PL4_RIGHT) == 1)) {
163 if (player[c1].direction == 1) {
164 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
165 if (player[c1].x_add > 0) {
166 player[c1].x_add -= 16384;
167 if ((player[c1].y >> 16) >= (160 + c1 * 2))
168 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
170 player[c1].x_add -= 12288;
172 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
173 if (player[c1].x_add > 0) {
174 player[c1].x_add -= 16384;
175 if ((player[c1].y >> 16) >= (138 + c1 * 2))
176 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
178 player[c1].x_add -= 12288;
180 if (player[c1].x_add < -98304L)
181 player[c1].x_add = -98304L;
182 player[c1].direction = 1;
183 if (player[c1].anim == 0) {
185 player[c1].frame = 0;
186 player[c1].frame_tick = 0;
187 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
190 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
191 if (player[c1].x_add < 0) {
192 player[c1].x_add += 16384;
193 if ((player[c1].y >> 16) >= (160 + c1 * 2))
194 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
196 player[c1].x_add += 12288;
198 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
199 if (player[c1].x_add < 0) {
200 player[c1].x_add += 16384;
201 if ((player[c1].y >> 16) >= (138 + c1 * 2))
202 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
204 player[c1].x_add += 12288;
206 if (player[c1].x_add > 98304L)
207 player[c1].x_add = 98304L;
208 player[c1].direction = 0;
209 if (player[c1].anim == 0) {
211 player[c1].frame = 0;
212 player[c1].frame_tick = 0;
213 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
216 } else if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_LEFT) == 1) || (c1 == 3 && key_pressed(KEY_PL4_LEFT) == 1)) {
217 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
218 if (player[c1].x_add > 0) {
219 player[c1].x_add -= 16384;
220 if ((player[c1].y >> 16) >= (160 + c1 * 2))
221 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
223 player[c1].x_add -= 12288;
225 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
226 if (player[c1].x_add > 0) {
227 player[c1].x_add -= 16384;
228 if ((player[c1].y >> 16) >= (138 + c1 * 2))
229 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
231 player[c1].x_add -= 12288;
233 if (player[c1].x_add < -98304L)
234 player[c1].x_add = -98304L;
235 player[c1].direction = 1;
236 if (player[c1].anim == 0) {
238 player[c1].frame = 0;
239 player[c1].frame_tick = 0;
240 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
242 } else if ((c1 == 0 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && key_pressed(KEY_PL3_RIGHT) == 1) || (c1 == 3 && key_pressed(KEY_PL4_RIGHT) == 1)) {
243 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
244 if (player[c1].x_add < 0) {
245 player[c1].x_add += 16384;
246 if ((player[c1].y >> 16) >= (160 + c1 * 2))
247 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
249 player[c1].x_add += 12288;
251 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
252 if (player[c1].x_add < 0) {
253 player[c1].x_add += 16384;
254 if ((player[c1].y >> 16) >= (138 + c1 * 2))
255 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
257 player[c1].x_add += 12288;
259 if (player[c1].x_add > 98304L)
260 player[c1].x_add = 98304L;
261 player[c1].direction = 0;
262 if (player[c1].anim == 0) {
264 player[c1].frame = 0;
265 player[c1].frame_tick = 0;
266 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
269 if (((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) && (player[c1].y >> 16) >= (160 + c1 * 2)) {
270 if (player[c1].x_add < 0) {
271 player[c1].x_add += 16384;
272 if (player[c1].x_add > 0)
273 player[c1].x_add = 0;
274 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
275 } else if (player[c1].x_add > 0) {
276 player[c1].x_add -= 16384;
277 if (player[c1].x_add < 0)
278 player[c1].x_add = 0;
279 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
282 if ((((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) && (player[c1].y >> 16) >= (138 + c1 * 2))) {
283 if (player[c1].x_add < 0) {
284 player[c1].x_add += 16384;
285 if (player[c1].x_add > 0)
286 player[c1].x_add = 0;
287 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
288 } else if (player[c1].x_add > 0) {
289 player[c1].x_add -= 16384;
290 if (player[c1].x_add < 0)
291 player[c1].x_add = 0;
292 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
295 if (player[c1].anim == 1) {
297 player[c1].frame = 0;
298 player[c1].frame_tick = 0;
299 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
302 if (player[c1].jump_ready == 1 && ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 1) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 1) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 1) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 1))) {
303 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
304 if ((player[c1].y >> 16) >= (160 + c1 * 2)) {
305 player[c1].y_add = -280000L;
307 player[c1].frame = 0;
308 player[c1].frame_tick = 0;
309 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
310 player[c1].jump_ready = 0;
311 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
314 if ((player[c1].y >> 16) >= (138 + c1 * 2)) {
315 player[c1].y_add = -280000L;
317 player[c1].frame = 0;
318 player[c1].frame_tick = 0;
319 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
320 player[c1].jump_ready = 0;
321 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
325 if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 0) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 0)) {
326 if (player[c1].y_add < 0) {
327 player[c1].y_add += 32768;
328 if (player[c1].y_add > 0)
329 player[c1].y_add = 0;
332 if ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && key_pressed(KEY_PL3_JUMP) == 0) || (c1 == 3 && key_pressed(KEY_PL4_JUMP) == 0))
333 player[c1].jump_ready = 1;
334 player[c1].y_add += 12288;
335 if (player[c1].y_add > 36864 && player[c1].anim != 3) {
337 player[c1].frame = 0;
338 player[c1].frame_tick = 0;
339 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
341 player[c1].y += player[c1].y_add;
342 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
343 if ((player[c1].y >> 16) > (160 + c1 * 2)) {
344 player[c1].y = (160L + c1 * 2) << 16;
345 player[c1].y_add = 0;
346 if (player[c1].anim != 0 && player[c1].anim != 1) {
348 player[c1].frame = 0;
349 player[c1].frame_tick = 0;
350 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
354 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
355 player[c1].y = (138L + c1 * 2) << 16;
356 player[c1].y_add = 0;
357 if (player[c1].anim != 0 && player[c1].anim != 1) {
359 player[c1].frame = 0;
360 player[c1].frame_tick = 0;
361 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
365 player[c1].x += player[c1].x_add;
366 if ((player[c1].x >> 16) < 0) {
368 player[c1].x_add = 0;
370 if ((player[c1].x >> 16) > 400) {
373 memset(menu_pal, 0, 768);
374 mod_fade_direction = 0;
376 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
377 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (190 + c1 * 2)) {
378 player[c1].x = (165L + c1 * 2) << 16;
379 player[c1].x_add = 0;
381 if ((player[c1].x >> 16) > (190 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
382 player[c1].x = (208L + c1 * 2) << 16;
383 player[c1].x_add = 0;
387 player[c1].frame_tick++;
388 if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
390 if (player[c1].frame >= player_anims[player[c1].anim].num_frames)
391 player[c1].frame = player_anims[player[c1].anim].restart_frame;
392 player[c1].frame_tick = 0;
394 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
399 main_info.page_info[main_info.draw_page].num_pobs = 0;
401 for (c1 = 3; c1 >= 0; c1--)
402 add_pob(main_info.draw_page, player[c1].x >> 16, player[c1].y >> 16, player[c1].image + c1 * 18, rabbit_gobs);
406 draw_pobs(main_info.draw_page);
410 if (mod_fade_direction == 1) {
413 dj_set_mod_volume(mod_vol);
418 dj_set_mod_volume(mod_vol);
423 for (c1 = 0; c1 < 720; c1++) {
424 if (menu_cur_pal[c1] < menu_pal[c1]) {
427 } else if (menu_cur_pal[c1] > menu_pal[c1]) {
432 if (fade_flag == 0 && end_loop_flag == 1) {
434 if (new_game_flag == 1)
441 if (fade_count < 30) {
442 for (c1 = 0; c1 < 48; c1++) {
443 if (fade_pal[c1] > 0)
449 outportw(0x3c4, 0x0f02);
450 memset((char *) (0xa0000 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
451 memset((char *) (0xa0000 + 32768 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
452 // clear 20 lines at x=0,y=220 in front and backbuffer
454 memset((void *) get_vgaptr(0, 0, 220), 0, 8000);
455 memset((void *) get_vgaptr(1, 0, 220), 0, 8000);
458 if (cur_message >= NUM_MESSAGES)
459 cur_message -= NUM_MESSAGES;
460 put_text(0, 200, 220, message[cur_message], 2);
461 put_text(1, 200, 220, message[cur_message], 2);
468 if (fade_count < 100) {
469 for (c1 = 0; c1 < 48; c1++) {
470 if (fade_pal[c1] < menu_pal[c1 + 720])
482 for (c1 = 0; c1 < 48; c1++) {
483 if (fade_pal[c1] > menu_pal[c1 + 720])
487 main_info.draw_page ^= 1;
488 main_info.view_page ^= 1;
491 outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
492 outportw(0x3d4, ((main_info.view_page << 15) & 0xff00) + 0x0c);
494 flippage(main_info.view_page);
498 while ((inportb(0x3da) & 8) == 0)
500 while ((inportb(0x3da) & 8) == 8)
504 if (fade_flag != 0) {
505 setpalette(0, 240, menu_cur_pal);
508 setpalette(240, 16, fade_pal);
512 redraw_pob_backgrounds(main_info.draw_page);
527 fillpalette(0, 0, 0);
529 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
530 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
533 if (read_pcx(handle, background_pic, 102400, menu_pal) != 0) {
534 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
538 if ((handle = dat_open("menumask.pcx", datfile_name, "rb")) == 0) {
539 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
542 if (read_pcx(handle, mask_pic, 102400, 0) != 0) {
543 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
547 memset(menu_cur_pal, 0, 768);
549 put_block(0, 0, 0, 400, 256, background_pic);
550 put_block(1, 0, 0, 400, 256, background_pic);
552 for (c1 = 0; c1 < 4; c1++) {
553 player[c1].enabled = 0;
554 player[c1].x = (long) rnd(150) << 16;
555 player[c1].y = (160L + c1 * 2) << 16;
556 player[c1].x_add = 0;
557 player[c1].y_add = 0;
558 player[c1].direction = (char)rnd(2);
559 player[c1].jump_ready = 1;
561 player[c1].frame = 0;
562 player[c1].frame_tick = 0;
563 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image;
566 for (c1 = 0; c1 < 300; c1++)
567 objects[c1].used = 0;
569 main_info.page_info[0].num_pobs = 0;
570 main_info.page_info[1].num_pobs = 0;
577 void menu_deinit(void)