]> icculus.org git repositories - crow/jumpnbump.git/blob - menu.c
Fixed SDL_Delay.
[crow/jumpnbump.git] / menu.c
1 /*
2  * menu.c
3  * Copyright (C) 1998 Brainchild Design - http://brainchilddesign.com/
4  * 
5  * Copyright (C) 2001 Chuck Mason <cemason@users.sourceforge.net>
6  *
7  * Copyright (C) 2002 Florian Schulze <crow@icculus.org>
8  *
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.
12  *
13  * This file is part of Jump'n'Bump.
14  *
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.
19  *
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.
24  *
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
28  */
29
30 #include "globals.h"
31
32 char *menu_background;
33
34 char menu_pal[768];
35 char menu_cur_pal[768];
36
37 char *message[] = {
38         "Jump 'n Bump 1.0",
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",
64         ""
65 };
66
67 #define NUM_MESSAGES (sizeof(message)/sizeof(char *))
68
69 int menu(void)
70 {
71         int c1;
72         int esc_pressed;
73         int end_loop_flag, new_game_flag, fade_flag;
74         int mod_vol = 0, mod_fade_direction = 0;
75         int cur_message;
76         int fade_dir, fade_count, fade_tick;
77         char fade_pal[48];
78         int update_count;
79
80         if (menu_init() != 0)
81                 return 1;
82
83         mod_vol = 0;
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);
88         dj_start_mod();
89         dj_set_nosound(0);
90
91         memset(fade_pal, 0, 48);
92         setpalette(240, 16, fade_pal);
93
94         fade_dir = 0;
95         fade_count = 0;
96         fade_tick = 0;
97         cur_message = NUM_MESSAGES - 1;
98
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;
103
104         esc_pressed = key_pressed(1);
105         end_loop_flag = new_game_flag = 0;
106
107         update_count = 1;
108         while (1) {
109
110                 dj_mix();
111
112                 printf("update_count: %i\n",update_count);
113
114                 while (update_count) {
115
116                         if (key_pressed(1) == 1 && esc_pressed == 0) {
117                                 end_loop_flag = 1;
118                                 new_game_flag = 0;
119                                 memset(menu_pal, 0, 768);
120                                 mod_fade_direction = 0;
121                         } else if (key_pressed(1) == 0)
122                                 esc_pressed = 0;
123
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;
130                                                 else
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) {
136                                                         player[c1].anim = 1;
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;
140                                                 }
141                                                 player[c1].enabled = 1;
142                                         }
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;
148                                                 }
149                                         }
150                                         player[c1].y_add += 12288;
151                                         if (player[c1].y_add > 36864 && player[c1].anim != 3) {
152                                                 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;
156                                         }
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) {
163                                                                 player[c1].anim = 0;
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;
167                                                         }
168                                                 }
169                                         } else {
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) {
174                                                                 player[c1].anim = 0;
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;
178                                                         }
179                                                         if (!player[c1].action_up)
180                                                                 player[c1].jump_ready = 1;
181                                                 }
182                                         }
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;
188                                                 }
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;
192                                                 }
193                                         }
194                                 } else {
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);
202                                                                 } else
203                                                                         player[c1].x_add -= 12288;
204                                                         }
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);
210                                                                 } else
211                                                                         player[c1].x_add -= 12288;
212                                                         }
213                                                         if (player[c1].x_add < -98304L)
214                                                                 player[c1].x_add = -98304L;
215                                                         player[c1].direction = 1;
216                                                         if (player[c1].anim == 0) {
217                                                                 player[c1].anim = 1;
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;
221                                                         }
222                                                 } else {
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);
228                                                                 } else
229                                                                         player[c1].x_add += 12288;
230                                                         }
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);
236                                                                 } else
237                                                                         player[c1].x_add += 12288;
238                                                         }
239                                                         if (player[c1].x_add > 98304L)
240                                                                 player[c1].x_add = 98304L;
241                                                         player[c1].direction = 0;
242                                                         if (player[c1].anim == 0) {
243                                                                 player[c1].anim = 1;
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;
247                                                         }
248                                                 }
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);
255                                                         } else
256                                                                 player[c1].x_add -= 12288;
257                                                 }
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);
263                                                         } else
264                                                                 player[c1].x_add -= 12288;
265                                                 }
266                                                 if (player[c1].x_add < -98304L)
267                                                         player[c1].x_add = -98304L;
268                                                 player[c1].direction = 1;
269                                                 if (player[c1].anim == 0) {
270                                                         player[c1].anim = 1;
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;
274                                                 }
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);
281                                                         } else
282                                                                 player[c1].x_add += 12288;
283                                                 }
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);
289                                                         } else
290                                                                 player[c1].x_add += 12288;
291                                                 }
292                                                 if (player[c1].x_add > 98304L)
293                                                         player[c1].x_add = 98304L;
294                                                 player[c1].direction = 0;
295                                                 if (player[c1].anim == 0) {
296                                                         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;
300                                                 }
301                                         } else {
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);
313                                                         }
314                                                 }
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);
326                                                         }
327                                                 }
328                                                 if (player[c1].anim == 1) {
329                                                         player[c1].anim = 0;
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;
333                                                 }
334                                         }
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;
339                                                                 player[c1].anim = 2;
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);
345                                                         }
346                                                 } else {
347                                                         if ((player[c1].y >> 16) >= (138 + c1 * 2)) {
348                                                                 player[c1].y_add = -280000L;
349                                                                 player[c1].anim = 2;
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);
355                                                         }
356                                                 }
357                                         }
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;
363                                                 }
364                                         }
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) {
369                                                 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;
373                                         }
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) {
380                                                                 player[c1].anim = 0;
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;
384                                                         }
385                                                 }
386                                         } else {
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) {
391                                                                 player[c1].anim = 0;
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;
395                                                         }
396                                                 }
397                                         }
398                                         player[c1].x += player[c1].x_add;
399                                         if ((player[c1].x >> 16) < 0) {
400                                                 player[c1].x = 0;
401                                                 player[c1].x_add = 0;
402                                         }
403                                         if ((player[c1].x >> 16) > 400) {
404                                                 end_loop_flag = 1;
405                                                 new_game_flag = 1;
406                                                 memset(menu_pal, 0, 768);
407                                                 mod_fade_direction = 0;
408                                         }
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;
413                                                 }
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;
417                                                 }
418                                         }
419                                 }
420                                 player[c1].frame_tick++;
421                                 if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
422                                         player[c1].frame++;
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;
426                                 }
427                                 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
428                         }
429
430                         dj_mix();
431
432                         main_info.page_info[main_info.draw_page].num_pobs = 0;
433
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);
436
437                         update_objects();
438
439                         if (update_count == 1) {
440                                 draw_begin();
441                                 draw_pobs(main_info.draw_page);
442                                 draw_end();
443
444                                 dj_mix();
445
446                                 if (mod_fade_direction == 1) {
447                                         if (mod_vol < 35) {
448                                                 mod_vol++;
449                                                 dj_set_mod_volume((char)mod_vol);
450                                         }
451                                 } else {
452                                         if (mod_vol > 0) {
453                                                 mod_vol--;
454                                                 dj_set_mod_volume((char)mod_vol);
455                                         }
456                                 }
457                         }
458
459                         fade_flag = 0;
460                         for (c1 = 0; c1 < 720; c1++) {
461                                 if (menu_cur_pal[c1] < menu_pal[c1]) {
462                                         menu_cur_pal[c1]++;
463                                         fade_flag = 1;
464                                 } else if (menu_cur_pal[c1] > menu_pal[c1]) {
465                                         menu_cur_pal[c1]--;
466                                         fade_flag = 2;
467                                 }
468                         }
469                         if (fade_flag == 0 && end_loop_flag == 1) {
470                                 menu_deinit();
471                                 if (new_game_flag == 1)
472                                         return 0;
473                                 else
474                                         return 1;
475                         }
476                         switch (fade_dir) {
477                         case 0:
478                                 if (fade_count < 30) {
479                                         for (c1 = 0; c1 < 48; c1++) {
480                                                 if (fade_pal[c1] > 0)
481                                                         fade_pal[c1]--;
482                                         }
483                                         fade_count++;
484                                 } else {
485                                         draw_begin();
486                                         clear_lines(0, 220, 20, 0);
487                                         clear_lines(1, 220, 20, 0);
488
489                                         cur_message++;
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);
494                                         fade_dir = 1;
495                                         fade_count = 0;
496                                         fade_tick = 0;
497                                         draw_end();
498                                 }
499                                 break;
500                         case 1:
501                                 if (fade_count < 100) {
502                                         for (c1 = 0; c1 < 48; c1++) {
503                                                 if (fade_pal[c1] < menu_pal[c1 + 720])
504                                                         fade_pal[c1]++;
505                                         }
506                                         fade_count++;
507                                 } else {
508                                         fade_dir = 0;
509                                         fade_count = 0;
510                                         fade_tick = 0;
511                                 }
512                                 break;
513                         }
514
515                         for (c1 = 0; c1 < 48; c1++) {
516                                 if (fade_pal[c1] > menu_pal[c1 + 720])
517                                         fade_pal[c1]--;
518                         }
519
520                         if (update_count == 1) {
521                                 main_info.draw_page ^= 1;
522                                 main_info.view_page ^= 1;
523         
524                                 flippage(main_info.view_page);
525         
526                                 wait_vrt(1);
527                         }
528
529                         if (fade_flag != 0) {
530                                 setpalette(0, 240, menu_cur_pal);
531                         }
532
533                         if (update_count == 1) {
534                                 setpalette(240, 16, fade_pal);
535
536                                 dj_mix();
537
538                                 draw_begin();
539                                 redraw_pob_backgrounds(main_info.draw_page);
540                                 draw_end();
541                         }
542
543                         update_count--;
544                 }
545
546                 update_count = intr_sysupdate();
547
548         }
549
550         menu_deinit();
551         return 0;
552
553 }
554
555
556 int menu_init(void)
557 {
558         FILE *handle;
559         int c1;
560
561         fillpalette(0, 0, 0);
562
563         if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
564                 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
565                 return 1;
566         }
567         if (read_pcx(handle, background_pic, 102400, menu_pal) != 0) {
568                 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
569                 return 1;
570         }
571         fclose(handle);
572         if ((handle = dat_open("menumask.pcx", datfile_name, "rb")) == 0) {
573                 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
574                 return 1;
575         }
576         if (read_pcx(handle, mask_pic, 102400, 0) != 0) {
577                 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
578                 return 1;
579         }
580         fclose(handle);
581         memset(menu_cur_pal, 0, 768);
582
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);
588
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;
597                 player[c1].anim = 0;
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;
601         }
602
603         for (c1 = 0; c1 < NUM_OBJECTS; c1++)
604                 objects[c1].used = 0;
605
606         main_info.page_info[0].num_pobs = 0;
607         main_info.page_info[1].num_pobs = 0;
608
609         return 0;
610
611 }
612
613
614 void menu_deinit(void)
615 {
616         dj_set_nosound(1);
617 }