3 #define NUM_MESSAGES 25
8 char menu_cur_pal[768];
10 char message[NUM_MESSAGES][70] = {
12 "by Brainchild Design in 1998.",
13 "Code by Mattias Brynervall.",
14 "Graphics by Martin Magnusson",
15 "and Andreas Brynervall.",
16 "Music by Anders Nilsson.",
17 "Linux port by Chuck Mason.",
18 "Visit our homepage at:",
19 "http://www.algonet.se/~mattiasb",
20 "Jump 'n Bump is e-mailware.",
21 "That means you're supposed to send us an e-mail!",
22 "Write for example where you're from",
23 "and what you thought about this game.",
24 "If you do that, you will greatly encourage us",
25 "to make more games for you!",
26 "Send your e-mail to: matbr656@student.liu.se",
27 "Oh, and by the way, there's a lot of secrets!",
28 "If you can't find them, you'd better ask us...",
29 "If you'd like to contact a specific member of BCD,",
30 "these are their e-mail addresses:",
31 "Andreas Brynervall: andreasb@acc.umu.se",
32 "Mattias Brynervall: matbr656@student.liu.se",
33 "Martin Magnusson: marma102@student.liu.se",
34 "Anders Nilsson: equel@swipnet.se",
43 char end_loop_flag, new_game_flag, fade_flag;
44 char mod_vol = 0, mod_fade_direction = 0;
46 int fade_dir, fade_count, fade_tick;
53 mod_fade_direction = 1;
54 dj_ready_mod(MOD_MENU);
55 dj_set_mod_volume(mod_vol);
56 dj_set_sfx_volume(64);
60 memset(fade_pal, 0, 48);
61 setpalette(240, 16, fade_pal);
66 cur_message = NUM_MESSAGES - 1;
68 main_info.page_info[0].num_pobs = 0;
69 main_info.page_info[1].num_pobs = 0;
70 main_info.view_page = 0;
71 main_info.draw_page = 1;
73 esc_pressed = key_pressed(1);
74 end_loop_flag = new_game_flag = 0;
81 if (key_pressed(1) == 1 && esc_pressed == 0) {
84 memset(menu_pal, 0, 768);
85 mod_fade_direction = 0;
86 } else if (key_pressed(1) == 0)
89 if (main_info.mouse_enabled == 1)
91 if (main_info.joy_enabled == 1)
93 for (c1 = 0; c1 < 4; c1++) {
94 if (end_loop_flag == 1 && new_game_flag == 1) {
95 if ((player[c1].x >> 16) > (165 + c1 * 2)) {
96 if (player[c1].x_add < 0)
97 player[c1].x_add += 16384;
99 player[c1].x_add += 12288;
100 if (player[c1].x_add > 98304L)
101 player[c1].x_add = 98304L;
102 player[c1].direction = 0;
103 if (player[c1].anim == 0) {
105 player[c1].frame = 0;
106 player[c1].frame_tick = 0;
107 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
109 player[c1].enabled = 1;
111 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)) {
112 if (player[c1].y_add < 0) {
113 player[c1].y_add += 32768;
114 if (player[c1].y_add > 0)
115 player[c1].y_add = 0;
118 player[c1].y_add += 12288;
119 if (player[c1].y_add > 36864 && player[c1].anim != 3) {
121 player[c1].frame = 0;
122 player[c1].frame_tick = 0;
123 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
125 player[c1].y += player[c1].y_add;
126 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
127 if ((player[c1].y >> 16) > (160 + c1 * 2)) {
128 player[c1].y = (160L + c1 * 2) << 16;
129 player[c1].y_add = 0;
130 if (player[c1].anim != 0 && player[c1].anim != 1) {
132 player[c1].frame = 0;
133 player[c1].frame_tick = 0;
134 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
138 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
139 player[c1].y = (138L + c1 * 2) << 16;
140 player[c1].y_add = 0;
141 if (player[c1].anim != 0 && player[c1].anim != 1) {
143 player[c1].frame = 0;
144 player[c1].frame_tick = 0;
145 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
147 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))
148 player[c1].jump_ready = 1;
151 player[c1].x += player[c1].x_add;
152 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
153 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (190 + c1 * 2)) {
154 player[c1].x = (165L + c1 * 2) << 16;
155 player[c1].x_add = 0;
157 if ((player[c1].x >> 16) > (190 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
158 player[c1].x = (208L + c1 * 2) << 16;
159 player[c1].x_add = 0;
163 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)) {
164 if (player[c1].direction == 1) {
165 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
166 if (player[c1].x_add > 0) {
167 player[c1].x_add -= 16384;
168 if ((player[c1].y >> 16) >= (160 + c1 * 2))
169 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);
171 player[c1].x_add -= 12288;
173 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
174 if (player[c1].x_add > 0) {
175 player[c1].x_add -= 16384;
176 if ((player[c1].y >> 16) >= (138 + c1 * 2))
177 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);
179 player[c1].x_add -= 12288;
181 if (player[c1].x_add < -98304L)
182 player[c1].x_add = -98304L;
183 player[c1].direction = 1;
184 if (player[c1].anim == 0) {
186 player[c1].frame = 0;
187 player[c1].frame_tick = 0;
188 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
191 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
192 if (player[c1].x_add < 0) {
193 player[c1].x_add += 16384;
194 if ((player[c1].y >> 16) >= (160 + c1 * 2))
195 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);
197 player[c1].x_add += 12288;
199 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
200 if (player[c1].x_add < 0) {
201 player[c1].x_add += 16384;
202 if ((player[c1].y >> 16) >= (138 + c1 * 2))
203 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);
205 player[c1].x_add += 12288;
207 if (player[c1].x_add > 98304L)
208 player[c1].x_add = 98304L;
209 player[c1].direction = 0;
210 if (player[c1].anim == 0) {
212 player[c1].frame = 0;
213 player[c1].frame_tick = 0;
214 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
217 } 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)) {
218 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
219 if (player[c1].x_add > 0) {
220 player[c1].x_add -= 16384;
221 if ((player[c1].y >> 16) >= (160 + c1 * 2))
222 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);
224 player[c1].x_add -= 12288;
226 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
227 if (player[c1].x_add > 0) {
228 player[c1].x_add -= 16384;
229 if ((player[c1].y >> 16) >= (138 + c1 * 2))
230 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);
232 player[c1].x_add -= 12288;
234 if (player[c1].x_add < -98304L)
235 player[c1].x_add = -98304L;
236 player[c1].direction = 1;
237 if (player[c1].anim == 0) {
239 player[c1].frame = 0;
240 player[c1].frame_tick = 0;
241 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
243 } 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)) {
244 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
245 if (player[c1].x_add < 0) {
246 player[c1].x_add += 16384;
247 if ((player[c1].y >> 16) >= (160 + c1 * 2))
248 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);
250 player[c1].x_add += 12288;
252 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
253 if (player[c1].x_add < 0) {
254 player[c1].x_add += 16384;
255 if ((player[c1].y >> 16) >= (138 + c1 * 2))
256 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);
258 player[c1].x_add += 12288;
260 if (player[c1].x_add > 98304L)
261 player[c1].x_add = 98304L;
262 player[c1].direction = 0;
263 if (player[c1].anim == 0) {
265 player[c1].frame = 0;
266 player[c1].frame_tick = 0;
267 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
270 if (((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) && (player[c1].y >> 16) >= (160 + c1 * 2)) {
271 if (player[c1].x_add < 0) {
272 player[c1].x_add += 16384;
273 if (player[c1].x_add > 0)
274 player[c1].x_add = 0;
275 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);
276 } else if (player[c1].x_add > 0) {
277 player[c1].x_add -= 16384;
278 if (player[c1].x_add < 0)
279 player[c1].x_add = 0;
280 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);
283 if ((((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) && (player[c1].y >> 16) >= (138 + c1 * 2))) {
284 if (player[c1].x_add < 0) {
285 player[c1].x_add += 16384;
286 if (player[c1].x_add > 0)
287 player[c1].x_add = 0;
288 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);
289 } else if (player[c1].x_add > 0) {
290 player[c1].x_add -= 16384;
291 if (player[c1].x_add < 0)
292 player[c1].x_add = 0;
293 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);
296 if (player[c1].anim == 1) {
298 player[c1].frame = 0;
299 player[c1].frame_tick = 0;
300 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
303 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))) {
304 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
305 if ((player[c1].y >> 16) >= (160 + c1 * 2)) {
306 player[c1].y_add = -280000L;
308 player[c1].frame = 0;
309 player[c1].frame_tick = 0;
310 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
311 player[c1].jump_ready = 0;
312 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
315 if ((player[c1].y >> 16) >= (138 + c1 * 2)) {
316 player[c1].y_add = -280000L;
318 player[c1].frame = 0;
319 player[c1].frame_tick = 0;
320 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
321 player[c1].jump_ready = 0;
322 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
326 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)) {
327 if (player[c1].y_add < 0) {
328 player[c1].y_add += 32768;
329 if (player[c1].y_add > 0)
330 player[c1].y_add = 0;
333 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))
334 player[c1].jump_ready = 1;
335 player[c1].y_add += 12288;
336 if (player[c1].y_add > 36864 && player[c1].anim != 3) {
338 player[c1].frame = 0;
339 player[c1].frame_tick = 0;
340 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
342 player[c1].y += player[c1].y_add;
343 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
344 if ((player[c1].y >> 16) > (160 + c1 * 2)) {
345 player[c1].y = (160L + c1 * 2) << 16;
346 player[c1].y_add = 0;
347 if (player[c1].anim != 0 && player[c1].anim != 1) {
349 player[c1].frame = 0;
350 player[c1].frame_tick = 0;
351 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
355 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
356 player[c1].y = (138L + c1 * 2) << 16;
357 player[c1].y_add = 0;
358 if (player[c1].anim != 0 && player[c1].anim != 1) {
360 player[c1].frame = 0;
361 player[c1].frame_tick = 0;
362 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
366 player[c1].x += player[c1].x_add;
367 if ((player[c1].x >> 16) < 0) {
369 player[c1].x_add = 0;
371 if ((player[c1].x >> 16) > 400) {
374 memset(menu_pal, 0, 768);
375 mod_fade_direction = 0;
377 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
378 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (190 + c1 * 2)) {
379 player[c1].x = (165L + c1 * 2) << 16;
380 player[c1].x_add = 0;
382 if ((player[c1].x >> 16) > (190 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
383 player[c1].x = (208L + c1 * 2) << 16;
384 player[c1].x_add = 0;
388 player[c1].frame_tick++;
389 if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
391 if (player[c1].frame >= player_anims[player[c1].anim].num_frames)
392 player[c1].frame = player_anims[player[c1].anim].restart_frame;
393 player[c1].frame_tick = 0;
395 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
400 main_info.page_info[main_info.draw_page].num_pobs = 0;
402 for (c1 = 3; c1 >= 0; c1--)
403 add_pob(main_info.draw_page, player[c1].x >> 16, player[c1].y >> 16, player[c1].image + c1 * 18, rabbit_gobs);
407 draw_pobs(main_info.draw_page);
411 if (mod_fade_direction == 1) {
414 dj_set_mod_volume(mod_vol);
419 dj_set_mod_volume(mod_vol);
424 for (c1 = 0; c1 < 720; c1++) {
425 if (menu_cur_pal[c1] < menu_pal[c1]) {
428 } else if (menu_cur_pal[c1] > menu_pal[c1]) {
433 if (fade_flag == 0 && end_loop_flag == 1) {
435 if (new_game_flag == 1)
442 if (fade_count < 30) {
443 for (c1 = 0; c1 < 48; c1++) {
444 if (fade_pal[c1] > 0)
450 outportw(0x3c4, 0x0f02);
451 memset((char *) (0xa0000 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
452 memset((char *) (0xa0000 + 32768 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
453 // clear 20 lines at x=0,y=220 in front and backbuffer
455 memset((void *) get_vgaptr(0, 0, 220), 0, 8000);
456 memset((void *) get_vgaptr(1, 0, 220), 0, 8000);
459 if (cur_message >= NUM_MESSAGES)
460 cur_message -= NUM_MESSAGES;
461 put_text(0, 200, 220, message[cur_message], 2);
462 put_text(1, 200, 220, message[cur_message], 2);
469 if (fade_count < 100) {
470 for (c1 = 0; c1 < 48; c1++) {
471 if (fade_pal[c1] < menu_pal[c1 + 720])
483 for (c1 = 0; c1 < 48; c1++) {
484 if (fade_pal[c1] > menu_pal[c1 + 720])
488 main_info.draw_page ^= 1;
489 main_info.view_page ^= 1;
492 outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
493 outportw(0x3d4, ((main_info.view_page << 15) & 0xff00) + 0x0c);
495 flippage(main_info.view_page);
499 while ((inportb(0x3da) & 8) == 0)
501 while ((inportb(0x3da) & 8) == 8)
505 if (fade_flag != 0) {
506 setpalette(0, 240, menu_cur_pal);
509 setpalette(240, 16, fade_pal);
513 redraw_pob_backgrounds(main_info.draw_page);
528 fillpalette(0, 0, 0);
530 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
531 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
534 if (read_pcx(handle, background_pic, 102400, menu_pal) != 0) {
535 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
539 if ((handle = dat_open("menumask.pcx", datfile_name, "rb")) == 0) {
540 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
543 if (read_pcx(handle, mask_pic, 102400, 0) != 0) {
544 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
548 memset(menu_cur_pal, 0, 768);
550 put_block(0, 0, 0, 400, 256, background_pic);
551 put_block(1, 0, 0, 400, 256, background_pic);
553 for (c1 = 0; c1 < 4; c1++) {
554 player[c1].enabled = 0;
555 player[c1].x = (long) rnd(150) << 16;
556 player[c1].y = (160L + c1 * 2) << 16;
557 player[c1].x_add = 0;
558 player[c1].y_add = 0;
559 player[c1].direction = (char)rnd(2);
560 player[c1].jump_ready = 1;
562 player[c1].frame = 0;
563 player[c1].frame_tick = 0;
564 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image;
567 for (c1 = 0; c1 < 300; c1++)
568 objects[c1].used = 0;
570 main_info.page_info[0].num_pobs = 0;
571 main_info.page_info[1].num_pobs = 0;
578 void menu_deinit(void)