rnd-20030118-6-src
authorHolger Schemel <info@artsoft.org>
Sat, 18 Jan 2003 17:45:51 +0000 (18:45 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:39:50 +0000 (10:39 +0200)
15 files changed:
src/conf_gfx.c
src/conf_snd.c
src/conf_snd.h
src/conftime.h
src/files.c
src/init.c
src/libgame/image.c
src/libgame/misc.c
src/libgame/misc.h
src/libgame/sound.c
src/libgame/sound.h
src/libgame/system.h
src/main.c
src/main.h
src/tape.c

index e4a742d10197091bf5061675cd268229135c02a1..53176615aadfa7573fb28af1eab7e776c983a2a9 100644 (file)
 
 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[] =
index c402cf8a4ffd7a20790fa915f136dfcf235fbece..07ce6b44d464a7ec307ebaaf32fdd80ec28de583 100644 (file)
 ***********************************************************/
 
 #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"              },
index acd95218c950cfadf540be4b6fca0c5f81b30839..60ea119fa792e3a71b3f81461fb4887a52b62f7d 100644 (file)
@@ -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
index 23667f1d2d95f7d6c6fc18e3819db904551ed098..9b4859ba14e2291a08f7018ae8b59377f61598a9 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2003-01-18 14:21]"
+#define COMPILE_DATE_STRING "[2003-01-18 18:43]"
index 6d858c475be133ebbe2e54027677bbdbb63c9db7..0e26366315a451ed85304ea645f51723c0a95e48 100644 (file)
@@ -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; i<tape->length; i++)
   {
@@ -1152,7 +1152,7 @@ void DumpTape(struct TapeInfo *tape)
     printf("(%03d)\n", tape->pos[i].delay);
   }
 
-  printf_line('-', 79);
+  printf_line("-", 79);
 }
 
 
index 203d4093d6632e9182fae2af9042c8c2ff26e9ae..2b1b7931420cc5d8f66cd702400d2b4db57bf917 100644 (file)
@@ -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<NUM_PICTURES; i++)
-    {
-      DrawInitText(image_filename[i], 150, FC_YELLOW);
-      ReloadCustomImage(pix[i], image_filename[i]);
-    }
-#endif
-
-#if 0
-    SyncDisplay();
-#endif
-
+    ReloadCustomImages();
     ReinitializeGraphics();
 
     FreeTileClipmasks();
     InitTileClipmasks();
 
-#if 0
-    InitGfxBackground();
-
-    /* force redraw of (open or closed) door graphics */
-    SetDoorState(DOOR_OPEN_ALL);
-    CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY);
-#endif
-
 #if 0
     artwork.gfx_current_identifier = gfx_new_identifier;
 #else
