rnd-20051120-1-src
authorHolger Schemel <info@artsoft.org>
Sun, 20 Nov 2005 01:56:53 +0000 (02:56 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:49:20 +0000 (10:49 +0200)
* fixed music initialization bug in init.c (thanks to David Binderman)
* fixed mouse wheel "button" bug in editor (thanks to Tomi Belan)
  (this bug must probably be fixed at other places, too)
* fixed buggy '#include "SDL.h"' statements in src/libgame/sdl.h
  (should be '#include <SDL.h>' instead)

ChangeLog
src/conftime.h
src/editor.c
src/files.c
src/game.c
src/init.c
src/libgame/sdl.h
src/main.h

index 61685439fb4b68bd4d50386176445d7750b400f8..f02adce9946a3ec993adedbc040dd7e6276dc598 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-11-19
+       * fixed music initialization bug in init.c (thanks to David Binderman)
+       * fixed mouse wheel "button" bug in editor (thanks to Tomi Belan)
+         (this bug must probably be fixed at other places, too)
+
+2005-10-16
+       * fixed buggy '#include "SDL.h"' statements in src/libgame/sdl.h
+         (should be '#include <SDL.h>' instead)
+
 2005-08-20
        * fixed bug preventing "walkable from no direction" from being ignored
          (due to compatibility code overwriting this setting after loading)
index f9a04fd0a83bd880bbb36b61db1a9a0cbce0cdca..8b2851d2fac094fcc1f2718520adc64919352f52 100644 (file)
@@ -1 +1 @@
-#define COMPILE_DATE_STRING "[2005-08-20 17:50]"
+#define COMPILE_DATE_STRING "[2005-11-20 02:42]"
index f4b017cc724e5385409ac8d2a990833d57e8518b..04409147596f6e9a62a0b4ae66b5498686f06b13 100644 (file)
 #define GADGET_ID_CHANGE_PLAYER                (GADGET_ID_SELECTBOX_FIRST + 19)
 #define GADGET_ID_CHANGE_PAGE          (GADGET_ID_SELECTBOX_FIRST + 20)
 #define GADGET_ID_CHANGE_REPLACE_WHEN  (GADGET_ID_SELECTBOX_FIRST + 21)
-#define GADGET_ID_SELECT_CHANGE_PAGE   (GADGET_ID_SELECTBOX_FIRST + 22)
-#define GADGET_ID_GROUP_CHOICE_MODE    (GADGET_ID_SELECTBOX_FIRST + 23)
+#define GADGET_ID_CHANGE_ACTION                (GADGET_ID_SELECTBOX_FIRST + 22)
+#define GADGET_ID_CHANGE_ACTION_MODE   (GADGET_ID_SELECTBOX_FIRST + 23)
+#define GADGET_ID_CHANGE_ACTION_ARG    (GADGET_ID_SELECTBOX_FIRST + 24)
+#define GADGET_ID_SELECT_CHANGE_PAGE   (GADGET_ID_SELECTBOX_FIRST + 25)
+#define GADGET_ID_GROUP_CHOICE_MODE    (GADGET_ID_SELECTBOX_FIRST + 26)
 
 /* textbutton identifiers */
-#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 24)
+#define GADGET_ID_TEXTBUTTON_FIRST     (GADGET_ID_SELECTBOX_FIRST + 27)
 
 #define GADGET_ID_PROPERTIES_INFO      (GADGET_ID_TEXTBUTTON_FIRST + 0)
 #define GADGET_ID_PROPERTIES_CONFIG    (GADGET_ID_TEXTBUTTON_FIRST + 1)
 #define GADGET_ID_CHANGE_USE_EXPLOSION (GADGET_ID_CHECKBUTTON_FIRST + 33)
 #define GADGET_ID_CHANGE_ONLY_COMPLETE (GADGET_ID_CHECKBUTTON_FIRST + 34)
 #define GADGET_ID_CHANGE_USE_RANDOM    (GADGET_ID_CHECKBUTTON_FIRST + 35)
-#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 36)
-#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 37)
-#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CHANGE_USE_ACTION    (GADGET_ID_CHECKBUTTON_FIRST + 36)
+#define GADGET_ID_CHANGE_DELAY         (GADGET_ID_CHECKBUTTON_FIRST + 37)
+#define GADGET_ID_CHANGE_BY_DIRECT_ACT (GADGET_ID_CHECKBUTTON_FIRST + 38)
+#define GADGET_ID_CHANGE_BY_OTHER_ACT  (GADGET_ID_CHECKBUTTON_FIRST + 39)
 
 /* gadgets for buttons in element list */
-#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 39)
+#define GADGET_ID_ELEMENTLIST_FIRST    (GADGET_ID_CHECKBUTTON_FIRST + 40)
 #define GADGET_ID_ELEMENTLIST_LAST     (GADGET_ID_ELEMENTLIST_FIRST +  \
                                        ED_NUM_ELEMENTLIST_BUTTONS - 1)
 
 #define ED_SELECTBOX_ID_CHANGE_PLAYER          19
 #define ED_SELECTBOX_ID_CHANGE_PAGE            20
 #define ED_SELECTBOX_ID_CHANGE_REPLACE_WHEN    21
