Merge branch 'master' into releases
[rocksndiamonds.git] / src / editor.c
index 1a1a8527762225cd1d506c76629e4d29ff6c2cdf..8c1302cc0232b150bc5c004b6bccd13bbd16df36 100644 (file)
@@ -879,6 +879,9 @@ static struct
   char *text;
 } control_info[ED_NUM_CTRL_BUTTONS] =
 {
+  /* note: some additional characters are already reserved for "cheat mode"
+     shortcuts (":XYZ" style) -- for details, see "events.c" */
+
   { 's',       "draw single items"                     },
   { 'd',       "draw connected items"                  },
   { 'l',       "draw lines"                            },
@@ -1256,6 +1259,7 @@ static struct ValueTextInfo options_access_protected[] =
 
 static struct ValueTextInfo options_access_direction[] =
 {
+  { MV_NO_DIRECTIONS,          "no direction"                  },
   { MV_LEFT,                   "left"                          },
   { MV_RIGHT,                  "right"                         },
   { MV_UP,                     "up"                            },
@@ -1327,6 +1331,7 @@ static struct ValueTextInfo options_move_direction[] =
 
 static struct ValueTextInfo options_move_stepsize[] =
 {
+  { 0,                         "not moving"                    },
   { 1,                         "very slow"                     },
   { 2,                         "slow"                          },
   { 4,                         "normal"                        },
@@ -1426,22 +1431,22 @@ static struct ValueTextInfo options_change_direct_action[] =
 
 static struct ValueTextInfo options_change_other_action[] =
 {
-  { CE_OTHER_GETS_TOUCHED,     "player touches"                },
-  { CE_OTHER_GETS_PRESSED,     "player presses"                },
-  { CE_OTHER_GETS_PUSHED,      "player pushes"                 },
-  { CE_OTHER_GETS_ENTERED,     "player enters"                 },
-  { CE_OTHER_GETS_LEFT,                "player leaves"                 },
-  { CE_OTHER_GETS_DIGGED,      "player digs"                   },
-  { CE_OTHER_GETS_COLLECTED,   "player collects"               },
-  { CE_OTHER_GETS_DROPPED,     "player drops/throws"           },
-  { CE_OTHER_IS_TOUCHING,      "touching"                      },
+  { CE_PLAYER_TOUCHES_X,       "player touches"                },
+  { CE_PLAYER_PRESSES_X,       "player presses"                },
+  { CE_PLAYER_PUSHES_X,                "player pushes"                 },
+  { CE_PLAYER_ENTERS_X,                "player enters"                 },
+  { CE_PLAYER_LEAVES_X,                "player leaves"                 },
+  { CE_PLAYER_DIGS_X,          "player digs"                   },
+  { CE_PLAYER_COLLECTS_X,      "player collects"               },
+  { CE_PLAYER_DROPS_X,         "player drops/throws"           },
+  { CE_TOUCHING_X,             "touching"                      },
 #if 1
-  { CE_OTHER_IS_HITTING,       "hitting"                       },
-  { CE_OTHER_GETS_HIT,         "hit by"                        },
+  { CE_HITTING_X,              "hitting"                       },
+  { CE_HIT_BY_X,               "hit by"                        },
 #endif
-  { CE_OTHER_IS_SWITCHING,     "switch of"                     },
-  { CE_OTHER_IS_CHANGING,      "change by page of"             },
-  { CE_OTHER_IS_EXPLODING,     "explosion of"                  },
+  { CE_SWITCH_OF_X,            "switch of"                     },
+  { CE_CHANGE_OF_X,            "change by page of"             },
+  { CE_EXPLOSION_OF_X,         "explosion of"                  },
 
   { -1,                                NULL                            }
 };
@@ -2718,20 +2723,20 @@ static int editor_hl_emerald_mine_club[] =
 
 static int editor_el_emerald_mine_club[] =
 {
-  EL_EM_KEY_5,
-  EL_EM_KEY_6,
-  EL_EM_KEY_7,
-  EL_EM_KEY_8,
+  EL_EMC_KEY_5,
+  EL_EMC_KEY_6,
+  EL_EMC_KEY_7,
+  EL_EMC_KEY_8,
 
-  EL_EM_GATE_5,
-  EL_EM_GATE_6,
-  EL_EM_GATE_7,
-  EL_EM_GATE_8,
+  EL_EMC_GATE_5,
+  EL_EMC_GATE_6,
+  EL_EMC_GATE_7,
+  EL_EMC_GATE_8,
 
-  EL_EM_GATE_5_GRAY,
-  EL_EM_GATE_6_GRAY,
-  EL_EM_GATE_7_GRAY,
-  EL_EM_GATE_8_GRAY,
+  EL_EMC_GATE_5_GRAY,
+  EL_EMC_GATE_6_GRAY,
+  EL_EMC_GATE_7_GRAY,
+  EL_EMC_GATE_8_GRAY,
 
   EL_EMC_STEELWALL_1,
   EL_EMC_STEELWALL_2,
@@ -2763,10 +2768,18 @@ static int editor_el_emerald_mine_club[] =
   EL_EMC_WALL_11,
   EL_EMC_WALL_12,
 
+#if RELEASE_312
+  EL_EMPTY,
+#else
   EL_EMC_ANDROID,
+#endif
   EL_BALLOON,
   EL_BALLOON_SWITCH_ANY,
+#if RELEASE_312
+  EL_EMPTY,
+#else
   EL_BALLOON_SWITCH_NONE,
+#endif
 
   EL_BALLOON_SWITCH_LEFT,
   EL_BALLOON_SWITCH_RIGHT,
@@ -2775,16 +2788,34 @@ static int editor_el_emerald_mine_club[] =
 
   EL_EMC_GRASS,
   EL_EMC_PLANT,
+#if RELEASE_312
+  EL_EMPTY,
+  EL_EMPTY,
+#else
   EL_EMC_LENSES,
   EL_EMC_MAGNIFIER,
+#endif
 
+#if RELEASE_312
+  EL_EMPTY,
+  EL_EMPTY,
+#else
   EL_EMC_MAGIC_BALL,
   EL_EMC_MAGIC_BALL_SWITCH,
+#endif
   EL_SPRING,
+#if RELEASE_312
+  EL_EMPTY,
+#else
   EL_EMC_SPRING_BUMPER,
+#endif
 
-  EL_EMC_DRIPPER,
+#if RELEASE_312
   EL_EMPTY,
+#else
+  EL_EMC_DRIPPER,
+#endif
+  EL_EMC_FAKE_GRASS,
   EL_EMPTY,
   EL_EMPTY,
 };
@@ -6172,20 +6203,20 @@ static void CopyCustomElementPropertiesToEditor(int element)
 
   /* set "change by other element action" selectbox help value */
   custom_element_change.other_action =
-    (HAS_CHANGE_EVENT(element, CE_OTHER_GETS_TOUCHED) ? CE_OTHER_GETS_TOUCHED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PRESSED) ? CE_OTHER_GETS_PRESSED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_PUSHED) ? CE_OTHER_GETS_PUSHED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_ENTERED) ? CE_OTHER_GETS_ENTERED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_LEFT) ? CE_OTHER_GETS_LEFT :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DIGGED) ? CE_OTHER_GETS_DIGGED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_COLLECTED) ? CE_OTHER_GETS_COLLECTED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_DROPPED) ? CE_OTHER_GETS_DROPPED :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_TOUCHING) ? CE_OTHER_IS_TOUCHING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_HITTING) ? CE_OTHER_IS_HITTING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_GETS_HIT) ? CE_OTHER_GETS_HIT :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_SWITCHING) ? CE_OTHER_IS_SWITCHING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_CHANGING) ? CE_OTHER_IS_CHANGING :
-     HAS_CHANGE_EVENT(element, CE_OTHER_IS_EXPLODING) ? CE_OTHER_IS_EXPLODING :
+    (HAS_CHANGE_EVENT(element, CE_PLAYER_TOUCHES_X) ? CE_PLAYER_TOUCHES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_PRESSES_X) ? CE_PLAYER_PRESSES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_PUSHES_X) ? CE_PLAYER_PUSHES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_ENTERS_X) ? CE_PLAYER_ENTERS_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_LEAVES_X) ? CE_PLAYER_LEAVES_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_DIGS_X) ? CE_PLAYER_DIGS_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_COLLECTS_X) ? CE_PLAYER_COLLECTS_X :
+     HAS_CHANGE_EVENT(element, CE_PLAYER_DROPS_X) ? CE_PLAYER_DROPS_X :
+     HAS_CHANGE_EVENT(element, CE_TOUCHING_X) ? CE_TOUCHING_X :
+     HAS_CHANGE_EVENT(element, CE_HITTING_X) ? CE_HITTING_X :
+     HAS_CHANGE_EVENT(element, CE_HIT_BY_X) ? CE_HIT_BY_X :
+     HAS_CHANGE_EVENT(element, CE_SWITCH_OF_X) ? CE_SWITCH_OF_X :
+     HAS_CHANGE_EVENT(element, CE_CHANGE_OF_X) ? CE_CHANGE_OF_X :
+     HAS_CHANGE_EVENT(element, CE_EXPLOSION_OF_X) ? CE_EXPLOSION_OF_X :
      custom_element_change.other_action);
 }
 
