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;
return CheckElementSideChange(x, y, element, CH_SIDE_ANY, trigger_event, -1);
}
-int GetPlayerAction(struct PlayerInfo *player, int move_dir)
+static void PlayPlayerSound(struct PlayerInfo *player)
{
int jx = player->jx, jy = player->jy;
int element = player->element_nr;
- int action = (player->is_pushing ? ACTION_PUSHING :
- player->is_digging ? ACTION_DIGGING :
- player->is_collecting ? ACTION_COLLECTING :
- player->is_moving ? ACTION_MOVING :
- player->is_snapping ? ACTION_SNAPPING :
- player->is_sleeping ? ACTION_SLEEPING :
- player->is_bored ? ACTION_BORING :
- player->is_waiting ? ACTION_WAITING : ACTION_DEFAULT);
+ int last_action = player->last_action_waiting;
+ int action = player->action_waiting;
- if (player->is_sleeping)
+ if (player->is_waiting)
{
- if (player->num_special_action_sleeping > 0)
- {
- int last_action = player->action_waiting;
-
- 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)
- {
- action = player->special_action_sleeping;
- player->anim_delay_counter--;
- }
- else if (player->post_delay_counter > 0)
- {
- player->post_delay_counter--;
- }
-
- player->action_waiting = action;
-
- if (last_action != action)
- PlayLevelSoundElementAction(jx, jy, element, action);
- else
- PlayLevelSoundElementActionIfLoop(jx, jy, element, action);
- }
+ if (action != last_action)
+ PlayLevelSoundElementAction(jx, jy, element, action);
+ else
+ PlayLevelSoundElementActionIfLoop(jx, jy, element, action);
}
- else if (player->is_bored)
+ else
{
- if (player->num_special_action_bored > 0)
- {
- int last_action = player->action_waiting;
-
- 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 (action != last_action)
+ StopSound(element_info[element].sound[last_action]);
- if (player->anim_delay_counter > 0)
- {
- action = player->special_action_bored;
- player->anim_delay_counter--;
- }
- else if (player->post_delay_counter > 0)
- {
- player->post_delay_counter--;
- }
-
- player->action_waiting = action;
-
- if (last_action != action)
- PlayLevelSoundElementAction(jx, jy, element, action);
- else
- PlayLevelSoundElementActionIfLoop(jx, jy, element, action);
- }
+ if (last_action == ACTION_SLEEPING)
+ PlayLevelSoundElementAction(jx, jy, element, ACTION_AWAKENING);
}
+}
+
+static void PlayAllPlayersSound()
+{
+ int i;
- return action;
+ 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)
{
- int jx = player->jx, jy = player->jy;
- int element = player->element_nr;
- boolean was_waiting = player->is_waiting;
+ boolean last_waiting = player->is_waiting;
+ int move_dir = player->MovDir;
+
+ player->last_action_waiting = player->action_waiting;
if (is_waiting)
{
- int last_action, action;
- boolean play_sound;
-
- last_action = (player->is_sleeping ? ACTION_SLEEPING :
- player->is_bored ? ACTION_BORING : ACTION_WAITING);
-
- if (!was_waiting) /* not waiting -> waiting */
+ if (!last_waiting) /* not waiting -> waiting */
{
player->is_waiting = TRUE;
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);
- play_sound =
- ((player->is_sleeping && player->num_special_action_sleeping == 0) ||
- (player->is_bored && player->num_special_action_bored == 0) ||
- (player->is_waiting && !player->is_sleeping && !player->is_bored));
+ if (player->is_sleeping)
+ {
+ 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 (play_sound && action != last_action)
- PlayLevelSoundElementAction(jx, jy, element, action);
- else
- PlayLevelSoundElementActionIfLoop(jx, jy, element, 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 (was_waiting) /* waiting -> not waiting */
+ else if (last_waiting) /* waiting -> not waiting */
{
- if (player->is_sleeping)
- PlayLevelSoundElementAction(jx, jy, element, ACTION_AWAKENING);
-
player->is_waiting = FALSE;
player->is_bored = FALSE;
player->is_sleeping = FALSE;
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;
}
}
DrawAllPlayers();
+ PlayAllPlayersSound();
if (options.debug) /* calculate frames per second */
{
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()
void DrawHeadline()
{
- int text1_width = getTextWidth(PROGRAM_TITLE_STRING, FONT_TITLE_1);
- int text2_width = getTextWidth(PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2);
- int x1 = SX + (SXSIZE - text1_width) / 2;
- int x2 = SX + (SXSIZE - text2_width) / 2;
-
- DrawText(x1, SY + 8, PROGRAM_TITLE_STRING, FONT_TITLE_1);
- DrawText(x2, SY + 46, PROGRAM_COPYRIGHT_STRING, FONT_TITLE_2);
+ DrawTextSCentered(8, FONT_TITLE_1, PROGRAM_TITLE_STRING);
+ DrawTextSCentered(46, FONT_TITLE_2, PROGRAM_COPYRIGHT_STRING);
}
static void ToggleFullscreenIfNeeded()
{
static LevelDirTree *leveldir_last_valid = NULL;
char *name_text = (!options.network && setup.team_mode ? "Team:" : "Name:");
- int name_width = getTextWidth("Name:", FONT_MENU_1);
- int level_width = getTextWidth("Level:", FONT_MENU_1);
+ int name_width, level_width;
int i;
UnmapAllGadgets();
DrawText(mSX + 32, mSY + 8*32, "Setup", FONT_MENU_1);
DrawText(mSX + 32, mSY + 9*32, "Quit", FONT_MENU_1);
+ /* calculated after (possible) reload of custom artwork */
+ name_width = getTextWidth(name_text, FONT_MENU_1);
+ level_width = getTextWidth("Level:", FONT_MENU_1);
+
DrawText(mSX + 32 + name_width, mSY + 2*32, setup.player_name, FONT_INPUT_1);
DrawText(mSX + level_width + 5 * 32, mSY + 3*32, int2str(level_nr,3),
FONT_VALUE_1);
drawCursorXY(level_width/32 + 4, 1, IMG_MENU_BUTTON_LEFT);
drawCursorXY(level_width/32 + 8, 1, IMG_MENU_BUTTON_RIGHT);
- DrawText(SX + 56, SY + 326, "A Game by Artsoft Entertainment", FONT_TITLE_2);
+ DrawTextSCentered(326, FONT_TITLE_2, "A Game by Artsoft Entertainment");
FadeToFront();
InitAnimation();
int y = 0;
if (button != MB_MENU_INITIALIZE)
- list = list->next;
+ if (list != NULL)
+ list = list->next;
if (list == NULL)
{
"Press any key or button for next page");
}
- if (list->is_sound && sound_info[list->music].loop)
+ if (list != NULL && list->is_sound && sound_info[list->music].loop)
PlaySoundLoop(list->music);
}
if (element == EL_EXPLOSION)
return;
-#if 1
-
- action = GetPlayerAction(player, move_dir);
-
-#else
-
- action = (player->is_pushing ? ACTION_PUSHING :
- player->is_digging ? ACTION_DIGGING :
- player->is_collecting ? ACTION_COLLECTING :
- player->is_moving ? ACTION_MOVING :
- player->is_snapping ? ACTION_SNAPPING :
- player->is_sleeping ? ACTION_SLEEPING :
- player->is_bored ? ACTION_BORING :
- player->is_waiting ? ACTION_WAITING : ACTION_DEFAULT);
-
- if (player->is_bored && player->num_special_action_bored > 0)
- {
- if (player->anim_delay_counter == 0 && player->post_delay_counter == 0)
- {
- int graphic_waiting;
-
- action = ACTION_BORING_1 + SimpleRND(player->num_special_action_bored);
- special_graphic = el_act_dir2img(EL_SP_MURPHY, 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 = action;
- }
-
- if (player->anim_delay_counter > 0)
- {
- action = player->special_action_bored;
- player->anim_delay_counter--;
- }
-
- if (player->post_delay_counter > 0)
- {
- player->post_delay_counter--;
- }
- }
-#endif
-
-#if 0
- printf("::: '%s'\n", element_action_info[action].suffix);
-#endif
+ action = (player->is_pushing ? ACTION_PUSHING :
+ player->is_digging ? ACTION_DIGGING :
+ player->is_collecting ? ACTION_COLLECTING :
+ player->is_moving ? ACTION_MOVING :
+ player->is_snapping ? ACTION_SNAPPING :
+ player->is_waiting ? player->action_waiting : ACTION_DEFAULT);
InitPlayerGfxAnimation(player, action, move_dir);