X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=178f35defaf7352aff75dd66bbd529c6e22ad41c;hb=a7a3a417929449b5d1c32a5ef9e67693015d187b;hp=15a390baa8403de41dcd2e217ef9a49d3b23186e;hpb=2fae96dd30c1062fccd61734913d7426cf87bacf;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 15a390ba..178f35de 100644 --- a/src/game.c +++ b/src/game.c @@ -1784,7 +1784,7 @@ static void InitPlayerField(int x, int y, int element, boolean init_game) player->active = TRUE; // remove potentially duplicate players - if (StorePlayer[jx][jy] == Tile[x][y]) + if (IN_LEV_FIELD(jx, jy) && StorePlayer[jx][jy] == Tile[x][y]) StorePlayer[jx][jy] = 0; StorePlayer[x][y] = Tile[x][y]; @@ -2566,7 +2566,9 @@ static void UpdateGameControlValues(void) int element = gpc->value; int graphic = el2panelimg(element); int init_gfx_random = (graphic_info[graphic].anim_global_sync ? - sync_random_frame : INIT_GFX_RANDOM()); + sync_random_frame : + graphic_info[graphic].anim_global_anim_sync ? + getGlobalAnimSyncFrame() : INIT_GFX_RANDOM()); if (gpc->value != gpc->last_value) { @@ -2601,7 +2603,9 @@ static void UpdateGameControlValues(void) int last_anim_random_frame = gfx.anim_random_frame; int graphic = gpc->graphic; int init_gfx_random = (graphic_info[graphic].anim_global_sync ? - sync_random_frame : INIT_GFX_RANDOM()); + sync_random_frame : + graphic_info[graphic].anim_global_anim_sync ? + getGlobalAnimSyncFrame() : INIT_GFX_RANDOM()); if (gpc->value != gpc->last_value) { @@ -4777,6 +4781,8 @@ static void LevelSolved(void) game.LevelSolved = TRUE; game.GameOver = TRUE; + tape.solved = TRUE; + // needed here to display correct panel values while player walks into exit LevelSolved_SetFinalGameValues(); } @@ -5303,6 +5309,8 @@ static void ResetGfxFrame(int x, int y) if (graphic_info[graphic].anim_global_sync) GfxFrame[x][y] = FrameCounter; + else if (graphic_info[graphic].anim_global_anim_sync) + GfxFrame[x][y] = getGlobalAnimSyncFrame(); else if (ANIM_MODE(graphic) == ANIM_CE_VALUE) GfxFrame[x][y] = CustomValue[x][y]; else if (ANIM_MODE(graphic) == ANIM_CE_SCORE) @@ -5609,7 +5617,7 @@ static void setScreenCenteredToAllPlayers(int *sx, int *sy) *sy = (sy1 + sy2) / 2; } -static void DrawRelocateScreen(int old_x, int old_y, int x, int y, int move_dir, +static void DrawRelocateScreen(int old_x, int old_y, int x, int y, boolean center_screen, boolean quick_relocation) { unsigned int frame_delay_value_old = GetVideoFrameDelay(); @@ -5780,7 +5788,7 @@ static void RelocatePlayer(int jx, int jy, int el_player_raw) } // only visually relocate centered player - DrawRelocateScreen(old_jx, old_jy, player->jx, player->jy, player->MovDir, + DrawRelocateScreen(old_jx, old_jy, player->jx, player->jy, FALSE, level.instant_relocation); TestIfPlayerTouchesBadThing(jx, jy); @@ -6419,7 +6427,7 @@ static void ToggleBeltSwitch(int x, int y) } } -static void ToggleSwitchgateSwitch(int x, int y) +static void ToggleSwitchgateSwitch(void) { int xx, yy; @@ -6899,7 +6907,7 @@ static void Impact(int x, int y) smashed == EL_DC_SWITCHGATE_SWITCH_UP || smashed == EL_DC_SWITCHGATE_SWITCH_DOWN) { - ToggleSwitchgateSwitch(x, y + 1); + ToggleSwitchgateSwitch(); } else if (smashed == EL_LIGHT_SWITCH || smashed == EL_LIGHT_SWITCH_ACTIVE) @@ -9721,6 +9729,46 @@ static void CheckWallGrowing(int ax, int ay) boolean stop_right = FALSE; boolean new_wall = FALSE; + boolean is_steelwall = (element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || + element == EL_EXPANDABLE_STEELWALL_VERTICAL || + element == EL_EXPANDABLE_STEELWALL_ANY); + + boolean grow_vertical = (element == EL_EXPANDABLE_WALL_VERTICAL || + element == EL_EXPANDABLE_WALL_ANY || + element == EL_EXPANDABLE_STEELWALL_VERTICAL || + element == EL_EXPANDABLE_STEELWALL_ANY); + + boolean grow_horizontal = (element == EL_EXPANDABLE_WALL_HORIZONTAL || + element == EL_EXPANDABLE_WALL_ANY || + element == EL_EXPANDABLE_WALL || + element == EL_BD_EXPANDABLE_WALL || + element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || + element == EL_EXPANDABLE_STEELWALL_ANY); + + boolean stop_vertical = (element == EL_EXPANDABLE_WALL_VERTICAL || + element == EL_EXPANDABLE_STEELWALL_VERTICAL); + + boolean stop_horizontal = (element == EL_EXPANDABLE_WALL_HORIZONTAL || + element == EL_EXPANDABLE_WALL || + element == EL_EXPANDABLE_STEELWALL_HORIZONTAL); + + int wall_growing = (is_steelwall ? + EL_EXPANDABLE_STEELWALL_GROWING : + EL_EXPANDABLE_WALL_GROWING); + + int gfx_wall_growing_up = (is_steelwall ? + IMG_EXPANDABLE_STEELWALL_GROWING_UP : + IMG_EXPANDABLE_WALL_GROWING_UP); + int gfx_wall_growing_down = (is_steelwall ? + IMG_EXPANDABLE_STEELWALL_GROWING_DOWN : + IMG_EXPANDABLE_WALL_GROWING_DOWN); + int gfx_wall_growing_left = (is_steelwall ? + IMG_EXPANDABLE_STEELWALL_GROWING_LEFT : + IMG_EXPANDABLE_WALL_GROWING_LEFT); + int gfx_wall_growing_right = (is_steelwall ? + IMG_EXPANDABLE_STEELWALL_GROWING_RIGHT : + IMG_EXPANDABLE_WALL_GROWING_RIGHT); + if (IS_ANIMATED(graphic)) DrawLevelGraphicAnimationIfNeeded(ax, ay, graphic); @@ -9743,59 +9791,55 @@ static void CheckWallGrowing(int ax, int ay) if (IN_LEV_FIELD(ax + 1, ay) && IS_FREE(ax + 1, ay)) free_right = TRUE; - if (element == EL_EXPANDABLE_WALL_VERTICAL || - element == EL_EXPANDABLE_WALL_ANY) + if (grow_vertical) { if (free_top) { - Tile[ax][ay - 1] = EL_EXPANDABLE_WALL_GROWING; + Tile[ax][ay - 1] = wall_growing; Store[ax][ay - 1] = element; GfxDir[ax][ay - 1] = MovDir[ax][ay - 1] = MV_UP; if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay - 1))) - DrawLevelGraphic(ax, ay - 1, IMG_EXPANDABLE_WALL_GROWING_UP, 0); + DrawLevelGraphic(ax, ay - 1, gfx_wall_growing_up, 0); new_wall = TRUE; } if (free_bottom) { - Tile[ax][ay + 1] = EL_EXPANDABLE_WALL_GROWING; + Tile[ax][ay + 1] = wall_growing; Store[ax][ay + 1] = element; GfxDir[ax][ay + 1] = MovDir[ax][ay + 1] = MV_DOWN; if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay + 1))) - DrawLevelGraphic(ax, ay + 1, IMG_EXPANDABLE_WALL_GROWING_DOWN, 0); + DrawLevelGraphic(ax, ay + 1, gfx_wall_growing_down, 0); new_wall = TRUE; } } - if (element == EL_EXPANDABLE_WALL_HORIZONTAL || - element == EL_EXPANDABLE_WALL_ANY || - element == EL_EXPANDABLE_WALL || - element == EL_BD_EXPANDABLE_WALL) + if (grow_horizontal) { if (free_left) { - Tile[ax - 1][ay] = EL_EXPANDABLE_WALL_GROWING; + Tile[ax - 1][ay] = wall_growing; Store[ax - 1][ay] = element; GfxDir[ax - 1][ay] = MovDir[ax - 1][ay] = MV_LEFT; if (IN_SCR_FIELD(SCREENX(ax - 1), SCREENY(ay))) - DrawLevelGraphic(ax - 1, ay, IMG_EXPANDABLE_WALL_GROWING_LEFT, 0); + DrawLevelGraphic(ax - 1, ay, gfx_wall_growing_left, 0); new_wall = TRUE; } if (free_right) { - Tile[ax + 1][ay] = EL_EXPANDABLE_WALL_GROWING; + Tile[ax + 1][ay] = wall_growing; Store[ax + 1][ay] = element; GfxDir[ax + 1][ay] = MovDir[ax + 1][ay] = MV_RIGHT; if (IN_SCR_FIELD(SCREENX(ax + 1), SCREENY(ay))) - DrawLevelGraphic(ax + 1, ay, IMG_EXPANDABLE_WALL_GROWING_RIGHT, 0); + DrawLevelGraphic(ax + 1, ay, gfx_wall_growing_right, 0); new_wall = TRUE; } @@ -9813,128 +9857,14 @@ static void CheckWallGrowing(int ax, int ay) if (!IN_LEV_FIELD(ax + 1, ay) || IS_WALL(Tile[ax + 1][ay])) stop_right = TRUE; - if (((stop_top && stop_bottom) || - element == EL_EXPANDABLE_WALL_HORIZONTAL || - element == EL_EXPANDABLE_WALL) && - ((stop_left && stop_right) || - element == EL_EXPANDABLE_WALL_VERTICAL)) + if (((stop_top && stop_bottom) || stop_horizontal) && + ((stop_left && stop_right) || stop_vertical)) Tile[ax][ay] = EL_WALL; if (new_wall) PlayLevelSoundAction(ax, ay, ACTION_GROWING); } -static void CheckSteelWallGrowing(int ax, int ay) -{ - int element = Tile[ax][ay]; - int graphic = el2img(element); - boolean free_top = FALSE; - boolean free_bottom = FALSE; - boolean free_left = FALSE; - boolean free_right = FALSE; - boolean stop_top = FALSE; - boolean stop_bottom = FALSE; - boolean stop_left = FALSE; - boolean stop_right = FALSE; - boolean new_wall = FALSE; - - if (IS_ANIMATED(graphic)) - DrawLevelGraphicAnimationIfNeeded(ax, ay, graphic); - - if (!MovDelay[ax][ay]) // start building new wall - MovDelay[ax][ay] = 6; - - if (MovDelay[ax][ay]) // wait some time before building new wall - { - MovDelay[ax][ay]--; - if (MovDelay[ax][ay]) - return; - } - - if (IN_LEV_FIELD(ax, ay - 1) && IS_FREE(ax, ay - 1)) - free_top = TRUE; - if (IN_LEV_FIELD(ax, ay + 1) && IS_FREE(ax, ay + 1)) - free_bottom = TRUE; - if (IN_LEV_FIELD(ax - 1, ay) && IS_FREE(ax - 1, ay)) - free_left = TRUE; - if (IN_LEV_FIELD(ax + 1, ay) && IS_FREE(ax + 1, ay)) - free_right = TRUE; - - if (element == EL_EXPANDABLE_STEELWALL_VERTICAL || - element == EL_EXPANDABLE_STEELWALL_ANY) - { - if (free_top) - { - Tile[ax][ay - 1] = EL_EXPANDABLE_STEELWALL_GROWING; - Store[ax][ay - 1] = element; - GfxDir[ax][ay - 1] = MovDir[ax][ay - 1] = MV_UP; - - if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay - 1))) - DrawLevelGraphic(ax, ay - 1, IMG_EXPANDABLE_STEELWALL_GROWING_UP, 0); - - new_wall = TRUE; - } - - if (free_bottom) - { - Tile[ax][ay + 1] = EL_EXPANDABLE_STEELWALL_GROWING; - Store[ax][ay + 1] = element; - GfxDir[ax][ay + 1] = MovDir[ax][ay + 1] = MV_DOWN; - - if (IN_SCR_FIELD(SCREENX(ax), SCREENY(ay + 1))) - DrawLevelGraphic(ax, ay + 1, IMG_EXPANDABLE_STEELWALL_GROWING_DOWN, 0); - - new_wall = TRUE; - } - } - - if (element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || - element == EL_EXPANDABLE_STEELWALL_ANY) - { - if (free_left) - { - Tile[ax - 1][ay] = EL_EXPANDABLE_STEELWALL_GROWING; - Store[ax - 1][ay] = element; - GfxDir[ax - 1][ay] = MovDir[ax - 1][ay] = MV_LEFT; - - if (IN_SCR_FIELD(SCREENX(ax - 1), SCREENY(ay))) - DrawLevelGraphic(ax - 1, ay, IMG_EXPANDABLE_STEELWALL_GROWING_LEFT, 0); - - new_wall = TRUE; - } - - if (free_right) - { - Tile[ax + 1][ay] = EL_EXPANDABLE_STEELWALL_GROWING; - Store[ax + 1][ay] = element; - GfxDir[ax + 1][ay] = MovDir[ax + 1][ay] = MV_RIGHT; - - if (IN_SCR_FIELD(SCREENX(ax + 1), SCREENY(ay))) - DrawLevelGraphic(ax + 1, ay, IMG_EXPANDABLE_STEELWALL_GROWING_RIGHT, 0); - - new_wall = TRUE; - } - } - - if (!IN_LEV_FIELD(ax, ay - 1) || IS_WALL(Tile[ax][ay - 1])) - stop_top = TRUE; - if (!IN_LEV_FIELD(ax, ay + 1) || IS_WALL(Tile[ax][ay + 1])) - stop_bottom = TRUE; - if (!IN_LEV_FIELD(ax - 1, ay) || IS_WALL(Tile[ax - 1][ay])) - stop_left = TRUE; - if (!IN_LEV_FIELD(ax + 1, ay) || IS_WALL(Tile[ax + 1][ay])) - stop_right = TRUE; - - if (((stop_top && stop_bottom) || - element == EL_EXPANDABLE_STEELWALL_HORIZONTAL) && - ((stop_left && stop_right) || - element == EL_EXPANDABLE_STEELWALL_VERTICAL)) - Tile[ax][ay] = EL_STEELWALL; - - if (new_wall) - PlayLevelSoundAction(ax, ay, ACTION_GROWING); -} - static void CheckForDragon(int x, int y) { int i, j; @@ -12066,25 +11996,23 @@ void GameActions(void) void GameActions_EM_Main(void) { byte effective_action[MAX_PLAYERS]; - boolean warp_mode = (tape.playing && tape.warp_forward && !tape.pausing); int i; for (i = 0; i < MAX_PLAYERS; i++) effective_action[i] = stored_player[i].effective_action; - GameActions_EM(effective_action, warp_mode); + GameActions_EM(effective_action); } void GameActions_SP_Main(void) { byte effective_action[MAX_PLAYERS]; - boolean warp_mode = (tape.playing && tape.warp_forward && !tape.pausing); int i; for (i = 0; i < MAX_PLAYERS; i++) effective_action[i] = stored_player[i].effective_action; - GameActions_SP(effective_action, warp_mode); + GameActions_SP(effective_action); for (i = 0; i < MAX_PLAYERS; i++) { @@ -12097,9 +12025,7 @@ void GameActions_SP_Main(void) void GameActions_MM_Main(void) { - boolean warp_mode = (tape.playing && tape.warp_forward && !tape.pausing); - - GameActions_MM(local_player->effective_mouse_action, warp_mode); + GameActions_MM(local_player->effective_mouse_action); } void GameActions_RND_Main(void) @@ -12163,7 +12089,7 @@ void GameActions_RND(void) game.centered_player_nr = game.centered_player_nr_next; game.set_centered_player = FALSE; - DrawRelocateScreen(0, 0, sx, sy, MV_NONE, TRUE, setup.quick_switch); + DrawRelocateScreen(0, 0, sx, sy, TRUE, setup.quick_switch); DrawGameDoorValues(); } @@ -12465,12 +12391,11 @@ void GameActions_RND(void) element == EL_EXPANDABLE_WALL_HORIZONTAL || element == EL_EXPANDABLE_WALL_VERTICAL || element == EL_EXPANDABLE_WALL_ANY || - element == EL_BD_EXPANDABLE_WALL) - CheckWallGrowing(x, y); - else if (element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || + element == EL_BD_EXPANDABLE_WALL || + element == EL_EXPANDABLE_STEELWALL_HORIZONTAL || element == EL_EXPANDABLE_STEELWALL_VERTICAL || element == EL_EXPANDABLE_STEELWALL_ANY) - CheckSteelWallGrowing(x, y); + CheckWallGrowing(x, y); else if (element == EL_FLAMES) CheckForDragon(x, y); else if (element == EL_EXPLOSION) @@ -14783,7 +14708,7 @@ static int DigField(struct PlayerInfo *player, element == EL_DC_SWITCHGATE_SWITCH_UP || element == EL_DC_SWITCHGATE_SWITCH_DOWN) { - ToggleSwitchgateSwitch(x, y); + ToggleSwitchgateSwitch(); } else if (element == EL_LIGHT_SWITCH || element == EL_LIGHT_SWITCH_ACTIVE) @@ -15917,7 +15842,7 @@ static ListNode *SaveEngineSnapshotBuffers(void) if (level.game_engine_type == GAME_ENGINE_TYPE_SP) SaveEngineSnapshotValues_SP(&buffers); if (level.game_engine_type == GAME_ENGINE_TYPE_MM) - SaveEngineSnapshotValues_MM(&buffers); + SaveEngineSnapshotValues_MM(); // save values stored in special snapshot structure