rnd-19981229-1
[rocksndiamonds.git] / src / editor.c
index 28d086354f5e5e4860dd9e87d8a7847ef027195d..7c453d92dd8f8090959ce9e4f4e85fe5fba48336 100644 (file)
@@ -48,6 +48,9 @@
 #define RANDOM_USE_PERCENTAGE  0
 #define RANDOM_USE_NUM_OBJECTS 1
 
+/* values for elements with content */
+#define MAX_ELEMCONT           8
+
 /* values for the control window */
 #define ED_CTRL_BUTTONS_GFX_YPOS       236
 #define ED_CTRL_BUTTONS_ALT_GFX_YPOS   142
 #define ED_NUM_CTRL2_BUTTONS   (ED_CTRL2_BUTTONS_HORIZ * ED_CTRL2_BUTTONS_VERT)
 #define ED_NUM_CTRL_BUTTONS    (ED_NUM_CTRL1_BUTTONS + ED_NUM_CTRL2_BUTTONS)
 
+/* values for properties window */
+#define ED_PROPERTIES_XPOS     (TILEX - MINI_TILEX/2)
 /* values for counter gadgets */
 #define ED_COUNT_VALUE_XOFFSET 5
 #define ED_COUNT_VALUE_YOFFSET 3
-#define ED_COUNT_SCORE_XPOS    (TILEX)
+#define ED_COUNT_SCORE_XPOS    ED_PROPERTIES_XPOS
 #define ED_COUNT_SCORE_YPOS    (14 * MINI_TILEY)
-#define ED_COUNT_ELEMCONT_XPOS (TILEX)
+#define ED_COUNT_ELEMCONT_XPOS ED_PROPERTIES_XPOS
 #define ED_COUNT_ELEMCONT_YPOS (17 * MINI_TILEY)
 
 /* values for element content drawing areas */
 #define ED_CTRL_ID_DRAWING_LEVEL       26
 #define ED_CTRL_ID_ELEMCONT_0          27
 #define ED_CTRL_ID_ELEMCONT_7          34
+#define ED_CTRL_ID_AMOEBA_CONTENT      35
 
-#define ED_NUM_GADGETS                 35
+#define ED_NUM_GADGETS                 36
 
 /* values for counter gadgets */
 #define ED_COUNTER_SCORE               0
@@ -137,7 +143,7 @@ static struct
 
 /* forward declaration for internal use */
 static void DrawDrawingWindow();
-static void DrawPropertiesWindow(int);
+static void DrawPropertiesWindow();
 static void CopyLevelToUndoBuffer();
 static void HandleDrawingAreas(struct GadgetInfo *);
 static void HandleCounterButtons(struct GadgetInfo *);
@@ -147,8 +153,9 @@ 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 properties_element = 0;
 
