static void CheckGravityMovement(struct PlayerInfo *);
static void KillHeroUnlessProtected(int, int);
+void PlaySoundLevel(int, int, int);
+void PlaySoundLevelAction(int, int, int);
+
static void MapGameButtons();
static void HandleGameButtons(struct GadgetInfo *);
static struct GadgetInfo *game_gadget[NUM_GAME_BUTTONS];
-static boolean is_loop_sound[NUM_SOUND_EFFECTS];
-static boolean is_loop_sound_initialized = FALSE;
-static int loop_sounds[] =
+static char *loop_sound_actions[] =
{
- SND_BD_MAGIC_WALL_RUNNING,
- SND_BD_BUTTERFLY_MOVING,
- SND_BD_FIREFLY_MOVING,
- SND_SP_SNIKSNAK_MOVING,
- SND_SP_ELECTRON_MOVING,
- SND_DYNAMITE_BURNING,
- SND_BUG_MOVING,
- SND_SPACESHIP_MOVING,
- SND_YAMYAM_MOVING,
- SND_YAMYAM_WAITING,
- SND_ROBOT_WHEEL_RUNNING,
- SND_MAGIC_WALL_RUNNING,
- SND_BALLOON_MOVING,
- SND_MOLE_MOVING,
- SND_TIMEGATE_WHEEL_RUNNING,
- SND_CONVEYOR_BELT_RUNNING,
- SND_DYNABOMB_BURNING,
- SND_PACMAN_MOVING,
- SND_PENGUIN_MOVING,
- SND_PIG_MOVING,
- SND_DRAGON_MOVING,
- SND_DRAGON_BREATHING_FIRE
+ ".waiting",
+ ".moving",
+ ".running",
+ ".burning",
+ ".growing",
+ ".attacking"
};
+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
}
/* initialize sound effect properties */
- if (!is_loop_sound_initialized)
+ if (!sound_info_initialized)
{
- int i;
+ int i, j;
for (i=0; i<NUM_SOUND_EFFECTS; i++)
+ {
is_loop_sound[i] = FALSE;
- for (i=0; i<SIZEOF_ARRAY_INT(loop_sounds); i++)
- is_loop_sound[loop_sounds[i]] = TRUE;
+ for (j=0; j<SIZEOF_ARRAY(loop_sound_actions, char *); j++)
+ {
+ int len_effect_text = strlen(sound_effects[i].text);
+ int len_action_text = strlen(loop_sound_actions[j]);
- is_loop_sound_initialized = TRUE;
+ if (len_effect_text > 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<NUM_SOUND_EFFECTS; i++)
+ {
+ for (j=0; j<NUM_LEVEL_ELEMENTS; j++)
+ {
+ }
+ }
+
+ sound_info_initialized = TRUE;
}
game.version = (tape.playing ? tape.game_version : level.game_version);
MovDelay[x][y]--;
if (MovDelay[x][y])
{
+#if 0
if (!(MovDelay[x][y] % 12))
+#else
+ if (!(MovDelay[x][y] % 6))
+#endif
{
if (Feld[x][y] == EL_DYNAMITE_ACTIVE)
PlaySoundLevel(x, y, SND_DYNAMITE_BURNING);
if (element!=EL_MAMPFER && element!=EL_MAMPFER2 && element!=EL_PACMAN)
{
TurnRound(x, y);
+
if (MovDelay[x][y] && (element == EL_KAEFER ||
element == EL_FLIEGER ||
element == EL_SP_SNIKSNAK ||
}
}
- if (MovDelay[x][y])
+ if (MovDelay[x][y]) /* element still has to wait some time */
+ {
+ PlaySoundLevelAction(x, y, SND_WAITING);
+
return;
+ }
}
- 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);
-
/* now make next step */
Moving2Blocked(x, y, &newx, &newy); /* get next screen position */
else
DrawLevelField(x, y);
- PlaySoundLevel(x, y, SND_DRAGON_BREATHING_FIRE);
+ PlaySoundLevel(x, y, SND_DRAGON_ATTACKING);
MovDelay[x][y] = 50;
Feld[newx][newy] = EL_BURNING;
if (DONT_TOUCH(element))
TestIfBadThingTouchesHero(x, y);
+ PlaySoundLevelAction(x, y, SND_WAITING);
+
return;
}
- if (element == EL_ROBOT && IN_SCR_FIELD(x, y))
- PlaySoundLevel(x, y, SND_ROBOT_MOVING);
-
InitMovingField(x, y, MovDir[x][y]);
+
+ PlaySoundLevelAction(x, y, SND_MOVING);
}
if (MovDir[x][y])
MovPos[x][y] += step;
- if (ABS(MovPos[x][y])>=TILEX) /* object reached its destination */
+ if (ABS(MovPos[x][y]) >= TILEX) /* object reached its destination */
{
Feld[x][y] = EL_LEERRAUM;
Feld[newx][newy] = element;
(Feld[new_jx][new_jy] == EL_SP_BASE ||
Feld[new_jx][new_jy] == EL_ERDREICH));
- if (field_under_player_is_free && !player_is_moving_to_valid_field)
+ if (field_under_player_is_free &&
+ !player_is_moving_to_valid_field &&
+ !IS_TUBE(Feld[jx][jy]))
player->programmed_action = MV_DOWN;
}
}
dy == +1 ? MV_DOWN : MV_NO_MOVING);
int element;
- if (!player->MovPos)
+ if (player->MovPos == 0)
player->Pushing = FALSE;
if (mode == DF_NO_PUSH)
element == EL_BALLOON_SEND_UP ? MV_UP :
element == EL_BALLOON_SEND_DOWN ? MV_DOWN :
MV_NO_MOVING);
+ PlaySoundLevel(x, y, SND_BALLOON_SWITCH_ACTIVATING);
return MF_ACTION;
break;
PlaySoundStereo(SND_SP_EXIT_ENTERING, SOUND_MAX_RIGHT);
break;
+ /* the following elements cannot be pushed by "snapping" */
case EL_FELSBROCKEN:
- case EL_BD_ROCK:
case EL_BOMBE:
case EL_DX_SUPABOMB:
case EL_KOKOSNUSS:
case EL_SP_ZONK:
case EL_SP_DISK_ORANGE:
case EL_SPRING:
- if (dy || mode == DF_SNAP)
+ if (mode == DF_SNAP)
+ return MF_NO_ACTION;
+ /* no "break" -- fall through to next case */
+ /* the following elements can be pushed by "snapping" */
+ case EL_BD_ROCK:
+ if (dy)
return MF_NO_ACTION;
player->Pushing = TRUE;
return MF_NO_ACTION;
#endif
- RemoveField(x, y);
- Feld[x+dx][y+dy] = element;
+ if (mode == DF_SNAP)
+ {
+ InitMovingField(x, y, move_direction);
+ ContinueMoving(x, y);
+ }
+ else
+ {
+ RemoveField(x, y);
+ Feld[x+dx][y+dy] = element;
+ }
if (element == EL_SPRING)
{
if (!(tube_enter_directions[i][1] & move_direction))
return MF_NO_ACTION; /* tube has no opening in this direction */
+
+ PlaySoundLevel(x, y, SND_TUBE_PASSING);
}
break;
if (!dx && !dy)
{
+ if (player->MovPos == 0)
+ player->Pushing = FALSE;
+
player->snapped = FALSE;
return FALSE;
}
void PlaySoundLevel(int x, int y, int nr)
{
+ static int loop_sound_frame[NUM_SOUND_EFFECTS];
+ static int loop_sound_volume[NUM_SOUND_EFFECTS];
int sx = SCREENX(x), sy = SCREENY(y);
int volume, stereo_position;
int max_distance = 8;
(sx + max_distance) * SOUND_MAX_LEFT2RIGHT /
(SCR_FIELDX + 2 * max_distance));
+ if (IS_LOOP_SOUND(nr))
+ {
+ /* This assures that quieter loop sounds do not overwrite louder ones,
+ while restarting sound volume comparison with each new game frame. */
+
+ if (loop_sound_volume[nr] > volume && loop_sound_frame[nr] == FrameCounter)
+ return;
+
+ loop_sound_volume[nr] = volume;
+ loop_sound_frame[nr] = FrameCounter;
+ }
+
PlaySoundExt(nr, volume, stereo_position, type);
}
+void PlaySoundLevelAction(int x, int y, int action)
+{
+ int element = Feld[x][y];
+
+ 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 RaiseScore(int value)
{
local_player->score += value;