X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=020cdc8910375e5e1271d8f6c561cb41c685b48a;hb=93c45991646f65be9d8c3ff07c132e2ebb2c12b4;hp=38650b36c8c52807fbbc582890a83f291877fd56;hpb=86e110774e5210b326e6867b134bd638d93554d3;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 38650b36..020cdc89 100644 --- a/src/game.c +++ b/src/game.c @@ -102,29 +102,56 @@ static void KillHeroUnlessProtected(int, int); void PlaySoundLevel(int, int, int); void PlaySoundLevelAction(int, int, int); +void PlaySoundLevelElementAction(int, int, int, int); static void MapGameButtons(); static void HandleGameButtons(struct GadgetInfo *); static struct GadgetInfo *game_gadget[NUM_GAME_BUTTONS]; -static char *loop_sound_actions[] = +#define SND_ACTION_UNKNOWN 0 +#define SND_ACTION_WAITING 1 +#define SND_ACTION_MOVING 2 +#define SND_ACTION_DIGGING 3 +#define SND_ACTION_COLLECTING 4 +#define SND_ACTION_PASSING 5 +#define SND_ACTION_IMPACT 6 +#define SND_ACTION_PUSHING 7 +#define SND_ACTION_ACTIVATING 8 +#define SND_ACTION_BURNING 9 + +#define NUM_SND_ACTIONS 10 + +static struct +{ + char *text; + int value; + boolean is_loop; +} sound_action_properties[] = { - ".waiting", - ".moving", - ".running", - ".burning", - ".growing", - ".attacking" + /* insert _all_ loop sound actions here */ + { ".waiting", SND_ACTION_WAITING, TRUE }, + { ".moving", SND_ACTION_MOVING, TRUE }, /* continuos moving */ + { ".running", SND_ACTION_UNKNOWN, TRUE }, + { ".burning", SND_ACTION_BURNING, TRUE }, + { ".growing", SND_ACTION_UNKNOWN, TRUE }, + { ".attacking", SND_ACTION_UNKNOWN, TRUE }, + + /* other (non-loop) sound actions are optional */ + { ".stepping", SND_ACTION_MOVING, FALSE }, /* discrete moving */ + { ".digging", SND_ACTION_DIGGING, FALSE }, + { ".collecting", SND_ACTION_COLLECTING, FALSE }, + { ".passing", SND_ACTION_PASSING, FALSE }, + { ".impact", SND_ACTION_IMPACT, FALSE }, + { ".pushing", SND_ACTION_PUSHING, FALSE }, + { ".activating", SND_ACTION_ACTIVATING, FALSE }, + { NULL, 0, 0 }, }; +static int element_action_sound[NUM_LEVEL_ELEMENTS][NUM_SND_ACTIONS]; static boolean is_loop_sound[NUM_SOUND_EFFECTS]; -static boolean sound_info_initialized = FALSE; #define IS_LOOP_SOUND(x) (is_loop_sound[x]) -#define SND_MOVING 1 -#define SND_WAITING 2 - #ifdef DEBUG #if 0 @@ -464,6 +491,90 @@ void DrawGameDoorValues() int2str(TimeLeft, 3), FS_SMALL, FC_YELLOW); } +void InitGameEngine() +{ + static int sound_effect_properties[NUM_SOUND_EFFECTS]; + int i, j; + +#if 0 + debug_print_timestamp(0, NULL); +#endif + + for (i=0; i len_action_text && - strcmp(&sound_effects[i].text[len_effect_text - len_action_text], - loop_sound_actions[j]) == 0) - is_loop_sound[i] = TRUE; - } - } - - for (i=0; i= 0) - PlaySoundLevel(x, y, sound); - } + PlaySoundLevelElementAction(x, y, element, SND_ACTION_IMPACT); } void TurnRound(int x, int y) @@ -2863,7 +2880,7 @@ void StartMoving(int x, int y) if (MovDelay[x][y]) /* element still has to wait some time */ { - PlaySoundLevelAction(x, y, SND_WAITING); + PlaySoundLevelAction(x, y, SND_ACTION_WAITING); return; } @@ -3080,14 +3097,14 @@ void StartMoving(int x, int y) if (DONT_TOUCH(element)) TestIfBadThingTouchesHero(x, y); - PlaySoundLevelAction(x, y, SND_WAITING); + PlaySoundLevelAction(x, y, SND_ACTION_WAITING); return; } InitMovingField(x, y, MovDir[x][y]); - PlaySoundLevelAction(x, y, SND_MOVING); + PlaySoundLevelAction(x, y, SND_ACTION_MOVING); } if (MovDir[x][y]) @@ -3427,9 +3444,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; } } @@ -3694,8 +3711,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) @@ -5725,19 +5742,7 @@ int DigField(struct PlayerInfo *player, case EL_SP_BASE: case EL_SP_BUG: RemoveField(x, y); - - if (element == EL_LEERRAUM) - PlaySoundLevel(x, y, SND_EMPTY_SPACE_DIGGING); - else if (element == EL_ERDREICH) - PlaySoundLevel(x, y, SND_SAND_DIGGING); - else if (element == EL_SAND_INVISIBLE) - PlaySoundLevel(x, y, SND_SAND_INVISIBLE_DIGGING); - else if (element == EL_TRAP_INACTIVE) - PlaySoundLevel(x, y, SND_TRAP_INACTIVE_DIGGING); - else if (element == EL_SP_BASE) - PlaySoundLevel(x, y, SND_SP_BASE_DIGGING); - else if (element == EL_SP_BUG) - PlaySoundLevel(x, y, SND_SP_BUGGY_BASE_DIGGING); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_DIGGING); break; case EL_EDELSTEIN: @@ -5759,19 +5764,7 @@ int DigField(struct PlayerInfo *player, DrawText(DX_EMERALDS, DY_EMERALDS, int2str(local_player->gems_still_needed, 3), FS_SMALL, FC_YELLOW); - - if (element == EL_EDELSTEIN_BD) - PlaySoundLevel(x, y, SND_BD_DIAMOND_COLLECTING); - else if (element == EL_DIAMANT) - PlaySoundLevel(x, y, SND_DIAMOND_COLLECTING); - else if (element == EL_SP_INFOTRON) - PlaySoundLevel(x, y, SND_SP_INFOTRON_COLLECTING); - else if (element == EL_PEARL) - PlaySoundLevel(x, y, SND_PEARL_COLLECTING); - else if (element == EL_CRYSTAL) - PlaySoundLevel(x, y, SND_CRYSTAL_COLLECTING); - else /* EL_EDELSTEIN style element */ - PlaySoundLevel(x, y, SND_EMERALD_COLLECTING); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_COLLECTING); break; case EL_SPEED_PILL: @@ -5816,10 +5809,7 @@ int DigField(struct PlayerInfo *player, DrawText(DX_DYNAMITE, DY_DYNAMITE, int2str(local_player->dynamite, 3), FS_SMALL, FC_YELLOW); - if (element == EL_SP_DISK_RED) - PlaySoundLevel(x, y, SND_SP_DISK_RED_COLLECTING); - else - PlaySoundLevel(x, y, SND_DYNAMITE_COLLECTING); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_COLLECTING); break; case EL_DYNABOMB_NR: @@ -6049,24 +6039,7 @@ int DigField(struct PlayerInfo *player, player->push_delay_value = (element == EL_SPRING ? 0 : 2 + RND(8)); DrawLevelField(x+dx, y+dy); - if (element == EL_FELSBROCKEN) - PlaySoundLevel(x+dx, y+dy, SND_ROCK_PUSHING); - else if (element == EL_BD_ROCK) - PlaySoundLevel(x+dx, y+dy, SND_BD_ROCK_PUSHING); - else if (element == EL_BOMBE) - PlaySoundLevel(x+dx, y+dy, SND_BOMB_PUSHING); - else if (element == EL_DX_SUPABOMB) - PlaySoundLevel(x+dx, y+dy, SND_DX_BOMB_PUSHING); - else if (element == EL_KOKOSNUSS) - PlaySoundLevel(x+dx, y+dy, SND_NUT_PUSHING); - else if (element == EL_ZEIT_LEER) - PlaySoundLevel(x+dx, y+dy, SND_TIME_ORB_EMPTY_PUSHING); - else if (element == EL_SP_ZONK) - PlaySoundLevel(x+dx, y+dy, SND_SP_ZONK_PUSHING); - else if (element == EL_SP_DISK_ORANGE) - PlaySoundLevel(x+dx, y+dy, SND_SP_DISK_ORANGE_PUSHING); - else if (element == EL_SPRING) - PlaySoundLevel(x+dx, y+dy, SND_SPRING_PUSHING); + PlaySoundLevelElementAction(x, y, element, SND_ACTION_PUSHING); break; case EL_PFORTE1: @@ -6099,7 +6072,6 @@ int DigField(struct PlayerInfo *player, DOUBLE_PLAYER_SPEED(player); PlaySoundLevel(x, y, SND_GATE_PASSING); - break; case EL_EM_GATE_1X: @@ -6116,7 +6088,6 @@ int DigField(struct PlayerInfo *player, DOUBLE_PLAYER_SPEED(player); PlaySoundLevel(x, y, SND_GATE_PASSING); - break; case EL_SWITCHGATE_OPEN: @@ -6128,11 +6099,7 @@ int DigField(struct PlayerInfo *player, player->programmed_action = move_direction; DOUBLE_PLAYER_SPEED(player); - if (element == EL_SWITCHGATE_OPEN) - PlaySoundLevel(x, y, SND_SWITCHGATE_PASSING); - else - PlaySoundLevel(x, y, SND_TIMEGATE_PASSING); - + PlaySoundLevelElementAction(x, y, element, SND_ACTION_PASSING); break; case EL_SP_PORT1_LEFT: @@ -6326,18 +6293,13 @@ int DigField(struct PlayerInfo *player, { RemoveField(x, y); Feld[x+dx][y+dy] = element; + PlaySoundLevelElementAction(x, y, element, SND_ACTION_PUSHING); } player->push_delay_value = (element == EL_BALLOON ? 0 : 2); DrawLevelField(x, y); DrawLevelField(x+dx, y+dy); - if (element == EL_SONDE) - PlaySoundLevel(x+dx, y+dy, SND_SATELLITE_PUSHING); - else if (element == EL_SP_DISK_YELLOW) - PlaySoundLevel(x+dx, y+dy, SND_SP_DISK_YELLOW_PUSHING); - else if (element == EL_BALLOON) - PlaySoundLevel(x+dx, y+dy, SND_BALLOON_PUSHING); if (IS_SB_ELEMENT(element) && local_player->sokobanfields_still_needed == 0 && @@ -6496,82 +6458,17 @@ void PlaySoundLevel(int x, int y, int nr) PlaySoundExt(nr, volume, stereo_position, type); } -void PlaySoundLevelAction(int x, int y, int action) +void PlaySoundLevelAction(int x, int y, int sound_action) { - int element = Feld[x][y]; + PlaySoundLevelElementAction(x, y, Feld[x][y], sound_action); +} - if (action == SND_MOVING) - { - if (element == EL_KAEFER) - PlaySoundLevel(x, y, SND_BUG_MOVING); - else if (element == EL_FLIEGER) - PlaySoundLevel(x, y, SND_SPACESHIP_MOVING); - else if (element == EL_BUTTERFLY) - PlaySoundLevel(x, y, SND_BD_BUTTERFLY_MOVING); - else if (element == EL_FIREFLY) - PlaySoundLevel(x, y, SND_BD_FIREFLY_MOVING); - else if (element == EL_SP_SNIKSNAK) - PlaySoundLevel(x, y, SND_SP_SNIKSNAK_MOVING); - else if (element == EL_SP_ELECTRON) - PlaySoundLevel(x, y, SND_SP_ELECTRON_MOVING); - else if (element == EL_MAMPFER) - PlaySoundLevel(x, y, SND_YAMYAM_MOVING); - else if (element == EL_MAMPFER2) - PlaySoundLevel(x, y, SND_DARK_YAMYAM_MOVING); - else if (element == EL_BALLOON) - PlaySoundLevel(x, y, SND_BALLOON_MOVING); - else if (element == EL_SPRING_MOVING) - PlaySoundLevel(x, y, SND_SPRING_MOVING); - else if (element == EL_MOLE) - PlaySoundLevel(x, y, SND_MOLE_MOVING); - else if (element == EL_SONDE) - PlaySoundLevel(x, y, SND_SATELLITE_MOVING); - else if (element == EL_PACMAN) - PlaySoundLevel(x, y, SND_PACMAN_MOVING); - else if (element == EL_PINGUIN) - PlaySoundLevel(x, y, SND_PENGUIN_MOVING); - else if (element == EL_SCHWEIN) - PlaySoundLevel(x, y, SND_PIG_MOVING); - else if (element == EL_DRACHE) - PlaySoundLevel(x, y, SND_DRAGON_MOVING); - else if (element == EL_ROBOT) - PlaySoundLevel(x, y, SND_ROBOT_STEPPING); - } - else if (action == SND_WAITING) - { - if (element == EL_KAEFER) - PlaySoundLevel(x, y, SND_BUG_WAITING); - else if (element == EL_FLIEGER) - PlaySoundLevel(x, y, SND_SPACESHIP_WAITING); - else if (element == EL_BUTTERFLY) - PlaySoundLevel(x, y, SND_BD_BUTTERFLY_WAITING); - else if (element == EL_FIREFLY) - PlaySoundLevel(x, y, SND_BD_FIREFLY_WAITING); - else if (element == EL_SP_SNIKSNAK) - PlaySoundLevel(x, y, SND_SP_SNIKSNAK_WAITING); - else if (element == EL_SP_ELECTRON) - PlaySoundLevel(x, y, SND_SP_ELECTRON_WAITING); - else if (element == EL_MAMPFER) - PlaySoundLevel(x, y, SND_YAMYAM_WAITING); - else if (element == EL_MAMPFER2) - PlaySoundLevel(x, y, SND_DARK_YAMYAM_WAITING); - else if (element == EL_BALLOON) - PlaySoundLevel(x, y, SND_BALLOON_WAITING); - else if (element == EL_MOLE) - PlaySoundLevel(x, y, SND_MOLE_WAITING); - else if (element == EL_SONDE) - PlaySoundLevel(x, y, SND_SATELLITE_WAITING); - else if (element == EL_PACMAN) - PlaySoundLevel(x, y, SND_PACMAN_WAITING); - else if (element == EL_PINGUIN) - PlaySoundLevel(x, y, SND_PENGUIN_WAITING); - else if (element == EL_SCHWEIN) - PlaySoundLevel(x, y, SND_PIG_WAITING); - else if (element == EL_DRACHE) - PlaySoundLevel(x, y, SND_DRAGON_WAITING); - else if (element == EL_ROBOT) - PlaySoundLevel(x, y, SND_ROBOT_WAITING); - } +void PlaySoundLevelElementAction(int x, int y, int element, int sound_action) +{ + int sound_effect = element_action_sound[element][sound_action]; + + if (sound_effect != -1) + PlaySoundLevel(x, y, sound_effect); } void RaiseScore(int value)