#define EP_BIT_TUBE (1 << 3)
#define EP_BIT_EM_SLIPPERY_WALL (1 << 4)
+#define EP_BITMASK_DEFAULT 0
+
#define IS_AMOEBALIVE(e) (Properties1[e] & EP_BIT_AMOEBALIVE)
#define IS_AMOEBOID(e) (Properties1[e] & EP_BIT_AMOEBOID)
#define IS_SCHLUESSEL(e) (Properties1[e] & EP_BIT_SCHLUESSEL)
#define IS_TUBE(e) (Properties2[e] & EP_BIT_TUBE)
#define IS_EM_SLIPPERY_WALL(e) (Properties2[e] & EP_BIT_EM_SLIPPERY_WALL)
+#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \
+ (e) <= EL_CUSTOM_END)
+
#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 PLAYER_NR_GFX(g,i) ((g) + i * (IMG_PLAYER2 - IMG_PLAYER1))
+#define ANIM_FRAMES(g) (graphic_info[g].anim_frames)
+#define ANIM_DELAY(g) (graphic_info[g].anim_delay)
+#define ANIM_MODE(g) (graphic_info[g].anim_mode)
+
+#define IS_ANIMATED(g) (ANIM_FRAMES(g) > 1)
+#define IS_NEW_DELAY(f, g) ((f) % ANIM_DELAY(g) == 0)
+#define IS_NEW_FRAME(f, g) (IS_ANIMATED(g) && IS_NEW_DELAY(f, g))
+#define IS_NEXT_FRAME(f, g) (IS_NEW_FRAME(f, g) && (f) > 0)
+
+#define IS_LOOP_SOUND(s) (sound_info[s].loop)
+
#if 0
#define EL_CUSTOM_128 (EL_CUSTOM_START + 127)
#define EL_CUSTOM_END (EL_CUSTOM_START + 127)
+#define NUM_CUSTOM_ELEMENTS 128
#define NUM_FILE_ELEMENTS 488
#define EL_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 11)
#define EL_BD_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 12)
-/* dummy (not drawable) runtime elements (internal use only) */
+/* dummy elements (never used as game elements, only used as graphics) */
#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 13)
#define EL_STEELWALL_TOPLEFT (EL_FIRST_DUMMY + 0)
#define EL_INVISIBLE_STEELWALL_HORIZONTAL (EL_FIRST_DUMMY + 10)
#define EL_INVISIBLE_STEELWALL_VERTICAL (EL_FIRST_DUMMY + 11)
#define EL_SAND_CRUMBLED (EL_FIRST_DUMMY + 12)
-#define EL_BD_AMOEBA_PART1 (EL_FIRST_DUMMY + 13)
-#define EL_BD_AMOEBA_PART2 (EL_FIRST_DUMMY + 14)
-#define EL_BD_AMOEBA_PART3 (EL_FIRST_DUMMY + 15)
-#define EL_BD_AMOEBA_PART4 (EL_FIRST_DUMMY + 16)
-#define EL_AMOEBA_WET_PART1 (EL_FIRST_DUMMY + 17)
-#define EL_AMOEBA_WET_PART2 (EL_FIRST_DUMMY + 18)
-#define EL_AMOEBA_WET_PART3 (EL_FIRST_DUMMY + 19)
-#define EL_AMOEBA_WET_PART4 (EL_FIRST_DUMMY + 20)
-#define EL_AMOEBA_DRY_PART1 (EL_FIRST_DUMMY + 21)
-#define EL_AMOEBA_DRY_PART2 (EL_FIRST_DUMMY + 22)
-#define EL_AMOEBA_DRY_PART3 (EL_FIRST_DUMMY + 23)
-#define EL_AMOEBA_DRY_PART4 (EL_FIRST_DUMMY + 24)
-#define EL_AMOEBA_DEAD_PART1 (EL_FIRST_DUMMY + 25)
-#define EL_AMOEBA_DEAD_PART2 (EL_FIRST_DUMMY + 26)
-#define EL_AMOEBA_DEAD_PART3 (EL_FIRST_DUMMY + 27)
-#define EL_AMOEBA_DEAD_PART4 (EL_FIRST_DUMMY + 28)
-#define EL_DYNABOMB_ACTIVE (EL_FIRST_DUMMY + 29)
-#define EL_SHIELD_NORMAL_ACTIVE (EL_FIRST_DUMMY + 30)
-#define EL_SHIELD_DEADLY_ACTIVE (EL_FIRST_DUMMY + 31)
-#define EL_ARROW_RED_LEFT (EL_FIRST_DUMMY + 32)
-#define EL_ARROW_RED_RIGHT (EL_FIRST_DUMMY + 33)
-#define EL_ARROW_RED_UP (EL_FIRST_DUMMY + 34)
-#define EL_ARROW_RED_DOWN (EL_FIRST_DUMMY + 35)
-
-#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 36)
+#define EL_DYNABOMB_ACTIVE (EL_FIRST_DUMMY + 13)
+#define EL_SHIELD_NORMAL_ACTIVE (EL_FIRST_DUMMY + 14)
+#define EL_SHIELD_DEADLY_ACTIVE (EL_FIRST_DUMMY + 15)
+#define EL_ARROW_RED_LEFT (EL_FIRST_DUMMY + 16)
+#define EL_ARROW_RED_RIGHT (EL_FIRST_DUMMY + 17)
+#define EL_ARROW_RED_UP (EL_FIRST_DUMMY + 18)
+#define EL_ARROW_RED_DOWN (EL_FIRST_DUMMY + 19)
+
+#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 20)
/* values for graphics/sounds action types */
#define NUM_ACTIONS 21
+/* values for special image configuration suffixes */
+#define GFX_SPECIAL_ARG_EDITOR 0
+#define GFX_SPECIAL_ARG_PREVIEW 1
+
+#define NUM_SPECIAL_GFX_ARGS 2
+
/* values for image configuration suffixes */
#define GFX_ARG_XPOS 0
char *token_name; /* element token prefix used in config files */
char *sound_class_name; /* classification for custom sound effects */
char *editor_description; /* short description for level editor */
+ char *custom_description; /* custom description for level editor */
int graphic[NUM_ACTIONS]; /* default graphics for several actions */
/* special graphics for left/right/up/down */
int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS];
+ int editor_graphic; /* graphic displayed in level editor */
+ int preview_graphic; /* graphic displayed in level preview */
+
int sound[NUM_ACTIONS]; /* default sounds for several actions */
};
int value;
};
+struct SpecialSuffixInfo
+{
+ char *suffix;
+ int value;
+};
+
#if 0
extern GC tile_clip_gc;
extern unsigned long Properties2[MAX_NUM_ELEMENTS];
extern int GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int lev_fieldx, lev_fieldy;
extern int scroll_x, scroll_y;
extern struct ElementInfo element_info[];
extern struct ElementActionInfo element_action_info[];
extern struct ElementDirectionInfo element_direction_info[];
+extern struct SpecialSuffixInfo special_suffix_info[];
extern struct GraphicInfo *graphic_info;
extern struct SoundInfo *sound_info;
extern struct ConfigInfo image_config[], sound_config[];