X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=d0ffb3d24e0508366d23eff83488a606c6ab2f2f;hb=1903a68d7b7917ed45655391ecf5aaf995124eff;hp=b034735bd66b4cf6e5f65aae793a42c118c3e91e;hpb=2c2b1d42b803d35d9f55ce68bf1339dcde6f158a;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index b034735b..d0ffb3d2 100644 --- a/src/game.c +++ b/src/game.c @@ -674,7 +674,7 @@ static void InitGameEngine() struct ElementChangeInfo *change = &element_info[element].change; /* only add custom elements that change after fixed/random frame delay */ - if (!IS_CHANGEABLE(element) || !HAS_CHANGE_EVENT(element, CE_DELAY)) + if (!CAN_CHANGE(element) || !HAS_CHANGE_EVENT(element, CE_DELAY)) continue; changing_element[element].base_element = element; @@ -835,6 +835,7 @@ void InitGame() { Feld[x][y] = Ur[x][y]; MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0; + ChangeDelay[x][y] = 0; Store[x][y] = Store2[x][y] = StorePlayer[x][y] = Back[x][y] = 0; AmoebaNr[x][y] = 0; JustStopped[x][y] = 0; @@ -1141,7 +1142,9 @@ void InitMovDir(int x, int y) default: if (IS_CUSTOM_ELEMENT(element)) { - if (element_info[element].move_pattern == MV_ALL_DIRECTIONS) + if (element_info[element].move_direction_initial != MV_NO_MOVING) + MovDir[x][y] = element_info[element].move_direction_initial; + else if (element_info[element].move_pattern == MV_ALL_DIRECTIONS) MovDir[x][y] = 1 << RND(4); else if (element_info[element].move_pattern == MV_HORIZONTAL) MovDir[x][y] = (RND(2) ? MV_LEFT : MV_RIGHT); @@ -1528,6 +1531,7 @@ static void RemoveField(int x, int y) MovPos[x][y] = 0; MovDir[x][y] = 0; MovDelay[x][y] = 0; + ChangeDelay[x][y] = 0; } void RemoveMovingField(int x, int y) @@ -1564,6 +1568,7 @@ void RemoveMovingField(int x, int y) Feld[newx][newy] = EL_EMPTY; MovPos[oldx][oldy] = MovDir[oldx][oldy] = MovDelay[oldx][oldy] = 0; MovPos[newx][newy] = MovDir[newx][newy] = MovDelay[newx][newy] = 0; + ChangeDelay[oldx][oldy] = ChangeDelay[newx][newy] = 0; GfxAction[oldx][oldy] = GfxAction[newx][newy] = ACTION_DEFAULT; DrawLevelField(oldx, oldy); @@ -1823,7 +1828,7 @@ void Explode(int ex, int ey, int phase, int mode) if (IS_PLAYER(x, y)) KillHeroUnlessProtected(x, y); - else if (CAN_EXPLODE(element)) + else if (CAN_EXPLODE_BY_FIRE(element)) { Feld[x][y] = Store2[x][y]; Store2[x][y] = 0; @@ -1844,7 +1849,7 @@ void Explode(int ex, int ey, int phase, int mode) element = Feld[x][y] = Back[x][y]; Back[x][y] = 0; - MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = 0; + MovDir[x][y] = MovPos[x][y] = MovDelay[x][y] = ChangeDelay[x][y] = 0; InitField(x, y, FALSE); if (CAN_MOVE(element)) InitMovDir(x, y); @@ -2314,8 +2319,9 @@ void Impact(int x, int y) { boolean lastline = (y == lev_fieldy-1); boolean object_hit = FALSE; + boolean impact = (lastline || object_hit); int element = Feld[x][y]; - int smashed = 0; + int smashed = EL_UNDEFINED; if (!lastline) /* check if element below was hit */ { @@ -2323,10 +2329,12 @@ void Impact(int x, int y) return; object_hit = (!IS_FREE(x, y+1) && (!IS_MOVING(x, y+1) || - MovDir[x][y+1] != MV_DOWN || - MovPos[x][y+1] <= TILEY / 2)); + MovDir[x][y+1] != MV_DOWN || + MovPos[x][y+1] <= TILEY / 2)); if (object_hit) smashed = MovingOrBlocked2Element(x, y+1); + + impact = (lastline || object_hit); } if (!lastline && smashed == EL_ACID) /* element falls into acid */ @@ -2335,33 +2343,37 @@ void Impact(int x, int y) return; } - if (lastline || object_hit) + if (impact) { ResetGfxAnimation(x, y); DrawLevelField(x, y); } +#if 1 + if (impact && CAN_EXPLODE_IMPACT(element)) +#else if ((element == EL_BOMB || element == EL_SP_DISK_ORANGE || element == EL_DX_SUPABOMB) && (lastline || object_hit)) /* element is bomb */ +#endif { Bang(x, y); return; } - else if (element == EL_PEARL) + else if (impact && element == EL_PEARL) { Feld[x][y] = EL_PEARL_BREAKING; PlaySoundLevel(x, y, SND_PEARL_BREAKING); return; } - if (element == EL_AMOEBA_DROP && (lastline || object_hit)) + if (impact && element == EL_AMOEBA_DROP) { if (object_hit && IS_PLAYER(x, y+1)) KillHeroUnlessProtected(x, y+1); else if (object_hit && smashed == EL_PENGUIN) - Bang(x, y+1); + Bang(x, y + 1); else { Feld[x][y] = EL_AMOEBA_GROWING; @@ -2372,7 +2384,11 @@ void Impact(int x, int y) return; } +#if 1 + if (object_hit) /* check which object was hit */ +#else if (!lastline && object_hit) /* check which object was hit */ +#endif { if (CAN_PASS_MAGIC_WALL(element) && (smashed == EL_MAGIC_WALL || @@ -2399,17 +2415,23 @@ void Impact(int x, int y) if (IS_PLAYER(x, y + 1)) { - KillHeroUnlessProtected(x, y+1); - return; + if (CAN_SMASH_PLAYER(element)) + { + KillHeroUnlessProtected(x, y+1); + return; + } } else if (smashed == EL_PENGUIN) { - Bang(x, y + 1); - return; + if (CAN_SMASH_PLAYER(element)) + { + Bang(x, y + 1); + return; + } } else if (element == EL_BD_DIAMOND) { - if (IS_ENEMY(smashed) && IS_BD_ELEMENT(smashed)) + if (IS_CLASSIC_ENEMY(smashed) && IS_BD_ELEMENT(smashed)) { Bang(x, y + 1); return; @@ -2424,11 +2446,18 @@ void Impact(int x, int y) Bang(x, y + 1); return; } +#if 1 + else if (CAN_SMASH_EVERYTHING(element)) +#else else if (element == EL_ROCK || element == EL_SP_ZONK || element == EL_BD_ROCK) +#endif { - if (IS_ENEMY(smashed) || + if (IS_CLASSIC_ENEMY(smashed) || +#if 1 + CAN_EXPLODE_SMASHED(smashed)) +#else smashed == EL_BOMB || smashed == EL_SP_DISK_ORANGE || smashed == EL_DX_SUPABOMB || @@ -2436,11 +2465,16 @@ void Impact(int x, int y) smashed == EL_PIG || smashed == EL_DRAGON || smashed == EL_MOLE) +#endif { Bang(x, y + 1); return; } +#if 1 + else if (!IS_MOVING(x, y + 1) && !IS_BLOCKED(x, y + 1)) +#else else if (!IS_MOVING(x, y + 1)) +#endif { if (smashed == EL_LAMP || smashed == EL_LAMP_ACTIVE) @@ -2463,7 +2497,11 @@ void Impact(int x, int y) } else if (smashed == EL_DIAMOND) { +#if 1 + Feld[x][y+1] = EL_DIAMOND_BREAKING; +#else Feld[x][y+1] = EL_EMPTY; +#endif PlaySoundLevel(x, y, SND_DIAMOND_BREAKING); return; } @@ -2510,26 +2548,26 @@ void TurnRound(int x, int y) int x, y; } move_xy[] = { - { 0, 0 }, - {-1, 0 }, - {+1, 0 }, - { 0, 0 }, - { 0, -1 }, - { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 0, +1 } + { 0, 0 }, + { -1, 0 }, + { +1, 0 }, + { 0, 0 }, + { 0, -1 }, + { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 0, +1 } }; static struct { int left, right, back; } turn[] = { - { 0, 0, 0 }, + { 0, 0, 0 }, { MV_DOWN, MV_UP, MV_RIGHT }, - { MV_UP, MV_DOWN, MV_LEFT }, - { 0, 0, 0 }, - { MV_LEFT, MV_RIGHT, MV_DOWN }, - { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, - { MV_RIGHT, MV_LEFT, MV_UP } + { MV_UP, MV_DOWN, MV_LEFT }, + { 0, 0, 0 }, + { MV_LEFT, MV_RIGHT, MV_DOWN }, + { 0,0,0 }, { 0,0,0 }, { 0,0,0 }, + { MV_RIGHT, MV_LEFT, MV_UP } }; int element = Feld[x][y]; @@ -2927,9 +2965,13 @@ void TurnRound(int x, int y) { boolean can_turn_left = FALSE, can_turn_right = FALSE; - if (IN_LEV_FIELD(left_x, left_y) && IS_FREE(left_x, left_y)) + if (IN_LEV_FIELD(left_x, left_y) && + (IS_FREE(left_x, left_y) || + (DONT_COLLIDE_WITH(element) && IS_FREE_OR_PLAYER(left_x, left_y)))) can_turn_left = TRUE; - if (IN_LEV_FIELD(right_x, right_y) && IS_FREE(right_x, right_y)) + if (IN_LEV_FIELD(right_x, right_y) && + (IS_FREE(right_x, right_y) || + (DONT_COLLIDE_WITH(element) && IS_FREE_OR_PLAYER(right_x, right_y)))) can_turn_right = TRUE; if (can_turn_left && can_turn_right) @@ -2946,7 +2988,13 @@ void TurnRound(int x, int y) else if (element_info[element].move_pattern == MV_HORIZONTAL || element_info[element].move_pattern == MV_VERTICAL) { - MovDir[x][y] = back_dir; + if (element_info[element].move_pattern & old_move_dir) + MovDir[x][y] = back_dir; + else if (element_info[element].move_pattern == MV_HORIZONTAL) + MovDir[x][y] = (RND(2) ? MV_LEFT : MV_RIGHT); + else if (element_info[element].move_pattern == MV_VERTICAL) + MovDir[x][y] = (RND(2) ? MV_UP : MV_DOWN); + MovDelay[x][y] = GET_NEW_MOVE_DELAY(element); } else if (element_info[element].move_pattern & MV_ANY_DIRECTION) @@ -2956,21 +3004,31 @@ void TurnRound(int x, int y) } else if (element_info[element].move_pattern == MV_ALONG_LEFT_SIDE) { - if (IN_LEV_FIELD(left_x, left_y) && IS_FREE(left_x, left_y)) + if (IN_LEV_FIELD(left_x, left_y) && + (IS_FREE(left_x, left_y) || + (DONT_COLLIDE_WITH(element) && IS_FREE_OR_PLAYER(left_x, left_y)))) MovDir[x][y] = left_dir; - else if (!IN_LEV_FIELD(move_x, move_y) || !IS_FREE(move_x, move_y)) + else if (!IN_LEV_FIELD(move_x, move_y) || + (!IS_FREE(move_x, move_y) && + (!DONT_COLLIDE_WITH(element) || !IS_FREE_OR_PLAYER(move_x, move_y)))) MovDir[x][y] = right_dir; - MovDelay[x][y] = GET_NEW_MOVE_DELAY(element); + if (MovDir[x][y] != old_move_dir) + MovDelay[x][y] = GET_NEW_MOVE_DELAY(element); } else if (element_info[element].move_pattern == MV_ALONG_RIGHT_SIDE) { - if (IN_LEV_FIELD(right_x, right_y) && IS_FREE(right_x, right_y)) + if (IN_LEV_FIELD(right_x, right_y) && + (IS_FREE(right_x, right_y) || + (DONT_COLLIDE_WITH(element) && IS_FREE_OR_PLAYER(right_x, right_y)))) MovDir[x][y] = right_dir; - else if (!IN_LEV_FIELD(move_x, move_y) || !IS_FREE(move_x, move_y)) + else if (!IN_LEV_FIELD(move_x, move_y) || + (!IS_FREE(move_x, move_y) && + (!DONT_COLLIDE_WITH(element) || !IS_FREE_OR_PLAYER(move_x, move_y)))) MovDir[x][y] = left_dir; - MovDelay[x][y] = GET_NEW_MOVE_DELAY(element); + if (MovDir[x][y] != old_move_dir) + MovDelay[x][y] = GET_NEW_MOVE_DELAY(element); } else if (element_info[element].move_pattern == MV_TOWARDS_PLAYER || element_info[element].move_pattern == MV_AWAY_FROM_PLAYER) @@ -3027,6 +3085,8 @@ void TurnRound(int x, int y) Moving2Blocked(x, y, &newx, &newy); if (IN_LEV_FIELD(newx, newy) && (IS_FREE(newx, newy) || + (DONT_COLLIDE_WITH(element) && + IS_FREE_OR_PLAYER(newx, newy)) || Feld[newx][newy] == EL_ACID)) return; @@ -3035,6 +3095,8 @@ void TurnRound(int x, int y) Moving2Blocked(x, y, &newx, &newy); if (IN_LEV_FIELD(newx, newy) && (IS_FREE(newx, newy) || + (DONT_COLLIDE_WITH(element) && + IS_FREE_OR_PLAYER(newx, newy)) || Feld[newx][newy] == EL_ACID)) return; @@ -3231,7 +3293,7 @@ void StartMoving(int x, int y) started_moving = TRUE; } } - else if (IS_FREE(x, y+1)) + else if (IS_FREE(x, y+1) || Feld[x][y+1] == EL_DIAMOND_BREAKING) { if (JustStopped[x][y]) /* prevent animation from being restarted */ MovDir[x][y] = MV_DOWN; @@ -3346,11 +3408,36 @@ void StartMoving(int x, int y) { MovDelay[x][y]--; +#if 0 + if (element == EL_YAMYAM) + { + printf("::: %d\n", + el_act_dir2img(EL_YAMYAM, ACTION_WAITING, MV_LEFT)); + DrawLevelElementAnimation(x, y, element); + } +#endif + + if (MovDelay[x][y]) /* element still has to wait some time */ + { +#if 0 + /* !!! PLACE THIS SOMEWHERE AFTER "TurnRound()" !!! */ + ResetGfxAnimation(x, y); +#endif + GfxAction[x][y] = ACTION_WAITING; + } + if (element == EL_ROBOT || +#if 0 + element == EL_PACMAN || +#endif element == EL_YAMYAM || element == EL_DARK_YAMYAM) { +#if 0 + DrawLevelElementAnimation(x, y, element); +#else DrawLevelElementAnimationIfNeeded(x, y, element); +#endif PlaySoundLevelAction(x, y, ACTION_WAITING); } else if (element == EL_SP_ELECTRON) @@ -3380,7 +3467,7 @@ void StartMoving(int x, int y) { int flamed = MovingOrBlocked2Element(xx, yy); - if (IS_ENEMY(flamed) || CAN_EXPLODE(flamed)) + if (IS_CLASSIC_ENEMY(flamed) || CAN_EXPLODE_BY_FIRE(flamed)) Bang(xx, yy); else RemoveMovingField(xx, yy); @@ -3404,29 +3491,33 @@ void StartMoving(int x, int y) return; } + + GfxAction[x][y] = ACTION_MOVING; } /* now make next step */ Moving2Blocked(x, y, &newx, &newy); /* get next screen position */ - if (IS_ENEMY(element) && IS_PLAYER(newx, newy) && + if (DONT_COLLIDE_WITH(element) && IS_PLAYER(newx, newy) && !PLAYER_PROTECTED(newx, newy)) { - #if 1 TestIfBadThingRunsIntoHero(x, y, MovDir[x][y]); return; #else - /* enemy got the player */ + /* player killed by element which is deadly when colliding with */ MovDir[x][y] = 0; KillHero(PLAYERINFO(newx, newy)); return; #endif } - else if ((element == EL_PENGUIN || element == EL_ROBOT || - element == EL_SATELLITE || element == EL_BALLOON) && + else if ((element == EL_PENGUIN || + element == EL_ROBOT || + element == EL_SATELLITE || + element == EL_BALLOON || + IS_CUSTOM_ELEMENT(element)) && IN_LEV_FIELD(newx, newy) && MovDir[x][y] == MV_DOWN && Feld[newx][newy] == EL_ACID) { @@ -3460,6 +3551,8 @@ void StartMoving(int x, int y) } else if (!IS_FREE(newx, newy)) { + GfxAction[x][y] = ACTION_WAITING; + if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else @@ -3511,7 +3604,9 @@ void StartMoving(int x, int y) int element2 = (IN_LEV_FIELD(newx2, newy2) ? MovingOrBlocked2Element(newx2, newy2) : EL_STEELWALL); - if ((wanna_flame || IS_ENEMY(element1) || IS_ENEMY(element2)) && + if ((wanna_flame || + IS_CLASSIC_ENEMY(element1) || + IS_CLASSIC_ENEMY(element2)) && element1 != EL_DRAGON && element2 != EL_DRAGON && element1 != EL_FLAMES && element2 != EL_FLAMES) { @@ -3604,23 +3699,30 @@ void StartMoving(int x, int y) TurnRound(x, y); - if (element == EL_BUG || element == EL_SPACESHIP || +#if 1 + DrawLevelElementAnimation(x, y, element); +#else + if (element == EL_BUG || + element == EL_SPACESHIP || element == EL_SP_SNIKSNAK) DrawLevelField(x, y); - else if (element == EL_BUG || element == EL_SPACESHIP || - element == EL_SP_SNIKSNAK || element == EL_MOLE) + else if (element == EL_MOLE) DrawLevelField(x, y); - else if (element == EL_BD_BUTTERFLY || element == EL_BD_FIREFLY) + else if (element == EL_BD_BUTTERFLY || + element == EL_BD_FIREFLY) DrawLevelElementAnimationIfNeeded(x, y, element); else if (element == EL_SATELLITE) DrawLevelElementAnimationIfNeeded(x, y, element); else if (element == EL_SP_ELECTRON) DrawLevelElementAnimationIfNeeded(x, y, element); +#endif if (DONT_TOUCH(element)) TestIfBadThingTouchesHero(x, y); +#if 0 PlaySoundLevelAction(x, y, ACTION_WAITING); +#endif return; } @@ -3642,7 +3744,7 @@ void ContinueMoving(int x, int y) int dy = (direction == MV_UP ? -1 : direction == MV_DOWN ? +1 : 0); int horiz_move = (dx != 0); int newx = x + dx, newy = y + dy; - int step = (horiz_move ? dx : dy) * TILEX / 8; + int step = (horiz_move ? dx : dy) * TILEX / MOVE_DELAY_NORMAL_SPEED; if (element == EL_AMOEBA_DROP || element == EL_AMOEBA_DROPPING) step /= 2; @@ -3659,6 +3761,8 @@ void ContinueMoving(int x, int y) step /= 2; else if (element == EL_SPRING && horiz_move) step *= 2; + else if (IS_CUSTOM_ELEMENT(element)) + step = SIGN(step) * element_info[element].move_stepsize; #if OLD_GAME_BEHAVIOUR else if (CAN_FALL(element) && horiz_move && !IS_SP_ELEMENT(element)) @@ -3671,6 +3775,7 @@ void ContinueMoving(int x, int y) { Feld[x][y] = EL_EMPTY; Feld[newx][newy] = element; + MovPos[x][y] = 0; /* force "not moving" for "crumbled sand" */ if (element == EL_MOLE) { @@ -3750,6 +3855,9 @@ void ContinueMoving(int x, int y) MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0; MovDelay[newx][newy] = 0; + /* copy element change control values to new field */ + ChangeDelay[newx][newy] = ChangeDelay[x][y]; + /* copy animation control values to new field */ GfxFrame[newx][newy] = GfxFrame[x][y]; GfxAction[newx][newy] = GfxAction[x][y]; /* keep action one frame */ @@ -3789,7 +3897,7 @@ void ContinueMoving(int x, int y) TestIfFriendTouchesBadThing(newx, newy); if (CAN_SMASH(element) && direction == MV_DOWN && - (newy == lev_fieldy-1 || !IS_FREE(x, newy+1))) + (newy == lev_fieldy - 1 || !IS_FREE(x, newy + 1))) Impact(x, newy); } else /* still moving on */ @@ -4288,7 +4396,7 @@ void Life(int ax, int ay) static void InitRobotWheel(int x, int y) { - MovDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND; + ChangeDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND; } static void RunRobotWheel(int x, int y) @@ -4304,7 +4412,7 @@ static void StopRobotWheel(int x, int y) static void InitTimegateWheel(int x, int y) { - MovDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND; + ChangeDelay[x][y] = level.time_wheel * FRAMES_PER_SECOND; } static void RunTimegateWheel(int x, int y) @@ -4630,7 +4738,7 @@ static void InitBuggyBase(int x, int y) int element = Feld[x][y]; int activating_delay = FRAMES_PER_SECOND / 4; - MovDelay[x][y] = + ChangeDelay[x][y] = (element == EL_SP_BUGGY_BASE ? 2 * FRAMES_PER_SECOND + RND(5 * FRAMES_PER_SECOND) - activating_delay : element == EL_SP_BUGGY_BASE_ACTIVATING ? @@ -4665,7 +4773,7 @@ static void WarnBuggyBase(int x, int y) static void InitTrap(int x, int y) { - MovDelay[x][y] = 2 * FRAMES_PER_SECOND + RND(5 * FRAMES_PER_SECOND); + ChangeDelay[x][y] = 2 * FRAMES_PER_SECOND + RND(5 * FRAMES_PER_SECOND); } static void ActivateTrap(int x, int y) @@ -4686,19 +4794,16 @@ static void ChangeElement(int x, int y) { int element = Feld[x][y]; - if (IS_MOVING(x, y)) /* never change a running system :-) */ - return; - - if (MovDelay[x][y] == 0) /* initialize element change */ + if (ChangeDelay[x][y] == 0) /* initialize element change */ { - MovDelay[x][y] = changing_element[element].change_delay + 1; + ChangeDelay[x][y] = changing_element[element].change_delay + 1; if (IS_CUSTOM_ELEMENT(element) && HAS_CHANGE_EVENT(element, CE_DELAY)) { int max_random_delay = element_info[element].change.delay_random; int delay_frames = element_info[element].change.delay_frames; - MovDelay[x][y] += RND(max_random_delay * delay_frames); + ChangeDelay[x][y] += RND(max_random_delay * delay_frames); } ResetGfxAnimation(x, y); @@ -4708,30 +4813,68 @@ static void ChangeElement(int x, int y) changing_element[element].pre_change_function(x, y); } - MovDelay[x][y]--; + ChangeDelay[x][y]--; - if (MovDelay[x][y] != 0) /* continue element change */ + if (ChangeDelay[x][y] != 0) /* continue element change */ { - if (IS_ANIMATED(el2img(element))) - DrawLevelElementAnimationIfNeeded(x, y, element); + int graphic = el_act_dir2img(element, GfxAction[x][y], MovDir[x][y]); + + if (IS_ANIMATED(graphic)) + DrawLevelGraphicAnimationIfNeeded(x, y, graphic); if (changing_element[element].change_function) changing_element[element].change_function(x, y); } else /* finish element change */ { + if (IS_MOVING(x, y)) /* never change a running system ;-) */ + { + ChangeDelay[x][y] = 1; /* try change after next move step */ + + return; + } + + RemoveField(x, y); Feld[x][y] = changing_element[element].next_element; ResetGfxAnimation(x, y); ResetRandomAnimationValue(x, y); -#if 1 InitField(x, y, FALSE); - if (CAN_MOVE(element)) + if (CAN_MOVE(Feld[x][y])) InitMovDir(x, y); -#endif + DrawLevelField(x, y); + if (CAN_BE_CRUMBLED(Feld[x][y])) + { + int sx = SCREENX(x), sy = SCREENY(y); + static int xy[4][2] = + { + { 0, -1 }, + { -1, 0 }, + { +1, 0 }, + { 0, +1 } + }; + int i; + + for(i=0; i<4; i++) + { + int xx = x + xy[i][0]; + int yy = y + xy[i][1]; + int sxx = sx + xy[i][0]; + int syy = sy + xy[i][1]; + + if (!IN_LEV_FIELD(xx, yy) || + !IN_SCR_FIELD(sxx, syy) || + !CAN_BE_CRUMBLED(Feld[xx][yy]) || + IS_MOVING(xx, yy)) + continue; + + DrawLevelField(xx, yy); + } + } + if (changing_element[element].post_change_function) changing_element[element].post_change_function(x, y); } @@ -4931,7 +5074,11 @@ void GameActions() for (y=0; y