]> icculus.org git repositories - crow/jumpnbump.git/blob - menu.c
Indented.
[crow/jumpnbump.git] / menu.c
1 #include "globals.h"
2
3 #define NUM_MESSAGES 24
4
5 char *menu_background;
6
7 char menu_pal[768];
8 char menu_cur_pal[768];
9
10 char message[NUM_MESSAGES][70] = {
11         "Jump 'n Bump",
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",
34         " "
35 };
36
37
38 char menu(void)
39 {
40         int c1;
41         char esc_pressed;
42         char end_loop_flag, new_game_flag, fade_flag;
43         char mod_vol, mod_fade_direction;
44         int cur_message;
45         int fade_dir, fade_count, fade_tick;
46         char fade_pal[48];
47
48         if (menu_init() != 0)
49                 return 1;
50
51         mod_vol = 0;
52         mod_fade_direction = 1;
53         dj_ready_mod(MOD_MENU);
54         dj_set_mod_volume(mod_vol);
55         dj_set_sfx_volume(64);
56         dj_start_mod();
57         dj_set_nosound(0);
58
59         memset(fade_pal, 0, 48);
60         outportb(0x3c8, 240);
61         for (c1 = 0; c1 < 48; c1++)
62                 outportb(0x3c9, fade_pal[c1]);
63         fade_dir = 0;
64         fade_count = 0;
65         fade_tick = 0;
66         cur_message = NUM_MESSAGES - 1;
67
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;
72
73         esc_pressed = key_pressed(1);
74         end_loop_flag = new_game_flag = 0;
75
76         while (1) {
77
78                 dj_mix();
79
80                 if (key_pressed(1) == 1 && esc_pressed == 0) {
81                         end_loop_flag = 1;
82                         new_game_flag = 0;
83                         memset(menu_pal, 0, 768);
84                         mod_fade_direction = 0;
85                 } else if (key_pressed(1) == 0)
86                         esc_pressed = 0;
87
88                 if (main_info.mouse_enabled == 1)
89                         read_mouse();
90                 if (main_info.joy_enabled == 1)
91                         read_joy();
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;
97                                         else
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) {
103                                                 player[c1].anim = 1;
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;
107                                         }
108                                         player[c1].enabled = 1;
109                                 }
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;
115                                         }
116                                 }
117                                 player[c1].y_add += 12288;
118                                 if (player[c1].y_add > 36864 && player[c1].anim != 3) {
119                                         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;
123                                 }
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) {
130                                                         player[c1].anim = 0;
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;
134                                                 }
135                                         }
136                                 } else {
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) {
141                                                         player[c1].anim = 0;
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;
145                                                 }
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;
148                                         }
149                                 }
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;
155                                         }
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;
159                                         }
160                                 }
161                         } else {
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);
169                                                         } else
170                                                                 player[c1].x_add -= 12288;
171                                                 }
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);
177                                                         } else
178                                                                 player[c1].x_add -= 12288;
179                                                 }
180                                                 if (player[c1].x_add < -98304L)
181                                                         player[c1].x_add = -98304L;
182                                                 player[c1].direction = 1;
183                                                 if (player[c1].anim == 0) {
184                                                         player[c1].anim = 1;
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;
188                                                 }
189                                         } else {
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);
195                                                         } else
196                                                                 player[c1].x_add += 12288;
197                                                 }
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);
203                                                         } else
204                                                                 player[c1].x_add += 12288;
205                                                 }
206                                                 if (player[c1].x_add > 98304L)
207                                                         player[c1].x_add = 98304L;
208                                                 player[c1].direction = 0;
209                                                 if (player[c1].anim == 0) {
210                                                         player[c1].anim = 1;
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;
214                                                 }
215                                         }
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);
222                                                 } else
223                                                         player[c1].x_add -= 12288;
224                                         }
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);
230                                                 } else
231                                                         player[c1].x_add -= 12288;
232                                         }
233                                         if (player[c1].x_add < -98304L)
234                                                 player[c1].x_add = -98304L;
235                                         player[c1].direction = 1;
236                                         if (player[c1].anim == 0) {
237                                                 player[c1].anim = 1;
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;
241                                         }
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);
248                                                 } else
249                                                         player[c1].x_add += 12288;
250                                         }
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);
256                                                 } else
257                                                         player[c1].x_add += 12288;
258                                         }
259                                         if (player[c1].x_add > 98304L)
260                                                 player[c1].x_add = 98304L;
261                                         player[c1].direction = 0;
262                                         if (player[c1].anim == 0) {
263                                                 player[c1].anim = 1;
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;
267                                         }
268                                 } else {
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);
280                                                 }
281                                         }
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);
293                                                 }
294                                         }
295                                         if (player[c1].anim == 1) {
296                                                 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;
300                                         }
301                                 }
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;
306                                                         player[c1].anim = 2;
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);
312                                                 }
313                                         } else {
314                                                 if ((player[c1].y >> 16) >= (138 + c1 * 2)) {
315                                                         player[c1].y_add = -280000L;
316                                                         player[c1].anim = 2;
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);
322                                                 }
323                                         }
324                                 }
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;
330                                         }
331                                 }
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) {
336                                         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;
340                                 }
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) {
347                                                         player[c1].anim = 0;
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;
351 #if 0
352                                                         dj_play_sfx(SFX_LAND, SFX_LAND_FREQ, 64, 0, 0, -1);
353 #endif
354                                                 }
355                                         }
356                                 } else {
357                                         if ((player[c1].y >> 16) > (138 + c1 * 2)) {
358                                                 player[c1].y = (138L + c1 * 2) << 16;
359                                                 player[c1].y_add = 0;
360                                                 if (player[c1].anim != 0 && player[c1].anim != 1) {
361                                                         player[c1].anim = 0;
362                                                         player[c1].frame = 0;
363                                                         player[c1].frame_tick = 0;
364                                                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
365 #if 0
366                                                         dj_play_sfx(SFX_LAND, SFX_LAND_FREQ, 64, 0, 0, -1);
367 #endif
368                                                 }
369                                         }
370                                 }
371                                 player[c1].x += player[c1].x_add;
372                                 if ((player[c1].x >> 16) < 0) {
373                                         player[c1].x = 0;
374                                         player[c1].x_add = 0;
375                                 }
376                                 if ((player[c1].x >> 16) > 400) {
377                                         end_loop_flag = 1;
378                                         new_game_flag = 1;
379                                         memset(menu_pal, 0, 768);
380                                         mod_fade_direction = 0;
381                                 }
382                                 if ((player[c1].y >> 16) > (138 + c1 * 2)) {
383                                         if ((player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (190 + c1 * 2)) {
384                                                 player[c1].x = (165L + c1 * 2) << 16;
385                                                 player[c1].x_add = 0;
386                                         }
387                                         if ((player[c1].x >> 16) > (190 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2)) {
388                                                 player[c1].x = (208L + c1 * 2) << 16;
389                                                 player[c1].x_add = 0;
390                                         }
391                                 }
392                         }
393                         player[c1].frame_tick++;
394                         if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
395                                 player[c1].frame++;
396                                 if (player[c1].frame >= player_anims[player[c1].anim].num_frames)
397                                         player[c1].frame = player_anims[player[c1].anim].restart_frame;
398                                 player[c1].frame_tick = 0;
399                         }
400                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
401                 }
402
403                 dj_mix();
404
405                 main_info.page_info[main_info.draw_page].num_pobs = 0;
406
407                 for (c1 = 3; c1 >= 0; c1--)
408                         add_pob(main_info.draw_page, player[c1].x >> 16, player[c1].y >> 16, player[c1].image + c1 * 18, rabbit_gobs);
409
410                 update_objects();
411
412                 draw_pobs(main_info.draw_page);
413
414                 dj_mix();
415
416                 if (mod_fade_direction == 1) {
417                         if (mod_vol < 35) {
418                                 mod_vol++;
419                                 dj_set_mod_volume(mod_vol);
420                         }
421                 } else {
422                         if (mod_vol > 0) {
423                                 mod_vol--;
424                                 dj_set_mod_volume(mod_vol);
425                         }
426                 }
427
428                 fade_flag = 0;
429                 for (c1 = 0; c1 < 720; c1++) {
430                         if (menu_cur_pal[c1] < menu_pal[c1]) {
431                                 menu_cur_pal[c1]++;
432                                 fade_flag = 1;
433                         } else if (menu_cur_pal[c1] > menu_pal[c1]) {
434                                 menu_cur_pal[c1]--;
435                                 fade_flag = 2;
436                         }
437                 }
438                 if (fade_flag == 0 && end_loop_flag == 1) {
439                         menu_deinit();
440                         if (new_game_flag == 1)
441                                 return 0;
442                         else
443                                 return 1;
444                 }
445 #if 0
446                 if (fade_flag == 2) {
447                         fade_dir = 0;
448                         fade_count = 0;
449                 }
450 #endif
451                 switch (fade_dir) {
452                 case 0:
453                         if (fade_count < 30) {
454                                 for (c1 = 0; c1 < 48; c1++) {
455                                         if (fade_pal[c1] > 0)
456                                                 fade_pal[c1]--;
457                                 }
458                                 fade_count++;
459                         } else {
460                                 outportw(0x3c4, 0x0f02);
461                                 memset((char *) (0xa0000 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
462                                 memset((char *) (0xa0000 + 32768 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
463                                 cur_message++;
464                                 if (cur_message >= NUM_MESSAGES)
465                                         cur_message -= NUM_MESSAGES;
466                                 put_text(0, 200, 220, message[cur_message], 2);
467                                 put_text(1, 200, 220, message[cur_message], 2);
468                                 fade_dir = 1;
469                                 fade_count = 0;
470                                 fade_tick = 0;
471                         }
472                         break;
473                 case 1:
474                         if (fade_count < 100) {
475                                 for (c1 = 0; c1 < 48; c1++) {
476                                         if (fade_pal[c1] < menu_pal[c1 + 720])
477                                                 fade_pal[c1]++;
478                                 }
479                                 fade_count++;
480                         } else {
481                                 fade_dir = 0;
482                                 fade_count = 0;
483                                 fade_tick = 0;
484                         }
485                         break;
486                 }
487
488                 for (c1 = 0; c1 < 48; c1++) {
489                         if (fade_pal[c1] > menu_pal[c1 + 720])
490                                 fade_pal[c1]--;
491                 }
492
493                 main_info.draw_page ^= 1;
494                 main_info.view_page ^= 1;
495
496                 outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
497                 outportw(0x3d4, ((main_info.view_page << 15) & 0xff00) + 0x0c);
498
499                 while ((inportb(0x3da) & 8) == 0)
500                         dj_mix();
501                 while ((inportb(0x3da) & 8) == 8)
502                         dj_mix();
503
504                 if (fade_flag != 0) {
505                         outportb(0x3c8, 0);
506                         for (c1 = 0; c1 < 720; c1++)
507                                 outportb(0x3c9, menu_cur_pal[c1]);
508                 }
509
510                 outportb(0x3c8, 240);
511                 for (c1 = 0; c1 < 48; c1++)
512                         outportb(0x3c9, fade_pal[c1]);
513
514                 dj_mix();
515
516                 redraw_pob_backgrounds(main_info.draw_page);
517
518         }
519
520         menu_deinit();
521         return 0;
522
523 }
524
525
526 char menu_init(void)
527 {
528         FILE *handle;
529         int c1;
530
531         outportb(0x3c8, 0);
532         for (c1 = 0; c1 < 768; c1++)
533                 outportb(0x3c9, 0);
534
535         if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
536                 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
537                 return 1;
538         }
539         if (read_pcx(handle, background_pic, 102400, menu_pal) != 0) {
540                 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
541                 return 1;
542         }
543         fclose(handle);
544         if ((handle = dat_open("menumask.pcx", datfile_name, "rb")) == 0) {
545                 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
546                 return 1;
547         }
548         if (read_pcx(handle, mask_pic, 102400, 0) != 0) {
549                 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
550                 return 1;
551         }
552         fclose(handle);
553         memset(menu_cur_pal, 0, 768);
554
555         put_block(0, 0, 0, 400, 256, background_pic);
556         put_block(1, 0, 0, 400, 256, background_pic);
557
558         for (c1 = 0; c1 < 4; c1++) {
559                 player[c1].enabled = 0;
560                 player[c1].x = (long) rnd(150) << 16;
561                 player[c1].y = (160L + c1 * 2) << 16;
562                 player[c1].x_add = 0;
563                 player[c1].y_add = 0;
564                 player[c1].direction = rnd(2);
565                 player[c1].jump_ready = 1;
566                 player[c1].anim = 0;
567                 player[c1].frame = 0;
568                 player[c1].frame_tick = 0;
569                 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image;
570         }
571
572         for (c1 = 0; c1 < 300; c1++)
573                 objects[c1].used = 0;
574
575         main_info.page_info[0].num_pobs = 0;
576         main_info.page_info[1].num_pobs = 0;
577
578         return 0;
579
580 }
581
582
583 void menu_deinit(void)
584 {
585
586         dj_set_nosound(1);
587
588 }