rnd-20060130-1-src
[rocksndiamonds.git] / src / main.h
index c131ffc0d95d602a2c856ea22689aa5b712c53ff..55b70f76d5d5d28604479014b03ea0a10fe0175b 100644 (file)
 #define EP_CAN_EXPLODE_BY_EXPLOSION    78
 #define EP_COULD_MOVE_INTO_ACID                79
 #define EP_MAYBE_DONT_COLLIDE_WITH     80
+#define EP_CAN_BE_CLONED_BY_ANDROID    81
 
 /* values for internal purpose only (level editor) */
-#define EP_WALK_TO_OBJECT              81
-#define EP_DEADLY                      82
-#define EP_EDITOR_CASCADE              83
-#define EP_EDITOR_CASCADE_ACTIVE       84
-#define EP_EDITOR_CASCADE_INACTIVE     85
+#define EP_WALK_TO_OBJECT              82
+#define EP_DEADLY                      83
+#define EP_EDITOR_CASCADE              84
+#define EP_EDITOR_CASCADE_ACTIVE       85
+#define EP_EDITOR_CASCADE_INACTIVE     86
 
 /* values for internal purpose only (game engine) */
-#define EP_HAS_ACTION                  86
-#define EP_CAN_CHANGE_OR_HAS_ACTION    87
+#define EP_HAS_ACTION                  87
+#define EP_CAN_CHANGE_OR_HAS_ACTION    88
 
-#define NUM_ELEMENT_PROPERTIES         88
+#define NUM_ELEMENT_PROPERTIES         89
 
 #define NUM_EP_BITFIELDS               ((NUM_ELEMENT_PROPERTIES + 31) / 32)
 #define EP_BITFIELD_BASE               0
 #define CA_ARG_ELEMENT_RESET           (CA_ARG_ELEMENT + 0)
 #define CA_ARG_ELEMENT_TARGET          (CA_ARG_ELEMENT + 1)
 #define CA_ARG_ELEMENT_TRIGGER         (CA_ARG_ELEMENT + 2)
-#define CA_ARG_ELEMENT_HEADLINE                (CA_ARG_ELEMENT + 999)
+#define CA_ARG_ELEMENT_HEADLINE                (CA_ARG_ELEMENT + 998)
+#define CA_ARG_ELEMENT_CV_TARGET       (CA_ARG_ELEMENT_TARGET)
+#define CA_ARG_ELEMENT_CV_TRIGGER      (CA_ARG_ELEMENT_TRIGGER)
+#define CA_ARG_ELEMENT_CV_HEADLINE     (CA_ARG_ELEMENT_HEADLINE)
+#define CA_ARG_ELEMENT_NR_TARGET       (CA_ARG_ELEMENT + 3)
+#define CA_ARG_ELEMENT_NR_TRIGGER      (CA_ARG_ELEMENT + 4)
+#define CA_ARG_ELEMENT_NR_HEADLINE     (CA_ARG_ELEMENT + 999)
 #define CA_ARG_SPEED                   13000
 #define CA_ARG_SPEED_NOT_MOVING                (CA_ARG_SPEED + STEPSIZE_NOT_MOVING)
 #define CA_ARG_SPEED_VERY_SLOW         (CA_ARG_SPEED + STEPSIZE_VERY_SLOW)
                                HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_EXPLOSION)
 #define COULD_MOVE_INTO_ACID(e)        HAS_PROPERTY(e, EP_COULD_MOVE_INTO_ACID)
 #define MAYBE_DONT_COLLIDE_WITH(e) HAS_PROPERTY(e, EP_MAYBE_DONT_COLLIDE_WITH)
+#define CAN_BE_CLONED_BY_ANDROID(e)    \
+                               HAS_PROPERTY(e, EP_CAN_BE_CLONED_BY_ANDROID)
 
 #define IS_EDITOR_CASCADE(e)   HAS_PROPERTY(e, EP_EDITOR_CASCADE)
 #define IS_EDITOR_CASCADE_ACTIVE(e)    \
 #define SND_ELEMENT(e)         (e)
 #endif
 
