rnd-20060102-1-src
[rocksndiamonds.git] / src / files.c
index 1d29930366fd64f8d6375501991b2c30112e0678..6db3036e8685a742545a7cc8207e173891701bfc 100644 (file)
 #define CONF_VALUE_INTEGER_2           (CONF_MASK_1_BYTE | 2)
 #define CONF_VALUE_INTEGER_3           (CONF_MASK_1_BYTE | 3)
 #define CONF_VALUE_INTEGER_4           (CONF_MASK_1_BYTE | 4)
-#define CONF_VALUE_BOOLEAN_1           (CONF_MASK_1_BYTE | 5)
-#define CONF_VALUE_BOOLEAN_2           (CONF_MASK_1_BYTE | 6)
-#define CONF_VALUE_BOOLEAN_3           (CONF_MASK_1_BYTE | 7)
-#define CONF_VALUE_BOOLEAN_4           (CONF_MASK_1_BYTE | 8)
+#define CONF_VALUE_INTEGER_5           (CONF_MASK_1_BYTE | 5)
+#define CONF_VALUE_INTEGER_6           (CONF_MASK_1_BYTE | 6)
+#define CONF_VALUE_INTEGER_7           (CONF_MASK_1_BYTE | 7)
+#define CONF_VALUE_INTEGER_8           (CONF_MASK_1_BYTE | 8)
+#define CONF_VALUE_BOOLEAN_1           (CONF_MASK_1_BYTE | 9)
+#define CONF_VALUE_BOOLEAN_2           (CONF_MASK_1_BYTE | 10)
+#define CONF_VALUE_BOOLEAN_3           (CONF_MASK_1_BYTE | 11)
+#define CONF_VALUE_BOOLEAN_4           (CONF_MASK_1_BYTE | 12)
+#define CONF_VALUE_BOOLEAN_5           (CONF_MASK_1_BYTE | 13)
+#define CONF_VALUE_BOOLEAN_6           (CONF_MASK_1_BYTE | 14)
+#define CONF_VALUE_BOOLEAN_7           (CONF_MASK_1_BYTE | 15)
+#define CONF_VALUE_BOOLEAN_8           (CONF_MASK_1_BYTE | 16)
 
 #define CONF_VALUE_ELEMENT_1           (CONF_MASK_2_BYTE | 1)
 #define CONF_VALUE_ELEMENT_2           (CONF_MASK_2_BYTE | 2)
 #define CONF_VALUE_ELEMENT_3           (CONF_MASK_2_BYTE | 3)
 #define CONF_VALUE_ELEMENT_4           (CONF_MASK_2_BYTE | 4)
+#define CONF_VALUE_ELEMENT_5           (CONF_MASK_2_BYTE | 5)
+#define CONF_VALUE_ELEMENT_6           (CONF_MASK_2_BYTE | 6)
+#define CONF_VALUE_ELEMENT_7           (CONF_MASK_2_BYTE | 7)
+#define CONF_VALUE_ELEMENT_8           (CONF_MASK_2_BYTE | 8)
 
 #define CONF_VALUE_CONTENT_1           (CONF_MASK_MULTI_BYTES | 1)
 #define CONF_VALUE_CONTENT_8           (CONF_MASK_MULTI_BYTES | 2)
 
 #define CONF_VALUE_INTEGER(x)          ((x) >= CONF_VALUE_INTEGER_1 && \
-                                        (x) <= CONF_VALUE_INTEGER_4)
+                                        (x) <= CONF_VALUE_INTEGER_8)
 
 #define CONF_VALUE_BOOLEAN(x)          ((x) >= CONF_VALUE_BOOLEAN_1 && \
-                                        (x) <= CONF_VALUE_BOOLEAN_4)
+                                        (x) <= CONF_VALUE_BOOLEAN_8)
 
 #define CONF_VALUE_NUM_BYTES(x)                ((x) == CONF_MASK_1_BYTE ? 1 :  \
                                         (x) == CONF_MASK_2_BYTE ? 2 :  \
@@ -223,6 +235,38 @@ static struct
     EL_PLAYER_4,                       CONF_VALUE_BOOLEAN_2,
     &li.use_start_element[3],          FALSE
   },
+  {
+    EL_PLAYER_1,                       CONF_VALUE_BOOLEAN_3,
+    &li.use_artwork_element[0],                FALSE
+  },
+  {
+    EL_PLAYER_2,                       CONF_VALUE_BOOLEAN_3,
+    &li.use_artwork_element[1],                FALSE
+  },
+  {
+    EL_PLAYER_3,                       CONF_VALUE_BOOLEAN_3,
+    &li.use_artwork_element[2],                FALSE
+  },
+  {
+    EL_PLAYER_4,                       CONF_VALUE_BOOLEAN_3,
+    &li.use_artwork_element[3],                FALSE
+  },
+  {
+    EL_PLAYER_1,                       CONF_VALUE_BOOLEAN_4,
+    &li.use_explosion_element[0],      FALSE
+  },
+  {
+    EL_PLAYER_2,                       CONF_VALUE_BOOLEAN_4,
+    &li.use_explosion_element[1],      FALSE
+  },
+  {
+    EL_PLAYER_3,                       CONF_VALUE_BOOLEAN_4,
+    &li.use_explosion_element[2],      FALSE
+  },
+  {
+    EL_PLAYER_4,                       CONF_VALUE_BOOLEAN_4,
+    &li.use_explosion_element[3],      FALSE
+  },
   {
     EL_EMC_MAGIC_BALL,                 CONF_VALUE_INTEGER_1,
     &li.ball_time,                     10
@@ -257,6 +301,38 @@ static struct
     EL_PLAYER_4,                       CONF_VALUE_ELEMENT_1,
     &li.start_element[3],              EL_PLAYER_4
   },
