4 #define M_PI 3.14159265358979323846
10 unsigned int ban_map[17][22] = {
11 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
12 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0},
13 {1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
14 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1},
15 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
16 {1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
17 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1},
18 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
19 {1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
20 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 1},
21 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1},
22 {1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1},
23 {1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
24 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1},
25 {2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 1, 3, 3, 3, 1, 1, 1},
26 {2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
27 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
156 char back[2], back_defined[2];
166 } pobs[NUM_LEFTOVERS];
170 char pogostick, bunnies_in_space, jetpack, lord_of_the_flies, blood_is_thicker_than_water;
172 int main(int argc, char *argv[])
175 int c1, c2 = 0, c3, c4;
178 int closest_player = 0, dist, cur_dist;
179 char end_loop_flag, fade_flag;
180 char mod_vol, sfx_vol, mod_fade_direction;
181 char *ptr1 = (char *) NULL;
186 if (init_program(argc, argv, pal) != 0)
189 if (main_info.fireworks == 1) {
199 if (key_pressed(1) == 1) {
202 if (init_level(0, pal) != 0) {
207 memset(cur_pal, 0, 768);
208 setpalette(0, 256, cur_pal);
211 register_background(background_pic);
216 for (c1 = 0; c1 < NUM_FLIES; c1++) {
218 flies[c1].x = s1 + rnd(101) - 50;
219 flies[c1].y = s2 + rnd(101) - 50;
220 if (ban_map[flies[c1].y >> 4][flies[c1].x >> 4] == BAN_VOID)
223 flies[c1].back_defined[0] = 0;
224 flies[c1].back_defined[1] = 0;
227 mod_vol = sfx_vol = 10;
228 mod_fade_direction = 1;
229 dj_ready_mod(MOD_GAME);
230 dj_set_mod_volume(mod_vol);
231 dj_set_sfx_volume(mod_vol);
233 dj_play_sfx(SFX_FLY, SFX_FLY_FREQ, 0, 0, 0, 4);
236 lord_of_the_flies = bunnies_in_space = jetpack = pogostick = blood_is_thicker_than_water = 0;
238 main_info.page_info[0].num_pobs = 0;
239 main_info.page_info[1].num_pobs = 0;
240 main_info.view_page = 0;
241 main_info.draw_page = 1;
245 if (key_pressed(1) == 1) {
248 mod_fade_direction = 0;
251 if (strncmp(last_keys, "kcitsogop", strlen("kcitsogop")) == 0) {
255 if (strncmp(last_keys, "ecapsniseinnub", strlen("ecapsniseinnub")) == 0) {
256 bunnies_in_space ^= 1;
259 if (strncmp(last_keys, "kcaptej", strlen("kcaptej")) == 0) {
263 if (strncmp(last_keys, "seilfehtfodrol", strlen("seilfehtfodrol")) == 0) {
264 lord_of_the_flies ^= 1;
267 if (strncmp(last_keys, "retawnahtrekcihtsidoolb", strlen("retawnahtrekcihtsidoolb")) == 0) {
268 blood_is_thicker_than_water ^= 1;
269 if (blood_is_thicker_than_water == 1) {
327 for (c3 = 0; c3 < 6; c3++) {
331 } else if (c3 == 1) {
334 } else if (c3 == 2) {
337 } else if (c3 == 3) {
340 } else if (c3 == 4) {
343 } else if (c3 == 5) {
347 if (player[c1].enabled == 1 && player[c2].enabled == 1) {
348 if (labs(player[c1].x - player[c2].x) < (12L << 16) && labs(player[c1].y - player[c2].y) < (12L << 16)) {
349 if ((labs(player[c1].y - player[c2].y) >> 16) > 5) {
350 if (player[c1].y < player[c2].y) {
351 if (player[c1].y_add >= 0) {
352 player[c1].y_add = -player[c1].y_add;
353 if (player[c1].y_add > -262144L)
354 player[c1].y_add = -262144L;
355 player[c1].jump_abort = 1;
356 player[c2].dead_flag = 1;
357 if (player[c2].anim != 6) {
359 player[c2].frame = 0;
360 player[c2].frame_tick = 0;
361 player[c2].image = player_anims[player[c2].anim].frame[player[c2].frame].image + player[c2].direction * 9;
362 if (main_info.no_gore == 0) {
363 for (c4 = 0; c4 < 6; c4++)
364 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);
365 for (c4 = 0; c4 < 6; c4++)
366 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);
367 for (c4 = 0; c4 < 6; c4++)
368 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);
369 for (c4 = 0; c4 < 8; c4++)
370 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);
371 for (c4 = 0; c4 < 10; c4++)
372 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);
374 dj_play_sfx(SFX_DEATH, (unsigned short)(SFX_DEATH_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
376 player[c1].bumped[c2]++;
377 s1 = player[c1].bumps % 100;
378 add_leftovers(0, 360, 34 + c1 * 64, s1 / 10, number_gobs);
379 add_leftovers(1, 360, 34 + c1 * 64, s1 / 10, number_gobs);
380 add_leftovers(0, 376, 34 + c1 * 64, s1 - (s1 / 10) * 10, number_gobs);
381 add_leftovers(1, 376, 34 + c1 * 64, s1 - (s1 / 10) * 10, number_gobs);
384 if (player[c2].y_add < 0)
385 player[c2].y_add = 0;
388 if (player[c2].y_add >= 0) {
389 player[c2].y_add = -player[c2].y_add;
390 if (player[c2].y_add > -262144L)
391 player[c2].y_add = -262144L;
392 player[c2].jump_abort = 1;
393 player[c1].dead_flag = 1;
394 if (player[c1].anim != 6) {
396 player[c1].frame = 0;
397 player[c1].frame_tick = 0;
398 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
399 if (main_info.no_gore == 0) {
400 for (c4 = 0; c4 < 6; c4++)
401 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);
402 for (c4 = 0; c4 < 6; c4++)
403 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);
404 for (c4 = 0; c4 < 7; c4++)
405 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);
406 for (c4 = 0; c4 < 8; c4++)
407 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);
408 for (c4 = 0; c4 < 10; c4++)
409 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);
411 dj_play_sfx(SFX_DEATH, (unsigned short)(SFX_DEATH_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
413 player[c2].bumped[c1]++;
414 s1 = player[c2].bumps % 100;
415 add_leftovers(0, 360, 34 + c2 * 64, s1 / 10, number_gobs);
416 add_leftovers(1, 360, 34 + c2 * 64, s1 / 10, number_gobs);
417 add_leftovers(0, 376, 34 + c2 * 64, s1 - (s1 / 10) * 10, number_gobs);
418 add_leftovers(1, 376, 34 + c2 * 64, s1 - (s1 / 10) * 10, number_gobs);
421 if (player[c1].y_add < 0)
422 player[c1].y_add = 0;
426 if (player[c1].x < player[c2].x) {
427 if (player[c1].x_add > 0)
428 player[c1].x = player[c2].x - (12L << 16);
429 else if (player[c2].x_add < 0)
430 player[c2].x = player[c1].x + (12L << 16);
432 player[c1].x -= player[c1].x_add;
433 player[c2].x -= player[c2].x_add;
435 l1 = player[c2].x_add;
436 player[c2].x_add = player[c1].x_add;
437 player[c1].x_add = l1;
438 if (player[c1].x_add > 0)
439 player[c1].x_add = -player[c1].x_add;
440 if (player[c2].x_add < 0)
441 player[c2].x_add = -player[c2].x_add;
443 if (player[c1].x_add > 0)
444 player[c2].x = player[c1].x - (12L << 16);
445 else if (player[c2].x_add < 0)
446 player[c1].x = player[c2].x + (12L << 16);
448 player[c1].x -= player[c1].x_add;
449 player[c2].x -= player[c2].x_add;
451 l1 = player[c2].x_add;
452 player[c2].x_add = player[c1].x_add;
453 player[c1].x_add = l1;
454 if (player[c1].x_add < 0)
455 player[c1].x_add = -player[c1].x_add;
456 if (player[c2].x_add > 0)
457 player[c2].x_add = -player[c2].x_add;
466 main_info.page_info[main_info.draw_page].num_pobs = 0;
467 for (c1 = 0; c1 < 4; c1++) {
468 if (player[c1].enabled == 1)
469 main_info.page_info[main_info.draw_page].num_pobs++;
476 /* get center of fly swarm */
478 for (c1 = 0; c1 < NUM_FLIES; c1++) {
485 /* get closest player to fly swarm */
487 for (c1 = 0; c1 < 4; c1++) {
488 if (player[c1].enabled == 1) {
489 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)));
490 if (cur_dist < dist) {
496 /* update fly swarm sound */
500 dj_set_sfx_channel_volume(4, (char)(s3));
502 for (c1 = 0; c1 < NUM_FLIES; c1++) {
503 /* get closest player to fly */
505 for (c2 = 0; c2 < 4; c2++) {
506 if (player[c2].enabled == 1) {
507 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)));
508 if (cur_dist < dist) {
514 flies[c1].old_x = flies[c1].x;
515 flies[c1].old_y = flies[c1].y;
517 if ((s1 - flies[c1].x) > 30)
519 else if ((s1 - flies[c1].x) < -30)
522 if (((player[closest_player].x >> 16) + 8) > flies[c1].x) {
523 if (lord_of_the_flies == 0)
528 if (lord_of_the_flies == 0)
534 s4 = rnd(3) - 1 + s3;
535 if ((flies[c1].x + s4) < 16)
537 if ((flies[c1].x + s4) > 351)
539 if (ban_map[flies[c1].y >> 4][(flies[c1].x + s4) >> 4] != BAN_VOID)
543 if ((s2 - flies[c1].y) > 30)
545 else if ((s2 - flies[c1].y) < -30)
548 if (((player[closest_player].y >> 16) + 8) > flies[c1].y) {
549 if (lord_of_the_flies == 0)
554 if (lord_of_the_flies == 0)
560 s4 = rnd(3) - 1 + s3;
561 if ((flies[c1].y + s4) < 0)
563 if ((flies[c1].y + s4) > 239)
565 if (ban_map[(flies[c1].y + s4) >> 4][flies[c1].x >> 4] != BAN_VOID)
573 for (c1 = 0; c1 < 4; c1++) {
574 if (player[c1].enabled == 1) {
575 main_info.page_info[main_info.draw_page].pobs[s1].x = player[c1].x >> 16;
576 main_info.page_info[main_info.draw_page].pobs[s1].y = player[c1].y >> 16;
577 main_info.page_info[main_info.draw_page].pobs[s1].image = player[c1].image + c1 * 18;
578 main_info.page_info[main_info.draw_page].pobs[s1].pob_data = rabbit_gobs;
585 draw_pobs(main_info.draw_page);
589 draw_flies(main_info.draw_page);
593 if (mod_fade_direction == 1) {
596 dj_set_mod_volume(mod_vol);
601 dj_set_mod_volume(mod_vol);
605 if (mod_fade_direction == 1) {
608 dj_set_sfx_volume(sfx_vol);
613 dj_set_sfx_volume(sfx_vol);
618 for (c1 = 0; c1 < 768; c1++) {
619 if (cur_pal[c1] < pal[c1]) {
622 } else if (cur_pal[c1] > pal[c1]) {
627 if (fade_flag == 0 && end_loop_flag == 1)
630 main_info.draw_page ^= 1;
631 main_info.view_page ^= 1;
633 flippage(main_info.view_page);
638 setpalette(0, 256, cur_pal);
642 redraw_flies_background(main_info.draw_page);
644 redraw_pob_backgrounds(main_info.draw_page);
646 draw_leftovers(main_info.draw_page);
654 main_info.view_page = 0;
655 main_info.draw_page = 1;
657 dj_stop_sfx_channel(4);
661 memset(mask_pic, 0, 102400L);
663 register_background(NULL);
667 put_text(main_info.view_page, 100, 50, "DOTT", 2);
668 put_text(main_info.view_page, 160, 50, "JIFFY", 2);
669 put_text(main_info.view_page, 220, 50, "FIZZ", 2);
670 put_text(main_info.view_page, 280, 50, "MIJJI", 2);
671 put_text(main_info.view_page, 40, 80, "DOTT", 2);
672 put_text(main_info.view_page, 40, 110, "JIFFY", 2);
673 put_text(main_info.view_page, 40, 140, "FIZZ", 2);
674 put_text(main_info.view_page, 40, 170, "MIJJI", 2);
676 for (c1 = 0; c1 < 4; c1++) {
677 for (c2 = 0; c2 < 4; c2++) {
679 sprintf(str1, "%d", player[c1].bumped[c2]);
680 put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, str1, 2);
682 put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, "-", 2);
684 sprintf(str1, "%d", player[c1].bumps);
685 put_text(main_info.view_page, 350, 80 + c1 * 30, str1, 2);
688 put_text(main_info.view_page, 200, 230, "Press ESC to continue", 2);
692 flippage(main_info.view_page);
694 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
695 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
698 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
699 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
704 memset(cur_pal, 0, 768);
706 setpalette(0, 256, cur_pal);
709 dj_ready_mod(MOD_SCORES);
710 dj_set_mod_volume(mod_vol);
714 while (key_pressed(1) == 0) {
717 dj_set_mod_volume(mod_vol);
718 for (c1 = 0; c1 < 768; c1++) {
719 if (cur_pal[c1] < pal[c1])
725 setpalette(0, 256, cur_pal);
726 flippage(main_info.view_page);
728 while (key_pressed(1) == 1) {
735 while (mod_vol > 0) {
737 dj_set_mod_volume(mod_vol);
738 for (c1 = 0; c1 < 768; c1++) {
739 if (cur_pal[c1] > pal[c1])
744 setpalette(0, 256, cur_pal);
745 flippage(main_info.view_page);
748 fillpalette(0, 0, 0);
761 void steer_players(void)
766 update_player_actions();
768 for (c1 = 0; c1 < 4; c1++) {
770 if (player[c1].enabled == 1) {
772 if (player[c1].dead_flag == 0) {
774 if (player[c1].action_left && player[c1].action_right) {
775 if (player[c1].direction == 0) {
776 if (player[c1].action_right) {
777 s1 = (player[c1].x >> 16);
778 s2 = (player[c1].y >> 16);
779 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
780 if (player[c1].x_add < 0)
781 player[c1].x_add += 1024;
783 player[c1].x_add += 768;
784 } 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)) {
785 if (player[c1].x_add > 0)
786 player[c1].x_add += 1024;
788 player[c1].x_add += 768;
790 if (player[c1].x_add < 0) {
791 player[c1].x_add += 16384;
792 if (player[c1].x_add < 98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
793 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);
795 player[c1].x_add += 12288;
797 if (player[c1].x_add > 98304L)
798 player[c1].x_add = 98304L;
799 player[c1].direction = 0;
800 if (player[c1].anim == 0) {
802 player[c1].frame = 0;
803 player[c1].frame_tick = 0;
804 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
808 if (player[c1].action_left) {
809 s1 = (player[c1].x >> 16);
810 s2 = (player[c1].y >> 16);
811 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
812 if (player[c1].x_add > 0)
813 player[c1].x_add -= 1024;
815 player[c1].x_add -= 768;
816 } 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)) {
817 if (player[c1].x_add > 0)
818 player[c1].x_add -= 1024;
820 player[c1].x_add -= 768;
822 if (player[c1].x_add > 0) {
823 player[c1].x_add -= 16384;
824 if (player[c1].x_add > -98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
825 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);
827 player[c1].x_add -= 12288;
829 if (player[c1].x_add < -98304L)
830 player[c1].x_add = -98304L;
831 player[c1].direction = 1;
832 if (player[c1].anim == 0) {
834 player[c1].frame = 0;
835 player[c1].frame_tick = 0;
836 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
840 } else if (player[c1].action_left) {
841 s1 = (player[c1].x >> 16);
842 s2 = (player[c1].y >> 16);
843 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
844 if (player[c1].x_add > 0)
845 player[c1].x_add -= 1024;
847 player[c1].x_add -= 768;
848 } 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)) {
849 if (player[c1].x_add > 0)
850 player[c1].x_add -= 1024;
852 player[c1].x_add -= 768;
854 if (player[c1].x_add > 0) {
855 player[c1].x_add -= 16384;
856 if (player[c1].x_add > -98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
857 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);
859 player[c1].x_add -= 12288;
861 if (player[c1].x_add < -98304L)
862 player[c1].x_add = -98304L;
863 player[c1].direction = 1;
864 if (player[c1].anim == 0) {
866 player[c1].frame = 0;
867 player[c1].frame_tick = 0;
868 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
870 } else if (player[c1].action_right) {
871 s1 = (player[c1].x >> 16);
872 s2 = (player[c1].y >> 16);
873 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
874 if (player[c1].x_add < 0)
875 player[c1].x_add += 1024;
877 player[c1].x_add += 768;
878 } 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)) {
879 if (player[c1].x_add > 0)
880 player[c1].x_add += 1024;
882 player[c1].x_add += 768;
884 if (player[c1].x_add < 0) {
885 player[c1].x_add += 16384;
886 if (player[c1].x_add < 98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
887 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);
889 player[c1].x_add += 12288;
891 if (player[c1].x_add > 98304L)
892 player[c1].x_add = 98304L;
893 player[c1].direction = 0;
894 if (player[c1].anim == 0) {
896 player[c1].frame = 0;
897 player[c1].frame_tick = 0;
898 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
900 } else if ((!player[c1].action_left) && (!player[c1].action_right)) {
901 s1 = (player[c1].x >> 16);
902 s2 = (player[c1].y >> 16);
903 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)))) {
904 if (player[c1].x_add < 0) {
905 player[c1].x_add += 16384;
906 if (player[c1].x_add > 0)
907 player[c1].x_add = 0;
909 player[c1].x_add -= 16384;
910 if (player[c1].x_add < 0)
911 player[c1].x_add = 0;
913 if (player[c1].x_add != 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
914 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);
916 if (player[c1].anim == 1) {
918 player[c1].frame = 0;
919 player[c1].frame_tick = 0;
920 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
924 if (pogostick == 1 || (player[c1].jump_ready == 1 && player[c1].action_up)) {
925 s1 = (player[c1].x >> 16);
926 s2 = (player[c1].y >> 16);
929 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) {
930 player[c1].y_add = -280000L;
932 player[c1].frame = 0;
933 player[c1].frame_tick = 0;
934 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
935 player[c1].jump_ready = 0;
936 player[c1].jump_abort = 1;
938 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
940 dj_play_sfx(SFX_SPRING, (unsigned short)(SFX_SPRING_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
942 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)) {
943 player[c1].y_add = -196608L;
944 player[c1].in_water = 0;
946 player[c1].frame = 0;
947 player[c1].frame_tick = 0;
948 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
949 player[c1].jump_ready = 0;
950 player[c1].jump_abort = 1;
952 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
954 dj_play_sfx(SFX_SPRING, (unsigned short)(SFX_SPRING_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
957 if (pogostick == 0 && (!player[c1].action_up)) {
958 player[c1].jump_ready = 1;
959 if (player[c1].in_water == 0 && player[c1].y_add < 0 && player[c1].jump_abort == 1) {
960 if (bunnies_in_space == 0)
961 player[c1].y_add += 32768;
963 player[c1].y_add += 16384;
964 if (player[c1].y_add > 0)
965 player[c1].y_add = 0;
970 if (player[c1].action_up) {
971 player[c1].y_add -= 16384;
972 if (player[c1].y_add < -400000L)
973 player[c1].y_add = -400000L;
974 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))
975 player[c1].in_water = 0;
977 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);
982 player[c1].x += player[c1].x_add;
983 if ((player[c1].x >> 16) < 0) {
985 player[c1].x_add = 0;
987 if ((player[c1].x >> 16) + 15 > 351) {
988 player[c1].x = 336L << 16;
989 player[c1].x_add = 0;
991 if (player[c1].y > 0) {
992 s1 = (player[c1].x >> 16);
993 s2 = (player[c1].y >> 16);
994 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) {
995 player[c1].x = (((s1 + 16) & 0xfff0)) << 16;
996 player[c1].x_add = 0;
998 s1 = (player[c1].x >> 16);
999 s2 = (player[c1].y >> 16);
1000 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) {
1001 player[c1].x = (((s1 + 16) & 0xfff0) - 16) << 16;
1002 player[c1].x_add = 0;
1005 s1 = (player[c1].x >> 16);
1007 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) {
1008 player[c1].x = (((s1 + 16) & 0xfff0)) << 16;
1009 player[c1].x_add = 0;
1011 s1 = (player[c1].x >> 16);
1013 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) {
1014 player[c1].x = (((s1 + 16) & 0xfff0) - 16) << 16;
1015 player[c1].x_add = 0;
1019 player[c1].y += player[c1].y_add;
1021 s1 = (player[c1].x >> 16);
1022 s2 = (player[c1].y >> 16);
1023 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))) {
1024 player[c1].y = ((player[c1].y >> 16) & 0xfff0) << 16;
1025 player[c1].y_add = -400000L;
1026 player[c1].anim = 2;
1027 player[c1].frame = 0;
1028 player[c1].frame_tick = 0;
1029 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1030 player[c1].jump_ready = 0;
1031 player[c1].jump_abort = 0;
1032 for (c2 = 0; c2 < NUM_OBJECTS; c2++) {
1033 if (objects[c2].used == 1 && objects[c2].type == OBJ_SPRING) {
1034 if (ban_map[(s2 + 15) >> 4][(s1 + 8) >> 4] == BAN_SPRING) {
1035 if ((objects[c2].x >> 20) == ((s1 + 8) >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
1036 objects[c2].frame = 0;
1037 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
1038 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
1042 if (ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SPRING) {
1043 if ((objects[c2].x >> 20) == (s1 >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
1044 objects[c2].frame = 0;
1045 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
1046 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
1049 } else if (ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SPRING) {
1050 if ((objects[c2].x >> 20) == ((s1 + 15) >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
1051 objects[c2].frame = 0;
1052 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
1053 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
1060 dj_play_sfx(SFX_SPRING, (unsigned short)(SFX_SPRING_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
1062 s1 = (player[c1].x >> 16);
1063 s2 = (player[c1].y >> 16);
1066 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) {
1067 player[c1].y = (((s2 + 16) & 0xfff0)) << 16;
1068 player[c1].y_add = 0;
1069 player[c1].anim = 0;
1070 player[c1].frame = 0;
1071 player[c1].frame_tick = 0;
1072 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1074 s1 = (player[c1].x >> 16);
1075 s2 = (player[c1].y >> 16);
1078 if (ban_map[(s2 + 8) >> 4][(s1 + 8) >> 4] == BAN_WATER) {
1079 if (player[c1].in_water == 0) {
1080 player[c1].in_water = 1;
1081 player[c1].anim = 4;
1082 player[c1].frame = 0;
1083 player[c1].frame_tick = 0;
1084 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1085 if (player[c1].y_add >= 32768) {
1086 add_object(OBJ_SPLASH, (player[c1].x >> 16) + 8, ((player[c1].y >> 16) & 0xfff0) + 15, 0, 0, OBJ_ANIM_SPLASH, 0);
1087 if (blood_is_thicker_than_water == 0)
1088 dj_play_sfx(SFX_SPLASH, (unsigned short)(SFX_SPLASH_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
1090 dj_play_sfx(SFX_SPLASH, (unsigned short)(SFX_SPLASH_FREQ + rnd(2000) - 5000), 64, 0, 0, -1);
1093 player[c1].y_add -= 1536;
1094 if (player[c1].y_add < 0 && player[c1].anim != 5) {
1095 player[c1].anim = 5;
1096 player[c1].frame = 0;
1097 player[c1].frame_tick = 0;
1098 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1100 if (player[c1].y_add < -65536L)
1101 player[c1].y_add = -65536L;
1102 if (player[c1].y_add > 65535L)
1103 player[c1].y_add = 65535L;
1104 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) {
1105 player[c1].y = (((s2 + 16) & 0xfff0) - 16) << 16;
1106 player[c1].y_add = 0;
1108 } 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) {
1109 player[c1].in_water = 0;
1110 player[c1].y = (((s2 + 16) & 0xfff0) - 16) << 16;
1111 player[c1].y_add = 0;
1112 if (player[c1].anim != 0 && player[c1].anim != 1) {
1113 player[c1].anim = 0;
1114 player[c1].frame = 0;
1115 player[c1].frame_tick = 0;
1116 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1119 if (player[c1].in_water == 0) {
1120 if (bunnies_in_space == 0)
1121 player[c1].y_add += 12288;
1123 player[c1].y_add += 6144;
1124 if (player[c1].y_add > 327680L)
1125 player[c1].y_add = 327680L;
1127 player[c1].y = (player[c1].y & 0xffff0000) + 0x10000;
1128 player[c1].y_add = 0;
1130 player[c1].in_water = 0;
1132 if (player[c1].y_add > 36864 && player[c1].anim != 3 && player[c1].in_water == 0) {
1133 player[c1].anim = 3;
1134 player[c1].frame = 0;
1135 player[c1].frame_tick = 0;
1136 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1141 player[c1].frame_tick++;
1142 if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
1144 if (player[c1].frame >= player_anims[player[c1].anim].num_frames) {
1145 if (player[c1].anim != 6)
1146 player[c1].frame = player_anims[player[c1].anim].restart_frame;
1148 position_player(c1);
1150 player[c1].frame_tick = 0;
1152 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1161 void position_player(int player_num)
1170 if (ban_map[s2][s1] == BAN_VOID && (ban_map[s2 + 1][s1] == BAN_SOLID || ban_map[s2 + 1][s1] == BAN_ICE))
1173 for (c1 = 0; c1 < 4; c1++) {
1174 if (c1 != player_num && player[c1].enabled == 1) {
1175 if (abs((s1 << 4) - (player[c1].x >> 16)) < 32 && abs((s2 << 4) - (player[c1].y >> 16)) < 32)
1180 player[player_num].dead_flag = 0;
1181 player[player_num].x = (long) s1 << 20;
1182 player[player_num].y = (long) s2 << 20;
1183 player[player_num].x_add = player[player_num].y_add = 0;
1184 player[player_num].direction = 0;
1185 player[player_num].jump_ready = 1;
1186 player[player_num].in_water = 0;
1187 player[player_num].anim = 0;
1188 player[player_num].frame = 0;
1189 player[player_num].frame_tick = 0;
1190 player[player_num].image = player_anims[player[player_num].anim].frame[player[player_num].frame].image;
1198 void add_object(int type, int x, int y, int x_add, int y_add, int anim, int frame)
1202 for (c1 = 0; c1 < NUM_OBJECTS; c1++) {
1203 if (objects[c1].used == 0) {
1204 objects[c1].used = 1;
1205 objects[c1].type = type;
1206 objects[c1].x = (long) x << 16;
1207 objects[c1].y = (long) y << 16;
1208 objects[c1].x_add = x_add;
1209 objects[c1].y_add = y_add;
1210 objects[c1].x_acc = 0;
1211 objects[c1].y_acc = 0;
1212 objects[c1].anim = anim;
1213 objects[c1].frame = frame;
1214 objects[c1].ticks = object_anims[anim].frame[frame].ticks;
1215 objects[c1].image = object_anims[anim].frame[frame].image;
1223 void update_objects(void)
1228 for (c1 = 0; c1 < NUM_OBJECTS; c1++) {
1229 if (objects[c1].used == 1) {
1230 switch (objects[c1].type) {
1232 objects[c1].ticks--;
1233 if (objects[c1].ticks <= 0) {
1234 objects[c1].frame++;
1235 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames) {
1236 objects[c1].frame--;
1237 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1239 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1240 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1243 if (objects[c1].used == 1)
1244 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1247 objects[c1].ticks--;
1248 if (objects[c1].ticks <= 0) {
1249 objects[c1].frame++;
1250 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1251 objects[c1].used = 0;
1253 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1254 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1257 if (objects[c1].used == 1)
1258 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1261 objects[c1].x += objects[c1].x_add;
1262 objects[c1].y += objects[c1].y_add;
1263 objects[c1].ticks--;
1264 if (objects[c1].ticks <= 0) {
1265 objects[c1].frame++;
1266 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1267 objects[c1].used = 0;
1269 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1270 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1273 if (objects[c1].used == 1)
1274 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1276 case OBJ_YEL_BUTFLY:
1277 case OBJ_PINK_BUTFLY:
1278 objects[c1].x_acc += rnd(128) - 64;
1279 if (objects[c1].x_acc < -1024)
1280 objects[c1].x_acc = -1024;
1281 if (objects[c1].x_acc > 1024)
1282 objects[c1].x_acc = 1024;
1283 objects[c1].x_add += objects[c1].x_acc;
1284 if (objects[c1].x_add < -32768)
1285 objects[c1].x_add = -32768;
1286 if (objects[c1].x_add > 32768)
1287 objects[c1].x_add = 32768;
1288 objects[c1].x += objects[c1].x_add;
1289 if ((objects[c1].x >> 16) < 16) {
1290 objects[c1].x = 16 << 16;
1291 objects[c1].x_add = -objects[c1].x_add >> 2;
1292 objects[c1].x_acc = 0;
1293 } else if ((objects[c1].x >> 16) > 350) {
1294 objects[c1].x = 350 << 16;
1295 objects[c1].x_add = -objects[c1].x_add >> 2;
1296 objects[c1].x_acc = 0;
1298 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0) {
1299 if (objects[c1].x_add < 0) {
1300 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1302 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1304 objects[c1].x_add = -objects[c1].x_add >> 2;
1305 objects[c1].x_acc = 0;
1307 objects[c1].y_acc += rnd(64) - 32;
1308 if (objects[c1].y_acc < -1024)
1309 objects[c1].y_acc = -1024;
1310 if (objects[c1].y_acc > 1024)
1311 objects[c1].y_acc = 1024;
1312 objects[c1].y_add += objects[c1].y_acc;
1313 if (objects[c1].y_add < -32768)
1314 objects[c1].y_add = -32768;
1315 if (objects[c1].y_add > 32768)
1316 objects[c1].y_add = 32768;
1317 objects[c1].y += objects[c1].y_add;
1318 if ((objects[c1].y >> 16) < 0) {
1320 objects[c1].y_add = -objects[c1].y_add >> 2;
1321 objects[c1].y_acc = 0;
1322 } else if ((objects[c1].y >> 16) > 255) {
1323 objects[c1].y = 255 << 16;
1324 objects[c1].y_add = -objects[c1].y_add >> 2;
1325 objects[c1].y_acc = 0;
1327 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0) {
1328 if (objects[c1].y_add < 0) {
1329 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1331 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1333 objects[c1].y_add = -objects[c1].y_add >> 2;
1334 objects[c1].y_acc = 0;
1336 if (objects[c1].type == OBJ_YEL_BUTFLY) {
1337 if (objects[c1].x_add < 0 && objects[c1].anim != OBJ_ANIM_YEL_BUTFLY_LEFT) {
1338 objects[c1].anim = OBJ_ANIM_YEL_BUTFLY_LEFT;
1339 objects[c1].frame = 0;
1340 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1341 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1342 } else if (objects[c1].x_add > 0 && objects[c1].anim != OBJ_ANIM_YEL_BUTFLY_RIGHT) {
1343 objects[c1].anim = OBJ_ANIM_YEL_BUTFLY_RIGHT;
1344 objects[c1].frame = 0;
1345 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1346 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1349 if (objects[c1].x_add < 0 && objects[c1].anim != OBJ_ANIM_PINK_BUTFLY_LEFT) {
1350 objects[c1].anim = OBJ_ANIM_PINK_BUTFLY_LEFT;
1351 objects[c1].frame = 0;
1352 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1353 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1354 } else if (objects[c1].x_add > 0 && objects[c1].anim != OBJ_ANIM_PINK_BUTFLY_RIGHT) {
1355 objects[c1].anim = OBJ_ANIM_PINK_BUTFLY_RIGHT;
1356 objects[c1].frame = 0;
1357 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1358 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1361 objects[c1].ticks--;
1362 if (objects[c1].ticks <= 0) {
1363 objects[c1].frame++;
1364 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1365 objects[c1].frame = object_anims[objects[c1].anim].restart_frame;
1367 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1368 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1371 if (objects[c1].used == 1)
1372 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1376 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 0);
1377 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 0) {
1378 objects[c1].y_add += 3072;
1379 if (objects[c1].y_add > 196608L)
1380 objects[c1].y_add = 196608L;
1381 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 2) {
1382 if (objects[c1].x_add < 0) {
1383 if (objects[c1].x_add < -65536L)
1384 objects[c1].x_add = -65536L;
1385 objects[c1].x_add += 1024;
1386 if (objects[c1].x_add > 0)
1387 objects[c1].x_add = 0;
1389 if (objects[c1].x_add > 65536L)
1390 objects[c1].x_add = 65536L;
1391 objects[c1].x_add -= 1024;
1392 if (objects[c1].x_add < 0)
1393 objects[c1].x_add = 0;
1395 objects[c1].y_add += 1024;
1396 if (objects[c1].y_add < -65536L)
1397 objects[c1].y_add = -65536L;
1398 if (objects[c1].y_add > 65536L)
1399 objects[c1].y_add = 65536L;
1401 objects[c1].x += objects[c1].x_add;
1402 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)) {
1403 if (objects[c1].x_add < 0) {
1404 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1405 objects[c1].x_add = -objects[c1].x_add >> 2;
1407 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1408 objects[c1].x_add = -objects[c1].x_add >> 2;
1411 objects[c1].y += objects[c1].y_add;
1412 if ((objects[c1].x >> 16) < -5 || (objects[c1].x >> 16) > 405 || (objects[c1].y >> 16) > 260)
1413 objects[c1].used = 0;
1414 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0)) {
1415 if (objects[c1].y_add < 0) {
1416 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 2) {
1417 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1418 objects[c1].x_add >>= 2;
1419 objects[c1].y_add = -objects[c1].y_add >> 2;
1422 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1) {
1423 if (objects[c1].y_add > 131072L) {
1424 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1425 objects[c1].x_add >>= 2;
1426 objects[c1].y_add = -objects[c1].y_add >> 2;
1428 objects[c1].used = 0;
1429 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3) {
1430 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1431 if (objects[c1].y_add > 131072L)
1432 objects[c1].y_add = -objects[c1].y_add >> 2;
1434 objects[c1].y_add = 0;
1438 if (objects[c1].x_add < 0 && objects[c1].x_add > -16384)
1439 objects[c1].x_add = -16384;
1440 if (objects[c1].x_add > 0 && objects[c1].x_add < 16384)
1441 objects[c1].x_add = 16384;
1442 if (objects[c1].used == 1) {
1443 s1 = (int)(atan2(objects[c1].y_add, objects[c1].x_add) * 4 / M_PI);
1450 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].frame + s1, object_gobs);
1454 if (rnd(100) < 30) {
1455 if (objects[c1].frame == 76)
1456 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 1);
1457 else if (objects[c1].frame == 77)
1458 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 2);
1459 else if (objects[c1].frame == 78)
1460 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 3);
1462 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 0) {
1463 objects[c1].y_add += 3072;
1464 if (objects[c1].y_add > 196608L)
1465 objects[c1].y_add = 196608L;
1466 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 2) {
1467 if (objects[c1].x_add < 0) {
1468 if (objects[c1].x_add < -65536L)
1469 objects[c1].x_add = -65536L;
1470 objects[c1].x_add += 1024;
1471 if (objects[c1].x_add > 0)
1472 objects[c1].x_add = 0;
1474 if (objects[c1].x_add > 65536L)
1475 objects[c1].x_add = 65536L;
1476 objects[c1].x_add -= 1024;
1477 if (objects[c1].x_add < 0)
1478 objects[c1].x_add = 0;
1480 objects[c1].y_add += 1024;
1481 if (objects[c1].y_add < -65536L)
1482 objects[c1].y_add = -65536L;
1483 if (objects[c1].y_add > 65536L)
1484 objects[c1].y_add = 65536L;
1486 objects[c1].x += objects[c1].x_add;
1487 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)) {
1488 if (objects[c1].x_add < 0) {
1489 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1490 objects[c1].x_add = -objects[c1].x_add >> 2;
1492 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1493 objects[c1].x_add = -objects[c1].x_add >> 2;
1496 objects[c1].y += objects[c1].y_add;
1497 if ((objects[c1].x >> 16) < -5 || (objects[c1].x >> 16) > 405 || (objects[c1].y >> 16) > 260)
1498 objects[c1].used = 0;
1499 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0)) {
1500 if (objects[c1].y_add < 0) {
1501 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 2) {
1502 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1503 objects[c1].x_add >>= 2;
1504 objects[c1].y_add = -objects[c1].y_add >> 2;
1507 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1) {
1508 if (objects[c1].y_add > 131072L) {
1509 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1510 objects[c1].x_add >>= 2;
1511 objects[c1].y_add = -objects[c1].y_add >> 2;
1513 if (rnd(100) < 10) {
1515 add_leftovers(0, objects[c1].x >> 16, (objects[c1].y >> 16) + s1, objects[c1].frame, object_gobs);
1516 add_leftovers(1, objects[c1].x >> 16, (objects[c1].y >> 16) + s1, objects[c1].frame, object_gobs);
1518 objects[c1].used = 0;
1520 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3) {
1521 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1522 if (objects[c1].y_add > 131072L)
1523 objects[c1].y_add = -objects[c1].y_add >> 2;
1525 objects[c1].y_add = 0;
1529 if (objects[c1].x_add < 0 && objects[c1].x_add > -16384)
1530 objects[c1].x_add = -16384;
1531 if (objects[c1].x_add > 0 && objects[c1].x_add < 16384)
1532 objects[c1].x_add = 16384;
1533 if (objects[c1].used == 1)
1534 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].frame, object_gobs);
1536 case OBJ_FLESH_TRACE:
1537 objects[c1].ticks--;
1538 if (objects[c1].ticks <= 0) {
1539 objects[c1].frame++;
1540 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1541 objects[c1].used = 0;
1543 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1544 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1547 if (objects[c1].used == 1)
1548 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1557 int add_pob(int page, int x, int y, int image, char *pob_data)
1560 if (main_info.page_info[page].num_pobs >= NUM_POBS)
1563 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].x = x;
1564 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].y = y;
1565 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].image = image;
1566 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].pob_data = pob_data;
1567 main_info.page_info[page].num_pobs++;
1574 void draw_flies(int page)
1578 for (c2 = 0; c2 < NUM_FLIES; c2++) {
1579 flies[c2].back[main_info.draw_page] = get_pixel(main_info.draw_page, flies[c2].x, flies[c2].y);
1580 flies[c2].back_defined[main_info.draw_page] = 1;
1581 if (mask_pic[(flies[c2].y * JNB_WIDTH) + flies[c2].x] == 0)
1582 set_pixel(main_info.draw_page, flies[c2].x, flies[c2].y, 0);
1586 void draw_pobs(int page)
1593 for (c1 = main_info.page_info[page].num_pobs - 1; c1 >= 0; c1--) {
1594 main_info.page_info[page].pobs[c1].back_buf_ofs = back_buf_ofs;
1595 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), (char *) (main_info.pob_backbuf[page] + back_buf_ofs));
1596 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);
1597 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);
1603 void redraw_flies_background(int page)
1607 for (c2 = NUM_FLIES - 1; c2 >= 0; c2--) {
1608 if (flies[c2].back_defined[page] == 1)
1609 set_pixel(page, flies[c2].old_x, flies[c2].old_y, flies[c2].back[page]);
1614 void redraw_pob_backgrounds(int page)
1618 for (c1 = 0; c1 < main_info.page_info[page].num_pobs; c1++)
1619 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), (char *) (main_info.pob_backbuf[page] + main_info.page_info[page].pobs[c1].back_buf_ofs));
1624 int add_leftovers(int page, int x, int y, int image, char *pob_data)
1627 if (leftovers.page[page].num_pobs >= NUM_LEFTOVERS)
1630 leftovers.page[page].pobs[leftovers.page[page].num_pobs].x = x;
1631 leftovers.page[page].pobs[leftovers.page[page].num_pobs].y = y;
1632 leftovers.page[page].pobs[leftovers.page[page].num_pobs].image = image;
1633 leftovers.page[page].pobs[leftovers.page[page].num_pobs].pob_data = pob_data;
1634 leftovers.page[page].num_pobs++;
1641 void draw_leftovers(int page)
1645 for (c1 = leftovers.page[page].num_pobs - 1; c1 >= 0; c1--)
1646 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);
1648 leftovers.page[page].num_pobs = 0;
1653 int init_level(int level, char *pal)
1659 if ((handle = dat_open("level.pcx", datfile_name, "rb")) == 0) {
1660 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
1663 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
1664 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
1668 if ((handle = dat_open("mask.pcx", datfile_name, "rb")) == 0) {
1669 strcpy(main_info.error_str, "Error loading 'mask.pcx', aborting...\n");
1672 if (read_pcx(handle, mask_pic, 102400L, 0) != 0) {
1673 strcpy(main_info.error_str, "Error loading 'mask.pcx', aborting...\n");
1678 for (c1 = 0; c1 < 4; c1++) {
1679 if (player[c1].enabled == 1) {
1680 player[c1].bumps = 0;
1681 player[c1].bumped[0] = 0;
1682 player[c1].bumped[1] = 0;
1683 player[c1].bumped[2] = 0;
1684 player[c1].bumped[3] = 0;
1685 position_player(c1);
1689 for (c1 = 0; c1 < NUM_OBJECTS; c1++)
1690 objects[c1].used = 0;
1692 for (c1 = 0; c1 < 16; c1++) {
1693 for (c2 = 0; c2 < 22; c2++) {
1694 if (ban_map[c1][c2] == BAN_SPRING)
1695 add_object(OBJ_SPRING, c2 << 4, c1 << 4, 0, 0, OBJ_ANIM_SPRING, 5);
1702 if (ban_map[s2][s1] == BAN_VOID) {
1703 add_object(OBJ_YEL_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1710 if (ban_map[s2][s1] == BAN_VOID) {
1711 add_object(OBJ_YEL_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1718 if (ban_map[s2][s1] == BAN_VOID) {
1719 add_object(OBJ_PINK_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1726 if (ban_map[s2][s1] == BAN_VOID) {
1727 add_object(OBJ_PINK_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1737 void deinit_level(void)
1744 int init_program(int argc, char *argv[], char *pal)
1746 FILE *handle = (FILE *) NULL;
1749 char force2, force3;
1751 int player_anim_data[] = {
1752 1, 0, 0, 0x7fff, 0, 0, 0, 0, 0, 0,
1753 4, 0, 0, 4, 1, 4, 2, 4, 3, 4,
1754 1, 0, 4, 0x7fff, 0, 0, 0, 0, 0, 0,
1755 4, 2, 5, 8, 6, 10, 7, 3, 6, 3,
1756 1, 0, 6, 0x7fff, 0, 0, 0, 0, 0, 0,
1757 2, 1, 5, 8, 4, 0x7fff, 0, 0, 0, 0,
1758 1, 0, 8, 5, 0, 0, 0, 0, 0, 0
1762 if (__djgpp_nearptr_enable() == 0)
1768 if (hook_keyb_handler() != 0)
1771 memset(&main_info, 0, sizeof(main_info));
1773 strcpy(datfile_name, "data/jumpbump.dat");
1775 force2 = force3 = 0;
1778 for (c1 = 1; c1 < argc; c1++) {
1779 if (stricmp(argv[c1], "-nosound") == 0)
1780 main_info.no_sound = 1;
1781 else if (stricmp(argv[c1], "-nogore") == 0)
1782 main_info.no_gore = 1;
1783 else if (stricmp(argv[c1], "-nojoy") == 0)
1784 main_info.joy_enabled = 0;
1785 else if (stricmp(argv[c1], "-fireworks") == 0)
1786 main_info.fireworks = 1;
1788 else if (stricmp(argv[c1], "-fullscreen") == 0)
1791 else if (stricmp(argv[c1], "-dat") == 0) {
1792 if (c1 < (argc - 1)) {
1793 if ((handle = fopen(argv[c1 + 1], "rb")) != NULL) {
1795 strcpy(datfile_name, argv[c1 + 1]);
1798 } else if (stricmp(argv[c1], "-mouse") == 0) {
1799 if (c1 < (argc - 1)) {
1800 if (stricmp(argv[c1 + 1], "2") == 0)
1802 if (stricmp(argv[c1 + 1], "3") == 0)
1809 for (c1 = 0; c1 < 7; c1++) {
1810 player_anims[c1].num_frames = player_anim_data[c1 * 10];
1811 player_anims[c1].restart_frame = player_anim_data[c1 * 10 + 1];
1812 for (c2 = 0; c2 < 4; c2++) {
1813 player_anims[c1].frame[c2].image = player_anim_data[c1 * 10 + c2 * 2 + 2];
1814 player_anims[c1].frame[c2].ticks = player_anim_data[c1 * 10 + c2 * 2 + 3];
1818 if ((background_pic = malloc(102400)) == NULL)
1820 if ((mask_pic = malloc(102400)) == NULL)
1822 memset(mask_pic, 0, 102400);
1824 main_info.pob_backbuf[0] = malloc(65535);
1825 main_info.pob_backbuf[1] = malloc(65535);
1826 if (main_info.pob_backbuf[0] == 0 || main_info.pob_backbuf[1] == 0)
1829 if ((handle = dat_open("rabbit.gob", datfile_name, "rb")) == 0) {
1830 strcpy(main_info.error_str, "Error loading 'rabbit.gob', aborting...\n");
1833 if ((rabbit_gobs = malloc(dat_filelen("rabbit.gob", datfile_name))) == 0) {
1834 strcpy(main_info.error_str, "Not enough memory, aborting...\n");
1838 fread(rabbit_gobs, 1, dat_filelen("rabbit.gob", datfile_name), handle);
1841 if ((handle = dat_open("objects.gob", datfile_name, "rb")) == 0) {
1842 strcpy(main_info.error_str, "Error loading 'objects.gob', aborting...\n");
1845 if ((object_gobs = malloc(dat_filelen("objects.gob", datfile_name))) == 0) {
1846 strcpy(main_info.error_str, "Not enough memory, aborting...\n");
1850 fread(object_gobs, 1, dat_filelen("objects.gob", datfile_name), handle);
1853 if ((handle = dat_open("font.gob", datfile_name, "rb")) == 0) {
1854 strcpy(main_info.error_str, "Error loading 'font.gob', aborting...\n");
1857 if ((font_gobs = malloc(dat_filelen("font.gob", datfile_name))) == 0) {
1858 strcpy(main_info.error_str, "Not enough memory, aborting...\n");
1862 fread(font_gobs, 1, dat_filelen("font.gob", datfile_name), handle);
1865 if ((handle = dat_open("numbers.gob", datfile_name, "rb")) == 0) {
1866 strcpy(main_info.error_str, "Error loading 'numbers.gob', aborting...\n");
1869 if ((number_gobs = malloc(dat_filelen("numbers.gob", datfile_name))) == 0) {
1870 strcpy(main_info.error_str, "Not enough memory, aborting...\n");
1874 fread(number_gobs, 1, dat_filelen("numbers.gob", datfile_name), handle);
1877 if (read_level() != 0) {
1878 strcpy(main_info.error_str, "Error loading 'levelmap.txt', aborting...\n");
1884 if (main_info.no_sound == 0) {
1886 dj_set_mixing_freq(20000);
1890 dj_set_num_sfx_channels(5);
1891 dj_set_sfx_volume(64);
1895 if ((handle = dat_open("jump.mod", datfile_name, "rb")) == 0) {
1896 strcpy(main_info.error_str, "Error loading 'jump.mod', aborting...\n");
1899 if (dj_load_mod(handle, 0, MOD_MENU) != 0) {
1900 strcpy(main_info.error_str, "Error loading 'jump.mod', aborting...\n");
1905 if ((handle = dat_open("bump.mod", datfile_name, "rb")) == 0) {
1906 strcpy(main_info.error_str, "Error loading 'bump.mod', aborting...\n");
1909 if (dj_load_mod(handle, 0, MOD_GAME) != 0) {
1910 strcpy(main_info.error_str, "Error loading 'bump.mod', aborting...\n");
1915 if ((handle = dat_open("scores.mod", datfile_name, "rb")) == 0) {
1916 strcpy(main_info.error_str, "Error loading 'scores.mod', aborting...\n");
1919 if (dj_load_mod(handle, 0, MOD_SCORES) != 0) {
1920 strcpy(main_info.error_str, "Error loading 'scores.mod', aborting...\n");
1925 if ((handle = dat_open("jump.smp", datfile_name, "rb")) == 0) {
1926 strcpy(main_info.error_str, "Error loading 'jump.smp', aborting...\n");
1929 if (dj_load_sfx(handle, 0, dat_filelen("jump.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_JUMP) != 0) {
1930 strcpy(main_info.error_str, "Error loading 'jump.smp', aborting...\n");
1935 if ((handle = dat_open("death.smp", datfile_name, "rb")) == 0) {
1936 strcpy(main_info.error_str, "Error loading 'death.smp', aborting...\n");
1939 if (dj_load_sfx(handle, 0, dat_filelen("death.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_DEATH) != 0) {
1940 strcpy(main_info.error_str, "Error loading 'death.smp', aborting...\n");
1945 if ((handle = dat_open("spring.smp", datfile_name, "rb")) == 0) {
1946 strcpy(main_info.error_str, "Error loading 'spring.smp', aborting...\n");
1949 if (dj_load_sfx(handle, 0, dat_filelen("spring.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_SPRING) != 0) {
1950 strcpy(main_info.error_str, "Error loading 'spring.smp', aborting...\n");
1955 if ((handle = dat_open("splash.smp", datfile_name, "rb")) == 0) {
1956 strcpy(main_info.error_str, "Error loading 'splash.smp', aborting...\n");
1959 if (dj_load_sfx(handle, 0, dat_filelen("splash.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_SPLASH) != 0) {
1960 strcpy(main_info.error_str, "Error loading 'splash.smp', aborting...\n");
1965 if ((handle = dat_open("fly.smp", datfile_name, "rb")) == 0) {
1966 strcpy(main_info.error_str, "Error loading 'fly.smp', aborting...\n");
1969 if (dj_load_sfx(handle, 0, dat_filelen("fly.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_FLY) != 0) {
1970 strcpy(main_info.error_str, "Error loading 'fly.smp', aborting...\n");
1975 dj_get_sfx_settings(SFX_FLY, &fly);
1977 fly.default_freq = SFX_FLY_FREQ;
1980 fly.loop_length = fly.length;
1981 dj_set_sfx_settings(SFX_FLY, &fly);
1984 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
1985 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
1988 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
1989 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
1994 setpalette(0, 256, pal);
1998 if (main_info.joy_enabled == 1 && main_info.fireworks == 0) {
2000 put_text(0, 200, 40, "JOYSTICK CALIBRATION", 2);
2001 put_text(0, 200, 100, "Move the joystick to the", 2);
2002 put_text(0, 200, 115, "UPPER LEFT", 2);
2003 put_text(0, 200, 130, "and press button A", 2);
2004 put_text(0, 200, 200, "Or press ESC to use", 2);
2005 put_text(0, 200, 215, "previous settings", 2);
2006 if (calib_joy(0) != 0)
2009 register_background(NULL);
2011 main_info.view_page = 1;
2016 put_text(1, 200, 40, "JOYSTICK CALIBRATION", 2);
2017 put_text(1, 200, 100, "Move the joystick to the", 2);
2018 put_text(1, 200, 115, "LOWER RIGHT", 2);
2019 put_text(1, 200, 130, "and press button A", 2);
2020 put_text(1, 200, 200, "Or press ESC to use", 2);
2021 put_text(1, 200, 215, "previous settings", 2);
2022 if (calib_joy(1) != 0)
2025 register_background(NULL);
2030 put_text(0, 200, 40, "JOYSTICK CALIBRATION", 2);
2031 put_text(0, 200, 100, "Move the joystick to the", 2);
2032 put_text(0, 200, 115, "CENTER", 2);
2033 put_text(0, 200, 130, "and press button A", 2);
2034 put_text(0, 200, 200, "Or press ESC to use", 2);
2035 put_text(0, 200, 215, "previous settings", 2);
2036 if (calib_joy(2) != 0)
2039 if (joy.calib_data.x1 == joy.calib_data.x2)
2040 joy.calib_data.x1 -= 10;
2041 if (joy.calib_data.x3 == joy.calib_data.x2)
2042 joy.calib_data.x3 += 10;
2043 if (joy.calib_data.y1 == joy.calib_data.y2)
2044 joy.calib_data.y1 -= 10;
2045 if (joy.calib_data.y3 == joy.calib_data.y2)
2046 joy.calib_data.y3 += 10;
2051 if (load_flag == 1) {
2052 if ((handle = dat_open("calib.dat", datfile_name, "rb")) == 0) {
2053 strcpy(main_info.error_str, "Error loading 'calib.dat', aborting...\n");
2056 joy.calib_data.x1 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2057 joy.calib_data.x2 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2058 joy.calib_data.x3 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2059 joy.calib_data.y1 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2060 joy.calib_data.y2 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2061 joy.calib_data.y3 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2071 void deinit_program(void)
2078 dj_free_mod(MOD_MENU);
2079 dj_free_mod(MOD_GAME);
2080 dj_free_sfx(SFX_DEATH);
2081 dj_free_sfx(SFX_SPRING);
2082 dj_free_sfx(SFX_SPLASH);
2085 if (rabbit_gobs != 0)
2087 if (object_gobs != 0)
2089 if (number_gobs != 0)
2092 if (main_info.pob_backbuf[0] != 0)
2093 free(main_info.pob_backbuf[0]);
2094 if (main_info.pob_backbuf[1] != 0)
2095 free(main_info.pob_backbuf[1]);
2097 if (background_pic != 0)
2098 free(background_pic);
2102 remove_keyb_handler();
2106 __dpmi_int(0x10, ®s);
2109 if (main_info.error_str[0] != 0) {
2110 printf(main_info.error_str);
2118 unsigned short rnd(unsigned short max)
2120 return (rand() % max);
2124 int read_level(void)
2130 if ((handle = dat_open("levelmap.txt", datfile_name, "rb")) == 0) {
2131 strcpy(main_info.error_str, "Error loading 'levelmap.txt', aborting...\n");
2135 for (c1 = 0; c1 < 16; c1++) {
2136 for (c2 = 0; c2 < 22; c2++) {
2138 chr = fgetc(handle);
2143 if (chr >= '0' && chr <= '4')
2146 ban_map[c1][c2] = chr - '0';
2150 for (c2 = 0; c2 < 22; c2++)
2151 ban_map[16][c2] = BAN_SOLID;
2159 FILE *dat_open(char *file_name, char *dat_name, char *mode)
2167 handle = fopen(dat_name, mode);
2171 memset(name, 0, sizeof(name));
2173 num = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2175 for (c1 = 0; c1 < num; c1++) {
2176 if (!fread(name, 1, 12, handle)) {
2180 if (strnicmp(name, file_name, strlen(file_name)) == 0) {
2181 ofs = fgetc(handle);
2182 ofs += (fgetc(handle) << 8);
2183 ofs += (fgetc(handle) << 16);
2184 ofs += (fgetc(handle) << 24);
2185 fseek(handle, ofs, SEEK_SET);
2188 fseek(handle, 8, SEEK_CUR);
2197 int dat_filelen(char *file_name, char *dat_name)
2205 handle = fopen(dat_name, "rb");
2209 memset(name, 0, sizeof(name));
2211 num = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2213 for (c1 = 0; c1 < num; c1++) {
2214 if (!fread(name, 1, 12, handle)) {
2218 if (strnicmp(name, file_name, strlen(file_name)) == 0) {
2219 fseek(handle, 4, SEEK_CUR);
2220 len = fgetc(handle);
2221 len += (fgetc(handle) << 8);
2222 len += (fgetc(handle) << 16);
2223 len += (fgetc(handle) << 24);
2228 fseek(handle, 8, SEEK_CUR);
2237 int filelength(int handle)
2241 if (fstat(handle, &buf) == -1) {
2242 perror("filelength");
2251 void write_calib_data(void)
2259 if ((handle = fopen(datfile_name, "rb")) == NULL)
2261 len = filelength(fileno(handle));
2262 if ((mem = malloc(len)) == NULL)
2264 fread(mem, 1, len, handle);
2268 num = *(int *) (&mem[0]);
2269 for (c1 = 0; c1 < num; c1++) {
2270 if (strnicmp(&mem[ofs], "calib.dat", strlen("calib.dat")) == 0) {
2271 ofs = *(int *) (&mem[ofs + 12]);
2277 mem[ofs] = joy.calib_data.x1 & 0xff;
2278 mem[ofs + 1] = (joy.calib_data.x1 >> 8) & 0xff;
2279 mem[ofs + 2] = (joy.calib_data.x1 >> 16) & 0xff;
2280 mem[ofs + 3] = (joy.calib_data.x1 >> 24) & 0xff;
2281 mem[ofs + 4] = joy.calib_data.x2 & 0xff;
2282 mem[ofs + 5] = (joy.calib_data.x2 >> 8) & 0xff;
2283 mem[ofs + 6] = (joy.calib_data.x2 >> 16) & 0xff;
2284 mem[ofs + 7] = (joy.calib_data.x2 >> 24) & 0xff;
2285 mem[ofs + 8] = joy.calib_data.x3 & 0xff;
2286 mem[ofs + 9] = (joy.calib_data.x3 >> 8) & 0xff;
2287 mem[ofs + 10] = (joy.calib_data.x3 >> 16) & 0xff;
2288 mem[ofs + 11] = (joy.calib_data.x3 >> 24) & 0xff;
2289 mem[ofs + 12] = joy.calib_data.y1 & 0xff;
2290 mem[ofs + 13] = (joy.calib_data.y1 >> 8) & 0xff;
2291 mem[ofs + 14] = (joy.calib_data.y1 >> 16) & 0xff;
2292 mem[ofs + 15] = (joy.calib_data.y1 >> 24) & 0xff;
2293 mem[ofs + 16] = joy.calib_data.y2 & 0xff;
2294 mem[ofs + 17] = (joy.calib_data.y2 >> 8) & 0xff;
2295 mem[ofs + 18] = (joy.calib_data.y2 >> 16) & 0xff;
2296 mem[ofs + 19] = (joy.calib_data.y2 >> 24) & 0xff;
2297 mem[ofs + 20] = joy.calib_data.y3 & 0xff;
2298 mem[ofs + 21] = (joy.calib_data.y3 >> 8) & 0xff;
2299 mem[ofs + 22] = (joy.calib_data.y3 >> 16) & 0xff;
2300 mem[ofs + 23] = (joy.calib_data.y3 >> 24) & 0xff;
2302 if ((handle = fopen(datfile_name, "wb")) == NULL)
2304 fwrite(mem, 1, len, handle);