rnd-20030327-1-src
[rocksndiamonds.git] / src / files.c
index 902b3b890889fdb6d30e812d43ce7f60c2987c38..436decce8759e073aefceeb3d69aaa1fad2d8bfc 100644 (file)
@@ -90,7 +90,7 @@ static void setLevelInfoToDefaults()
        level.yam_content[i][x][y] =
          (i < STD_ELEMENT_CONTENTS ? EL_ROCK : EL_EMPTY);
 
-  Feld[0][0] = Ur[0][0] = EL_PLAYER1;
+  Feld[0][0] = Ur[0][0] = EL_PLAYER_1;
   Feld[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] =
     Ur[STD_LEV_FIELDX-1][STD_LEV_FIELDY-1] = EL_EXIT_CLOSED;
 
@@ -143,9 +143,9 @@ static int checkLevelElement(int element)
     element = EL_CHAR_QUESTION;
   }
   else if (element == EL_PLAYER_OBSOLETE)
-    element = EL_PLAYER1;
+    element = EL_PLAYER_1;
   else if (element == EL_KEY_OBSOLETE)
-    element = EL_KEY1;
+    element = EL_KEY_1;
 
   return element;
 }
@@ -872,6 +872,26 @@ static int LoadTape_HEAD(FILE *file, int chunk_size, struct TapeInfo *tape)
   return chunk_size;
 }
 
+static int LoadTape_INFO(FILE *file, int chunk_size, struct TapeInfo *tape)
+{
+  int level_identifier_size;
+  int i;
+
+  level_identifier_size = getFile16BitBE(file);
+
+  tape->level_identifier =
+    checked_realloc(tape->level_identifier, level_identifier_size);
+
+  for(i=0; i < level_identifier_size; i++)
+    tape->level_identifier[i] = fgetc(file);
+
+  tape->level_nr = getFile16BitBE(file);
+
+  chunk_size = 2 + level_identifier_size + 2;
+
+  return chunk_size;
+}
+
 static int LoadTape_BODY(FILE *file, int chunk_size, struct TapeInfo *tape)
 {
   int i, j;
@@ -1025,6 +1045,7 @@ void LoadTapeFromFilename(char *filename)
     {
       { "VERS", FILE_VERS_CHUNK_SIZE,  LoadTape_VERS },
       { "HEAD", TAPE_HEADER_SIZE,      LoadTape_HEAD },
+      { "INFO", -1,                    LoadTape_INFO },
       { "BODY", -1,                    LoadTape_BODY },
       {  NULL,  0,                     NULL }
     };
@@ -1108,6 +1129,19 @@ static void SaveTape_HEAD(FILE *file, struct TapeInfo *tape)
   putFileVersion(file, tape->engine_version);
 }
 
