rnd-19990214-3
[rocksndiamonds.git] / src / editor.c
index 23f12d071424b82cc6c5ebf0ac9100ed114d9938..a74d702c58d2c19539b79bcdac92ecd1380f415f 100644 (file)
 #define GADGET_ID_RANDOM_QUANTITY      107
 #define GADGET_ID_RANDOM_RESTRICTED    108
 #define GADGET_ID_DOUBLE_SPEED         109
-#define GADGET_ID_STICK_ELEMENT                110
+#define GADGET_ID_GRAVITY              110
+#define GADGET_ID_STICK_ELEMENT                111
 
 /* another drawing area for random placement */
-#define GADGET_ID_RANDOM_BACKGROUND    111
+#define GADGET_ID_RANDOM_BACKGROUND    112
 
-#define NUM_EDITOR_GADGETS             112
+#define NUM_EDITOR_GADGETS             113
 
 /* radio button numbers */
 #define RADIO_NR_NONE                  0
 
 /* values for checkbutton gadgets */
 #define ED_CHECKBUTTON_ID_DOUBLE_SPEED         0
-#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    1
-#define ED_CHECKBUTTON_ID_STICK_ELEMENT                2
+#define ED_CHECKBUTTON_ID_GRAVITY              1
+#define ED_CHECKBUTTON_ID_RANDOM_RESTRICTED    2
+#define ED_CHECKBUTTON_ID_STICK_ELEMENT                3
 
-#define ED_NUM_CHECKBUTTONS                    3
+#define ED_NUM_CHECKBUTTONS                    4
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_DOUBLE_SPEED
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
@@ -594,6 +596,12 @@ static struct
     &level.double_speed,
     "double speed movement",           "set movement speed of player"
   },
