rnd-20000722-1-src
[rocksndiamonds.git] / src / files.c
index fa40845efe78e496e7e27c4fb9e57a19ec3c4cf2..9870c8288791ebfabceda3dd25ee04c646557141 100644 (file)
@@ -14,7 +14,6 @@
 #include <ctype.h>
 #include <dirent.h>
 #include <sys/stat.h>
-#include <unistd.h>
 
 #include "files.h"
 #include "tools.h"
@@ -441,6 +440,17 @@ static void setLevelInfoToDefaults()
   }
 }
 
+static int checkLevelElement(int element)
+{
+  if (element >= EL_FIRST_RUNTIME_EL)
+  {
+    Error(ERR_WARN, "invalid level element %d", element);
+    element = EL_CHAR_FRAGE;
+  }
+
+  return element;
+}
+
 void LoadLevel(int level_nr)
 {
   int i, x, y;
@@ -510,7 +520,7 @@ void LoadLevel(int level_nr)
       for(x=0; x<3; x++)
       {
        if (i < STD_ELEMENT_CONTENTS)
-         level.yam_content[i][x][y] = fgetc(file);
+         level.yam_content[i][x][y] = checkLevelElement(fgetc(file));
        else
          level.yam_content[i][x][y] = EL_LEERRAUM;
       }
@@ -520,7 +530,7 @@ void LoadLevel(int level_nr)
   level.amoeba_speed   = fgetc(file);
   level.time_magic_wall        = fgetc(file);
   level.time_wheel     = fgetc(file);
-  level.amoeba_content = fgetc(file);
+  level.amoeba_content = checkLevelElement(fgetc(file));
   level.double_speed   = (fgetc(file) == 1 ? TRUE : FALSE);
   level.gravity                = (fgetc(file) == 1 ? TRUE : FALSE);
 
@@ -566,9 +576,10 @@ void LoadLevel(int level_nr)
        for(y=0; y<3; y++)
          for(x=0; x<3; x++)
            level.yam_content[i][x][y] =
-             (encoding_16bit ?
-              getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN) :
-              fgetc(file));
+             checkLevelElement(encoding_16bit ?
+                               getFile16BitInteger(file,
+                                                   BYTE_ORDER_BIG_ENDIAN) :
+                               fgetc(file));
 
       getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_BIG_ENDIAN);
     }
@@ -591,9 +602,9 @@ void LoadLevel(int level_nr)
   for(y=0; y<lev_fieldy; y++)
     for(x=0; x<lev_fieldx; x++)
       Feld[x][y] = Ur[x][y] =
-       (encoding_16bit ?
-        getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN) :
-        fgetc(file));
+       checkLevelElement(encoding_16bit ?
+                         getFile16BitInteger(file, BYTE_ORDER_BIG_ENDIAN) :
+                         fgetc(file));
 
   fclose(file);
 
@@ -1081,7 +1092,7 @@ void SaveScore(int level_nr)
 
 #define TYPE_BOOLEAN                   1
 #define TYPE_SWITCH                    2
-#define TYPE_KEYSYM                    3
+#define TYPE_KEY                       3
 #define TYPE_INTEGER                   4
 #define TYPE_STRING                    5
 
@@ -1127,12 +1138,12 @@ static struct
   { TYPE_INTEGER, &sii.joy.ylower,     ".joy.ylower"                   },
   { TYPE_INTEGER, &sii.joy.snap,       ".joy.snap_field"               },
   { TYPE_INTEGER, &sii.joy.bomb,       ".joy.place_bomb"               },