+static void SaveTape_INFO(FILE *file, struct TapeInfo *tape)
+{
+  int level_identifier_size = strlen(tape->level_identifier) + 1;
+  int i;
+
+  putFile16BitBE(file, level_identifier_size);
+
+  for(i=0; i < level_identifier_size; i++)
+    fputc(tape->level_identifier[i], file);
+
+  putFile16BitBE(file, tape->level_nr);
+}
+
 static void SaveTape_BODY(FILE *file, struct TapeInfo *tape)
 {
   int i, j;
@@ -1124,12 +1158,13 @@ static void SaveTape_BODY(FILE *file, struct TapeInfo *tape)
 
 void SaveTape(int level_nr)
 {
-  int i;
   char *filename = getTapeFilename(level_nr);
   FILE *file;
   boolean new_tape = TRUE;
   int num_participating_players = 0;
+  int info_chunk_size;
   int body_chunk_size;
+  int i;
 
   InitTapeDirectory(leveldir_current->filename);
 
@@ -1155,6 +1190,7 @@ void SaveTape(int level_nr)
     if (tape.player_participates[i])
       num_participating_players++;
 
+  info_chunk_size = 2 + (strlen(tape.level_identifier) + 1) + 2;
   body_chunk_size = (num_participating_players + 1) * tape.length;
 
   putFileChunkBE(file, "RND1", CHUNK_SIZE_UNDEFINED);
@@ -1166,6 +1202,9 @@ void SaveTape(int level_nr)
   putFileChunkBE(file, "HEAD", TAPE_HEADER_SIZE);
   SaveTape_HEAD(file, &tape);
 
+  putFileChunkBE(file, "INFO", info_chunk_size);
+  SaveTape_INFO(file, &tape);
+
   putFileChunkBE(file, "BODY", body_chunk_size);
   SaveTape_BODY(file, &tape);
 
@@ -1192,6 +1231,7 @@ void DumpTape(struct TapeInfo *tape)
   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("Level series identifier: '%s'\n", tape->level_identifier);
   printf_line("-", 79);
 
   for(i=0; i<tape->length; i++)
@@ -1379,14 +1419,27 @@ void SaveScore(int level_nr)
 
 #define NUM_PLAYER_SETUP_TOKENS                        16
 
+/* system setup */
+#define SETUP_TOKEN_SYSTEM_SDL_AUDIODRIVER     0
+#define SETUP_TOKEN_SYSTEM_AUDIO_FRAGMENT_SIZE 1
+
+#define NUM_SYSTEM_SETUP_TOKENS                        2
+
+/* options setup */
+#define SETUP_TOKEN_OPTIONS_VERBOSE            0
+
+#define NUM_OPTIONS_SETUP_TOKENS               1
+
+
 static struct SetupInfo si;
 static struct SetupEditorInfo sei;
 static struct SetupShortcutInfo ssi;
 static struct SetupInputInfo sii;
+static struct SetupSystemInfo syi;
+static struct OptionInfo soi;
 
 static struct TokenInfo global_setup_tokens[] =
 {
-  /* global setup */
   { TYPE_STRING, &si.player_name,      "player_name"                   },
   { TYPE_SWITCH, &si.sound,            "sound"                         },
   { TYPE_SWITCH, &si.sound_loops,      "repeating_sound_loops"         },
@@ -1413,7 +1466,6 @@ static struct TokenInfo global_setup_tokens[] =
 
 static struct TokenInfo editor_setup_tokens[] =
 {
-  /* shortcut setup */
   { TYPE_SWITCH, &sei.el_boulderdash,  "editor.el_boulderdash"         },
   { TYPE_SWITCH, &sei.el_emerald_mine, "editor.el_emerald_mine"        },
   { TYPE_SWITCH, &sei.el_more,         "editor.el_more"                },
@@ -1427,7 +1479,6 @@ static struct TokenInfo editor_setup_tokens[] =
 
 static struct TokenInfo shortcut_setup_tokens[] =
 {
-  /* shortcut setup */
   { TYPE_KEY_X11, &ssi.save_game,      "shortcut.save_game"            },
   { TYPE_KEY_X11, &ssi.load_game,      "shortcut.load_game"            },
   { TYPE_KEY_X11, &ssi.toggle_pause,   "shortcut.toggle_pause"         }
@@ -1435,7 +1486,6 @@ static struct TokenInfo shortcut_setup_tokens[] =
 
 static struct TokenInfo player_setup_tokens[] =
 {
-  /* player setup */
   { TYPE_BOOLEAN, &sii.use_joystick,   ".use_joystick"                 },
   { TYPE_STRING,  &sii.joy.device_name,        ".joy.device_name"              },
   { TYPE_INTEGER, &sii.joy.xleft,      ".joy.xleft"                    },
@@ -1454,6 +1504,17 @@ static struct TokenInfo player_setup_tokens[] =
   { TYPE_KEY_X11, &sii.key.bomb,       ".key.place_bomb"               }
 };
 
+static struct TokenInfo system_setup_tokens[] =
+{
+  { TYPE_STRING,  &syi.sdl_audiodriver,        "system.sdl_audiodriver"        },
+  { TYPE_INTEGER, &syi.audio_fragment_size,"system.audio_fragment_size"        }
+};
+
+static struct TokenInfo options_setup_tokens[] =
+{
+  { TYPE_BOOLEAN, &soi.verbose,                "options.verbose"               }
+};
+
 static void setSetupInfoToDefaults(struct SetupInfo *si)
 {
   int i;
@@ -1493,7 +1554,7 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->editor.el_diamond_caves = TRUE;
   si->editor.el_dx_boulderdash = TRUE;
   si->editor.el_chars = TRUE;
-  si->editor.el_custom = FALSE;
+  si->editor.el_custom = TRUE;
 
   si->shortcut.save_game = DEFAULT_KEY_SAVE_GAME;
   si->shortcut.load_game = DEFAULT_KEY_LOAD_GAME;
@@ -1518,6 +1579,11 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
     si->input[i].key.snap  = (i == 0 ? DEFAULT_KEY_SNAP  : KSYM_UNDEFINED);
     si->input[i].key.bomb  = (i == 0 ? DEFAULT_KEY_BOMB  : KSYM_UNDEFINED);
   }
+
+  si->system.sdl_audiodriver = getStringCopy(ARG_DEFAULT);
+  si->system.audio_fragment_size = DEFAULT_AUDIO_FRAGMENT_SIZE;
+
+  si->options.verbose = FALSE;
 }
 
 static void decodeSetupFileList(struct SetupFileList *setup_file_list)
@@ -1566,6 +1632,20 @@ static void decodeSetupFileList(struct SetupFileList *setup_file_list)
     }
     setup.input[pnr] = sii;
   }
+
+  /* system setup */
+  syi = setup.system;
+  for (i=0; i<NUM_SYSTEM_SETUP_TOKENS; i++)
+    setSetupInfo(system_setup_tokens, i,
+                getTokenValue(setup_file_list, system_setup_tokens[i].text));
+  setup.system = syi;
+
+  /* options setup */
+  soi = setup.options;
+  for (i=0; i<NUM_OPTIONS_SETUP_TOKENS; i++)
+    setSetupInfo(options_setup_tokens, i,
+                getTokenValue(setup_file_list, options_setup_tokens[i].text));
+  setup.options = soi;
 }
 
 void LoadSetup()
@@ -1658,6 +1738,18 @@ void SaveSetup()
       fprintf(file, "%s\n", getSetupLine(player_setup_tokens, prefix, i));
   }
 
