X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=203149bc4791bfff2bcd5e248d083e032d38d422;hb=a84bd00a438ff458c2d74d1d1784deefe12bf84a;hp=beabbab2c66cc25bfe2240049930da7695b19b66;hpb=1290799ac0be42dc5db602dd113c5185df0a7e03;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index beabbab2..203149bc 100644 --- a/src/game.c +++ b/src/game.c @@ -294,10 +294,6 @@ static void InitField(int x, int y, boolean init_game) } } /* no break! */ - case EL_PLAYER: - if (init_game) - Feld[x][y] = EL_PLAYER1; - /* no break! */ case EL_PLAYER1: case EL_PLAYER2: case EL_PLAYER3: @@ -673,12 +669,14 @@ void InitGame() InitGameEngine(); +#if 0 #if DEBUG #if USE_NEW_AMOEBA_CODE printf("Using new amoeba code.\n"); #else printf("Using old amoeba code.\n"); #endif +#endif #endif /* don't play tapes over network */ @@ -797,6 +795,7 @@ void InitGame() MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0; Store[x][y] = Store2[x][y] = StorePlayer[x][y] = 0; Frame[x][y] = 0; + GfxAction[x][y] = GFX_ACTION_DEFAULT; AmoebaNr[x][y] = 0; JustStopped[x][y] = 0; Stop[x][y] = FALSE; @@ -1215,7 +1214,7 @@ void GameWon() #endif /* Hero disappears */ - DrawLevelField(ExitX, ExitY); + DrawNewLevelField(ExitX, ExitY); BackToFront(); if (tape.playing) @@ -1331,8 +1330,11 @@ void InitMovingField(int x, int y, int direction) MovDir[x][y] = direction; MovDir[newx][newy] = direction; + if (Feld[newx][newy] == EL_EMPTY) Feld[newx][newy] = EL_BLOCKED; + + GfxAction[x][y] = GFX_ACTION_MOVING; } void Moving2Blocked(int x, int y, int *goes_to_x, int *goes_to_y) @@ -1443,40 +1445,66 @@ 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; + GfxAction[oldx][oldy] = GfxAction[newx][newy] = GFX_ACTION_DEFAULT; - DrawLevelField(oldx, oldy); - DrawLevelField(newx, newy); + DrawNewLevelField(oldx, oldy); + DrawNewLevelField(newx, newy); } void DrawDynamite(int x, int y) { int sx = SCREENX(x), sy = SCREENY(y); +#if 0 int graphic = el2gfx(Feld[x][y]); - int phase; +#else + int graphic = el2img(Feld[x][y]); +#endif + int frame; if (!IN_SCR_FIELD(sx, sy) || IS_PLAYER(x, y)) return; if (Store[x][y]) +#if 0 DrawGraphic(sx, sy, el2gfx(Store[x][y])); +#else + DrawNewGraphic(sx, sy, el2img(Store[x][y]), 0); +#endif if (Feld[x][y] == EL_DYNAMITE_ACTIVE) { - if ((phase = (96 - MovDelay[x][y]) / 12) > 6) - phase = 6; + if ((frame = (96 - MovDelay[x][y]) / 12) > 6) + frame = 6; } else { - if ((phase = ((96 - MovDelay[x][y]) / 6) % 8) > 3) - phase = 7 - phase; + if ((frame = ((96 - MovDelay[x][y]) / 6) % 8) > 3) + frame = 7 - frame; } +#if 1 + frame = getNewGraphicAnimationFrame(graphic, 96 - MovDelay[x][y]); +#endif + + /* + printf("-> %d: %d [%d]\n", graphic, frame, MovDelay[x][y]); + */ + +#if 0 if (game.emulation == EMU_SUPAPLEX) DrawGraphic(sx, sy, GFX_SP_DISK_RED); else if (Store[x][y]) - DrawGraphicThruMask(sx, sy, graphic + phase); + DrawGraphicThruMask(sx, sy, graphic + frame); + else + DrawGraphic(sx, sy, graphic + frame); +#else + if (game.emulation == EMU_SUPAPLEX) + DrawNewGraphic(sx, sy, IMG_SP_DISK_RED, 0); + else if (Store[x][y]) + DrawNewGraphicThruMask(sx, sy, graphic, frame); else - DrawGraphic(sx, sy, graphic + phase); + DrawNewGraphic(sx, sy, graphic, frame); +#endif } void CheckDynamite(int x, int y) @@ -1512,7 +1540,8 @@ void CheckDynamite(int x, int y) void Explode(int ex, int ey, int phase, int mode) { int x, y; - int num_phase = 9, delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2); + int num_phase = 9; + int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2); int last_phase = num_phase * delay; int half_phase = (num_phase / 2) * delay; int first_phase_after_start = EX_PHASE_START + 1; @@ -1552,7 +1581,7 @@ void Explode(int ex, int ey, int phase, int mode) RemoveMovingField(x, y); } - if (IS_MASSIVE(element) || element == EL_DRAGON_FIRE) + if (IS_MASSIVE(element) || element == EL_FLAMES) continue; if (IS_PLAYER(x, y) && SHIELD_ON(PLAYERINFO(x, y))) @@ -1696,13 +1725,14 @@ void Explode(int ex, int ey, int phase, int mode) InitField(x, y, FALSE); if (CAN_MOVE(element) || COULD_MOVE(element)) InitMovDir(x, y); - DrawLevelField(x, y); + DrawNewLevelField(x, y); if (IS_PLAYER(x, y) && !PLAYERINFO(x,y)->present) StorePlayer[x][y] = 0; } else if (!(phase % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) { +#if 0 int graphic = GFX_EXPLOSION; if (game.emulation == EMU_SUPAPLEX) @@ -1710,18 +1740,35 @@ void Explode(int ex, int ey, int phase, int mode) GFX_SP_EXPLODE_INFOTRON : GFX_SP_EXPLODE_EMPTY); + graphic += (phase / delay - 1); +#else + int graphic = IMG_EXPLOSION; + int frame = (phase / delay - 1); + + if (game.emulation == EMU_SUPAPLEX) + graphic = (Store[x][y] == EL_SP_INFOTRON ? + IMG_SP_EXPLOSION_INFOTRON : + IMG_SP_EXPLOSION); +#endif + if (phase == delay) ErdreichAnbroeckeln(SCREENX(x), SCREENY(y)); - graphic += (phase / delay - 1); - if (IS_PFORTE(Store[x][y])) { - DrawLevelElement(x, y, Store[x][y]); + DrawNewLevelElement(x, y, Store[x][y]); +#if 0 DrawGraphicThruMask(SCREENX(x), SCREENY(y), graphic); +#else + DrawNewGraphicThruMask(SCREENX(x), SCREENY(y), graphic, frame); +#endif } else +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), graphic); +#else + DrawNewGraphic(SCREENX(x), SCREENY(y), graphic, frame); +#endif } } @@ -1741,7 +1788,7 @@ void DynaExplode(int ex, int ey) if (IS_ACTIVE_BOMB(Feld[ex][ey])) { - player = &stored_player[Feld[ex][ey] - EL_DYNABOMB_ACTIVE_1]; + player = &stored_player[Feld[ex][ey] - EL_DYNABOMB_PLAYER1_ACTIVE]; dynabomb_size = player->dynabomb_size; dynabomb_xl = player->dynabomb_xl; player->dynabombs_left++; @@ -1805,10 +1852,10 @@ void Bang(int x, int y) RaiseScoreElement(element); Explode(x, y, EX_PHASE_START, EX_NORMAL); break; - case EL_DYNABOMB_ACTIVE_1: - case EL_DYNABOMB_ACTIVE_2: - case EL_DYNABOMB_ACTIVE_3: - case EL_DYNABOMB_ACTIVE_4: + case EL_DYNABOMB_PLAYER1_ACTIVE: + case EL_DYNABOMB_PLAYER2_ACTIVE: + case EL_DYNABOMB_PLAYER3_ACTIVE: + case EL_DYNABOMB_PLAYER4_ACTIVE: case EL_DYNABOMB_NR: case EL_DYNABOMB_SZ: case EL_DYNABOMB_XL: @@ -1851,8 +1898,14 @@ void Blurb(int x, int y) } else /* go on */ { +#if 0 int graphic = (element == EL_ACID_SPLASHING_LEFT ? GFX_BLURB_LEFT : GFX_BLURB_RIGHT); +#else + int graphic = (element == EL_ACID_SPLASHING_LEFT ? + IMG_ACID_SPLASHING_LEFT : + IMG_ACID_SPLASHING_RIGHT); +#endif if (!MovDelay[x][y]) /* initialize animation counter */ MovDelay[x][y] = 9; @@ -1861,12 +1914,20 @@ void Blurb(int x, int y) { MovDelay[x][y]--; if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), graphic+4-MovDelay[x][y]/2); +#else + { + int frame = getNewGraphicAnimationFrame(graphic, 8 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), graphic, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = EL_EMPTY; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } } } @@ -1931,7 +1992,7 @@ static void ToggleBeltSwitch(int x, int y) if (e_belt_nr == belt_nr) { Feld[xx][yy] = belt_base_switch_element[belt_nr] + belt_dir_nr; - DrawLevelField(xx, yy); + DrawNewLevelField(xx, yy); } } else if (IS_BELT(element) && belt_dir != MV_NO_MOVING) @@ -1943,7 +2004,7 @@ static void ToggleBeltSwitch(int x, int y) int belt_part = Feld[xx][yy] - belt_base_element[belt_nr]; Feld[xx][yy] = belt_base_active_element[belt_nr] + belt_part; - DrawLevelField(xx, yy); + DrawNewLevelField(xx, yy); } } else if (IS_BELT_ACTIVE(element) && belt_dir == MV_NO_MOVING) @@ -1955,7 +2016,7 @@ static void ToggleBeltSwitch(int x, int y) int belt_part = Feld[xx][yy] - belt_base_active_element[belt_nr]; Feld[xx][yy] = belt_base_element[belt_nr] + belt_part; - DrawLevelField(xx, yy); + DrawNewLevelField(xx, yy); } } } @@ -1978,7 +2039,7 @@ static void ToggleSwitchgateSwitch(int x, int y) element == EL_SWITCHGATE_SWITCH_DOWN) { Feld[xx][yy] = EL_SWITCHGATE_SWITCH_UP + game.switchgate_pos; - DrawLevelField(xx, yy); + DrawNewLevelField(xx, yy); } else if (element == EL_SWITCHGATE_OPEN || element == EL_SWITCHGATE_OPENING) @@ -1996,6 +2057,20 @@ static void ToggleSwitchgateSwitch(int x, int y) } } +static int getInvisibleActiveFromInvisibleElement(int element) +{ + return (element == EL_INVISIBLE_STEELWALL ? EL_INVISIBLE_STEELWALL_ACTIVE : + element == EL_INVISIBLE_WALL ? EL_INVISIBLE_WALL_ACTIVE : + EL_INVISIBLE_SAND_ACTIVE); +} + +static int getInvisibleFromInvisibleActiveElement(int element) +{ + return (element == EL_INVISIBLE_STEELWALL_ACTIVE ? EL_INVISIBLE_STEELWALL : + element == EL_INVISIBLE_WALL_ACTIVE ? EL_INVISIBLE_WALL : + EL_INVISIBLE_SAND); +} + static void RedrawAllLightSwitchesAndInvisibleElements() { int x, y; @@ -2010,19 +2085,32 @@ static void RedrawAllLightSwitchesAndInvisibleElements() game.light_time_left > 0) { Feld[x][y] = EL_LIGHT_SWITCH_ACTIVE; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } else if (element == EL_LIGHT_SWITCH_ACTIVE && game.light_time_left == 0) { Feld[x][y] = EL_LIGHT_SWITCH; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } + else if (element == EL_INVISIBLE_STEELWALL || + element == EL_INVISIBLE_WALL || + element == EL_INVISIBLE_SAND) + { + if (game.light_time_left > 0) + Feld[x][y] = getInvisibleActiveFromInvisibleElement(element); - if (element == EL_INVISIBLE_STEELWALL || - element == EL_INVISIBLE_WALL || - element == EL_INVISIBLE_SAND) - DrawLevelField(x, y); + DrawNewLevelField(x, y); + } + else if (element == EL_INVISIBLE_STEELWALL_ACTIVE || + element == EL_INVISIBLE_WALL_ACTIVE || + element == EL_INVISIBLE_SAND_ACTIVE) + { + if (game.light_time_left == 0) + Feld[x][y] = getInvisibleFromInvisibleActiveElement(element); + + DrawNewLevelField(x, y); + } } } } @@ -2698,6 +2786,8 @@ void StartMoving(int x, int y) if (Stop[x][y]) return; + GfxAction[x][y] = GFX_ACTION_DEFAULT; + if (CAN_FALL(element) && y0 && IS_PLAYER(x-1, y)) || (xfriends_still_needed--; if (!local_player->friends_still_needed && @@ -3023,7 +3139,7 @@ void StartMoving(int x, int y) else if (IS_MAMPF3(Feld[newx][newy])) { if (DigField(local_player, newx, newy, 0, 0, DF_DIG) == MF_MOVING) - DrawLevelField(newx, newy); + DrawNewLevelField(newx, newy); else MovDir[x][y] = MV_NO_MOVING; } @@ -3032,7 +3148,7 @@ void StartMoving(int x, int y) if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + DrawNewLevelField(x, y); return; } } @@ -3045,7 +3161,7 @@ void StartMoving(int x, int y) else { Feld[newx][newy] = EL_EMPTY; - DrawLevelField(newx, newy); + DrawNewLevelField(newx, newy); } PlaySoundLevel(x, y, SND_PIG_EATING); @@ -3055,7 +3171,7 @@ void StartMoving(int x, int y) if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + DrawNewLevelField(x, y); return; } } @@ -3066,7 +3182,7 @@ void StartMoving(int x, int y) if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + DrawNewLevelField(x, y); return; } else @@ -3082,21 +3198,21 @@ void StartMoving(int x, int y) if ((wanna_flame || IS_ENEMY(element1) || IS_ENEMY(element2)) && element1 != EL_DRAGON && element2 != EL_DRAGON && - element1 != EL_DRAGON_FIRE && element2 != EL_DRAGON_FIRE) + element1 != EL_FLAMES && element2 != EL_FLAMES) { if (IS_PLAYER(x, y)) DrawPlayerField(x, y); else - DrawLevelField(x, y); + DrawNewLevelField(x, y); PlaySoundLevel(x, y, SND_DRAGON_ATTACKING); MovDelay[x][y] = 50; - Feld[newx][newy] = EL_DRAGON_FIRE; + Feld[newx][newy] = EL_FLAMES; if (IN_LEV_FIELD(newx1, newy1) && Feld[newx1][newy1] == EL_EMPTY) - Feld[newx1][newy1] = EL_DRAGON_FIRE; + Feld[newx1][newy1] = EL_FLAMES; if (IN_LEV_FIELD(newx2, newy2) && Feld[newx2][newy2] == EL_EMPTY) - Feld[newx2][newy2] = EL_DRAGON_FIRE; + Feld[newx2][newy2] = EL_FLAMES; return; } } @@ -3109,7 +3225,7 @@ void StartMoving(int x, int y) else { Feld[newx][newy] = EL_EMPTY; - DrawLevelField(newx, newy); + DrawNewLevelField(newx, newy); } PlaySoundLevel(x, y, SND_YAMYAM_EATING); @@ -3130,7 +3246,7 @@ void StartMoving(int x, int y) else { Feld[newx][newy] = EL_EMPTY; - DrawLevelField(newx, newy); + DrawNewLevelField(newx, newy); } PlaySoundLevel(x, y, SND_DARK_YAMYAM_EATING); @@ -3182,26 +3298,26 @@ void StartMoving(int x, int y) #endif else if (element == EL_BUG || element == EL_SPACESHIP || element == EL_SP_SNIKSNAK || element == EL_MOLE) -#if 1 +#if 0 DrawLevelField(x, y); #else DrawNewLevelField(x, y); #endif else if (element == EL_BD_BUTTERFLY || element == EL_BD_FIREFLY) #if 0 - DrawGraphicAnimation(x, y, el2gfx(element), 2, 4, ANIM_NORMAL); + DrawGraphicAnimation(x, y, el2gfx(element), 2, 4, ANIM_LOOP); #else DrawNewGraphicAnimation(x, y, el2img(element)); #endif else if (element == EL_SATELLITE) #if 0 - DrawGraphicAnimation(x, y, GFX_SONDE_START, 8, 2, ANIM_NORMAL); + DrawGraphicAnimation(x, y, GFX_SONDE_START, 8, 2, ANIM_LOOP); #else DrawNewGraphicAnimation(x, y, IMG_SATELLITE); #endif else if (element == EL_SP_ELECTRON) #if 0 - DrawGraphicAnimation(x, y, GFX2_SP_ELECTRON, 8, 2, ANIM_NORMAL); + DrawGraphicAnimation(x, y, GFX2_SP_ELECTRON, 8, 2, ANIM_LOOP); #else DrawNewGraphicAnimation(x, y, IMG_SP_ELECTRON); #endif @@ -3273,7 +3389,7 @@ void ContinueMoving(int x, int y) }; Feld[x][y] = EL_SAND; - DrawLevelField(x, y); + DrawNewLevelField(x, y); for(i=0; i<4; i++) { @@ -3283,7 +3399,7 @@ void ContinueMoving(int x, int y) yy = y + xy[i][1]; if (IN_LEV_FIELD(xx, yy) && Feld[xx][yy] == EL_SAND) - DrawLevelField(xx, yy); /* for "ErdreichAnbroeckeln()" */ + DrawNewLevelField(xx, yy); /* for "ErdreichAnbroeckeln()" */ } } @@ -3339,21 +3455,14 @@ void ContinueMoving(int x, int y) MovPos[x][y] = MovDir[x][y] = MovDelay[x][y] = 0; MovDelay[newx][newy] = 0; + GfxAction[newx][newy] = GfxAction[x][y]; /* keep action one frame */ + GfxAction[x][y] = GFX_ACTION_DEFAULT; + if (!CAN_MOVE(element)) MovDir[newx][newy] = 0; - if (element == EL_BUG || element == EL_SPACESHIP || - element == EL_SP_SNIKSNAK || element == EL_PACMAN || - element == EL_SP_ELECTRON) - { - DrawNewLevelField(x, y); - DrawNewLevelField(newx, newy); - } - else - { - DrawLevelField(x, y); - DrawLevelField(newx, newy); - } + DrawNewLevelField(x, y); + DrawNewLevelField(newx, newy); Stop[newx][newy] = TRUE; JustStopped[newx][newy] = 3; @@ -3373,12 +3482,10 @@ void ContinueMoving(int x, int y) } else /* still moving on */ { - if (element == EL_BUG || element == EL_SPACESHIP || - element == EL_SP_SNIKSNAK || element == EL_PACMAN || - element == EL_SP_ELECTRON) - DrawNewLevelField(x, y); - else - DrawLevelField(x, y); + if (GfxAction[x][y] == GFX_ACTION_DEFAULT) + GfxAction[x][y] = GFX_ACTION_MOVING; + + DrawNewLevelField(x, y); } } @@ -3549,7 +3656,7 @@ void AmoebeUmwandelnBD(int ax, int ay, int new_element) AmoebaNr[x][y] = 0; Feld[x][y] = new_element; InitField(x, y, FALSE); - DrawLevelField(x, y); + DrawNewLevelField(x, y); done = TRUE; } } @@ -3584,13 +3691,22 @@ void AmoebeWaechst(int x, int y) { MovDelay[x][y]--; if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_AMOEBING + 3 - MovDelay[x][y]/2); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_AMOEBA_CREATING, + 6 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_AMOEBA_CREATING, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = Store[x][y]; Store[x][y] = 0; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } } } @@ -3612,12 +3728,21 @@ void AmoebaDisappearing(int x, int y) { MovDelay[x][y]--; if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_AMOEBING + MovDelay[x][y]/2); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_AMOEBA_SHRINKING, + 6 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_AMOEBA_SHRINKING, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = EL_EMPTY; - DrawLevelField(x, y); + DrawNewLevelField(x, y); /* don't let mole enter this field in this cycle; (give priority to objects falling to this field from above) */ @@ -3642,7 +3767,7 @@ void AmoebeAbleger(int ax, int ay) if (!level.amoeba_speed) { Feld[ax][ay] = EL_AMOEBA_DEAD; - DrawLevelField(ax, ay); + DrawNewLevelField(ax, ay); return; } @@ -3705,7 +3830,7 @@ void AmoebeAbleger(int ax, int ay) if (i == 4 && (!waiting_for_player || game.emulation == EMU_BOULDERDASH)) { Feld[ax][ay] = EL_AMOEBA_DEAD; - DrawLevelField(ax, ay); + DrawNewLevelField(ax, ay); AmoebaCnt[AmoebaNr[ax][ay]]--; if (AmoebaCnt[AmoebaNr[ax][ay]] <= 0) /* amoeba is completely dead */ @@ -3768,7 +3893,7 @@ void AmoebeAbleger(int ax, int ay) return; } - DrawLevelField(newax, neway); + DrawNewLevelField(newax, neway); } void Life(int ax, int ay) @@ -3820,7 +3945,7 @@ void Life(int ax, int ay) { Feld[xx][yy] = EL_EMPTY; if (!Stop[xx][yy]) - DrawLevelField(xx, yy); + DrawNewLevelField(xx, yy); Stop[xx][yy] = TRUE; changed = TRUE; } @@ -3832,7 +3957,7 @@ void Life(int ax, int ay) Feld[xx][yy] = element; MovDelay[xx][yy] = (element == EL_GAMEOFLIFE ? 0 : life_time-1); if (!Stop[xx][yy]) - DrawLevelField(xx, yy); + DrawNewLevelField(xx, yy); Stop[xx][yy] = TRUE; changed = TRUE; } @@ -3855,7 +3980,15 @@ void RobotWheel(int x, int y) if (MovDelay[x][y]) { if (IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_ABLENK+MovDelay[x][y]%4); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_ROBOT_WHEEL_ACTIVE, -1); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_ROBOT_WHEEL_ACTIVE, frame); + } +#endif if (!(MovDelay[x][y]%4)) PlaySoundLevel(x, y, SND_ROBOT_WHEEL_ACTIVE); return; @@ -3863,7 +3996,7 @@ void RobotWheel(int x, int y) } Feld[x][y] = EL_ROBOT_WHEEL; - DrawLevelField(x, y); + DrawNewLevelField(x, y); if (ZX == x && ZY == y) ZX = ZY = -1; } @@ -3879,8 +4012,16 @@ void TimegateWheel(int x, int y) if (MovDelay[x][y]) { if (IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_TIMEGATE_SWITCH + MovDelay[x][y]%4); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_TIMEGATE_SWITCH_ACTIVE, -1); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_TIMEGATE_SWITCH_ACTIVE, frame); + } +#endif if (!(MovDelay[x][y]%4)) PlaySoundLevel(x, y, SND_TIMEGATE_SWITCH_ACTIVE); return; @@ -3888,17 +4029,21 @@ void TimegateWheel(int x, int y) } Feld[x][y] = EL_TIMEGATE_SWITCH; - DrawLevelField(x, y); + DrawNewLevelField(x, y); if (ZX == x && ZY == y) ZX = ZY = -1; } void Blubber(int x, int y) { - if (y > 0 && IS_MOVING(x, y-1) && MovDir[x][y-1] == MV_DOWN) - DrawLevelField(x, y-1); +#if 0 + if (y > 0 && IS_MOVING(x, y - 1) && MovDir[x][y - 1] == MV_DOWN) + DrawNewLevelField(x, y - 1); else - DrawGraphicAnimation(x, y, GFX_GEBLUBBER, 4, 10, ANIM_NORMAL); + DrawGraphicAnimation(x, y, GFX_GEBLUBBER, 4, 10, ANIM_LOOP); +#else + DrawNewGraphicAnimation(x, y, IMG_ACID); +#endif } void NussKnacken(int x, int y) @@ -3910,13 +4055,22 @@ void NussKnacken(int x, int y) { MovDelay[x][y]--; if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_CRACKINGNUT + 3 - MovDelay[x][y]/2); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_NUT_CRACKING, + 6 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_NUT_CRACKING, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = EL_EMERALD; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } } } @@ -3930,22 +4084,37 @@ void BreakingPearl(int x, int y) { MovDelay[x][y]--; if (MovDelay[x][y]/2 && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_PEARL_BREAKING + 4 - MovDelay[x][y]/2); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_PEARL_BREAKING, + 8 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_PEARL_BREAKING, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = EL_EMPTY; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } } } -void SiebAktivieren(int x, int y, int typ) +void SiebAktivieren(int x, int y, int type) { - int graphic = (typ == 1 ? GFX_MAGIC_WALL_FULL : GFX_MAGIC_WALL_BD_FULL) + 3; +#if 0 + int graphic = (type == 1 ? GFX_MAGIC_WALL_FULL : GFX_MAGIC_WALL_BD_FULL) + 3; DrawGraphicAnimation(x, y, graphic, 4, 4, ANIM_REVERSE); +#else + int graphic = (type == 1 ? IMG_MAGIC_WALL_FULL : IMG_BD_MAGIC_WALL_FULL); + + DrawNewGraphicAnimation(x, y, graphic); +#endif } void AusgangstuerPruefen(int x, int y) @@ -3983,7 +4152,7 @@ void AusgangstuerOeffnen(int x, int y) int delay = 6; if (!MovDelay[x][y]) /* next animation frame */ - MovDelay[x][y] = 5*delay; + MovDelay[x][y] = 5 * delay; if (MovDelay[x][y]) /* wait some time before next frame */ { @@ -3992,19 +4161,32 @@ void AusgangstuerOeffnen(int x, int y) MovDelay[x][y]--; tuer = MovDelay[x][y]/delay; if (!(MovDelay[x][y]%delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_AUSGANG_AUF-tuer); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_EXIT_OPENING, + 29 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_EXIT_OPENING, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = EL_EXIT_OPEN; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } } } void AusgangstuerBlinken(int x, int y) { +#if 0 DrawGraphicAnimation(x, y, GFX_AUSGANG_AUF, 4, 4, ANIM_PINGPONG); +#else + DrawNewGraphicAnimation(x, y, IMG_EXIT_OPEN); +#endif } void OpenSwitchgate(int x, int y) @@ -4021,12 +4203,21 @@ void OpenSwitchgate(int x, int y) MovDelay[x][y]--; phase = MovDelay[x][y] / delay; if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_SWITCHGATE_OPEN - phase); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_SWITCHGATE_OPENING, + 29 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_SWITCHGATE_OPENING, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = EL_SWITCHGATE_OPEN; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } } } @@ -4045,12 +4236,21 @@ void CloseSwitchgate(int x, int y) MovDelay[x][y]--; phase = MovDelay[x][y] / delay; if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_SWITCHGATE_CLOSED + phase); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_SWITCHGATE_CLOSING, + 29 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_SWITCHGATE_CLOSING, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = EL_SWITCHGATE_CLOSED; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } } } @@ -4069,12 +4269,21 @@ void OpenTimegate(int x, int y) MovDelay[x][y]--; phase = MovDelay[x][y] / delay; if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_TIMEGATE_OPEN - phase); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_TIMEGATE_OPENING, + 29 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_TIMEGATE_OPENING, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = EL_TIMEGATE_OPEN; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } } } @@ -4093,12 +4302,21 @@ void CloseTimegate(int x, int y) MovDelay[x][y]--; phase = MovDelay[x][y] / delay; if (!(MovDelay[x][y] % delay) && IN_SCR_FIELD(SCREENX(x), SCREENY(y))) +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), GFX_TIMEGATE_CLOSED + phase); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_TIMEGATE_CLOSING, + 29 - MovDelay[x][y]); + + DrawNewGraphic(SCREENX(x), SCREENY(y), IMG_TIMEGATE_CLOSING, frame); + } +#endif if (!MovDelay[x][y]) { Feld[x][y] = EL_TIMEGATE_CLOSED; - DrawLevelField(x, y); + DrawNewLevelField(x, y); } } } @@ -4128,7 +4346,11 @@ void EdelsteinFunkeln(int x, int y) return; if (Feld[x][y] == EL_BD_DIAMOND) +#if 0 DrawGraphicAnimation(x, y, GFX_EDELSTEIN_BD, 4, 4, ANIM_REVERSE); +#else + DrawNewGraphicAnimation(x, y, IMG_BD_DIAMOND); +#endif else { if (!MovDelay[x][y]) /* next animation frame */ @@ -4141,7 +4363,11 @@ void EdelsteinFunkeln(int x, int y) if (setup.direct_draw && MovDelay[x][y]) SetDrawtoField(DRAW_BUFFERED); +#if 0 DrawGraphic(SCREENX(x), SCREENY(y), el2gfx(Feld[x][y])); +#else + DrawNewGraphic(SCREENX(x), SCREENY(y), el2img(Feld[x][y]), 0); +#endif if (MovDelay[x][y]) { @@ -4150,14 +4376,24 @@ void EdelsteinFunkeln(int x, int y) if (phase > 2) phase = 4-phase; +#if 0 DrawGraphicThruMask(SCREENX(x), SCREENY(y), GFX_FUNKELN_WEISS + phase); +#else + { + int frame = getNewGraphicAnimationFrame(IMG_TWINKLE_WHITE, + 10 - MovDelay[x][y]); + + DrawNewGraphicThruMask(SCREENX(x), SCREENY(y), IMG_TWINKLE_WHITE, + frame); + } +#endif if (setup.direct_draw) { int dest_x, dest_y; - dest_x = FX + SCREENX(x)*TILEX; - dest_y = FY + SCREENY(y)*TILEY; + dest_x = FX + SCREENX(x) * TILEX; + dest_y = FY + SCREENY(y) * TILEY; BlitBitmap(drawto_field, window, dest_x, dest_y, TILEX, TILEY, dest_x, dest_y); @@ -4334,7 +4570,7 @@ void CheckForDragon(int x, int y) int xx = x + j*xy[i][0], yy = y + j*xy[i][1]; if (IN_LEV_FIELD(xx, yy) && - (Feld[xx][yy] == EL_DRAGON_FIRE || Feld[xx][yy] == EL_DRAGON)) + (Feld[xx][yy] == EL_FLAMES || Feld[xx][yy] == EL_DRAGON)) { if (Feld[xx][yy] == EL_DRAGON) dragon_found = TRUE; @@ -4352,7 +4588,7 @@ void CheckForDragon(int x, int y) { int xx = x + j*xy[i][0], yy = y + j*xy[i][1]; - if (IN_LEV_FIELD(xx, yy) && Feld[xx][yy] == EL_DRAGON_FIRE) + if (IN_LEV_FIELD(xx, yy) && Feld[xx][yy] == EL_FLAMES) { Feld[xx][yy] = EL_EMPTY; DrawLevelField(xx, yy); @@ -4490,7 +4726,7 @@ static void DrawBeltAnimation(int x, int y, int element) if (belt_dir != MV_NO_MOVING) { int delay = 2; - int mode = (belt_dir == MV_LEFT ? ANIM_NORMAL : ANIM_REVERSE); + int mode = ANIM_LOOP | (belt_dir == MV_LEFT ? 0 : ANIM_REVERSE); int graphic = el2gfx(element) + (belt_dir == MV_LEFT ? 0 : 7); DrawGraphicAnimation(x, y, graphic, 8, delay, mode); @@ -4841,17 +5077,17 @@ void GameActions() element == EL_WALL_GROWING_Y || element == EL_WALL_GROWING_XY) MauerAbleger(x, y); - else if (element == EL_DRAGON_FIRE) + else if (element == EL_FLAMES) CheckForDragon(x, y); else if (element == EL_SP_BUGGY_BASE || element == EL_SP_BUGGY_BASE_ACTIVE) CheckBuggyBase(x, y); else if (element == EL_TRAP || element == EL_TRAP_ACTIVE) CheckTrap(x, y); else if (element == EL_SP_TERMINAL) - DrawGraphicAnimation(x, y, GFX2_SP_TERMINAL, 7, 12, ANIM_NORMAL); + DrawGraphicAnimation(x, y, GFX2_SP_TERMINAL, 7, 12, ANIM_LOOP); else if (element == EL_SP_TERMINAL_ACTIVE) { - DrawGraphicAnimation(x, y, GFX2_SP_TERMINAL_ACTIVE, 7, 4, ANIM_NORMAL); + DrawGraphicAnimation(x, y, GFX2_SP_TERMINAL_ACTIVE, 7, 4, ANIM_LOOP); #if 0 if (!(FrameCounter % 4)) PlaySoundLevel(x, y, SND_SP_TERMINAL_ACTIVE); @@ -4868,10 +5104,10 @@ void GameActions() else if (element == EL_TIMEGATE_CLOSING) CloseTimegate(x, y); else if (element == EL_EXTRA_TIME) - DrawGraphicAnimation(x, y, GFX_EXTRA_TIME, 6, 4, ANIM_NORMAL); + DrawGraphicAnimation(x, y, GFX_EXTRA_TIME, 6, 4, ANIM_LOOP); else if (element == EL_SHIELD_NORMAL) { - DrawGraphicAnimation(x, y, GFX_SHIELD_PASSIVE, 6, 4, ANIM_NORMAL); + DrawGraphicAnimation(x, y, GFX_SHIELD_PASSIVE, 6, 4, ANIM_LOOP); #if 0 if (!(FrameCounter % 4)) PlaySoundLevel(x, y, SND_SHIELD_PASSIVE_ACTIVATED); @@ -4879,7 +5115,7 @@ void GameActions() } else if (element == EL_SHIELD_DEADLY) { - DrawGraphicAnimation(x, y, GFX_SHIELD_ACTIVE, 6, 4, ANIM_NORMAL); + DrawGraphicAnimation(x, y, GFX_SHIELD_ACTIVE, 6, 4, ANIM_LOOP); #if 0 if (!(FrameCounter % 4)) PlaySoundLevel(x, y, SND_SHIELD_DEADLY_ACTIVE); @@ -5021,22 +5257,7 @@ void GameActions() game.light_time_left--; if (game.light_time_left == 0) - { - for (y=0; y 0) @@ -5249,7 +5470,7 @@ boolean MoveFigureOneStep(struct PlayerInfo *player, if (element == EL_ACID && dx == 0 && dy == 1) { Blurb(jx, jy); - Feld[jx][jy] = EL_PLAYER; + Feld[jx][jy] = EL_PLAYER1; InitMovingField(jx, jy, MV_DOWN); Store[jx][jy] = EL_ACID; ContinueMoving(jx, jy); @@ -5885,6 +6106,7 @@ int DigField(struct PlayerInfo *player, case EL_EMPTY: case EL_SAND: case EL_INVISIBLE_SAND: + case EL_INVISIBLE_SAND_ACTIVE: case EL_TRAP: case EL_SP_BASE: case EL_SP_BUGGY_BASE: @@ -6542,7 +6764,8 @@ boolean PlaceBomb(struct PlayerInfo *player) } else { - Feld[jx][jy] = EL_DYNABOMB_ACTIVE_1 + (player->element_nr - EL_PLAYER1); + Feld[jx][jy] = + EL_DYNABOMB_PLAYER1_ACTIVE + (player->element_nr - EL_PLAYER1); MovDelay[jx][jy] = 96; player->dynabombs_left--; if (IN_SCR_FIELD(SCREENX(jx), SCREENY(jy)))