+  {
+    EL_PLAYER_1,                       CONF_VALUE_ELEMENT_2,
+    &li.artwork_element[0],            EL_PLAYER_1
+  },
+  {
+    EL_PLAYER_2,                       CONF_VALUE_ELEMENT_2,
+    &li.artwork_element[1],            EL_PLAYER_2
+  },
+  {
+    EL_PLAYER_3,                       CONF_VALUE_ELEMENT_2,
+    &li.artwork_element[2],            EL_PLAYER_3
+  },
+  {
+    EL_PLAYER_4,                       CONF_VALUE_ELEMENT_2,
+    &li.artwork_element[3],            EL_PLAYER_4
+  },
+  {
+    EL_PLAYER_1,                       CONF_VALUE_ELEMENT_3,
+    &li.explosion_element[0],          EL_PLAYER_1
+  },
+  {
+    EL_PLAYER_2,                       CONF_VALUE_ELEMENT_3,
+    &li.explosion_element[1],          EL_PLAYER_2
+  },
+  {
+    EL_PLAYER_3,                       CONF_VALUE_ELEMENT_3,
+    &li.explosion_element[2],          EL_PLAYER_3
+  },
+  {
+    EL_PLAYER_4,                       CONF_VALUE_ELEMENT_3,
+    &li.explosion_element[3],          EL_PLAYER_4
+  },
 
   /* ---------- multi-byte values ------------------------------------------ */
   {
@@ -4504,6 +4580,24 @@ void SaveScore(int nr)
 
 #define NUM_EDITOR_SETUP_TOKENS                        13
 
+/* editor cascade setup */
+#define SETUP_TOKEN_EDITOR_CASCADE_BD          0
+#define SETUP_TOKEN_EDITOR_CASCADE_EM          1
+#define SETUP_TOKEN_EDITOR_CASCADE_EMC         2
+#define SETUP_TOKEN_EDITOR_CASCADE_RND         3
+#define SETUP_TOKEN_EDITOR_CASCADE_SB          4
+#define SETUP_TOKEN_EDITOR_CASCADE_SP          5
+#define SETUP_TOKEN_EDITOR_CASCADE_DC          6
+#define SETUP_TOKEN_EDITOR_CASCADE_DX          7
+#define SETUP_TOKEN_EDITOR_CASCADE_TEXT                8
+#define SETUP_TOKEN_EDITOR_CASCADE_CE          9
+#define SETUP_TOKEN_EDITOR_CASCADE_GE          10
+#define SETUP_TOKEN_EDITOR_CASCADE_USER                11
+#define SETUP_TOKEN_EDITOR_CASCADE_GENERIC     12
+#define SETUP_TOKEN_EDITOR_CASCADE_DYNAMIC     13
+
+#define NUM_EDITOR_CASCADE_SETUP_TOKENS                14
+
 /* shortcut setup */
 #define SETUP_TOKEN_SHORTCUT_SAVE_GAME         0
 #define SETUP_TOKEN_SHORTCUT_LOAD_GAME         1
@@ -4545,6 +4639,7 @@ void SaveScore(int nr)
 
 static struct SetupInfo si;
 static struct SetupEditorInfo sei;
+static struct SetupEditorCascadeInfo seci;
 static struct SetupShortcutInfo ssi;
 static struct SetupInputInfo sii;
 static struct SetupSystemInfo syi;
@@ -4594,6 +4689,24 @@ static struct TokenInfo editor_setup_tokens[] =
   { TYPE_SWITCH, &sei.el_dynamic,      "editor.el_dynamic"             },
 };
 
