#include "libgame/libgame.h"
-#include "conf_gfx.h"
-#include "conf_snd.h"
+#include "conf_gfx.h" /* include auto-generated data structure definitions */
+#include "conf_snd.h" /* include auto-generated data structure definitions */
#define IMG_UNDEFINED (-1)
#define IMG_EMPTY IMG_EMPTY_SPACE
#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_CHAR_START 120
#define EL_CHAR_ASCII0 (EL_CHAR_START - 32)
#define EL_CHAR_ASCII0_START (EL_CHAR_ASCII0 + 32)
-#define EL_CHAR_EXCLAM (EL_CHAR_ASCII0 + 33)
-#define EL_CHAR_QUOTEDBL (EL_CHAR_ASCII0 + 34)
-#define EL_CHAR_NUMBERSIGN (EL_CHAR_ASCII0 + 35)
-#define EL_CHAR_DOLLAR (EL_CHAR_ASCII0 + 36)
-#define EL_CHAR_PROCENT (EL_CHAR_ASCII0 + 37)
-#define EL_CHAR_AMPERSAND (EL_CHAR_ASCII0 + 38)
-#define EL_CHAR_APOSTROPHE (EL_CHAR_ASCII0 + 39)
-#define EL_CHAR_PARENLEFT (EL_CHAR_ASCII0 + 40)
-#define EL_CHAR_PARENRIGHT (EL_CHAR_ASCII0 + 41)
-#define EL_CHAR_ASTERISK (EL_CHAR_ASCII0 + 42)
-#define EL_CHAR_PLUS (EL_CHAR_ASCII0 + 43)
-#define EL_CHAR_COMMA (EL_CHAR_ASCII0 + 44)
-#define EL_CHAR_MINUS (EL_CHAR_ASCII0 + 45)
-#define EL_CHAR_PERIOD (EL_CHAR_ASCII0 + 46)
-#define EL_CHAR_SLASH (EL_CHAR_ASCII0 + 47)
-#define EL_CHAR_0 (EL_CHAR_ASCII0 + 48)
-#define EL_CHAR_9 (EL_CHAR_ASCII0 + 57)
-#define EL_CHAR_COLON (EL_CHAR_ASCII0 + 58)
-#define EL_CHAR_SEMICOLON (EL_CHAR_ASCII0 + 59)
-#define EL_CHAR_LESS (EL_CHAR_ASCII0 + 60)
-#define EL_CHAR_EQUAL (EL_CHAR_ASCII0 + 61)
-#define EL_CHAR_GREATER (EL_CHAR_ASCII0 + 62)
-#define EL_CHAR_QUESTION (EL_CHAR_ASCII0 + 63)
-#define EL_CHAR_AT (EL_CHAR_ASCII0 + 64)
-#define EL_CHAR_A (EL_CHAR_ASCII0 + 65)
-#define EL_CHAR_Z (EL_CHAR_ASCII0 + 90)
-#define EL_CHAR_AE (EL_CHAR_ASCII0 + 91)
-#define EL_CHAR_OE (EL_CHAR_ASCII0 + 92)
-#define EL_CHAR_UE (EL_CHAR_ASCII0 + 93)
-#define EL_CHAR_COPYRIGHT (EL_CHAR_ASCII0 + 94)
-#define EL_CHAR_UNDERSCORE (EL_CHAR_ASCII0 + 95)
-#define EL_CHAR_EMPTY (EL_CHAR_ASCII0 + 96)
-#define EL_CHAR_DEGREE (EL_CHAR_ASCII0 + 97)
-#define EL_CHAR_TM (EL_CHAR_ASCII0 + 98)
-#define EL_CHAR_CURSOR (EL_CHAR_ASCII0 + 99)
+
+#include "conf_chr.h" /* include auto-generated data structure definitions */
+
#define EL_CHAR_ASCII0_END (EL_CHAR_ASCII0 + 111)
#define EL_CHAR_END (EL_CHAR_START + 79)
#define EL_UNUSED_359 359
#define EL_CUSTOM_START 360
-#define EL_CUSTOM_1 (EL_CUSTOM_START + 0)
-#define EL_CUSTOM_128 (EL_CUSTOM_START + 127)
+
+#include "conf_cus.h" /* include auto-generated data structure definitions */
+
#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_FULL_PART1 (EL_FIRST_DUMMY + 25)
-#define EL_AMOEBA_FULL_PART2 (EL_FIRST_DUMMY + 26)
-#define EL_AMOEBA_FULL_PART3 (EL_FIRST_DUMMY + 27)
-#define EL_AMOEBA_FULL_PART4 (EL_FIRST_DUMMY + 28)
-#define EL_AMOEBA_DEAD_PART1 (EL_FIRST_DUMMY + 29)
-#define EL_AMOEBA_DEAD_PART2 (EL_FIRST_DUMMY + 30)
-#define EL_AMOEBA_DEAD_PART3 (EL_FIRST_DUMMY + 31)
-#define EL_AMOEBA_DEAD_PART4 (EL_FIRST_DUMMY + 32)
-#define EL_DYNABOMB_ACTIVE (EL_FIRST_DUMMY + 33)
-#define EL_SHIELD_NORMAL_ACTIVE (EL_FIRST_DUMMY + 34)
-#define EL_SHIELD_DEADLY_ACTIVE (EL_FIRST_DUMMY + 35)
-#define EL_ARROW_RED_LEFT (EL_FIRST_DUMMY + 36)
-#define EL_ARROW_RED_RIGHT (EL_FIRST_DUMMY + 37)
-#define EL_ARROW_RED_UP (EL_FIRST_DUMMY + 38)
-#define EL_ARROW_RED_DOWN (EL_FIRST_DUMMY + 39)
-
-#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 40)
+#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
-#define GFX_ARG_YPOS 1
-#define GFX_ARG_OFFSET 2
-#define GFX_ARG_VERTICAL 3
-#define GFX_ARG_XOFFSET 4
-#define GFX_ARG_YOFFSET 5
-#define GFX_ARG_FRAMES 6
-#define GFX_ARG_START_FRAME 7
-#define GFX_ARG_DELAY 8
-#define GFX_ARG_MODE_LOOP 9
-#define GFX_ARG_MODE_LINEAR 10
-#define GFX_ARG_MODE_PINGPONG 11
-#define GFX_ARG_MODE_PINGPONG2 12
-#define GFX_ARG_MODE_RANDOM 13
-#define GFX_ARG_MODE_REVERSE 14
-#define GFX_ARG_GLOBAL_SYNC 15
-
-#define NUM_GFX_ARGS 16
+#define GFX_ARG_X 0
+#define GFX_ARG_Y 1
+#define GFX_ARG_XPOS 2
+#define GFX_ARG_YPOS 3
+#define GFX_ARG_WIDTH 4
+#define GFX_ARG_HEIGHT 5
+#define GFX_ARG_OFFSET 6
+#define GFX_ARG_VERTICAL 7
+#define GFX_ARG_XOFFSET 8
+#define GFX_ARG_YOFFSET 9
+#define GFX_ARG_FRAMES 10
+#define GFX_ARG_START_FRAME 11
+#define GFX_ARG_DELAY 12
+#define GFX_ARG_MODE_LOOP 13
+#define GFX_ARG_MODE_LINEAR 14
+#define GFX_ARG_MODE_PINGPONG 15
+#define GFX_ARG_MODE_PINGPONG2 16
+#define GFX_ARG_MODE_RANDOM 17
+#define GFX_ARG_MODE_REVERSE 18
+#define GFX_ARG_GLOBAL_SYNC 19
+#define GFX_ARG_STEP_OFFSET 20
+#define GFX_ARG_STEP_DELAY 21
+
+#define NUM_GFX_ARGS 22
/* values for sound configuration suffixes */
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 */
};
struct GraphicInfo
{
Bitmap *bitmap;
- int src_x, src_y; /* derived from (tile sized) .xpos/.ypos */
+ int src_x, src_y; /* start position of animation frames */
+ int width, height; /* width/height of each animation frame */
int offset_x, offset_y; /* x/y offset to next animation frame */
int anim_frames;
int anim_start_frame;
int anim_delay; /* important: delay of 1 means "no delay"! */
int anim_mode;
boolean anim_global_sync;
+ int step_offset; /* optional step offset of toon animations */
+ int step_delay; /* optional step delay of toon animations */
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
Pixmap clip_mask; /* single-graphic-only clip mask for X11 */
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[];