-static short ElementContent[8][3][3];
+static short ElementContent[MAX_ELEMCONT][3][3];
 static short OrigBackup[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 static short UndoBuffer[NUM_UNDO_STEPS][MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 static int undo_buffer_position = 0;
@@ -173,7 +180,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'),
@@ -197,7 +205,7 @@ int editor_element[] =
   EL_BETON,
 
   EL_FELSBODEN,
-  EL_SIEB2_LEER,
+  EL_SIEB2_INAKTIV,
   EL_AUSGANG_ZU,
   EL_AUSGANG_AUF,
 
@@ -244,7 +252,7 @@ int editor_element[] =
   EL_BETON,
   EL_MAUERWERK,
   EL_FELSBODEN,
-  EL_SIEB_LEER,
+  EL_SIEB_INAKTIV,
 
   EL_EDELSTEIN,
   EL_DIAMANT,
@@ -356,6 +364,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'),
@@ -371,6 +384,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'),
@@ -465,7 +543,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);
 
@@ -647,13 +726,15 @@ static void CreateDrawingAreas()
 {
   struct GadgetInfo *gi;
   unsigned long event_mask;
-  int id = ED_CTRL_ID_DRAWING_LEVEL;
+  int id;
   int i;
 
   event_mask =
     GD_EVENT_PRESSED | GD_EVENT_RELEASED | GD_EVENT_MOVING |
     GD_EVENT_OFF_BORDERS;
 
+  /* one for the level drawing area ... */
+  id = ED_CTRL_ID_DRAWING_LEVEL;
   gi = CreateGadget(GDI_CUSTOM_ID, id,
                    GDI_X, SX,
                    GDI_Y, SY,
@@ -670,12 +751,13 @@ static void CreateDrawingAreas()
 
   level_editor_gadget[id] = gi;
 
-  for (i=0; i<8; i++)
+  /* ... up to eight areas for element content ... */
+  for (i=0; i<MAX_ELEMCONT; i++)
   {
-    int id = ED_CTRL_ID_ELEMCONT_0 + i;
     int gx = SX + ED_AREA_ELEMCONT_XPOS + 5 * (i % 4) * MINI_TILEX;
     int gy = SX + ED_AREA_ELEMCONT_YPOS + 6 * (i / 4) * MINI_TILEY;
 
+    id = ED_CTRL_ID_ELEMCONT_0 + i;
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_X, gx,
                      GDI_Y, gy,
@@ -692,6 +774,24 @@ static void CreateDrawingAreas()
 
     level_editor_gadget[id] = gi;
   }
+
+  /* ... and one for the amoeba content */
+  id = ED_CTRL_ID_AMOEBA_CONTENT;
+  gi = CreateGadget(GDI_CUSTOM_ID, id,
+                   GDI_X, SX + ED_AREA_ELEMCONT_XPOS,
+                   GDI_Y, SY + ED_AREA_ELEMCONT_YPOS,
+                   GDI_WIDTH, MINI_TILEX,
+                   GDI_HEIGHT, MINI_TILEY,
+                   GDI_TYPE, GD_TYPE_DRAWING_AREA,
+                   GDI_ITEM_SIZE, MINI_TILEX, MINI_TILEY,
+                   GDI_EVENT_MASK, event_mask,
+                   GDI_CALLBACK, HandleDrawingAreas,
+                   GDI_END);
+
+  if (gi == NULL)
+    Error(ERR_EXIT, "cannot create gadget");
+
+  level_editor_gadget[id] = gi;
 }
 
 static void CreateLevelEditorGadgets()
@@ -761,7 +861,6 @@ void DrawLevelEd()
   level_ypos=-1;
   edit_mode = ED_MODE_DRAWING;
   name_typing = FALSE;
-  element_shift = 0;
 
   CloseDoor(DOOR_CLOSE_ALL);
 
@@ -801,7 +900,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;
 
@@ -1171,8 +1270,12 @@ void LevelEd(int mx, int my, int button)
                         el2gfx(new_element3));
       redraw_mask |= REDRAW_DOOR_1;
 
-      if (edit_mode == ED_MODE_PROPERTIES)
-       DrawPropertiesWindow(new_element);
+      if (!HAS_CONTENT(properties_element))
+      {
+       properties_element = new_element;
+       if (edit_mode == ED_MODE_PROPERTIES)
+         DrawPropertiesWindow();
+      }
     }
   
     if (edit_mode == ED_MODE_DRAWING)  /********** EDIT-FENSTER **********/
@@ -1736,12 +1839,6 @@ static void DrawCounterValueField(int counter_id, int value)
           int2str(value, 3), FS_SMALL, FC_YELLOW);
 }
 