+  {
+    ED_SETTINGS_XPOS + 340,            ED_COUNTER_YPOS(6) - MINI_TILEY,
+    GADGET_ID_GRAVITY,
+    &level.gravity,
+    "gravity",                         "set level gravity"
+  },
   {
     ED_SETTINGS_XPOS,                  ED_COUNTER2_YPOS(9) - MINI_TILEY,
     GADGET_ID_RANDOM_RESTRICTED,
@@ -661,20 +669,20 @@ int element_shift = 0;
 
 int editor_element[] =
 {
-  EL_CHAR_A + ('B' - 'A'),
-  EL_CHAR_A + ('O' - 'A'),
-  EL_CHAR_A + ('U' - 'A'),
-  EL_CHAR_A + ('L' - 'A'),
+  EL_CHAR('B'),
+  EL_CHAR('O'),
+  EL_CHAR('U'),
+  EL_CHAR('L'),
 
   EL_CHAR_MINUS,
-  EL_CHAR_A + ('D' - 'A'),
-  EL_CHAR_A + ('E' - 'A'),
-  EL_CHAR_A + ('R' - 'A'),
+  EL_CHAR('D'),
+  EL_CHAR('E'),
+  EL_CHAR('R'),
 
-  EL_CHAR_A + ('D' - 'A'),
-  EL_CHAR_A + ('A' - 'A'),
-  EL_CHAR_A + ('S' - 'A'),
-  EL_CHAR_A + ('H' - 'A'),
+  EL_CHAR('D'),
+  EL_CHAR('A'),
+  EL_CHAR('S'),
+  EL_CHAR('H'),
 
   EL_SPIELFIGUR,
   EL_LEERRAUM,
@@ -701,20 +709,20 @@ int editor_element[] =
   EL_FIREFLY_U,
   EL_LEERRAUM,
 
-  EL_CHAR_A + ('E' - 'A'),
-  EL_CHAR_A + ('M' - 'A'),
-  EL_CHAR_A + ('E' - 'A'),
+  EL_CHAR('E'),
+  EL_CHAR('M'),
+  EL_CHAR('E'),
   EL_CHAR_MINUS,
 
-  EL_CHAR_A + ('R' - 'A'),
-  EL_CHAR_A + ('A' - 'A'),
-  EL_CHAR_A + ('L' - 'A'),
-  EL_CHAR_A + ('D' - 'A'),
+  EL_CHAR('R'),
+  EL_CHAR('A'),
+  EL_CHAR('L'),
+  EL_CHAR('D'),
 
-  EL_CHAR_A + ('M' - 'A'),
-  EL_CHAR_A + ('I' - 'A'),
-  EL_CHAR_A + ('N' - 'A'),
-  EL_CHAR_A + ('E' - 'A'),
+  EL_CHAR('M'),
+  EL_CHAR('I'),
+  EL_CHAR('N'),
+  EL_CHAR('E'),
 
   EL_SPIELER1,
   EL_SPIELER2,
@@ -776,6 +784,26 @@ int editor_element[] =
   EL_AMOEBE_NASS,
   EL_AMOEBE_NORM,
 
+  EL_EM_KEY_1_FILE,
+  EL_EM_KEY_2_FILE,
+  EL_EM_KEY_3_FILE,
+  EL_EM_KEY_4_FILE,
+
+  EL_EM_GATE_1,
+  EL_EM_GATE_2,
+  EL_EM_GATE_3,
+  EL_EM_GATE_4,
+
+  EL_EM_GATE_1X,
+  EL_EM_GATE_2X,
+  EL_EM_GATE_3X,
+  EL_EM_GATE_4X,
+
+  EL_CHAR('M'),
+  EL_CHAR('O'),
+  EL_CHAR('R'),
+  EL_CHAR('E'),
+
   EL_SCHLUESSEL1,
   EL_SCHLUESSEL2,
   EL_SCHLUESSEL3,
@@ -791,11 +819,6 @@ int editor_element[] =
   EL_PFORTE3X,
   EL_PFORTE4X,
 
-  EL_CHAR_A + ('M' - 'A'),
-  EL_CHAR_A + ('O' - 'A'),
-  EL_CHAR_A + ('R' - 'A'),
-  EL_CHAR_A + ('E' - 'A'),
-
   EL_PFEIL_L,
   EL_PFEIL_R,
   EL_PFEIL_O,
@@ -846,15 +869,15 @@ int editor_element[] =
   EL_SPEED_PILL,
   EL_BLACK_ORB,
 
-  EL_CHAR_A + ('S' - 'A'),
-  EL_CHAR_A + ('O' - 'A'),
-  EL_CHAR_A + ('K' - 'A'),
-  EL_CHAR_A + ('O' - 'A'),
+  EL_CHAR('S'),
+  EL_CHAR('O'),
+  EL_CHAR('K'),
+  EL_CHAR('O'),
 
   EL_CHAR_MINUS,
-  EL_CHAR_A + ('B' - 'A'),
-  EL_CHAR_A + ('A' - 'A'),
-  EL_CHAR_A + ('N' - 'A'),
+  EL_CHAR('B'),
+  EL_CHAR('A'),
+  EL_CHAR('N'),
 
   EL_SOKOBAN_OBJEKT,
   EL_SOKOBAN_FELD_LEER,
@@ -927,20 +950,20 @@ int editor_element[] =
   EL_SP_CHIP_LOWER,
 
   /*
-  EL_CHAR_A + ('D' - 'A'),
-  EL_CHAR_A + ('Y' - 'A'),
-  EL_CHAR_A + ('N' - 'A'),
-  EL_CHAR_A + ('A' - 'A'),
+  EL_CHAR('D'),
+  EL_CHAR('Y'),
+  EL_CHAR('N'),
+  EL_CHAR('A'),
 
-  EL_CHAR_A + ('B' - 'A'),
-  EL_CHAR_A + ('L' - 'A'),
-  EL_CHAR_A + ('A' - 'A'),
-  EL_CHAR_A + ('S' - 'A'),
+  EL_CHAR('B'),
+  EL_CHAR('L'),
+  EL_CHAR('A'),
+  EL_CHAR('S'),
 
   EL_CHAR_MINUS,
-  EL_CHAR_A + ('T' - 'A'),
-  EL_CHAR_A + ('E' - 'A'),
-  EL_CHAR_A + ('R' - 'A'),
+  EL_CHAR('T'),
+  EL_CHAR('E'),
+  EL_CHAR('R'),
   */
 
   EL_LEERRAUM,
@@ -2318,6 +2341,10 @@ static void DrawPropertiesWindow()
     { EL_SCHLUESSEL2,  &level.score[9],        TEXT_COLLECTING },
     { EL_SCHLUESSEL3,  &level.score[9],        TEXT_COLLECTING },
     { EL_SCHLUESSEL4,  &level.score[9],        TEXT_COLLECTING },
+    { EL_EM_KEY_1_FILE,        &level.score[9],        TEXT_COLLECTING },
+    { EL_EM_KEY_2_FILE,        &level.score[9],        TEXT_COLLECTING },
+    { EL_EM_KEY_3_FILE,        &level.score[9],        TEXT_COLLECTING },
+    { EL_EM_KEY_4_FILE,        &level.score[9],        TEXT_COLLECTING },
     { EL_AMOEBE_NASS,  &level.tempo_amoebe,    TEXT_SPEED },
     { EL_AMOEBE_NORM,  &level.tempo_amoebe,    TEXT_SPEED },
     { EL_AMOEBE_VOLL,  &level.tempo_amoebe,    TEXT_SPEED },
@@ -2814,21 +2841,22 @@ static void FloodFill(int from_x, int from_y, int fill_element)
 }
 
 /* values for DrawLevelText() modes */
-#define TEXT_INIT      0
-#define TEXT_SETCURSOR 1
-#define TEXT_WRITECHAR 2
-#define TEXT_BACKSPACE 3
-#define TEXT_NEWLINE   4
-#define TEXT_END       5
+#define TEXT_INIT              0
+#define TEXT_SETCURSOR         1
+#define TEXT_WRITECHAR         2
+#define TEXT_BACKSPACE         3
+#define TEXT_NEWLINE           4
+#define TEXT_END               5
+#define TEXT_QUERY_TYPING      6
 
-static void DrawLevelText(int sx, int sy, char letter, int mode)
+static int DrawLevelText(int sx, int sy, char letter, int mode)
 {
   static short delete_buffer[MAX_LEV_FIELDX];
   static int start_sx, start_sy;
   static int last_sx, last_sy;
   static boolean typing = FALSE;
   int letter_element = EL_CHAR_ASCII0 + letter;
-  int lx, ly;
+  int lx = 0, ly = 0;
 
   /* map lower case letters to upper case and convert special characters */
   if (letter >= 'a' && letter <= 'z')
@@ -2847,7 +2875,7 @@ static void DrawLevelText(int sx, int sy, char letter, int mode)
   if (mode != TEXT_INIT)
   {
     if (!typing)
-      return;
+      return FALSE;
 
     if (mode != TEXT_SETCURSOR)
     {
@@ -2897,7 +2925,7 @@ static void DrawLevelText(int sx, int sy, char letter, int mode)
       if (sx > start_sx)
       {
        Feld[lx - 1][ly] = delete_buffer[sx - start_sx - 1];
-       DrawMiniElement(sx - 1, sy, new_element3);
+       DrawMiniElement(sx - 1, sy, Feld[lx - 1][ly]);
        DrawLevelText(sx - 1, sy, 0, TEXT_SETCURSOR);
       }
       break;
@@ -2915,9 +2943,14 @@ static void DrawLevelText(int sx, int sy, char letter, int mode)
       typing = FALSE;
       break;
 
+    case TEXT_QUERY_TYPING:
+      break;
+
     default:
       break;
   }
+
+  return typing;
 }
 
 static void SetTextCursor(int unused_sx, int unused_sy, int sx, int sy,
@@ -3069,7 +3102,7 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   int sx = gi->event.x, sy = gi->event.y;
   int min_sx = 0, min_sy = 0;
   int max_sx = gi->drawing.area_xsize - 1, max_sy = gi->drawing.area_ysize - 1;
-  int lx, ly;
+  int lx = 0, ly = 0;
   int min_lx = 0, min_ly = 0;
   int max_lx = lev_fieldx - 1, max_ly = lev_fieldy - 1;
   int x, y;
@@ -3789,6 +3822,10 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       *checkbutton_info[ED_CHECKBUTTON_ID_DOUBLE_SPEED].value ^= TRUE;
       break;
 
+    case GADGET_ID_GRAVITY:
+      *checkbutton_info[ED_CHECKBUTTON_ID_GRAVITY].value ^= TRUE;
+      break;
+
     case GADGET_ID_STICK_ELEMENT:
       *checkbutton_info[ED_CHECKBUTTON_ID_STICK_ELEMENT].value ^= TRUE;
       break;
@@ -3832,7 +3869,8 @@ void HandleLevelEditorKeyInput(KeySym key)
   char letter = getCharFromKeySym(key);
   int button = MB_LEFT;
 
-  if (drawing_function == GADGET_ID_TEXT)
+  if (drawing_function == GADGET_ID_TEXT &&
+      DrawLevelText(0, 0, 0, TEXT_QUERY_TYPING) == TRUE)
   {
     if (letter)
       DrawLevelText(0, 0, letter, TEXT_WRITECHAR);