@@ -620,12 +617,25 @@ void ReloadCustomArtwork()
   if (strcmp(artwork.snd_current_identifier, snd_new_identifier) != 0 ||
       last_override_level_sounds != setup.override_level_sounds)
   {
+#if 1
+    printf("RELOADING SOUNDS '%s' -> '%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; i<NUM_IMAGE_FILES; i++)
   {
-    Bitmap *src_bitmap = getBitmapFromImageID(i);
-    int num_xtiles = (src_bitmap ? src_bitmap->width          : 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
index ce66e3280b43eaed02485317de4edeff0d7e5aef..c4d3080805ec3f685b1494a0010b35e990869fbb 100644 (file)
@@ -756,6 +756,7 @@ void ReloadCustomImages()
   printf("DEBUG: reloading images '%s' ...\n", artwork.gfx_current_identifier);
 #endif
 
+  LoadArtworkConfig(image_info);
   ReloadCustomArtworkList(image_info);
 }
 
index d0bc9fa9401067173c21224ceedbb687af35015d..abea627781cfebb3d2a20b09351055ccc69177e4 100644 (file)
 #include "text.h"
 
 
+/* ------------------------------------------------------------------------- */
+/* some generic helper functions                                             */
+/* ------------------------------------------------------------------------- */
+
+void fprintf_line(FILE *stream, char *line_string, int line_length)
+{
+  int i;
+
+  for (i=0; i<line_length; i++)
+    fprintf(stream, "%s", line_string);
+
+  fprintf(stream, "\n");
+}
+
+void printf_line(char *line_string, int line_length)
+{
+  fprintf_line(stdout, line_string, line_length);
+}
+
+/* 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;
+  }
+}
+
+
+/* ------------------------------------------------------------------------- */
+/* 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; i<num_file_list_entries; i++)
-  {
-    /* check for config token that is the base token without any suffixes */
-    if (getTokenValue(setup_file_list, file_list[i].token) != NULL)
-    {
-      /* mark token as well known from default config */
-      setTokenValue(setup_file_list, file_list[i].token, known_token_value);
-    }
-
-    /* check for config tokens that can be build by base token and suffixes */
-    for (j=0; j<num_suffix_list_entries; j++)
-    {
-      char *token = getStringCat2(file_list[i].token, suffix_list[j].token);
-
-      if (getTokenValue(setup_file_list, token) != NULL)
-      {
-       /* mark token as well known from default config */
-       setTokenValue(setup_file_list, token, known_token_value);
-      }
-
-      free(token);
-    }
-  }
-
-  /* set some additional tokens to "known" */
-  setTokenValue(setup_file_list, "name", known_token_value);
-  setTokenValue(setup_file_list, "sort_priority", known_token_value);
-
-  /* check for 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");
-    }
-
-    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; i<line_length; i++)
-    printf("%c", line_char);
-
-  printf("\n");
-}
-
-
-/* ========================================================================= */
+/* ------------------------------------------------------------------------- */
 /* the following is only for debugging purpose and normally not used         */
-/* ========================================================================= */
+/* ------------------------------------------------------------------------- */
 
 #define DEBUG_NUM_TIMESTAMPS   3
 
index 27838aa7a82cfe22db9571315173b56bce9cfe03..92b9cce8a95f26ae86f13df99c767f7f59a4ab07 100644 (file)
 
 /* values for Error() */
 #define ERR_RETURN                     0
-#define ERR_WARN                       (1 << 0)
-#define ERR_EXIT                       (1 << 1)
-#define ERR_HELP                       (1 << 2)
-#define ERR_SOUND_SERVER               (1 << 3)
-#define ERR_NETWORK_SERVER             (1 << 4)
-#define ERR_NETWORK_CLIENT             (1 << 5)
+#define ERR_RETURN_LINE                        (1 << 0)
+#define ERR_WARN                       (1 << 1)
+#define ERR_EXIT                       (1 << 2)
+#define ERR_HELP                       (1 << 3)
+#define ERR_SOUND_SERVER               (1 << 4)
+#define ERR_NETWORK_SERVER             (1 << 5)
+#define ERR_NETWORK_CLIENT             (1 << 6)
 #define ERR_FROM_SERVER                        (ERR_SOUND_SERVER | ERR_NETWORK_SERVER)
 #define ERR_EXIT_HELP                  (ERR_EXIT | ERR_HELP)
 #define ERR_EXIT_SOUND_SERVER          (ERR_EXIT | ERR_SOUND_SERVER)
 #define MAX_FILENAME_LEN               256
 #define MAX_LINE_LEN                   1000
 
+void fprintf_line(FILE *, char *, int);
+void printf_line(char *, int);
+char *int2str(int, int);
+
 void InitCounter(void);
 unsigned long Counter(void);
 void Delay(unsigned long);
 boolean FrameReached(unsigned long *, unsigned long);
 boolean DelayReached(unsigned long *, unsigned long);
 void WaitUntilDelayReached(unsigned long *, unsigned long);
-char *int2str(int, int);
+
 unsigned int SimpleRND(unsigned int);
 unsigned int RND(unsigned int);
 unsigned int InitRND(long);
+
 char *getLoginName(void);
 char *getRealName(void);
 char *getHomeDir(void);
+
 char *getPath2(char *, char *);
 char *getPath3(char *, char *, char*);
 char *getStringCopy(char *);
@@ -80,6 +87,7 @@ void Error(int, char *, ...);
 void *checked_malloc(unsigned long);
 void *checked_calloc(unsigned long);
 void *checked_realloc(void *, unsigned long);
+
 inline void swap_numbers(int *, int *);
 inline void swap_number_pairs(int *, int *, int *, int *);
 
@@ -116,14 +124,12 @@ char getCharFromKey(Key);
 int get_integer_from_string(char *);
 boolean get_boolean_from_string(char *);
 
-
 ListNode *newListNode(void);
 void addNodeToList(ListNode **, char *, void *);
 void deleteNodeFromList(ListNode **, char *, void (*function)(void *));
 ListNode *getNodeFromKey(ListNode *, char *);
 int getNumNodes(ListNode *);
 
-
 boolean FileIsGraphic(char *);
 boolean FileIsSound(char *);
 boolean FileIsMusic(char *);
@@ -131,18 +137,16 @@ boolean FileIsArtworkType(char *, int);
 
 struct FileInfo *getFileListFromConfigList(struct ConfigInfo *,
                                           struct ConfigInfo *, int);
+void LoadArtworkConfig(struct ArtworkListInfo *);
 void ReloadCustomArtworkList(struct ArtworkListInfo *);
 void FreeCustomArtworkList(struct ArtworkListInfo *);
 
-
 #if !defined(PLATFORM_UNIX)
 void initErrorFile();
 FILE *openErrorFile();
 void dumpErrorFile();
 #endif
 
-void printf_line(char, int);
-
 void debug_print_timestamp(int, char *);
 
 #endif /* MISC_H */
index 30946f248c7acbd625c595e6672fdcfa58b7dd04..1a403e7be7c60ccfd53b0a2b614af3c41f1dd237 100644 (file)
@@ -2011,6 +2011,7 @@ static void ReloadCustomSounds()
   printf("DEBUG: reloading sounds '%s' ...\n", artwork.snd_current_identifier);
 #endif
 
+  LoadArtworkConfig(sound_info);
   ReloadCustomArtworkList(sound_info);
 }
 
@@ -2023,19 +2024,20 @@ static void ReloadCustomMusic()
   LoadCustomMusic();
 }
 