-#define TEXT_COLLECTING                "Score for collecting"
-#define TEXT_SMASHING          "Score for smashing"
-#define TEXT_CRACKING          "Score for cracking"
-#define TEXT_SPEED             "Speed of growth"
-#define TEXT_DURATION          "Duration when activated"
-
 static void DrawDrawingWindow()
 {
   ClearWindow();
@@ -1753,14 +1850,23 @@ static void DrawDrawingWindow()
 
 static void DrawElementContentAreas()
 {
-  static int num_areas = 8;
+  int *num_areas = &MampferMax;
+  int area_x = ED_AREA_ELEMCONT_XPOS / MINI_TILEX;
+  int area_y = ED_AREA_ELEMCONT_YPOS / MINI_TILEY;
+  int area_sx = SX + ED_AREA_ELEMCONT_XPOS;
+  int area_sy = SY + ED_AREA_ELEMCONT_YPOS;
   int i, x, y;
 
-  for (i=0; i<8; i++)
+  for (i=0; i<MAX_ELEMCONT; i++)
+    for (y=0; y<3; y++)
+      for (x=0; x<3; x++)
+       ElementContent[i][x][y] = level.mampfer_inhalt[i][x][y];
+
+  for (i=0; i<MAX_ELEMCONT; i++)
     UnmapDrawingArea(ED_CTRL_ID_ELEMCONT_0 + i);
 
   /* display counter to choose number of element content areas */
-  gadget_areas_value = &num_areas;
+  gadget_areas_value = num_areas;
   DrawCounterValueField(ED_COUNTER_ELEMCONT, *gadget_areas_value);
   x = counter_info[ED_COUNTER_ELEMCONT].x + DXSIZE;
   y = counter_info[ED_COUNTER_ELEMCONT].y;
@@ -1768,56 +1874,92 @@ static void DrawElementContentAreas()
            FC_YELLOW, "number of content areas");
   MapCounterButtons(ED_COUNTER_ELEMCONT);
 
+  /* delete content areas in case of reducing number of them */
   XFillRectangle(display, backbuffer, gc,
-                SX, SY + ED_AREA_ELEMCONT_YPOS - MINI_TILEX,
+                SX, area_sy - MINI_TILEX,
                 SXSIZE, 12 * MINI_TILEY);
 
   /* draw some decorative border for the objects */
-  for (i=0; i<num_areas; i++)
+  for (i=0; i<*num_areas; i++)
   {
     for (y=0; y<4; y++)
       for (x=0; x<4; x++)
-       DrawMiniElement(ED_AREA_ELEMCONT_XPOS / MINI_TILEX + 5 * (i % 4) + x,
-                       ED_AREA_ELEMCONT_YPOS / MINI_TILEY + 6 * (i / 4) + y,
+       DrawMiniElement(area_x + 5 * (i % 4) + x, area_y + 6 * (i / 4) + y,
                        EL_ERDREICH);
 
     XFillRectangle(display, drawto, gc,
-                  SX + ED_AREA_ELEMCONT_XPOS
-                  + 5 * (i % 4) * MINI_TILEX + MINI_TILEX/2 - 1,
-                  SY + ED_AREA_ELEMCONT_YPOS
-                  + 6 * (i / 4) * MINI_TILEY + MINI_TILEY/2 - 1,
+                  area_sx + 5 * (i % 4) * MINI_TILEX + MINI_TILEX/2 - 1,
+                  area_sy + 6 * (i / 4) * MINI_TILEY + MINI_TILEY/2 - 1,
                   3 * MINI_TILEX + 2, 3 * MINI_TILEY + 2);
   }
 
   /* copy border to the right location */
   XCopyArea(display, drawto, drawto, gc,
-           SX + ED_AREA_ELEMCONT_XPOS - MINI_TILEX/2,
-           SY + ED_AREA_ELEMCONT_YPOS - MINI_TILEY/2,
-           (5 * 4 + 1) * MINI_TILEX,
-           12 * MINI_TILEY,
-           SX + ED_AREA_ELEMCONT_XPOS - MINI_TILEX,
-           SY + ED_AREA_ELEMCONT_YPOS - MINI_TILEY);
-
-  for (i=0; i<num_areas; i++)
+           area_sx, area_sy, (5 * 4 + 1) * MINI_TILEX, 12 * MINI_TILEY,
+           area_sx - MINI_TILEX/2, area_sy - MINI_TILEY/2);
+
+  DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 0 * MINI_TILEY + 1,
+          "Content", FS_SMALL, FC_YELLOW);
+  DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 1 * MINI_TILEY + 1,
+          "when", FS_SMALL, FC_YELLOW);
+  DrawText(area_sx + (5 * 4 - 1) * MINI_TILEX, area_sy + 2 * MINI_TILEY + 1,
+          "smashed", FS_SMALL, FC_YELLOW);
+
+  for (i=0; i<*num_areas; i++)
   {
     for (y=0; y<3; y++)
       for (x=0; x<3; x++)
-       DrawMiniElement(ED_AREA_ELEMCONT_XPOS / MINI_TILEX + 5 * (i % 4) + x,
-                       ED_AREA_ELEMCONT_YPOS / MINI_TILEY + 6 * (i / 4) + y,
-                       EL_EDELSTEIN_BD);
-
-    DrawTextF(ED_AREA_ELEMCONT_XPOS
-             + 5 * (i % 4) * MINI_TILEX + MINI_TILEX + 1,
-             ED_AREA_ELEMCONT_YPOS
-             + 6 * (i / 4) * MINI_TILEY + 4 * MINI_TILEY - 4,
+       DrawMiniElement(area_x + 5 * (i % 4) + x, area_y + 6 * (i / 4) + y,
+                       ElementContent[i][x][y]);
+
+    DrawTextF(area_sx - SX + 5 * (i % 4) * MINI_TILEX + MINI_TILEX + 1,
+             area_sy - SY + 6 * (i / 4) * MINI_TILEY + 4 * MINI_TILEY - 4,
              FC_YELLOW, "%d", i + 1);
   }
 
-  for (i=0; i<num_areas; i++)
+  for (i=0; i<*num_areas; i++)
     MapDrawingArea(ED_CTRL_ID_ELEMCONT_0 + i);
 }
 
