]> icculus.org git repositories - crow/jumpnbump.git/blob - menu.c
Initial revision
[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 char menu(void) {
38         int c1;
39         char esc_pressed;
40         char end_loop_flag, new_game_flag, fade_flag;
41         char mod_vol, mod_fade_direction;
42         int cur_message;
43         int fade_dir, fade_count, fade_tick;
44         char fade_pal[48];
45
46         if (menu_init() != 0)
47                 return 1;
48
49         mod_vol = 0;
50         mod_fade_direction = 1;
51   dj_ready_mod(MOD_MENU);
52         dj_set_mod_volume(mod_vol);
53         dj_set_sfx_volume(64);
54   dj_start_mod();
55         dj_set_nosound(0);
56
57         memset(fade_pal, 0, 48);
58         outportb(0x3c8, 240);
59         for (c1 = 0; c1 < 48; c1++)
60                 outportb(0x3c9, fade_pal[c1]);
61         fade_dir = 0;
62         fade_count = 0;
63         fade_tick = 0;
64         cur_message = NUM_MESSAGES - 1;
65
66         main_info.page_info[0].num_pobs = 0;
67   main_info.page_info[1].num_pobs = 0;
68   main_info.view_page = 0;
69   main_info.draw_page = 1;
70
71         esc_pressed = key_pressed(1);
72         end_loop_flag = new_game_flag = 0;
73
74         while (1) {
75
76                 dj_mix();
77
78                 if (key_pressed(1) == 1 && esc_pressed == 0) {
79                         end_loop_flag = 1;
80                         new_game_flag = 0;
81                         memset(menu_pal, 0, 768);
82                         mod_fade_direction = 0;
83                 }
84                 else if (key_pressed(1) == 0)
85                         esc_pressed = 0;
86
87                 if (main_info.mouse_enabled == 1)
88                         read_mouse();
89                 if (main_info.joy_enabled == 1)
90                         read_joy();
91                 for (c1 = 0; c1 < 4; c1++) {
92                         if (end_loop_flag == 1 && new_game_flag == 1) {
93                                 if ( (player[c1].x >> 16) >     (165 + c1 * 2) ) {
94                         if (player[c1].x_add < 0)
95                                 player[c1].x_add += 16384;
96                         else
97                                 player[c1].x_add += 12288;
98                             if (player[c1].x_add > 98304L)
99                                 player[c1].x_add = 98304L;
100                   player[c1].direction = 0;
101             if (player[c1].anim == 0) {
102                 player[c1].anim = 1;
103                   player[c1].frame = 0;
104                 player[c1].frame_tick = 0;
105                                                 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
106           }
107                                         player[c1].enabled = 1;
108                                 }
109                         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) ) ) ) {
110                           if (player[c1].y_add < 0) {
111                                         player[c1].y_add += 32768;
112                                 if (player[c1].y_add > 0)
113                                                 player[c1].y_add = 0;
114                                 }
115                                 }
116                   player[c1].y_add += 12288;
117                         if (player[c1].y_add > 36864 && player[c1].anim != 3) {
118                                   player[c1].anim = 3;
119               player[c1].frame = 0;
120                       player[c1].frame_tick = 0;
121                                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
122         }
123                   player[c1].y += player[c1].y_add;
124                                 if ( (player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2) ) {
125                                         if ( (player[c1].y >> 16) > (160 + c1 * 2) ) {
126                                                 player[c1].y = (160L + c1 * 2) << 16;
127                                                 player[c1].y_add = 0;
128                           if (player[c1].anim != 0 && player[c1].anim != 1) {
129                                           player[c1].anim = 0;
130                                 player[c1].frame = 0;
131                                       player[c1].frame_tick = 0;
132                                                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
133                         }
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                         }
162                         else {
163                         if ( (c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && joy.x < -512 && joy.x > 512) || (c1 == 3 && mouse.but1 == 1 && mouse.but2 == 1) ) {
164                                         if (player[c1].direction == 1) {
165                                                 if ( (player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2) ) {
166                                         if (player[c1].x_add > 0) {
167                                                         player[c1].x_add -= 16384;
168                                                                 if ( (player[c1].y >> 16) >= (160 + c1 * 2) )
169                                                 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
170                                                         }
171                                                 else
172                                                 player[c1].x_add -= 12288;
173                                                 }
174                                                 if ( (player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2) ) {
175                                         if (player[c1].x_add > 0) {
176                                                         player[c1].x_add -= 16384;
177                                                                 if ( (player[c1].y >> 16) >= (138 + c1 * 2) )
178                                                 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
179                                                         }
180                                                 else
181                                                 player[c1].x_add -= 12288;
182                                                 }
183                                     if (player[c1].x_add < -98304L)
184                                         player[c1].x_add = -98304L;
185                               player[c1].direction = 1;
186                         if (player[c1].anim == 0) {
187                         player[c1].anim = 1;
188                 player[c1].frame = 0;
189                   player[c1].frame_tick = 0;
190                                                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
191                     }
192                                         }
193                                         else {
194                                                 if ( (player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2) ) {
195                                                 if (player[c1].x_add < 0) {
196                                                         player[c1].x_add += 16384;
197                                                                 if ( (player[c1].y >> 16) >= (160 + c1 * 2) )
198                                                 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);
199                                                         }
200                                                 else
201                                                 player[c1].x_add += 12288;
202                                                 }
203                                                 if ( (player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2) ) {
204                                                 if (player[c1].x_add < 0) {
205                                                         player[c1].x_add += 16384;
206                                                                 if ( (player[c1].y >> 16) >= (138 + c1 * 2) )
207                                                 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);
208                                                         }
209                                                 else
210                                                 player[c1].x_add += 12288;
211                                                 }
212                                     if (player[c1].x_add > 98304L)
213                                         player[c1].x_add = 98304L;
214                           player[c1].direction = 0;
215                 if (player[c1].anim == 0) {
216                         player[c1].anim = 1;
217                       player[c1].frame = 0;
218                 player[c1].frame_tick = 0;
219                                                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
220                   }
221                                         }
222                                 }
223                         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) ) {
224                                         if ( (player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2) ) {
225                                 if (player[c1].x_add > 0) {
226                                                 player[c1].x_add -= 16384;
227                                                         if ( (player[c1].y >> 16) >= (160 + c1 * 2) )
228                                         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                                                 }
230                                         else
231                                         player[c1].x_add -= 12288;
232                                         }
233                                         if ( (player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2) ) {
234                                 if (player[c1].x_add > 0) {
235                                                 player[c1].x_add -= 16384;
236                                                         if ( (player[c1].y >> 16) >= (138 + c1 * 2) )
237                                         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);
238                                                 }
239                                         else
240                                         player[c1].x_add -= 12288;
241                                         }
242                             if (player[c1].x_add < -98304L)
243                                 player[c1].x_add = -98304L;
244                       player[c1].direction = 1;
245                 if (player[c1].anim == 0) {
246                 player[c1].anim = 1;
247                 player[c1].frame = 0;
248                   player[c1].frame_tick = 0;
249                                                 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
250             }
251                                 }
252                         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) ) {
253                                         if ( (player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2) ) {
254                                         if (player[c1].x_add < 0) {
255                                                 player[c1].x_add += 16384;
256                                                         if ( (player[c1].y >> 16) >= (160 + c1 * 2) )
257                                         add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
258                                                 }
259                                         else
260                                         player[c1].x_add += 12288;
261                                         }
262                                         if ( (player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2) ) {
263                                         if (player[c1].x_add < 0) {
264                                                 player[c1].x_add += 16384;
265                                                         if ( (player[c1].y >> 16) >= (138 + c1 * 2) )
266                                         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);
267                                                 }
268                                         else
269                                         player[c1].x_add += 12288;
270                                         }
271                             if (player[c1].x_add > 98304L)
272                                 player[c1].x_add = 98304L;
273                   player[c1].direction = 0;
274             if (player[c1].anim == 0) {
275                 player[c1].anim = 1;
276                   player[c1].frame = 0;
277                 player[c1].frame_tick = 0;
278                                                 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
279           }
280                                 }
281 //              if ( (c1 == 0 && ( (key_pressed(KEY_PL1_LEFT) == 0 && key_pressed(KEY_PL1_RIGHT) == 0) || (key_pressed(KEY_PL1_LEFT) == 1 && key_pressed(KEY_PL1_RIGHT) == 1) ) ) || (c1 == 1 && ( (key_pressed(KEY_PL2_LEFT) == 0 && key_pressed(KEY_PL2_RIGHT) == 0) || (key_pressed(KEY_PL2_LEFT) == 1 && key_pressed(KEY_PL2_RIGHT) == 1) ) ) || (c1 == 2 && ( (joy.x >= -512 && joy.x <= 512) || (joy.x < -512 && joy.x > 512) ) ) || (c1 == 3 && ( (mouse.but1 == 0 && mouse.but2 == 0) || (mouse.but1 == 1 && mouse.but2 == 1) ) ) ) {
282                                 else {
283                                         if ( ( (player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2) ) && (player[c1].y >> 16) >= (160 + c1 * 2) ) {
284                                 if (player[c1].x_add < 0) {
285                                         player[c1].x_add += 16384;
286                                     if (player[c1].x_add > 0)
287                                                 player[c1].x_add = 0;
288                                 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
289                         }
290                         else if (player[c1].x_add > 0) {
291                                         player[c1].x_add -= 16384;
292                                           if (player[c1].x_add < 0)
293                                         player[c1].x_add = 0;
294                                         add_object(OBJ_SMOKE, (player[c1].x >> 16) + 2 + rnd(9), (player[c1].y >> 16) + 13 + rnd(5), 0, -16384 - rnd(8192), OBJ_ANIM_SMOKE, 0);
295                                     }
296                                         }
297                                         if ( ( ( (player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2) ) && (player[c1].y >> 16) >= (138 + c1 * 2) ) ) {
298                                 if (player[c1].x_add < 0) {
299                                         player[c1].x_add += 16384;
300                                     if (player[c1].x_add > 0)
301                                                 player[c1].x_add = 0;
302                                 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);
303                         }
304                         else if (player[c1].x_add > 0) {
305                                         player[c1].x_add -= 16384;
306                                           if (player[c1].x_add < 0)
307                                         player[c1].x_add = 0;
308                                 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);
309                             }
310                                         }
311               if (player[c1].anim == 1) {
312                         player[c1].anim = 0;
313                 player[c1].frame = 0;
314                   player[c1].frame_tick = 0;
315                                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
316             }
317                                 }
318                         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) ) ) ) ) {
319                                         if ( (player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2) ) {
320                                                 if ( (player[c1].y >> 16) >= (160 + c1 * 2) ) {
321                                         player[c1].y_add = -280000L;
322                                 player[c1].anim = 2;
323                                       player[c1].frame = 0;
324                                     player[c1].frame_tick = 0;
325                                                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
326                                                 player[c1].jump_ready = 0;
327                                                         dj_play_sfx(SFX_JUMP, SFX_JUMP_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
328                                                 }
329                                         }
330                                         else {
331                                                 if ( (player[c1].y >> 16) >= (138 + c1 * 2) ) {
332                                         player[c1].y_add = -280000L;
333                                 player[c1].anim = 2;
334                                       player[c1].frame = 0;
335                                     player[c1].frame_tick = 0;
336                                                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
337                                                 player[c1].jump_ready = 0;
338                                                         dj_play_sfx(SFX_JUMP, SFX_JUMP_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
339                                                 }
340                                         }
341                                 }
342                         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) ) ) ) {
343                           if (player[c1].y_add < 0) {
344                                         player[c1].y_add += 32768;
345                                 if (player[c1].y_add > 0)
346                                                 player[c1].y_add = 0;
347                                 }
348                                 }
349                         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) ) ) ) )
350                                 player[c1].jump_ready = 1;
351                   player[c1].y_add += 12288;
352                         if (player[c1].y_add > 36864 && player[c1].anim != 3) {
353                                   player[c1].anim = 3;
354               player[c1].frame = 0;
355                       player[c1].frame_tick = 0;
356                                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
357         }
358                   player[c1].y += player[c1].y_add;
359                                 if ( (player[c1].x >> 16) <= (165 + c1 * 2) || (player[c1].x >> 16) >= (208 + c1 * 2) ) {
360                                         if ( (player[c1].y >> 16) > (160 + c1 * 2) ) {
361                                                 player[c1].y = (160L + c1 * 2) << 16;
362                                                 player[c1].y_add = 0;
363                   if (player[c1].anim != 0 && player[c1].anim != 1) {
364                                   player[c1].anim = 0;
365                         player[c1].frame = 0;
366                                       player[c1].frame_tick = 0;
367                                                 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
368 //                                                      dj_play_sfx(SFX_LAND, SFX_LAND_FREQ, 64, 0, 0, -1);
369                 }
370                                         }
371                                 }
372                                 else {
373                                         if ( (player[c1].y >> 16) > (138 + c1 * 2) ) {
374                                                 player[c1].y = (138L + c1 * 2) << 16;
375                                                 player[c1].y_add = 0;
376                   if (player[c1].anim != 0 && player[c1].anim != 1) {
377                                 player[c1].anim = 0;
378                         player[c1].frame = 0;
379                                     player[c1].frame_tick = 0;
380                                                 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
381 //                                                      dj_play_sfx(SFX_LAND, SFX_LAND_FREQ, 64, 0, 0, -1);
382                     }
383                                         }
384                                 }
385                 player[c1].x += player[c1].x_add;
386                     if ( (player[c1].x >> 16) < 0) {
387                         player[c1].x = 0;
388                                 player[c1].x_add = 0;
389             }
390                     if ( (player[c1].x >> 16) > 400) {
391                                         end_loop_flag = 1;
392                                         new_game_flag = 1;
393                                         memset(menu_pal, 0, 768);
394                                         mod_fade_direction = 0;
395             }
396                                 if ( (player[c1].y >> 16) >     (138 + c1 * 2) ) {
397                         if ( (player[c1].x >> 16) > (165 + c1 * 2) && (player[c1].x >> 16) < (190 + c1 * 2) ) {
398                                 player[c1].x = (165L + c1 * 2) << 16;
399                                         player[c1].x_add = 0;
400                       }
401                         if ( (player[c1].x >> 16) > (190 + c1 * 2) && (player[c1].x >> 16) < (208 + c1 * 2) ) {
402                                 player[c1].x = (208L + c1 * 2) << 16;
403                                         player[c1].x_add = 0;
404                       }
405                                 }
406                         }
407                 player[c1].frame_tick++;
408             if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
409         player[c1].frame++;
410                         if (player[c1].frame >= player_anims[player[c1].anim].num_frames)
411                                 player[c1].frame = player_anims[player[c1].anim].restart_frame;
412               player[c1].frame_tick = 0;
413       }
414                         player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
415                 }
416
417                 dj_mix();
418
419     main_info.page_info[main_info.draw_page].num_pobs = 0;
420
421                 for (c1 = 3; c1 >= 0; c1--)
422                         add_pob(main_info.draw_page, player[c1].x >> 16, player[c1].y >> 16, player[c1].image + c1 * 18, rabbit_gobs);
423
424     update_objects();
425
426                 draw_pobs(main_info.draw_page);
427
428                 dj_mix();
429
430                 if (mod_fade_direction == 1) {
431                         if (mod_vol < 35) {
432                                 mod_vol++;
433                                 dj_set_mod_volume(mod_vol);
434                         }
435                 }
436                 else {
437                         if (mod_vol > 0) {
438                                 mod_vol--;
439                                 dj_set_mod_volume(mod_vol);
440                         }
441                 }
442
443                 fade_flag = 0;
444                 for (c1 = 0; c1 < 720; c1++) {
445                         if (menu_cur_pal[c1] < menu_pal[c1]) {
446                                 menu_cur_pal[c1]++;
447                                 fade_flag = 1;
448                         }
449                         else if (menu_cur_pal[c1] > menu_pal[c1]) {
450                                 menu_cur_pal[c1]--;
451                                 fade_flag = 2;
452                         }
453                 }
454                 if (fade_flag == 0 && end_loop_flag == 1) {
455                         menu_deinit();
456                         if (new_game_flag == 1)
457                                 return 0;
458                         else
459                                 return 1;
460                 }
461
462 /*              if (fade_flag == 2) {
463                         fade_dir = 0;
464                         fade_count = 0;
465                 }*/
466
467                 switch (fade_dir) {
468                         case 0:
469                                 if (fade_count < 30) {
470                                         for (c1 = 0; c1 < 48; c1++) {
471                                                 if (fade_pal[c1] > 0)
472                                                         fade_pal[c1]--;
473                                         }
474                                         fade_count++;
475                                 }
476                                 else {
477                                         outportw(0x3c4, 0x0f02);
478                                   memset( (char *)(0xa0000 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
479                                   memset( (char *)(0xa0000 + 32768 + 220 * 100 + __djgpp_conventional_base), 0, 2000);
480                                         cur_message++;
481                                         if (cur_message >= NUM_MESSAGES)
482                                                 cur_message -= NUM_MESSAGES;
483                                         put_text(0, 200, 220, message[cur_message], 2);
484                                         put_text(1, 200, 220, message[cur_message], 2);
485                                         fade_dir = 1;
486                                         fade_count = 0;
487                                         fade_tick = 0;
488                                 }
489                                 break;
490                         case 1:
491                                 if (fade_count < 100) {
492                                         for (c1 = 0; c1 < 48; c1++) {
493                                                 if (fade_pal[c1] < menu_pal[c1 + 720])
494                                                         fade_pal[c1]++;
495                                         }
496                                         fade_count++;
497                                 }
498                                 else {
499                                         fade_dir = 0;
500                                         fade_count = 0;
501                                         fade_tick = 0;
502                                 }
503                                 break;
504                 }
505
506                 for (c1 = 0; c1 < 48; c1++) {
507                         if (fade_pal[c1] > menu_pal[c1 + 720])
508                                 fade_pal[c1]--;
509                 }
510
511     main_info.draw_page ^= 1;
512     main_info.view_page ^= 1;
513
514                 outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
515                 outportw(0x3d4, ( (main_info.view_page << 15) & 0xff00) + 0x0c);
516
517                 while( (inportb(0x3da) & 8) == 0)
518                         dj_mix();
519                 while( (inportb(0x3da) & 8) == 8)
520                         dj_mix();
521
522                 if (fade_flag != 0) {
523                 outportb(0x3c8, 0);
524                         for (c1 = 0; c1 < 720; c1++)
525                                 outportb(0x3c9, menu_cur_pal[c1]);
526                 }
527
528         outportb(0x3c8, 240);
529                 for (c1 = 0; c1 < 48; c1++)
530                         outportb(0x3c9, fade_pal[c1]);
531
532                 dj_mix();
533
534                 redraw_pob_backgrounds(main_info.draw_page);
535
536         }
537
538         menu_deinit();
539         return 0;
540
541 }
542
543
544 char menu_init(void) {
545         FILE *handle;
546         int c1;
547
548   outportb(0x3c8, 0);
549         for (c1 = 0; c1 < 768; c1++)
550                 outportb(0x3c9, 0);
551
552   if ( (handle = dat_open("menu.pcx", datfile_name, "rb") ) == 0) {
553                 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
554                 return 1;
555         }
556         if (read_pcx(handle, background_pic, 102400, menu_pal) != 0) {
557                 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
558                 return 1;
559         }
560         fclose(handle);
561   if ( (handle = dat_open("menumask.pcx", datfile_name, "rb") ) == 0) {
562                 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
563                 return 1;
564         }
565         if (read_pcx(handle, mask_pic, 102400, 0) != 0) {
566                 strcpy(main_info.error_str, "Error loading 'menumask.pcx', aborting...\n");
567                 return 1;
568         }
569         fclose(handle);
570         memset(menu_cur_pal, 0, 768);
571
572         put_block(0, 0, 0, 400, 256, background_pic);
573         put_block(1, 0, 0, 400, 256, background_pic);
574
575         for (c1 = 0; c1 < 4; c1++) {
576                 player[c1].enabled = 0;
577                 player[c1].x = (long)rnd(150) << 16;
578                 player[c1].y = (160L + c1 * 2) << 16;
579                 player[c1].x_add = 0;
580                 player[c1].y_add = 0;
581                 player[c1].direction = rnd(2);
582                 player[c1].jump_ready = 1;
583                 player[c1].anim = 0;
584                 player[c1].frame = 0;
585                 player[c1].frame_tick = 0;
586     player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image;
587         }
588
589         for (c1 = 0; c1 <       300; c1++)
590                 objects[c1].used = 0;
591
592         main_info.page_info[0].num_pobs = 0;
593   main_info.page_info[1].num_pobs = 0;
594
595         return 0;
596
597 }
598
599
600 void menu_deinit(void) {
601
602         dj_set_nosound(1);
603
604 }
605