X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=1bea27fe4f59876bdfbc5aece1eff07dffbf4bdd;hb=f857fec3082c785b0dd271b6ad1b7642a2ed4e65;hp=436751f65916f7005513f7bb2b13d248e7d4bc1b;hpb=9073d88279c0b9c5be103a6bb4d5c608ab0d90cc;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 436751f6..1bea27fe 100644 --- a/src/game.c +++ b/src/game.c @@ -947,8 +947,7 @@ void InitGame() if (setup.sound_music) PlayMusic(level_nr); - if (!tape.playing) - KeyboardAutoRepeatOff(); + KeyboardAutoRepeatOffUnlessAutoplay(); if (options.debug) { @@ -1679,7 +1678,7 @@ void Explode(int ex, int ey, int phase, int mode) if (IS_PLAYER(x, y)) KillHeroUnlessProtected(x, y); - else if (IS_EXPLOSIVE(element)) + else if (IS_CAN_EXPLODE(element)) { Feld[x][y] = Store2[x][y]; Store2[x][y] = 0; @@ -1702,7 +1701,7 @@ void Explode(int ex, int ey, int phase, int mode) MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0; InitField(x, y, FALSE); - if (CAN_MOVE(element) || COULD_MOVE(element)) + if (CAN_MOVE(element)) InitMovDir(x, y); DrawLevelField(x, y); @@ -2230,7 +2229,7 @@ void Impact(int x, int y) if (!lastline && object_hit) /* check which object was hit */ { - if (CAN_CHANGE(element) && + if (CAN_PASS_MAGIC_WALL(element) && (smashed == EL_MAGIC_WALL || smashed == EL_BD_MAGIC_WALL)) { @@ -2519,13 +2518,13 @@ void TurnRound(int x, int y) int rnd = RND(rnd_value); if (IN_LEV_FIELD(left_x, left_y) && - (IS_FREE(left_x, left_y) || IS_GEM(Feld[left_x][left_y]))) + (IS_FREE(left_x, left_y) || IS_FOOD_PIG(Feld[left_x][left_y]))) can_turn_left = TRUE; if (IN_LEV_FIELD(right_x, right_y) && - (IS_FREE(right_x, right_y) || IS_GEM(Feld[right_x][right_y]))) + (IS_FREE(right_x, right_y) || IS_FOOD_PIG(Feld[right_x][right_y]))) can_turn_right = TRUE; if (IN_LEV_FIELD(move_x, move_y) && - (IS_FREE(move_x, move_y) || IS_GEM(Feld[move_x][move_y]))) + (IS_FREE(move_x, move_y) || IS_FOOD_PIG(Feld[move_x][move_y]))) can_move_on = TRUE; if (can_turn_left && @@ -2577,7 +2576,7 @@ void TurnRound(int x, int y) MovDir[x][y] = back_dir; if (!IS_FREE(x+move_xy[MovDir[x][y]].x, y+move_xy[MovDir[x][y]].y) && - !IS_GEM(Feld[x+move_xy[MovDir[x][y]].x][y+move_xy[MovDir[x][y]].y])) + !IS_FOOD_PIG(Feld[x+move_xy[MovDir[x][y]].x][y+move_xy[MovDir[x][y]].y])) MovDir[x][y] = old_move_dir; MovDelay[x][y] = 0; @@ -2804,7 +2803,7 @@ static boolean JustBeingPushed(int x, int y) void StartMoving(int x, int y) { - static boolean use_spring_bug = TRUE; + boolean use_spring_bug = (game.engine_version < VERSION_IDENT(2,2,0)); boolean started_moving = FALSE; /* some elements can fall _and_ move */ int element = Feld[x][y]; @@ -2927,7 +2926,7 @@ void StartMoving(int x, int y) Store[x][y] = 0; } } - else if (CAN_CHANGE(element) && + else if (CAN_PASS_MAGIC_WALL(element) && (Feld[x][y+1] == EL_MAGIC_WALL_ACTIVE || Feld[x][y+1] == EL_BD_MAGIC_WALL_ACTIVE)) { @@ -3110,20 +3109,14 @@ void StartMoving(int x, int y) int sx = SCREENX(xx), sy = SCREENY(yy); int flame_graphic = graphic + (i - 1); -#if 1 if (!IN_LEV_FIELD(xx, yy) || IS_DRAGONFIRE_PROOF(Feld[xx][yy])) break; -#else - if (!IN_LEV_FIELD(xx, yy) || - IS_HISTORIC_SOLID(Feld[xx][yy]) || Feld[xx][yy] == EL_EXPLOSION) - break; -#endif if (MovDelay[x][y]) { int flamed = MovingOrBlocked2Element(xx, yy); - if (IS_ENEMY(flamed) || IS_EXPLOSIVE(flamed)) + if (IS_ENEMY(flamed) || IS_CAN_EXPLODE(flamed)) Bang(xx, yy); else RemoveMovingField(xx, yy); @@ -3212,7 +3205,7 @@ void StartMoving(int x, int y) } else if (element == EL_PIG && IN_LEV_FIELD(newx, newy)) { - if (IS_GEM(Feld[newx][newy])) + if (IS_FOOD_PIG(Feld[newx][newy])) { if (IS_MOVING(newx, newy)) RemoveMovingField(newx, newy); @@ -5159,6 +5152,24 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy) if (!player->active || (!dx && !dy)) return FALSE; +#if 0 + { + static boolean done = FALSE; + static old_count = -1; + + if (FrameCounter < old_count) + done = FALSE; + + if (FrameCounter < 100) + { + printf("::: wanna move [%d] [%d]\n", + FrameCounter, player->push_delay_value); + done = TRUE; + old_count = FrameCounter; + } + } +#endif + #if 0 if (!FrameReached(&player->move_delay, player->move_delay_value) && !tape.playing) @@ -5711,7 +5722,6 @@ void RemoveHero(struct PlayerInfo *player) static boolean checkDiagonalPushing(struct PlayerInfo *player, int x, int y, int real_dx, int real_dy) { -#if 1 int jx, jy, dx, dy, xx, yy; if (real_dx == 0 || real_dy == 0) /* no diagonal direction => push */ @@ -5725,32 +5735,7 @@ static boolean checkDiagonalPushing(struct PlayerInfo *player, xx = jx + (dx == 0 ? real_dx : 0); yy = jy + (dy == 0 ? real_dy : 0); - return (!IN_LEV_FIELD(xx, yy) || IS_SOLID(Feld[xx][yy])); -#else - - if (real_dx && real_dy) /* diagonal direction input => do check */ - { - /* diagonal direction: check alternative direction */ - int jx = player->jx, jy = player->jy; - int dx = x - jx, dy = y - jy; - int xx = jx + (dx == 0 ? real_dx : 0); - int yy = jy + (dy == 0 ? real_dy : 0); - - if (IN_LEV_FIELD(xx, yy)) - { - int element = Feld[xx][yy]; - - if (game.engine_version < VERSION_IDENT(2,2,0)) - return IS_HISTORIC_SOLID(element); - else - return !(IS_WALKABLE(element) || - IS_DIGGABLE(element) || - IS_COLLECTIBLE(element)); - } - } - - return TRUE; /* no diagonal direction input => push object */ -#endif + return (!IN_LEV_FIELD(xx, yy) || IS_SOLID_FOR_PUSHING(Feld[xx][yy])); } /* @@ -5771,6 +5756,24 @@ int DigField(struct PlayerInfo *player, dy == +1 ? MV_DOWN : MV_NO_MOVING); int element; +#if 0 + { + static boolean done = FALSE; + + if (FrameCounter < 10) + done = FALSE; + + if (!done && + real_dx == -1 && + FrameCounter > 10) + { + printf("::: wanna move left [%d] [%d]\n", + FrameCounter, player->push_delay_value); + done = TRUE; + } + } +#endif + if (player->MovPos == 0) { player->is_digging = FALSE; @@ -6103,20 +6106,17 @@ int DigField(struct PlayerInfo *player, player->Pushing = TRUE; +#if 0 + if (element == EL_ROCK) + printf("::: wanna push [%d] [%d]\n", + FrameCounter, player->push_delay_value); +#endif + if (!IN_LEV_FIELD(x+dx, y+dy) || !IS_FREE(x+dx, y+dy)) return MF_NO_ACTION; -#if 1 if (!checkDiagonalPushing(player, x, y, real_dx, real_dy)) return MF_NO_ACTION; -#else - if (real_dy) - { - if (IN_LEV_FIELD(jx, jy+real_dy) && - !IS_HISTORIC_SOLID(Feld[jx][jy+real_dy])) - return MF_NO_ACTION; - } -#endif if (player->push_delay == 0) player->push_delay = FrameCounter; @@ -6358,23 +6358,8 @@ int DigField(struct PlayerInfo *player, || !IS_SB_ELEMENT(element)))) return MF_NO_ACTION; -#if 1 if (!checkDiagonalPushing(player, x, y, real_dx, real_dy)) return MF_NO_ACTION; -#else - if (dx && real_dy) - { - if (IN_LEV_FIELD(jx, jy+real_dy) && - !IS_HISTORIC_SOLID(Feld[jx][jy+real_dy])) - return MF_NO_ACTION; - } - else if (dy && real_dx) - { - if (IN_LEV_FIELD(jx+real_dx, jy) && - !IS_HISTORIC_SOLID(Feld[jx+real_dx][jy])) - return MF_NO_ACTION; - } -#endif if (player->push_delay == 0) player->push_delay = FrameCounter; @@ -6474,23 +6459,8 @@ int DigField(struct PlayerInfo *player, if (!IN_LEV_FIELD(x+dx, y+dy) || !IS_FREE(x+dx, y+dy)) return MF_NO_ACTION; -#if 1 if (!checkDiagonalPushing(player, x, y, real_dx, real_dy)) return MF_NO_ACTION; -#else - if (dx && real_dy) - { - if (IN_LEV_FIELD(jx, jy+real_dy) && - !IS_HISTORIC_SOLID(Feld[jx][jy+real_dy])) - return MF_NO_ACTION; - } - else if (dy && real_dx) - { - if (IN_LEV_FIELD(jx+real_dx, jy) && - !IS_HISTORIC_SOLID(Feld[jx+real_dx][jy])) - return MF_NO_ACTION; - } -#endif if (player->push_delay == 0) player->push_delay = FrameCounter;