-static void DrawPropertiesWindow(int element)
+static void DrawAmoebaContentArea()
+{
+  int area_x = ED_AREA_ELEMCONT_XPOS / MINI_TILEX;
+  int area_y = ED_AREA_ELEMCONT_YPOS / MINI_TILEY;
+  int area_sx = SX + ED_AREA_ELEMCONT_XPOS;
+  int area_sy = SY + ED_AREA_ELEMCONT_YPOS;
+  int x, y;
+
+  ElementContent[0][0][0] = level.amoebe_inhalt;
+
+  /* draw decorative border for the object */
+  for (y=0; y<2; y++)
+    for (x=0; x<2; x++)
+      DrawMiniElement(area_x + x, area_y + y, EL_ERDREICH);
+
+  XFillRectangle(display, drawto, gc,
+                area_sx + MINI_TILEX/2 - 1, area_sy + MINI_TILEY/2 - 1,
+                MINI_TILEX + 2, MINI_TILEY + 2);
+
+  /* copy border to the right location */
+  XCopyArea(display, drawto, drawto, gc,
+           area_sx, area_sy, 3 * MINI_TILEX, 3 * MINI_TILEY,
+           area_sx - MINI_TILEX/2, area_sy - MINI_TILEY/2);
+
+  DrawText(area_sx + TILEX, area_sy + 1, "Content of amoeba",
+          FS_SMALL, FC_YELLOW);
+
+  DrawMiniElement(area_x, area_y, ElementContent[0][0][0]);
+
+  MapDrawingArea(ED_CTRL_ID_AMOEBA_CONTENT);
+}
+
+#define TEXT_COLLECTING                "Score for collecting"
+#define TEXT_SMASHING          "Score for smashing"
+#define TEXT_CRACKING          "Score for cracking"
+#define TEXT_SPEED             "Speed of amoeba growth"
+#define TEXT_DURATION          "Duration when activated"
+
+static void DrawPropertiesWindow()
 {
   int i, x, y;
   int num_elements_in_level;
@@ -1867,7 +2009,7 @@ static void DrawPropertiesWindow(int element)
     { 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 }
   };
@@ -1891,23 +2033,23 @@ static void DrawPropertiesWindow(int element)
            2 * TILEX, 2 * TILEY,
            SX + TILEX - MINI_TILEX/2, SY + TILEY - MINI_TILEY/2);
 
-  DrawGraphic(1, 1, el2gfx(element));
+  DrawGraphic(1, 1, el2gfx(properties_element));
   DrawText(SX + 3*TILEX, SY + 5*TILEY/4, "Element Properties",
           FS_SMALL, FC_YELLOW);
 
   num_elements_in_level = 0;
   for (y=0; y<lev_fieldy; y++) 
     for (x=0; x<lev_fieldx; x++)
