12 char 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
39 6, 0, 0, 3, 1, 3, 2, 3, 3, 3, 4, 3, 5, 3, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 6, 2, 7, 2, 8, 2, 9, 2, 10, 2, 11, 2, 12, 2, 13, 2, 14, 2, 0, 0, 5, 0, 15, 3, 16, 3, 16, 3, 17, 3, 18, 3, 19, 3, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 20, 2, 21, 2, 22, 2, 23, 2, 24, 2, 25, 2, 24, 2, 23, 2, 22, 2, 21, 2, 10, 0, 26, 2, 27, 2, 28, 2, 29, 2, 30, 2, 31, 2, 30, 2, 29, 2, 28, 2, 27, 2, 10, 0, 32, 2, 33, 2, 34, 2, 35, 2, 36, 2, 37, 2, 36, 2, 35, 2, 34, 2, 33, 2, 10, 0, 38, 2, 39, 2, 40, 2, 41, 2, 42, 2, 43, 2, 42, 2, 41, 2, 40, 2, 39, 2, 4, 0, 76, 4, 77, 4, 78, 4, 79, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
44 char back[2], back_defined[2];
54 } pobs[NUM_LEFTOVERS];
58 char pogostick, bunnies_in_space, jetpack, lord_of_the_flies, blood_is_thicker_than_water;
61 char main(int argc, char *argv[])
67 int closest_player, dist, cur_dist;
68 char end_loop_flag, fade_flag;
69 char mod_vol, sfx_vol, mod_fade_direction;
74 if (init_program(argc, argv) != 0)
77 if (main_info.fireworks == 1) {
87 if (key_pressed(1) == 1)
90 if (init_level(0) != 0) {
96 for (c1 = 0; c1 < 768; c1++)
97 outportb(0x3c9, cur_pal[c1]);
99 for (c1 = 0; c1 < 4; c1++) {
100 outportw(0x3c4, ((1 << c1) << 8) + 0x02);
102 for (l2 = 0; l2 < 25600; l2++) {
103 *(char *) (0xa0000 + l2 + __djgpp_conventional_base) = *(char *) (background_pic + l1);
104 *(char *) (0xa0000 + 32768 + l2 + __djgpp_conventional_base) = *(char *) (background_pic + l1);
111 for (c1 = 0; c1 < NUM_FLIES; c1++) {
113 flies[c1].x = s1 + rnd(101) - 50;
114 flies[c1].y = s2 + rnd(101) - 50;
115 if (ban_map[flies[c1].y >> 4][flies[c1].x >> 4] == 0)
118 flies[c1].back_defined[0] = 0;
119 flies[c1].back_defined[1] = 0;
122 mod_vol = sfx_vol = 10;
123 mod_fade_direction = 1;
124 dj_ready_mod(MOD_GAME);
125 dj_set_mod_volume(mod_vol);
126 dj_set_sfx_volume(mod_vol);
128 dj_play_sfx(SFX_FLY, SFX_FLY_FREQ, 0, 0, 0, 4);
131 lord_of_the_flies = bunnies_in_space = jetpack = pogostick = blood_is_thicker_than_water = 0;
133 main_info.page_info[0].num_pobs = 0;
134 main_info.page_info[1].num_pobs = 0;
135 main_info.view_page = 0;
136 main_info.draw_page = 1;
140 if (key_pressed(1) == 1) {
143 mod_fade_direction = 0;
146 if (strncmp(last_keys, "kcitsogop", strlen("kcitsogop")) == 0) {
150 if (strncmp(last_keys, "ecapsniseinnub", strlen("ecapsniseinnub")) == 0) {
151 bunnies_in_space ^= 1;
154 if (strncmp(last_keys, "kcaptej", strlen("kcaptej")) == 0) {
158 if (strncmp(last_keys, "seilfehtfodrol", strlen("seilfehtfodrol")) == 0) {
159 lord_of_the_flies ^= 1;
162 if (strncmp(last_keys, "retawnahtrekcihtsidoolb", strlen("retawnahtrekcihtsidoolb")) == 0) {
163 blood_is_thicker_than_water ^= 1;
164 if (blood_is_thicker_than_water == 1) {
222 for (c3 = 0; c3 < 6; c3++) {
226 } else if (c3 == 1) {
229 } else if (c3 == 2) {
232 } else if (c3 == 3) {
235 } else if (c3 == 4) {
238 } else if (c3 == 5) {
242 if (player[c1].enabled == 1 && player[c2].enabled == 1) {
243 if (labs(player[c1].x - player[c2].x) < (12L << 16) && labs(player[c1].y - player[c2].y) < (12L << 16)) {
244 if ((labs(player[c1].y - player[c2].y) >> 16) > 5) {
245 if (player[c1].y < player[c2].y) {
246 if (player[c1].y_add >= 0) {
247 player[c1].y_add = -player[c1].y_add;
248 if (player[c1].y_add > -262144L)
249 player[c1].y_add = -262144L;
250 player[c1].jump_abort = 1;
251 player[c2].dead_flag = 1;
252 if (player[c2].anim != 6) {
254 player[c2].frame = 0;
255 player[c2].frame_tick = 0;
256 player[c2].image = player_anims[player[c2].anim].frame[player[c2].frame].image + player[c2].direction * 9;
257 if (main_info.no_gore == 0) {
258 for (c4 = 0; c4 < 6; c4++)
259 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);
260 for (c4 = 0; c4 < 6; c4++)
261 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);
262 for (c4 = 0; c4 < 6; c4++)
263 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);
264 for (c4 = 0; c4 < 8; c4++)
265 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);
266 for (c4 = 0; c4 < 10; c4++)
267 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);
269 dj_play_sfx(SFX_DEATH, SFX_DEATH_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
271 player[c1].bumped[c2]++;
272 s1 = player[c1].bumps % 100;
273 add_leftovers(0, 360, 34 + c1 * 64, s1 / 10, number_gobs);
274 add_leftovers(1, 360, 34 + c1 * 64, s1 / 10, number_gobs);
275 add_leftovers(0, 376, 34 + c1 * 64, s1 - (s1 / 10) * 10, number_gobs);
276 add_leftovers(1, 376, 34 + c1 * 64, s1 - (s1 / 10) * 10, number_gobs);
280 player[c1].y = player[c2].y - (16L << 16);
282 if (player[c2].y_add < 0)
283 player[c2].y_add = 0;
286 if (player[c2].y_add >= 0) {
288 player[c2].y = player[c1].y - (16L << 16);
290 player[c2].y_add = -player[c2].y_add;
291 if (player[c2].y_add > -262144L)
292 player[c2].y_add = -262144L;
293 player[c2].jump_abort = 1;
294 player[c1].dead_flag = 1;
295 if (player[c1].anim != 6) {
297 player[c1].frame = 0;
298 player[c1].frame_tick = 0;
299 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
300 if (main_info.no_gore == 0) {
301 for (c4 = 0; c4 < 6; c4++)
302 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);
303 for (c4 = 0; c4 < 6; c4++)
304 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);
305 for (c4 = 0; c4 < 7; c4++)
306 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);
307 for (c4 = 0; c4 < 8; c4++)
308 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);
309 for (c4 = 0; c4 < 10; c4++)
310 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);
312 dj_play_sfx(SFX_DEATH, SFX_DEATH_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
314 player[c2].bumped[c1]++;
315 s1 = player[c2].bumps % 100;
316 add_leftovers(0, 360, 34 + c2 * 64, s1 / 10, number_gobs);
317 add_leftovers(1, 360, 34 + c2 * 64, s1 / 10, number_gobs);
318 add_leftovers(0, 376, 34 + c2 * 64, s1 - (s1 / 10) * 10, number_gobs);
319 add_leftovers(1, 376, 34 + c2 * 64, s1 - (s1 / 10) * 10, number_gobs);
323 player[c2].y = player[c1].y - (16L << 16);
325 if (player[c1].y_add < 0)
326 player[c1].y_add = 0;
330 if (player[c1].x < player[c2].x) {
331 if (player[c1].x_add > 0)
332 player[c1].x = player[c2].x - (12L << 16);
333 else if (player[c2].x_add < 0)
334 player[c2].x = player[c1].x + (12L << 16);
336 player[c1].x -= player[c1].x_add;
337 player[c2].x -= player[c2].x_add;
339 l1 = player[c2].x_add;
340 player[c2].x_add = player[c1].x_add;
341 player[c1].x_add = l1;
342 if (player[c1].x_add > 0)
343 player[c1].x_add = -player[c1].x_add;
344 if (player[c2].x_add < 0)
345 player[c2].x_add = -player[c2].x_add;
347 if (player[c1].x_add > 0)
348 player[c2].x = player[c1].x - (12L << 16);
349 else if (player[c2].x_add < 0)
350 player[c1].x = player[c2].x + (12L << 16);
352 player[c1].x -= player[c1].x_add;
353 player[c2].x -= player[c2].x_add;
355 l1 = player[c2].x_add;
356 player[c2].x_add = player[c1].x_add;
357 player[c1].x_add = l1;
358 if (player[c1].x_add < 0)
359 player[c1].x_add = -player[c1].x_add;
360 if (player[c2].x_add > 0)
361 player[c2].x_add = -player[c2].x_add;
370 main_info.page_info[main_info.draw_page].num_pobs = 0;
371 for (c1 = 0; c1 < 4; c1++) {
372 if (player[c1].enabled == 1)
373 main_info.page_info[main_info.draw_page].num_pobs++;
381 for (c1 = 0; c1 < NUM_FLIES; c1++) {
389 for (c1 = 0; c1 < 4; c1++) {
390 if (player[c1].enabled == 1) {
391 cur_dist = 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)));
392 if (cur_dist < dist) {
401 dj_set_sfx_channel_volume(4, s3);
403 for (c1 = 0; c1 < NUM_FLIES; c1++) {
405 for (c2 = 0; c2 < 4; c2++) {
406 if (player[c2].enabled == 1) {
407 cur_dist = 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)));
408 if (cur_dist < dist) {
414 flies[c1].old_x = flies[c1].x;
415 flies[c1].old_y = flies[c1].y;
417 if ((s1 - flies[c1].x) > 30)
419 else if ((s1 - flies[c1].x) < -30)
422 if (((player[closest_player].x >> 16) + 8) > flies[c1].x) {
423 if (lord_of_the_flies == 0)
428 if (lord_of_the_flies == 0)
434 s4 = rnd(3) - 1 + s3;
435 if ((flies[c1].x + s4) < 16)
437 if ((flies[c1].x + s4) > 351)
439 if (ban_map[flies[c1].y >> 4][(flies[c1].x + s4) >> 4] != 0)
443 if ((s2 - flies[c1].y) > 30)
445 else if ((s2 - flies[c1].y) < -30)
448 if (((player[closest_player].y >> 16) + 8) > flies[c1].y) {
449 if (lord_of_the_flies == 0)
454 if (lord_of_the_flies == 0)
460 s4 = rnd(3) - 1 + s3;
461 if ((flies[c1].y + s4) < 0)
463 if ((flies[c1].y + s4) > 239)
465 if (ban_map[(flies[c1].y + s4) >> 4][flies[c1].x >> 4] != 0)
473 for (c1 = 0; c1 < 4; c1++) {
474 if (player[c1].enabled == 1) {
475 main_info.page_info[main_info.draw_page].pobs[s1].x = player[c1].x >> 16;
476 main_info.page_info[main_info.draw_page].pobs[s1].y = player[c1].y >> 16;
477 main_info.page_info[main_info.draw_page].pobs[s1].image = player[c1].image + c1 * 18;
478 main_info.page_info[main_info.draw_page].pobs[s1].pob_data = rabbit_gobs;
483 draw_pobs(main_info.draw_page);
487 ptr1 = (char *) (0xa0000 + ((long) main_info.draw_page << 15) - __djgpp_base_address);
488 for (c1 = 0; c1 < 4; c1++) {
489 outportw(0x3ce, (c1 << 8) + 0x04);
490 outportw(0x3c4, ((1 << c1) << 8) + 0x02);
491 for (c2 = 0; c2 < NUM_FLIES; c2++) {
492 if ((flies[c2].x & 3) == c1) {
493 flies[c2].back[main_info.draw_page] = *(char *) (ptr1 + flies[c2].y * 100 + (flies[c2].x >> 2));
494 flies[c2].back_defined[main_info.draw_page] = 1;
495 if (mask_pic[flies[c2].y * 400 + flies[c2].x] == 0)
496 *(char *) (ptr1 + flies[c2].y * 100 + (flies[c2].x >> 2)) = 0;
501 if (mod_fade_direction == 1) {
504 dj_set_mod_volume(mod_vol);
509 dj_set_mod_volume(mod_vol);
513 if (mod_fade_direction == 1) {
516 dj_set_sfx_volume(sfx_vol);
521 dj_set_sfx_volume(sfx_vol);
526 for (c1 = 0; c1 < 768; c1++) {
527 if (cur_pal[c1] < pal[c1]) {
530 } else if (cur_pal[c1] > pal[c1]) {
535 if (fade_flag == 0 && end_loop_flag == 1)
538 main_info.draw_page ^= 1;
539 main_info.view_page ^= 1;
541 outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
542 outportw(0x3d4, ((main_info.view_page << 15) & 0xff00) + 0x0c);
544 while ((inportb(0x3da) & 8) == 0)
546 while ((inportb(0x3da) & 8) == 8)
549 if (fade_flag == 1) {
551 for (c1 = 0; c1 < 768; c1++)
552 outportb(0x3c9, cur_pal[c1]);
555 ptr1 = (char *) (0xa0000 + ((long) main_info.draw_page << 15) - __djgpp_base_address);
556 for (c1 = 0; c1 < 4; c1++) {
557 outportw(0x3c4, ((1 << c1) << 8) + 0x02);
558 for (c2 = NUM_FLIES - 1; c2 >= 0; c2--) {
559 if ((flies[c2].old_x & 3) == c1 && flies[c2].back_defined[main_info.draw_page] == 1)
560 *(char *) (ptr1 + flies[c2].old_y * 100 + (flies[c2].old_x >> 2)) = flies[c2].back[main_info.draw_page];
564 redraw_pob_backgrounds(main_info.draw_page);
566 draw_leftovers(main_info.draw_page);
570 dj_stop_sfx_channel(4);
574 memset(mask_pic, 0, 102400L);
576 outportw(0x3c4, 0x0f02);
577 memset((char *) (0xa0000 + (long) (main_info.view_page << 15) + __djgpp_conventional_base), 0, 32768);
578 put_text(main_info.view_page, 100, 50, "DOTT", 2);
579 put_text(main_info.view_page, 160, 50, "JIFFY", 2);
580 put_text(main_info.view_page, 220, 50, "FIZZ", 2);
581 put_text(main_info.view_page, 280, 50, "MIJJI", 2);
582 put_text(main_info.view_page, 40, 80, "DOTT", 2);
583 put_text(main_info.view_page, 40, 110, "JIFFY", 2);
584 put_text(main_info.view_page, 40, 140, "FIZZ", 2);
585 put_text(main_info.view_page, 40, 170, "MIJJI", 2);
586 for (c1 = 0; c1 < 4; c1++) {
587 for (c2 = 0; c2 < 4; c2++) {
589 itoa(player[c1].bumped[c2], str1, 10);
590 put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, str1, 2);
592 put_text(main_info.view_page, 100 + c2 * 60, 80 + c1 * 30, "-", 2);
594 itoa(player[c1].bumps, str1, 10);
595 put_text(main_info.view_page, 350, 80 + c1 * 30, str1, 2);
597 put_text(main_info.view_page, 200, 230, "Press ESC to continue", 2);
599 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
600 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
603 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
604 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
609 memset(cur_pal, 0, 768);
612 for (c1 = 0; c1 < 768; c1++)
613 outportb(0x3c9, cur_pal[c1]);
616 dj_ready_mod(MOD_SCORES);
617 dj_set_mod_volume(mod_vol);
621 while (key_pressed(1) == 0) {
624 dj_set_mod_volume(mod_vol);
625 for (c1 = 0; c1 < 768; c1++) {
626 if (cur_pal[c1] < pal[c1])
632 for (c1 = 0; c1 < 768; c1++)
633 outportb(0x3c9, cur_pal[c1]);
635 while (key_pressed(1) == 1)
640 while (mod_vol > 0) {
642 dj_set_mod_volume(mod_vol);
643 for (c1 = 0; c1 < 768; c1++) {
644 if (cur_pal[c1] > pal[c1])
650 for (c1 = 0; c1 < 768; c1++)
651 outportb(0x3c9, cur_pal[c1]);
655 for (c1 = 0; c1 < 768; c1++)
668 void steer_players(void)
673 if (main_info.mouse_enabled == 1)
675 if (main_info.joy_enabled == 1)
678 for (c1 = 0; c1 < 4; c1++) {
680 if (player[c1].enabled == 1) {
682 if (player[c1].dead_flag == 0) {
684 if ((c1 == 0 && ((key_pressed(KEY_PL1_LEFT) == 1 && key_pressed(KEY_PL1_RIGHT) == 1))) || (c1 == 1 && ((key_pressed(KEY_PL2_LEFT) == 1 && key_pressed(KEY_PL2_RIGHT) == 1))) || (c1 == 2 && ((joy.x < -512 && joy.x > 512))) || (c1 == 3 && ((mouse.but1 == 1 && mouse.but2 == 1)))) {
685 if (player[c1].direction == 0) {
686 if ((c1 == 0 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && joy.x > 512) || (c1 == 3 && mouse.but2 == 1)) {
687 s1 = (player[c1].x >> 16);
688 s2 = (player[c1].y >> 16);
689 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 3) {
690 if (player[c1].x_add < 0)
691 player[c1].x_add += 1024;
693 player[c1].x_add += 768;
694 } else if ((ban_map[(s2 + 16) >> 4][s1 >> 4] != 1 && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 3) || (ban_map[(s2 + 16) >> 4][s1 >> 4] == 3 && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != 1)) {
695 if (player[c1].x_add > 0)
696 player[c1].x_add += 1024;
698 player[c1].x_add += 768;
700 if (player[c1].x_add < 0) {
701 player[c1].x_add += 16384;
702 if (player[c1].x_add < 98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 1)
703 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);
705 player[c1].x_add += 12288;
707 if (player[c1].x_add > 98304L)
708 player[c1].x_add = 98304L;
709 player[c1].direction = 0;
710 if (player[c1].anim == 0) {
712 player[c1].frame = 0;
713 player[c1].frame_tick = 0;
714 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
718 if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1) || (c1 == 2 && joy.x < -512) || (c1 == 3 && mouse.but1 == 1)) {
719 s1 = (player[c1].x >> 16);
720 s2 = (player[c1].y >> 16);
721 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 3) {
722 if (player[c1].x_add > 0)
723 player[c1].x_add -= 1024;
725 player[c1].x_add -= 768;
726 } else if ((ban_map[(s2 + 16) >> 4][s1 >> 4] != 1 && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 3) || (ban_map[(s2 + 16) >> 4][s1 >> 4] == 3 && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != 1)) {
727 if (player[c1].x_add > 0)
728 player[c1].x_add -= 1024;
730 player[c1].x_add -= 768;
732 if (player[c1].x_add > 0) {
733 player[c1].x_add -= 16384;
734 if (player[c1].x_add > -98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 1)
735 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);
737 player[c1].x_add -= 12288;
739 if (player[c1].x_add < -98304L)
740 player[c1].x_add = -98304L;
741 player[c1].direction = 1;
742 if (player[c1].anim == 0) {
744 player[c1].frame = 0;
745 player[c1].frame_tick = 0;
746 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
750 } else if ((c1 == 0 && key_pressed(KEY_PL1_LEFT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_LEFT) == 1) || (c1 == 2 && joy.x < -512) || (c1 == 3 && mouse.but1 == 1)) {
751 s1 = (player[c1].x >> 16);
752 s2 = (player[c1].y >> 16);
753 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 3) {
754 if (player[c1].x_add > 0)
755 player[c1].x_add -= 1024;
757 player[c1].x_add -= 768;
758 } else if ((ban_map[(s2 + 16) >> 4][s1 >> 4] != 1 && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 3) || (ban_map[(s2 + 16) >> 4][s1 >> 4] == 3 && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != 1)) {
759 if (player[c1].x_add > 0)
760 player[c1].x_add -= 1024;
762 player[c1].x_add -= 768;
764 if (player[c1].x_add > 0) {
765 player[c1].x_add -= 16384;
766 if (player[c1].x_add > -98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 1)
767 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);
769 player[c1].x_add -= 12288;
771 if (player[c1].x_add < -98304L)
772 player[c1].x_add = -98304L;
773 player[c1].direction = 1;
774 if (player[c1].anim == 0) {
776 player[c1].frame = 0;
777 player[c1].frame_tick = 0;
778 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
780 } else if ((c1 == 0 && key_pressed(KEY_PL1_RIGHT) == 1) || (c1 == 1 && key_pressed(KEY_PL2_RIGHT) == 1) || (c1 == 2 && joy.x > 512) || (c1 == 3 && mouse.but2 == 1)) {
781 s1 = (player[c1].x >> 16);
782 s2 = (player[c1].y >> 16);
783 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 3) {
784 if (player[c1].x_add < 0)
785 player[c1].x_add += 1024;
787 player[c1].x_add += 768;
788 } else if ((ban_map[(s2 + 16) >> 4][s1 >> 4] != 1 && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 3) || (ban_map[(s2 + 16) >> 4][s1 >> 4] == 3 && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != 1)) {
789 if (player[c1].x_add > 0)
790 player[c1].x_add += 1024;
792 player[c1].x_add += 768;
794 if (player[c1].x_add < 0) {
795 player[c1].x_add += 16384;
796 if (player[c1].x_add < 98304L && player[c1].in_water == 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 1)
797 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);
799 player[c1].x_add += 12288;
801 if (player[c1].x_add > 98304L)
802 player[c1].x_add = 98304L;
803 player[c1].direction = 0;
804 if (player[c1].anim == 0) {
806 player[c1].frame = 0;
807 player[c1].frame_tick = 0;
808 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
810 } else if ((c1 == 0 && ((key_pressed(KEY_PL1_LEFT) == 0 && key_pressed(KEY_PL1_RIGHT) == 0))) || (c1 == 1 && ((key_pressed(KEY_PL2_LEFT) == 0 && key_pressed(KEY_PL2_RIGHT) == 0))) || (c1 == 2 && ((joy.x >= -512 && joy.x <= 512))) || (c1 == 3 && ((mouse.but1 == 0 && mouse.but2 == 0)))) {
811 s1 = (player[c1].x >> 16);
812 s2 = (player[c1].y >> 16);
813 if (ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 1 || ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 4 || (((ban_map[(s2 + 16) >> 4][s1 >> 4] == 1 || ban_map[(s2 + 16) >> 4][s1 >> 4] == 4) && ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] != 3) || (ban_map[(s2 + 16) >> 4][s1 >> 4] != 3 && (ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 1 || ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 4)))) {
814 if (player[c1].x_add < 0) {
815 player[c1].x_add += 16384;
816 if (player[c1].x_add > 0)
817 player[c1].x_add = 0;
819 player[c1].x_add -= 16384;
820 if (player[c1].x_add < 0)
821 player[c1].x_add = 0;
823 if (player[c1].x_add != 0 && ban_map[(s2 + 16) >> 4][(s1 + 8) >> 4] == 1)
824 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);
826 if (player[c1].anim == 1) {
828 player[c1].frame = 0;
829 player[c1].frame_tick = 0;
830 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
834 if (pogostick == 1 || (player[c1].jump_ready == 1 && ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 1) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 1) || (c1 == 2 && joy.but1 == 1) || (c1 == 3 && ((main_info.num_mouse_buttons == 2 && mouse.but1 == 1 && mouse.but2 == 1) || (main_info.num_mouse_buttons == 3 && mouse.but3 == 1)))))) {
835 s1 = (player[c1].x >> 16);
836 s2 = (player[c1].y >> 16);
839 if (ban_map[(s2 + 16) >> 4][s1 >> 4] == 1 || ban_map[(s2 + 16) >> 4][s1 >> 4] == 3 || ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 1 || ban_map[(s2 + 16) >> 4][(s1 + 15) >> 4] == 3) {
840 player[c1].y_add = -280000L;
842 player[c1].frame = 0;
843 player[c1].frame_tick = 0;
844 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
845 player[c1].jump_ready = 0;
846 player[c1].jump_abort = 1;
848 dj_play_sfx(SFX_JUMP, SFX_JUMP_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
850 dj_play_sfx(SFX_SPRING, SFX_SPRING_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
852 if ((ban_map[(s2 + 7) >> 4][s1 >> 4] == 0 || ban_map[(s2 + 7) >> 4][(s1 + 15) >> 4] == 0) && (ban_map[(s2 + 8) >> 4][s1 >> 4] == 2 || ban_map[(s2 + 8) >> 4][(s1 + 15) >> 4] == 2)) {
853 player[c1].y_add = -196608L;
854 player[c1].in_water = 0;
856 player[c1].frame = 0;
857 player[c1].frame_tick = 0;
858 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
859 player[c1].jump_ready = 0;
860 player[c1].jump_abort = 1;
862 dj_play_sfx(SFX_JUMP, SFX_JUMP_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
864 dj_play_sfx(SFX_SPRING, SFX_SPRING_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
867 if (pogostick == 0 && ((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 0) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 0) || (c1 == 2 && joy.but1 == 0) || (c1 == 3 && ((main_info.num_mouse_buttons == 2 && (mouse.but1 == 0 && mouse.but2 == 0)) || (main_info.num_mouse_buttons == 3 && mouse.but3 == 0))))) {
868 player[c1].jump_ready = 1;
869 if (player[c1].in_water == 0 && player[c1].y_add < 0 && player[c1].jump_abort == 1) {
870 if (bunnies_in_space == 0)
871 player[c1].y_add += 32768;
873 player[c1].y_add += 16384;
874 if (player[c1].y_add > 0)
875 player[c1].y_add = 0;
878 if (c1 == 3 && main_info.num_mouse_buttons == 2 && (mouse.but1 == 0 || mouse.but2 == 0))
879 player[c1].jump_ready = 1;
883 if (((c1 == 0 && key_pressed(KEY_PL1_JUMP) == 1) || (c1 == 1 && key_pressed(KEY_PL2_JUMP) == 1) || (c1 == 2 && joy.but1 == 1) || (c1 == 3 && mouse.but3 == 1))) {
884 player[c1].y_add -= 16384;
885 if (player[c1].y_add < -400000L)
886 player[c1].y_add = -400000L;
887 if ((ban_map[(s2 + 7) >> 4][s1 >> 4] == 0 || ban_map[(s2 + 7) >> 4][(s1 + 15) >> 4] == 0) && (ban_map[(s2 + 8) >> 4][s1 >> 4] == 2 || ban_map[(s2 + 8) >> 4][(s1 + 15) >> 4] == 2))
888 player[c1].in_water = 0;
890 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);
895 player[c1].x += player[c1].x_add;
896 if ((player[c1].x >> 16) < 0) {
898 player[c1].x_add = 0;
900 if ((player[c1].x >> 16) + 15 > 351) {
901 player[c1].x = 336L << 16;
902 player[c1].x_add = 0;
904 if (player[c1].y > 0) {
905 s1 = (player[c1].x >> 16);
906 s2 = (player[c1].y >> 16);
907 if (ban_map[s2 >> 4][s1 >> 4] == 1 || ban_map[s2 >> 4][s1 >> 4] == 3 || ban_map[s2 >> 4][s1 >> 4] == 4 || ban_map[(s2 + 15) >> 4][s1 >> 4] == 1 || ban_map[(s2 + 15) >> 4][s1 >> 4] == 3 || ban_map[(s2 + 15) >> 4][s1 >> 4] == 4) {
908 player[c1].x = (((s1 + 16) & 0xfff0)) << 16;
909 player[c1].x_add = 0;
911 s1 = (player[c1].x >> 16);
912 s2 = (player[c1].y >> 16);
913 if (ban_map[s2 >> 4][(s1 + 15) >> 4] == 1 || ban_map[s2 >> 4][(s1 + 15) >> 4] == 3 || ban_map[s2 >> 4][(s1 + 15) >> 4] == 4 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 1 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 3 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 4) {
914 player[c1].x = (((s1 + 16) & 0xfff0) - 16) << 16;
915 player[c1].x_add = 0;
918 s1 = (player[c1].x >> 16);
920 if (ban_map[s2 >> 4][s1 >> 4] == 1 || ban_map[s2 >> 4][s1 >> 4] == 3 || ban_map[s2 >> 4][s1 >> 4] == 4 || ban_map[(s2 + 15) >> 4][s1 >> 4] == 1 || ban_map[(s2 + 15) >> 4][s1 >> 4] == 3 || ban_map[(s2 + 15) >> 4][s1 >> 4] == 4) {
921 player[c1].x = (((s1 + 16) & 0xfff0)) << 16;
922 player[c1].x_add = 0;
924 s1 = (player[c1].x >> 16);
926 if (ban_map[s2 >> 4][(s1 + 15) >> 4] == 1 || ban_map[s2 >> 4][(s1 + 15) >> 4] == 3 || ban_map[s2 >> 4][(s1 + 15) >> 4] == 4 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 1 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 3 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 4) {
927 player[c1].x = (((s1 + 16) & 0xfff0) - 16) << 16;
928 player[c1].x_add = 0;
932 player[c1].y += player[c1].y_add;
934 s1 = (player[c1].x >> 16);
935 s2 = (player[c1].y >> 16);
936 if (ban_map[(s2 + 15) >> 4][(s1 + 8) >> 4] == 4 || ((ban_map[(s2 + 15) >> 4][s1 >> 4] == 4 && ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] != 1) || (ban_map[(s2 + 15) >> 4][s1 >> 4] != 1 && ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 4))) {
937 player[c1].y = ((player[c1].y >> 16) & 0xfff0) << 16;
938 player[c1].y_add = -400000L;
940 player[c1].frame = 0;
941 player[c1].frame_tick = 0;
942 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
943 player[c1].jump_ready = 0;
944 player[c1].jump_abort = 0;
945 for (c2 = 0; c2 < 300; c2++) {
946 if (objects[c2].used == 1 && objects[c2].type == OBJ_SPRING) {
947 if (ban_map[(s2 + 15) >> 4][(s1 + 8) >> 4] == 4) {
948 if ((objects[c2].x >> 20) == ((s1 + 8) >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
949 objects[c2].frame = 0;
950 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
951 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
955 if (ban_map[(s2 + 15) >> 4][s1 >> 4] == 4) {
956 if ((objects[c2].x >> 20) == (s1 >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
957 objects[c2].frame = 0;
958 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
959 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
962 } else if (ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 4) {
963 if ((objects[c2].x >> 20) == ((s1 + 15) >> 4) && (objects[c2].y >> 20) == ((s2 + 15) >> 4)) {
964 objects[c2].frame = 0;
965 objects[c2].ticks = object_anims[objects[c2].anim].frame[objects[c2].frame].ticks;
966 objects[c2].image = object_anims[objects[c2].anim].frame[objects[c2].frame].image;
973 dj_play_sfx(SFX_SPRING, SFX_SPRING_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
975 s1 = (player[c1].x >> 16);
976 s2 = (player[c1].y >> 16);
979 if (ban_map[s2 >> 4][s1 >> 4] == 1 || ban_map[s2 >> 4][s1 >> 4] == 3 || ban_map[s2 >> 4][s1 >> 4] == 4 || ban_map[s2 >> 4][(s1 + 15) >> 4] == 1 || ban_map[s2 >> 4][(s1 + 15) >> 4] == 3 || ban_map[s2 >> 4][(s1 + 15) >> 4] == 4) {
980 player[c1].y = (((s2 + 16) & 0xfff0)) << 16;
981 player[c1].y_add = 0;
983 player[c1].frame = 0;
984 player[c1].frame_tick = 0;
985 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
987 s1 = (player[c1].x >> 16);
988 s2 = (player[c1].y >> 16);
991 if (ban_map[(s2 + 8) >> 4][(s1 + 8) >> 4] == 2) {
992 if (player[c1].in_water == 0) {
993 player[c1].in_water = 1;
995 player[c1].frame = 0;
996 player[c1].frame_tick = 0;
997 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
998 if (player[c1].y_add >= 32768) {
999 add_object(OBJ_SPLASH, (player[c1].x >> 16) + 8, ((player[c1].y >> 16) & 0xfff0) + 15, 0, 0, OBJ_ANIM_SPLASH, 0);
1000 if (blood_is_thicker_than_water == 0)
1001 dj_play_sfx(SFX_SPLASH, SFX_SPLASH_FREQ + rnd(2000) - 1000, 64, 0, 0, -1);
1003 dj_play_sfx(SFX_SPLASH, SFX_SPLASH_FREQ + rnd(2000) - 5000, 64, 0, 0, -1);
1006 player[c1].y_add -= 1536;
1007 if (player[c1].y_add < 0 && player[c1].anim != 5) {
1008 player[c1].anim = 5;
1009 player[c1].frame = 0;
1010 player[c1].frame_tick = 0;
1011 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1013 if (player[c1].y_add < -65536L)
1014 player[c1].y_add = -65536L;
1015 if (player[c1].y_add > 65535L)
1016 player[c1].y_add = 65535L;
1017 if (ban_map[(s2 + 15) >> 4][s1 >> 4] == 1 || ban_map[(s2 + 15) >> 4][s1 >> 4] == 3 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 1 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 3) {
1018 player[c1].y = (((s2 + 16) & 0xfff0) - 16) << 16;
1019 player[c1].y_add = 0;
1021 } else if (ban_map[(s2 + 15) >> 4][s1 >> 4] == 1 || ban_map[(s2 + 15) >> 4][s1 >> 4] == 3 || ban_map[(s2 + 15) >> 4][s1 >> 4] == 4 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 1 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 3 || ban_map[(s2 + 15) >> 4][(s1 + 15) >> 4] == 4) {
1022 player[c1].in_water = 0;
1023 player[c1].y = (((s2 + 16) & 0xfff0) - 16) << 16;
1024 player[c1].y_add = 0;
1025 if (player[c1].anim != 0 && player[c1].anim != 1) {
1026 player[c1].anim = 0;
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;
1032 if (player[c1].in_water == 0) {
1033 if (bunnies_in_space == 0)
1034 player[c1].y_add += 12288;
1036 player[c1].y_add += 6144;
1037 if (player[c1].y_add > 327680L)
1038 player[c1].y_add = 327680L;
1040 player[c1].y = (player[c1].y & 0xffff0000) + 0x10000;
1041 player[c1].y_add = 0;
1043 player[c1].in_water = 0;
1045 if (player[c1].y_add > 36864 && player[c1].anim != 3 && player[c1].in_water == 0) {
1046 player[c1].anim = 3;
1047 player[c1].frame = 0;
1048 player[c1].frame_tick = 0;
1049 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1054 player[c1].frame_tick++;
1055 if (player[c1].frame_tick >= player_anims[player[c1].anim].frame[player[c1].frame].ticks) {
1057 if (player[c1].frame >= player_anims[player[c1].anim].num_frames) {
1058 if (player[c1].anim != 6)
1059 player[c1].frame = player_anims[player[c1].anim].restart_frame;
1061 position_player(c1);
1063 player[c1].frame_tick = 0;
1065 player[c1].image = player_anims[player[c1].anim].frame[player[c1].frame].image + player[c1].direction * 9;
1074 void position_player(short player_num)
1083 if (ban_map[s2][s1] == 0 && (ban_map[s2 + 1][s1] == 1 || ban_map[s2 + 1][s1] == 3))
1086 for (c1 = 0; c1 < 4; c1++) {
1087 if (c1 != player_num && player[c1].enabled == 1) {
1088 if (abs((s1 << 4) - (player[c1].x >> 16)) < 32 && abs((s2 << 4) - (player[c1].y >> 16)) < 32)
1093 player[player_num].dead_flag = 0;
1094 player[player_num].x = (long) s1 << 20;
1095 player[player_num].y = (long) s2 << 20;
1096 player[player_num].x_add = player[player_num].y_add = 0;
1097 player[player_num].direction = 0;
1098 player[player_num].jump_ready = 1;
1099 player[player_num].in_water = 0;
1100 player[player_num].anim = 0;
1101 player[player_num].frame = 0;
1102 player[player_num].frame_tick = 0;
1103 player[player_num].image = player_anims[player[player_num].anim].frame[player[player_num].frame].image;
1111 void fireworks(void)
1117 char used, direction, colour;
1121 int anim, frame, frame_tick, image;
1129 outportw(0x3c4, 0x0f02);
1130 memset((char *) (0xa0000 - __djgpp_base_address), 0, 65535);
1132 if ((handle = dat_open("level.pcx", datfile_name, "rb")) == 0) {
1133 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
1136 read_pcx(handle, mask_pic, 102400, pal);
1139 memset(mask_pic, 0, 102400);
1141 memset(ban_map, 0, sizeof(ban_map));
1144 for (c1 = 0; c1 < 768; c1++)
1147 for (c1 = 0; c1 < 4; c1++) {
1148 outportw(0x3c4, ((1 << c1) << 8) + 0x02);
1149 for (c2 = 193; c2 < 256; c2++) {
1150 memset((void *) (0xa0000 + c2 * 100 - __djgpp_base_address), (c2 - 192) >> 2, 100);
1151 memset((void *) (0xa0000 + 32768 + c2 * 100 - __djgpp_base_address), (c2 - 192) >> 2, 100);
1156 for (c1 = 0; c1 < 768; c1++)
1157 outportb(0x3c9, pal[c1]);
1159 for (c1 = 0; c1 < 20; c1++)
1160 rabbits[c1].used = 0;
1162 rabbits[0].used = 1;
1163 rabbits[0].colour = rnd(4);
1164 rabbits[0].x = (int) (150 + rnd(100)) << 16;
1165 rabbits[0].y = 256 << 16;
1166 rabbits[0].x_add = ((int) rnd(65535) << 1) - 65536;
1167 if (rabbits[0].x_add > 0)
1168 rabbits[0].direction = 0;
1170 rabbits[0].direction = 1;
1171 rabbits[0].y_add = -262144 + (rnd(16384) * 5);
1172 rabbits[0].timer = 30 + rnd(150);
1173 rabbits[0].anim = 2;
1174 rabbits[0].frame = 0;
1175 rabbits[0].frame_tick = 0;
1176 rabbits[0].image = player_anims[rabbits[0].anim].frame[rabbits[0].frame].image + rabbits[0].colour * 18 + rabbits[0].direction * 9;
1178 for (c1 = 0; c1 < 300; c1++) {
1182 stars[c1].x = stars[c1].old_x = (s1 << 16);
1183 stars[c1].y = stars[c1].old_y = (s2 << 16);
1185 outportw(0x3ce, ((s1 & 3) << 8) + 0x04);
1186 stars[c1].back[0] = stars[c1].back[1] = *(char *) (0xa0000 + s2 * 100 + (s1 >> 2) - __djgpp_base_address);
1191 main_info.page_info[0].num_pobs = 0;
1192 main_info.page_info[1].num_pobs = 0;
1193 main_info.view_page = 0;
1194 main_info.draw_page = 1;
1196 while (key_pressed(1) == 0) {
1200 for (c1 = 0; c1 < 300; c1++) {
1201 stars[c1].old_x = stars[c1].x;
1202 stars[c1].old_y = stars[c1].y;
1203 stars[c1].y -= (int) (31 - stars[c1].col) * 16384;
1204 if ((stars[c1].y >> 16) < 0)
1205 stars[c1].y += 256 << 16;;
1206 if ((stars[c1].y >> 16) >= 256)
1207 stars[c1].y -= 256 << 16;;
1210 for (c1 = 0, c2 = 0; c1 < 20; c1++) {
1211 if (rabbits[c1].used == 1)
1214 if ((c2 == 0 && rnd(10000) < 200) || (c2 == 1 && rnd(10000) < 150) || (c2 == 2 && rnd(10000) < 100) || (c2 == 3 && rnd(10000) < 50)) {
1215 for (c1 = 0; c1 < 20; c1++) {
1216 if (rabbits[c1].used == 0) {
1217 rabbits[c1].used = 1;
1218 rabbits[c1].colour = rnd(4);
1219 rabbits[c1].x = (int) (150 + rnd(100)) << 16;
1220 rabbits[c1].y = 256 << 16;
1221 rabbits[c1].x_add = ((int) rnd(65535) << 1) - 65536;
1222 if (rabbits[c1].x_add > 0)
1223 rabbits[c1].direction = 0;
1225 rabbits[c1].direction = 1;
1226 rabbits[c1].y_add = -262144 + (rnd(16384) * 5);
1227 rabbits[c1].timer = 30 + rnd(150);
1228 rabbits[c1].anim = 2;
1229 rabbits[c1].frame = 0;
1230 rabbits[c1].frame_tick = 0;
1231 rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
1239 main_info.page_info[main_info.draw_page].num_pobs = 0;
1241 for (c1 = 0; c1 < 20; c1++) {
1242 if (rabbits[c1].used == 1) {
1243 rabbits[c1].y_add += 2048;
1244 if (rabbits[c1].y_add > 36864 && rabbits[c1].anim != 3) {
1245 rabbits[c1].anim = 3;
1246 rabbits[c1].frame = 0;
1247 rabbits[c1].frame_tick = 0;
1248 rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
1250 rabbits[c1].x += rabbits[c1].x_add;
1251 rabbits[c1].y += rabbits[c1].y_add;
1252 if ((rabbits[c1].x >> 16) < 16 || (rabbits[c1].x >> 16) > 400 || (rabbits[c1].y >> 16) > 256) {
1253 rabbits[c1].used = 0;
1256 rabbits[c1].timer--;
1257 if (rabbits[c1].timer <= 0) {
1258 rabbits[c1].used = 0;
1259 for (c2 = 0; c2 < 6; c2++)
1260 add_object(OBJ_FUR, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 44 + rabbits[c1].colour * 8);
1261 for (c2 = 0; c2 < 6; c2++)
1262 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 76);
1263 for (c2 = 0; c2 < 6; c2++)
1264 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 77);
1265 for (c2 = 0; c2 < 8; c2++)
1266 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 78);
1267 for (c2 = 0; c2 < 10; c2++)
1268 add_object(OBJ_FLESH, (rabbits[c1].x >> 16) + 6 + rnd(5), (rabbits[c1].y >> 16) + 6 + rnd(5), rabbits[c1].x_add + (rnd(65535) - 32768) * 3, rabbits[c1].y_add + (rnd(65535) - 32768) * 3, 0, 79);
1269 dj_play_sfx(SFX_DEATH, SFX_DEATH_FREQ, 64, 0, 0, -1);
1272 rabbits[c1].frame_tick++;
1273 if (rabbits[c1].frame_tick >= player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].ticks) {
1274 rabbits[c1].frame++;
1275 if (rabbits[c1].frame >= player_anims[rabbits[c1].anim].num_frames)
1276 rabbits[c1].frame = player_anims[rabbits[c1].anim].restart_frame;
1277 rabbits[c1].frame_tick = 0;
1279 rabbits[c1].image = player_anims[rabbits[c1].anim].frame[rabbits[c1].frame].image + rabbits[c1].colour * 18 + rabbits[c1].direction * 9;
1280 if (rabbits[c1].used == 1)
1281 add_pob(main_info.draw_page, rabbits[c1].x >> 16, rabbits[c1].y >> 16, rabbits[c1].image, rabbit_gobs);
1289 for (c1 = 0; c1 < 300; c1++) {
1290 outportw(0x3ce, (((stars[c1].x >> 16) & 3) << 8) + 0x04);
1291 outportw(0x3c4, ((1 << ((stars[c1].x >> 16) & 3)) << 8) + 0x02);
1292 stars[c1].back[main_info.draw_page] = *(char *) (0xa0000 + ((int) main_info.draw_page << 15) + (stars[c1].y >> 16) * 100 + (stars[c1].x >> 18) - __djgpp_base_address);
1293 *(char *) (0xa0000 + ((int) main_info.draw_page << 15) + (stars[c1].y >> 16) * 100 + (stars[c1].x >> 18) - __djgpp_base_address) = stars[c1].col;
1298 draw_pobs(main_info.draw_page);
1300 main_info.draw_page ^= 1;
1301 main_info.view_page ^= 1;
1302 outportw(0x3d4, (main_info.view_page << 23) + 0x0d);
1303 outportw(0x3d4, ((main_info.view_page << 15) & 0xff00) + 0x0c);
1305 while ((inportb(0x3da) & 8) == 0)
1307 while ((inportb(0x3da) & 8) == 8)
1310 redraw_pob_backgrounds(main_info.draw_page);
1314 for (c1 = 299; c1 >= 0; c1--) {
1315 outportw(0x3c4, ((1 << ((stars[c1].old_x >> 16) & 3)) << 8) + 0x02);
1316 *(char *) (0xa0000 + ((int) main_info.draw_page << 15) + (stars[c1].old_y >> 16) * 100 + (stars[c1].old_x >> 18) - __djgpp_base_address) = stars[c1].back[main_info.draw_page];
1325 void add_object(char type, short x, short y, long x_add, long y_add, short anim, short frame)
1329 for (c1 = 0; c1 < NUM_OBJECTS; c1++) {
1330 if (objects[c1].used == 0) {
1331 objects[c1].used = 1;
1332 objects[c1].type = type;
1333 objects[c1].x = (long) x << 16;
1334 objects[c1].y = (long) y << 16;
1335 objects[c1].x_add = x_add;
1336 objects[c1].y_add = y_add;
1337 objects[c1].x_acc = 0;
1338 objects[c1].y_acc = 0;
1339 objects[c1].anim = anim;
1340 objects[c1].frame = frame;
1341 objects[c1].ticks = object_anims[anim].frame[frame].ticks;
1342 objects[c1].image = object_anims[anim].frame[frame].image;
1350 void update_objects(void)
1355 for (c1 = 0; c1 < NUM_OBJECTS; c1++) {
1356 if (objects[c1].used == 1) {
1357 switch (objects[c1].type) {
1359 objects[c1].ticks--;
1360 if (objects[c1].ticks <= 0) {
1361 objects[c1].frame++;
1362 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames) {
1363 objects[c1].frame--;
1364 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1366 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1367 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1370 if (objects[c1].used == 1)
1371 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1374 objects[c1].ticks--;
1375 if (objects[c1].ticks <= 0) {
1376 objects[c1].frame++;
1377 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1378 objects[c1].used = 0;
1380 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1381 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1384 if (objects[c1].used == 1)
1385 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1388 objects[c1].x += objects[c1].x_add;
1389 objects[c1].y += objects[c1].y_add;
1390 objects[c1].ticks--;
1391 if (objects[c1].ticks <= 0) {
1392 objects[c1].frame++;
1393 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1394 objects[c1].used = 0;
1396 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1397 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1400 if (objects[c1].used == 1)
1401 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1403 case OBJ_YEL_BUTFLY:
1404 case OBJ_PINK_BUTFLY:
1405 objects[c1].x_acc += rnd(128) - 64;
1406 if (objects[c1].x_acc < -1024)
1407 objects[c1].x_acc = -1024;
1408 if (objects[c1].x_acc > 1024)
1409 objects[c1].x_acc = 1024;
1410 objects[c1].x_add += objects[c1].x_acc;
1411 if (objects[c1].x_add < -32768)
1412 objects[c1].x_add = -32768;
1413 if (objects[c1].x_add > 32768)
1414 objects[c1].x_add = 32768;
1415 objects[c1].x += objects[c1].x_add;
1416 if ((objects[c1].x >> 16) < 16) {
1417 objects[c1].x = 16 << 16;
1418 objects[c1].x_add = -objects[c1].x_add >> 2;
1419 objects[c1].x_acc = 0;
1420 } else if ((objects[c1].x >> 16) > 350) {
1421 objects[c1].x = 350 << 16;
1422 objects[c1].x_add = -objects[c1].x_add >> 2;
1423 objects[c1].x_acc = 0;
1425 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0) {
1426 if (objects[c1].x_add < 0) {
1427 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1429 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1431 objects[c1].x_add = -objects[c1].x_add >> 2;
1432 objects[c1].x_acc = 0;
1434 objects[c1].y_acc += rnd(64) - 32;
1435 if (objects[c1].y_acc < -1024)
1436 objects[c1].y_acc = -1024;
1437 if (objects[c1].y_acc > 1024)
1438 objects[c1].y_acc = 1024;
1439 objects[c1].y_add += objects[c1].y_acc;
1440 if (objects[c1].y_add < -32768)
1441 objects[c1].y_add = -32768;
1442 if (objects[c1].y_add > 32768)
1443 objects[c1].y_add = 32768;
1444 objects[c1].y += objects[c1].y_add;
1445 if ((objects[c1].y >> 16) < 0) {
1447 objects[c1].y_add = -objects[c1].y_add >> 2;
1448 objects[c1].y_acc = 0;
1449 } else if ((objects[c1].y >> 16) > 255) {
1450 objects[c1].y = 255 << 16;
1451 objects[c1].y_add = -objects[c1].y_add >> 2;
1452 objects[c1].y_acc = 0;
1454 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0) {
1455 if (objects[c1].y_add < 0) {
1456 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1458 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1460 objects[c1].y_add = -objects[c1].y_add >> 2;
1461 objects[c1].y_acc = 0;
1463 if (objects[c1].type == OBJ_YEL_BUTFLY) {
1464 if (objects[c1].x_add < 0 && objects[c1].anim != OBJ_ANIM_YEL_BUTFLY_LEFT) {
1465 objects[c1].anim = OBJ_ANIM_YEL_BUTFLY_LEFT;
1466 objects[c1].frame = 0;
1467 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1468 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1469 } else if (objects[c1].x_add > 0 && objects[c1].anim != OBJ_ANIM_YEL_BUTFLY_RIGHT) {
1470 objects[c1].anim = OBJ_ANIM_YEL_BUTFLY_RIGHT;
1471 objects[c1].frame = 0;
1472 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1473 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1476 if (objects[c1].x_add < 0 && objects[c1].anim != OBJ_ANIM_PINK_BUTFLY_LEFT) {
1477 objects[c1].anim = OBJ_ANIM_PINK_BUTFLY_LEFT;
1478 objects[c1].frame = 0;
1479 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1480 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1481 } else if (objects[c1].x_add > 0 && objects[c1].anim != OBJ_ANIM_PINK_BUTFLY_RIGHT) {
1482 objects[c1].anim = OBJ_ANIM_PINK_BUTFLY_RIGHT;
1483 objects[c1].frame = 0;
1484 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1485 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1488 objects[c1].ticks--;
1489 if (objects[c1].ticks <= 0) {
1490 objects[c1].frame++;
1491 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1492 objects[c1].frame = object_anims[objects[c1].anim].restart_frame;
1494 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1495 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1498 if (objects[c1].used == 1)
1499 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1503 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 0);
1504 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 0) {
1505 objects[c1].y_add += 3072;
1506 if (objects[c1].y_add > 196608L)
1507 objects[c1].y_add = 196608L;
1508 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 2) {
1509 if (objects[c1].x_add < 0) {
1510 if (objects[c1].x_add < -65536L)
1511 objects[c1].x_add = -65536L;
1512 objects[c1].x_add += 1024;
1513 if (objects[c1].x_add > 0)
1514 objects[c1].x_add = 0;
1516 if (objects[c1].x_add > 65536L)
1517 objects[c1].x_add = 65536L;
1518 objects[c1].x_add -= 1024;
1519 if (objects[c1].x_add < 0)
1520 objects[c1].x_add = 0;
1522 objects[c1].y_add += 1024;
1523 if (objects[c1].y_add < -65536L)
1524 objects[c1].y_add = -65536L;
1525 if (objects[c1].y_add > 65536L)
1526 objects[c1].y_add = 65536L;
1528 objects[c1].x += objects[c1].x_add;
1529 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)) {
1530 if (objects[c1].x_add < 0) {
1531 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1532 objects[c1].x_add = -objects[c1].x_add >> 2;
1534 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1535 objects[c1].x_add = -objects[c1].x_add >> 2;
1538 objects[c1].y += objects[c1].y_add;
1539 if ((objects[c1].x >> 16) < -5 || (objects[c1].x >> 16) > 405 || (objects[c1].y >> 16) > 260)
1540 objects[c1].used = 0;
1541 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0)) {
1542 if (objects[c1].y_add < 0) {
1543 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 2) {
1544 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1545 objects[c1].x_add >>= 2;
1546 objects[c1].y_add = -objects[c1].y_add >> 2;
1549 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1) {
1550 if (objects[c1].y_add > 131072L) {
1551 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1552 objects[c1].x_add >>= 2;
1553 objects[c1].y_add = -objects[c1].y_add >> 2;
1555 objects[c1].used = 0;
1556 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3) {
1557 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1558 if (objects[c1].y_add > 131072L)
1559 objects[c1].y_add = -objects[c1].y_add >> 2;
1561 objects[c1].y_add = 0;
1565 if (objects[c1].x_add < 0 && objects[c1].x_add > -16384)
1566 objects[c1].x_add = -16384;
1567 if (objects[c1].x_add > 0 && objects[c1].x_add < 16384)
1568 objects[c1].x_add = 16384;
1569 if (objects[c1].used == 1) {
1570 s1 = atan2(objects[c1].y_add, objects[c1].x_add) * 4 / M_PI;
1577 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].frame + s1, object_gobs);
1581 if (rnd(100) < 30) {
1582 if (objects[c1].frame == 76)
1583 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 1);
1584 else if (objects[c1].frame == 77)
1585 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 2);
1586 else if (objects[c1].frame == 78)
1587 add_object(OBJ_FLESH_TRACE, objects[c1].x >> 16, objects[c1].y >> 16, 0, 0, OBJ_ANIM_FLESH_TRACE, 3);
1589 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 0) {
1590 objects[c1].y_add += 3072;
1591 if (objects[c1].y_add > 196608L)
1592 objects[c1].y_add = 196608L;
1593 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 2) {
1594 if (objects[c1].x_add < 0) {
1595 if (objects[c1].x_add < -65536L)
1596 objects[c1].x_add = -65536L;
1597 objects[c1].x_add += 1024;
1598 if (objects[c1].x_add > 0)
1599 objects[c1].x_add = 0;
1601 if (objects[c1].x_add > 65536L)
1602 objects[c1].x_add = 65536L;
1603 objects[c1].x_add -= 1024;
1604 if (objects[c1].x_add < 0)
1605 objects[c1].x_add = 0;
1607 objects[c1].y_add += 1024;
1608 if (objects[c1].y_add < -65536L)
1609 objects[c1].y_add = -65536L;
1610 if (objects[c1].y_add > 65536L)
1611 objects[c1].y_add = 65536L;
1613 objects[c1].x += objects[c1].x_add;
1614 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)) {
1615 if (objects[c1].x_add < 0) {
1616 objects[c1].x = (((objects[c1].x >> 16) + 16) & 0xfff0) << 16;
1617 objects[c1].x_add = -objects[c1].x_add >> 2;
1619 objects[c1].x = ((((objects[c1].x >> 16) - 16) & 0xfff0) + 15) << 16;
1620 objects[c1].x_add = -objects[c1].x_add >> 2;
1623 objects[c1].y += objects[c1].y_add;
1624 if ((objects[c1].x >> 16) < -5 || (objects[c1].x >> 16) > 405 || (objects[c1].y >> 16) > 260)
1625 objects[c1].used = 0;
1626 if ((objects[c1].y >> 16) > 0 && (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 0)) {
1627 if (objects[c1].y_add < 0) {
1628 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] != 2) {
1629 objects[c1].y = (((objects[c1].y >> 16) + 16) & 0xfff0) << 16;
1630 objects[c1].x_add >>= 2;
1631 objects[c1].y_add = -objects[c1].y_add >> 2;
1634 if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 1) {
1635 if (objects[c1].y_add > 131072L) {
1636 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1637 objects[c1].x_add >>= 2;
1638 objects[c1].y_add = -objects[c1].y_add >> 2;
1640 if (rnd(100) < 10) {
1642 add_leftovers(0, objects[c1].x >> 16, (objects[c1].y >> 16) + s1, objects[c1].frame, object_gobs);
1643 add_leftovers(1, objects[c1].x >> 16, (objects[c1].y >> 16) + s1, objects[c1].frame, object_gobs);
1645 objects[c1].used = 0;
1647 } else if (ban_map[objects[c1].y >> 20][objects[c1].x >> 20] == 3) {
1648 objects[c1].y = ((((objects[c1].y >> 16) - 16) & 0xfff0) + 15) << 16;
1649 if (objects[c1].y_add > 131072L)
1650 objects[c1].y_add = -objects[c1].y_add >> 2;
1652 objects[c1].y_add = 0;
1656 if (objects[c1].x_add < 0 && objects[c1].x_add > -16384)
1657 objects[c1].x_add = -16384;
1658 if (objects[c1].x_add > 0 && objects[c1].x_add < 16384)
1659 objects[c1].x_add = 16384;
1660 if (objects[c1].used == 1)
1661 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].frame, object_gobs);
1663 case OBJ_FLESH_TRACE:
1664 objects[c1].ticks--;
1665 if (objects[c1].ticks <= 0) {
1666 objects[c1].frame++;
1667 if (objects[c1].frame >= object_anims[objects[c1].anim].num_frames)
1668 objects[c1].used = 0;
1670 objects[c1].ticks = object_anims[objects[c1].anim].frame[objects[c1].frame].ticks;
1671 objects[c1].image = object_anims[objects[c1].anim].frame[objects[c1].frame].image;
1674 if (objects[c1].used == 1)
1675 add_pob(main_info.draw_page, objects[c1].x >> 16, objects[c1].y >> 16, objects[c1].image, object_gobs);
1684 char add_pob(char page, short x, short y, short image, char *pob_data)
1687 if (main_info.page_info[page].num_pobs >= NUM_POBS)
1690 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].x = x;
1691 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].y = y;
1692 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].image = image;
1693 main_info.page_info[page].pobs[main_info.page_info[page].num_pobs].pob_data = pob_data;
1694 main_info.page_info[page].num_pobs++;
1701 void draw_pobs(char page)
1708 for (c1 = main_info.page_info[page].num_pobs - 1; c1 >= 0; c1--) {
1709 main_info.page_info[page].pobs[c1].back_buf_ofs = back_buf_ofs;
1710 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));
1711 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);
1712 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);
1718 void redraw_pob_backgrounds(char page)
1722 for (c1 = 0; c1 < main_info.page_info[page].num_pobs; c1++)
1723 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));
1728 char add_leftovers(char page, short x, short y, short image, char *pob_data)
1731 if (leftovers.page[page].num_pobs >= NUM_LEFTOVERS)
1734 leftovers.page[page].pobs[leftovers.page[page].num_pobs].x = x;
1735 leftovers.page[page].pobs[leftovers.page[page].num_pobs].y = y;
1736 leftovers.page[page].pobs[leftovers.page[page].num_pobs].image = image;
1737 leftovers.page[page].pobs[leftovers.page[page].num_pobs].pob_data = pob_data;
1738 leftovers.page[page].num_pobs++;
1745 void draw_leftovers(char page)
1750 for (c1 = leftovers.page[page].num_pobs - 1; c1 >= 0; c1--)
1751 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);
1753 leftovers.page[page].num_pobs = 0;
1758 char init_level(short level)
1765 if ((handle = dat_open("level.pcx", datfile_name, "rb")) == 0) {
1766 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
1769 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
1770 strcpy(main_info.error_str, "Error loading 'level.pcx', aborting...\n");
1774 if ((handle = dat_open("mask.pcx", datfile_name, "rb")) == 0) {
1775 strcpy(main_info.error_str, "Error loading 'mask.pcx', aborting...\n");
1778 if (read_pcx(handle, mask_pic, 102400L, 0) != 0) {
1779 strcpy(main_info.error_str, "Error loading 'mask.pcx', aborting...\n");
1783 memset(cur_pal, 0, 768);
1785 for (c1 = 0; c1 < 4; c1++) {
1786 if (player[c1].enabled == 1) {
1787 player[c1].bumps = 0;
1788 player[c1].bumped[0] = 0;
1789 player[c1].bumped[1] = 0;
1790 player[c1].bumped[2] = 0;
1791 player[c1].bumped[3] = 0;
1792 position_player(c1);
1796 for (c1 = 0; c1 < 300; c1++)
1797 objects[c1].used = 0;
1799 for (c1 = 0; c1 < 16; c1++) {
1800 for (c2 = 0; c2 < 22; c2++) {
1801 if (ban_map[c1][c2] == 4)
1802 add_object(OBJ_SPRING, c2 << 4, c1 << 4, 0, 0, OBJ_ANIM_SPRING, 5);
1809 if (ban_map[s2][s1] == 0) {
1810 add_object(OBJ_YEL_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1817 if (ban_map[s2][s1] == 0) {
1818 add_object(OBJ_YEL_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1825 if (ban_map[s2][s1] == 0) {
1826 add_object(OBJ_PINK_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1833 if (ban_map[s2][s1] == 0) {
1834 add_object(OBJ_PINK_BUTFLY, (s1 << 4) + 8, (s2 << 4) + 8, (rnd(65535) - 32768) * 2, (rnd(65535) - 32768) * 2, 0, 0);
1844 void deinit_level(void)
1854 char init_program(int argc, char *argv[])
1859 char force2, force3;
1861 int player_anim_data[] = { 1, 0, 0, 0x7fff, 0, 0, 0, 0, 0, 0,
1862 4, 0, 0, 4, 1, 4, 2, 4, 3, 4,
1863 1, 0, 4, 0x7fff, 0, 0, 0, 0, 0, 0,
1864 4, 2, 5, 8, 6, 10, 7, 3, 6, 3,
1865 1, 0, 6, 0x7fff, 0, 0, 0, 0, 0, 0,
1866 2, 1, 5, 8, 4, 0x7fff, 0, 0, 0, 0,
1867 1, 0, 8, 5, 0, 0, 0, 0, 0, 0
1870 if (__djgpp_nearptr_enable() == 0)
1875 if (hook_keyb_handler() != 0)
1878 memset(&main_info, 0, sizeof(main_info));
1879 main_info.joy_enabled = 1;
1881 strcpy(datfile_name, "jumpbump.dat");
1883 force2 = force3 = 0;
1886 for (c1 = 1; c1 < argc; c1++) {
1887 if (stricmp(argv[c1], "-nosound") == 0)
1888 main_info.no_sound = 1;
1889 else if (stricmp(argv[c1], "-nogore") == 0)
1890 main_info.no_gore = 1;
1891 else if (stricmp(argv[c1], "-nojoy") == 0)
1892 main_info.joy_enabled = 0;
1893 else if (stricmp(argv[c1], "-fireworks") == 0)
1894 main_info.fireworks = 1;
1895 else if (stricmp(argv[c1], "-dat") == 0) {
1896 if (c1 < (argc - 1)) {
1897 if ((handle = fopen(argv[c1 + 1], "rb")) != NULL) {
1899 strcpy(datfile_name, argv[c1 + 1]);
1902 } else if (stricmp(argv[c1], "-mouse") == 0) {
1903 if (c1 < (argc - 1)) {
1904 if (stricmp(argv[c1 + 1], "2") == 0)
1906 if (stricmp(argv[c1 + 1], "3") == 0)
1913 for (c1 = 0; c1 < 7; c1++) {
1914 player_anims[c1].num_frames = player_anim_data[c1 * 10];
1915 player_anims[c1].restart_frame = player_anim_data[c1 * 10 + 1];
1916 for (c2 = 0; c2 < 4; c2++) {
1917 player_anims[c1].frame[c2].image = player_anim_data[c1 * 10 + c2 * 2 + 2];
1918 player_anims[c1].frame[c2].ticks = player_anim_data[c1 * 10 + c2 * 2 + 3];
1922 if ((background_pic = malloc(102400L)) == 0)
1924 if ((mask_pic = malloc(102400L)) == 0)
1926 memset(mask_pic, 0, 102400);
1928 main_info.pob_backbuf[0] = malloc(65535);
1929 main_info.pob_backbuf[1] = malloc(65535);
1930 if (main_info.pob_backbuf[0] == 0 || main_info.pob_backbuf[1] == 0)
1933 if ((handle = dat_open("rabbit.gob", datfile_name, "rb")) == 0) {
1934 strcpy(main_info.error_str, "Error loading 'rabbit.gob', aborting...\n");
1937 if ((rabbit_gobs = malloc(dat_filelen("rabbit.gob", datfile_name))) == 0) {
1938 strcpy(main_info.error_str, "Not enough memory, aborting...\n");
1942 fread(rabbit_gobs, 1, dat_filelen("rabbit.gob", datfile_name), handle);
1945 if ((handle = dat_open("objects.gob", datfile_name, "rb")) == 0) {
1946 strcpy(main_info.error_str, "Error loading 'objects.gob', aborting...\n");
1949 if ((object_gobs = malloc(dat_filelen("objects.gob", datfile_name))) == 0) {
1950 strcpy(main_info.error_str, "Not enough memory, aborting...\n");
1954 fread(object_gobs, 1, dat_filelen("objects.gob", datfile_name), handle);
1957 if ((handle = dat_open("font.gob", datfile_name, "rb")) == 0) {
1958 strcpy(main_info.error_str, "Error loading 'font.gob', aborting...\n");
1961 if ((font_gobs = malloc(dat_filelen("font.gob", datfile_name))) == 0) {
1962 strcpy(main_info.error_str, "Not enough memory, aborting...\n");
1966 fread(font_gobs, 1, dat_filelen("font.gob", datfile_name), handle);
1969 if ((handle = dat_open("numbers.gob", datfile_name, "rb")) == 0) {
1970 strcpy(main_info.error_str, "Error loading 'numbers.gob', aborting...\n");
1973 if ((number_gobs = malloc(dat_filelen("numbers.gob", datfile_name))) == 0) {
1974 strcpy(main_info.error_str, "Not enough memory, aborting...\n");
1978 fread(number_gobs, 1, dat_filelen("numbers.gob", datfile_name), handle);
1981 if (read_level() != 0) {
1982 strcpy(main_info.error_str, "Error loading 'levelmap.txt', aborting...\n");
1988 if (main_info.no_sound == 0) {
1990 dj_set_mixing_freq(20000);
1994 dj_set_num_sfx_channels(5);
1995 dj_set_sfx_volume(64);
1999 if ((handle = dat_open("jump.mod", datfile_name, "rb")) == 0) {
2000 strcpy(main_info.error_str, "Error loading 'jump.mod', aborting...\n");
2003 if (dj_load_mod(handle, 0, MOD_MENU) != 0) {
2004 strcpy(main_info.error_str, "Error loading 'jump.mod', aborting...\n");
2009 if ((handle = dat_open("bump.mod", datfile_name, "rb")) == 0) {
2010 strcpy(main_info.error_str, "Error loading 'bump.mod', aborting...\n");
2013 if (dj_load_mod(handle, 0, MOD_GAME) != 0) {
2014 strcpy(main_info.error_str, "Error loading 'bump.mod', aborting...\n");
2019 if ((handle = dat_open("scores.mod", datfile_name, "rb")) == 0) {
2020 strcpy(main_info.error_str, "Error loading 'scores.mod', aborting...\n");
2023 if (dj_load_mod(handle, 0, MOD_SCORES) != 0) {
2024 strcpy(main_info.error_str, "Error loading 'scores.mod', aborting...\n");
2029 if ((handle = dat_open("jump.smp", datfile_name, "rb")) == 0) {
2030 strcpy(main_info.error_str, "Error loading 'jump.smp', aborting...\n");
2033 if (dj_load_sfx(handle, 0, dat_filelen("jump.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_JUMP) != 0) {
2034 strcpy(main_info.error_str, "Error loading 'jump.smp', aborting...\n");
2039 if ((handle = dat_open("death.smp", datfile_name, "rb")) == 0) {
2040 strcpy(main_info.error_str, "Error loading 'death.smp', aborting...\n");
2043 if (dj_load_sfx(handle, 0, dat_filelen("death.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_DEATH) != 0) {
2044 strcpy(main_info.error_str, "Error loading 'death.smp', aborting...\n");
2049 if ((handle = dat_open("spring.smp", datfile_name, "rb")) == 0) {
2050 strcpy(main_info.error_str, "Error loading 'spring.smp', aborting...\n");
2053 if (dj_load_sfx(handle, 0, dat_filelen("spring.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_SPRING) != 0) {
2054 strcpy(main_info.error_str, "Error loading 'spring.smp', aborting...\n");
2059 if ((handle = dat_open("splash.smp", datfile_name, "rb")) == 0) {
2060 strcpy(main_info.error_str, "Error loading 'splash.smp', aborting...\n");
2063 if (dj_load_sfx(handle, 0, dat_filelen("splash.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_SPLASH) != 0) {
2064 strcpy(main_info.error_str, "Error loading 'splash.smp', aborting...\n");
2069 if ((handle = dat_open("fly.smp", datfile_name, "rb")) == 0) {
2070 strcpy(main_info.error_str, "Error loading 'fly.smp', aborting...\n");
2073 if (dj_load_sfx(handle, 0, dat_filelen("fly.smp", datfile_name), DJ_SFX_TYPE_SMP, SFX_FLY) != 0) {
2074 strcpy(main_info.error_str, "Error loading 'fly.smp', aborting...\n");
2079 dj_get_sfx_settings(SFX_FLY, &fly);
2081 fly.default_freq = SFX_FLY_FREQ;
2084 fly.loop_length = fly.length;
2085 dj_set_sfx_settings(SFX_FLY, &fly);
2090 if ((handle = dat_open("menu.pcx", datfile_name, "rb")) == 0) {
2091 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
2094 if (read_pcx(handle, background_pic, 102400L, pal) != 0) {
2095 strcpy(main_info.error_str, "Error loading 'menu.pcx', aborting...\n");
2101 for (c1 = 0; c1 < 768; c1++)
2102 outportb(0x3c9, pal[c1]);
2104 if (main_info.joy_enabled == 1 && main_info.fireworks == 0) {
2107 while (c1 < 0x7fff) {
2108 if ((inportb(0x201) & 1) == 0)
2113 main_info.joy_enabled = 1;
2115 put_text(0, 200, 40, "JOYSTICK CALIBRATION", 2);
2116 put_text(0, 200, 100, "Move the joystick to the", 2);
2117 put_text(0, 200, 115, "UPPER LEFT", 2);
2118 put_text(0, 200, 130, "and press button A", 2);
2119 put_text(0, 200, 200, "Or press ESC to use", 2);
2120 put_text(0, 200, 215, "previous settings", 2);
2121 if (calib_joy(0) != 0)
2124 outportw(0x3c4, 0x0f02);
2125 memset((char *) (0xa0000 + 32768 + __djgpp_conventional_base), 0, 32768);
2126 main_info.view_page = 1;
2127 outportw(0x3d4, (1 << 23) + 0x0d);
2128 outportw(0x3d4, ((1 << 15) & 0xff00) + 0x0c);
2131 put_text(1, 200, 40, "JOYSTICK CALIBRATION", 2);
2132 put_text(1, 200, 100, "Move the joystick to the", 2);
2133 put_text(1, 200, 115, "LOWER RIGHT", 2);
2134 put_text(1, 200, 130, "and press button A", 2);
2135 put_text(1, 200, 200, "Or press ESC to use", 2);
2136 put_text(1, 200, 215, "previous settings", 2);
2137 if (calib_joy(1) != 0)
2140 outportw(0x3c4, 0x0f02);
2141 memset((char *) (0xa0000 + __djgpp_conventional_base), 0, 32768);
2142 outportw(0x3d4, (0 << 23) + 0x0d);
2143 outportw(0x3d4, ((0 << 15) & 0xff00) + 0x0c);
2146 put_text(0, 200, 40, "JOYSTICK CALIBRATION", 2);
2147 put_text(0, 200, 100, "Move the joystick to the", 2);
2148 put_text(0, 200, 115, "CENTER", 2);
2149 put_text(0, 200, 130, "and press button A", 2);
2150 put_text(0, 200, 200, "Or press ESC to use", 2);
2151 put_text(0, 200, 215, "previous settings", 2);
2152 if (calib_joy(2) != 0)
2155 if (joy.calib_data.x1 == joy.calib_data.x2)
2156 joy.calib_data.x1 -= 10;
2157 if (joy.calib_data.x3 == joy.calib_data.x2)
2158 joy.calib_data.x3 += 10;
2159 if (joy.calib_data.y1 == joy.calib_data.y2)
2160 joy.calib_data.y1 -= 10;
2161 if (joy.calib_data.y3 == joy.calib_data.y2)
2162 joy.calib_data.y3 += 10;
2167 if (load_flag == 1) {
2168 if ((handle = dat_open("calib.dat", datfile_name, "rb")) == 0) {
2169 strcpy(main_info.error_str, "Error loading 'calib.dat', aborting...\n");
2172 joy.calib_data.x1 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2173 joy.calib_data.x2 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2174 joy.calib_data.x3 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2175 joy.calib_data.y1 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2176 joy.calib_data.y2 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2177 joy.calib_data.y3 = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2181 main_info.joy_enabled = 0;
2186 __dpmi_int(0x33, ®s);
2187 if (regs.x.ax == 0xffff) {
2188 main_info.mouse_enabled = 1;
2189 main_info.num_mouse_buttons = regs.x.bx;
2191 main_info.num_mouse_buttons = 2;
2193 main_info.num_mouse_buttons = 3;
2195 main_info.mouse_enabled = 0;
2202 void deinit_program(void)
2207 dj_free_mod(MOD_MENU);
2208 dj_free_mod(MOD_GAME);
2209 dj_free_sfx(SFX_DEATH);
2210 dj_free_sfx(SFX_SPRING);
2211 dj_free_sfx(SFX_SPLASH);
2214 if (rabbit_gobs != 0)
2216 if (object_gobs != 0)
2218 if (number_gobs != 0)
2221 if (main_info.pob_backbuf[0] != 0)
2222 free(main_info.pob_backbuf[0]);
2223 if (main_info.pob_backbuf[1] != 0)
2224 free(main_info.pob_backbuf[1]);
2226 if (background_pic != 0)
2227 free(background_pic);
2231 remove_keyb_handler();
2234 __dpmi_int(0x10, ®s);
2236 if (main_info.error_str[0] != 0) {
2237 printf(main_info.error_str);
2252 c1 = x = y = flag = 0;
2257 s1 = inportb(0x201);
2267 if (x != 0 && y != 0)
2282 if (joy.raw_x < joy.calib_data.x2)
2283 joy.x = ((long) (joy.raw_x - joy.calib_data.x2) << 10) / (joy.calib_data.x2 - joy.calib_data.x1);
2285 joy.x = ((long) (joy.raw_x - joy.calib_data.x2) << 10) / (joy.calib_data.x3 - joy.calib_data.x2);
2286 if (joy.raw_y < joy.calib_data.y2)
2287 joy.y = ((long) (joy.raw_y - joy.calib_data.y2) << 10) / (joy.calib_data.y2 - joy.calib_data.y1);
2289 joy.y = ((long) (joy.raw_y - joy.calib_data.y2) << 10) / (joy.calib_data.y3 - joy.calib_data.y2);
2300 s1 = inportb(0x201);
2301 joy.but1 = (((s1 >> 4) & 1) ^ 1);
2302 joy.but2 = (((s1 >> 5) & 1) ^ 1);
2304 joy.raw_x = joy.calib_data.x2;
2305 joy.raw_y = joy.calib_data.y2;
2309 joy.but1 = joy.but2 = 0;
2315 char calib_joy(char type)
2323 while (joy.but1 == 1) {
2324 s1 = inportb(0x201);
2325 joy.but1 = (((s1 >> 4) & 1) ^ 1);
2326 if (key_pressed(1) == 1) {
2327 while (key_pressed(1) == 1);
2334 while (joy.but1 == 0) {
2336 c1 = x = y = flag = 0;
2341 s1 = inportb(0x201);
2351 if (x != 0 && y != 0)
2365 s1 = inportb(0x201);
2366 joy.but1 = (((s1 >> 4) & 1) ^ 1);
2368 if (num_times < 0x7fffffff)
2374 if (key_pressed(1) == 1) {
2375 while (key_pressed(1) == 1);
2388 joy.calib_data.x1 = joy.raw_x;
2389 joy.calib_data.y1 = joy.raw_y;
2392 joy.calib_data.x3 = joy.raw_x;
2393 joy.calib_data.y3 = joy.raw_y;
2396 joy.calib_data.x2 = joy.raw_x;
2397 joy.calib_data.y2 = joy.raw_y;
2401 while (joy.but1 == 1) {
2402 s1 = inportb(0x201);
2403 joy.but1 = (((s1 >> 4) & 1) ^ 1);
2413 void read_mouse(void)
2417 __dpmi_int(0x33, ®s);
2418 mouse.but1 = regs.x.bx & 1;
2419 mouse.but2 = (regs.x.bx & 2) >> 1;
2420 mouse.but3 = (regs.x.bx & 4) >> 2;
2425 unsigned short rnd(unsigned short max)
2429 l1 = ((random() >> 16) * max) / 0x7fff;
2436 char read_level(void)
2442 if ((handle = dat_open("levelmap.txt", datfile_name, "rb")) == 0) {
2443 strcpy(main_info.error_str, "Error loading 'levelmap.txt', aborting...\n");
2447 for (c1 = 0; c1 < 16; c1++) {
2448 for (c2 = 0; c2 < 22; c2++) {
2450 chr = fgetc(handle);
2455 if (chr >= '0' && chr <= '4')
2458 ban_map[c1][c2] = chr - '0';
2462 for (c2 = 0; c2 < 22; c2++)
2463 ban_map[16][c2] = 1;
2471 FILE *dat_open(char *file_name, char *dat_name, char *mode)
2479 if ((handle = fopen(dat_name, mode)) == NULL)
2482 num = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2483 for (c1 = 0; c1 < num; c1++) {
2484 fread(name, 1, 12, handle);
2485 if (strnicmp(name, file_name, strlen(file_name)) == 0) {
2486 ofs = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2487 fseek(handle, ofs, SEEK_SET);
2490 fseek(handle, 8, SEEK_CUR);
2497 int dat_filelen(char *file_name, char *dat_name)
2505 if ((handle = fopen(dat_name, "rb")) == NULL)
2508 num = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2509 for (c1 = 0; c1 < num; c1++) {
2510 fread(name, 1, 12, handle);
2511 if (strnicmp(name, file_name, strlen(file_name)) == 0) {
2512 fseek(handle, 4, SEEK_CUR);
2513 len = fgetc(handle) + (fgetc(handle) << 8) + (fgetc(handle) << 16) + (fgetc(handle) << 24);
2516 fseek(handle, 8, SEEK_CUR);
2522 void write_calib_data(void)
2530 if ((handle = fopen(datfile_name, "rb")) == NULL)
2532 len = filelength(fileno(handle));
2533 if ((mem = malloc(len)) == NULL)
2535 fread(mem, 1, len, handle);
2539 num = *(int *) (&mem[0]);
2540 for (c1 = 0; c1 < num; c1++) {
2541 if (strnicmp(&mem[ofs], "calib.dat", strlen("calib.dat")) == 0) {
2542 ofs = *(int *) (&mem[ofs + 12]);
2548 mem[ofs] = joy.calib_data.x1 & 0xff;
2549 mem[ofs + 1] = (joy.calib_data.x1 >> 8) & 0xff;
2550 mem[ofs + 2] = (joy.calib_data.x1 >> 16) & 0xff;
2551 mem[ofs + 3] = (joy.calib_data.x1 >> 24) & 0xff;
2552 mem[ofs + 4] = joy.calib_data.x2 & 0xff;
2553 mem[ofs + 5] = (joy.calib_data.x2 >> 8) & 0xff;
2554 mem[ofs + 6] = (joy.calib_data.x2 >> 16) & 0xff;
2555 mem[ofs + 7] = (joy.calib_data.x2 >> 24) & 0xff;
2556 mem[ofs + 8] = joy.calib_data.x3 & 0xff;
2557 mem[ofs + 9] = (joy.calib_data.x3 >> 8) & 0xff;
2558 mem[ofs + 10] = (joy.calib_data.x3 >> 16) & 0xff;
2559 mem[ofs + 11] = (joy.calib_data.x3 >> 24) & 0xff;
2560 mem[ofs + 12] = joy.calib_data.y1 & 0xff;
2561 mem[ofs + 13] = (joy.calib_data.y1 >> 8) & 0xff;
2562 mem[ofs + 14] = (joy.calib_data.y1 >> 16) & 0xff;
2563 mem[ofs + 15] = (joy.calib_data.y1 >> 24) & 0xff;
2564 mem[ofs + 16] = joy.calib_data.y2 & 0xff;
2565 mem[ofs + 17] = (joy.calib_data.y2 >> 8) & 0xff;
2566 mem[ofs + 18] = (joy.calib_data.y2 >> 16) & 0xff;
2567 mem[ofs + 19] = (joy.calib_data.y2 >> 24) & 0xff;
2568 mem[ofs + 20] = joy.calib_data.y3 & 0xff;
2569 mem[ofs + 21] = (joy.calib_data.y3 >> 8) & 0xff;
2570 mem[ofs + 22] = (joy.calib_data.y3 >> 16) & 0xff;
2571 mem[ofs + 23] = (joy.calib_data.y3 >> 24) & 0xff;
2573 if ((handle = fopen(datfile_name, "wb")) == NULL)
2575 fwrite(mem, 1, len, handle);