4 #define M_PI 3.14159265358979323846
7 gob_t rabbit_gobs = { 0 };
8 gob_t font_gobs = { 0 };
9 gob_t object_gobs = { 0 };
10 gob_t number_gobs = { 0 };
12 unsigned int ban_map[17][22] = {
13 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
14 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0},
15 {1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
16 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1},
17 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
18 {1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
19 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1},
20 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
21 {1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
22 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 1},
23 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1},
24 {1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1},
25 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
26 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
27 {2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 1, 3, 3, 3, 1, 1, 1},
28 {2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
29 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
169 } pobs[NUM_LEFTOVERS];
173 int pogostick, bunnies_in_space, jetpack, lord_of_the_flies, blood_is_thicker_than_water;
175 int main(int argc, char *argv[])
178 int c1, c2 = 0, c3, c4;
181 int closest_player = 0, dist, cur_dist;
182 int end_loop_flag, fade_flag;
183 int mod_vol, sfx_vol, mod_fade_direction;
188 if (init_program(argc, argv, pal) != 0)
191 if (main_info.fireworks == 1) {
201 if (key_pressed(1) == 1) {
204 if (init_level(0, pal) != 0) {
209 memset(cur_pal, 0, 768);
210 setpalette(0, 256, cur_pal);
212 recalculate_gob(&rabbit_gobs, pal);
213 recalculate_gob(&font_gobs, pal);
214 recalculate_gob(&object_gobs, pal);
215 recalculate_gob(&number_gobs, pal);
218 register_background(background_pic, pal);
223 for (c1 = 0; c1 < NUM_FLIES; c1++) {
225 flies[c1].x = s1 + rnd(101) - 50;
226 flies[c1].y = s2 + rnd(101) - 50;
227 if (ban_map[flies[c1].y >> 4][flies[c1].x >> 4] == BAN_VOID)
230 flies[c1].back_defined[0] = 0;
231 flies[c1].back_defined[1] = 0;
234 mod_vol = sfx_vol = 10;
235 mod_fade_direction = 1;
236 dj_ready_mod(MOD_GAME);
237 dj_set_mod_volume((char)mod_vol);
238 dj_set_sfx_volume((char)mod_vol);
240 dj_play_sfx(SFX_FLY, SFX_FLY_FREQ, 0, 0, 0, 4);
243 lord_of_the_flies = bunnies_in_space = jetpack = pogostick = blood_is_thicker_than_water = 0;
245 main_info.page_info[0].num_pobs = 0;
246 main_info.page_info[1].num_pobs = 0;
247 main_info.view_page = 0;
248 main_info.draw_page = 1;
252 if (key_pressed(1) == 1) {
255 mod_fade_direction = 0;
258 if (strncmp(last_keys, "kcitsogop", strlen("kcitsogop")) == 0) {
262 if (strncmp(last_keys, "ecapsniseinnub", strlen("ecapsniseinnub")) == 0) {
263 bunnies_in_space ^= 1;
266 if (strncmp(last_keys, "kcaptej", strlen("kcaptej")) == 0) {
270 if (strncmp(last_keys, "seilfehtfodrol", strlen("seilfehtfodrol")) == 0) {
271 lord_of_the_flies ^= 1;
274 if (strncmp(last_keys, "retawnahtrekcihtsidoolb", strlen("retawnahtrekcihtsidoolb")) == 0) {
275 blood_is_thicker_than_water ^= 1;
276 if (blood_is_thicker_than_water == 1) {
334 for (c3 = 0; c3 < 6; c3++) {
338 } else if (c3 == 1) {
341 } else if (c3 == 2) {
344 } else if (c3 == 3) {
347 } else if (c3 == 4) {
350 } else if (c3 == 5) {
354 if (player[c1].enabled == 1 && player[c2].enabled == 1) {
355 if (labs(player[c1].x - player[c2].x) < (12L << 16) && labs(player[c1].y - player[c2].y) < (12L << 16)) {
356 if ((labs(player[c1].y - player[c2].y) >> 16) > 5) {
357 if (player[c1].y < player[c2].y) {
358 if (player[c1].y_add >= 0) {
359 player[c1].y_add = -player[c1].y_add;
360 if (player[c1].y_add > -262144L)
361 player[c1].y_add = -262144L;
362 player[c1].jump_abort = 1;
363 player[c2].dead_flag = 1;
364 if (player[c2].anim != 6) {
366 player[c2].frame = 0;
367 player[c2].frame_tick = 0;
368 player[c2].image = player_anims[player[c2].anim].frame[player[c2].frame].image + player[c2].direction * 9;
369 if (main_info.no_gore == 0) {
370 for (c4 = 0; c4 < 6; c4++)
371 add_object(OBJ_FUR, (player[c2].x >> 16) + 6 + rnd(5), (player[c2].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 44 + c2 * 8);
372 for (c4 = 0; c4 < 6; c4++)
373 add_object(OBJ_FLESH, (player[c2].x >> 16) + 6 + rnd(5), (player[c2].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 76);
374 for (c4 = 0; c4 < 6; c4++)
375 add_object(OBJ_FLESH, (player[c2].x >> 16) + 6 + rnd(5), (player[c2].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 77);
376 for (c4 = 0; c4 < 8; c4++)
377 add_object(OBJ_FLESH, (player[c2].x >> 16) + 6 + rnd(5), (player[c2].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 78);
378 for (c4 = 0; c4 < 10; c4++)
379 add_object(OBJ_FLESH, (player[c2].x >> 16) + 6 + rnd(5), (player[c2].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 79);
381 dj_play_sfx(SFX_DEATH, (unsigned short)(SFX_DEATH_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
383 player[c1].bumped[c2]++;
384 s1 = player[c1].bumps % 100;
385 add_leftovers(0, 360, 34 + c1 * 64, s1 / 10, &number_gobs);
386 add_leftovers(1, 360, 34 + c1 * 64, s1 / 10, &number_gobs);
387 add_leftovers(0, 376, 34 + c1 * 64, s1 - (s1 / 10) * 10, &number_gobs);
388 add_leftovers(1, 376, 34 + c1 * 64, s1 - (s1 / 10) * 10, &number_gobs);
391 if (player[c2].y_add < 0)
392 player[c2].y_add = 0;
395 if (player[c2].y_add >= 0) {
396 player[c2].y_add = -player[c2].y_add;
397 if (player[c2].y_add > -262144L)
398 player[c2].y_add = -262144L;
399 player[c2].jump_abort = 1;
400 player[c1].dead_flag = 1;
401 if (player[c1].anim != 6) {
403 player[c1].frame = 0;
404 player[c1].frame_tick = 0;
405 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
406 if (main_info.no_gore == 0) {
407 for (c4 = 0; c4 < 6; c4++)
408 add_object(OBJ_FUR, (player[c1].x >> 16) + 6 + rnd(5), (player[c1].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 44 + c1 * 8);
409 for (c4 = 0; c4 < 6; c4++)
410 add_object(OBJ_FLESH, (player[c1].x >> 16) + 6 + rnd(5), (player[c1].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 76);
411 for (c4 = 0; c4 < 7; c4++)
412 add_object(OBJ_FLESH, (player[c1].x >> 16) + 6 + rnd(5), (player[c1].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 77);
413 for (c4 = 0; c4 < 8; c4++)
414 add_object(OBJ_FLESH, (player[c1].x >> 16) + 6 + rnd(5), (player[c1].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 78);
415 for (c4 = 0; c4 < 10; c4++)
416 add_object(OBJ_FLESH, (player[c1].x >> 16) + 6 + rnd(5), (player[c1].y >> 16) + 6 + rnd(5), (rnd(65535) - 32768) * 3, (rnd(65535) - 32768) * 3, 0, 79);
418 dj_play_sfx(SFX_DEATH, (unsigned short)(SFX_DEATH_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
420 player[c2].bumped[c1]++;
421 s1 = player[c2].bumps % 100;
422 add_leftovers(0, 360, 34 + c2 * 64, s1 / 10, &number_gobs);
423 add_leftovers(1, 360, 34 + c2 * 64, s1 / 10, &number_gobs);
424 add_leftovers(0, 376, 34 + c2 * 64, s1 - (s1 / 10) * 10, &number_gobs);
425 add_leftovers(1, 376, 34 + c2 * 64, s1 - (s1 / 10) * 10, &number_gobs);
428 if (player[c1].y_add < 0)
429 player[c1].y_add = 0;
433 if (player[c1].x < player[c2].x) {
434 if (player[c1].x_add > 0)
435 player[c1].x = player[c2].x - (12L << 16);
436 else if (player[c2].x_add < 0)
437 player[c2].x = player[c1].x + (12L << 16);
439 player[c1].x -= player[c1].x_add;
440 player[c2].x -= player[c2].x_add;
442 l1 = player[c2].x_add;
443 player[c2].x_add = player[c1].x_add;
444 player[c1].x_add = l1;
445 if (player[c1].x_add > 0)
446 player[c1].x_add = -player[c1].x_add;
447 if (player[c2].x_add < 0)
448 player[c2].x_add = -player[c2].x_add;
450 if (player[c1].x_add > 0)
451 player[c2].x = player[c1].x - (12L << 16);
452 else if (player[c2].x_add < 0)
453 player[c1].x = player[c2].x + (12L << 16);
455 player[c1].x -= player[c1].x_add;
456 player[c2].x -= player[c2].x_add;
458 l1 = player[c2].x_add;
459 player[c2].x_add = player[c1].x_add;
460 player[c1].x_add = l1;
461 if (player[c1].x_add < 0)
462 player[c1].x_add = -player[c1].x_add;
463 if (player[c2].x_add > 0)
464 player[c2].x_add = -player[c2].x_add;
473 main_info.page_info[main_info.draw_page].num_pobs = 0;
474 for (c1 = 0; c1 < 4; c1++) {
475 if (player[c1].enabled == 1)
476 main_info.page_info[main_info.draw_page].num_pobs++;
483 /* get center of fly swarm */
485 for (c1 = 0; c1 < NUM_FLIES; c1++) {
492 /* get closest player to fly swarm */
494 for (c1 = 0; c1 < 4; c1++) {
495 if (player[c1].enabled == 1) {
496 cur_dist = (int)sqrt((s1 - ((player[c1].x >> 16) + 8)) * (s1 - ((player[c1].x >> 16) + 8)) + (s2 - ((player[c1].y >> 16) + 8)) * (s2 - ((player[c1].y >> 16) + 8)));
497 if (cur_dist < dist) {
503 /* update fly swarm sound */
507 dj_set_sfx_channel_volume(4, (char)(s3));
509 for (c1 = 0; c1 < NUM_FLIES; c1++) {
510 /* get closest player to fly */
512 for (c2 = 0; c2 < 4; c2++) {
513 if (player[c2].enabled == 1) {
514 cur_dist = (int)sqrt((flies[c1].x - ((player[c2].x >> 16) + 8)) * (flies[c1].x - ((player[c2].x >> 16) + 8)) + (flies[c1].y - ((player[c2].y >> 16) + 8)) * (flies[c1].y - ((player[c2].y >> 16) + 8)));
515 if (cur_dist < dist) {
521 flies[c1].old_x = flies[c1].x;
522 flies[c1].old_y = flies[c1].y;
524 if ((s1 - flies[c1].x) > 30)
526 else if ((s1 - flies[c1].x) < -30)
529 if (((player[closest_player].x >> 16) + 8) > flies[c1].x) {
530 if (lord_of_the_flies == 0)
535 if (lord_of_the_flies == 0)
541 s4 = rnd(3) - 1 + s3;
542 if ((flies[c1].x + s4) < 16)
544 if ((flies[c1].x + s4) > 351)
546 if (ban_map[flies[c1].y >> 4][(flies[c1].x + s4) >> 4] != BAN_VOID)
550 if ((s2 - flies[c1].y) > 30)
552 else if ((s2 - flies[c1].y) < -30)
555 if (((player[closest_player].y >> 16) + 8) > flies[c1].y) {
556 if (lord_of_the_flies == 0)
561 if (lord_of_the_flies == 0)
567 s4 = rnd(3) - 1 + s3;
568 if ((flies[c1].y + s4) < 0)
570 if ((flies[c1].y + s4) > 239)
572 if (ban_map[(flies[c1].y + s4) >> 4][flies[c1].x >> 4] != BAN_VOID)
580 for (c1 = 0; c1 < 4; c1++) {
581 if (player[c1].enabled == 1) {
582 main_info.page_info[main_info.draw_page].pobs[s1].x = player[c1].x >> 16;
583 main_info.page_info[main_info.draw_page].pobs[s1].y = player[c1].y >> 16;
584 main_info.page_info[main_info.draw_page].pobs[s1].image = player[c1].image + c1 * 18;
585 main_info.page_info[main_info.draw_page].pobs[s1].pob_data = &rabbit_gobs;
592 draw_pobs(main_info.draw_page);
596 draw_flies(main_info.draw_page);
600 if (mod_fade_direction == 1) {
603 dj_set_mod_volume((char)mod_vol);
608 dj_set_mod_volume((char)mod_vol);
612 if (mod_fade_direction == 1) {
615 dj_set_sfx_volume((char)sfx_vol);
620 dj_set_sfx_volume((char)sfx_vol);
625 for (c1 = 0; c1 < 768; c1++) {
626 if (cur_pal[c1] < pal[c1]) {
629 } else if (cur_pal[c1] > pal[c1]) {
634 if (fade_flag == 0 && end_loop_flag == 1)
637 main_info.draw_page ^= 1;
638 main_info.view_page ^= 1;
640 flippage(main_info.view_page);
645 setpalette(0, 256, cur_pal);
649 redraw_flies_background(main_info.draw_page);
651 redraw_pob_backgrounds(main_info.draw_page);
653 draw_leftovers(main_info.draw_page);
661 main_info.view_page = 0;
662 main_info.draw_page = 1;
664 dj_stop_sfx_channel(4);
668 memset(mask_pic, 0, 102400L);
669 register_mask(mask_pic);
671 recalculate_gob(&font_gobs, pal);
672 register_background(NULL, NULL);
676 put_text(main_info.view_page, 100, 50, "DOTT", 2);
677 put_text(main_info.view_page, 160, 50, "JIFFY", 2);
678 put_text(main_info.view_page, 220, 50, "FIZZ", 2);
679 put_text(main_info.view_page, 280, 50, "MIJJI", 2);
680 put_text(main_info.view_page, 40, 80, "DOTT", 2);
681 put_text(main_info.view_page, 40, 110, "JIFFY", 2);
682 put_text(main_info.view_page, 40, 140, "FIZZ", 2);
683 put_text(main_info.view_page, 40, 170, "MIJJI", 2);
685 for (c1 = 0; c1 < 4; c1++) {
686 for (c2 = 0; c2 < 4; c2++) {
688 sprintf(str1, "%d", player[c1].bumped[c2]);
689 put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, str1, 2);
691 put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, "-", 2);
693 sprintf(str1, "%d", player[c1].bumps);
694 put_text(main_info.view_page, 350, 80 + c1 * 30, str1, 2);
697 put_text(main_info.view_page, 200, 230, "Press ESC to continue", 2);
701 flippage(main_info.view_page);
703 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
704 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
707 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
708 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
713 memset(cur_pal, 0, 768);
715 setpalette(0, 256, cur_pal);
718 dj_ready_mod(MOD_SCORES);
719 dj_set_mod_volume((char)mod_vol);
723 while (key_pressed(1) == 0) {
726 dj_set_mod_volume((char)mod_vol);
727 for (c1 = 0; c1 < 768; c1++) {
728 if (cur_pal[c1] < pal[c1])
734 setpalette(0, 256, cur_pal);
735 flippage(main_info.view_page);
737 while (key_pressed(1) == 1) {
744 while (mod_vol > 0) {
746 dj_set_mod_volume((char)mod_vol);
747 for (c1 = 0; c1 < 768; c1++) {
748 if (cur_pal[c1] > pal[c1])
753 setpalette(0, 256, cur_pal);
754 flippage(main_info.view_page);
757 fillpalette(0, 0, 0);
770 void steer_players(void)
775 update_player_actions();
777 for (c1 = 0; c1 < 4; c1++) {
779 if (player[c1].enabled == 1) {
781 if (player[c1].dead_flag == 0) {
783 if (player[c1].action_left && player[c1].action_right) {
784 if (player[c1].direction == 0) {
785 if (player[c1].action_right) {
786 s1 = (player[c1].x >> 16);
787 s2 = (player[c1].y >> 16);
788 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
789 if (player[c1].x_add < 0)
790 player[c1].x_add += 1024;
792 player[c1].x_add += 768;
793 } else if ((ban_map[(s2 + 16) >> 4][s1 >> 4] != BAN_SOLID && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == BAN_ICE) || (ban_map[(s2 + 16) >> 4][s1 >> 4] == BAN_ICE && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != BAN_SOLID)) {
794 if (player[c1].x_add > 0)
795 player[c1].x_add += 1024;
797 player[c1].x_add += 768;
799 if (player[c1].x_add < 0) {
800 player[c1].x_add += 16384;
801 if (player[c1].x_add < 98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
802 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);
804 player[c1].x_add += 12288;
806 if (player[c1].x_add > 98304L)
807 player[c1].x_add = 98304L;
808 player[c1].direction = 0;
809 if (player[c1].anim == 0) {
811 player[c1].frame = 0;
812 player[c1].frame_tick = 0;
813 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
817 if (player[c1].action_left) {
818 s1 = (player[c1].x >> 16);
819 s2 = (player[c1].y >> 16);
820 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
821 if (player[c1].x_add > 0)
822 player[c1].x_add -= 1024;
824 player[c1].x_add -= 768;
825 } else if ((ban_map[(s2 + 16) >> 4][s1 >> 4] != BAN_SOLID && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == BAN_ICE) || (ban_map[(s2 + 16) >> 4][s1 >> 4] == BAN_ICE && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != BAN_SOLID)) {
826 if (player[c1].x_add > 0)
827 player[c1].x_add -= 1024;
829 player[c1].x_add -= 768;
831 if (player[c1].x_add > 0) {
832 player[c1].x_add -= 16384;
833 if (player[c1].x_add > -98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
834 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);
836 player[c1].x_add -= 12288;
838 if (player[c1].x_add < -98304L)
839 player[c1].x_add = -98304L;
840 player[c1].direction = 1;
841 if (player[c1].anim == 0) {
843 player[c1].frame = 0;
844 player[c1].frame_tick = 0;
845 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
849 } else if (player[c1].action_left) {
850 s1 = (player[c1].x >> 16);
851 s2 = (player[c1].y >> 16);
852 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
853 if (player[c1].x_add > 0)
854 player[c1].x_add -= 1024;
856 player[c1].x_add -= 768;
857 } else if ((ban_map[(s2 + 16) >> 4][s1 >> 4] != BAN_SOLID && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == BAN_ICE) || (ban_map[(s2 + 16) >> 4][s1 >> 4] == BAN_ICE && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != BAN_SOLID)) {
858 if (player[c1].x_add > 0)
859 player[c1].x_add -= 1024;
861 player[c1].x_add -= 768;
863 if (player[c1].x_add > 0) {
864 player[c1].x_add -= 16384;
865 if (player[c1].x_add > -98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
866 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);
868 player[c1].x_add -= 12288;
870 if (player[c1].x_add < -98304L)
871 player[c1].x_add = -98304L;
872 player[c1].direction = 1;
873 if (player[c1].anim == 0) {
875 player[c1].frame = 0;
876 player[c1].frame_tick = 0;
877 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
879 } else if (player[c1].action_right) {
880 s1 = (player[c1].x >> 16);
881 s2 = (player[c1].y >> 16);
882 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
883 if (player[c1].x_add < 0)
884 player[c1].x_add += 1024;
886 player[c1].x_add += 768;
887 } else if ((ban_map[(s2 + 16) >> 4][s1 >> 4] != BAN_SOLID && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == BAN_ICE) || (ban_map[(s2 + 16) >> 4][s1 >> 4] == BAN_ICE && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != BAN_SOLID)) {
888 if (player[c1].x_add > 0)
889 player[c1].x_add += 1024;
891 player[c1].x_add += 768;
893 if (player[c1].x_add < 0) {
894 player[c1].x_add += 16384;
895 if (player[c1].x_add < 98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
896 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);
898 player[c1].x_add += 12288;
900 if (player[c1].x_add > 98304L)
901 player[c1].x_add = 98304L;
902 player[c1].direction = 0;
903 if (player[c1].anim == 0) {
905 player[c1].frame = 0;
906 player[c1].frame_tick = 0;
907 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
909 } else if ((!player[c1].action_left) && (!player[c1].action_right)) {
910 s1 = (player[c1].x >> 16);
911 s2 = (player[c1].y >> 16);
912 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID || ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SPRING || (((ban_map[(s2 + 16) >> 4][s1 >> 4] == BAN_SOLID || ban_map[(s2 + 16) >> 4][s1 >> 4] == BAN_SPRING) && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != BAN_ICE) || (ban_map[(s2 + 16) >> 4][s1 >> 4] != BAN_ICE && (ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == BAN_SOLID || ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == BAN_SPRING)))) {
913 if (player[c1].x_add < 0) {
914 player[c1].x_add += 16384;
915 if (player[c1].x_add > 0)
916 player[c1].x_add = 0;
918 player[c1].x_add -= 16384;
919 if (player[c1].x_add < 0)
920 player[c1].x_add = 0;
922 if (player[c1].x_add != 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
923 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);
925 if (player[c1].anim == 1) {
927 player[c1].frame = 0;
928 player[c1].frame_tick = 0;
929 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
933 if (pogostick == 1 || (player[c1].jump_ready == 1 && player[c1].action_up)) {
934 s1 = (player[c1].x >> 16);
935 s2 = (player[c1].y >> 16);
938 if (ban_map[(s2 + 16) >> 4][s1 >> 4] == BAN_SOLID || ban_map[(s2 + 16) >> 4][s1 >> 4] == BAN_ICE || ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == BAN_SOLID || ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == BAN_ICE) {
939 player[c1].y_add = -280000L;
941 player[c1].frame = 0;
942 player[c1].frame_tick = 0;
943 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
944 player[c1].jump_ready = 0;
945 player[c1].jump_abort = 1;
947 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
949 dj_play_sfx(SFX_SPRING, (unsigned short)(SFX_SPRING_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
951 if ((ban_map[(s2 + 7) >> 4][s1 >> 4] == BAN_VOID || ban_map[(s2 + 7) >> 4][(s1 + 15) >> 4] == BAN_VOID) && (ban_map[(s2 + 8) >> 4][s1 >> 4] == BAN_WATER || ban_map[(s2 + 8) >> 4][(s1 + 15) >> 4] == BAN_WATER)) {
952 player[c1].y_add = -196608L;
953 player[c1].in_water = 0;
955 player[c1].frame = 0;
956 player[c1].frame_tick = 0;
957 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
958 player[c1].jump_ready = 0;
959 player[c1].jump_abort = 1;
961 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
963 dj_play_sfx(SFX_SPRING, (unsigned short)(SFX_SPRING_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
966 if (pogostick == 0 && (!player[c1].action_up)) {
967 player[c1].jump_ready = 1;
968 if (player[c1].in_water == 0 && player[c1].y_add < 0 && player[c1].jump_abort == 1) {
969 if (bunnies_in_space == 0)
970 player[c1].y_add += 32768;
972 player[c1].y_add += 16384;
973 if (player[c1].y_add > 0)
974 player[c1].y_add = 0;
979 if (player[c1].action_up) {
980 player[c1].y_add -= 16384;
981 if (player[c1].y_add < -400000L)
982 player[c1].y_add = -400000L;
983 if ((ban_map[(s2 + 7) >> 4][s1 >> 4] == BAN_VOID || ban_map[(s2 + 7) >> 4][(s1 + 15) >> 4] == BAN_VOID) && (ban_map[(s2 + 8) >> 4][s1 >> 4] == BAN_WATER || ban_map[(s2 + 8) >> 4][(s1 + 15) >> 4] == BAN_WATER))
984 player[c1].in_water = 0;
986 add_object(OBJ_SMOKE, (player[c1].x >> 16) + 6 + rnd(5), (player[c1].y >> 16) + 10 + rnd(5), 0, 16384 + rnd(8192), OBJ_ANIM_SMOKE, 0);
991 player[c1].x += player[c1].x_add;
992 if ((player[c1].x >> 16) < 0) {
994 player[c1].x_add = 0;
996 if ((player[c1].x >> 16) + 15 > 351) {
997 player[c1].x = 336L << 16;
998 player[c1].x_add = 0;
1000 if (player[c1].y > 0) {
1001 s1 = (player[c1].x >> 16);
1002 s2 = (player[c1].y >> 16);
1003 if (ban_map[s2 >> 4][s1 >> 4] == BAN_SOLID || ban_map[s2 >> 4][s1 >> 4] == BAN_ICE || ban_map[s2 >> 4][s1 >> 4] == BAN_SPRING || ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SOLID || ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_ICE || ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SPRING) {
1004 player[c1].x = (((s1 + 16) & 0xfff0)) << 16;
1005 player[c1].x_add = 0;
1007 s1 = (player[c1].x >> 16);
1008 s2 = (player[c1].y >> 16);
1009 if (ban_map[s2 >> 4][(s1 + 15) >> 4] == BAN_SOLID || ban_map[s2 >> 4][(s1 + 15) >> 4] == BAN_ICE || ban_map[s2 >> 4][(s1 + 15) >> 4] == BAN_SPRING || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SOLID || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_ICE || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SPRING) {
1010 player[c1].x = (((s1 + 16) & 0xfff0) - 16) << 16;
1011 player[c1].x_add = 0;
1014 s1 = (player[c1].x >> 16);
1016 if (ban_map[s2 >> 4][s1 >> 4] == BAN_SOLID || ban_map[s2 >> 4][s1 >> 4] == BAN_ICE || ban_map[s2 >> 4][s1 >> 4] == BAN_SPRING || ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SOLID || ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_ICE || ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SPRING) {
1017 player[c1].x = (((s1 + 16) & 0xfff0)) << 16;
1018 player[c1].x_add = 0;
1020 s1 = (player[c1].x >> 16);
1022 if (ban_map[s2 >> 4][(s1 + 15) >> 4] == BAN_SOLID || ban_map[s2 >> 4][(s1 + 15) >> 4] == BAN_ICE || ban_map[s2 >> 4][(s1 + 15) >> 4] == BAN_SPRING || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SOLID || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_ICE || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SPRING) {
1023 player[c1].x = (((s1 + 16) & 0xfff0) - 16) << 16;
1024 player[c1].x_add = 0;
1028 player[c1].y += player[c1].y_add;
1030 s1 = (player[c1].x >> 16);
1031 s2 = (player[c1].y >> 16);
1032 if (ban_map[(s2 + 15) >> 4][(s1 + 8) >> 4] == BAN_SPRING || ((ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SPRING && ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] != BAN_SOLID) || (ban_map[(s2 + 15) >> 4][s1 >> 4] != BAN_SOLID && ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SPRING))) {
1033 player[c1].y = ((player[c1].y >> 16) & 0xfff0) << 16;
1034 player[c1].y_add = -400000L;
1035 player[c1].anim = 2;
1036 player[c1].frame = 0;
1037 player[c1].frame_tick = 0;
1038 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1039 player[c1].jump_ready = 0;
1040 player[c1].jump_abort = 0;
1041 for (c2 = 0; c2 < NUM_OBJECTS; c2++) {
1042 if (objects[c2].used == 1 && objects[c2].type == OBJ_SPRING) {
1043 if (ban_map[(s2 + 15) >> 4][(s1 + 8) >> 4] == BAN_SPRING) {
1044 if ((objects[c2].x >> 20) == ((s1 + 8) >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
1045 objects[c2].frame = 0;
1046 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
1047 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
1051 if (ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SPRING) {
1052 if ((objects[c2].x >> 20) == (s1 >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
1053 objects[c2].frame = 0;
1054 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
1055 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
1058 } else if (ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SPRING) {
1059 if ((objects[c2].x >> 20) == ((s1 + 15) >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
1060 objects[c2].frame = 0;
1061 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
1062 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
1069 dj_play_sfx(SFX_SPRING, (unsigned short)(SFX_SPRING_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
1071 s1 = (player[c1].x >> 16);
1072 s2 = (player[c1].y >> 16);
1075 if (ban_map[s2 >> 4][s1 >> 4] == BAN_SOLID || ban_map[s2 >> 4][s1 >> 4] == BAN_ICE || ban_map[s2 >> 4][s1 >> 4] == BAN_SPRING || ban_map[s2 >> 4][(s1 + 15) >> 4] == BAN_SOLID || ban_map[s2 >> 4][(s1 + 15) >> 4] == BAN_ICE || ban_map[s2 >> 4][(s1 + 15) >> 4] == BAN_SPRING) {
1076 player[c1].y = (((s2 + 16) & 0xfff0)) << 16;
1077 player[c1].y_add = 0;
1078 player[c1].anim = 0;
1079 player[c1].frame = 0;
1080 player[c1].frame_tick = 0;
1081 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1083 s1 = (player[c1].x >> 16);
1084 s2 = (player[c1].y >> 16);
1087 if (ban_map[(s2 + 8) >> 4][(s1 + 8) >> 4] == BAN_WATER) {
1088 if (player[c1].in_water == 0) {
1089 player[c1].in_water = 1;
1090 player[c1].anim = 4;
1091 player[c1].frame = 0;
1092 player[c1].frame_tick = 0;
1093 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1094 if (player[c1].y_add >= 32768) {
1095 add_object(OBJ_SPLASH, (player[c1].x >> 16) + 8, ((player[c1].y >> 16) & 0xfff0) + 15, 0, 0, OBJ_ANIM_SPLASH, 0);
1096 if (blood_is_thicker_than_water == 0)
1097 dj_play_sfx(SFX_SPLASH, (unsigned short)(SFX_SPLASH_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
1099 dj_play_sfx(SFX_SPLASH, (unsigned short)(SFX_SPLASH_FREQ + rnd(2000) - 5000), 64, 0, 0, -1);
1102 player[c1].y_add -= 1536;
1103 if (player[c1].y_add < 0 && player[c1].anim != 5) {
1104 player[c1].anim = 5;
1105 player[c1].frame = 0;
1106 player[c1].frame_tick = 0;
1107 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1109 if (player[c1].y_add < -65536L)
1110 player[c1].y_add = -65536L;
1111 if (player[c1].y_add > 65535L)
1112 player[c1].y_add = 65535L;
1113 if (ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SOLID || ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_ICE || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SOLID || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_ICE) {
1114 player[c1].y = (((s2 + 16) & 0xfff0) - 16) << 16;
1115 player[c1].y_add = 0;
1117 } else if (ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SOLID || ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_ICE || ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SPRING || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SOLID || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_ICE || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SPRING) {
1118 player[c1].in_water = 0;
1119 player[c1].y = (((s2 + 16) & 0xfff0) - 16) << 16;
1120 player[c1].y_add = 0;
1121 if (player[c1].anim != 0 && player[c1].anim != 1) {
1122 player[c1].anim = 0;
1123 player[c1].frame = 0;
1124 player[c1].frame_tick = 0;
1125 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1128 if (player[c1].in_water == 0) {
1129 if (bunnies_in_space == 0)
1130 player[c1].y_add += 12288;
1132 player[c1].y_add += 6144;
1133 if (player[c1].y_add > 327680L)
1134 player[c1].y_add = 327680L;
1136 player[c1].y = (player[c1].y & 0xffff0000) + 0x10000;
1137 player[c1].y_add = 0;
1139 player[c1].in_water = 0;
1141 if (player[c1].y_add > 36864 && player[c1].anim != 3 && player[c1].in_water == 0) {
1142 player[c1].anim = 3;
1143 player[c1].frame = 0;
1144 player[c1].frame_tick = 0;
1145 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1150 player[c1].frame_tick++;
1151 if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
1153 if (player[c1].frame >= player_anims[player[c1].anim].num_frames) {
1154 if (player[c1].anim != 6)
1155 player[c1].frame = player_anims[player[c1].anim].restart_frame;
1157 position_player(c1);
1159 player[c1].frame_tick = 0;
1161 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1170 void position_player(int player_num)
1179 if (ban_map[s2][s1] == BAN_VOID && (ban_map[s2 + 1][s1] == BAN_SOLID || ban_map[s2 + 1][s1] == BAN_ICE))
1182 for (c1 = 0; c1 < 4; c1++) {
1183 if (c1 != player_num && player[c1].enabled == 1) {
1184 if (abs((s1 << 4) - (player[c1].x >> 16)) < 32 && abs((s2 << 4) - (player[c1].y >> 16)) < 32)
1189 player[player_num].dead_flag = 0;
1190 player[player_num].x = (long) s1 << 20;
1191 player[player_num].y = (long) s2 << 20;
1192 player[player_num].x_add = player[player_num].y_add = 0;
1193 player[player_num].direction = 0;
1194 player[player_num].jump_ready = 1;
1195 player[player_num].in_water = 0;
1196 player[player_num].anim = 0;
1197 player[player_num].frame = 0;
1198 player[player_num].frame_tick = 0;
1199 player[player_num].image = player_anims[player[player_num].anim].frame[player[player_num].frame].image;
1207 void add_object(int type, int x, int y, int x_add, int y_add, int anim, int frame)
1211 for (c1 = 0; c1 < NUM_OBJECTS; c1++) {
1212 if (objects[c1].used == 0) {
1213 objects[c1].used = 1;
1214 objects[c1].type = type;
1215 objects[c1].x = (long) x << 16;
1216 objects[c1].y = (long) y << 16;
1217 objects[c1].x_add = x_add;
1218 objects[c1].y_add = y_add;
1219 objects[c1].x_acc = 0;
1220 objects[c1].y_acc = 0;
1221 objects[c1].anim = anim;
1222 objects[c1].frame = frame;
1223 objects[c1].ticks = object_anims[anim].frame[frame].ticks;
1224 objects[c1].image = object_anims[anim].frame[frame].image;
1232 void update_objects(void)
1237 for (c1 = 0; c1 < NUM_OBJECTS; c1++) {
1238 if (objects[c1].used == 1) {
1239 switch (objects[c1].type) {
1241 objects[c1].ticks--;
1242 if (objects[c1].ticks <= 0) {
1243 objects[c1].frame++;
1244 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames) {
1245 objects[c1].frame--;
1246 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1248 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1249 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1252 if (objects[c1].used == 1)
1253 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1256 objects[c1].ticks--;
1257 if (objects[c1].ticks <= 0) {
1258 objects[c1].frame++;
1259 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1260 objects[c1].used = 0;
1262 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1263 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1266 if (objects[c1].used == 1)
1267 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1270 objects[c1].x += objects[c1].x_add;
1271 objects[c1].y += objects[c1].y_add;
1272 objects[c1].ticks--;
1273 if (objects[c1].ticks <= 0) {
1274 objects[c1].frame++;
1275 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1276 objects[c1].used = 0;
1278 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1279 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1282 if (objects[c1].used == 1)
1283 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1285 case OBJ_YEL_BUTFLY:
1286 case OBJ_PINK_BUTFLY:
1287 objects[c1].x_acc += rnd(128) - 64;
1288 if (objects[c1].x_acc < -1024)
1289 objects[c1].x_acc = -1024;
1290 if (objects[c1].x_acc > 1024)
1291 objects[c1].x_acc = 1024;
1292 objects[c1].x_add += objects[c1].x_acc;
1293 if (objects[c1].x_add < -32768)
1294 objects[c1].x_add = -32768;
1295 if (objects[c1].x_add > 32768)
1296 objects[c1].x_add = 32768;
1297 objects[c1].x += objects[c1].x_add;
1298 if ((objects[c1].x >> 16) < 16) {
1299 objects[c1].x = 16 << 16;
1300 objects[c1].x_add = -objects[c1].x_add >> 2;
1301 objects[c1].x_acc = 0;
1302 } else if ((objects[c1].x >> 16) > 350) {
1303 objects[c1].x = 350 << 16;
1304 objects[c1].x_add = -objects[c1].x_add >> 2;
1305 objects[c1].x_acc = 0;
1307 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0) {
1308 if (objects[c1].x_add < 0) {
1309 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1311 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1313 objects[c1].x_add = -objects[c1].x_add >> 2;
1314 objects[c1].x_acc = 0;
1316 objects[c1].y_acc += rnd(64) - 32;
1317 if (objects[c1].y_acc < -1024)
1318 objects[c1].y_acc = -1024;
1319 if (objects[c1].y_acc > 1024)
1320 objects[c1].y_acc = 1024;
1321 objects[c1].y_add += objects[c1].y_acc;
1322 if (objects[c1].y_add < -32768)
1323 objects[c1].y_add = -32768;
1324 if (objects[c1].y_add > 32768)
1325 objects[c1].y_add = 32768;
1326 objects[c1].y += objects[c1].y_add;
1327 if ((objects[c1].y >> 16) < 0) {
1329 objects[c1].y_add = -objects[c1].y_add >> 2;
1330 objects[c1].y_acc = 0;
1331 } else if ((objects[c1].y >> 16) > 255) {
1332 objects[c1].y = 255 << 16;
1333 objects[c1].y_add = -objects[c1].y_add >> 2;
1334 objects[c1].y_acc = 0;
1336 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0) {
1337 if (objects[c1].y_add < 0) {
1338 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1340 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1342 objects[c1].y_add = -objects[c1].y_add >> 2;
1343 objects[c1].y_acc = 0;
1345 if (objects[c1].type == OBJ_YEL_BUTFLY) {
1346 if (objects[c1].x_add < 0 && objects[c1].anim != OBJ_ANIM_YEL_BUTFLY_LEFT) {
1347 objects[c1].anim = OBJ_ANIM_YEL_BUTFLY_LEFT;
1348 objects[c1].frame = 0;
1349 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1350 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1351 } else if (objects[c1].x_add > 0 && objects[c1].anim != OBJ_ANIM_YEL_BUTFLY_RIGHT) {
1352 objects[c1].anim = OBJ_ANIM_YEL_BUTFLY_RIGHT;
1353 objects[c1].frame = 0;
1354 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1355 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1358 if (objects[c1].x_add < 0 && objects[c1].anim != OBJ_ANIM_PINK_BUTFLY_LEFT) {
1359 objects[c1].anim = OBJ_ANIM_PINK_BUTFLY_LEFT;
1360 objects[c1].frame = 0;
1361 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1362 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1363 } else if (objects[c1].x_add > 0 && objects[c1].anim != OBJ_ANIM_PINK_BUTFLY_RIGHT) {
1364 objects[c1].anim = OBJ_ANIM_PINK_BUTFLY_RIGHT;
1365 objects[c1].frame = 0;
1366 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1367 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1370 objects[c1].ticks--;
1371 if (objects[c1].ticks <= 0) {
1372 objects[c1].frame++;
1373 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1374 objects[c1].frame = object_anims[objects[c1].anim].restart_frame;
1376 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1377 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1380 if (objects[c1].used == 1)
1381 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1385 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 0);
1386 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 0) {
1387 objects[c1].y_add += 3072;
1388 if (objects[c1].y_add > 196608L)
1389 objects[c1].y_add = 196608L;
1390 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 2) {
1391 if (objects[c1].x_add < 0) {
1392 if (objects[c1].x_add < -65536L)
1393 objects[c1].x_add = -65536L;
1394 objects[c1].x_add += 1024;
1395 if (objects[c1].x_add > 0)
1396 objects[c1].x_add = 0;
1398 if (objects[c1].x_add > 65536L)
1399 objects[c1].x_add = 65536L;
1400 objects[c1].x_add -= 1024;
1401 if (objects[c1].x_add < 0)
1402 objects[c1].x_add = 0;
1404 objects[c1].y_add += 1024;
1405 if (objects[c1].y_add < -65536L)
1406 objects[c1].y_add = -65536L;
1407 if (objects[c1].y_add > 65536L)
1408 objects[c1].y_add = 65536L;
1410 objects[c1].x += objects[c1].x_add;
1411 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1 || ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3)) {
1412 if (objects[c1].x_add < 0) {
1413 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1414 objects[c1].x_add = -objects[c1].x_add >> 2;
1416 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1417 objects[c1].x_add = -objects[c1].x_add >> 2;
1420 objects[c1].y += objects[c1].y_add;
1421 if ((objects[c1].x >> 16) < -5 || (objects[c1].x >> 16) > 405 || (objects[c1].y >> 16) > 260)
1422 objects[c1].used = 0;
1423 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0)) {
1424 if (objects[c1].y_add < 0) {
1425 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 2) {
1426 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1427 objects[c1].x_add >>= 2;
1428 objects[c1].y_add = -objects[c1].y_add >> 2;
1431 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1) {
1432 if (objects[c1].y_add > 131072L) {
1433 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1434 objects[c1].x_add >>= 2;
1435 objects[c1].y_add = -objects[c1].y_add >> 2;
1437 objects[c1].used = 0;
1438 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3) {
1439 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1440 if (objects[c1].y_add > 131072L)
1441 objects[c1].y_add = -objects[c1].y_add >> 2;
1443 objects[c1].y_add = 0;
1447 if (objects[c1].x_add < 0 && objects[c1].x_add > -16384)
1448 objects[c1].x_add = -16384;
1449 if (objects[c1].x_add > 0 && objects[c1].x_add < 16384)
1450 objects[c1].x_add = 16384;
1451 if (objects[c1].used == 1) {
1452 s1 = (int)(atan2(objects[c1].y_add, objects[c1].x_add) * 4 / M_PI);
1459 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].frame + s1, &object_gobs);
1463 if (rnd(100) < 30) {
1464 if (objects[c1].frame == 76)
1465 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 1);
1466 else if (objects[c1].frame == 77)
1467 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 2);
1468 else if (objects[c1].frame == 78)
1469 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 3);
1471 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 0) {
1472 objects[c1].y_add += 3072;
1473 if (objects[c1].y_add > 196608L)
1474 objects[c1].y_add = 196608L;
1475 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 2) {
1476 if (objects[c1].x_add < 0) {
1477 if (objects[c1].x_add < -65536L)
1478 objects[c1].x_add = -65536L;
1479 objects[c1].x_add += 1024;
1480 if (objects[c1].x_add > 0)
1481 objects[c1].x_add = 0;
1483 if (objects[c1].x_add > 65536L)
1484 objects[c1].x_add = 65536L;
1485 objects[c1].x_add -= 1024;
1486 if (objects[c1].x_add < 0)
1487 objects[c1].x_add = 0;
1489 objects[c1].y_add += 1024;
1490 if (objects[c1].y_add < -65536L)
1491 objects[c1].y_add = -65536L;
1492 if (objects[c1].y_add > 65536L)
1493 objects[c1].y_add = 65536L;
1495 objects[c1].x += objects[c1].x_add;
1496 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1 || ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3)) {
1497 if (objects[c1].x_add < 0) {
1498 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1499 objects[c1].x_add = -objects[c1].x_add >> 2;
1501 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1502 objects[c1].x_add = -objects[c1].x_add >> 2;
1505 objects[c1].y += objects[c1].y_add;
1506 if ((objects[c1].x >> 16) < -5 || (objects[c1].x >> 16) > 405 || (objects[c1].y >> 16) > 260)
1507 objects[c1].used = 0;
1508 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0)) {
1509 if (objects[c1].y_add < 0) {
1510 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 2) {
1511 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1512 objects[c1].x_add >>= 2;
1513 objects[c1].y_add = -objects[c1].y_add >> 2;
1516 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1) {
1517 if (objects[c1].y_add > 131072L) {
1518 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1519 objects[c1].x_add >>= 2;
1520 objects[c1].y_add = -objects[c1].y_add >> 2;
1522 if (rnd(100) < 10) {
1524 add_leftovers(0, objects[c1].x >> 16, (objects[c1].y >> 16) + s1, objects[c1].frame, &object_gobs);
1525 add_leftovers(1, objects[c1].x >> 16, (objects[c1].y >> 16) + s1, objects[c1].frame, &object_gobs);
1527 objects[c1].used = 0;
1529 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3) {
1530 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1531 if (objects[c1].y_add > 131072L)
1532 objects[c1].y_add = -objects[c1].y_add >> 2;
1534 objects[c1].y_add = 0;
1538 if (objects[c1].x_add < 0 && objects[c1].x_add > -16384)
1539 objects[c1].x_add = -16384;
1540 if (objects[c1].x_add > 0 && objects[c1].x_add < 16384)
1541 objects[c1].x_add = 16384;
1542 if (objects[c1].used == 1)
1543 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].frame, &object_gobs);
1545 case OBJ_FLESH_TRACE:
1546 objects[c1].ticks--;
1547 if (objects[c1].ticks <= 0) {
1548 objects[c1].frame++;
1549 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1550 objects[c1].used = 0;
1552 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1553 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1556 if (objects[c1].used == 1)
1557 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1566 int add_pob(int page, int x, int y, int image, gob_t *pob_data)
1569 if (main_info.page_info[page].num_pobs >= NUM_POBS)
1572 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].x = x;
1573 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].y = y;
1574 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].image = image;
1575 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].pob_data = pob_data;
1576 main_info.page_info[page].num_pobs++;
1583 void draw_flies(int page)
1587 for (c2 = 0; c2 < NUM_FLIES; c2++) {
1588 flies[c2].back[main_info.draw_page] = get_pixel(main_info.draw_page, flies[c2].x, flies[c2].y);
1589 flies[c2].back_defined[main_info.draw_page] = 1;
1590 if (mask_pic[(flies[c2].y * JNB_WIDTH) + flies[c2].x] == 0)
1591 set_pixel(main_info.draw_page, flies[c2].x, flies[c2].y, 0);
1595 void draw_pobs(int page)
1602 for (c1 = main_info.page_info[page].num_pobs - 1; c1 >= 0; c1--) {
1603 main_info.page_info[page].pobs[c1].back_buf_ofs = back_buf_ofs;
1604 get_block(page, main_info.page_info[page].pobs[c1].x - pob_hs_x(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data), main_info.page_info[page].pobs[c1].y - pob_hs_y(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data), pob_width(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data), pob_height(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data), &main_info.pob_backbuf[page][back_buf_ofs]);
1606 back_buf_ofs += pob_width(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data) * pob_height(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data) * 4 * JNB_BYTESPP;
1608 back_buf_ofs += pob_width(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data) * pob_height(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data);
1610 put_pob(page, main_info.page_info[page].pobs[c1].x, main_info.page_info[page].pobs[c1].y, main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data, 1, mask_pic);
1616 void redraw_flies_background(int page)
1620 for (c2 = NUM_FLIES - 1; c2 >= 0; c2--) {
1621 if (flies[c2].back_defined[page] == 1)
1622 set_pixel(page, flies[c2].old_x, flies[c2].old_y, flies[c2].back[page]);
1627 void redraw_pob_backgrounds(int page)
1631 for (c1 = 0; c1 < main_info.page_info[page].num_pobs; c1++)
1632 put_block(page, main_info.page_info[page].pobs[c1].x - pob_hs_x(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data), main_info.page_info[page].pobs[c1].y - pob_hs_y(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data), pob_width(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data), pob_height(main_info.page_info[page].pobs[c1].image, main_info.page_info[page].pobs[c1].pob_data), &main_info.pob_backbuf[page][main_info.page_info[page].pobs[c1].back_buf_ofs]);
1637 int add_leftovers(int page, int x, int y, int image, gob_t *pob_data)
1640 if (leftovers.page[page].num_pobs >= NUM_LEFTOVERS)
1643 leftovers.page[page].pobs[leftovers.page[page].num_pobs].x = x;
1644 leftovers.page[page].pobs[leftovers.page[page].num_pobs].y = y;
1645 leftovers.page[page].pobs[leftovers.page[page].num_pobs].image = image;
1646 leftovers.page[page].pobs[leftovers.page[page].num_pobs].pob_data = pob_data;
1647 leftovers.page[page].num_pobs++;
1654 void draw_leftovers(int page)
1658 for (c1 = leftovers.page[page].num_pobs - 1; c1 >= 0; c1--)
1659 put_pob(page, leftovers.page[page].pobs[c1].x, leftovers.page[page].pobs[c1].y, leftovers.page[page].pobs[c1].image, leftovers.page[page].pobs[c1].pob_data, 1, mask_pic);
1661 leftovers.page[page].num_pobs = 0;
1666 int init_level(int level, char *pal)
1672 if ((handle = dat_open("level.pcx", datfile_name, "rb")) == 0) {
1673 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
1676 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
1677 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
1681 if ((handle = dat_open("mask.pcx", datfile_name, "rb")) == 0) {
1682 strcpy(main_info.error_str, "Error loading 'mask.pcx', aborting...\n");
1685 if (read_pcx(handle, mask_pic, 102400L, 0) != 0) {
1686 strcpy(main_info.error_str, "Error loading 'mask.pcx', aborting...\n");
1690 register_mask(mask_pic);
1692 for (c1 = 0; c1 < 4; c1++) {
1693 if (player[c1].enabled == 1) {
1694 player[c1].bumps = 0;
1695 player[c1].bumped[0] = 0;
1696 player[c1].bumped[1] = 0;
1697 player[c1].bumped[2] = 0;
1698 player[c1].bumped[3] = 0;
1699 position_player(c1);
1703 for (c1 = 0; c1 < NUM_OBJECTS; c1++)
1704 objects[c1].used = 0;
1706 for (c1 = 0; c1 < 16; c1++) {
1707 for (c2 = 0; c2 < 22; c2++) {
1708 if (ban_map[c1][c2] == BAN_SPRING)
1709 add_object(OBJ_SPRING, c2 << 4, c1 << 4, 0, 0, OBJ_ANIM_SPRING, 5);
1716 if (ban_map[s2][s1] == BAN_VOID) {
1717 add_object(OBJ_YEL_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1724 if (ban_map[s2][s1] == BAN_VOID) {
1725 add_object(OBJ_YEL_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1732 if (ban_map[s2][s1] == BAN_VOID) {
1733 add_object(OBJ_PINK_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1740 if (ban_map[s2][s1] == BAN_VOID) {
1741 add_object(OBJ_PINK_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1751 void deinit_level(void)
1758 int init_program(int argc, char *argv[], char *pal)
1760 FILE *handle = (FILE *) NULL;
1765 int player_anim_data[] = {
1766 1, 0, 0, 0x7fff, 0, 0, 0, 0, 0, 0,
1767 4, 0, 0, 4, 1, 4, 2, 4, 3, 4,
1768 1, 0, 4, 0x7fff, 0, 0, 0, 0, 0, 0,
1769 4, 2, 5, 8, 6, 10, 7, 3, 6, 3,
1770 1, 0, 6, 0x7fff, 0, 0, 0, 0, 0, 0,
1771 2, 1, 5, 8, 4, 0x7fff, 0, 0, 0, 0,
1772 1, 0, 8, 5, 0, 0, 0, 0, 0, 0
1776 if (__djgpp_nearptr_enable() == 0)
1782 if (hook_keyb_handler() != 0)
1785 memset(&main_info, 0, sizeof(main_info));
1787 strcpy(datfile_name, "data/jumpbump.dat");
1789 force2 = force3 = 0;
1792 for (c1 = 1; c1 < argc; c1++) {
1793 if (stricmp(argv[c1], "-nosound") == 0)
1794 main_info.no_sound = 1;
1795 else if (stricmp(argv[c1], "-nogore") == 0)
1796 main_info.no_gore = 1;
1797 else if (stricmp(argv[c1], "-nojoy") == 0)
1798 main_info.joy_enabled = 0;
1799 else if (stricmp(argv[c1], "-fireworks") == 0)
1800 main_info.fireworks = 1;
1802 else if (stricmp(argv[c1], "-fullscreen") == 0)
1805 else if (stricmp(argv[c1], "-dat") == 0) {
1806 if (c1 < (argc - 1)) {
1807 if ((handle = fopen(argv[c1 + 1], "rb")) != NULL) {
1809 strcpy(datfile_name, argv[c1 + 1]);
1812 } else if (stricmp(argv[c1], "-mouse") == 0) {
1813 if (c1 < (argc - 1)) {
1814 if (stricmp(argv[c1 + 1], "2") == 0)
1816 if (stricmp(argv[c1 + 1], "3") == 0)
1823 for (c1 = 0; c1 < 7; c1++) {
1824 player_anims[c1].num_frames = player_anim_data[c1 * 10];
1825 player_anims[c1].restart_frame = player_anim_data[c1 * 10 + 1];
1826 for (c2 = 0; c2 < 4; c2++) {
1827 player_anims[c1].frame[c2].image = player_anim_data[c1 * 10 + c2 * 2 + 2];
1828 player_anims[c1].frame[c2].ticks = player_anim_data[c1 * 10 + c2 * 2 + 3];
1832 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
1833 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
1836 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
1837 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
1842 if ((handle = dat_open("rabbit.gob", datfile_name, "rb")) == 0) {
1843 strcpy(main_info.error_str, "Error loading 'rabbit.gob', aborting...\n");
1846 if (register_gob(handle, &rabbit_gobs, dat_filelen("rabbit.gob", datfile_name))) {
1853 if ((handle = dat_open("objects.gob", datfile_name, "rb")) == 0) {
1854 strcpy(main_info.error_str, "Error loading 'objects.gob', aborting...\n");
1857 if (register_gob(handle, &object_gobs, dat_filelen("objects.gob", datfile_name))) {
1864 if ((handle = dat_open("font.gob", datfile_name, "rb")) == 0) {
1865 strcpy(main_info.error_str, "Error loading 'font.gob', aborting...\n");
1868 if (register_gob(handle, &font_gobs, dat_filelen("font.gob", datfile_name))) {
1875 if ((handle = dat_open("numbers.gob", datfile_name, "rb")) == 0) {
1876 strcpy(main_info.error_str, "Error loading 'numbers.gob', aborting...\n");
1879 if (register_gob(handle, &number_gobs, dat_filelen("numbers.gob", datfile_name))) {
1886 if (read_level() != 0) {
1887 strcpy(main_info.error_str, "Error loading 'levelmap.txt', aborting...\n");
1894 if (main_info.no_sound == 0) {
1896 dj_set_mixing_freq(20000);
1900 dj_set_num_sfx_channels(5);
1901 dj_set_sfx_volume(64);
1905 if ((handle = dat_open("jump.mod", datfile_name, "rb")) == 0) {
1906 strcpy(main_info.error_str, "Error loading 'jump.mod', aborting...\n");
1909 if (dj_load_mod(handle, 0, MOD_MENU) != 0) {
1910 strcpy(main_info.error_str, "Error loading 'jump.mod', aborting...\n");
1915 if ((handle = dat_open("bump.mod", datfile_name, "rb")) == 0) {
1916 strcpy(main_info.error_str, "Error loading 'bump.mod', aborting...\n");
1919 if (dj_load_mod(handle, 0, MOD_GAME) != 0) {
1920 strcpy(main_info.error_str, "Error loading 'bump.mod', aborting...\n");
1925 if ((handle = dat_open("scores.mod", datfile_name, "rb")) == 0) {
1926 strcpy(main_info.error_str, "Error loading 'scores.mod', aborting...\n");
1929 if (dj_load_mod(handle, 0, MOD_SCORES) != 0) {
1930 strcpy(main_info.error_str, "Error loading 'scores.mod', aborting...\n");
1935 if ((handle = dat_open("jump.smp", datfile_name, "rb")) == 0) {
1936 strcpy(main_info.error_str, "Error loading 'jump.smp', aborting...\n");
1939 if (dj_load_sfx(handle, 0, dat_filelen("jump.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_JUMP) != 0) {
1940 strcpy(main_info.error_str, "Error loading 'jump.smp', aborting...\n");
1945 if ((handle = dat_open("death.smp", datfile_name, "rb")) == 0) {
1946 strcpy(main_info.error_str, "Error loading 'death.smp', aborting...\n");
1949 if (dj_load_sfx(handle, 0, dat_filelen("death.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_DEATH) != 0) {
1950 strcpy(main_info.error_str, "Error loading 'death.smp', aborting...\n");
1955 if ((handle = dat_open("spring.smp", datfile_name, "rb")) == 0) {
1956 strcpy(main_info.error_str, "Error loading 'spring.smp', aborting...\n");
1959 if (dj_load_sfx(handle, 0, dat_filelen("spring.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_SPRING) != 0) {
1960 strcpy(main_info.error_str, "Error loading 'spring.smp', aborting...\n");
1965 if ((handle = dat_open("splash.smp", datfile_name, "rb")) == 0) {
1966 strcpy(main_info.error_str, "Error loading 'splash.smp', aborting...\n");
1969 if (dj_load_sfx(handle, 0, dat_filelen("splash.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_SPLASH) != 0) {
1970 strcpy(main_info.error_str, "Error loading 'splash.smp', aborting...\n");
1975 if ((handle = dat_open("fly.smp", datfile_name, "rb")) == 0) {
1976 strcpy(main_info.error_str, "Error loading 'fly.smp', aborting...\n");
1979 if (dj_load_sfx(handle, 0, dat_filelen("fly.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_FLY) != 0) {
1980 strcpy(main_info.error_str, "Error loading 'fly.smp', aborting...\n");
1985 dj_get_sfx_settings(SFX_FLY, &fly);
1987 fly.default_freq = SFX_FLY_FREQ;
1990 fly.loop_length = fly.length;
1991 dj_set_sfx_settings(SFX_FLY, &fly);
1994 if ((background_pic = malloc(102400)) == NULL)
1996 if ((mask_pic = malloc(102400)) == NULL)
1998 memset(mask_pic, 0, 102400);
1999 register_mask(mask_pic);
2001 setpalette(0, 256, pal);
2005 if (main_info.joy_enabled == 1 && main_info.fireworks == 0) {
2007 put_text(0, 200, 40, "JOYSTICK CALIBRATION", 2);
2008 put_text(0, 200, 100, "Move the joystick to the", 2);
2009 put_text(0, 200, 115, "UPPER LEFT", 2);
2010 put_text(0, 200, 130, "and press button A", 2);
2011 put_text(0, 200, 200, "Or press ESC to use", 2);
2012 put_text(0, 200, 215, "previous settings", 2);
2013 if (calib_joy(0) != 0)
2016 recalculate_gob(&font_gobs, pal);
2017 register_background(NULL, NULL);
2019 main_info.view_page = 1;
2024 put_text(1, 200, 40, "JOYSTICK CALIBRATION", 2);
2025 put_text(1, 200, 100, "Move the joystick to the", 2);
2026 put_text(1, 200, 115, "LOWER RIGHT", 2);
2027 put_text(1, 200, 130, "and press button A", 2);
2028 put_text(1, 200, 200, "Or press ESC to use", 2);
2029 put_text(1, 200, 215, "previous settings", 2);
2030 if (calib_joy(1) != 0)
2033 recalculate_gob(&font_gobs, pal);
2034 register_background(NULL, NULL);
2039 put_text(0, 200, 40, "JOYSTICK CALIBRATION", 2);
2040 put_text(0, 200, 100, "Move the joystick to the", 2);
2041 put_text(0, 200, 115, "CENTER", 2);
2042 put_text(0, 200, 130, "and press button A", 2);
2043 put_text(0, 200, 200, "Or press ESC to use", 2);
2044 put_text(0, 200, 215, "previous settings", 2);
2045 if (calib_joy(2) != 0)
2048 if (joy.calib_data.x1 == joy.calib_data.x2)
2049 joy.calib_data.x1 -= 10;
2050 if (joy.calib_data.x3 == joy.calib_data.x2)
2051 joy.calib_data.x3 += 10;
2052 if (joy.calib_data.y1 == joy.calib_data.y2)
2053 joy.calib_data.y1 -= 10;
2054 if (joy.calib_data.y3 == joy.calib_data.y2)
2055 joy.calib_data.y3 += 10;
2060 if (load_flag == 1) {
2061 if ((handle = dat_open("calib.dat", datfile_name, "rb")) == 0) {
2062 strcpy(main_info.error_str, "Error loading 'calib.dat', aborting...\n");
2065 joy.calib_data.x1 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2066 joy.calib_data.x2 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2067 joy.calib_data.x3 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2068 joy.calib_data.y1 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2069 joy.calib_data.y2 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2070 joy.calib_data.y3 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2080 void deinit_program(void)
2087 dj_free_mod(MOD_MENU);
2088 dj_free_mod(MOD_GAME);
2089 dj_free_sfx(SFX_DEATH);
2090 dj_free_sfx(SFX_SPRING);
2091 dj_free_sfx(SFX_SPLASH);
2094 if (background_pic != 0)
2095 free(background_pic);
2099 remove_keyb_handler();
2103 __dpmi_int(0x10, ®s);
2106 if (main_info.error_str[0] != 0) {
2107 printf(main_info.error_str);
2115 unsigned short rnd(unsigned short max)
2117 return (rand() % max);
2121 int read_level(void)
2127 if ((handle = dat_open("levelmap.txt", datfile_name, "rb")) == 0) {
2128 strcpy(main_info.error_str, "Error loading 'levelmap.txt', aborting...\n");
2132 for (c1 = 0; c1 < 16; c1++) {
2133 for (c2 = 0; c2 < 22; c2++) {
2135 chr = fgetc(handle);
2140 if (chr >= '0' && chr <= '4')
2143 ban_map[c1][c2] = chr - '0';
2147 for (c2 = 0; c2 < 22; c2++)
2148 ban_map[16][c2] = BAN_SOLID;
2156 FILE *dat_open(char *file_name, char *dat_name, char *mode)
2164 handle = fopen(dat_name, mode);
2168 memset(name, 0, sizeof(name));
2170 num = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2172 for (c1 = 0; c1 < num; c1++) {
2173 if (!fread(name, 1, 12, handle)) {
2177 if (strnicmp(name, file_name, strlen(file_name)) == 0) {
2178 ofs = fgetc(handle);
2179 ofs += (fgetc(handle) << 8);
2180 ofs += (fgetc(handle) << 16);
2181 ofs += (fgetc(handle) << 24);
2182 fseek(handle, ofs, SEEK_SET);
2185 fseek(handle, 8, SEEK_CUR);
2194 int dat_filelen(char *file_name, char *dat_name)
2202 handle = fopen(dat_name, "rb");
2206 memset(name, 0, sizeof(name));
2208 num = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2210 for (c1 = 0; c1 < num; c1++) {
2211 if (!fread(name, 1, 12, handle)) {
2215 if (strnicmp(name, file_name, strlen(file_name)) == 0) {
2216 fseek(handle, 4, SEEK_CUR);
2217 len = fgetc(handle);
2218 len += (fgetc(handle) << 8);
2219 len += (fgetc(handle) << 16);
2220 len += (fgetc(handle) << 24);
2225 fseek(handle, 8, SEEK_CUR);
2234 int filelength(int handle)
2238 if (fstat(handle, &buf) == -1) {
2239 perror("filelength");
2248 void write_calib_data(void)
2256 if ((handle = fopen(datfile_name, "rb")) == NULL)
2258 len = filelength(fileno(handle));
2259 if ((mem = malloc(len)) == NULL)
2261 fread(mem, 1, len, handle);
2265 num = *(int *) (&mem[0]);
2266 for (c1 = 0; c1 < num; c1++) {
2267 if (strnicmp(&mem[ofs], "calib.dat", strlen("calib.dat")) == 0) {
2268 ofs = *(int *) (&mem[ofs + 12]);
2274 mem[ofs] = joy.calib_data.x1 & 0xff;
2275 mem[ofs + 1] = (joy.calib_data.x1 >> 8) & 0xff;
2276 mem[ofs + 2] = (joy.calib_data.x1 >> 16) & 0xff;
2277 mem[ofs + 3] = (joy.calib_data.x1 >> 24) & 0xff;
2278 mem[ofs + 4] = joy.calib_data.x2 & 0xff;
2279 mem[ofs + 5] = (joy.calib_data.x2 >> 8) & 0xff;
2280 mem[ofs + 6] = (joy.calib_data.x2 >> 16) & 0xff;
2281 mem[ofs + 7] = (joy.calib_data.x2 >> 24) & 0xff;
2282 mem[ofs + 8] = joy.calib_data.x3 & 0xff;
2283 mem[ofs + 9] = (joy.calib_data.x3 >> 8) & 0xff;
2284 mem[ofs + 10] = (joy.calib_data.x3 >> 16) & 0xff;
2285 mem[ofs + 11] = (joy.calib_data.x3 >> 24) & 0xff;
2286 mem[ofs + 12] = joy.calib_data.y1 & 0xff;
2287 mem[ofs + 13] = (joy.calib_data.y1 >> 8) & 0xff;
2288 mem[ofs + 14] = (joy.calib_data.y1 >> 16) & 0xff;
2289 mem[ofs + 15] = (joy.calib_data.y1 >> 24) & 0xff;
2290 mem[ofs + 16] = joy.calib_data.y2 & 0xff;
2291 mem[ofs + 17] = (joy.calib_data.y2 >> 8) & 0xff;
2292 mem[ofs + 18] = (joy.calib_data.y2 >> 16) & 0xff;
2293 mem[ofs + 19] = (joy.calib_data.y2 >> 24) & 0xff;
2294 mem[ofs + 20] = joy.calib_data.y3 & 0xff;
2295 mem[ofs + 21] = (joy.calib_data.y3 >> 8) & 0xff;
2296 mem[ofs + 22] = (joy.calib_data.y3 >> 16) & 0xff;
2297 mem[ofs + 23] = (joy.calib_data.y3 >> 24) & 0xff;
2299 if ((handle = fopen(datfile_name, "wb")) == NULL)
2301 fwrite(mem, 1, len, handle);