-void InitReloadSounds(char *set_identifier)
+void InitReloadCustomSounds(char *set_identifier)
 {
   if (!audio.sound_available)
     return;
 
 #if defined(AUDIO_UNIX_NATIVE)
+  LoadArtworkConfig(sound_info);       /* also load config on sound client */
   WriteReloadInfoToPipe(set_identifier, SND_CTRL_RELOAD_SOUNDS);
 #else
   ReloadCustomSounds();
 #endif
 }
 
-void InitReloadMusic(char *set_identifier)
+void InitReloadCustomMusic(char *set_identifier)
 {
   if (!audio.music_available)
     return;
index dcc41eac55e93113fc7bb76a70b07ccd23ae9c8c..45905aab9ac0a265c0fe4d804b2e8ec8f7c2e501 100644 (file)
@@ -144,8 +144,8 @@ void StopSounds(void);
 void StopSoundExt(int, int);
 struct FileInfo *getCurrentSoundList();
 void InitSoundList(struct ConfigInfo *, struct ConfigInfo *, int);
-void InitReloadSounds(char *);
-void InitReloadMusic(char *);
+void InitReloadCustomSounds(char *);
+void InitReloadCustomMusic(char *);
 void FreeAllSounds(void);
 void FreeAllMusic(void);
 
index c6065db65b47f797c9498a5dd85bb78b77cbdb1e..f77bc0acf59d9bfcc67f48d1a21b00fb76238ea7 100644 (file)
 /* default name for unknown player names */
 #define ANONYMOUS_NAME         "anonymous"
 
+/* default name for new levels */
+#define NAMELESS_LEVEL_NAME    "nameless level"
+
 /* default text for non-existant artwork */
 #define NOT_AVAILABLE          "(not available)"
 
 /* default value for undefined filename */
 #define UNDEFINED_FILENAME     "[NONE]"
 
-/* default name for new levels */
-#define NAMELESS_LEVEL_NAME    "nameless level"
+/* default values for undefined configuration file parameters */
+#define ARG_UNDEFINED          "-1000000"
+#define ARG_UNDEFINED_VALUE    (atoi(ARG_UNDEFINED))
 
 /* definitions for game sub-directories */
 #ifndef RO_GAME_DIR
index 730b667fe0f00cd9bb6c35a59b9c73c72067f118..7cb246320a9febf64a608a66fe714d4d98065ac8 100644 (file)
@@ -2773,7 +2773,9 @@ struct SoundActionProperties sound_action_properties[] =
   { ".attacking",      ACTION_ATTACKING,       TRUE },
 
   /* other (non-loop) sound actions are optional */
+#if 0
   { ".stepping",       ACTION_MOVING,          FALSE }, /* discrete moving */
+#endif
   { ".digging",                ACTION_DIGGING,         FALSE },
   { ".collecting",     ACTION_COLLECTING,      FALSE },
   { ".passing",                ACTION_PASSING,         FALSE },
index efbb577463a668522c5fed921d37a33244e78c44..221b3530ce324db1c8aeadb85b624c70aa7fad6a 100644 (file)
 
 #define NUM_GFX_ARGS                           16
 
-#define GFX_ARG_UNDEFINED                      "-1000000"
-#define GFX_ARG_UNDEFINED_VALUE                        (atoi(GFX_ARG_UNDEFINED))
-
 
 /* values for sound configuration suffixes */
-/* (currently none) */
+#define SND_ARG_MODE_LOOP                      0
+
+#define NUM_SND_ARGS                           1
 
 
 /* values for game_status */
index 3ee04d6de79956e456384878678028013262c258..8d1b6952c4a8c4ade26014a268c0bc762fa60ec9 100644 (file)
@@ -727,14 +727,14 @@ void AutoPlayTape()
 
     autoplay_level_nr = autoplay_leveldir->first_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; i<MAX_NUM_AUTOPLAY_LEVELS; i++)
@@ -774,11 +774,11 @@ void AutoPlayTape()
   }
 
   printf("\n");
-  printf_line('=', 79);
+  printf_line("=", 79);
   printf("Number of levels played: %d\n", num_levels_played);
   printf("Number of levels solved: %d (%d%%)\n", num_levels_solved,
         (num_levels_played ? num_levels_solved * 100 / num_levels_played :0));
-  printf_line('-', 79);
+  printf_line("-", 79);
   printf("Summary (for automatic parsing by scripts):\n");
   printf("LEVELDIR '%s', SOLVED %d/%d (%d%%)",
         autoplay_leveldir->identifier, 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);
 }