#define DX_TIME (DX + XX_TIME)
#define DY_TIME (DY + YY_TIME)
-#define IS_LOOP_SOUND(s) ((s) == SND_BD_MAGIC_WALL_RUNNING || \
- (s) == SND_BD_BUTTERFLY_MOVING || \
- (s) == SND_BD_FIREFLY_MOVING || \
- (s) == SND_SP_SNIKSNAK_MOVING || \
- (s) == SND_SP_ELECTRON_MOVING || \
- (s) == SND_DYNAMITE_BURNING || \
- (s) == SND_BUG_MOVING || \
- (s) == SND_SPACESHIP_MOVING || \
- (s) == SND_YAMYAM_MOVING || \
- (s) == SND_YAMYAM_WAITING || \
- (s) == SND_ROBOT_WHEEL_RUNNING || \
- (s) == SND_MAGIC_WALL_RUNNING || \
- (s) == SND_BALLOON_MOVING || \
- (s) == SND_MOLE_MOVING || \
- (s) == SND_TIMEGATE_WHEEL_RUNNING || \
- (s) == SND_CONVEYOR_BELT_RUNNING || \
- (s) == SND_DYNABOMB_BURNING || \
- (s) == SND_PACMAN_MOVING || \
- (s) == SND_PENGUIN_MOVING || \
- (s) == SND_PIG_MOVING || \
- (s) == SND_DRAGON_MOVING || \
- (s) == SND_DRAGON_BREATHING_FIRE)
-
/* values for player movement speed (which is in fact a delay value) */
#define MOVE_DELAY_NORMAL_SPEED 8
#define MOVE_DELAY_HIGH_SPEED 4
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[] =
+{
+ 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
+};
+
+#define IS_LOOP_SOUND(x) (is_loop_sound[x])
+
#ifdef DEBUG
}
}
+ /* initialize sound effect properties */
+ if (!is_loop_sound_initialized)
+ {
+ int i;
+
+ 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;
+
+ is_loop_sound_initialized = TRUE;
+ }
+
game.version = (tape.playing ? tape.game_version : level.game_version);
game.emulation = (emulate_bd ? EMU_BOULDERDASH :
emulate_sb ? EMU_SOKOBAN :
int graphic = el2gfx(element) + (belt_dir == MV_LEFT ? 0 : 7);
DrawGraphicAnimation(x, y, graphic, 8, delay, mode);
+
+ if (!(FrameCounter % 2))
+ PlaySoundLevel(x, y, SND_CONVEYOR_BELT_RUNNING);
}
}
else if (element == EL_SP_TERMINAL_ACTIVE)
DrawGraphicAnimation(x, y, GFX2_SP_TERMINAL_ACTIVE, 7, 4, ANIM_NORMAL);
else if (IS_BELT(element))
- {
DrawBeltAnimation(x, y, element);
- if (!(FrameCounter % 2))
- PlaySoundLevel(x, y, SND_CONVEYOR_BELT_RUNNING);
- }
else if (element == EL_SWITCHGATE_OPENING)
OpenSwitchgate(x, y);
else if (element == EL_SWITCHGATE_CLOSING)
return TRUE;
}
-void PlaySoundLevel(int x, int y, int sound_nr)
+void PlaySoundLevel(int x, int y, int nr)
{
int sx = SCREENX(x), sy = SCREENY(y);
- int volume, stereo;
+ int volume, stereo_position;
int silence_distance = 8;
+ int type = (IS_LOOP_SOUND(nr) ? SND_CTRL_PLAY_LOOP : SND_CTRL_PLAY_SOUND);
- if ((!setup.sound_simple && !IS_LOOP_SOUND(sound_nr)) ||
- (!setup.sound_loops && IS_LOOP_SOUND(sound_nr)))
+ if ((!setup.sound_simple && !IS_LOOP_SOUND(nr)) ||
+ (!setup.sound_loops && IS_LOOP_SOUND(nr)))
return;
if (!IN_LEV_FIELD(x, y) ||
- sx < -silence_distance || sx >= SCR_FIELDX+silence_distance ||
- sy < -silence_distance || sy >= SCR_FIELDY+silence_distance)
+ sx < -silence_distance || sx >= SCR_FIELDX + silence_distance ||
+ sy < -silence_distance || sy >= SCR_FIELDY + silence_distance)
return;
volume = PSND_MAX_VOLUME;
#if !defined(PLATFORM_MSDOS)
- stereo = (sx - SCR_FIELDX/2) * 12;
+ stereo_position = (sx - SCR_FIELDX / 2) * 12;
#else
- stereo = PSND_MIDDLE + (2 * sx - (SCR_FIELDX - 1)) * 5;
- if (stereo > PSND_MAX_RIGHT)
- stereo = PSND_MAX_RIGHT;
- if (stereo < PSND_MAX_LEFT)
- stereo = PSND_MAX_LEFT;
+ stereo_position = PSND_MIDDLE + (2 * sx - (SCR_FIELDX - 1)) * 5;
+ if (stereo_position > PSND_MAX_RIGHT)
+ stereo_position = PSND_MAX_RIGHT;
+ if (stereo_position < PSND_MAX_LEFT)
+ stereo_position = PSND_MAX_LEFT;
#endif
if (!IN_SCR_FIELD(sx, sy))
volume -= volume * (dx > dy ? dx : dy) / silence_distance;
}
- PlaySoundExt(sound_nr, volume, stereo, SND_CTRL_PLAY_SOUND);
+ PlaySoundExt(nr, volume, stereo_position, type);
}
void RaiseScore(int value)