-#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE     22
-#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE      23
+#define ED_SELECTBOX_ID_CHANGE_ACTION          22
+#define ED_SELECTBOX_ID_CHANGE_ACTION_MODE     23
+#define ED_SELECTBOX_ID_CHANGE_ACTION_ARG      24
+#define ED_SELECTBOX_ID_SELECT_CHANGE_PAGE     25
+#define ED_SELECTBOX_ID_GROUP_CHOICE_MODE      26
 
-#define ED_NUM_SELECTBOX                       24
+#define ED_NUM_SELECTBOX                       27
 
 #define ED_SELECTBOX_ID_LEVEL_FIRST    ED_SELECTBOX_ID_TIME_OR_STEPS
 #define ED_SELECTBOX_ID_LEVEL_LAST     ED_SELECTBOX_ID_GAME_ENGINE_TYPE
 #define ED_CHECKBUTTON_ID_CHANGE_USE_CONTENT   34
 #define ED_CHECKBUTTON_ID_CHANGE_ONLY_COMPLETE 35
 #define ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM    36
+#define ED_CHECKBUTTON_ID_CHANGE_USE_ACTION    37
 
-#define ED_NUM_CHECKBUTTONS                    37
+#define ED_NUM_CHECKBUTTONS                    38
 
 #define ED_CHECKBUTTON_ID_LEVEL_FIRST  ED_CHECKBUTTON_ID_INITIAL_GRAVITY
 #define ED_CHECKBUTTON_ID_LEVEL_LAST   ED_CHECKBUTTON_ID_RANDOM_RESTRICTED
 #define ED_CHECKBUTTON_ID_CUSTOM_LAST  ED_CHECKBUTTON_ID_CUSTOM2_LAST
 
 #define ED_CHECKBUTTON_ID_CHANGE_FIRST ED_CHECKBUTTON_ID_CUSTOM_CAN_CHANGE
-#define ED_CHECKBUTTON_ID_CHANGE_LAST  ED_CHECKBUTTON_ID_CHANGE_USE_RANDOM
+#define ED_CHECKBUTTON_ID_CHANGE_LAST  ED_CHECKBUTTON_ID_CHANGE_USE_ACTION
 
 /* values for radiobutton gadgets */
 #define ED_RADIOBUTTON_ID_PERCENTAGE   0
@@ -1526,6 +1534,79 @@ static struct ValueTextInfo options_change_replace_when[] =
   { -1,                                NULL                            }
 };
 