-  { TYPE_KEYSYM,  &sii.key.left,       ".key.move_left"                },
-  { TYPE_KEYSYM,  &sii.key.right,      ".key.move_right"               },
-  { TYPE_KEYSYM,  &sii.key.up,         ".key.move_up"                  },
-  { TYPE_KEYSYM,  &sii.key.down,       ".key.move_down"                },
-  { TYPE_KEYSYM,  &sii.key.snap,       ".key.snap_field"               },
-  { TYPE_KEYSYM,  &sii.key.bomb,       ".key.place_bomb"               },
+  { TYPE_KEY,     &sii.key.left,       ".key.move_left"                },
+  { TYPE_KEY,     &sii.key.right,      ".key.move_right"               },
+  { TYPE_KEY,     &sii.key.up,         ".key.move_up"                  },
+  { TYPE_KEY,     &sii.key.down,       ".key.move_down"                },
+  { TYPE_KEY,     &sii.key.snap,       ".key.snap_field"               },
+  { TYPE_KEY,     &sii.key.bomb,       ".key.place_bomb"               },
 
   /* level directory info */
   { TYPE_STRING,  &ldi.name,           "name"                          },
@@ -1501,12 +1512,12 @@ static void setSetupInfoToDefaults(struct SetupInfo *si)
     si->input[i].joy.ylower  = JOYSTICK_YLOWER;
     si->input[i].joy.snap  = (i == 0 ? JOY_BUTTON_1 : 0);
     si->input[i].joy.bomb  = (i == 0 ? JOY_BUTTON_2 : 0);
-    si->input[i].key.left  = (i == 0 ? DEFAULT_KEY_LEFT  : KEY_UNDEFINDED);
-    si->input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KEY_UNDEFINDED);
-    si->input[i].key.up    = (i == 0 ? DEFAULT_KEY_UP    : KEY_UNDEFINDED);
-    si->input[i].key.down  = (i == 0 ? DEFAULT_KEY_DOWN  : KEY_UNDEFINDED);
-    si->input[i].key.snap  = (i == 0 ? DEFAULT_KEY_SNAP  : KEY_UNDEFINDED);
-    si->input[i].key.bomb  = (i == 0 ? DEFAULT_KEY_BOMB  : KEY_UNDEFINDED);
+    si->input[i].key.left  = (i == 0 ? DEFAULT_KEY_LEFT  : KEY_UNDEFINED);
+    si->input[i].key.right = (i == 0 ? DEFAULT_KEY_RIGHT : KEY_UNDEFINED);
+    si->input[i].key.up    = (i == 0 ? DEFAULT_KEY_UP    : KEY_UNDEFINED);
+    si->input[i].key.down  = (i == 0 ? DEFAULT_KEY_DOWN  : KEY_UNDEFINED);
+    si->input[i].key.snap  = (i == 0 ? DEFAULT_KEY_SNAP  : KEY_UNDEFINED);
+    si->input[i].key.bomb  = (i == 0 ? DEFAULT_KEY_BOMB  : KEY_UNDEFINED);
   }
 }
 
@@ -1526,8 +1537,8 @@ static void setSetupInfo(int token_nr, char *token_value)
       *(boolean *)setup_value = get_string_boolean_value(token_value);
       break;
 
-    case TYPE_KEYSYM:
-      *(KeySym *)setup_value = getKeySymFromX11KeyName(token_value);
+    case TYPE_KEY:
+      *(Key *)setup_value = getKeyFromX11KeyName(token_value);
       break;
 
     case TYPE_INTEGER:
@@ -1872,12 +1883,12 @@ static char *getSetupLine(char *prefix, int token_nr)
       strcat(entry, (*(boolean *)setup_value ? "on" : "off"));
       break;
 
-    case TYPE_KEYSYM:
+    case TYPE_KEY:
       {
-       KeySym keysym = *(KeySym *)setup_value;
-       char *keyname = getKeyNameFromKeySym(keysym);
+       Key key = *(Key *)setup_value;
+       char *keyname = getKeyNameFromKey(key);
 
-       strcat(entry, getX11KeyNameFromKeySym(keysym));
+       strcat(entry, getX11KeyNameFromKey(key));
        for (i=strlen(entry); i<50; i++)
          strcat(entry, " ");