+#if 1
+#define GROUP_NR(e)            ((e) - EL_GROUP_START)
+#define IS_IN_GROUP(e, nr)     (element_info[e].in_group[nr] == TRUE)
+#define IS_IN_GROUP_EL(e, ge)  (IS_IN_GROUP(e, (ge) - EL_GROUP_START))
+
+#define IS_EQUAL_OR_IN_GROUP(e, ge)                                    \
+       (IS_GROUP_ELEMENT(ge) ? IS_IN_GROUP(e, GROUP_NR(ge)) : (e) == (ge))
+#endif
+
 #define IS_PLAYER(x, y)                (ELEM_IS_PLAYER(StorePlayer[x][y]))
 
 #define IS_FREE(x, y)          (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x, y))
 #define IS_FALLING(x,y)                (MovPos[x][y] != 0 && MovDir[x][y] == MV_DOWN)
 #define IS_BLOCKED(x,y)                (Feld[x][y] == EL_BLOCKED)
 
+#define IS_MV_DIAGONAL(x)      ((x) & MV_HORIZONTAL && (x) & MV_VERTICAL)
+
 #define EL_CHANGED(e)          ((e) == EL_ROCK           ? EL_EMERALD :    \
                                 (e) == EL_BD_ROCK        ? EL_BD_DIAMOND : \
                                 (e) == EL_EMERALD        ? EL_DIAMOND :    \
 #define EL_TRIGGER_ELEMENT             657
 #define EL_TRIGGER_PLAYER              658
 
+/* SP style elements */
 #define EL_SP_GRAVITY_ON_PORT_RIGHT    659
 #define EL_SP_GRAVITY_ON_PORT_DOWN     660
 #define EL_SP_GRAVITY_ON_PORT_LEFT     661
 #define EL_SP_GRAVITY_OFF_PORT_LEFT    665
 #define EL_SP_GRAVITY_OFF_PORT_UP      666
 
-
-/* the following EMC style elements are currently not implemented in R'n'D */
+/* EMC style elements */
 #define EL_BALLOON_SWITCH_NONE         667
 #define EL_EMC_GATE_5                  668
 #define EL_EMC_GATE_6                  669
 #define EL_EMC_FAKE_ACID               703
 #define EL_EMC_DRIPPER                 704
 
-#define NUM_FILE_ELEMENTS              705
+#define EL_TRIGGER_CE_VALUE            705
+
+#define NUM_FILE_ELEMENTS              706
 
 
 /* "real" (and therefore drawable) runtime elements */
 #define EL_EMC_GATE_8_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 57)
 #define EL_EMC_DRIPPER_ACTIVE          (EL_FIRST_RUNTIME_REAL + 58)
 #define EL_EMC_SPRING_BUMPER_ACTIVE    (EL_FIRST_RUNTIME_REAL + 59)
-#define EL_EMC_ANDROID_SHRINKING       (EL_FIRST_RUNTIME_REAL + 60)
-#define EL_EMC_ANDROID_GROWING         (EL_FIRST_RUNTIME_REAL + 61)
 
 /* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 62)
+#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 60)
 
 #define EL_BLOCKED                     (EL_FIRST_RUNTIME_UNREAL + 0)
 #define EL_EXPLOSION                   (EL_FIRST_RUNTIME_UNREAL + 1)
 #define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 16)
 #define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 17)
 #define EL_ELEMENT_SNAPPING            (EL_FIRST_RUNTIME_UNREAL + 18)
+#define EL_DIAGONAL_SHRINKING          (EL_FIRST_RUNTIME_UNREAL + 19)
+#define EL_DIAGONAL_GROWING            (EL_FIRST_RUNTIME_UNREAL + 20)
+
+#define NUM_RUNTIME_ELEMENTS           (EL_FIRST_RUNTIME_UNREAL + 21)
 
 /* dummy elements (never used as game elements, only used as graphics) */
-#define EL_FIRST_DUMMY                 (EL_FIRST_RUNTIME_UNREAL + 19)
+#define EL_FIRST_DUMMY                 NUM_RUNTIME_ELEMENTS
 
 #define EL_STEELWALL_TOPLEFT           (EL_FIRST_DUMMY + 0)
 #define EL_STEELWALL_TOPRIGHT          (EL_FIRST_DUMMY + 1)
@@ -2161,11 +2185,11 @@ struct ElementInfo
   /* ---------- graphic and sound definitions ---------- */
 
   int graphic[NUM_ACTIONS];    /* default graphics for several actions */
-  int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS];
+  int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS_FULL];
                                /* special graphics for left/right/up/down */
 
   int crumbled[NUM_ACTIONS];   /* crumbled graphics for several actions */
-  int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS];
+  int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS_FULL];
                                /* crumbled graphics for left/right/up/down */
 
   int special_graphic[NUM_SPECIAL_GFX_ARGS];