+static struct ValueTextInfo options_change_action[] =
+{
+  { CA_NO_ACTION,              "no action"                     },
+  { CA_EXIT_PLAYER,            "exit player"                   },
+  { CA_KILL_PLAYER,            "kill player"                   },
+  { CA_RESTART_LEVEL,          "restart level"                 },
+  { CA_SHOW_ENVELOPE,          "show envelope"                 },
+  { CA_ADD_KEY,                        "add key"                       },
+  { CA_DEL_KEY,                        "remove key"                    },
+  { CA_SET_PLAYER_SPEED,       "set player speed"              },
+  { CA_SET_GEMS,               "set gems"                      },
+  { CA_SET_SCORE,              "set score"                     },
+  { CA_SET_TIME,               "set time"                      },
+  { CA_SET_COUNTER,            "set counter"                   },
+  { CA_SET_DYNABOMB_NUMBER,    "set bomb number"               },
+  { CA_SET_DYNABOMB_SIZE,      "set bomb size"                 },
+  { CA_SET_DYNABOMB_POWER,     "set bomb power"                },
+  { CA_TOGGLE_PLAYER_GRAVITY,  "toggle gravity"                },
+  { CA_ENABLE_PLAYER_GRAVITY,  "enable gravity"                },
+  { CA_DISABLE_PLAYER_GRAVITY, "disable gravity"               },
+
+  { -1,                                NULL                            }
+};
+
+static struct ValueTextInfo options_change_action_mode[] =
+{
+  { CA_MODE_UNDEFINED,         " "                             },
+  { CA_MODE_ADD,               "+"                             },
+  { CA_MODE_SUBTRACT,          "-"                             },
+  { CA_MODE_MULTIPLY,          "*"                             },
+  { CA_MODE_DIVIDE,            "/"                             },
+  { CA_MODE_SET,               "="                             },
+
+  { -1,                                NULL                            }
+};
+
+static struct ValueTextInfo options_change_action_arg[] =
+{
+  { CA_ARG_PLAYER_HEADLINE,    "[players]"                     },
+  { CA_ARG_PLAYER_1,           "1"                             },
+  { CA_ARG_PLAYER_2,           "2"                             },
+  { CA_ARG_PLAYER_3,           "3"                             },
+  { CA_ARG_PLAYER_4,           "4"                             },
+  { CA_ARG_PLAYER_ANY,         "any"                           },
+  { CA_ARG_PLAYER_TRIGGER,     "trigger"                       },
+  { CA_ARG_UNDEFINED,          " "                             },
+  { CA_ARG_NUMBER_HEADLINE,    "[numbers]"                     },
+  { CA_ARG_0,                  "0"                             },
+  { CA_ARG_1,                  "1"                             },
+  { CA_ARG_2,                  "2"                             },
+  { CA_ARG_3,                  "3"                             },
+  { CA_ARG_4,                  "4"                             },
+  { CA_ARG_5,                  "5"                             },
+  { CA_ARG_6,                  "6"                             },
+  { CA_ARG_7,                  "7"                             },
+  { CA_ARG_8,                  "8"                             },
+  { CA_ARG_9,                  "9"                             },
+  { CA_ARG_10,                 "10"                            },
+  { CA_ARG_20,                 "20"                            },
+  { CA_ARG_25,                 "25"                            },
+  { CA_ARG_50,                 "50"                            },
+  { CA_ARG_100,                        "100"                           },
+  { CA_ARG_1000,               "1000"                          },
+  { CA_ARG_UNDEFINED,          " "                             },
+  { CA_ARG_NUMBER_MIN,         "min"                           },
+  { CA_ARG_NUMBER_MAX,         "max"                           },
+  { CA_ARG_NUMBER_NORMAL,      "normal"                        },
+  { CA_ARG_NUMBER_RESET,       "reset"                         },
+  { CA_ARG_NUMBER_COUNT,       "counter"                       },
+
+  { -1,                                NULL                            }
+};
+
 static char options_change_page_strings[MAX_CHANGE_PAGES][10];
 static struct ValueTextInfo options_change_page[MAX_CHANGE_PAGES + 1] =
 {
@@ -1741,6 +1822,30 @@ static struct
     &custom_element_change.replace_when,
     "replace when", NULL,              "which elements can be replaced"
   },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(13),
+    GADGET_ID_CHANGE_ACTION,           GADGET_ID_NONE,
+    -1,
+    options_change_action,
+    &custom_element_change.change_action,
+    NULL, NULL,                                "action on specified condition"
+  },
+  {
+    -1,                                        ED_ELEMENT_SETTINGS_YPOS(13),
+    GADGET_ID_CHANGE_ACTION_MODE,      GADGET_ID_CHANGE_ACTION,
+    -1,
+    options_change_action_mode,
+    &custom_element_change.change_action_mode,
+    NULL, NULL,                                "action operator"
+  },
+  {
+    -1,                                        ED_ELEMENT_SETTINGS_YPOS(13),
+    GADGET_ID_CHANGE_ACTION_ARG,       GADGET_ID_CHANGE_ACTION_MODE,
+    -1,
+    options_change_action_arg,
+    &custom_element_change.change_action_arg,
+    NULL, NULL,                                "action parameter"
+  },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(14),
     GADGET_ID_SELECT_CHANGE_PAGE,      GADGET_ID_NONE,
@@ -2213,7 +2318,7 @@ static struct
     ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(1),
     GADGET_ID_CUSTOM_CAN_CHANGE,       GADGET_ID_NONE,
     &custom_element_change.can_change,