-      if (Feld[x][y] == element)
+      if (Feld[x][y] == properties_element)
        num_elements_in_level++;
 
-  DrawTextF(TILEX, 5*TILEY, FC_YELLOW, "%d x contained in level",
+  DrawTextF(ED_PROPERTIES_XPOS, 5*TILEY, FC_YELLOW, "%d x contained in level",
            num_elements_in_level);
 
   /* check if there are elements where a score can be chosen for */
   for (i=0; elements_with_counter[i].element != -1; i++)
   {
-    if (elements_with_counter[i].element == element)
+    if (elements_with_counter[i].element == properties_element)
     {
       int x = counter_info[ED_COUNTER_SCORE].x + DXSIZE;
       int y = counter_info[ED_COUNTER_SCORE].y;
@@ -1921,7 +2063,13 @@ static void DrawPropertiesWindow(int element)
     }
   }
 
-  DrawElementContentAreas();
+  if (HAS_CONTENT(properties_element))
+  {
+    if (IS_AMOEBOID(properties_element))
+      DrawAmoebaContentArea();
+    else
+      DrawElementContentAreas();
+  }
 }
 
 static void swap_numbers(int *i1, int *i2)
@@ -2306,10 +2454,11 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
 {
   static boolean started_inside_drawing_area = FALSE;
   static boolean draw_with_brush = FALSE;
+  int id = gi->custom_id;
   boolean inside_drawing_area = !gi->event.off_borders;
   boolean button_press_event;
   boolean button_release_event;
-  boolean draw_level = (gi->custom_id == ED_CTRL_ID_DRAWING_LEVEL);
+  boolean draw_level = (id == ED_CTRL_ID_DRAWING_LEVEL);
   int new_element;
   int button = gi->event.button;
   int sx = gi->event.x, sy = gi->event.y;
@@ -2404,6 +2553,12 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
                           gi->x + sx * MINI_TILEX,
                           gi->y + sy * MINI_TILEY,
                           el2gfx(new_element));
+
+       if (id == ED_CTRL_ID_AMOEBA_CONTENT)
+         level.amoebe_inhalt = new_element;
+       else if (id >= ED_CTRL_ID_ELEMCONT_0 && id <= ED_CTRL_ID_ELEMCONT_7)
+         level.mampfer_inhalt[id - ED_CTRL_ID_ELEMCONT_0][sx][sy] =
+           new_element;
       }
       break;
 
@@ -2516,8 +2671,8 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
       *gadget_areas_value += (id == ED_CTRL_ID_ELEMCONT_DOWN ? -step : step);
       if (*gadget_areas_value < 1)
        *gadget_areas_value = 1;
-      else if (*gadget_areas_value > 8)
-       *gadget_areas_value = 8;
+      else if (*gadget_areas_value > MAX_ELEMCONT)
+       *gadget_areas_value = MAX_ELEMCONT;
 
       DrawCounterValueField(ED_COUNTER_ELEMCONT, *gadget_areas_value);
       DrawElementContentAreas();
@@ -2629,7 +2784,8 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       break;
 
     case ED_CTRL_ID_PROPERTIES:
-      DrawPropertiesWindow(new_element);
+      properties_element = new_element;
+      DrawPropertiesWindow();
       edit_mode = ED_MODE_PROPERTIES;
       break;
 
@@ -2662,8 +2818,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
       }
       else
       {
-       AdjustLevelScrollPosition();
-       DrawMiniLevel(level_xpos, level_ypos);
+       DrawDrawingWindow();
        edit_mode = ED_MODE_DRAWING;
       }
       break;
@@ -2689,7 +2844,7 @@ static void HandleControlButtons(struct GadgetInfo *gi)
          if (Feld[x][y] != Ur[x][y])
            level_changed = TRUE;
 
-      if (!level_changed)
+      if (0 && !level_changed)
       {
        Request("Level has not changed !", REQ_CONFIRM);
        break;