3 #define NUM_MESSAGES 24
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 "Visit our homepage at:",
18 "http://www.algonet.se/~mattiasb",
19 "Jump 'n Bump is e-mailware.",
20 "That means you're supposed to send us an e-mail!",
21 "Write for example where you're from",
22 "and what you thought about this game.",
23 "If you do that, you will greatly encourage us",
24 "to make more games for you!",
25 "Send your e-mail to: matbr656@student.liu.se",
26 "Oh, and by the way, there's a lot of secrets!",
27 "If you can't find them, you'd better ask us...",
28 "If you'd like to contact a specific member of BCD,",
29 "these are their e-mail addresses:",
30 "Andreas Brynervall: andreasb@acc.umu.se",
31 "Mattias Brynervall: matbr656@student.liu.se",
32 "Martin Magnusson: marma102@student.liu.se",
33 "Anders Nilsson: equel@swipnet.se",
42 char end_loop_flag, new_game_flag, fade_flag;
43 char mod_vol, mod_fade_direction;
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);
61 for (c1 = 0; c1 < 48; c1++)
62 outportb(0x3c9, fade_pal[c1]);
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;
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 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 0) || (main_info.num_mouse_buttons == 2 && mouse.but1 == 0 && mouse.but2 == 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 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 0) || (main_info.num_mouse_buttons == 2 && mouse.but1 == 0 && mouse.but2 == 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 && joy.x < -512 && joy.x > 512) || (c1 == 3 && mouse.but1 == 1 && mouse.but2 == 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 && joy.x < -512) || (c1 == 3 && mouse.but1 == 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 && joy.x > 512) || (c1 == 3 && mouse.but2 == 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 && joy.but1 == 1) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 1) || (main_info.num_mouse_buttons == 2 && mouse.but1 == 1 && mouse.but2 == 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, 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, 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 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 0) || (main_info.num_mouse_buttons == 2 && mouse.but1 == 0 && mouse.but2 == 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 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 3 && mouse.but3 == 0) || (main_info.num_mouse_buttons == 2 && (mouse.but1 == 0 || mouse.but2 == 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)
448 outportw(0x3c4, 0x0f02);
449 memset((char *) (0xa0000 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
450 memset((char *) (0xa0000 + 32768 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
452 if (cur_message >= NUM_MESSAGES)
453 cur_message -= NUM_MESSAGES;
454 put_text(0, 200, 220, message[cur_message], 2);
455 put_text(1, 200, 220, message[cur_message], 2);
462 if (fade_count < 100) {
463 for (c1 = 0; c1 < 48; c1++) {
464 if (fade_pal[c1] < menu_pal[c1 + 720])
476 for (c1 = 0; c1 < 48; c1++) {
477 if (fade_pal[c1] > menu_pal[c1 + 720])
481 main_info.draw_page ^= 1;
482 main_info.view_page ^= 1;
484 outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
485 outportw(0x3d4, ((main_info.view_page << 15) & 0xff00) + 0x0c);
487 while ((inportb(0x3da) & 8) == 0)
489 while ((inportb(0x3da) & 8) == 8)
492 if (fade_flag != 0) {
494 for (c1 = 0; c1 < 720; c1++)
495 outportb(0x3c9, menu_cur_pal[c1]);
498 outportb(0x3c8, 240);
499 for (c1 = 0; c1 < 48; c1++)
500 outportb(0x3c9, fade_pal[c1]);
504 redraw_pob_backgrounds(main_info.draw_page);
520 for (c1 = 0; c1 < 768; c1++)
523 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
524 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
527 if (read_pcx(handle, background_pic, 102400, menu_pal) != 0) {
528 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
532 if ((handle = dat_open("menumask.pcx", datfile_name, "rb")) == 0) {
533 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
536 if (read_pcx(handle, mask_pic, 102400, 0) != 0) {
537 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
541 memset(menu_cur_pal, 0, 768);
543 put_block(0, 0, 0, 400, 256, background_pic);
544 put_block(1, 0, 0, 400, 256, background_pic);
546 for (c1 = 0; c1 < 4; c1++) {
547 player[c1].enabled = 0;
548 player[c1].x = (long) rnd(150) << 16;
549 player[c1].y = (160L + c1 * 2) << 16;
550 player[c1].x_add = 0;
551 player[c1].y_add = 0;
552 player[c1].direction = rnd(2);
553 player[c1].jump_ready = 1;
555 player[c1].frame = 0;
556 player[c1].frame_tick = 0;
557 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image;
560 for (c1 = 0; c1 < 300; c1++)
561 objects[c1].used = 0;
563 main_info.page_info[0].num_pobs = 0;
564 main_info.page_info[1].num_pobs = 0;
571 void menu_deinit(void)