-    NULL, "element changes to:",       "element can change to other element"
+    NULL, "element changes to:",       "change element on specified condition"
   },
   {
     ED_ELEMENT_SETTINGS_XPOS(1),       ED_ELEMENT_SETTINGS_YPOS(2),
@@ -2257,6 +2362,12 @@ static struct
     &custom_element_change.use_random_replace,
     NULL, NULL,                                "use percentage for random replace"
   },
+  {
+    ED_ELEMENT_SETTINGS_XPOS(0),       ED_ELEMENT_SETTINGS_YPOS(13),
+    GADGET_ID_CHANGE_USE_ACTION,       GADGET_ID_NONE,
+    &custom_element_change.use_change_action,
+    NULL, NULL,                                "execute action on specified condition"
+  },
 };
 
 static struct
@@ -2493,6 +2604,7 @@ static int new_element1 = EL_WALL;
 static int new_element2 = EL_EMPTY;
 static int new_element3 = EL_SAND;
 
+#define IS_VALID_BUTTON(button) (button >= 1 && button <= 3)
 #define BUTTON_ELEMENT(button) ((button) == 1 ? new_element1 : \
                                (button) == 2 ? new_element2 : \
                                (button) == 3 ? new_element3 : EL_EMPTY)
@@ -8454,8 +8566,13 @@ static void HandleDrawingAreas(struct GadgetInfo *gi)
   if (!started_inside_drawing_area)
     return;
 
+#if 1
+  if (!IS_VALID_BUTTON(button) && !button_release_event)
+    return;
+#else
   if (!button && !button_release_event)
     return;
+#endif
 
   /* automatically switch to 'single item' drawing mode, if needed */
   actual_drawing_function =
@@ -9024,6 +9141,14 @@ static void HandleControlButtons(struct GadgetInfo *gi)
   int new_element = BUTTON_ELEMENT(button);
   int x, y;
 
+#if 0
+  /* MAKES PROBLEMS WITH ELEMENT LIST SCROLLBAR AND IS PROBABLY NOT NEEDED */
+  /* !!! CHECK WHAT HAPPENS WHEN MOUSE WHEEL IS USED OVER ELEMENT LIST !!! */
+
+  if (!IS_VALID_BUTTON(button))
+    return;
+#endif
+
   if (edit_mode == ED_MODE_DRAWING && drawing_function == GADGET_ID_TEXT)
     DrawLevelText(0, 0, 0, TEXT_END);
 
index e1cd2ed4016c7cdf6ea7093adbbcf90895f8b7bc..d522761ce9127dc3e3291d299c2d23e66fd638b3 100644 (file)
@@ -114,6 +114,11 @@ void setElementChangeInfoToDefaults(struct ElementChangeInfo *change)
   change->random_percentage = 100;
   change->replace_when = CP_WHEN_EMPTY;
 
+  change->use_change_action = FALSE;
+  change->change_action = CA_NO_ACTION;
+  change->change_action_mode = CA_MODE_UNDEFINED;
+  change->change_action_arg = CA_ARG_UNDEFINED;
+
   for (x = 0; x < 3; x++)
     for (y = 0; y < 3; y++)
       change->target_content[x][y] = EL_EMPTY_SPACE;
@@ -293,6 +298,9 @@ static void setLevelInfoToDefaults(struct LevelInfo *level)
       element_info[element].explosion_delay = 16;
       element_info[element].ignition_delay = 8;
 
+      element_info[element].counter_initial = 0;
+      element_info[element].counter = 0;
+
       for (x = 0; x < 3; x++)
        for (y = 0; y < 3; y++)
          element_info[element].content[x][y] = EL_EMPTY_SPACE;
index 56768b1b9951830e66ea7d380d45b91cf333a89d..e3007408dd8b4f65da4ffddb77f446689f338357 100644 (file)
@@ -7859,7 +7859,26 @@ static void ChangeActiveTrap(int x, int y)
     DrawLevelFieldCrumbledSand(x, y);
 }
 
