X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=f6956bc428fc091c9f73be2aa2e79ed503b29b8d;hb=f60e97c16b1c14ffd21d9f9ca86ad0be52dfa9b4;hp=cda2f48694df03de750c8c7ea841eb95045bcae1;hpb=182eaab70df76cf12c2066a0c000e2fab50714f9;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index cda2f486..f6956bc4 100644 --- a/src/game.c +++ b/src/game.c @@ -76,6 +76,10 @@ #define DX_TIME (DX + XX_TIME) #define DY_TIME (DY + YY_TIME) +/* values for initial player move delay (initial delay counter value) */ +#define INITIAL_MOVE_DELAY_OFF -1 +#define INITIAL_MOVE_DELAY_ON 0 + /* values for player movement speed (which is in fact a delay value) */ #define MOVE_DELAY_NORMAL_SPEED 8 #define MOVE_DELAY_HIGH_SPEED 4 @@ -102,7 +106,7 @@ static void KillHeroUnlessProtected(int, int); void PlaySoundLevel(int, int, int); void PlaySoundLevelAction(int, int, int); -void PlaySoundLevelActionElement(int, int, int, int); +void PlaySoundLevelElementAction(int, int, int, int); static void MapGameButtons(); static void HandleGameButtons(struct GadgetInfo *); @@ -491,9 +495,18 @@ void DrawGameDoorValues() int2str(TimeLeft, 3), FS_SMALL, FC_YELLOW); } -void InitGameEngine() + +/* + ============================================================================= + InitGameSound() + ----------------------------------------------------------------------------- + initialize sound effect lookup table for element actions + ============================================================================= +*/ + +void InitGameSound() { - static int sound_effect_properties[NUM_SOUND_EFFECTS]; + int sound_effect_properties[NUM_SOUND_EFFECTS]; int i, j; #if 0 @@ -575,12 +588,87 @@ void InitGameEngine() #endif } + +/* + ============================================================================= + InitGameEngine() + ----------------------------------------------------------------------------- + initialize game engine due to level / tape version number + ============================================================================= +*/ + +static void InitGameEngine() +{ + int i; + + game.engine_version = (tape.playing ? tape.engine_version : + level.game_version); + +#if 0 + printf("level %d: level version == %06d\n", level_nr, level.game_version); + printf(" tape version == %06d [%s] [file: %06d]\n", + tape.engine_version, (tape.playing ? "PLAYING" : "RECORDING"), + tape.file_version); + printf(" => game.engine_version == %06d\n", game.engine_version); +#endif + + /* dynamically adjust player properties according to game engine version */ + game.initial_move_delay = + (game.engine_version <= VERSION_IDENT(2,0,1) ? INITIAL_MOVE_DELAY_ON : + INITIAL_MOVE_DELAY_OFF); + + /* dynamically adjust player properties according to level information */ + game.initial_move_delay_value = + (level.double_speed ? MOVE_DELAY_HIGH_SPEED : MOVE_DELAY_NORMAL_SPEED); + + /* dynamically adjust element properties according to game engine version */ + { + static int ep_em_slippery_wall[] = + { + EL_BETON, + EL_MAUERWERK, + EL_MAUER_LEBT, + EL_MAUER_X, + EL_MAUER_Y, + EL_MAUER_XY + }; + static int ep_em_slippery_wall_num = SIZEOF_ARRAY_INT(ep_em_slippery_wall); + + for (i=0; i VERSION_IDENT(2,0,1)) + Elementeigenschaften2[EL_MAUERND] |= EP_BIT_EM_SLIPPERY_WALL; + else + Elementeigenschaften2[EL_MAUERND] &= ~EP_BIT_EM_SLIPPERY_WALL; + } +} + + +/* + ============================================================================= + InitGame() + ----------------------------------------------------------------------------- + initialize and start new game + ============================================================================= +*/ + void InitGame() { - int i, j, x, y; boolean emulate_bd = TRUE; /* unless non-BOULDERDASH elements found */ boolean emulate_sb = TRUE; /* unless non-SOKOBAN elements found */ boolean emulate_sp = TRUE; /* unless non-SUPAPLEX elements found */ + int i, j, x, y; + + InitGameEngine(); #if DEBUG #if USE_NEW_AMOEBA_CODE @@ -636,9 +724,8 @@ void InitGame() player->last_move_dir = MV_NO_MOVING; player->is_moving = FALSE; - player->move_delay = -1; /* no initial move delay */ - player->move_delay_value = - (level.double_speed ? MOVE_DELAY_HIGH_SPEED : MOVE_DELAY_NORMAL_SPEED); + player->move_delay = game.initial_move_delay; + player->move_delay_value = game.initial_move_delay_value; player->push_delay = 0; player->push_delay_value = 5; @@ -729,6 +816,10 @@ void InitGame() } } + game.emulation = (emulate_bd ? EMU_BOULDERDASH : + emulate_sb ? EMU_SOKOBAN : + emulate_sp ? EMU_SUPAPLEX : EMU_NONE); + /* correct non-moving belts to start moving left */ for (i=0; i<4; i++) if (game.belt_dir[i] == MV_NO_MOVING) @@ -828,49 +919,6 @@ void InitGame() } } - game.version = (tape.playing ? tape.game_version : level.game_version); - game.emulation = (emulate_bd ? EMU_BOULDERDASH : - emulate_sb ? EMU_SOKOBAN : - emulate_sp ? EMU_SUPAPLEX : EMU_NONE); - - /* dynamically adjust element properties according to game engine version */ - { - static int ep_em_slippery_wall[] = - { - EL_BETON, - EL_MAUERWERK, - EL_MAUER_LEBT, - EL_MAUER_X, - EL_MAUER_Y, - EL_MAUER_XY - }; -#if 1 - static int ep_em_slippery_wall_num = SIZEOF_ARRAY_INT(ep_em_slippery_wall); -#else - static int ep_em_slippery_wall_num = - sizeof(ep_em_slippery_wall) / sizeof(int); -#endif - - /* - printf("level %d: game.version == %06d\n", level_nr, level.game_version); - printf(" file_version == %06d\n", level.file_version); - */ - - for (i=0; i= GAME_VERSION_2_0) -#endif - Elementeigenschaften2[ep_em_slippery_wall[i]] |= - EP_BIT_EM_SLIPPERY_WALL; - else - Elementeigenschaften2[ep_em_slippery_wall[i]] &= - ~EP_BIT_EM_SLIPPERY_WALL; - } - } - if (BorderElement == EL_LEERRAUM) { SBX_Left = 0; @@ -2162,7 +2210,7 @@ void Impact(int x, int y) /* play sound of object that hits the ground */ if (lastline || object_hit) - PlaySoundLevelActionElement(x, y, SND_ACTION_IMPACT, element); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_IMPACT); } void TurnRound(int x, int y) @@ -3444,9 +3492,9 @@ void AmoebeWaechst(int x, int y) if (DelayReached(&sound_delay, sound_delay_value)) { if (Store[x][y] == EL_AMOEBE_BD) - PlaySoundLevel(x, y, SND_BD_AMOEBA_GROWING); + PlaySoundLevel(x, y, SND_BD_AMOEBA_CREATING); else - PlaySoundLevel(x, y, SND_AMOEBA_GROWING); + PlaySoundLevel(x, y, SND_AMOEBA_CREATING); sound_delay_value = 30; } } @@ -3711,8 +3759,8 @@ void Life(int ax, int ay) } if (changed) - PlaySoundLevel(ax, ay, element == EL_LIFE ? SND_GAMEOFLIFE_GROWING : - SND_BIOMAZE_GROWING); + PlaySoundLevel(ax, ay, element == EL_LIFE ? SND_GAMEOFLIFE_CREATING : + SND_BIOMAZE_CREATING); } void RobotWheel(int x, int y) @@ -4167,6 +4215,7 @@ void MauerAbleger(int ax, int ay) DrawGraphic(SCREENX(ax-1), SCREENY(ay), GFX_MAUER_LEFT); new_wall = TRUE; } + if (rechts_frei) { Feld[ax+1][ay] = EL_MAUERND; @@ -5150,7 +5199,7 @@ boolean MoveFigure(struct PlayerInfo *player, int dx, int dy) return FALSE; #else if (!FrameReached(&player->move_delay, player->move_delay_value) && - !(tape.playing && tape.game_version < GAME_VERSION_2_0)) + !(tape.playing && tape.file_version < FILE_VERSION_2_0)) return FALSE; #endif @@ -5742,7 +5791,7 @@ int DigField(struct PlayerInfo *player, case EL_SP_BASE: case EL_SP_BUG: RemoveField(x, y); - PlaySoundLevelActionElement(x, y, SND_ACTION_DIGGING, element); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_DIGGING); break; case EL_EDELSTEIN: @@ -5764,7 +5813,7 @@ int DigField(struct PlayerInfo *player, DrawText(DX_EMERALDS, DY_EMERALDS, int2str(local_player->gems_still_needed, 3), FS_SMALL, FC_YELLOW); - PlaySoundLevelActionElement(x, y, SND_ACTION_COLLECTING, element); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_COLLECTING); break; case EL_SPEED_PILL: @@ -5809,7 +5858,7 @@ int DigField(struct PlayerInfo *player, DrawText(DX_DYNAMITE, DY_DYNAMITE, int2str(local_player->dynamite, 3), FS_SMALL, FC_YELLOW); - PlaySoundLevelActionElement(x, y, SND_ACTION_COLLECTING, element); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_COLLECTING); break; case EL_DYNABOMB_NR: @@ -6014,7 +6063,7 @@ int DigField(struct PlayerInfo *player, return MF_NO_ACTION; #else if (!FrameReached(&player->push_delay, player->push_delay_value) && - !(tape.playing && tape.game_version < GAME_VERSION_2_0) && + !(tape.playing && tape.file_version < FILE_VERSION_2_0) && element != EL_SPRING) return MF_NO_ACTION; #endif @@ -6039,7 +6088,7 @@ int DigField(struct PlayerInfo *player, player->push_delay_value = (element == EL_SPRING ? 0 : 2 + RND(8)); DrawLevelField(x+dx, y+dy); - PlaySoundLevelActionElement(x, y, SND_ACTION_PUSHING, element); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_PUSHING); break; case EL_PFORTE1: @@ -6099,7 +6148,7 @@ int DigField(struct PlayerInfo *player, player->programmed_action = move_direction; DOUBLE_PLAYER_SPEED(player); - PlaySoundLevelActionElement(x, y, SND_ACTION_PASSING, element); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_PASSING); break; case EL_SP_PORT1_LEFT: @@ -6256,7 +6305,7 @@ int DigField(struct PlayerInfo *player, return MF_NO_ACTION; #else if (!FrameReached(&player->push_delay, player->push_delay_value) && - !(tape.playing && tape.game_version < GAME_VERSION_2_0) && + !(tape.playing && tape.file_version < FILE_VERSION_2_0) && element != EL_BALLOON) return MF_NO_ACTION; #endif @@ -6293,7 +6342,7 @@ int DigField(struct PlayerInfo *player, { RemoveField(x, y); Feld[x+dx][y+dy] = element; - PlaySoundLevelActionElement(x, y, SND_ACTION_PUSHING, element); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_PUSHING); } player->push_delay_value = (element == EL_BALLOON ? 0 : 2); @@ -6460,10 +6509,10 @@ void PlaySoundLevel(int x, int y, int nr) void PlaySoundLevelAction(int x, int y, int sound_action) { - PlaySoundLevelActionElement(x, y, sound_action, Feld[x][y]); + PlaySoundLevelElementAction(x, y, Feld[x][y], sound_action); } -void PlaySoundLevelActionElement(int x, int y, int sound_action, int element) +void PlaySoundLevelElementAction(int x, int y, int element, int sound_action) { int sound_effect = element_action_sound[element][sound_action];