+  /* system setup */
+  syi = setup.system;
+  fprintf(file, "\n");
+  for (i=0; i<NUM_SYSTEM_SETUP_TOKENS; i++)
+    fprintf(file, "%s\n", getSetupLine(system_setup_tokens, "", i));
+
+  /* options setup */
+  soi = setup.options;
+  fprintf(file, "\n");
+  for (i=0; i<NUM_OPTIONS_SETUP_TOKENS; i++)
+    fprintf(file, "%s\n", getSetupLine(options_setup_tokens, "", i));
+
   fclose(file);
 
   SetFilePermissions(filename, PERMS_PRIVATE);
@@ -1702,19 +1794,44 @@ void LoadSpecialMenuDesignSettings()
   char *value;
 
   /* !!! CHANGE THIS !!! (redundant initialization) !!! */
-  gfx.menu_main_hide_static_text = FALSE;
   global.num_toons = 20;
+  global.menu_draw_xoffset = 0;
+  global.menu_draw_yoffset = 0;
+  global.menu_draw_xoffset_MAIN = 0;
+  global.menu_draw_yoffset_MAIN = 0;
+  global.door_step_offset = 2;
+  global.door_step_delay = 10;
 
   if ((setup_file_list = loadSetupFileList(filename)) == NULL)
     return;
 
-  value = getTokenValue(setup_file_list, "menu.main.hide_static_text");
-  if (value != NULL)
-    gfx.menu_main_hide_static_text = get_boolean_from_string(value);
-
   value = getTokenValue(setup_file_list, "global.num_toons");
   if (value != NULL)
     global.num_toons = get_integer_from_string(value);
 
+  value = getTokenValue(setup_file_list, "menu.draw_xoffset");
+  if (value != NULL)
+    global.menu_draw_xoffset = get_integer_from_string(value);
+
+  value = getTokenValue(setup_file_list, "menu.draw_yoffset");
+  if (value != NULL)
+    global.menu_draw_yoffset = get_integer_from_string(value);
+
+  value = getTokenValue(setup_file_list, "menu.draw_xoffset.MAIN");
+  if (value != NULL)
+    global.menu_draw_xoffset_MAIN = get_integer_from_string(value);
+
+  value = getTokenValue(setup_file_list, "menu.draw_yoffset.MAIN");
+  if (value != NULL)
+    global.menu_draw_yoffset_MAIN = get_integer_from_string(value);
+
+  value = getTokenValue(setup_file_list, "door.step_offset");
+  if (value != NULL)
+    global.door_step_offset = get_integer_from_string(value);
+
+  value = getTokenValue(setup_file_list, "door.step_delay");
+  if (value != NULL)
+    global.door_step_delay = get_integer_from_string(value);
+
   freeSetupFileList(setup_file_list);
 }