+static struct TokenInfo editor_cascade_setup_tokens[] =
+{
+  { TYPE_SWITCH, &seci.el_bd,          "editor.cascade.el_bd"          },
+  { TYPE_SWITCH, &seci.el_em,          "editor.cascade.el_em"          },
+  { TYPE_SWITCH, &seci.el_emc,         "editor.cascade.el_emc"         },
+  { TYPE_SWITCH, &seci.el_rnd,         "editor.cascade.el_rnd"         },
+  { TYPE_SWITCH, &seci.el_sb,          "editor.cascade.el_sb"          },
+  { TYPE_SWITCH, &seci.el_sp,          "editor.cascade.el_sp"          },
+  { TYPE_SWITCH, &seci.el_dc,          "editor.cascade.el_dc"          },
+  { TYPE_SWITCH, &seci.el_dx,          "editor.cascade.el_dx"          },
+  { TYPE_SWITCH, &seci.el_chars,       "editor.cascade.el_chars"       },
+  { TYPE_SWITCH, &seci.el_ce,          "editor.cascade.el_ce"          },
+  { TYPE_SWITCH, &seci.el_ge,          "editor.cascade.el_ge"          },
+  { TYPE_SWITCH, &seci.el_user,                "editor.cascade.el_user"        },
+  { TYPE_SWITCH, &seci.el_generic,     "editor.cascade.el_generic"     },
+  { TYPE_SWITCH, &seci.el_dynamic,     "editor.cascade.el_dynamic"     },
+};
+
 static struct TokenInfo shortcut_setup_tokens[] =
 {
   { TYPE_KEY_X11, &ssi.save_game,      "shortcut.save_game"            },
@@ -4724,6 +4837,25 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
   si->options.verbose = FALSE;
 }
 
+static void setSetupInfoToDefaults_EditorCascade(struct SetupInfo *si)
+{
+  si->editor_cascade.el_bd     = TRUE;
+  si->editor_cascade.el_em     = TRUE;
+  si->editor_cascade.el_emc    = TRUE;
+  si->editor_cascade.el_rnd    = TRUE;
+  si->editor_cascade.el_sb     = TRUE;
+  si->editor_cascade.el_sp     = TRUE;
+  si->editor_cascade.el_dc     = TRUE;
+  si->editor_cascade.el_dx     = TRUE;
+
+  si->editor_cascade.el_chars  = FALSE;
+  si->editor_cascade.el_ce     = FALSE;
+  si->editor_cascade.el_ge     = FALSE;
+  si->editor_cascade.el_user   = FALSE;
+  si->editor_cascade.el_generic        = FALSE;
+  si->editor_cascade.el_dynamic        = FALSE;
+}
+
 static void decodeSetupFileHash(SetupFileHash *setup_file_hash)
 {
   int i, pnr;
@@ -4786,6 +4918,22 @@ static void decodeSetupFileHash(SetupFileHash *setup_file_hash)
   setup.options = soi;
 }
 
+static void decodeSetupFileHash_EditorCascade(SetupFileHash *setup_file_hash)
+{
+  int i;
+
+  if (!setup_file_hash)
+    return;
+
+  /* editor cascade setup */
+  seci = setup.editor_cascade;
+  for (i = 0; i < NUM_EDITOR_CASCADE_SETUP_TOKENS; i++)
+    setSetupInfo(editor_cascade_setup_tokens, i,
+                getHashEntry(setup_file_hash,
+                             editor_cascade_setup_tokens[i].text));
+  setup.editor_cascade = seci;
+}
+
 void LoadSetup()
 {
   char *filename = getSetupFilename();
@@ -4816,6 +4964,27 @@ void LoadSetup()
     Error(ERR_WARN, "using default setup values");
 }
 
+void LoadSetup_EditorCascade()
+{
+  char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME);
+  SetupFileHash *setup_file_hash = NULL;
+
+  /* always start with reliable default values */
+  setSetupInfoToDefaults_EditorCascade(&setup);
+
+  setup_file_hash = loadSetupFileHash(filename);
+
+  if (setup_file_hash)
+  {
+    checkSetupFileHashIdentifier(setup_file_hash, getCookie("SETUP"));
+    decodeSetupFileHash_EditorCascade(setup_file_hash);
+
+    freeSetupFileHash(setup_file_hash);
+  }
+
+  free(filename);
+}
+
 void SaveSetup()
 {
   char *filename = getSetupFilename();
@@ -4888,6 +5057,37 @@ void SaveSetup()
   SetFilePermissions(filename, PERMS_PRIVATE);
 }
 
+void SaveSetup_EditorCascade()
+{
+  char *filename = getPath2(getSetupDir(), EDITORCASCADE_FILENAME);
+  FILE *file;
+  int i;
+
+  InitUserDataDirectory();
+
+  if (!(file = fopen(filename, MODE_WRITE)))
+  {
+    Error(ERR_WARN, "cannot write editor cascade state file '%s'", filename);
+    free(filename);
+    return;
+  }
+
+  fprintf(file, "%s\n", getFormattedSetupEntry(TOKEN_STR_FILE_IDENTIFIER,
+                                              getCookie("SETUP")));
+  fprintf(file, "\n");
+
+  seci = setup.editor_cascade;
+  fprintf(file, "\n");
+  for (i = 0; i < NUM_EDITOR_SETUP_TOKENS; i++)
+    fprintf(file, "%s\n", getSetupLine(editor_cascade_setup_tokens, "", i));
+
+  fclose(file);
+
+  SetFilePermissions(filename, PERMS_PRIVATE);
+
+  free(filename);
+}
+
 void LoadCustomElementDescriptions()
 {
   char *filename = getCustomArtworkConfigFilename(ARTWORK_TYPE_GRAPHICS);