1 /* first part of synchro.
3 * game logic for players.
5 * large switch statement for tiles the player interacts with.
15 extern int centered_player_nr;
18 extern boolean checkIfAllPlayersFitToScreen();
20 static void check_player(struct PLAYER *);
21 static void kill_player(struct PLAYER *);
22 static boolean player_digfield(struct PLAYER *, int, int);
23 static boolean player_killed(struct PLAYER *);
32 game_em.any_player_moving = FALSE;
34 /* must test for death and actually kill separately */
36 for (i = 0; i < MAX_PLAYERS; i++)
38 boolean ply_kill = player_killed(&ply[i]);
40 if (ply[i].alive && ply_kill)
46 /* must test for death and actually kill separately */
47 boolean ply1_kill = player_killed(&ply1);
48 boolean ply2_kill = player_killed(&ply2);
50 if (ply1.alive && ply1_kill)
52 if (ply2.alive && ply2_kill)
58 ply1.alive = 1; /* debugging */
63 for (i = 0; i < MAX_PLAYERS; i++)
65 ply[i].oldx = ply[i].x;
66 ply[i].oldy = ply[i].y;
67 ply[i].anim = SPR_still;
70 start_check_nr = (RandomEM & 128 ? 0 : 1) * 2 + (RandomEM & 256 ? 0 : 1);
72 for (i = 0; i < MAX_PLAYERS; i++)
74 int check_nr = (start_check_nr + i) % MAX_PLAYERS;
76 if (ply[check_nr].alive)
77 check_player(&ply[check_nr]);
80 for (i = 0; i < MAX_PLAYERS; i++)
85 if (Cave[ply[i].oldy][ply[i].oldx] == Zplayer)
87 Cave[ply[i].oldy][ply[i].oldx] = Xblank;
88 Next[ply[i].oldy][ply[i].oldx] = Xblank;
91 if (Cave[ply[i].y][ply[i].x] == Xblank)
93 Cave[ply[i].y][ply[i].x] = Zplayer;
94 Next[ply[i].y][ply[i].x] = Zplayer;
102 ply1.anim = SPR_still;
105 ply2.anim = SPR_still;
109 if (ply1.alive) check_player(&ply1);
110 if (ply2.alive) check_player(&ply2);
114 if (ply2.alive) check_player(&ply2);
115 if (ply1.alive) check_player(&ply1);
120 if (Cave[ply1.oldy][ply1.oldx] == Zplayer)
122 Cave[ply1.oldy][ply1.oldx] = Xblank;
123 Next[ply1.oldy][ply1.oldx] = Xblank;
126 if (Cave[ply1.y][ply1.x] == Xblank)
128 Cave[ply1.y][ply1.x] = Zplayer;
129 Next[ply1.y][ply1.x] = Zplayer;
135 if (Cave[ply2.oldy][ply2.oldx] == Zplayer)
137 Cave[ply2.oldy][ply2.oldx] = Xblank;
138 Next[ply2.oldy][ply2.oldx] = Xblank;
141 if (Cave[ply2.y][ply2.x] == Xblank)
143 Cave[ply2.y][ply2.x] = Zplayer;
144 Next[ply2.y][ply2.x] = Zplayer;
151 static boolean player_killed(struct PLAYER *ply)
157 printf("::: %d: %d, %d\n", ply->num, x, y);
164 if (lev.killed_out_of_time && setup.time_limit)
167 if (lev.time_initial > 0 && lev.time == 0 && setup.time_limit)
258 case Yacid_splash_eB:
259 case Yacid_splash_wB:
281 static void kill_player(struct PLAYER *ply)
298 Cave[y-1][x] = Xboom_bug;
300 play_element_sound(x, y, SAMPLE_boom, Zplayer);
312 Cave[y-1][x] = Xboom_bomb;
314 play_element_sound(x, y, SAMPLE_boom, Zplayer);
329 Cave[y][x+1] = Xboom_bug;
331 play_element_sound(x, y, SAMPLE_boom, Zplayer);
343 Cave[y][x+1] = Xboom_bomb;
345 play_element_sound(x, y, SAMPLE_boom, Zplayer);
360 Cave[y+1][x] = Xboom_bug;
362 play_element_sound(x, y, SAMPLE_boom, Zplayer);
374 Cave[y+1][x] = Xboom_bomb;
376 play_element_sound(x, y, SAMPLE_boom, Zplayer);
391 Cave[y][x-1] = Xboom_bug;
393 play_element_sound(x, y, SAMPLE_boom, Zplayer);
405 Cave[y][x-1] = Xboom_bomb;
407 play_element_sound(x, y, SAMPLE_boom, Zplayer);
417 play_element_sound(x, y, SAMPLE_exit_leave, Xexit_1);
421 play_element_sound(x, y, SAMPLE_die, Zplayer);
440 Cave[y][x] = Xboom_1;
446 static void check_player(struct PLAYER *ply)
456 printf("::: up == %d, down == %d, left == %d, right == %d, fire == %d [spin == %d, stick == %d]\n",
457 ply->joy_n, ply->joy_s, ply->joy_w, ply->joy_e, ply->joy_fire,
458 ply->joy_spin, ply->joy_stick);
462 if (ply->joy_w) /* west */
468 else if (ply->joy_e) /* east */
475 if (ply->joy_n) /* north */
481 else if (ply->joy_s) /* south */
490 if ((ply->joy_spin = !ply->joy_spin))
492 if (ply->joy_n) /* north */
498 else if (ply->joy_e) /* east */
504 else if (ply->joy_s) /* south */
510 else if (ply->joy_w) /* west */
519 if (ply->joy_w) /* west */
525 else if (ply->joy_s) /* south */
531 else if (ply->joy_e) /* east */
537 else if (ply->joy_n) /* north */
552 boolean can_move = TRUE;
557 can_move = (game.centered_player_nr != -1 ||
558 checkIfAllPlayersFitToScreen());
565 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
571 if (dx == 0 && dy == 0)
577 if (++ply->dynamite_cnt == 5 && ply->dynamite)
579 Cave[y][x] = Xdynamite_1;
580 play_element_sound(x, y, SAMPLE_dynamite, Xdynamite_1);
586 ply->dynamite_cnt = 0;
589 RandomEM += 7; /* be a bit more random if the player doesn't move */
595 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
596 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
597 ply->joy_spin = !ply->joy_spin;
599 if (ply->joy_snap == 0) /* player wants to move */
601 boolean moved = FALSE;
603 if (ply->last_move_dir & MV_HORIZONTAL)
605 if (!(moved = player_digfield(ply, 0, dy)))
606 moved = player_digfield(ply, dx, 0);
610 if (!(moved = player_digfield(ply, dx, 0)))
611 moved = player_digfield(ply, 0, dy);
617 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
618 else if (oldy != ply->y)
619 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
621 game_em.any_player_moving = TRUE;
622 game_em.last_moving_player = ply->num;
623 game_em.last_player_direction[ply->num] = ply->last_move_dir;
626 else /* player wants to snap */
628 player_digfield(ply, dx, dy);
632 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
634 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
639 boolean result = TRUE;
641 if (!dx && !dy) /* no direction specified */
644 if (dx && dy && ply->joy_snap) /* more than one direction specified */
647 if (ply->joy_snap == 0) /* player wants to move */
649 int element = Cave[y][x];
653 /* fire is released */
655 case Yacid_splash_eB:
656 case Yacid_splash_wB:
657 Cave[y][x] = Zplayer;
658 Next[y][x] = Zplayer;
669 play_element_sound(x, y, SAMPLE_blank, Xblank);
670 ply->anim = SPR_walk + anim;
685 if (Cave[y-1][x+1] == Xblank)
686 Cave[y-1][x+1] = Yacid_splash_eB;
687 if (Cave[y-1][x-1] == Xblank)
688 Cave[y-1][x-1] = Yacid_splash_wB;
689 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
719 ply->anim = SPR_walk + anim;
725 Cave[y][x] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
726 (dx > 0 ? Ygrass_eB : Ygrass_wB));
727 Next[y][x] = Zplayer;
728 play_element_sound(x, y, SAMPLE_dirt, Xgrass);
729 ply->anim = SPR_walk + anim;
735 Cave[y][x] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
736 (dx > 0 ? Ydirt_eB : Ydirt_wB));
737 Next[y][x] = Zplayer;
738 play_element_sound(x, y, SAMPLE_dirt, Xdirt);
739 ply->anim = SPR_walk + anim;
746 Cave[y][x] = Ydiamond_eat;
747 Next[y][x] = Zplayer;
748 play_element_sound(x, y, SAMPLE_collect, element);
749 lev.score += lev.diamond_score;
750 lev.required = lev.required < 3 ? 0 : lev.required - 3;
751 ply->anim = SPR_walk + anim;
758 Cave[y][x] = Yemerald_eat;
759 Next[y][x] = Zplayer;
760 play_element_sound(x, y, SAMPLE_collect, element);
761 lev.score += lev.emerald_score;
762 lev.required = lev.required < 1 ? 0 : lev.required - 1;
763 ply->anim = SPR_walk + anim;
769 Cave[y][x] = Ydynamite_eat;
770 Next[y][x] = Zplayer;
771 play_element_sound(x, y, SAMPLE_collect, element);
772 lev.score += lev.dynamite_score;
773 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
774 ply->anim = SPR_walk + anim;
781 Cave[y][x] = Ykey_1_eat;
786 Cave[y][x] = Ykey_2_eat;
791 Cave[y][x] = Ykey_3_eat;
796 Cave[y][x] = Ykey_4_eat;
801 Cave[y][x] = Ykey_5_eat;
806 Cave[y][x] = Ykey_6_eat;
811 Cave[y][x] = Ykey_7_eat;
816 Cave[y][x] = Ykey_8_eat;
821 Next[y][x] = Zplayer;
822 play_element_sound(x, y, SAMPLE_collect, element);
823 lev.score += lev.key_score;
824 ply->anim = SPR_walk + anim;
830 Cave[y][x] = Ylenses_eat;
831 Next[y][x] = Zplayer;
832 play_element_sound(x, y, SAMPLE_collect, element);
833 lev.score += lev.lenses_score;
834 lev.lenses_cnt = lev.lenses_time;
835 ply->anim = SPR_walk + anim;
841 Cave[y][x] = Ymagnify_eat;
842 Next[y][x] = Zplayer;
843 play_element_sound(x, y, SAMPLE_collect, element);
844 lev.score += lev.magnify_score;
845 lev.magnify_cnt = lev.magnify_time;
846 ply->anim = SPR_walk + anim;
855 switch(Cave[y][x+dx])
865 if (Cave[y-1][x+dx+1] == Xblank)
866 Cave[y-1][x+dx+1] = Yacid_splash_eB;
867 if (Cave[y-1][x+dx-1] == Xblank)
868 Cave[y-1][x+dx-1] = Yacid_splash_wB;
869 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
873 case Yacid_splash_eB:
874 case Yacid_splash_wB:
875 Cave[y][x+dx] = dx > 0 ? Ystone_e : Ystone_w;
876 Next[y][x+dx] = Xstone_pause;
880 Cave[y][x] = dx > 0 ? Ystone_eB : Ystone_wB;
881 Next[y][x] = Zplayer;
882 play_element_sound(x, y, SAMPLE_roll, Xstone);
886 ply->anim = SPR_push + anim;
893 switch(Cave[y][x+dx])
903 if (Cave[y-1][x+dx+1] == Xblank)
904 Cave[y-1][x+dx+1] = Yacid_splash_eB;
905 if (Cave[y-1][x+dx-1] == Xblank)
906 Cave[y-1][x+dx-1] = Yacid_splash_wB;
907 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
911 case Yacid_splash_eB:
912 case Yacid_splash_wB:
913 Cave[y][x+dx] = dx > 0 ? Ybomb_e : Ybomb_w;
914 Next[y][x+dx] = Xbomb_pause;
918 Cave[y][x] = dx > 0 ? Ybomb_eB : Ybomb_wB;
919 Next[y][x] = Zplayer;
920 play_element_sound(x, y, SAMPLE_roll, Xbomb);
924 ply->anim = SPR_push + anim;
931 switch(Cave[y][x+dx])
941 if (Cave[y-1][x+dx+1] == Xblank)
942 Cave[y-1][x+dx+1] = Yacid_splash_eB;
943 if (Cave[y-1][x+dx-1] == Xblank)
944 Cave[y-1][x+dx-1] = Yacid_splash_wB;
945 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
949 case Yacid_splash_eB:
950 case Yacid_splash_wB:
951 Cave[y][x+dx] = dx > 0 ? Ynut_e : Ynut_w;
952 Next[y][x+dx] = Xnut_pause;
956 Cave[y][x] = dx > 0 ? Ynut_eB : Ynut_wB;
957 Next[y][x] = Zplayer;
958 play_element_sound(x, y, SAMPLE_roll, Xnut);
962 ply->anim = SPR_push + anim;
969 switch(Cave[y][x+dx])
973 Cave[y][x] = dx > 0 ? Yspring_kill_eB : Yspring_kill_wB;
974 Cave[y][x+dx] = dx > 0 ? Yspring_kill_e : Yspring_kill_w;
975 Next[y][x] = Zplayer;
976 Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
977 play_element_sound(x, y, SAMPLE_slurp, Xalien);
978 lev.score += lev.slurp_score;
990 if (Cave[y-1][x+dx+1] == Xblank)
991 Cave[y-1][x+dx+1] = Yacid_splash_eB;
992 if (Cave[y-1][x+dx-1] == Xblank)
993 Cave[y-1][x+dx-1] = Yacid_splash_wB;
994 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
998 case Yacid_splash_eB:
999 case Yacid_splash_wB:
1000 Cave[y][x+dx] = dx > 0 ? Yspring_e : Yspring_w;
1001 Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
1004 Cave[y][x] = dx > 0 ? Yspring_eB : Yspring_wB;
1005 Next[y][x] = Zplayer;
1006 play_element_sound(x, y, SAMPLE_roll, Xspring);
1010 ply->anim = SPR_push + anim;
1017 case Xsand_stonein_1:
1018 case Xsand_stonein_2:
1019 case Xsand_stonein_3:
1020 case Xsand_stonein_4:
1024 ply->anim = SPR_push + anim;
1028 switch(Cave[y+dy][x+dx])
1038 if (Cave[y+dy-1][x+dx+1] == Xblank)
1039 Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
1040 if (Cave[y+dy-1][x+dx-1] == Xblank)
1041 Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
1042 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
1046 case Yacid_splash_eB:
1047 case Yacid_splash_wB:
1048 Cave[y+dy][x+dx] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
1049 (dx > 0 ? Yballoon_e : Yballoon_w));
1050 Next[y+dy][x+dx] = Xballoon;
1053 Cave[y][x] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
1054 (dx > 0 ? Yballoon_eB : Yballoon_wB));
1055 Next[y][x] = Zplayer;
1056 play_element_sound(x, y, SAMPLE_push, Xballoon);
1061 ply->anim = SPR_push + anim;
1073 switch(Cave[y+dy][x+dx])
1083 if (Cave[y+dy-1][x+dx+1] == Xblank)
1084 Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
1085 if (Cave[y+dy-1][x+dx-1] == Xblank)
1086 Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
1087 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
1091 case Yacid_splash_eB:
1092 case Yacid_splash_wB:
1093 Cave[y+dy][x+dx] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
1094 (dx > 0 ? Yandroid_e : Yandroid_w));
1095 Next[y+dy][x+dx] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
1096 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
1099 Cave[y][x] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
1100 (dx > 0 ? Yandroid_eB : Yandroid_wB));
1101 Next[y][x] = Zplayer;
1102 play_element_sound(x, y, SAMPLE_push, Xandroid);
1107 ply->anim = SPR_push + anim;
1112 if (ply->keys & 0x01)
1119 if (ply->keys & 0x02)
1126 if (ply->keys & 0x04)
1133 if (ply->keys & 0x08)
1140 if (ply->keys & 0x10)
1147 if (ply->keys & 0x20)
1154 if (ply->keys & 0x40)
1161 if (ply->keys & 0x80)
1167 if (!tab_blank[Cave[y+dy][x+dx]])
1170 Cave[y+dy][x+dx] = Zplayer;
1171 Next[y+dy][x+dx] = Zplayer;
1172 play_element_sound(x, y, SAMPLE_door, element);
1173 ply->anim = SPR_walk + anim;
1179 play_element_sound(x, y, SAMPLE_press, element);
1180 lev.wheel_cnt = lev.wheel_time;
1186 lev.wind_direction = 0;
1190 lev.wind_direction = 1;
1194 lev.wind_direction = 2;
1198 lev.wind_direction = 3;
1202 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
1206 play_element_sound(x, y, SAMPLE_press, element);
1207 lev.wind_cnt = lev.wind_time;
1211 play_element_sound(x, y, SAMPLE_press, element);
1216 play_element_sound(x, y, SAMPLE_press, element);
1217 lev.ball_cnt = lev.ball_time;
1218 lev.ball_state = !lev.ball_state;
1222 Cave[y][x] = Yplant;
1223 Next[y][x] = Xplant;
1224 play_element_sound(x, y, SAMPLE_blank, Xplant);
1225 ply->anim = SPR_walk + anim;
1233 play_element_sound(x, y, SAMPLE_exit_leave, Xexit_1);
1238 /* !!! CHECK SCORE CALCULATION !!! */
1239 if (lev.home == 0 && lev.time_initial > 0) /* game won */
1240 lev.score += lev.time * lev.exit_score / 100;
1243 ply->anim = SPR_walk + anim;
1250 if (ply->x == oldx && ply->y == oldy) /* no movement */
1253 else /* player wants to snap */
1255 int element = Cave[y][x];
1259 /* fire is pressed */
1262 Cave[y][x] = Ygrass_eat;
1263 Next[y][x] = Xblank;
1264 play_element_sound(x, y, SAMPLE_dirt, element);
1265 ply->anim = SPR_spray + anim;
1269 Cave[y][x] = Ydirt_eat;
1270 Next[y][x] = Xblank;
1271 play_element_sound(x, y, SAMPLE_dirt, element);
1272 ply->anim = SPR_spray + anim;
1276 case Xdiamond_pause:
1277 Cave[y][x] = Ydiamond_eat;
1278 Next[y][x] = Xblank;
1279 play_element_sound(x, y, SAMPLE_collect, element);
1280 lev.score += lev.diamond_score;
1281 lev.required = lev.required < 3 ? 0 : lev.required - 3;
1282 ply->anim = SPR_walk + anim;
1286 case Xemerald_pause:
1287 Cave[y][x] = Yemerald_eat;
1288 Next[y][x] = Xblank;
1289 play_element_sound(x, y, SAMPLE_collect, element);
1290 lev.score += lev.emerald_score;
1291 lev.required = lev.required < 1 ? 0 : lev.required - 1;
1292 ply->anim = SPR_walk + anim;
1296 Cave[y][x] = Ydynamite_eat;
1297 Next[y][x] = Xblank;
1298 play_element_sound(x, y, SAMPLE_collect, element);
1299 lev.score += lev.dynamite_score;
1300 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1301 ply->anim = SPR_walk + anim;
1306 Cave[y][x] = Ykey_1_eat;
1311 Cave[y][x] = Ykey_2_eat;
1316 Cave[y][x] = Ykey_3_eat;
1321 Cave[y][x] = Ykey_4_eat;
1326 Cave[y][x] = Ykey_5_eat;
1331 Cave[y][x] = Ykey_6_eat;
1336 Cave[y][x] = Ykey_7_eat;
1341 Cave[y][x] = Ykey_8_eat;
1345 Next[y][x] = Xblank;
1346 play_element_sound(x, y, SAMPLE_collect, element);
1347 lev.score += lev.key_score;
1348 ply->anim = SPR_walk + anim;
1352 Cave[y][x] = Ylenses_eat;
1353 Next[y][x] = Xblank;
1354 play_element_sound(x, y, SAMPLE_collect, element);
1355 lev.score += lev.lenses_score;
1356 lev.lenses_cnt = lev.lenses_time;
1357 ply->anim = SPR_walk + anim;
1361 Cave[y][x] = Ymagnify_eat;
1362 Next[y][x] = Xblank;
1363 play_element_sound(x, y, SAMPLE_collect, element);
1364 lev.score += lev.magnify_score;
1365 lev.magnify_cnt = lev.magnify_time;
1366 ply->anim = SPR_walk + anim;