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)
455 game_em.last_player_direction[ply->num] = MV_NONE;
458 printf("::: up == %d, down == %d, left == %d, right == %d, fire == %d [spin == %d, stick == %d]\n",
459 ply->joy_n, ply->joy_s, ply->joy_w, ply->joy_e, ply->joy_fire,
460 ply->joy_spin, ply->joy_stick);
464 if (ply->joy_w) /* west */
470 else if (ply->joy_e) /* east */
477 if (ply->joy_n) /* north */
483 else if (ply->joy_s) /* south */
492 if ((ply->joy_spin = !ply->joy_spin))
494 if (ply->joy_n) /* north */
500 else if (ply->joy_e) /* east */
506 else if (ply->joy_s) /* south */
512 else if (ply->joy_w) /* west */
521 if (ply->joy_w) /* west */
527 else if (ply->joy_s) /* south */
533 else if (ply->joy_e) /* east */
539 else if (ply->joy_n) /* north */
554 boolean can_move = TRUE;
559 can_move = (game.centered_player_nr != -1 ||
560 checkIfAllPlayersFitToScreen());
567 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
573 if (dx == 0 && dy == 0)
579 if (++ply->dynamite_cnt == 5 && ply->dynamite)
581 Cave[y][x] = Xdynamite_1;
582 play_element_sound(x, y, SAMPLE_dynamite, Xdynamite_1);
588 ply->dynamite_cnt = 0;
591 RandomEM += 7; /* be a bit more random if the player doesn't move */
597 ply->joy_n = ply->joy_e = ply->joy_s = ply->joy_w = 0;
598 ply->dynamite_cnt = 0; /* reset dynamite timer if we move */
599 ply->joy_spin = !ply->joy_spin;
601 if (ply->joy_snap == 0) /* player wants to move */
603 boolean moved = FALSE;
605 if (ply->last_move_dir & MV_HORIZONTAL)
607 if (!(moved = player_digfield(ply, 0, dy)))
608 moved = player_digfield(ply, dx, 0);
612 if (!(moved = player_digfield(ply, dx, 0)))
613 moved = player_digfield(ply, 0, dy);
619 ply->last_move_dir = (dx < 0 ? MV_LEFT : MV_RIGHT);
620 else if (oldy != ply->y)
621 ply->last_move_dir = (dy < 0 ? MV_UP : MV_DOWN);
623 game_em.any_player_moving = TRUE;
624 game_em.last_moving_player = ply->num;
625 game_em.last_player_direction[ply->num] = ply->last_move_dir;
628 else /* player wants to snap */
630 player_digfield(ply, dx, dy);
634 static boolean player_digfield(struct PLAYER *ply, int dx, int dy)
636 int anim = (dx < 0 ? 3 : dx > 0 ? 1 : dy < 0 ? 0 : dy > 0 ? 2 : 2);
641 boolean result = TRUE;
643 if (!dx && !dy) /* no direction specified */
646 if (dx && dy && ply->joy_snap) /* more than one direction specified */
649 if (ply->joy_snap == 0) /* player wants to move */
651 int element = Cave[y][x];
655 /* fire is released */
657 case Yacid_splash_eB:
658 case Yacid_splash_wB:
659 Cave[y][x] = Zplayer;
660 Next[y][x] = Zplayer;
671 play_element_sound(x, y, SAMPLE_blank, Xblank);
672 ply->anim = SPR_walk + anim;
687 if (Cave[y-1][x+1] == Xblank)
688 Cave[y-1][x+1] = Yacid_splash_eB;
689 if (Cave[y-1][x-1] == Xblank)
690 Cave[y-1][x-1] = Yacid_splash_wB;
691 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
721 ply->anim = SPR_walk + anim;
727 Cave[y][x] = (dy ? (dy < 0 ? Ygrass_nB : Ygrass_sB) :
728 (dx > 0 ? Ygrass_eB : Ygrass_wB));
729 Next[y][x] = Zplayer;
730 play_element_sound(x, y, SAMPLE_dirt, Xgrass);
731 ply->anim = SPR_walk + anim;
737 Cave[y][x] = (dy ? (dy < 0 ? Ydirt_nB : Ydirt_sB) :
738 (dx > 0 ? Ydirt_eB : Ydirt_wB));
739 Next[y][x] = Zplayer;
740 play_element_sound(x, y, SAMPLE_dirt, Xdirt);
741 ply->anim = SPR_walk + anim;
748 Cave[y][x] = Ydiamond_eat;
749 Next[y][x] = Zplayer;
750 play_element_sound(x, y, SAMPLE_collect, element);
751 lev.score += lev.diamond_score;
752 lev.required = lev.required < 3 ? 0 : lev.required - 3;
753 ply->anim = SPR_walk + anim;
760 Cave[y][x] = Yemerald_eat;
761 Next[y][x] = Zplayer;
762 play_element_sound(x, y, SAMPLE_collect, element);
763 lev.score += lev.emerald_score;
764 lev.required = lev.required < 1 ? 0 : lev.required - 1;
765 ply->anim = SPR_walk + anim;
771 Cave[y][x] = Ydynamite_eat;
772 Next[y][x] = Zplayer;
773 play_element_sound(x, y, SAMPLE_collect, element);
774 lev.score += lev.dynamite_score;
775 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
776 ply->anim = SPR_walk + anim;
783 Cave[y][x] = Ykey_1_eat;
788 Cave[y][x] = Ykey_2_eat;
793 Cave[y][x] = Ykey_3_eat;
798 Cave[y][x] = Ykey_4_eat;
803 Cave[y][x] = Ykey_5_eat;
808 Cave[y][x] = Ykey_6_eat;
813 Cave[y][x] = Ykey_7_eat;
818 Cave[y][x] = Ykey_8_eat;
823 Next[y][x] = Zplayer;
824 play_element_sound(x, y, SAMPLE_collect, element);
825 lev.score += lev.key_score;
826 ply->anim = SPR_walk + anim;
832 Cave[y][x] = Ylenses_eat;
833 Next[y][x] = Zplayer;
834 play_element_sound(x, y, SAMPLE_collect, element);
835 lev.score += lev.lenses_score;
836 lev.lenses_cnt = lev.lenses_time;
837 ply->anim = SPR_walk + anim;
843 Cave[y][x] = Ymagnify_eat;
844 Next[y][x] = Zplayer;
845 play_element_sound(x, y, SAMPLE_collect, element);
846 lev.score += lev.magnify_score;
847 lev.magnify_cnt = lev.magnify_time;
848 ply->anim = SPR_walk + anim;
857 switch(Cave[y][x+dx])
867 if (Cave[y-1][x+dx+1] == Xblank)
868 Cave[y-1][x+dx+1] = Yacid_splash_eB;
869 if (Cave[y-1][x+dx-1] == Xblank)
870 Cave[y-1][x+dx-1] = Yacid_splash_wB;
871 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
875 case Yacid_splash_eB:
876 case Yacid_splash_wB:
877 Cave[y][x+dx] = dx > 0 ? Ystone_e : Ystone_w;
878 Next[y][x+dx] = Xstone_pause;
882 Cave[y][x] = dx > 0 ? Ystone_eB : Ystone_wB;
883 Next[y][x] = Zplayer;
884 play_element_sound(x, y, SAMPLE_roll, Xstone);
888 ply->anim = SPR_push + anim;
895 switch(Cave[y][x+dx])
905 if (Cave[y-1][x+dx+1] == Xblank)
906 Cave[y-1][x+dx+1] = Yacid_splash_eB;
907 if (Cave[y-1][x+dx-1] == Xblank)
908 Cave[y-1][x+dx-1] = Yacid_splash_wB;
909 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
913 case Yacid_splash_eB:
914 case Yacid_splash_wB:
915 Cave[y][x+dx] = dx > 0 ? Ybomb_e : Ybomb_w;
916 Next[y][x+dx] = Xbomb_pause;
920 Cave[y][x] = dx > 0 ? Ybomb_eB : Ybomb_wB;
921 Next[y][x] = Zplayer;
922 play_element_sound(x, y, SAMPLE_roll, Xbomb);
926 ply->anim = SPR_push + anim;
933 switch(Cave[y][x+dx])
943 if (Cave[y-1][x+dx+1] == Xblank)
944 Cave[y-1][x+dx+1] = Yacid_splash_eB;
945 if (Cave[y-1][x+dx-1] == Xblank)
946 Cave[y-1][x+dx-1] = Yacid_splash_wB;
947 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
951 case Yacid_splash_eB:
952 case Yacid_splash_wB:
953 Cave[y][x+dx] = dx > 0 ? Ynut_e : Ynut_w;
954 Next[y][x+dx] = Xnut_pause;
958 Cave[y][x] = dx > 0 ? Ynut_eB : Ynut_wB;
959 Next[y][x] = Zplayer;
960 play_element_sound(x, y, SAMPLE_roll, Xnut);
964 ply->anim = SPR_push + anim;
971 switch(Cave[y][x+dx])
975 Cave[y][x] = dx > 0 ? Yspring_kill_eB : Yspring_kill_wB;
976 Cave[y][x+dx] = dx > 0 ? Yspring_kill_e : Yspring_kill_w;
977 Next[y][x] = Zplayer;
978 Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
979 play_element_sound(x, y, SAMPLE_slurp, Xalien);
980 lev.score += lev.slurp_score;
992 if (Cave[y-1][x+dx+1] == Xblank)
993 Cave[y-1][x+dx+1] = Yacid_splash_eB;
994 if (Cave[y-1][x+dx-1] == Xblank)
995 Cave[y-1][x+dx-1] = Yacid_splash_wB;
996 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
1000 case Yacid_splash_eB:
1001 case Yacid_splash_wB:
1002 Cave[y][x+dx] = dx > 0 ? Yspring_e : Yspring_w;
1003 Next[y][x+dx] = dx > 0 ? Xspring_e : Xspring_w;
1006 Cave[y][x] = dx > 0 ? Yspring_eB : Yspring_wB;
1007 Next[y][x] = Zplayer;
1008 play_element_sound(x, y, SAMPLE_roll, Xspring);
1012 ply->anim = SPR_push + anim;
1019 case Xsand_stonein_1:
1020 case Xsand_stonein_2:
1021 case Xsand_stonein_3:
1022 case Xsand_stonein_4:
1026 ply->anim = SPR_push + anim;
1030 switch(Cave[y+dy][x+dx])
1040 if (Cave[y+dy-1][x+dx+1] == Xblank)
1041 Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
1042 if (Cave[y+dy-1][x+dx-1] == Xblank)
1043 Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
1044 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
1048 case Yacid_splash_eB:
1049 case Yacid_splash_wB:
1050 Cave[y+dy][x+dx] = (dy ? (dy < 0 ? Yballoon_n : Yballoon_s) :
1051 (dx > 0 ? Yballoon_e : Yballoon_w));
1052 Next[y+dy][x+dx] = Xballoon;
1055 Cave[y][x] = (dy ? (dy < 0 ? Yballoon_nB : Yballoon_sB) :
1056 (dx > 0 ? Yballoon_eB : Yballoon_wB));
1057 Next[y][x] = Zplayer;
1058 play_element_sound(x, y, SAMPLE_push, Xballoon);
1063 ply->anim = SPR_push + anim;
1075 switch(Cave[y+dy][x+dx])
1085 if (Cave[y+dy-1][x+dx+1] == Xblank)
1086 Cave[y+dy-1][x+dx+1] = Yacid_splash_eB;
1087 if (Cave[y+dy-1][x+dx-1] == Xblank)
1088 Cave[y+dy-1][x+dx-1] = Yacid_splash_wB;
1089 play_element_sound(x, y, SAMPLE_acid, Xacid_1);
1093 case Yacid_splash_eB:
1094 case Yacid_splash_wB:
1095 Cave[y+dy][x+dx] = (dy ? (dy < 0 ? Yandroid_n : Yandroid_s) :
1096 (dx > 0 ? Yandroid_e : Yandroid_w));
1097 Next[y+dy][x+dx] = (dy ? (dy < 0 ? Xandroid_2_n : Xandroid_2_s) :
1098 (dx > 0 ? Xandroid_2_e : Xandroid_2_w));
1101 Cave[y][x] = (dy ? (dy < 0 ? Yandroid_nB : Yandroid_sB) :
1102 (dx > 0 ? Yandroid_eB : Yandroid_wB));
1103 Next[y][x] = Zplayer;
1104 play_element_sound(x, y, SAMPLE_push, Xandroid);
1109 ply->anim = SPR_push + anim;
1114 if (ply->keys & 0x01)
1121 if (ply->keys & 0x02)
1128 if (ply->keys & 0x04)
1135 if (ply->keys & 0x08)
1142 if (ply->keys & 0x10)
1149 if (ply->keys & 0x20)
1156 if (ply->keys & 0x40)
1163 if (ply->keys & 0x80)
1169 if (!tab_blank[Cave[y+dy][x+dx]])
1172 Cave[y+dy][x+dx] = Zplayer;
1173 Next[y+dy][x+dx] = Zplayer;
1174 play_element_sound(x, y, SAMPLE_door, element);
1175 ply->anim = SPR_walk + anim;
1181 play_element_sound(x, y, SAMPLE_press, element);
1182 lev.wheel_cnt = lev.wheel_time;
1188 lev.wind_direction = 0;
1192 lev.wind_direction = 1;
1196 lev.wind_direction = 2;
1200 lev.wind_direction = 3;
1204 lev.wind_direction = dy ? (dy < 0 ? 0 : 2) : (dx > 0 ? 1 : 3);
1208 play_element_sound(x, y, SAMPLE_press, element);
1209 lev.wind_cnt = lev.wind_time;
1213 play_element_sound(x, y, SAMPLE_press, element);
1218 play_element_sound(x, y, SAMPLE_press, element);
1219 lev.ball_cnt = lev.ball_time;
1220 lev.ball_state = !lev.ball_state;
1224 Cave[y][x] = Yplant;
1225 Next[y][x] = Xplant;
1226 play_element_sound(x, y, SAMPLE_blank, Xplant);
1227 ply->anim = SPR_walk + anim;
1235 play_element_sound(x, y, SAMPLE_exit_leave, Xexit_1);
1240 /* !!! CHECK SCORE CALCULATION !!! */
1241 if (lev.home == 0 && lev.time_initial > 0) /* game won */
1242 lev.score += lev.time * lev.exit_score / 100;
1245 ply->anim = SPR_walk + anim;
1252 if (ply->x == oldx && ply->y == oldy) /* no movement */
1255 else /* player wants to snap */
1257 int element = Cave[y][x];
1261 /* fire is pressed */
1264 Cave[y][x] = Ygrass_eat;
1265 Next[y][x] = Xblank;
1266 play_element_sound(x, y, SAMPLE_dirt, element);
1267 ply->anim = SPR_spray + anim;
1271 Cave[y][x] = Ydirt_eat;
1272 Next[y][x] = Xblank;
1273 play_element_sound(x, y, SAMPLE_dirt, element);
1274 ply->anim = SPR_spray + anim;
1278 case Xdiamond_pause:
1279 Cave[y][x] = Ydiamond_eat;
1280 Next[y][x] = Xblank;
1281 play_element_sound(x, y, SAMPLE_collect, element);
1282 lev.score += lev.diamond_score;
1283 lev.required = lev.required < 3 ? 0 : lev.required - 3;
1284 ply->anim = SPR_walk + anim;
1288 case Xemerald_pause:
1289 Cave[y][x] = Yemerald_eat;
1290 Next[y][x] = Xblank;
1291 play_element_sound(x, y, SAMPLE_collect, element);
1292 lev.score += lev.emerald_score;
1293 lev.required = lev.required < 1 ? 0 : lev.required - 1;
1294 ply->anim = SPR_walk + anim;
1298 Cave[y][x] = Ydynamite_eat;
1299 Next[y][x] = Xblank;
1300 play_element_sound(x, y, SAMPLE_collect, element);
1301 lev.score += lev.dynamite_score;
1302 ply->dynamite = ply->dynamite > 9998 ? 9999 : ply->dynamite + 1;
1303 ply->anim = SPR_walk + anim;
1308 Cave[y][x] = Ykey_1_eat;
1313 Cave[y][x] = Ykey_2_eat;
1318 Cave[y][x] = Ykey_3_eat;
1323 Cave[y][x] = Ykey_4_eat;
1328 Cave[y][x] = Ykey_5_eat;
1333 Cave[y][x] = Ykey_6_eat;
1338 Cave[y][x] = Ykey_7_eat;
1343 Cave[y][x] = Ykey_8_eat;
1347 Next[y][x] = Xblank;
1348 play_element_sound(x, y, SAMPLE_collect, element);
1349 lev.score += lev.key_score;
1350 ply->anim = SPR_walk + anim;
1354 Cave[y][x] = Ylenses_eat;
1355 Next[y][x] = Xblank;
1356 play_element_sound(x, y, SAMPLE_collect, element);
1357 lev.score += lev.lenses_score;
1358 lev.lenses_cnt = lev.lenses_time;
1359 ply->anim = SPR_walk + anim;
1363 Cave[y][x] = Ymagnify_eat;
1364 Next[y][x] = Xblank;
1365 play_element_sound(x, y, SAMPLE_collect, element);
1366 lev.score += lev.magnify_score;
1367 lev.magnify_cnt = lev.magnify_time;
1368 ply->anim = SPR_walk + anim;