-#define COMPILE_DATE_STRING "[2003-01-20 20:13]"
+#define COMPILE_DATE_STRING "[2003-01-20 22:54]"
#define IS_LOOP_SOUND(s) (sound_info[s].loop)
-/* -------------------------------------------------------------------------
- definition of elements that automatically change to other elements after
- a specified time, eventually calling a function when changing
- ------------------------------------------------------------------------- */
+/* ------------------------------------------------------------------------- */
+/* definition of elements that automatically change to other elements after */
+/* a specified time, eventually calling a function when changing */
+/* ------------------------------------------------------------------------- */
/* forward declaration for changer functions */
static void InitBuggyBase(int x, int y);
return TRUE;
}
+/* ------------------------------------------------------------------------- */
+/* game sound playing functions */
+/* ------------------------------------------------------------------------- */
+
+static int *loop_sound_frame = NULL;
+static int *loop_sound_volume = NULL;
+
+void InitPlaySoundLevel()
+{
+ int num_sounds = getSoundListSize();
+
+ if (loop_sound_frame != NULL)
+ free(loop_sound_frame);
+
+ if (loop_sound_volume != NULL)
+ free(loop_sound_volume);
+
+ loop_sound_frame = checked_calloc(num_sounds * sizeof(int));
+ loop_sound_volume = checked_calloc(num_sounds * sizeof(int));
+}
+
static void PlaySoundLevel(int x, int y, int nr)
{
- static int loop_sound_frame[NUM_SOUND_FILES];
- static int loop_sound_volume[NUM_SOUND_FILES];
int sx = SCREENX(x), sy = SCREENY(y);
int volume, stereo_position;
int max_distance = 8;
int DigField(struct PlayerInfo *, int, int, int, int, int);
boolean SnapField(struct PlayerInfo *, int, int);
boolean PlaceBomb(struct PlayerInfo *);
+
+void InitPlaySoundLevel();
+
void RaiseScore(int);
void RaiseScoreElement(int);
void RequestQuitGame(boolean);
static void ReinitializeSounds()
{
InitSoundInfo(); /* initialize sounds info from config file */
+
+ InitPlaySoundLevel();
}
static void ReinitializeMusic()
static void InitGraphicInfo()
{
static boolean clipmasks_initialized = FALSE;
+ int num_images = getImageListSize();
int i;
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
Pixmap src_pixmap;
GC copy_clipmask_gc = None;
#endif
- image_files = getCurrentImageList();
+ if (graphic_info != NULL)
+ free(graphic_info);
+
+ graphic_info = checked_calloc(num_images * sizeof(struct GraphicInfo));
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
if (clipmasks_initialized)
{
- for (i=0; i<NUM_IMAGE_FILES; i++)
+ for (i=0; i<num_images; i++)
{
if (graphic_info[i].clip_mask)
XFreePixmap(display, graphic_info[i].clip_mask);
}
#endif
- for (i=0; i<NUM_IMAGE_FILES; i++)
+ for (i=0; i<num_images; i++)
{
+ struct FileInfo *image = getImageListEntry(i);
Bitmap *src_bitmap;
int src_x, src_y;
int first_frame, last_frame;
- set_graphic_parameters(i, image_files[i].parameter);
+ set_graphic_parameters(i, image->parameter);
/* now check if no animation frames are outside of the loaded image */
Error(ERR_RETURN, "custom graphic rejected for this element/action");
Error(ERR_RETURN_LINE, "-");
- set_graphic_parameters(i, image_files[i].default_parameter);
+ set_graphic_parameters(i, image->default_parameter);
}
last_frame = graphic_info[i].anim_frames - 1;
Error(ERR_RETURN, "custom graphic rejected for this element/action");
Error(ERR_RETURN_LINE, "-");
- set_graphic_parameters(i, image_files[i].default_parameter);
+ set_graphic_parameters(i, image->default_parameter);
}
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
static void InitSoundInfo()
{
- int sound_effect_properties[NUM_SOUND_FILES];
+ int *sound_effect_properties;
+ int num_sounds = getSoundListSize();
int i, j;
- sound_files = getCurrentSoundList();
+ if (sound_info != NULL)
+ free(sound_info);
+
+ sound_effect_properties = checked_calloc(num_sounds * sizeof(int));
+ sound_info = checked_calloc(num_sounds * sizeof(struct SoundInfo));
/* initialize sound effect for all elements to "no sound" */
for (i=0; i<MAX_NUM_ELEMENTS; i++)
for (j=0; j<NUM_ACTIONS; j++)
element_info[i].sound[j] = SND_UNDEFINED;
- for (i=0; i<NUM_SOUND_FILES; i++)
+ for (i=0; i<num_sounds; i++)
{
- int len_effect_text = strlen(sound_files[i].token);
+ struct FileInfo *sound = getSoundListEntry(i);
+ int len_effect_text = strlen(sound->token);
+#if 1
sound_effect_properties[i] = ACTION_OTHER;
sound_info[i].loop = FALSE;
+#endif
/* determine all loop sounds and identify certain sound classes */
+#if 1
for (j=0; element_action_info[j].suffix; j++)
{
int len_action_text = strlen(element_action_info[j].suffix);
if (len_action_text < len_effect_text &&
- strcmp(&sound_files[i].token[len_effect_text - len_action_text],
+ strcmp(&sound->token[len_effect_text - len_action_text],
element_action_info[j].suffix) == 0)
{
sound_effect_properties[i] = element_action_info[j].value;
sound_info[i].loop = TRUE;
}
}
+#endif
/* associate elements and some selected sound actions */
+#if 1
for (j=0; j<MAX_NUM_ELEMENTS; j++)
{
if (element_info[j].sound_class_name)
int len_class_text = strlen(element_info[j].sound_class_name);
if (len_class_text + 1 < len_effect_text &&
- strncmp(sound_files[i].token,
+ strncmp(sound->token,
element_info[j].sound_class_name, len_class_text) == 0 &&
- sound_files[i].token[len_class_text] == '.')
+ sound->token[len_class_text] == '.')
{
int sound_action_value = sound_effect_properties[i];
}
}
}
+#endif
- set_sound_parameters(i, sound_files[i].parameter);
+ set_sound_parameters(i, sound->parameter);
}
+ free(sound_effect_properties);
+
#if 0
/* TEST ONLY */
{
free(image);
}
-struct FileInfo *getCurrentImageList()
+int getImageListSize()
{
- return image_info->file_list;
+ return (image_info->num_file_list_entries +
+ image_info->num_dynamic_file_list_entries);
}
-Bitmap *getBitmapFromImageID(int graphic)
+struct FileInfo *getImageListEntry(int pos)
{
- ImageInfo **img_info = (ImageInfo **)image_info->artwork_list;
+ int num_list_entries = image_info->num_file_list_entries;
+ int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
- return (img_info[graphic] != NULL ? img_info[graphic]->bitmap : NULL);
+ return (pos < num_list_entries ? &image_info->file_list[list_pos] :
+ &image_info->dynamic_file_list[list_pos]);
+}
+
+Bitmap *getBitmapFromImageID(int pos)
+{
+ int num_list_entries = image_info->num_file_list_entries;
+ int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
+ ImageInfo **img_info =
+ (ImageInfo **)(pos < num_list_entries ? image_info->artwork_list :
+ image_info->dynamic_artwork_list);
+
+ return (img_info[list_pos] != NULL ? img_info[list_pos]->bitmap : NULL);
}
char *getTokenFromImageID(int graphic)
#endif /* TARGET_X11 */
-
-struct FileInfo *getCurrentImageList();
+int getImageListSize();
+struct FileInfo *getImageListEntry(int);
Bitmap *getBitmapFromImageID(int);
char *getTokenFromImageID(int);
char *getImageConfigFilename();
return snd_info;
}
-struct FileInfo *getCurrentSoundList()
+int getSoundListSize()
{
- return sound_info->file_list;
+ return (sound_info->num_file_list_entries +
+ sound_info->num_dynamic_file_list_entries);
+}
+
+struct FileInfo *getSoundListEntry(int pos)
+{
+ int num_list_entries = sound_info->num_file_list_entries;
+ int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
+
+ return (pos < num_list_entries ? &sound_info->file_list[list_pos] :
+ &sound_info->dynamic_file_list[list_pos]);
}
void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries,
void StopSound(int);
void StopSounds(void);
void StopSoundExt(int, int);
-struct FileInfo *getCurrentSoundList();
+
+int getSoundListSize();
+struct FileInfo *getSoundListEntry(int);
void InitSoundList(struct ConfigInfo *, int, struct ConfigInfo *,
char **, char **, char **);
void InitReloadCustomSounds(char *);
struct SetupInfo setup;
struct GameInfo game;
struct GlobalInfo global;
-struct FileInfo *image_files;
-struct FileInfo *sound_files;
-struct GraphicInfo graphic_info[NUM_IMAGE_FILES];
-struct SoundInfo sound_info[NUM_SOUND_FILES];
+struct GraphicInfo *graphic_info = NULL;
+struct SoundInfo *sound_info = NULL;
/* ------------------------------------------------------------------------- */
extern struct ElementInfo element_info[];
extern struct ElementActionInfo element_action_info[];
extern struct ElementDirectionInfo element_direction_info[];
-extern struct GraphicInfo graphic_info[];
-extern struct SoundInfo sound_info[];
+extern struct GraphicInfo *graphic_info;
+extern struct SoundInfo *sound_info;
extern struct ConfigInfo image_config[], sound_config[];
extern struct ConfigInfo image_config_suffix[], sound_config_suffix[];
-extern struct FileInfo *image_files, *sound_files;
#endif /* MAIN_H */