@@ -6361,20 +6392,20 @@ static void CopyCustomElementPropertiesToGame(int element)
     custom_element_change_events[CE_BY_DIRECT_ACTION];
 
   /* set other element action change event from checkbox and selectbox */
-  custom_element_change_events[CE_OTHER_GETS_TOUCHED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_PRESSED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_PUSHED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_ENTERED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_LEFT] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_DIGGED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_COLLECTED] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_DROPPED] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_TOUCHING] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_HITTING] = FALSE;
-  custom_element_change_events[CE_OTHER_GETS_HIT] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_SWITCHING] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_CHANGING] = FALSE;
-  custom_element_change_events[CE_OTHER_IS_EXPLODING] = FALSE;
+  custom_element_change_events[CE_PLAYER_TOUCHES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_PRESSES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_PUSHES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_ENTERS_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_LEAVES_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_DIGS_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_COLLECTS_X] = FALSE;
+  custom_element_change_events[CE_PLAYER_DROPS_X] = FALSE;
+  custom_element_change_events[CE_TOUCHING_X] = FALSE;
+  custom_element_change_events[CE_HITTING_X] = FALSE;
+  custom_element_change_events[CE_HIT_BY_X] = FALSE;
+  custom_element_change_events[CE_SWITCH_OF_X] = FALSE;
+  custom_element_change_events[CE_CHANGE_OF_X] = FALSE;
+  custom_element_change_events[CE_EXPLOSION_OF_X] = FALSE;
   custom_element_change_events[custom_element_change.other_action] =
     custom_element_change_events[CE_BY_OTHER_ACTION];
 
