rnd-19990104-1
[rocksndiamonds.git] / src / editor.c
index f1536aae7f21bab53460c7d0641af207f671c513..1e4d4f5f33df68ab649e41bb75a9611c7b802d61 100644 (file)
 #define ED_CTRL_ID_RANDOM_PLACEMENT    12
 #define ED_CTRL_ID_BRUSH               13
 #define ED_CTRL_ID_WRAP_DOWN           14
-#define ED_CTRL_ID_UNUSED2             15
+#define ED_CTRL_ID_PICK_ELEMENT                15
 #define ED_CTRL_ID_UNDO                        16
 #define ED_CTRL_ID_INFO                        17
 #define ED_CTRL_ID_SAVE                        18
@@ -153,6 +153,7 @@ static struct GadgetInfo *level_editor_gadget[ED_NUM_GADGETS];
 static boolean level_editor_gadgets_created = FALSE;
 
 static int drawing_function = ED_CTRL_ID_SINGLE_ITEMS;
+static int last_drawing_function = ED_CTRL_ID_SINGLE_ITEMS;
 static int properties_element = 0;
 
 static short ElementContent[MAX_ELEMCONT][3][3];
@@ -180,7 +181,8 @@ static int new_element1 = EL_MAUERWERK;
 static int new_element2 = EL_LEERRAUM;
 static int new_element3 = EL_ERDREICH;
 