-static void ChangeElementNowExt(int x, int y, int target_element)
+static void HandleChangeAction(int change_action)
+{
+  if (change_action == CA_EXIT_PLAYER)
+  {
+    printf("::: CA_EXIT_GAME\n");
+
+    /* !!! local_player <-> 4 players !!! (EXTEND THIS) !!! */
+    local_player->LevelSolved = local_player->GameOver = TRUE;
+  }
+  else if (change_action == CA_KILL_PLAYER)
+  {
+    printf("::: CA_KILL_PLAYER\n");
+
+    /* !!! local_player <-> 4 players !!! (EXTEND THIS) !!! */
+    KillHero(local_player);
+  }
+}
+
+static void ChangeElementNowExt(struct ElementChangeInfo *change,
+                               int x, int y, int target_element)
 {
   int previous_move_direction = MovDir[x][y];
 #if 1
@@ -7946,6 +7965,9 @@ static void ChangeElementNowExt(int x, int y, int target_element)
   TestIfPlayerTouchesCustomElement(x, y);
   TestIfElementTouchesCustomElement(x, y);
 #endif
+
+  if (change->use_change_action)
+    HandleChangeAction(change->change_action);
 }
 
 static boolean ChangeElementNow(int x, int y, int element, int page)
@@ -8127,7 +8149,7 @@ static boolean ChangeElementNow(int x, int y, int element, int page)
          content_element = change->target_content[xx][yy];
          target_element = GET_TARGET_ELEMENT(content_element, change);
 
-         ChangeElementNowExt(ex, ey, target_element);
+         ChangeElementNowExt(change, ex, ey, target_element);
 
          something_has_changed = TRUE;
 
@@ -8145,7 +8167,7 @@ static boolean ChangeElementNow(int x, int y, int element, int page)
   {
     target_element = GET_TARGET_ELEMENT(change->target_element, change);
 
-    ChangeElementNowExt(x, y, target_element);
+    ChangeElementNowExt(change, x, y, target_element);
 
     PlayLevelSoundElementAction(x, y, element, ACTION_CHANGING);
   }
index 1f58073285447eaab1dac4f132d8be8288442f8c..718f43948c5d4e2656bb4e0463a0026e9078ccc3 100644 (file)
@@ -4415,7 +4415,7 @@ static void InitArtworkConfig()
 
   for (i = 0; i < NUM_MUSIC_PREFIXES; i++)
     music_id_prefix[i] = music_prefix_info[i].prefix;
-  music_id_prefix[MAX_LEVELS] = NULL;
+  music_id_prefix[NUM_MUSIC_PREFIXES] = NULL;
 
   for (i = 0; i < NUM_ACTIONS; i++)
     action_id_suffix[i] = element_action_info[i].suffix;
index fc05cb7063ad22ebbe4d8c88c66ab51b8a7d62d9..9c8e9b58ffbcf664adeb36578c257563e88a895d 100644 (file)
 #ifndef SDL_H
 #define SDL_H
 
-#include "SDL.h"
-#include "SDL_image.h"
-#include "SDL_mixer.h"
-#include "SDL_net.h"
-#include "SDL_thread.h"
+#include <SDL.h>
+#include <SDL_image.h>
+#include <SDL_mixer.h>
+#include <SDL_net.h>
+#include <SDL_thread.h>
 
 
 /* definitions needed for "system.c" */
index f1e41134cfa5a1a6a6252312fef0e790a8b55b68..10fed0f80d84f600a77ad97b031b90bc22bd6d71 100644 (file)
 #define CH_PLAYER_2            (1 << 1)
 #define CH_PLAYER_3            (1 << 2)
 #define CH_PLAYER_4            (1 << 3)
-#define CH_PLAYER_ANY          (CH_PLAYER_1 | CH_PLAYER_2 | CH_PLAYER_3 | \
+#define CH_PLAYER_ANY          (CH_PLAYER_1 | \
+                                CH_PLAYER_2 | \
+                                CH_PLAYER_3 | \
                                 CH_PLAYER_4)
+#define CH_PLAYER_TRIGGER      (1 << 4)
 
 /* values for change page for custom elements */
 #define CH_PAGE_ANY_FILE       (0xff)
 #define CP_WHEN_REMOVABLE      4
 #define CP_WHEN_WALKABLE       5
 
