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) {
327 //register_background(background_pic, pal);
335 for (c3 = 0; c3 < 6; c3++) {
339 } else if (c3 == 1) {
342 } else if (c3 == 2) {
345 } else if (c3 == 3) {
348 } else if (c3 == 4) {
351 } else if (c3 == 5) {
355 if (player[c1].enabled == 1 && player[c2].enabled == 1) {
356 if (labs(player[c1].x - player[c2].x) < (12L << 16) && labs(player[c1].y - player[c2].y) < (12L << 16)) {
357 if ((labs(player[c1].y - player[c2].y) >> 16) > 5) {
358 if (player[c1].y < player[c2].y) {
359 if (player[c1].y_add >= 0) {
360 player[c1].y_add = -player[c1].y_add;
361 if (player[c1].y_add > -262144L)
362 player[c1].y_add = -262144L;
363 player[c1].jump_abort = 1;
364 player[c2].dead_flag = 1;
365 if (player[c2].anim != 6) {
367 player[c2].frame = 0;
368 player[c2].frame_tick = 0;
369 player[c2].image = player_anims[player[c2].anim].frame[player[c2].frame].image + player[c2].direction * 9;
370 if (main_info.no_gore == 0) {
371 for (c4 = 0; c4 < 6; c4++)
372 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);
373 for (c4 = 0; c4 < 6; c4++)
374 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);
375 for (c4 = 0; c4 < 6; c4++)
376 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);
377 for (c4 = 0; c4 < 8; c4++)
378 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);
379 for (c4 = 0; c4 < 10; c4++)
380 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);
382 dj_play_sfx(SFX_DEATH, (unsigned short)(SFX_DEATH_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
384 player[c1].bumped[c2]++;
385 s1 = player[c1].bumps % 100;
386 add_leftovers(0, 360, 34 + c1 * 64, s1 / 10, &number_gobs);
387 add_leftovers(1, 360, 34 + c1 * 64, s1 / 10, &number_gobs);
388 add_leftovers(0, 376, 34 + c1 * 64, s1 - (s1 / 10) * 10, &number_gobs);
389 add_leftovers(1, 376, 34 + c1 * 64, s1 - (s1 / 10) * 10, &number_gobs);
392 if (player[c2].y_add < 0)
393 player[c2].y_add = 0;
396 if (player[c2].y_add >= 0) {
397 player[c2].y_add = -player[c2].y_add;
398 if (player[c2].y_add > -262144L)
399 player[c2].y_add = -262144L;
400 player[c2].jump_abort = 1;
401 player[c1].dead_flag = 1;
402 if (player[c1].anim != 6) {
404 player[c1].frame = 0;
405 player[c1].frame_tick = 0;
406 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
407 if (main_info.no_gore == 0) {
408 for (c4 = 0; c4 < 6; c4++)
409 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);
410 for (c4 = 0; c4 < 6; c4++)
411 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);
412 for (c4 = 0; c4 < 7; c4++)
413 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);
414 for (c4 = 0; c4 < 8; c4++)
415 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);
416 for (c4 = 0; c4 < 10; c4++)
417 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);
419 dj_play_sfx(SFX_DEATH, (unsigned short)(SFX_DEATH_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
421 player[c2].bumped[c1]++;
422 s1 = player[c2].bumps % 100;
423 add_leftovers(0, 360, 34 + c2 * 64, s1 / 10, &number_gobs);
424 add_leftovers(1, 360, 34 + c2 * 64, s1 / 10, &number_gobs);
425 add_leftovers(0, 376, 34 + c2 * 64, s1 - (s1 / 10) * 10, &number_gobs);
426 add_leftovers(1, 376, 34 + c2 * 64, s1 - (s1 / 10) * 10, &number_gobs);
429 if (player[c1].y_add < 0)
430 player[c1].y_add = 0;
434 if (player[c1].x < player[c2].x) {
435 if (player[c1].x_add > 0)
436 player[c1].x = player[c2].x - (12L << 16);
437 else if (player[c2].x_add < 0)
438 player[c2].x = player[c1].x + (12L << 16);
440 player[c1].x -= player[c1].x_add;
441 player[c2].x -= player[c2].x_add;
443 l1 = player[c2].x_add;
444 player[c2].x_add = player[c1].x_add;
445 player[c1].x_add = l1;
446 if (player[c1].x_add > 0)
447 player[c1].x_add = -player[c1].x_add;
448 if (player[c2].x_add < 0)
449 player[c2].x_add = -player[c2].x_add;
451 if (player[c1].x_add > 0)
452 player[c2].x = player[c1].x - (12L << 16);
453 else if (player[c2].x_add < 0)
454 player[c1].x = player[c2].x + (12L << 16);
456 player[c1].x -= player[c1].x_add;
457 player[c2].x -= player[c2].x_add;
459 l1 = player[c2].x_add;
460 player[c2].x_add = player[c1].x_add;
461 player[c1].x_add = l1;
462 if (player[c1].x_add < 0)
463 player[c1].x_add = -player[c1].x_add;
464 if (player[c2].x_add > 0)
465 player[c2].x_add = -player[c2].x_add;
474 main_info.page_info[main_info.draw_page].num_pobs = 0;
475 for (c1 = 0; c1 < 4; c1++) {
476 if (player[c1].enabled == 1)
477 main_info.page_info[main_info.draw_page].num_pobs++;
484 /* get center of fly swarm */
486 for (c1 = 0; c1 < NUM_FLIES; c1++) {
493 /* get closest player to fly swarm */
495 for (c1 = 0; c1 < 4; c1++) {
496 if (player[c1].enabled == 1) {
497 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)));
498 if (cur_dist < dist) {
504 /* update fly swarm sound */
508 dj_set_sfx_channel_volume(4, (char)(s3));
510 for (c1 = 0; c1 < NUM_FLIES; c1++) {
511 /* get closest player to fly */
513 for (c2 = 0; c2 < 4; c2++) {
514 if (player[c2].enabled == 1) {
515 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)));
516 if (cur_dist < dist) {
522 flies[c1].old_x = flies[c1].x;
523 flies[c1].old_y = flies[c1].y;
525 if ((s1 - flies[c1].x) > 30)
527 else if ((s1 - flies[c1].x) < -30)
530 if (((player[closest_player].x >> 16) + 8) > flies[c1].x) {
531 if (lord_of_the_flies == 0)
536 if (lord_of_the_flies == 0)
542 s4 = rnd(3) - 1 + s3;
543 if ((flies[c1].x + s4) < 16)
545 if ((flies[c1].x + s4) > 351)
547 if (ban_map[flies[c1].y >> 4][(flies[c1].x + s4) >> 4] != BAN_VOID)
551 if ((s2 - flies[c1].y) > 30)
553 else if ((s2 - flies[c1].y) < -30)
556 if (((player[closest_player].y >> 16) + 8) > flies[c1].y) {
557 if (lord_of_the_flies == 0)
562 if (lord_of_the_flies == 0)
568 s4 = rnd(3) - 1 + s3;
569 if ((flies[c1].y + s4) < 0)
571 if ((flies[c1].y + s4) > 239)
573 if (ban_map[(flies[c1].y + s4) >> 4][flies[c1].x >> 4] != BAN_VOID)
581 for (c1 = 0; c1 < 4; c1++) {
582 if (player[c1].enabled == 1) {
583 main_info.page_info[main_info.draw_page].pobs[s1].x = player[c1].x >> 16;
584 main_info.page_info[main_info.draw_page].pobs[s1].y = player[c1].y >> 16;
585 main_info.page_info[main_info.draw_page].pobs[s1].image = player[c1].image + c1 * 18;
586 main_info.page_info[main_info.draw_page].pobs[s1].pob_data = &rabbit_gobs;
593 draw_pobs(main_info.draw_page);
597 draw_flies(main_info.draw_page);
601 if (mod_fade_direction == 1) {
604 dj_set_mod_volume((char)mod_vol);
609 dj_set_mod_volume((char)mod_vol);
613 if (mod_fade_direction == 1) {
616 dj_set_sfx_volume((char)sfx_vol);
621 dj_set_sfx_volume((char)sfx_vol);
626 for (c1 = 0; c1 < 768; c1++) {
627 if (cur_pal[c1] < pal[c1]) {
630 } else if (cur_pal[c1] > pal[c1]) {
635 if (fade_flag == 0 && end_loop_flag == 1)
638 main_info.draw_page ^= 1;
639 main_info.view_page ^= 1;
641 flippage(main_info.view_page);
646 setpalette(0, 256, cur_pal);
650 redraw_flies_background(main_info.draw_page);
652 redraw_pob_backgrounds(main_info.draw_page);
654 draw_leftovers(main_info.draw_page);
662 main_info.view_page = 0;
663 main_info.draw_page = 1;
665 dj_stop_sfx_channel(4);
669 memset(mask_pic, 0, 102400L);
670 register_mask(mask_pic);
672 //recalculate_gob(&font_gobs, pal);
673 register_background(NULL, NULL);
677 put_text(main_info.view_page, 100, 50, "DOTT", 2);
678 put_text(main_info.view_page, 160, 50, "JIFFY", 2);
679 put_text(main_info.view_page, 220, 50, "FIZZ", 2);
680 put_text(main_info.view_page, 280, 50, "MIJJI", 2);
681 put_text(main_info.view_page, 40, 80, "DOTT", 2);
682 put_text(main_info.view_page, 40, 110, "JIFFY", 2);
683 put_text(main_info.view_page, 40, 140, "FIZZ", 2);
684 put_text(main_info.view_page, 40, 170, "MIJJI", 2);
686 for (c1 = 0; c1 < 4; c1++) {
687 for (c2 = 0; c2 < 4; c2++) {
689 sprintf(str1, "%d", player[c1].bumped[c2]);
690 put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, str1, 2);
692 put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, "-", 2);
694 sprintf(str1, "%d", player[c1].bumps);
695 put_text(main_info.view_page, 350, 80 + c1 * 30, str1, 2);
698 put_text(main_info.view_page, 200, 230, "Press ESC to continue", 2);
702 flippage(main_info.view_page);
704 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
705 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
708 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
709 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
714 memset(cur_pal, 0, 768);
716 setpalette(0, 256, cur_pal);
719 dj_ready_mod(MOD_SCORES);
720 dj_set_mod_volume((char)mod_vol);
724 while (key_pressed(1) == 0) {
727 dj_set_mod_volume((char)mod_vol);
728 for (c1 = 0; c1 < 768; c1++) {
729 if (cur_pal[c1] < pal[c1])
735 setpalette(0, 256, cur_pal);
736 flippage(main_info.view_page);
738 while (key_pressed(1) == 1) {
745 while (mod_vol > 0) {
747 dj_set_mod_volume((char)mod_vol);
748 for (c1 = 0; c1 < 768; c1++) {
749 if (cur_pal[c1] > pal[c1])
754 setpalette(0, 256, cur_pal);
755 flippage(main_info.view_page);
758 fillpalette(0, 0, 0);
771 void steer_players(void)
776 update_player_actions();
778 for (c1 = 0; c1 < 4; c1++) {
780 if (player[c1].enabled == 1) {
782 if (player[c1].dead_flag == 0) {
784 if (player[c1].action_left && player[c1].action_right) {
785 if (player[c1].direction == 0) {
786 if (player[c1].action_right) {
787 s1 = (player[c1].x >> 16);
788 s2 = (player[c1].y >> 16);
789 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
790 if (player[c1].x_add < 0)
791 player[c1].x_add += 1024;
793 player[c1].x_add += 768;
794 } 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)) {
795 if (player[c1].x_add > 0)
796 player[c1].x_add += 1024;
798 player[c1].x_add += 768;
800 if (player[c1].x_add < 0) {
801 player[c1].x_add += 16384;
802 if (player[c1].x_add < 98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
803 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);
805 player[c1].x_add += 12288;
807 if (player[c1].x_add > 98304L)
808 player[c1].x_add = 98304L;
809 player[c1].direction = 0;
810 if (player[c1].anim == 0) {
812 player[c1].frame = 0;
813 player[c1].frame_tick = 0;
814 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
818 if (player[c1].action_left) {
819 s1 = (player[c1].x >> 16);
820 s2 = (player[c1].y >> 16);
821 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
822 if (player[c1].x_add > 0)
823 player[c1].x_add -= 1024;
825 player[c1].x_add -= 768;
826 } 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)) {
827 if (player[c1].x_add > 0)
828 player[c1].x_add -= 1024;
830 player[c1].x_add -= 768;
832 if (player[c1].x_add > 0) {
833 player[c1].x_add -= 16384;
834 if (player[c1].x_add > -98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
835 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);
837 player[c1].x_add -= 12288;
839 if (player[c1].x_add < -98304L)
840 player[c1].x_add = -98304L;
841 player[c1].direction = 1;
842 if (player[c1].anim == 0) {
844 player[c1].frame = 0;
845 player[c1].frame_tick = 0;
846 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
850 } else if (player[c1].action_left) {
851 s1 = (player[c1].x >> 16);
852 s2 = (player[c1].y >> 16);
853 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
854 if (player[c1].x_add > 0)
855 player[c1].x_add -= 1024;
857 player[c1].x_add -= 768;
858 } 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)) {
859 if (player[c1].x_add > 0)
860 player[c1].x_add -= 1024;
862 player[c1].x_add -= 768;
864 if (player[c1].x_add > 0) {
865 player[c1].x_add -= 16384;
866 if (player[c1].x_add > -98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
867 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);
869 player[c1].x_add -= 12288;
871 if (player[c1].x_add < -98304L)
872 player[c1].x_add = -98304L;
873 player[c1].direction = 1;
874 if (player[c1].anim == 0) {
876 player[c1].frame = 0;
877 player[c1].frame_tick = 0;
878 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
880 } else if (player[c1].action_right) {
881 s1 = (player[c1].x >> 16);
882 s2 = (player[c1].y >> 16);
883 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_ICE) {
884 if (player[c1].x_add < 0)
885 player[c1].x_add += 1024;
887 player[c1].x_add += 768;
888 } 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)) {
889 if (player[c1].x_add > 0)
890 player[c1].x_add += 1024;
892 player[c1].x_add += 768;
894 if (player[c1].x_add < 0) {
895 player[c1].x_add += 16384;
896 if (player[c1].x_add < 98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
897 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);
899 player[c1].x_add += 12288;
901 if (player[c1].x_add > 98304L)
902 player[c1].x_add = 98304L;
903 player[c1].direction = 0;
904 if (player[c1].anim == 0) {
906 player[c1].frame = 0;
907 player[c1].frame_tick = 0;
908 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
910 } else if ((!player[c1].action_left) && (!player[c1].action_right)) {
911 s1 = (player[c1].x >> 16);
912 s2 = (player[c1].y >> 16);
913 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)))) {
914 if (player[c1].x_add < 0) {
915 player[c1].x_add += 16384;
916 if (player[c1].x_add > 0)
917 player[c1].x_add = 0;
919 player[c1].x_add -= 16384;
920 if (player[c1].x_add < 0)
921 player[c1].x_add = 0;
923 if (player[c1].x_add != 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == BAN_SOLID)
924 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);
926 if (player[c1].anim == 1) {
928 player[c1].frame = 0;
929 player[c1].frame_tick = 0;
930 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
934 if (pogostick == 1 || (player[c1].jump_ready == 1 && player[c1].action_up)) {
935 s1 = (player[c1].x >> 16);
936 s2 = (player[c1].y >> 16);
939 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) {
940 player[c1].y_add = -280000L;
942 player[c1].frame = 0;
943 player[c1].frame_tick = 0;
944 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
945 player[c1].jump_ready = 0;
946 player[c1].jump_abort = 1;
948 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
950 dj_play_sfx(SFX_SPRING, (unsigned short)(SFX_SPRING_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
952 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)) {
953 player[c1].y_add = -196608L;
954 player[c1].in_water = 0;
956 player[c1].frame = 0;
957 player[c1].frame_tick = 0;
958 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
959 player[c1].jump_ready = 0;
960 player[c1].jump_abort = 1;
962 dj_play_sfx(SFX_JUMP, (unsigned short)(SFX_JUMP_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
964 dj_play_sfx(SFX_SPRING, (unsigned short)(SFX_SPRING_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
967 if (pogostick == 0 && (!player[c1].action_up)) {
968 player[c1].jump_ready = 1;
969 if (player[c1].in_water == 0 && player[c1].y_add < 0 && player[c1].jump_abort == 1) {
970 if (bunnies_in_space == 0)
971 player[c1].y_add += 32768;
973 player[c1].y_add += 16384;
974 if (player[c1].y_add > 0)
975 player[c1].y_add = 0;
980 if (player[c1].action_up) {
981 player[c1].y_add -= 16384;
982 if (player[c1].y_add < -400000L)
983 player[c1].y_add = -400000L;
984 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))
985 player[c1].in_water = 0;
987 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);
992 player[c1].x += player[c1].x_add;
993 if ((player[c1].x >> 16) < 0) {
995 player[c1].x_add = 0;
997 if ((player[c1].x >> 16) + 15 > 351) {
998 player[c1].x = 336L << 16;
999 player[c1].x_add = 0;
1001 if (player[c1].y > 0) {
1002 s1 = (player[c1].x >> 16);
1003 s2 = (player[c1].y >> 16);
1004 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) {
1005 player[c1].x = (((s1 + 16) & 0xfff0)) << 16;
1006 player[c1].x_add = 0;
1008 s1 = (player[c1].x >> 16);
1009 s2 = (player[c1].y >> 16);
1010 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) {
1011 player[c1].x = (((s1 + 16) & 0xfff0) - 16) << 16;
1012 player[c1].x_add = 0;
1015 s1 = (player[c1].x >> 16);
1017 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) {
1018 player[c1].x = (((s1 + 16) & 0xfff0)) << 16;
1019 player[c1].x_add = 0;
1021 s1 = (player[c1].x >> 16);
1023 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) {
1024 player[c1].x = (((s1 + 16) & 0xfff0) - 16) << 16;
1025 player[c1].x_add = 0;
1029 player[c1].y += player[c1].y_add;
1031 s1 = (player[c1].x >> 16);
1032 s2 = (player[c1].y >> 16);
1033 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))) {
1034 player[c1].y = ((player[c1].y >> 16) & 0xfff0) << 16;
1035 player[c1].y_add = -400000L;
1036 player[c1].anim = 2;
1037 player[c1].frame = 0;
1038 player[c1].frame_tick = 0;
1039 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1040 player[c1].jump_ready = 0;
1041 player[c1].jump_abort = 0;
1042 for (c2 = 0; c2 < NUM_OBJECTS; c2++) {
1043 if (objects[c2].used == 1 && objects[c2].type == OBJ_SPRING) {
1044 if (ban_map[(s2 + 15) >> 4][(s1 + 8) >> 4] == BAN_SPRING) {
1045 if ((objects[c2].x >> 20) == ((s1 + 8) >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
1046 objects[c2].frame = 0;
1047 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
1048 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
1052 if (ban_map[(s2 + 15) >> 4][s1 >> 4] == BAN_SPRING) {
1053 if ((objects[c2].x >> 20) == (s1 >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
1054 objects[c2].frame = 0;
1055 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
1056 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
1059 } else if (ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == BAN_SPRING) {
1060 if ((objects[c2].x >> 20) == ((s1 + 15) >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
1061 objects[c2].frame = 0;
1062 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
1063 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
1070 dj_play_sfx(SFX_SPRING, (unsigned short)(SFX_SPRING_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
1072 s1 = (player[c1].x >> 16);
1073 s2 = (player[c1].y >> 16);
1076 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) {
1077 player[c1].y = (((s2 + 16) & 0xfff0)) << 16;
1078 player[c1].y_add = 0;
1079 player[c1].anim = 0;
1080 player[c1].frame = 0;
1081 player[c1].frame_tick = 0;
1082 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1084 s1 = (player[c1].x >> 16);
1085 s2 = (player[c1].y >> 16);
1088 if (ban_map[(s2 + 8) >> 4][(s1 + 8) >> 4] == BAN_WATER) {
1089 if (player[c1].in_water == 0) {
1090 player[c1].in_water = 1;
1091 player[c1].anim = 4;
1092 player[c1].frame = 0;
1093 player[c1].frame_tick = 0;
1094 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1095 if (player[c1].y_add >= 32768) {
1096 add_object(OBJ_SPLASH, (player[c1].x >> 16) + 8, ((player[c1].y >> 16) & 0xfff0) + 15, 0, 0, OBJ_ANIM_SPLASH, 0);
1097 if (blood_is_thicker_than_water == 0)
1098 dj_play_sfx(SFX_SPLASH, (unsigned short)(SFX_SPLASH_FREQ + rnd(2000) - 1000), 64, 0, 0, -1);
1100 dj_play_sfx(SFX_SPLASH, (unsigned short)(SFX_SPLASH_FREQ + rnd(2000) - 5000), 64, 0, 0, -1);
1103 player[c1].y_add -= 1536;
1104 if (player[c1].y_add < 0 && player[c1].anim != 5) {
1105 player[c1].anim = 5;
1106 player[c1].frame = 0;
1107 player[c1].frame_tick = 0;
1108 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1110 if (player[c1].y_add < -65536L)
1111 player[c1].y_add = -65536L;
1112 if (player[c1].y_add > 65535L)
1113 player[c1].y_add = 65535L;
1114 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) {
1115 player[c1].y = (((s2 + 16) & 0xfff0) - 16) << 16;
1116 player[c1].y_add = 0;
1118 } 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) {
1119 player[c1].in_water = 0;
1120 player[c1].y = (((s2 + 16) & 0xfff0) - 16) << 16;
1121 player[c1].y_add = 0;
1122 if (player[c1].anim != 0 && player[c1].anim != 1) {
1123 player[c1].anim = 0;
1124 player[c1].frame = 0;
1125 player[c1].frame_tick = 0;
1126 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1129 if (player[c1].in_water == 0) {
1130 if (bunnies_in_space == 0)
1131 player[c1].y_add += 12288;
1133 player[c1].y_add += 6144;
1134 if (player[c1].y_add > 327680L)
1135 player[c1].y_add = 327680L;
1137 player[c1].y = (player[c1].y & 0xffff0000) + 0x10000;
1138 player[c1].y_add = 0;
1140 player[c1].in_water = 0;
1142 if (player[c1].y_add > 36864 && player[c1].anim != 3 && player[c1].in_water == 0) {
1143 player[c1].anim = 3;
1144 player[c1].frame = 0;
1145 player[c1].frame_tick = 0;
1146 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1151 player[c1].frame_tick++;
1152 if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
1154 if (player[c1].frame >= player_anims[player[c1].anim].num_frames) {
1155 if (player[c1].anim != 6)
1156 player[c1].frame = player_anims[player[c1].anim].restart_frame;
1158 position_player(c1);
1160 player[c1].frame_tick = 0;
1162 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1171 void position_player(int player_num)
1180 if (ban_map[s2][s1] == BAN_VOID && (ban_map[s2 + 1][s1] == BAN_SOLID || ban_map[s2 + 1][s1] == BAN_ICE))
1183 for (c1 = 0; c1 < 4; c1++) {
1184 if (c1 != player_num && player[c1].enabled == 1) {
1185 if (abs((s1 << 4) - (player[c1].x >> 16)) < 32 && abs((s2 << 4) - (player[c1].y >> 16)) < 32)
1190 player[player_num].dead_flag = 0;
1191 player[player_num].x = (long) s1 << 20;
1192 player[player_num].y = (long) s2 << 20;
1193 player[player_num].x_add = player[player_num].y_add = 0;
1194 player[player_num].direction = 0;
1195 player[player_num].jump_ready = 1;
1196 player[player_num].in_water = 0;
1197 player[player_num].anim = 0;
1198 player[player_num].frame = 0;
1199 player[player_num].frame_tick = 0;
1200 player[player_num].image = player_anims[player[player_num].anim].frame[player[player_num].frame].image;
1208 void add_object(int type, int x, int y, int x_add, int y_add, int anim, int frame)
1212 for (c1 = 0; c1 < NUM_OBJECTS; c1++) {
1213 if (objects[c1].used == 0) {
1214 objects[c1].used = 1;
1215 objects[c1].type = type;
1216 objects[c1].x = (long) x << 16;
1217 objects[c1].y = (long) y << 16;
1218 objects[c1].x_add = x_add;
1219 objects[c1].y_add = y_add;
1220 objects[c1].x_acc = 0;
1221 objects[c1].y_acc = 0;
1222 objects[c1].anim = anim;
1223 objects[c1].frame = frame;
1224 objects[c1].ticks = object_anims[anim].frame[frame].ticks;
1225 objects[c1].image = object_anims[anim].frame[frame].image;
1233 void update_objects(void)
1238 for (c1 = 0; c1 < NUM_OBJECTS; c1++) {
1239 if (objects[c1].used == 1) {
1240 switch (objects[c1].type) {
1242 objects[c1].ticks--;
1243 if (objects[c1].ticks <= 0) {
1244 objects[c1].frame++;
1245 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames) {
1246 objects[c1].frame--;
1247 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1249 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1250 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1253 if (objects[c1].used == 1)
1254 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1257 objects[c1].ticks--;
1258 if (objects[c1].ticks <= 0) {
1259 objects[c1].frame++;
1260 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1261 objects[c1].used = 0;
1263 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1264 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1267 if (objects[c1].used == 1)
1268 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1271 objects[c1].x += objects[c1].x_add;
1272 objects[c1].y += objects[c1].y_add;
1273 objects[c1].ticks--;
1274 if (objects[c1].ticks <= 0) {
1275 objects[c1].frame++;
1276 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1277 objects[c1].used = 0;
1279 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1280 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1283 if (objects[c1].used == 1)
1284 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1286 case OBJ_YEL_BUTFLY:
1287 case OBJ_PINK_BUTFLY:
1288 objects[c1].x_acc += rnd(128) - 64;
1289 if (objects[c1].x_acc < -1024)
1290 objects[c1].x_acc = -1024;
1291 if (objects[c1].x_acc > 1024)
1292 objects[c1].x_acc = 1024;
1293 objects[c1].x_add += objects[c1].x_acc;
1294 if (objects[c1].x_add < -32768)
1295 objects[c1].x_add = -32768;
1296 if (objects[c1].x_add > 32768)
1297 objects[c1].x_add = 32768;
1298 objects[c1].x += objects[c1].x_add;
1299 if ((objects[c1].x >> 16) < 16) {
1300 objects[c1].x = 16 << 16;
1301 objects[c1].x_add = -objects[c1].x_add >> 2;
1302 objects[c1].x_acc = 0;
1303 } else if ((objects[c1].x >> 16) > 350) {
1304 objects[c1].x = 350 << 16;
1305 objects[c1].x_add = -objects[c1].x_add >> 2;
1306 objects[c1].x_acc = 0;
1308 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0) {
1309 if (objects[c1].x_add < 0) {
1310 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1312 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1314 objects[c1].x_add = -objects[c1].x_add >> 2;
1315 objects[c1].x_acc = 0;
1317 objects[c1].y_acc += rnd(64) - 32;
1318 if (objects[c1].y_acc < -1024)
1319 objects[c1].y_acc = -1024;
1320 if (objects[c1].y_acc > 1024)
1321 objects[c1].y_acc = 1024;
1322 objects[c1].y_add += objects[c1].y_acc;
1323 if (objects[c1].y_add < -32768)
1324 objects[c1].y_add = -32768;
1325 if (objects[c1].y_add > 32768)
1326 objects[c1].y_add = 32768;
1327 objects[c1].y += objects[c1].y_add;
1328 if ((objects[c1].y >> 16) < 0) {
1330 objects[c1].y_add = -objects[c1].y_add >> 2;
1331 objects[c1].y_acc = 0;
1332 } else if ((objects[c1].y >> 16) > 255) {
1333 objects[c1].y = 255 << 16;
1334 objects[c1].y_add = -objects[c1].y_add >> 2;
1335 objects[c1].y_acc = 0;
1337 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0) {
1338 if (objects[c1].y_add < 0) {
1339 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1341 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1343 objects[c1].y_add = -objects[c1].y_add >> 2;
1344 objects[c1].y_acc = 0;
1346 if (objects[c1].type == OBJ_YEL_BUTFLY) {
1347 if (objects[c1].x_add < 0 && objects[c1].anim != OBJ_ANIM_YEL_BUTFLY_LEFT) {
1348 objects[c1].anim = OBJ_ANIM_YEL_BUTFLY_LEFT;
1349 objects[c1].frame = 0;
1350 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1351 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1352 } else if (objects[c1].x_add > 0 && objects[c1].anim != OBJ_ANIM_YEL_BUTFLY_RIGHT) {
1353 objects[c1].anim = OBJ_ANIM_YEL_BUTFLY_RIGHT;
1354 objects[c1].frame = 0;
1355 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1356 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1359 if (objects[c1].x_add < 0 && objects[c1].anim != OBJ_ANIM_PINK_BUTFLY_LEFT) {
1360 objects[c1].anim = OBJ_ANIM_PINK_BUTFLY_LEFT;
1361 objects[c1].frame = 0;
1362 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1363 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1364 } else if (objects[c1].x_add > 0 && objects[c1].anim != OBJ_ANIM_PINK_BUTFLY_RIGHT) {
1365 objects[c1].anim = OBJ_ANIM_PINK_BUTFLY_RIGHT;
1366 objects[c1].frame = 0;
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 objects[c1].ticks--;
1372 if (objects[c1].ticks <= 0) {
1373 objects[c1].frame++;
1374 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1375 objects[c1].frame = object_anims[objects[c1].anim].restart_frame;
1377 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1378 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1381 if (objects[c1].used == 1)
1382 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1386 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 0);
1387 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 0) {
1388 objects[c1].y_add += 3072;
1389 if (objects[c1].y_add > 196608L)
1390 objects[c1].y_add = 196608L;
1391 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 2) {
1392 if (objects[c1].x_add < 0) {
1393 if (objects[c1].x_add < -65536L)
1394 objects[c1].x_add = -65536L;
1395 objects[c1].x_add += 1024;
1396 if (objects[c1].x_add > 0)
1397 objects[c1].x_add = 0;
1399 if (objects[c1].x_add > 65536L)
1400 objects[c1].x_add = 65536L;
1401 objects[c1].x_add -= 1024;
1402 if (objects[c1].x_add < 0)
1403 objects[c1].x_add = 0;
1405 objects[c1].y_add += 1024;
1406 if (objects[c1].y_add < -65536L)
1407 objects[c1].y_add = -65536L;
1408 if (objects[c1].y_add > 65536L)
1409 objects[c1].y_add = 65536L;
1411 objects[c1].x += objects[c1].x_add;
1412 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)) {
1413 if (objects[c1].x_add < 0) {
1414 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1415 objects[c1].x_add = -objects[c1].x_add >> 2;
1417 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1418 objects[c1].x_add = -objects[c1].x_add >> 2;
1421 objects[c1].y += objects[c1].y_add;
1422 if ((objects[c1].x >> 16) < -5 || (objects[c1].x >> 16) > 405 || (objects[c1].y >> 16) > 260)
1423 objects[c1].used = 0;
1424 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0)) {
1425 if (objects[c1].y_add < 0) {
1426 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 2) {
1427 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1428 objects[c1].x_add >>= 2;
1429 objects[c1].y_add = -objects[c1].y_add >> 2;
1432 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1) {
1433 if (objects[c1].y_add > 131072L) {
1434 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1435 objects[c1].x_add >>= 2;
1436 objects[c1].y_add = -objects[c1].y_add >> 2;
1438 objects[c1].used = 0;
1439 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3) {
1440 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1441 if (objects[c1].y_add > 131072L)
1442 objects[c1].y_add = -objects[c1].y_add >> 2;
1444 objects[c1].y_add = 0;
1448 if (objects[c1].x_add < 0 && objects[c1].x_add > -16384)
1449 objects[c1].x_add = -16384;
1450 if (objects[c1].x_add > 0 && objects[c1].x_add < 16384)
1451 objects[c1].x_add = 16384;
1452 if (objects[c1].used == 1) {
1453 s1 = (int)(atan2(objects[c1].y_add, objects[c1].x_add) * 4 / M_PI);
1460 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].frame + s1, &object_gobs);
1464 if (rnd(100) < 30) {
1465 if (objects[c1].frame == 76)
1466 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 1);
1467 else if (objects[c1].frame == 77)
1468 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 2);
1469 else if (objects[c1].frame == 78)
1470 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 3);
1472 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 0) {
1473 objects[c1].y_add += 3072;
1474 if (objects[c1].y_add > 196608L)
1475 objects[c1].y_add = 196608L;
1476 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 2) {
1477 if (objects[c1].x_add < 0) {
1478 if (objects[c1].x_add < -65536L)
1479 objects[c1].x_add = -65536L;
1480 objects[c1].x_add += 1024;
1481 if (objects[c1].x_add > 0)
1482 objects[c1].x_add = 0;
1484 if (objects[c1].x_add > 65536L)
1485 objects[c1].x_add = 65536L;
1486 objects[c1].x_add -= 1024;
1487 if (objects[c1].x_add < 0)
1488 objects[c1].x_add = 0;
1490 objects[c1].y_add += 1024;
1491 if (objects[c1].y_add < -65536L)
1492 objects[c1].y_add = -65536L;
1493 if (objects[c1].y_add > 65536L)
1494 objects[c1].y_add = 65536L;
1496 objects[c1].x += objects[c1].x_add;
1497 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)) {
1498 if (objects[c1].x_add < 0) {
1499 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1500 objects[c1].x_add = -objects[c1].x_add >> 2;
1502 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1503 objects[c1].x_add = -objects[c1].x_add >> 2;
1506 objects[c1].y += objects[c1].y_add;
1507 if ((objects[c1].x >> 16) < -5 || (objects[c1].x >> 16) > 405 || (objects[c1].y >> 16) > 260)
1508 objects[c1].used = 0;
1509 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0)) {
1510 if (objects[c1].y_add < 0) {
1511 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 2) {
1512 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1513 objects[c1].x_add >>= 2;
1514 objects[c1].y_add = -objects[c1].y_add >> 2;
1517 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1) {
1518 if (objects[c1].y_add > 131072L) {
1519 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1520 objects[c1].x_add >>= 2;
1521 objects[c1].y_add = -objects[c1].y_add >> 2;
1523 if (rnd(100) < 10) {
1525 add_leftovers(0, objects[c1].x >> 16, (objects[c1].y >> 16) + s1, objects[c1].frame, &object_gobs);
1526 add_leftovers(1, objects[c1].x >> 16, (objects[c1].y >> 16) + s1, objects[c1].frame, &object_gobs);
1528 objects[c1].used = 0;
1530 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3) {
1531 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1532 if (objects[c1].y_add > 131072L)
1533 objects[c1].y_add = -objects[c1].y_add >> 2;
1535 objects[c1].y_add = 0;
1539 if (objects[c1].x_add < 0 && objects[c1].x_add > -16384)
1540 objects[c1].x_add = -16384;
1541 if (objects[c1].x_add > 0 && objects[c1].x_add < 16384)
1542 objects[c1].x_add = 16384;
1543 if (objects[c1].used == 1)
1544 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].frame, &object_gobs);
1546 case OBJ_FLESH_TRACE:
1547 objects[c1].ticks--;
1548 if (objects[c1].ticks <= 0) {
1549 objects[c1].frame++;
1550 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1551 objects[c1].used = 0;
1553 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1554 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1557 if (objects[c1].used == 1)
1558 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, &object_gobs);
1567 int add_pob(int page, int x, int y, int image, gob_t *pob_data)
1570 if (main_info.page_info[page].num_pobs >= NUM_POBS)
1573 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].x = x;
1574 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].y = y;
1575 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].image = image;
1576 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].pob_data = pob_data;
1577 main_info.page_info[page].num_pobs++;
1584 void draw_flies(int page)
1588 for (c2 = 0; c2 < NUM_FLIES; c2++) {
1589 flies[c2].back[main_info.draw_page] = get_pixel(main_info.draw_page, flies[c2].x, flies[c2].y);
1590 flies[c2].back_defined[main_info.draw_page] = 1;
1591 if (mask_pic[(flies[c2].y * JNB_WIDTH) + flies[c2].x] == 0)
1592 set_pixel(main_info.draw_page, flies[c2].x, flies[c2].y, 0);
1596 void draw_pobs(int page)
1603 for (c1 = main_info.page_info[page].num_pobs - 1; c1 >= 0; c1--) {
1604 main_info.page_info[page].pobs[c1].back_buf_ofs = back_buf_ofs;
1605 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]);
1607 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;
1609 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);
1611 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);
1617 void redraw_flies_background(int page)
1621 for (c2 = NUM_FLIES - 1; c2 >= 0; c2--) {
1622 if (flies[c2].back_defined[page] == 1)
1623 set_pixel(page, flies[c2].old_x, flies[c2].old_y, flies[c2].back[page]);
1628 void redraw_pob_backgrounds(int page)
1632 for (c1 = 0; c1 < main_info.page_info[page].num_pobs; c1++)
1633 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]);
1638 int add_leftovers(int page, int x, int y, int image, gob_t *pob_data)
1641 if (leftovers.page[page].num_pobs >= NUM_LEFTOVERS)
1644 leftovers.page[page].pobs[leftovers.page[page].num_pobs].x = x;
1645 leftovers.page[page].pobs[leftovers.page[page].num_pobs].y = y;
1646 leftovers.page[page].pobs[leftovers.page[page].num_pobs].image = image;
1647 leftovers.page[page].pobs[leftovers.page[page].num_pobs].pob_data = pob_data;
1648 leftovers.page[page].num_pobs++;
1655 void draw_leftovers(int page)
1659 for (c1 = leftovers.page[page].num_pobs - 1; c1 >= 0; c1--)
1660 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);
1662 leftovers.page[page].num_pobs = 0;
1667 int init_level(int level, char *pal)
1673 if ((handle = dat_open("level.pcx", datfile_name, "rb")) == 0) {
1674 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
1677 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
1678 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
1682 if ((handle = dat_open("mask.pcx", datfile_name, "rb")) == 0) {
1683 strcpy(main_info.error_str, "Error loading 'mask.pcx', aborting...\n");
1686 if (read_pcx(handle, mask_pic, 102400L, 0) != 0) {
1687 strcpy(main_info.error_str, "Error loading 'mask.pcx', aborting...\n");
1691 register_mask(mask_pic);
1693 for (c1 = 0; c1 < 4; c1++) {
1694 if (player[c1].enabled == 1) {
1695 player[c1].bumps = 0;
1696 player[c1].bumped[0] = 0;
1697 player[c1].bumped[1] = 0;
1698 player[c1].bumped[2] = 0;
1699 player[c1].bumped[3] = 0;
1700 position_player(c1);
1704 for (c1 = 0; c1 < NUM_OBJECTS; c1++)
1705 objects[c1].used = 0;
1707 for (c1 = 0; c1 < 16; c1++) {
1708 for (c2 = 0; c2 < 22; c2++) {
1709 if (ban_map[c1][c2] == BAN_SPRING)
1710 add_object(OBJ_SPRING, c2 << 4, c1 << 4, 0, 0, OBJ_ANIM_SPRING, 5);
1717 if (ban_map[s2][s1] == BAN_VOID) {
1718 add_object(OBJ_YEL_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1725 if (ban_map[s2][s1] == BAN_VOID) {
1726 add_object(OBJ_YEL_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1733 if (ban_map[s2][s1] == BAN_VOID) {
1734 add_object(OBJ_PINK_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1741 if (ban_map[s2][s1] == BAN_VOID) {
1742 add_object(OBJ_PINK_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1752 void deinit_level(void)
1759 int init_program(int argc, char *argv[], char *pal)
1761 FILE *handle = (FILE *) NULL;
1766 int player_anim_data[] = {
1767 1, 0, 0, 0x7fff, 0, 0, 0, 0, 0, 0,
1768 4, 0, 0, 4, 1, 4, 2, 4, 3, 4,
1769 1, 0, 4, 0x7fff, 0, 0, 0, 0, 0, 0,
1770 4, 2, 5, 8, 6, 10, 7, 3, 6, 3,
1771 1, 0, 6, 0x7fff, 0, 0, 0, 0, 0, 0,
1772 2, 1, 5, 8, 4, 0x7fff, 0, 0, 0, 0,
1773 1, 0, 8, 5, 0, 0, 0, 0, 0, 0
1777 if (__djgpp_nearptr_enable() == 0)
1783 if (hook_keyb_handler() != 0)
1786 memset(&main_info, 0, sizeof(main_info));
1788 strcpy(datfile_name, "data/jumpbump.dat");
1790 force2 = force3 = 0;
1793 for (c1 = 1; c1 < argc; c1++) {
1794 if (stricmp(argv[c1], "-nosound") == 0)
1795 main_info.no_sound = 1;
1796 else if (stricmp(argv[c1], "-nogore") == 0)
1797 main_info.no_gore = 1;
1798 else if (stricmp(argv[c1], "-nojoy") == 0)
1799 main_info.joy_enabled = 0;
1800 else if (stricmp(argv[c1], "-fireworks") == 0)
1801 main_info.fireworks = 1;
1803 else if (stricmp(argv[c1], "-fullscreen") == 0)
1806 else if (stricmp(argv[c1], "-dat") == 0) {
1807 if (c1 < (argc - 1)) {
1808 if ((handle = fopen(argv[c1 + 1], "rb")) != NULL) {
1810 strcpy(datfile_name, argv[c1 + 1]);
1813 } else if (stricmp(argv[c1], "-mouse") == 0) {
1814 if (c1 < (argc - 1)) {
1815 if (stricmp(argv[c1 + 1], "2") == 0)
1817 if (stricmp(argv[c1 + 1], "3") == 0)
1824 for (c1 = 0; c1 < 7; c1++) {
1825 player_anims[c1].num_frames = player_anim_data[c1 * 10];
1826 player_anims[c1].restart_frame = player_anim_data[c1 * 10 + 1];
1827 for (c2 = 0; c2 < 4; c2++) {
1828 player_anims[c1].frame[c2].image = player_anim_data[c1 * 10 + c2 * 2 + 2];
1829 player_anims[c1].frame[c2].ticks = player_anim_data[c1 * 10 + c2 * 2 + 3];
1833 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
1834 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
1837 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
1838 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
1843 if ((handle = dat_open("rabbit.gob", datfile_name, "rb")) == 0) {
1844 strcpy(main_info.error_str, "Error loading 'rabbit.gob', aborting...\n");
1847 if (register_gob(handle, &rabbit_gobs, dat_filelen("rabbit.gob", datfile_name))) {
1854 if ((handle = dat_open("objects.gob", datfile_name, "rb")) == 0) {
1855 strcpy(main_info.error_str, "Error loading 'objects.gob', aborting...\n");
1858 if (register_gob(handle, &object_gobs, dat_filelen("objects.gob", datfile_name))) {
1865 if ((handle = dat_open("font.gob", datfile_name, "rb")) == 0) {
1866 strcpy(main_info.error_str, "Error loading 'font.gob', aborting...\n");
1869 if (register_gob(handle, &font_gobs, dat_filelen("font.gob", datfile_name))) {
1876 if ((handle = dat_open("numbers.gob", datfile_name, "rb")) == 0) {
1877 strcpy(main_info.error_str, "Error loading 'numbers.gob', aborting...\n");
1880 if (register_gob(handle, &number_gobs, dat_filelen("numbers.gob", datfile_name))) {
1887 if (read_level() != 0) {
1888 strcpy(main_info.error_str, "Error loading 'levelmap.txt', aborting...\n");
1895 if (main_info.no_sound == 0) {
1897 dj_set_mixing_freq(20000);
1901 dj_set_num_sfx_channels(5);
1902 dj_set_sfx_volume(64);
1906 if ((handle = dat_open("jump.mod", datfile_name, "rb")) == 0) {
1907 strcpy(main_info.error_str, "Error loading 'jump.mod', aborting...\n");
1910 if (dj_load_mod(handle, 0, MOD_MENU) != 0) {
1911 strcpy(main_info.error_str, "Error loading 'jump.mod', aborting...\n");
1916 if ((handle = dat_open("bump.mod", datfile_name, "rb")) == 0) {
1917 strcpy(main_info.error_str, "Error loading 'bump.mod', aborting...\n");
1920 if (dj_load_mod(handle, 0, MOD_GAME) != 0) {
1921 strcpy(main_info.error_str, "Error loading 'bump.mod', aborting...\n");
1926 if ((handle = dat_open("scores.mod", datfile_name, "rb")) == 0) {
1927 strcpy(main_info.error_str, "Error loading 'scores.mod', aborting...\n");
1930 if (dj_load_mod(handle, 0, MOD_SCORES) != 0) {
1931 strcpy(main_info.error_str, "Error loading 'scores.mod', aborting...\n");
1936 if ((handle = dat_open("jump.smp", datfile_name, "rb")) == 0) {
1937 strcpy(main_info.error_str, "Error loading 'jump.smp', aborting...\n");
1940 if (dj_load_sfx(handle, 0, dat_filelen("jump.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_JUMP) != 0) {
1941 strcpy(main_info.error_str, "Error loading 'jump.smp', aborting...\n");
1946 if ((handle = dat_open("death.smp", datfile_name, "rb")) == 0) {
1947 strcpy(main_info.error_str, "Error loading 'death.smp', aborting...\n");
1950 if (dj_load_sfx(handle, 0, dat_filelen("death.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_DEATH) != 0) {
1951 strcpy(main_info.error_str, "Error loading 'death.smp', aborting...\n");
1956 if ((handle = dat_open("spring.smp", datfile_name, "rb")) == 0) {
1957 strcpy(main_info.error_str, "Error loading 'spring.smp', aborting...\n");
1960 if (dj_load_sfx(handle, 0, dat_filelen("spring.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_SPRING) != 0) {
1961 strcpy(main_info.error_str, "Error loading 'spring.smp', aborting...\n");
1966 if ((handle = dat_open("splash.smp", datfile_name, "rb")) == 0) {
1967 strcpy(main_info.error_str, "Error loading 'splash.smp', aborting...\n");
1970 if (dj_load_sfx(handle, 0, dat_filelen("splash.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_SPLASH) != 0) {
1971 strcpy(main_info.error_str, "Error loading 'splash.smp', aborting...\n");
1976 if ((handle = dat_open("fly.smp", datfile_name, "rb")) == 0) {
1977 strcpy(main_info.error_str, "Error loading 'fly.smp', aborting...\n");
1980 if (dj_load_sfx(handle, 0, dat_filelen("fly.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_FLY) != 0) {
1981 strcpy(main_info.error_str, "Error loading 'fly.smp', aborting...\n");
1986 dj_get_sfx_settings(SFX_FLY, &fly);
1988 fly.default_freq = SFX_FLY_FREQ;
1991 fly.loop_length = fly.length;
1992 dj_set_sfx_settings(SFX_FLY, &fly);
1995 if ((background_pic = malloc(102400)) == NULL)
1997 if ((mask_pic = malloc(102400)) == NULL)
1999 memset(mask_pic, 0, 102400);
2000 register_mask(mask_pic);
2002 setpalette(0, 256, pal);
2006 recalculate_gob(&font_gobs, pal);
2008 if (main_info.joy_enabled == 1 && main_info.fireworks == 0) {
2010 put_text(0, 200, 40, "JOYSTICK CALIBRATION", 2);
2011 put_text(0, 200, 100, "Move the joystick to the", 2);
2012 put_text(0, 200, 115, "UPPER LEFT", 2);
2013 put_text(0, 200, 130, "and press button A", 2);
2014 put_text(0, 200, 200, "Or press ESC to use", 2);
2015 put_text(0, 200, 215, "previous settings", 2);
2016 if (calib_joy(0) != 0)
2019 register_background(NULL, NULL);
2021 main_info.view_page = 1;
2026 put_text(1, 200, 40, "JOYSTICK CALIBRATION", 2);
2027 put_text(1, 200, 100, "Move the joystick to the", 2);
2028 put_text(1, 200, 115, "LOWER RIGHT", 2);
2029 put_text(1, 200, 130, "and press button A", 2);
2030 put_text(1, 200, 200, "Or press ESC to use", 2);
2031 put_text(1, 200, 215, "previous settings", 2);
2032 if (calib_joy(1) != 0)
2035 register_background(NULL, NULL);
2040 put_text(0, 200, 40, "JOYSTICK CALIBRATION", 2);
2041 put_text(0, 200, 100, "Move the joystick to the", 2);
2042 put_text(0, 200, 115, "CENTER", 2);
2043 put_text(0, 200, 130, "and press button A", 2);
2044 put_text(0, 200, 200, "Or press ESC to use", 2);
2045 put_text(0, 200, 215, "previous settings", 2);
2046 if (calib_joy(2) != 0)
2049 if (joy.calib_data.x1 == joy.calib_data.x2)
2050 joy.calib_data.x1 -= 10;
2051 if (joy.calib_data.x3 == joy.calib_data.x2)
2052 joy.calib_data.x3 += 10;
2053 if (joy.calib_data.y1 == joy.calib_data.y2)
2054 joy.calib_data.y1 -= 10;
2055 if (joy.calib_data.y3 == joy.calib_data.y2)
2056 joy.calib_data.y3 += 10;
2061 if (load_flag == 1) {
2062 if ((handle = dat_open("calib.dat", datfile_name, "rb")) == 0) {
2063 strcpy(main_info.error_str, "Error loading 'calib.dat', aborting...\n");
2066 joy.calib_data.x1 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2067 joy.calib_data.x2 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2068 joy.calib_data.x3 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2069 joy.calib_data.y1 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2070 joy.calib_data.y2 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2071 joy.calib_data.y3 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2081 void deinit_program(void)
2088 dj_free_mod(MOD_MENU);
2089 dj_free_mod(MOD_GAME);
2090 dj_free_sfx(SFX_DEATH);
2091 dj_free_sfx(SFX_SPRING);
2092 dj_free_sfx(SFX_SPLASH);
2095 if (background_pic != 0)
2096 free(background_pic);
2100 remove_keyb_handler();
2104 __dpmi_int(0x10, ®s);
2107 if (main_info.error_str[0] != 0) {
2108 printf(main_info.error_str);
2116 unsigned short rnd(unsigned short max)
2118 return (rand() % max);
2122 int read_level(void)
2128 if ((handle = dat_open("levelmap.txt", datfile_name, "rb")) == 0) {
2129 strcpy(main_info.error_str, "Error loading 'levelmap.txt', aborting...\n");
2133 for (c1 = 0; c1 < 16; c1++) {
2134 for (c2 = 0; c2 < 22; c2++) {
2136 chr = fgetc(handle);
2141 if (chr >= '0' && chr <= '4')
2144 ban_map[c1][c2] = chr - '0';
2148 for (c2 = 0; c2 < 22; c2++)
2149 ban_map[16][c2] = BAN_SOLID;
2157 FILE *dat_open(char *file_name, char *dat_name, char *mode)
2165 handle = fopen(dat_name, mode);
2169 memset(name, 0, sizeof(name));
2171 num = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2173 for (c1 = 0; c1 < num; c1++) {
2174 if (!fread(name, 1, 12, handle)) {
2178 if (strnicmp(name, file_name, strlen(file_name)) == 0) {
2179 ofs = fgetc(handle);
2180 ofs += (fgetc(handle) << 8);
2181 ofs += (fgetc(handle) << 16);
2182 ofs += (fgetc(handle) << 24);
2183 fseek(handle, ofs, SEEK_SET);
2186 fseek(handle, 8, SEEK_CUR);
2195 int dat_filelen(char *file_name, char *dat_name)
2203 handle = fopen(dat_name, "rb");
2207 memset(name, 0, sizeof(name));
2209 num = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2211 for (c1 = 0; c1 < num; c1++) {
2212 if (!fread(name, 1, 12, handle)) {
2216 if (strnicmp(name, file_name, strlen(file_name)) == 0) {
2217 fseek(handle, 4, SEEK_CUR);
2218 len = fgetc(handle);
2219 len += (fgetc(handle) << 8);
2220 len += (fgetc(handle) << 16);
2221 len += (fgetc(handle) << 24);
2226 fseek(handle, 8, SEEK_CUR);
2235 int filelength(int handle)
2239 if (fstat(handle, &buf) == -1) {
2240 perror("filelength");
2249 void write_calib_data(void)
2257 if ((handle = fopen(datfile_name, "rb")) == NULL)
2259 len = filelength(fileno(handle));
2260 if ((mem = malloc(len)) == NULL)
2262 fread(mem, 1, len, handle);
2266 num = *(int *) (&mem[0]);
2267 for (c1 = 0; c1 < num; c1++) {
2268 if (strnicmp(&mem[ofs], "calib.dat", strlen("calib.dat")) == 0) {
2269 ofs = *(int *) (&mem[ofs + 12]);
2275 mem[ofs] = joy.calib_data.x1 & 0xff;
2276 mem[ofs + 1] = (joy.calib_data.x1 >> 8) & 0xff;
2277 mem[ofs + 2] = (joy.calib_data.x1 >> 16) & 0xff;
2278 mem[ofs + 3] = (joy.calib_data.x1 >> 24) & 0xff;
2279 mem[ofs + 4] = joy.calib_data.x2 & 0xff;
2280 mem[ofs + 5] = (joy.calib_data.x2 >> 8) & 0xff;
2281 mem[ofs + 6] = (joy.calib_data.x2 >> 16) & 0xff;
2282 mem[ofs + 7] = (joy.calib_data.x2 >> 24) & 0xff;
2283 mem[ofs + 8] = joy.calib_data.x3 & 0xff;
2284 mem[ofs + 9] = (joy.calib_data.x3 >> 8) & 0xff;
2285 mem[ofs + 10] = (joy.calib_data.x3 >> 16) & 0xff;
2286 mem[ofs + 11] = (joy.calib_data.x3 >> 24) & 0xff;
2287 mem[ofs + 12] = joy.calib_data.y1 & 0xff;
2288 mem[ofs + 13] = (joy.calib_data.y1 >> 8) & 0xff;
2289 mem[ofs + 14] = (joy.calib_data.y1 >> 16) & 0xff;
2290 mem[ofs + 15] = (joy.calib_data.y1 >> 24) & 0xff;
2291 mem[ofs + 16] = joy.calib_data.y2 & 0xff;
2292 mem[ofs + 17] = (joy.calib_data.y2 >> 8) & 0xff;
2293 mem[ofs + 18] = (joy.calib_data.y2 >> 16) & 0xff;
2294 mem[ofs + 19] = (joy.calib_data.y2 >> 24) & 0xff;
2295 mem[ofs + 20] = joy.calib_data.y3 & 0xff;
2296 mem[ofs + 21] = (joy.calib_data.y3 >> 8) & 0xff;
2297 mem[ofs + 22] = (joy.calib_data.y3 >> 16) & 0xff;
2298 mem[ofs + 23] = (joy.calib_data.y3 >> 24) & 0xff;
2300 if ((handle = fopen(datfile_name, "wb")) == NULL)
2302 fwrite(mem, 1, len, handle);