-int element_shift;
+int element_shift = 0;
+
 int editor_element[] =
 {
   EL_CHAR_A + ('B' - 'A'),
@@ -204,7 +206,7 @@ int editor_element[] =
   EL_BETON,
 
   EL_FELSBODEN,
-  EL_SIEB2_LEER,
+  EL_SIEB2_INAKTIV,
   EL_AUSGANG_ZU,
   EL_AUSGANG_AUF,
 
@@ -251,7 +253,7 @@ int editor_element[] =
   EL_BETON,
   EL_MAUERWERK,
   EL_FELSBODEN,
-  EL_SIEB_LEER,
+  EL_SIEB_INAKTIV,
 
   EL_EDELSTEIN,
   EL_DIAMANT,
@@ -363,6 +365,11 @@ int editor_element[] =
   EL_MAUER_Y,
   EL_MAUER_XY,
 
+  EL_SPEED_PILL,
+  EL_LEERRAUM,
+  EL_LEERRAUM,
+  EL_LEERRAUM,
+
   EL_CHAR_A + ('S' - 'A'),
   EL_CHAR_A + ('O' - 'A'),
   EL_CHAR_A + ('K' - 'A'),
@@ -378,6 +385,71 @@ int editor_element[] =
   EL_SOKOBAN_FELD_VOLL,
   EL_BETON,
 
+  EL_LEERRAUM,
+  EL_LEERRAUM,
+  EL_LEERRAUM,
+  EL_LEERRAUM,
+
+  EL_CHAR('S'),
+  EL_CHAR('U'),
+  EL_CHAR('P'),
+  EL_CHAR('A'),
+
+  EL_CHAR('P'),
+  EL_CHAR('L'),
+  EL_CHAR('E'),
+  EL_CHAR('X'),
+
+  EL_SP_EMPTY,
+  EL_SP_ZONK,
+  EL_SP_BASE,
+  EL_SP_MURPHY,
+
+  EL_SP_INFOTRON,
+  EL_SP_CHIP_SINGLE,
+  EL_SP_HARD_GRAY,
+  EL_SP_EXIT,
+
+  EL_SP_DISK_ORANGE,
+  EL_SP_PORT1_RIGHT,
+  EL_SP_PORT1_DOWN,
+  EL_SP_PORT1_LEFT,
+
+  EL_SP_PORT1_UP,
+  EL_SP_PORT2_RIGHT,
+  EL_SP_PORT2_DOWN,
+  EL_SP_PORT2_LEFT,
+
+  EL_SP_PORT2_UP,
+  EL_SP_SNIKSNAK,
+  EL_SP_DISK_YELLOW,
+  EL_SP_TERMINAL,
+
+  EL_SP_DISK_RED,
+  EL_SP_PORT_Y,
+  EL_SP_PORT_X,
+  EL_SP_PORT_XY,
+
+  EL_SP_ELECTRON,
+  EL_SP_BUG,
+  EL_SP_CHIP_LEFT,
+  EL_SP_CHIP_RIGHT,
+
+  EL_SP_HARD_BASE1,
+  EL_SP_HARD_GREEN,
+  EL_SP_HARD_BLUE,
+  EL_SP_HARD_RED,
+
+  EL_SP_HARD_YELLOW,
+  EL_SP_HARD_BASE2,
+  EL_SP_HARD_BASE3,
+  EL_SP_HARD_BASE4,
+
+  EL_SP_HARD_BASE5,
+  EL_SP_HARD_BASE6,
+  EL_SP_CHIP_UPPER,
+  EL_SP_CHIP_LOWER,
+
 /*
   EL_CHAR_A + ('D' - 'A'),
   EL_CHAR_A + ('Y' - 'A'),
@@ -472,7 +544,8 @@ int editor_element[] =
 
   EL_CHAR_OE,
   EL_CHAR_UE,
-  EL_CHAR_COPY
+  EL_CHAR_COPY,
+  EL_LEERRAUM
 };
 int elements_in_list = sizeof(editor_element)/sizeof(int);
 
@@ -535,7 +608,8 @@ static void CreateControlButtons()
        id == ED_CTRL_ID_RECTANGLE ||
        id == ED_CTRL_ID_FILLED_BOX ||
        id == ED_CTRL_ID_FLOOD_FILL ||
-       id == ED_CTRL_ID_BRUSH)
+       id == ED_CTRL_ID_BRUSH ||
+       id == ED_CTRL_ID_PICK_ELEMENT)
     {
       button_type = GD_TYPE_RADIO_BUTTON;
       radio_button_nr = 1;
@@ -789,7 +863,6 @@ void DrawLevelEd()
   level_ypos=-1;
   edit_mode = ED_MODE_DRAWING;
   name_typing = FALSE;
-  element_shift = 0;
 
   CloseDoor(DOOR_CLOSE_ALL);
 
@@ -829,7 +902,7 @@ void DrawLevelEd()
   for(i=0;i<MAX_ELEM_X*MAX_ELEM_Y;i++)
   {
     if (i < elements_in_list)
-      graphic = el2gfx(editor_element[i]);
+      graphic = el2gfx(editor_element[i + element_shift]);
     else
       graphic = GFX_LEERRAUM;
 
@@ -1078,6 +1151,39 @@ void AdjustLevelScrollPosition()
     level_ypos = -1;
 }
 
+static void PickDrawingElement(int button, int element)
+{
+  if (button < 1 || button > 3)
+    return;
+
+  if (button == 1)
+  {
+    new_element1 = element;
+    DrawMiniGraphicExt(drawto, gc,
+                      DX + ED_WIN_MB_LEFT_XPOS,
+                      DY + ED_WIN_MB_LEFT_YPOS,
+                      el2gfx(new_element1));
+  }
+  else if (button == 2)
+  {
+    new_element2 = element;
+    DrawMiniGraphicExt(drawto, gc,
+                      DX + ED_WIN_MB_MIDDLE_XPOS,
+                      DY + ED_WIN_MB_MIDDLE_YPOS,
+                      el2gfx(new_element2));
+  }
+  else
+  {
+    new_element3 = element;
+    DrawMiniGraphicExt(drawto, gc,
+                      DX + ED_WIN_MB_RIGHT_XPOS,
+                      DY + ED_WIN_MB_RIGHT_YPOS,
+                      el2gfx(new_element3));
+  }
+
+  redraw_mask |= REDRAW_DOOR_1;
+}
+
 void LevelEd(int mx, int my, int button)
 {
   static int last_button = 0;
@@ -1178,26 +1284,7 @@ void LevelEd(int mx, int my, int button)
       else
        new_element = EL_LEERRAUM;
 
-      if (last_button==1)
-       new_element1 = new_element;
-      else if (last_button==2)
-       new_element2 = new_element;
-      else if (last_button==3)
-       new_element3 = new_element;
-
-      DrawMiniGraphicExt(drawto,gc,
-                        DX+ED_WIN_MB_LEFT_XPOS,
-                        DY+ED_WIN_MB_LEFT_YPOS,
-                        el2gfx(new_element1));
-      DrawMiniGraphicExt(drawto,gc,
-                        DX+ED_WIN_MB_MIDDLE_XPOS,
-                        DY+ED_WIN_MB_MIDDLE_YPOS,
-                        el2gfx(new_element2));
-      DrawMiniGraphicExt(drawto,gc,
-                        DX+ED_WIN_MB_RIGHT_XPOS,
-                        DY+ED_WIN_MB_RIGHT_YPOS,
-                        el2gfx(new_element3));
-      redraw_mask |= REDRAW_DOOR_1;
+      PickDrawingElement(last_button, new_element);
 
       if (!HAS_CONTENT(properties_element))
       {
@@ -1938,7 +2025,7 @@ static void DrawPropertiesWindow()
     { EL_AMOEBE_NORM,  &level.tempo_amoebe,    TEXT_SPEED },
     { EL_AMOEBE_VOLL,  &level.tempo_amoebe,    TEXT_SPEED },
     { EL_AMOEBE_BD,    &level.tempo_amoebe,    TEXT_SPEED },
-    { EL_SIEB_LEER,    &level.dauer_sieb,      TEXT_DURATION },
+    { EL_SIEB_INAKTIV, &level.dauer_sieb,      TEXT_DURATION },
     { EL_ABLENK_AUS,   &level.dauer_ablenk,    TEXT_DURATION },
     { -1, NULL, NULL }
   };
@@ -2571,6 +2658,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
       }
       break;
 
+    case ED_CTRL_ID_PICK_ELEMENT:
+      if (button_press_event)
+       PickDrawingElement(button, Feld[lx][ly]);
+      if (button_release_event)
+       ClickOnGadget(level_editor_gadget[last_drawing_function]);
+      break;
+
     default:
       break;
   }
@@ -2645,6 +2739,8 @@ static void HandleControlButtons(struct GadgetInfo *gi)
     case ED_CTRL_ID_FILLED_BOX:
     case ED_CTRL_ID_FLOOD_FILL:
     case ED_CTRL_ID_BRUSH:
+    case ED_CTRL_ID_PICK_ELEMENT:
+      last_drawing_function = drawing_function;
       drawing_function = id;
       break;