+/* values for change actions for custom elements */
+#define CA_NO_ACTION           0
+#define CA_EXIT_PLAYER         1
+#define CA_KILL_PLAYER         2
+#define CA_RESTART_LEVEL       3
+#define CA_SHOW_ENVELOPE       4
+#define CA_ADD_KEY             5
+#define CA_DEL_KEY             6
+#define CA_SET_PLAYER_SPEED    7
+#define CA_SET_GEMS            8
+#define CA_SET_SCORE           9
+#define CA_SET_TIME            10
+#define CA_SET_COUNTER         11
+#define CA_SET_DYNABOMB_NUMBER 12
+#define CA_SET_DYNABOMB_SIZE   13
+#define CA_SET_DYNABOMB_POWER  14
+#define CA_TOGGLE_PLAYER_GRAVITY  15
+#define CA_ENABLE_PLAYER_GRAVITY  16
+#define CA_DISABLE_PLAYER_GRAVITY 17
+
+/* values for change action mode for custom elements */
+#define CA_MODE_UNDEFINED      0
+#define CA_MODE_ADD            1
+#define CA_MODE_SUBTRACT       2
+#define CA_MODE_MULTIPLY       3
+#define CA_MODE_DIVIDE         4
+#define CA_MODE_SET            5
+
+/* values for change action parameters for custom elements */
+#define CA_ARG_0               0
+#define CA_ARG_1               1
+#define CA_ARG_2               2
+#define CA_ARG_3               3
+#define CA_ARG_4               4
+#define CA_ARG_5               5
+#define CA_ARG_6               6
+#define CA_ARG_7               7
+#define CA_ARG_8               8
+#define CA_ARG_9               9
+#define CA_ARG_10              10
+#define CA_ARG_20              20
+#define CA_ARG_25              25
+#define CA_ARG_50              50
+#define CA_ARG_100             100
+#define CA_ARG_1000            1000
+#define CA_ARG_PLAYER          20000
+#define CA_ARG_PLAYER_HEADLINE (CA_ARG_PLAYER + 0)
+#define CA_ARG_PLAYER_1                (CA_ARG_PLAYER + CH_PLAYER_1)
+#define CA_ARG_PLAYER_2                (CA_ARG_PLAYER + CH_PLAYER_2)
+#define CA_ARG_PLAYER_3                (CA_ARG_PLAYER + CH_PLAYER_3)
+#define CA_ARG_PLAYER_4                (CA_ARG_PLAYER + CH_PLAYER_4)
+#define CA_ARG_PLAYER_ANY      (CA_ARG_PLAYER + CH_PLAYER_ANY)
+#define CA_ARG_PLAYER_TRIGGER  (CA_ARG_PLAYER + CH_PLAYER_TRIGGER)
+#define CA_ARG_NUMBER          30000
+#define CA_ARG_NUMBER_HEADLINE (CA_ARG_NUMBER + 0)
+#define CA_ARG_NUMBER_MIN      (CA_ARG_NUMBER + 1)
+#define CA_ARG_NUMBER_MAX      (CA_ARG_NUMBER + 2)
+#define CA_ARG_NUMBER_NORMAL   (CA_ARG_NUMBER + 3)
+#define CA_ARG_NUMBER_RESET    (CA_ARG_NUMBER + 4)
+#define CA_ARG_NUMBER_COUNT    (CA_ARG_NUMBER + 5)
+#define CA_ARG_UNDEFINED       30999
+
 /* values for custom move patterns (bits 0 - 3: basic move directions) */
 #define MV_BIT_TOWARDS_PLAYER  4
 #define MV_BIT_AWAY_FROM_PLAYER        5
@@ -1829,6 +1894,11 @@ struct ElementChangeInfo
 
   boolean explode;             /* explode instead of change */
 
+  boolean use_change_action;   /* execute change action after change */
+  int change_action;           /* type of change action after change */
+  int change_action_mode;      /* mode of change action after change */
+  int change_action_arg;       /* parameter of change action after change */
+
   /* ---------- internal values used at runtime when playing ---------- */
 
   /* functions that are called before, while and after the change of an
@@ -1930,6 +2000,8 @@ struct ElementInfo
   int explosion_delay;         /* duration of explosion of this element */
   int ignition_delay;          /* delay for explosion by other explosion */
 
+  int counter_initial;         /* initial value of generic CE counter */
+
   struct ElementChangeInfo *change_page; /* actual list of change pages */
   struct ElementChangeInfo *change;     /* pointer to current change page */
 
@@ -1956,6 +2028,8 @@ struct ElementInfo
   boolean can_leave_element_last;
 #endif
 
+  int counter;                 /* current value of generic CE counter */
+
   /* ---------- internal values used in level editor ---------- */
 
   int access_type;             /* walkable or passable */