1 /* first part of synchro.
3 * game logic for players.
5 * large switch statement for tiles the player interacts with.
13 #if defined(TARGET_X11)
15 static void player(struct PLAYER *);
16 static int test(struct PLAYER *);
17 static void die(struct PLAYER *);
21 /* must test for death and actually kill separately */
22 char ply1_kill = test(&ply1);
23 char ply2_kill = test(&ply2);
25 if (ply1.alive && ply1_kill)
27 if (ply2.alive && ply2_kill)
31 ply1.alive = 1; /* debugging */
36 ply1.anim = SPR_still;
39 ply2.anim = SPR_still;
43 if (ply1.alive) player(&ply1);
44 if (ply2.alive) player(&ply2);
48 if (ply2.alive) player(&ply2);
49 if (ply1.alive) player(&ply1);
54 if (Cave[ply1.oldy][ply1.oldx] == Zplayer)
56 Cave[ply1.oldy][ply1.oldx] = Xblank;
57 Next[ply1.oldy][ply1.oldx] = Xblank;
60 if (Cave[ply1.y][ply1.x] == Xblank)
62 Cave[ply1.y][ply1.x] = Zplayer;
63 Next[ply1.y][ply1.x] = Zplayer;
69 if (Cave[ply2.oldy][ply2.oldx] == Zplayer)
71 Cave[ply2.oldy][ply2.oldx] = Xblank;
72 Next[ply2.oldy][ply2.oldx] = Xblank;
75 if (Cave[ply2.y][ply2.x] == Xblank)
77 Cave[ply2.y][ply2.x] = Zplayer;
78 Next[ply2.y][ply2.x] = Zplayer;
83 static int test(struct PLAYER *ply)
85 register unsigned int x = ply->x;
86 register unsigned int y = ply->y;
178 case Yacid_splash_eB:
179 case Yacid_splash_wB:
191 static void die(struct PLAYER *ply)
193 register unsigned int x = ply->x;
194 register unsigned int y = ply->y;
208 Cave[y-1][x] = Xboom_bug;
219 Cave[y-1][x] = Xboom_bomb;
233 Cave[y][x+1] = Xboom_bug;
244 Cave[y][x+1] = Xboom_bomb;
258 Cave[y+1][x] = Xboom_bug;
269 Cave[y+1][x] = Xboom_bomb;
283 Cave[y][x-1] = Xboom_bug;
294 Cave[y][x-1] = Xboom_bomb;
303 play[SAMPLE_exit] = 1;
307 play[SAMPLE_die] = 1;
311 Cave[y][x] = Xboom_1;
315 static void player(struct PLAYER *ply)
317 register unsigned int x = ply->x;
318 register unsigned int y = ply->y;
319 unsigned int anim = 0; /* initialized to make compilers happy */
322 if ((ply->joy_spin = !ply->joy_spin))
385 if (dx == 0 && dy == 0)
391 if (++ply->dynamite_cnt == 5 && ply->dynamite)
393 Cave[y][x] = Xdynamite_1;
394 play[SAMPLE_dynamite] = 1;
400 ply->dynamite_cnt = 0;
403 Random += 7; /* bit more random if we dont move */
409 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
410 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
412 if (ply->joy_fire == 0)
416 /* fire is released */
418 case Yacid_splash_eB:
419 case Yacid_splash_wB:
420 Cave[y][x] = Zplayer;
421 Next[y][x] = Zplayer;
422 play[SAMPLE_blank] = 1;
423 ply->anim = SPR_walk + anim;
454 ply->anim = SPR_walk + anim;
460 Cave[y][x] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
461 (dx > 0 ? Ygrass_eB : Ygrass_wB));
462 Next[y][x] = Zplayer;
463 play[SAMPLE_dirt] = 1;
464 ply->anim = SPR_walk + anim;
470 Cave[y][x] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
471 (dx > 0 ? Ydirt_eB : Ydirt_wB));
472 Next[y][x] = Zplayer;
473 play[SAMPLE_dirt] = 1;
474 ply->anim = SPR_walk + anim;
481 Cave[y][x] = Ydiamond_eat;
482 Next[y][x] = Zplayer;
483 play[SAMPLE_collect] = 1;
484 lev.score += lev.diamond_score;
485 lev.required = lev.required < 3 ? 0 : lev.required - 3;
486 ply->anim = SPR_walk + anim;
493 Cave[y][x] = Yemerald_eat;
494 Next[y][x] = Zplayer;
495 play[SAMPLE_collect] = 1;
496 lev.score += lev.emerald_score;
497 lev.required = lev.required < 1 ? 0 : lev.required - 1;
498 ply->anim = SPR_walk + anim;
504 Cave[y][x] = Ydynamite_eat;
505 Next[y][x] = Zplayer;
506 play[SAMPLE_collect] = 1;
507 lev.score += lev.dynamite_score;
508 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
509 ply->anim = SPR_walk + anim;
548 Cave[y][x] = Yball_eat;
549 Next[y][x] = Zplayer;
550 play[SAMPLE_collect] = 1;
551 lev.score += lev.key_score;
552 ply->anim = SPR_walk + anim;
558 Cave[y][x] = Yball_eat;
559 Next[y][x] = Zplayer;
560 play[SAMPLE_collect] = 1;
561 lev.score += lev.lenses_score;
562 lev.lenses_cnt = lev.lenses_time;
563 ply->anim = SPR_walk + anim;
569 Cave[y][x] = Yball_eat;
570 Next[y][x] = Zplayer;
571 play[SAMPLE_collect] = 1;
572 lev.score += lev.magnify_score;
573 lev.magnify_cnt = lev.magnify_time;
574 ply->anim = SPR_walk + anim;
583 switch(Cave[y][x+dx])
593 if (Cave[y-1][x+dx+1] == Xblank)
594 Cave[y-1][x+dx+1] = Yacid_splash_eB;
595 if (Cave[y-1][x+dx-1] == Xblank)
596 Cave[y-1][x+dx-1] = Yacid_splash_wB;
597 play[SAMPLE_acid] = 1;
601 case Yacid_splash_eB:
602 case Yacid_splash_wB:
603 Cave[y][x+dx] = dx > 0 ? Ystone_e : Ystone_w;
604 Next[y][x+dx] = Xstone_pause;
608 Cave[y][x] = dx > 0 ? Ystone_eB : Ystone_wB;
609 Next[y][x] = Zplayer;
610 play[SAMPLE_roll] = 1;
614 ply->anim = SPR_push + anim;
621 switch(Cave[y][x+dx])
631 if (Cave[y-1][x+dx+1] == Xblank)
632 Cave[y-1][x+dx+1] = Yacid_splash_eB;
633 if (Cave[y-1][x+dx-1] == Xblank)
634 Cave[y-1][x+dx-1] = Yacid_splash_wB;
635 play[SAMPLE_acid] = 1;
639 case Yacid_splash_eB:
640 case Yacid_splash_wB:
641 Cave[y][x+dx] = dx > 0 ? Ybomb_e : Ybomb_w;
642 Next[y][x+dx] = Xbomb_pause;
646 Cave[y][x] = dx > 0 ? Ybomb_eB : Ybomb_wB;
647 Next[y][x] = Zplayer;
648 play[SAMPLE_roll] = 1;
652 ply->anim = SPR_push + anim;
659 switch(Cave[y][x+dx])
669 if (Cave[y-1][x+dx+1] == Xblank)
670 Cave[y-1][x+dx+1] = Yacid_splash_eB;
671 if (Cave[y-1][x+dx-1] == Xblank)
672 Cave[y-1][x+dx-1] = Yacid_splash_wB;
673 play[SAMPLE_acid] = 1;
677 case Yacid_splash_eB:
678 case Yacid_splash_wB:
679 Cave[y][x+dx] = dx > 0 ? Ynut_e : Ynut_w;
680 Next[y][x+dx] = Xnut_pause;
684 Cave[y][x] = dx > 0 ? Ynut_eB : Ynut_wB;
685 Next[y][x] = Zplayer;
686 play[SAMPLE_roll] = 1;
690 ply->anim = SPR_push + anim;
697 switch(Cave[y][x+dx])
701 Cave[y][x] = dx > 0 ? Yspring_kill_eB : Yspring_kill_wB;
702 Cave[y][x+dx] = dx > 0 ? Yspring_kill_e : Yspring_kill_w;
703 Next[y][x] = Zplayer;
704 Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
705 play[SAMPLE_slurp] = 1;
706 lev.score += lev.slurp_score;
718 if (Cave[y-1][x+dx+1] == Xblank)
719 Cave[y-1][x+dx+1] = Yacid_splash_eB;
720 if (Cave[y-1][x+dx-1] == Xblank)
721 Cave[y-1][x+dx-1] = Yacid_splash_wB;
722 play[SAMPLE_acid] = 1;
726 case Yacid_splash_eB:
727 case Yacid_splash_wB:
728 Cave[y][x+dx] = dx > 0 ? Yspring_e : Yspring_w;
729 Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
732 Cave[y][x] = dx > 0 ? Yspring_eB : Yspring_wB;
733 Next[y][x] = Zplayer;
734 play[SAMPLE_roll] = 1;
738 ply->anim = SPR_push + anim;
745 case Xsand_stonein_1:
746 case Xsand_stonein_2:
747 case Xsand_stonein_3:
748 case Xsand_stonein_4:
752 ply->anim = SPR_push + anim;
756 switch(Cave[y+dy][x+dx])
766 if (Cave[y+dy-1][x+dx+1] == Xblank)
767 Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
768 if (Cave[y+dy-1][x+dx-1] == Xblank)
769 Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
770 play[SAMPLE_acid] = 1;
774 case Yacid_splash_eB:
775 case Yacid_splash_wB:
776 Cave[y+dy][x+dx] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
777 (dx > 0 ? Yballoon_e : Yballoon_w));
778 Next[y+dy][x+dx] = Xballoon;
781 Cave[y][x] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
782 (dx > 0 ? Yballoon_eB : Yballoon_wB));
783 Next[y][x] = Zplayer;
784 play[SAMPLE_push] = 1;
789 ply->anim = SPR_push + anim;
801 switch(Cave[y+dy][x+dx])
811 if (Cave[y+dy-1][x+dx+1] == Xblank)
812 Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
813 if (Cave[y+dy-1][x+dx-1] == Xblank)
814 Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
815 play[SAMPLE_acid] = 1;
819 case Yacid_splash_eB:
820 case Yacid_splash_wB:
821 Cave[y+dy][x+dx] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
822 (dx > 0 ? Yandroid_e : Yandroid_w));
823 Next[y+dy][x+dx] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
824 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
827 Cave[y][x] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
828 (dx > 0 ? Yandroid_eB : Yandroid_wB));
829 Next[y][x] = Zplayer;
830 play[SAMPLE_push] = 1;
835 ply->anim = SPR_push + anim;
840 if (ply->keys & 0x01)
847 if (ply->keys & 0x02)
854 if (ply->keys & 0x04)
861 if (ply->keys & 0x08)
868 if (ply->keys & 0x10)
875 if (ply->keys & 0x20)
882 if (ply->keys & 0x40)
889 if (ply->keys & 0x80)
895 if (!tab_blank[Cave[y+dy][x+dx]])
898 Cave[y+dy][x+dx] = Zplayer;
899 Next[y+dy][x+dx] = Zplayer;
900 play[SAMPLE_door] = 1;
901 ply->anim = SPR_walk + anim;
907 play[SAMPLE_press] = 1;
908 lev.wheel_cnt = lev.wheel_time;
914 lev.wind_direction = 0;
918 lev.wind_direction = 1;
922 lev.wind_direction = 2;
926 lev.wind_direction = 3;
930 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
934 play[SAMPLE_press] = 1;
935 lev.wind_cnt = lev.wind_time;
939 play[SAMPLE_press] = 1;
944 play[SAMPLE_press] = 1;
945 lev.ball_cnt = lev.ball_time;
946 lev.ball_state = !lev.ball_state;
952 play[SAMPLE_blank] = 1;
953 ply->anim = SPR_walk + anim;
961 play[SAMPLE_exit] = 1;
963 lev.score += lev.time * lev.exit_score / 100;
964 ply->anim = SPR_walk + anim;
974 /* fire is pressed */
978 Cave[y][x] = Yball_eat;
980 play[SAMPLE_dirt] = 1;
981 ply->anim = SPR_spray + anim;
986 Cave[y][x] = Ydiamond_eat;
988 play[SAMPLE_collect] = 1;
989 lev.score += lev.diamond_score;
990 lev.required = lev.required < 3 ? 0 : lev.required - 3;
991 ply->anim = SPR_walk + anim;
996 Cave[y][x] = Yemerald_eat;
998 play[SAMPLE_collect] = 1;
999 lev.score += lev.emerald_score;
1000 lev.required = lev.required < 1 ? 0 : lev.required - 1;
1001 ply->anim = SPR_walk + anim;
1005 Cave[y][x] = Ydynamite_eat;
1006 Next[y][x] = Xblank;
1007 play[SAMPLE_collect] = 1;
1008 lev.score += lev.dynamite_score;
1009 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1010 ply->anim = SPR_walk + anim;
1046 Cave[y][x] = Yball_eat;
1047 Next[y][x] = Xblank;
1048 play[SAMPLE_collect] = 1;
1049 lev.score += lev.key_score;
1050 ply->anim = SPR_walk + anim;
1054 Cave[y][x] = Yball_eat;
1055 Next[y][x] = Xblank;
1056 play[SAMPLE_collect] = 1;
1057 lev.score += lev.lenses_score;
1058 lev.lenses_cnt = lev.lenses_time;
1059 ply->anim = SPR_walk + anim;
1063 Cave[y][x] = Yball_eat;
1064 Next[y][x] = Xblank;
1065 play[SAMPLE_collect] = 1;
1066 lev.score += lev.magnify_score;
1067 lev.magnify_cnt = lev.magnify_time;
1068 ply->anim = SPR_walk + anim;