@@ -7279,10 +7310,10 @@ static struct
   { EL_EM_KEY_3_FILE,  &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_EM_KEY_4_FILE,  &level.score[SC_KEY],           TEXT_COLLECTING },
 #endif
-  { EL_EM_KEY_5,       &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EM_KEY_6,       &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EM_KEY_7,       &level.score[SC_KEY],           TEXT_COLLECTING },
-  { EL_EM_KEY_8,       &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_EMC_KEY_5,      &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_EMC_KEY_6,      &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_EMC_KEY_7,      &level.score[SC_KEY],           TEXT_COLLECTING },
+  { EL_EMC_KEY_8,      &level.score[SC_KEY],           TEXT_COLLECTING },
   { EL_AMOEBA_WET,     &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
   { EL_AMOEBA_DRY,     &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
   { EL_AMOEBA_FULL,    &level.amoeba_speed,            TEXT_AMOEBA_SPEED },
@@ -7895,6 +7926,7 @@ static void SelectArea(int from_x, int from_y, int to_x, int to_y,
 #define CB_BRUSH_TO_LEVEL      2
 #define CB_DELETE_OLD_CURSOR   3
 #define CB_DUMP_BRUSH          4
+#define CB_DUMP_BRUSH_SMALL    5
 
 static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
                         int button, int mode)
@@ -7906,7 +7938,8 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
   int new_element = BUTTON_ELEMENT(button);
   int x, y;
 
-  if (mode == CB_DUMP_BRUSH)
+  if (mode == CB_DUMP_BRUSH ||
+      mode == CB_DUMP_BRUSH_SMALL)
   {
     if (!draw_with_brush)
     {
@@ -7953,10 +7986,12 @@ static void CopyBrushExt(int from_x, int from_y, int to_x, int to_y,
 
        if (IS_CUSTOM_ELEMENT(element))
          element_mapped = EL_CUSTOM_START;
-       else if (element > EL_ENVELOPE_4)
-         element_mapped = EL_CHAR_QUESTION;    /* change to EL_UNKNOWN ... */
+       else if (IS_GROUP_ELEMENT(element))
+         element_mapped = EL_GROUP_START;
+       else if (element >= NUM_FILE_ELEMENTS)
+         element_mapped = EL_UNKNOWN;
 
-       printf("`%03d", element_mapped);
+       printf("%c%03d", (mode == CB_DUMP_BRUSH ? '`' : 'ΒΈ'), element_mapped);
 #endif
       }
 
@@ -8085,6 +8120,11 @@ void DumpBrush()
   CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH);
 }
 
+void DumpBrush_Small()
+{
+  CopyBrushExt(0, 0, 0, 0, 0, CB_DUMP_BRUSH_SMALL);
+}
+
 static void FloodFill(int from_x, int from_y, int fill_element)
 {
   int i,x,y;
@@ -8712,7 +8752,7 @@ static void HandleCounterButtons(struct GadgetInfo *gi)
     if ((level_changed && pressed) || (!level_changed && released))
       return;
 
-    if (level_changed && !Request("Level has changed! Discard changes ?",
+    if (level_changed && !Request("Level has changed ! Discard changes ?",
                                  REQ_ASK))
     {
       if (gadget_id == counterbutton_info[counter_id].gadget_id_text)
@@ -9728,7 +9768,7 @@ void RequestExitLevelEditor(boolean ask_if_level_has_changed)
 {
   if (!ask_if_level_has_changed ||
       !LevelChanged() ||
-      Request("Level has changed! Exit without saving ?",
+      Request("Level has changed ! Exit without saving ?",
              REQ_ASK | REQ_STAY_OPEN))
   {
 #if 1