X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=05e65026508d942835b1e28bd9c464b7fa2d2e8c;hb=1ae6433828b1881d7810082472c72dfb3372a061;hp=855e331ab1f5d54b359e3d10b9869dd70048397d;hpb=942ec4881e3b21c130df9ae105d06c2c633fa192;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 855e331a..05e65026 100644 --- a/src/game.c +++ b/src/game.c @@ -1075,6 +1075,8 @@ void InitGame() player->anim_delay_counter = 0; player->post_delay_counter = 0; + player->action_waiting = ACTION_DEFAULT; + player->last_action_waiting = ACTION_DEFAULT; player->special_action_bored = ACTION_DEFAULT; player->special_action_sleeping = ACTION_DEFAULT; @@ -4878,6 +4880,7 @@ void ContinueMoving(int x, int y) CheckElementSideChange(newx, newy, Feld[newx][newy], direction, CE_COLLISION_ACTIVE, -1); +#if 0 if (IN_LEV_FIELD(nextx, nexty)) { static int opposite_directions[] = @@ -4945,6 +4948,7 @@ void ContinueMoving(int x, int y) } } } +#endif } TestIfPlayerTouchesCustomElement(newx, newy); @@ -6172,17 +6176,49 @@ static boolean CheckElementChange(int x, int y, int element, int trigger_event) return CheckElementSideChange(x, y, element, CH_SIDE_ANY, trigger_event, -1); } -static void SetPlayerWaiting(struct PlayerInfo *player, boolean is_waiting) +static void PlayPlayerSound(struct PlayerInfo *player) { int jx = player->jx, jy = player->jy; int element = player->element_nr; - boolean was_waiting = player->is_waiting; + int last_action = player->last_action_waiting; + int action = player->action_waiting; - if (is_waiting) + if (player->is_waiting) { - int action; + if (action != last_action) + PlayLevelSoundElementAction(jx, jy, element, action); + else + PlayLevelSoundElementActionIfLoop(jx, jy, element, action); + } + else + { + if (action != last_action) + StopSound(element_info[element].sound[last_action]); - if (!was_waiting) /* not waiting -> waiting */ + if (last_action == ACTION_SLEEPING) + PlayLevelSoundElementAction(jx, jy, element, ACTION_AWAKENING); + } +} + +static void PlayAllPlayersSound() +{ + int i; + + for (i = 0; i < MAX_PLAYERS; i++) + if (stored_player[i].active) + PlayPlayerSound(&stored_player[i]); +} + +static void SetPlayerWaiting(struct PlayerInfo *player, boolean is_waiting) +{ + boolean last_waiting = player->is_waiting; + int move_dir = player->MovDir; + + player->last_action_waiting = player->action_waiting; + + if (is_waiting) + { + if (!last_waiting) /* not waiting -> waiting */ { player->is_waiting = TRUE; @@ -6198,30 +6234,93 @@ static void SetPlayerWaiting(struct PlayerInfo *player, boolean is_waiting) InitPlayerGfxAnimation(player, ACTION_WAITING, player->MovDir); } - if (game.player_sleeping_delay_fixed != -1 && - game.player_sleeping_delay_random != -1 && + if (game.player_sleeping_delay_fixed + + game.player_sleeping_delay_random > 0 && player->anim_delay_counter == 0 && player->post_delay_counter == 0 && FrameCounter >= player->frame_counter_sleeping) player->is_sleeping = TRUE; - else if (game.player_boring_delay_fixed != -1 && - game.player_boring_delay_random != -1 && + else if (game.player_boring_delay_fixed + + game.player_boring_delay_random > 0 && FrameCounter >= player->frame_counter_bored) player->is_bored = TRUE; - action = (player->is_sleeping ? ACTION_SLEEPING : - player->is_bored ? ACTION_BORING : ACTION_WAITING); + player->action_waiting = (player->is_sleeping ? ACTION_SLEEPING : + player->is_bored ? ACTION_BORING : + ACTION_WAITING); - if (!was_waiting) - PlayLevelSoundElementAction(jx, jy, element, action); - else - PlayLevelSoundElementActionIfLoop(jx, jy, element, action); - } - else if (was_waiting) /* waiting -> not waiting */ - { if (player->is_sleeping) - PlayLevelSoundElementAction(jx, jy, element, ACTION_AWAKENING); + { + if (player->num_special_action_sleeping > 0) + { + if (player->anim_delay_counter == 0 && player->post_delay_counter == 0) + { + int last_special_action = player->special_action_sleeping; + int num_special_action = player->num_special_action_sleeping; + int special_action = + (last_special_action == ACTION_DEFAULT ? ACTION_SLEEPING_1 : + last_special_action == ACTION_SLEEPING ? ACTION_SLEEPING : + last_special_action < ACTION_SLEEPING_1 + num_special_action - 1 ? + last_special_action + 1 : ACTION_SLEEPING); + int special_graphic = + el_act_dir2img(player->element_nr, special_action, move_dir); + + player->anim_delay_counter = + graphic_info[special_graphic].anim_delay_fixed + + SimpleRND(graphic_info[special_graphic].anim_delay_random); + player->post_delay_counter = + graphic_info[special_graphic].post_delay_fixed + + SimpleRND(graphic_info[special_graphic].post_delay_random); + + player->special_action_sleeping = special_action; + } + if (player->anim_delay_counter > 0) + { + player->action_waiting = player->special_action_sleeping; + player->anim_delay_counter--; + } + else if (player->post_delay_counter > 0) + { + player->post_delay_counter--; + } + } + } + else if (player->is_bored) + { + if (player->num_special_action_bored > 0) + { + if (player->anim_delay_counter == 0 && player->post_delay_counter == 0) + { + int special_action = + ACTION_BORING_1 + SimpleRND(player->num_special_action_bored); + int special_graphic = + el_act_dir2img(player->element_nr, special_action, move_dir); + + player->anim_delay_counter = + graphic_info[special_graphic].anim_delay_fixed + + SimpleRND(graphic_info[special_graphic].anim_delay_random); + player->post_delay_counter = + graphic_info[special_graphic].post_delay_fixed + + SimpleRND(graphic_info[special_graphic].post_delay_random); + + player->special_action_bored = special_action; + } + + if (player->anim_delay_counter > 0) + { + player->action_waiting = player->special_action_bored; + player->anim_delay_counter--; + } + else if (player->post_delay_counter > 0) + { + player->post_delay_counter--; + } + } + } + } + else if (last_waiting) /* waiting -> not waiting */ + { player->is_waiting = FALSE; player->is_bored = FALSE; player->is_sleeping = FALSE; @@ -6232,6 +6331,8 @@ static void SetPlayerWaiting(struct PlayerInfo *player, boolean is_waiting) player->anim_delay_counter = 0; player->post_delay_counter = 0; + player->action_waiting = ACTION_DEFAULT; + player->special_action_bored = ACTION_DEFAULT; player->special_action_sleeping = ACTION_DEFAULT; } @@ -6942,6 +7043,7 @@ void GameActions() } DrawAllPlayers(); + PlayAllPlayersSound(); if (options.debug) /* calculate frames per second */ { @@ -8816,13 +8918,10 @@ void InitPlayLevelSound() { int num_sounds = getSoundListSize(); - if (loop_sound_frame != NULL) - free(loop_sound_frame); - - if (loop_sound_volume != NULL) - free(loop_sound_volume); + checked_free(loop_sound_frame); + checked_free(loop_sound_volume); - loop_sound_frame = checked_calloc(num_sounds * sizeof(int)); + loop_sound_frame = checked_calloc(num_sounds * sizeof(int)); loop_sound_volume = checked_calloc(num_sounds * sizeof(int)); } @@ -8915,7 +9014,7 @@ static void StopLevelSoundActionIfLoop(int x, int y, int action) int sound_effect = element_info[Feld[x][y]].sound[action]; if (sound_effect != SND_UNDEFINED && IS_LOOP_SOUND(sound_effect)) - StopSoundExt(sound_effect, SND_CTRL_STOP_SOUND); + StopSound(sound_effect); } static void PlayLevelMusic()