From ee0895b12e544444db37febb1242bcc8a72d6ad8 Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 18 Jan 2003 18:45:51 +0100 Subject: [PATCH] rnd-20030118-6-src --- src/conf_gfx.c | 36 ++--- src/conf_snd.c | 12 +- src/conf_snd.h | 2 +- src/conftime.h | 2 +- src/files.c | 12 +- src/init.c | 316 ++++++++++++++++++++++++------------------- src/libgame/image.c | 1 + src/libgame/misc.c | 259 +++++++++++++++++------------------ src/libgame/misc.h | 28 ++-- src/libgame/sound.c | 6 +- src/libgame/sound.h | 4 +- src/libgame/system.h | 8 +- src/main.c | 2 + src/main.h | 7 +- src/tape.c | 12 +- 15 files changed, 385 insertions(+), 322 deletions(-) diff --git a/src/conf_gfx.c b/src/conf_gfx.c index e4a742d1..53176615 100644 --- a/src/conf_gfx.c +++ b/src/conf_gfx.c @@ -21,24 +21,24 @@ struct ConfigInfo image_config_suffix[] = { - { ".xpos", "0", TYPE_INTEGER }, - { ".ypos", "0", TYPE_INTEGER }, - { ".offset", "32", TYPE_INTEGER }, - { ".vertical", "false", TYPE_BOOLEAN }, - { ".xoffset", GFX_ARG_UNDEFINED, TYPE_INTEGER }, - { ".yoffset", GFX_ARG_UNDEFINED, TYPE_INTEGER }, - { ".frames", GFX_ARG_UNDEFINED, TYPE_INTEGER }, - { ".start_frame", GFX_ARG_UNDEFINED, TYPE_INTEGER }, - { ".delay", "1", TYPE_INTEGER }, - { ".mode_loop", "false", TYPE_BOOLEAN }, - { ".mode_linear", "false", TYPE_BOOLEAN }, - { ".mode_pingpong", "false", TYPE_BOOLEAN }, - { ".mode_pingpong2", "false", TYPE_BOOLEAN }, - { ".mode_random", "false", TYPE_BOOLEAN }, - { ".mode_reverse", "false", TYPE_BOOLEAN }, - { ".global_sync", GFX_ARG_UNDEFINED, TYPE_BOOLEAN }, - - { NULL, NULL, 0 } + { ".xpos", "0", TYPE_INTEGER }, + { ".ypos", "0", TYPE_INTEGER }, + { ".offset", "32", TYPE_INTEGER }, + { ".vertical", "false", TYPE_BOOLEAN }, + { ".xoffset", ARG_UNDEFINED, TYPE_INTEGER }, + { ".yoffset", ARG_UNDEFINED, TYPE_INTEGER }, + { ".frames", ARG_UNDEFINED, TYPE_INTEGER }, + { ".start_frame", ARG_UNDEFINED, TYPE_INTEGER }, + { ".delay", "1", TYPE_INTEGER }, + { ".mode_loop", "false", TYPE_BOOLEAN }, + { ".mode_linear", "false", TYPE_BOOLEAN }, + { ".mode_pingpong", "false", TYPE_BOOLEAN }, + { ".mode_pingpong2", "false", TYPE_BOOLEAN }, + { ".mode_random", "false", TYPE_BOOLEAN }, + { ".mode_reverse", "false", TYPE_BOOLEAN }, + { ".global_sync", ARG_UNDEFINED, TYPE_BOOLEAN }, + + { NULL, NULL, 0 } }; struct ConfigInfo image_config[] = diff --git a/src/conf_snd.c b/src/conf_snd.c index c402cf8a..07ce6b44 100644 --- a/src/conf_snd.c +++ b/src/conf_snd.c @@ -12,13 +12,18 @@ ***********************************************************/ #include "libgame/libgame.h" +#include "main.h" +/* List values that are not defined in the configuration file are set to + reliable default values. If that value is GFX_ARG_UNDEFINED, it will + be dynamically determined, using some of the other list values. */ + struct ConfigInfo sound_config_suffix[] = { - { ".mode_loop", "0", TYPE_BOOLEAN }, + { ".mode_loop", ARG_UNDEFINED, TYPE_BOOLEAN }, - { NULL, NULL, 0 } + { NULL, NULL, 0 } }; struct ConfigInfo sound_config[] = @@ -98,7 +103,8 @@ struct ConfigInfo sound_config[] = { "yamyam.moving", SND_FILE_UNDEFINED }, { "yamyam.waiting", "njam.wav" }, { "yamyam.eating", SND_FILE_UNDEFINED }, - { "robot.stepping", "schlurf.wav" }, + { "robot.moving", "schlurf.wav" }, + { "robot.moving.mode_loop", "false" }, { "robot.waiting", SND_FILE_UNDEFINED }, { "robot_wheel.activating", "deng.wav" }, { "robot_wheel.active", "miep.wav" }, diff --git a/src/conf_snd.h b/src/conf_snd.h index acd95218..60ea119f 100644 --- a/src/conf_snd.h +++ b/src/conf_snd.h @@ -86,7 +86,7 @@ #define SND_YAMYAM_MOVING 65 #define SND_YAMYAM_WAITING 66 #define SND_YAMYAM_EATING 67 -#define SND_ROBOT_STEPPING 68 +#define SND_ROBOT_MOVING 68 #define SND_ROBOT_WAITING 69 #define SND_ROBOT_WHEEL_ACTIVATING 70 #define SND_ROBOT_WHEEL_ACTIVE 71 diff --git a/src/conftime.h b/src/conftime.h index 23667f1d..9b4859ba 100644 --- a/src/conftime.h +++ b/src/conftime.h @@ -1 +1 @@ -#define COMPILE_DATE_STRING "[2003-01-18 14:21]" +#define COMPILE_DATE_STRING "[2003-01-18 18:43]" diff --git a/src/files.c b/src/files.c index 6d858c47..0e263663 100644 --- a/src/files.c +++ b/src/files.c @@ -702,10 +702,10 @@ void SaveLevel(int level_nr) void DumpLevel(struct LevelInfo *level) { - printf_line('-', 79); + printf_line("-", 79); printf("Level xxx (file version %06d, game version %06d)\n", level->file_version, level->game_version); - printf_line('-', 79); + printf_line("-", 79); printf("Level Author: '%s'\n", level->author); printf("Level Title: '%s'\n", level->name); @@ -726,7 +726,7 @@ void DumpLevel(struct LevelInfo *level) printf("Double Speed Movement: %s\n", (level->double_speed ? "yes" : "no")); printf("EM style slippery gems: %s\n", (level->em_slippery_gems ? "yes" : "no")); - printf_line('-', 79); + printf_line("-", 79); } @@ -1120,10 +1120,10 @@ void DumpTape(struct TapeInfo *tape) return; } - printf_line('-', 79); + printf_line("-", 79); printf("Tape of Level %03d (file version %06d, game version %06d)\n", tape->level_nr, tape->file_version, tape->game_version); - printf_line('-', 79); + printf_line("-", 79); for(i=0; ilength; i++) { @@ -1152,7 +1152,7 @@ void DumpTape(struct TapeInfo *tape) printf("(%03d)\n", tape->pos[i].delay); } - printf_line('-', 79); + printf_line("-", 79); } diff --git a/src/init.c b/src/init.c index 203d4093..2b1b7931 100644 --- a/src/init.c +++ b/src/init.c @@ -64,9 +64,11 @@ static void InitLevelInfo(void); static void InitArtworkInfo(void); static void InitLevelArtworkInfo(void); static void InitNetworkServer(void); +static void InitArtworkConfig(void); static void InitImages(void); static void InitMixer(void); static void InitSound(void); +static void InitMusic(void); static void InitGfx(void); static void InitGfxBackground(void); static void InitGadgets(void); @@ -102,9 +104,11 @@ void OpenAll(void) InitSetup(); InitPlayerInfo(); InitArtworkInfo(); /* needed before loading gfx, sound & music */ + InitArtworkConfig(); /* needed before forking sound child process */ + InitMixer(); InitCounter(); - InitMixer(); + InitJoysticks(); InitRND(NEW_RANDOMIZE); @@ -124,6 +128,7 @@ void OpenAll(void) InitImages(); /* needs to know current level directory */ InitSound(); /* needs to know current level directory */ + InitMusic(); /* needs to know current level directory */ InitGfxBackground(); @@ -138,7 +143,7 @@ void OpenAll(void) InitNetworkServer(); } -void InitGlobal() +static void InitGlobal() { global.autoplay_leveldir = NULL; @@ -147,12 +152,12 @@ void InitGlobal() global.fps_slowdown_factor = 1; } -void InitSetup() +static void InitSetup() { LoadSetup(); /* global setup info */ } -void InitPlayerInfo() +static void InitPlayerInfo() { int i; @@ -165,18 +170,24 @@ void InitPlayerInfo() local_player->connected = TRUE; } -void InitLevelInfo() +static void InitLevelInfo() { LoadLevelInfo(); /* global level info */ LoadLevelSetup_LastSeries(); /* last played series info */ LoadLevelSetup_SeriesInfo(); /* last played level info */ } -void InitArtworkInfo() +static void InitArtworkInfo() { LoadArtworkInfo(); } +static void InitArtworkConfig() +{ + InitImageList(image_config, image_config_suffix, NUM_IMAGE_FILES); + InitSoundList(sound_config, sound_config_suffix, NUM_SOUND_FILES); +} + void InitLevelArtworkInfo() { LoadLevelArtworkInfo(); @@ -205,11 +216,15 @@ void InitNetworkServer() #endif } -static void ReinitializeGraphics() +static void InitMixer() { - ReloadCustomImages(); /* load custom image files */ + OpenAudio(); + StartMixer(); +} - InitGraphicInfo(); /* initialize graphic info from config file */ +static void ReinitializeGraphics() +{ + InitGraphicInfo(); /* initialize graphic info from config file */ InitFontInfo(bitmap_font_initial, graphic_info[IMG_FONT_BIG].bitmap, @@ -224,29 +239,32 @@ static void ReinitializeGraphics() InitToons(); } -static void InitImages() +static void ReinitializeSounds() { - InitImageList(image_config, image_config_suffix, NUM_IMAGE_FILES); - - ReinitializeGraphics(); + InitSoundInfo(); /* initialize sounds info from config file */ } -static void InitMixer() +static void ReinitializeMusic() { - OpenAudio(); - - InitSoundList(sound_config, sound_config_suffix, NUM_SOUND_FILES); + /* currently nothing to do */ +} - StartMixer(); +static void InitImages() +{ + ReloadCustomImages(); + ReinitializeGraphics(); } static void InitSound() { - /* load custom sounds and music */ - InitReloadSounds(artwork.snd_current->identifier); - InitReloadMusic(artwork.mus_current->identifier); + InitReloadCustomSounds(artwork.snd_current->identifier); + ReinitializeSounds(); +} - InitSoundInfo(); +static void InitMusic() +{ + InitReloadCustomMusic(artwork.mus_current->identifier); + ReinitializeMusic(); } static void InitTileClipmasks() @@ -569,44 +587,23 @@ void ReloadCustomArtwork() if (strcmp(artwork.gfx_current_identifier, gfx_new_identifier) != 0 || last_override_level_graphics != setup.override_level_graphics) { -#if 0 - printf("CHANGED GFX: '%s' -> '%s'\n", - artwork.gfx_current_identifier, gfx_new_identifier); -#endif - -#if 0 - int i; +#if 1 + printf("RELOADING GRAPHICS '%s' -> '%s' (-> '%s')\n", + artwork.gfx_current_identifier, + artwork.gfx_current->identifier, + gfx_new_identifier); #endif setLevelArtworkDir(artwork.gfx_first); ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); -#if 0 - for (i=0; i '%s' (-> '%s')\n", + artwork.snd_current_identifier, + snd_new_identifier, + artwork.snd_current->identifier); +#endif + /* set artwork path to send it to the sound server process */ setLevelArtworkDir(artwork.snd_first); - InitReloadSounds(snd_new_identifier); + InitReloadCustomSounds(snd_new_identifier); + ReinitializeSounds(); +#if 0 artwork.snd_current_identifier = snd_new_identifier; +#else + artwork.snd_current_identifier = artwork.snd_current->identifier; +#endif + last_override_level_sounds = setup.override_level_sounds; redraw_screen = TRUE; @@ -637,9 +647,14 @@ void ReloadCustomArtwork() /* set artwork path to send it to the sound server process */ setLevelArtworkDir(artwork.mus_first); - InitReloadMusic(mus_new_identifier); + InitReloadCustomMusic(mus_new_identifier); + ReinitializeMusic(); +#if 0 artwork.mus_current_identifier = mus_new_identifier; +#else + artwork.mus_current_identifier = artwork.mus_current->identifier; +#endif last_override_level_music = setup.override_level_music; redraw_screen = TRUE; @@ -772,12 +787,93 @@ void InitElementInfo() } } +static void set_graphic_parameters(int graphic, int action, int *parameter) +{ + Bitmap *src_bitmap = getBitmapFromImageID(graphic); + int num_xtiles = (src_bitmap ? src_bitmap->width : TILEX) / TILEX; + int num_ytiles = (src_bitmap ? src_bitmap->height * 2 / 3 : TILEY) / TILEY; + + graphic_info[graphic].bitmap = src_bitmap; + + graphic_info[graphic].src_x = parameter[GFX_ARG_XPOS] * TILEX; + graphic_info[graphic].src_y = parameter[GFX_ARG_YPOS] * TILEY; + graphic_info[graphic].offset_x = parameter[GFX_ARG_OFFSET]; + graphic_info[graphic].offset_y = 0; + + /* animation frames are ordered vertically instead of horizontally */ + if (parameter[GFX_ARG_VERTICAL]) + { + graphic_info[graphic].offset_x = 0; + graphic_info[graphic].offset_y = parameter[GFX_ARG_OFFSET]; + } + + /* optionally, the x and y offset of frames can be specified directly */ + if (parameter[GFX_ARG_XOFFSET] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].offset_x = parameter[GFX_ARG_XOFFSET]; + if (parameter[GFX_ARG_YOFFSET] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].offset_y = parameter[GFX_ARG_YOFFSET]; + + /* automatically determine correct number of frames, if not defined */ + if (parameter[GFX_ARG_FRAMES] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].anim_frames = parameter[GFX_ARG_FRAMES]; + else if (parameter[GFX_ARG_XPOS] == 0 && !parameter[GFX_ARG_VERTICAL]) + graphic_info[graphic].anim_frames = num_xtiles; + else if (parameter[GFX_ARG_YPOS] == 0 && parameter[GFX_ARG_VERTICAL]) + graphic_info[graphic].anim_frames = num_ytiles; + else + graphic_info[graphic].anim_frames = 1; + + graphic_info[graphic].anim_delay = parameter[GFX_ARG_DELAY]; + if (graphic_info[graphic].anim_delay == 0) /* delay must be at least 1 */ + graphic_info[graphic].anim_delay = 1; + + /* set mode for animation frame order */ + if (parameter[GFX_ARG_MODE_LOOP]) + graphic_info[graphic].anim_mode = ANIM_LOOP; + else if (parameter[GFX_ARG_MODE_LINEAR]) + graphic_info[graphic].anim_mode = ANIM_LINEAR; + else if (parameter[GFX_ARG_MODE_PINGPONG]) + graphic_info[graphic].anim_mode = ANIM_PINGPONG; + else if (parameter[GFX_ARG_MODE_PINGPONG2]) + graphic_info[graphic].anim_mode = ANIM_PINGPONG2; + else if (parameter[GFX_ARG_MODE_RANDOM]) + graphic_info[graphic].anim_mode = ANIM_RANDOM; + else if (graphic_info[graphic].anim_frames > 1) + graphic_info[graphic].anim_mode = ANIM_LOOP; + else + graphic_info[graphic].anim_mode = ANIM_NONE; + + /* set additional flag to play animation frames in reverse order */ + if (parameter[GFX_ARG_MODE_REVERSE]) + graphic_info[graphic].anim_mode |= ANIM_REVERSE; + + /* set first frame of animation after determining animation mode */ + graphic_info[graphic].anim_start_frame = parameter[GFX_ARG_START_FRAME]; + + /* automatically determine correct start frame, if not defined */ + if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE) + graphic_info[graphic].anim_start_frame = 0; + else if (graphic_info[graphic].anim_mode & ANIM_REVERSE) + graphic_info[graphic].anim_start_frame = + graphic_info[graphic].anim_frames - parameter[GFX_ARG_START_FRAME] - 1; + + /* animation synchronized with global frame counter, not move position */ + graphic_info[graphic].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC]; + + /* set global_sync for all animations with undefined "animation action" */ + if (parameter[GFX_ARG_GLOBAL_SYNC] == ARG_UNDEFINED_VALUE) + graphic_info[graphic].anim_global_sync = + (action == ACTION_DEFAULT ? TRUE : FALSE); + + /* "linear" animations are never globally synchronized */ + if (parameter[GFX_ARG_MODE_LINEAR]) + graphic_info[graphic].anim_global_sync = FALSE; +} + static void InitGraphicInfo() { static boolean clipmasks_initialized = FALSE; static int gfx_action[NUM_IMAGE_FILES]; - int src_x, src_y; - int first_frame, last_frame; int i; #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) Pixmap src_pixmap; @@ -825,86 +921,11 @@ static void InitGraphicInfo() for (i=0; iwidth : TILEX) / TILEX; - int num_ytiles = (src_bitmap ? src_bitmap->height * 2 / 3 : TILEY) / TILEY; - int *parameter = image_files[i].parameter; - - graphic_info[i].bitmap = src_bitmap; - - graphic_info[i].src_x = parameter[GFX_ARG_XPOS] * TILEX; - graphic_info[i].src_y = parameter[GFX_ARG_YPOS] * TILEY; - graphic_info[i].offset_x = parameter[GFX_ARG_OFFSET]; - graphic_info[i].offset_y = 0; - - /* animation frames are ordered vertically instead of horizontally */ - if (parameter[GFX_ARG_VERTICAL]) - { - graphic_info[i].offset_x = 0; - graphic_info[i].offset_y = parameter[GFX_ARG_OFFSET]; - } - - /* optionally, the x and y offset of frames can be specified directly */ - if (parameter[GFX_ARG_XOFFSET] != GFX_ARG_UNDEFINED_VALUE) - graphic_info[i].offset_x = parameter[GFX_ARG_XOFFSET]; - if (parameter[GFX_ARG_YOFFSET] != GFX_ARG_UNDEFINED_VALUE) - graphic_info[i].offset_y = parameter[GFX_ARG_YOFFSET]; - - /* automatically determine correct number of frames, if not defined */ - if (parameter[GFX_ARG_FRAMES] != GFX_ARG_UNDEFINED_VALUE) - graphic_info[i].anim_frames = parameter[GFX_ARG_FRAMES]; - else if (parameter[GFX_ARG_XPOS] == 0 && !parameter[GFX_ARG_VERTICAL]) - graphic_info[i].anim_frames = num_xtiles; - else if (parameter[GFX_ARG_YPOS] == 0 && parameter[GFX_ARG_VERTICAL]) - graphic_info[i].anim_frames = num_ytiles; - else - graphic_info[i].anim_frames = 1; - - graphic_info[i].anim_delay = parameter[GFX_ARG_DELAY]; - if (graphic_info[i].anim_delay == 0) /* delay must be at least 1 */ - graphic_info[i].anim_delay = 1; - - /* set mode for animation frame order */ - if (parameter[GFX_ARG_MODE_LOOP]) - graphic_info[i].anim_mode = ANIM_LOOP; - else if (parameter[GFX_ARG_MODE_LINEAR]) - graphic_info[i].anim_mode = ANIM_LINEAR; - else if (parameter[GFX_ARG_MODE_PINGPONG]) - graphic_info[i].anim_mode = ANIM_PINGPONG; - else if (parameter[GFX_ARG_MODE_PINGPONG2]) - graphic_info[i].anim_mode = ANIM_PINGPONG2; - else if (parameter[GFX_ARG_MODE_RANDOM]) - graphic_info[i].anim_mode = ANIM_RANDOM; - else if (graphic_info[i].anim_frames > 1) - graphic_info[i].anim_mode = ANIM_LOOP; - else - graphic_info[i].anim_mode = ANIM_NONE; - - /* set additional flag to play animation frames in reverse order */ - if (parameter[GFX_ARG_MODE_REVERSE]) - graphic_info[i].anim_mode |= ANIM_REVERSE; - - /* set first frame of animation after determining animation mode */ - graphic_info[i].anim_start_frame = parameter[GFX_ARG_START_FRAME]; - - /* automatically determine correct start frame, if not defined */ - if (parameter[GFX_ARG_START_FRAME] == GFX_ARG_UNDEFINED_VALUE) - graphic_info[i].anim_start_frame = 0; - else if (graphic_info[i].anim_mode & ANIM_REVERSE) - graphic_info[i].anim_start_frame = - graphic_info[i].anim_frames - parameter[GFX_ARG_START_FRAME] - 1; - - /* animation synchronized with global frame counter, not move position */ - graphic_info[i].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC]; - - /* set global_sync for all animations with undefined "animation action" */ - if (parameter[GFX_ARG_GLOBAL_SYNC] == GFX_ARG_UNDEFINED_VALUE) - graphic_info[i].anim_global_sync = - (gfx_action[i] == ACTION_DEFAULT ? TRUE : FALSE); + Bitmap *src_bitmap; + int src_x, src_y; + int first_frame, last_frame; - /* "linear" animations are never globally synchronized */ - if (parameter[GFX_ARG_MODE_LINEAR]) - graphic_info[i].anim_global_sync = FALSE; + set_graphic_parameters(i, gfx_action[i], image_files[i].parameter); /* now check if no animation frames are outside of the loaded image */ @@ -917,15 +938,22 @@ static void InitGraphicInfo() src_x + TILEX > src_bitmap->width || src_y + TILEY > src_bitmap->height) { - Error(ERR_RETURN, "custom artwork configuration error:"); + Error(ERR_RETURN_LINE, "-"); + Error(ERR_RETURN, "warning: error found in config file:"); Error(ERR_RETURN, "- config file: '%s'", getImageConfigFilename()); Error(ERR_RETURN, "- config token: '%s'", getTokenFromImageID(i)); Error(ERR_RETURN, "- image file: '%s'", src_bitmap->source_filename); - Error(ERR_EXIT, "error: first animation frame out of bounds (%d,%d)", + Error(ERR_RETURN, + "error: first animation frame out of bounds (%d, %d)", src_x, src_y); + Error(ERR_RETURN, "custom graphic rejected for this element/action"); + Error(ERR_RETURN_LINE, "-"); + + set_graphic_parameters(i, gfx_action[i], + image_files[i].default_parameter); } last_frame = graphic_info[i].anim_frames - 1; @@ -934,15 +962,22 @@ static void InitGraphicInfo() src_x + TILEX > src_bitmap->width || src_y + TILEY > src_bitmap->height) { - Error(ERR_RETURN, "custom artwork configuration error:"); + Error(ERR_RETURN_LINE, "-"); + Error(ERR_RETURN, "warning: error found in config file:"); Error(ERR_RETURN, "- config file: '%s'", getImageConfigFilename()); Error(ERR_RETURN, "- config token: '%s'", getTokenFromImageID(i)); Error(ERR_RETURN, "- image file: '%s'", src_bitmap->source_filename); - Error(ERR_EXIT, "error: last animation frame (%d) out of bounds (%d,%d)", + Error(ERR_RETURN, + "error: last animation frame (%d) out of bounds (%d, %d)", last_frame, src_x, src_y); + Error(ERR_RETURN, "custom graphic rejected for this element/action"); + Error(ERR_RETURN_LINE, "-"); + + set_graphic_parameters(i, gfx_action[i], + image_files[i].default_parameter); } #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) @@ -980,6 +1015,13 @@ static void InitGraphicInfo() clipmasks_initialized = TRUE; } +static void set_sound_parameters(int sound, int *parameter) +{ + /* explicit loop mode setting in configuration overrides default value */ + if (parameter[SND_ARG_MODE_LOOP] != ARG_UNDEFINED_VALUE) + sound_info[sound].loop = parameter[SND_ARG_MODE_LOOP]; +} + static void InitSoundInfo() { int sound_effect_properties[NUM_SOUND_FILES]; @@ -1035,6 +1077,8 @@ static void InitSoundInfo() } } } + + set_sound_parameters(i, sound_files[i].parameter); } #if 0 diff --git a/src/libgame/image.c b/src/libgame/image.c index ce66e328..c4d30808 100644 --- a/src/libgame/image.c +++ b/src/libgame/image.c @@ -756,6 +756,7 @@ void ReloadCustomImages() printf("DEBUG: reloading images '%s' ...\n", artwork.gfx_current_identifier); #endif + LoadArtworkConfig(image_info); ReloadCustomArtworkList(image_info); } diff --git a/src/libgame/misc.c b/src/libgame/misc.c index d0bc9fa9..abea6277 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -32,6 +32,60 @@ #include "text.h" +/* ------------------------------------------------------------------------- */ +/* some generic helper functions */ +/* ------------------------------------------------------------------------- */ + +void fprintf_line(FILE *stream, char *line_string, int line_length) +{ + int i; + + for (i=0; i 20) + size = 20; + + if (size) + { + sprintf(s, " %09d", number); + return &s[strlen(s) - size]; + } + else + { + sprintf(s, "%d", number); + return s; + } +} + + +/* ------------------------------------------------------------------------- */ +/* counter functions */ +/* ------------------------------------------------------------------------- */ + #if defined(PLATFORM_MSDOS) volatile unsigned long counter = 0; @@ -202,35 +256,10 @@ void WaitUntilDelayReached(unsigned long *counter_var, unsigned long delay) *counter_var = actual_counter; } -/* int2str() returns a number converted to a string; - the used memory is static, but will be overwritten by later calls, - so if you want to save the result, copy it to a private string buffer; - there can be 10 local calls of int2str() without buffering the result -- - the 11th call will then destroy the result from the first call and so on. -*/ - -char *int2str(int number, int size) -{ - static char shift_array[10][40]; - static int shift_counter = 0; - char *s = shift_array[shift_counter]; - shift_counter = (shift_counter + 1) % 10; - - if (size > 20) - size = 20; - - if (size) - { - sprintf(s, " %09d", number); - return &s[strlen(s) - size]; - } - else - { - sprintf(s, "%d", number); - return s; - } -} +/* ------------------------------------------------------------------------- */ +/* random generator functions */ +/* ------------------------------------------------------------------------- */ unsigned int SimpleRND(unsigned int max) { @@ -302,6 +331,11 @@ unsigned int InitRND(long seed) #endif } + +/* ------------------------------------------------------------------------- */ +/* system info functions */ +/* ------------------------------------------------------------------------- */ + char *getLoginName() { #if defined(PLATFORM_WIN32) @@ -384,6 +418,11 @@ char *getHomeDir() #endif } + +/* ------------------------------------------------------------------------- */ +/* various string functions */ +/* ------------------------------------------------------------------------- */ + char *getPath2(char *path1, char *path2) { char *complete_path = checked_malloc(strlen(path1) + 1 + @@ -436,6 +475,11 @@ char *getStringToLower(char *s) return s_copy; } + +/* ------------------------------------------------------------------------- */ +/* command line option handling functions */ +/* ------------------------------------------------------------------------- */ + static void printUsage() { printf("\n" @@ -631,6 +675,11 @@ void GetOptions(char *argv[]) } } + +/* ------------------------------------------------------------------------- */ +/* error handling functions */ +/* ------------------------------------------------------------------------- */ + /* used by SetError() and GetError() to store internal error messages */ static char internal_error[1024]; /* this is bad */ @@ -650,6 +699,7 @@ char *GetError() void Error(int mode, char *format, ...) { + static boolean last_line_was_separator = FALSE; char *process_name = ""; FILE *error = stderr; char *newline = "\n"; @@ -658,6 +708,18 @@ void Error(int mode, char *format, ...) if (mode & ERR_WARN && !options.verbose) return; + if (mode == ERR_RETURN_LINE) + { + if (!last_line_was_separator) + fprintf_line(error, format, 79); + + last_line_was_separator = TRUE; + + return; + } + + last_line_was_separator = FALSE; + #if defined(PLATFORM_MSDOS) newline = "\r\n"; @@ -711,6 +773,11 @@ void Error(int mode, char *format, ...) } } + +/* ------------------------------------------------------------------------- */ +/* memory allocation functions */ +/* ------------------------------------------------------------------------- */ + void *checked_malloc(unsigned long size) { void *ptr; @@ -745,6 +812,11 @@ void *checked_realloc(void *ptr, unsigned long size) return ptr; } + +/* ------------------------------------------------------------------------- */ +/* various helper functions */ +/* ------------------------------------------------------------------------- */ + inline void swap_numbers(int *i1, int *i2) { int help = *i1; @@ -1292,9 +1364,9 @@ boolean get_boolean_from_string(char *s) } -/* ========================================================================= */ +/* ------------------------------------------------------------------------- */ /* functions for generic lists */ -/* ========================================================================= */ +/* ------------------------------------------------------------------------- */ ListNode *newListNode() { @@ -1372,9 +1444,9 @@ void dumpList(ListNode *node_first) } -/* ========================================================================= */ +/* ------------------------------------------------------------------------- */ /* functions for checking filenames */ -/* ========================================================================= */ +/* ------------------------------------------------------------------------- */ boolean FileIsGraphic(char *filename) { @@ -1423,13 +1495,14 @@ boolean FileIsArtworkType(char *basename, int type) return FALSE; } -/* ========================================================================= */ +/* ------------------------------------------------------------------------- */ /* functions for loading artwork configuration information */ -/* ========================================================================= */ +/* ------------------------------------------------------------------------- */ static int get_parameter_value(int type, char *value) { - return (type == TYPE_INTEGER ? get_integer_from_string(value) : + return (strcmp(value, ARG_UNDEFINED) == 0 ? ARG_UNDEFINED_VALUE : + type == TYPE_INTEGER ? get_integer_from_string(value) : type == TYPE_BOOLEAN ? get_boolean_from_string(value) : -1); } @@ -1533,74 +1606,7 @@ struct FileInfo *getFileListFromConfigList(struct ConfigInfo *config_list, return file_list; } -#if 0 -static void CheckArtworkConfig(struct ArtworkListInfo *artwork_info) -{ - struct FileInfo *file_list = artwork_info->file_list; - struct ConfigInfo *suffix_list = artwork_info->suffix_list; - int num_file_list_entries = artwork_info->num_file_list_entries; - int num_suffix_list_entries = artwork_info->num_suffix_list_entries; - char *filename = getCustomArtworkConfigFilename(artwork_info->type); - struct SetupFileList *setup_file_list; - char *known_token_value = "[KNOWN_TOKEN]"; - int i, j; - - if (!options.verbose) - return; - - if (filename == NULL) - return; - - if ((setup_file_list = loadSetupFileList(filename)) == NULL) - return; - - for (i=0; ivalue, known_token_value) != 0) - { - Error(ERR_RETURN, "custom artwork configuration warning:"); - Error(ERR_RETURN, "- config file: '%s'", filename); - Error(ERR_RETURN, "- config token: '%s'", setup_file_list->token); - Error(ERR_WARN, "token not recognized"); - } - - setup_file_list = setup_file_list->next; - } - - freeSetupFileList(setup_file_list); -} -#endif - -static void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) +void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) { struct FileInfo *file_list = artwork_info->file_list; struct ConfigInfo *suffix_list = artwork_info->suffix_list; @@ -1674,21 +1680,32 @@ static void LoadArtworkConfig(struct ArtworkListInfo *artwork_info) setTokenValue(setup_file_list, "name", known_token_value); setTokenValue(setup_file_list, "sort_priority", known_token_value); - if (options.verbose) + if (options.verbose && !IS_CHILD_PROCESS(audio.mixer_pid)) { + boolean unknown_tokens_found = FALSE; + /* check each token in config file if it is defined in default config */ while (setup_file_list != NULL) { if (strcmp(setup_file_list->value, known_token_value) != 0) { - Error(ERR_RETURN, "custom artwork configuration warning:"); - Error(ERR_RETURN, "- config file: '%s'", filename); - Error(ERR_RETURN, "- config token: '%s'", setup_file_list->token); - Error(ERR_WARN, "token not recognized"); + if (!unknown_tokens_found) + { + Error(ERR_RETURN_LINE, "-"); + Error(ERR_RETURN, "warning: unknown token(s) found in config file:"); + Error(ERR_RETURN, "- config file: '%s'", filename); + + unknown_tokens_found = TRUE; + } + + Error(ERR_RETURN, "- unknown token: '%s'", setup_file_list->token); } setup_file_list = setup_file_list->next; } + + if (unknown_tokens_found) + Error(ERR_RETURN_LINE, "-"); } freeSetupFileList(setup_file_list); @@ -1886,9 +1903,8 @@ void ReloadCustomArtworkList(struct ArtworkListInfo *artwork_info) int i; #if 0 - CheckArtworkConfig(artwork_info); -#endif LoadArtworkConfig(artwork_info); +#endif #if 0 if (draw_init[artwork_info->type].do_it) @@ -1953,10 +1969,10 @@ void FreeCustomArtworkList(struct ArtworkListInfo *artwork_info) } -/* ========================================================================= */ +/* ------------------------------------------------------------------------- */ /* functions only needed for non-Unix (non-command-line) systems */ /* (MS-DOS only; SDL/Windows creates files "stdout.txt" and "stderr.txt") */ -/* ========================================================================= */ +/* ------------------------------------------------------------------------- */ #if defined(PLATFORM_MSDOS) @@ -1987,24 +2003,9 @@ void dumpErrorFile() #endif -/* ========================================================================= */ -/* some generic helper functions */ -/* ========================================================================= */ - -void printf_line(char line_char, int line_length) -{ - int i; - - for (i=0; ifirst_level; - printf_line('=', 79); + printf_line("=", 79); printf("Automatically playing level tapes\n"); - printf_line('-', 79); + printf_line("-", 79); printf("Level series identifier: '%s'\n", autoplay_leveldir->identifier); printf("Level series name: '%s'\n", autoplay_leveldir->name); printf("Level series author: '%s'\n", autoplay_leveldir->author); printf("Number of levels: %d\n", autoplay_leveldir->levels); - printf_line('=', 79); + printf_line("=", 79); printf("\n"); for (i=0; iidentifier, num_levels_solved, num_levels_played, @@ -791,7 +791,7 @@ void AutoPlayTape() printf(" %03d", i); } printf("\n"); - printf_line('=', 79); + printf_line("=", 79); CloseAllAndExit(0); } -- 2.34.1