3 * Copyright (C) 1998 Brainchild Design - http://brainchilddesign.com/
5 * Copyright (C) 2001 Chuck Mason <cemason@users.sourceforge.net>
7 * Copyright (C) 2002 Florian Schulze <crow@icculus.org>
9 * Portions of this code are from the MPEG software simulation group
10 * idct implementation. This code will be replaced with a new
11 * implementation soon.
13 * This file is part of Jump'n'Bump.
15 * Jump'n'Bump is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
20 * Jump'n'Bump is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 char *menu_background;
35 char menu_cur_pal[768];
39 "by Brainchild Design in 1998.",
40 "Code by Mattias Brynervall.",
41 "Graphics by Martin Magnusson",
42 "and Andreas Brynervall.",
43 "Music by Anders Nilsson.",
44 "Linux port by Chuck Mason.",
45 "New SDL port by Florian Schulze.",
46 "http://www.icculus.org/jumpnbump/",
47 "Visit our homepage at:",
48 "http://www.algonet.se/~mattiasb",
49 "Jump 'n Bump is e-mailware.",
50 "That means you're supposed to send us an e-mail!",
51 "Write for example where you're from",
52 "and what you thought about this game.",
53 "If you do that, you will greatly encourage us",
54 "to make more games for you!",
55 "Send your e-mail to: matbr656@student.liu.se",
56 "Oh, and by the way, there's a lot of secrets!",
57 "If you can't find them, you'd better ask us...",
58 "If you'd like to contact a specific member of BCD,",
59 "these are their e-mail addresses:",
60 "Andreas Brynervall: andreasb@acc.umu.se",
61 "Mattias Brynervall: matbr656@student.liu.se",
62 "Martin Magnusson: marma102@student.liu.se",
63 "Anders Nilsson: equel@swipnet.se",
67 #define NUM_MESSAGES (sizeof(message)/sizeof(char *))
73 int end_loop_flag, new_game_flag, fade_flag;
74 int mod_vol = 0, mod_fade_direction = 0;
76 int fade_dir, fade_count, fade_tick;
84 mod_fade_direction = 1;
85 dj_ready_mod(MOD_MENU);
86 dj_set_mod_volume((char)mod_vol);
87 dj_set_sfx_volume(64);
91 memset(fade_pal, 0, 48);
92 setpalette(240, 16, fade_pal);
97 cur_message = NUM_MESSAGES - 1;
99 main_info.page_info[0].num_pobs = 0;
100 main_info.page_info[1].num_pobs = 0;
101 main_info.view_page = 0;
102 main_info.draw_page = 1;
104 esc_pressed = key_pressed(1);
105 end_loop_flag = new_game_flag = 0;
112 printf("update_count: %i\n",update_count);
114 while (update_count) {
116 if (key_pressed(1) == 1 && esc_pressed == 0) {
119 memset(menu_pal, 0, 768);
120 mod_fade_direction = 0;
121 } else if (key_pressed(1) == 0)
124 update_player_actions();
125 for (c1 = 0; c1 < 4; c1++) {
126 if (end_loop_flag == 1 && new_game_flag == 1) {
127 if ((player[c1].x >> 16) > (165 + c1 * 2)) {
128 if (player[c1].x_add < 0)
129 player[c1].x_add += 16384;
131 player[c1].x_add += 12288;
132 if (player[c1].x_add > 98304L)
133 player[c1].x_add = 98304L;
134 player[c1].direction = 0;
135 if (player[c1].anim == 0) {
137 player[c1].frame = 0;
138 player[c1].frame_tick = 0;
139 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
141 player[c1].enabled = 1;
143 if (!player[c1].action_up) {
144 if (player[c1].y_add < 0) {
145 player[c1].y_add += 32768;
146 if (player[c1].y_add > 0)
147 player[c1].y_add = 0;
150 player[c1].y_add += 12288;
151 if (player[c1].y_add > 36864 && player[c1].anim != 3) {
153 player[c1].frame = 0;
154 player[c1].frame_tick = 0;
155 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
157 player[c1].y += player[c1].y_add;
158 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
159 if ((player[c1].y >> 16) > (160 + c1 * 2)) {
160 player[c1].y = (160L + c1 * 2) << 16;
161 player[c1].y_add = 0;
162 if (player[c1].anim != 0 && player[c1].anim != 1) {
164 player[c1].frame = 0;
165 player[c1].frame_tick = 0;
166 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
170 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
171 player[c1].y = (138L + c1 * 2) << 16;
172 player[c1].y_add = 0;
173 if (player[c1].anim != 0 && player[c1].anim != 1) {
175 player[c1].frame = 0;
176 player[c1].frame_tick = 0;
177 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
179 if (!player[c1].action_up)
180 player[c1].jump_ready = 1;
183 player[c1].x += player[c1].x_add;
184 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
185 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (190 + c1 * 2)) {
186 player[c1].x = (165L + c1 * 2) << 16;
187 player[c1].x_add = 0;
189 if ((player[c1].x >> 16) > (190 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
190 player[c1].x = (208L + c1 * 2) << 16;
191 player[c1].x_add = 0;
195 if (player[c1].action_left && player[c1].action_right) {
196 if (player[c1].direction == 1) {
197 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
198 if (player[c1].x_add > 0) {
199 player[c1].x_add -= 16384;
200 if ((player[c1].y >> 16) >= (160 + c1 * 2))
201 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);
203 player[c1].x_add -= 12288;
205 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
206 if (player[c1].x_add > 0) {
207 player[c1].x_add -= 16384;
208 if ((player[c1].y >> 16) >= (138 + c1 * 2))
209 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);
211 player[c1].x_add -= 12288;
213 if (player[c1].x_add < -98304L)
214 player[c1].x_add = -98304L;
215 player[c1].direction = 1;
216 if (player[c1].anim == 0) {
218 player[c1].frame = 0;
219 player[c1].frame_tick = 0;
220 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
223 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
224 if (player[c1].x_add < 0) {
225 player[c1].x_add += 16384;
226 if ((player[c1].y >> 16) >= (160 + c1 * 2))
227 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);
229 player[c1].x_add += 12288;
231 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
232 if (player[c1].x_add < 0) {
233 player[c1].x_add += 16384;
234 if ((player[c1].y >> 16) >= (138 + c1 * 2))
235 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);
237 player[c1].x_add += 12288;
239 if (player[c1].x_add > 98304L)
240 player[c1].x_add = 98304L;
241 player[c1].direction = 0;
242 if (player[c1].anim == 0) {
244 player[c1].frame = 0;
245 player[c1].frame_tick = 0;
246 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
249 } else if (player[c1].action_left) {
250 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
251 if (player[c1].x_add > 0) {
252 player[c1].x_add -= 16384;
253 if ((player[c1].y >> 16) >= (160 + c1 * 2))
254 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);
256 player[c1].x_add -= 12288;
258 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
259 if (player[c1].x_add > 0) {
260 player[c1].x_add -= 16384;
261 if ((player[c1].y >> 16) >= (138 + c1 * 2))
262 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);
264 player[c1].x_add -= 12288;
266 if (player[c1].x_add < -98304L)
267 player[c1].x_add = -98304L;
268 player[c1].direction = 1;
269 if (player[c1].anim == 0) {
271 player[c1].frame = 0;
272 player[c1].frame_tick = 0;
273 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
275 } else if (player[c1].action_right) {
276 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
277 if (player[c1].x_add < 0) {
278 player[c1].x_add += 16384;
279 if ((player[c1].y >> 16) >= (160 + c1 * 2))
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);
282 player[c1].x_add += 12288;
284 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
285 if (player[c1].x_add < 0) {
286 player[c1].x_add += 16384;
287 if ((player[c1].y >> 16) >= (138 + c1 * 2))
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);
290 player[c1].x_add += 12288;
292 if (player[c1].x_add > 98304L)
293 player[c1].x_add = 98304L;
294 player[c1].direction = 0;
295 if (player[c1].anim == 0) {
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].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) && (player[c1].y >> 16) >= (160 + c1 * 2)) {
303 if (player[c1].x_add < 0) {
304 player[c1].x_add += 16384;
305 if (player[c1].x_add > 0)
306 player[c1].x_add = 0;
307 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);
308 } else if (player[c1].x_add > 0) {
309 player[c1].x_add -= 16384;
310 if (player[c1].x_add < 0)
311 player[c1].x_add = 0;
312 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);
315 if ((((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) && (player[c1].y >> 16) >= (138 + c1 * 2))) {
316 if (player[c1].x_add < 0) {
317 player[c1].x_add += 16384;
318 if (player[c1].x_add > 0)
319 player[c1].x_add = 0;
320 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);
321 } else if (player[c1].x_add > 0) {
322 player[c1].x_add -= 16384;
323 if (player[c1].x_add < 0)
324 player[c1].x_add = 0;
325 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);
328 if (player[c1].anim == 1) {
330 player[c1].frame = 0;
331 player[c1].frame_tick = 0;
332 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
335 if ((player[c1].jump_ready == 1) && player[c1].action_up) {
336 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
337 if ((player[c1].y >> 16) >= (160 + c1 * 2)) {
338 player[c1].y_add = -280000L;
340 player[c1].frame = 0;
341 player[c1].frame_tick = 0;
342 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
343 player[c1].jump_ready = 0;
344 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
347 if ((player[c1].y >> 16) >= (138 + c1 * 2)) {
348 player[c1].y_add = -280000L;
350 player[c1].frame = 0;
351 player[c1].frame_tick = 0;
352 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
353 player[c1].jump_ready = 0;
354 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
358 if (!player[c1].action_up) {
359 if (player[c1].y_add < 0) {
360 player[c1].y_add += 32768;
361 if (player[c1].y_add > 0)
362 player[c1].y_add = 0;
365 if (!player[c1].action_up)
366 player[c1].jump_ready = 1;
367 player[c1].y_add += 12288;
368 if (player[c1].y_add > 36864 && player[c1].anim != 3) {
370 player[c1].frame = 0;
371 player[c1].frame_tick = 0;
372 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
374 player[c1].y += player[c1].y_add;
375 if ((player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2)) {
376 if ((player[c1].y >> 16) > (160 + c1 * 2)) {
377 player[c1].y = (160L + c1 * 2) << 16;
378 player[c1].y_add = 0;
379 if (player[c1].anim != 0 && player[c1].anim != 1) {
381 player[c1].frame = 0;
382 player[c1].frame_tick = 0;
383 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
387 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
388 player[c1].y = (138L + c1 * 2) << 16;
389 player[c1].y_add = 0;
390 if (player[c1].anim != 0 && player[c1].anim != 1) {
392 player[c1].frame = 0;
393 player[c1].frame_tick = 0;
394 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
398 player[c1].x += player[c1].x_add;
399 if ((player[c1].x >> 16) < 0) {
401 player[c1].x_add = 0;
403 if ((player[c1].x >> 16) > 400) {
406 memset(menu_pal, 0, 768);
407 mod_fade_direction = 0;
409 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
410 if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (190 + c1 * 2)) {
411 player[c1].x = (165L + c1 * 2) << 16;
412 player[c1].x_add = 0;
414 if ((player[c1].x >> 16) > (190 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
415 player[c1].x = (208L + c1 * 2) << 16;
416 player[c1].x_add = 0;
420 player[c1].frame_tick++;
421 if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
423 if (player[c1].frame >= player_anims[player[c1].anim].num_frames)
424 player[c1].frame = player_anims[player[c1].anim].restart_frame;
425 player[c1].frame_tick = 0;
427 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
432 main_info.page_info[main_info.draw_page].num_pobs = 0;
434 for (c1 = 3; c1 >= 0; c1--)
435 add_pob(main_info.draw_page, player[c1].x >> 16, player[c1].y >> 16, player[c1].image + c1 * 18, &rabbit_gobs);
439 if (update_count == 1) {
441 draw_pobs(main_info.draw_page);
446 if (mod_fade_direction == 1) {
449 dj_set_mod_volume((char)mod_vol);
454 dj_set_mod_volume((char)mod_vol);
460 for (c1 = 0; c1 < 720; c1++) {
461 if (menu_cur_pal[c1] < menu_pal[c1]) {
464 } else if (menu_cur_pal[c1] > menu_pal[c1]) {
469 if (fade_flag == 0 && end_loop_flag == 1) {
471 if (new_game_flag == 1)
478 if (fade_count < 30) {
479 for (c1 = 0; c1 < 48; c1++) {
480 if (fade_pal[c1] > 0)
486 clear_lines(0, 220, 20, 0);
487 clear_lines(1, 220, 20, 0);
490 if (cur_message >= NUM_MESSAGES)
491 cur_message -= NUM_MESSAGES;
492 put_text(0, 200, 220, message[cur_message], 2);
493 put_text(1, 200, 220, message[cur_message], 2);
501 if (fade_count < 100) {
502 for (c1 = 0; c1 < 48; c1++) {
503 if (fade_pal[c1] < menu_pal[c1 + 720])
515 for (c1 = 0; c1 < 48; c1++) {
516 if (fade_pal[c1] > menu_pal[c1 + 720])
520 if (update_count == 1) {
521 main_info.draw_page ^= 1;
522 main_info.view_page ^= 1;
524 flippage(main_info.view_page);
529 if (fade_flag != 0) {
530 setpalette(0, 240, menu_cur_pal);
533 if (update_count == 1) {
534 setpalette(240, 16, fade_pal);
539 redraw_pob_backgrounds(main_info.draw_page);
546 update_count = intr_sysupdate();
561 fillpalette(0, 0, 0);
563 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
564 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
567 if (read_pcx(handle, background_pic, 102400, menu_pal) != 0) {
568 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
572 if ((handle = dat_open("menumask.pcx", datfile_name, "rb")) == 0) {
573 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
576 if (read_pcx(handle, mask_pic, 102400, 0) != 0) {
577 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
581 memset(menu_cur_pal, 0, 768);
583 recalculate_gob(&rabbit_gobs, menu_pal);
584 recalculate_gob(&font_gobs, menu_pal);
585 recalculate_gob(&object_gobs, menu_pal);
586 register_background(background_pic, menu_pal);
587 register_mask(mask_pic);
589 for (c1 = 0; c1 < 4; c1++) {
590 player[c1].enabled = 0;
591 player[c1].x = (long) rnd(150) << 16;
592 player[c1].y = (160L + c1 * 2) << 16;
593 player[c1].x_add = 0;
594 player[c1].y_add = 0;
595 player[c1].direction = rnd(2);
596 player[c1].jump_ready = 1;
598 player[c1].frame = 0;
599 player[c1].frame_tick = 0;
600 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image;
603 for (c1 = 0; c1 < NUM_OBJECTS; c1++)
604 objects[c1].used = 0;
606 main_info.page_info[0].num_pobs = 0;
607 main_info.page_info[1].num_pobs = 0;
614 void menu_deinit(void)