#define IMG_CHAR_START IMG_CHAR_SPACE
#define IMG_CUSTOM_START IMG_CUSTOM_1
-#define WIN_XSIZE 672
-#define WIN_YSIZE 560
-
-#define SCR_FIELDX 17
-#define SCR_FIELDY 17
-#define MAX_BUF_XSIZE (SCR_FIELDX + 2)
-#define MAX_BUF_YSIZE (SCR_FIELDY + 2)
-#define MIN_LEV_FIELDX 3
-#define MIN_LEV_FIELDY 3
-#define STD_LEV_FIELDX 64
-#define STD_LEV_FIELDY 32
-#define MAX_LEV_FIELDX 128
-#define MAX_LEV_FIELDY 128
-
-#define SCREENX(a) ((a) - scroll_x)
-#define SCREENY(a) ((a) - scroll_y)
-#define LEVELX(a) ((a) + scroll_x)
-#define LEVELY(a) ((a) + scroll_y)
+#define SND_UNDEFINED (-1)
+
+#define WIN_XSIZE 672
+#define WIN_YSIZE 560
+
+#define SCR_FIELDX 17
+#define SCR_FIELDY 17
+#define MAX_BUF_XSIZE (SCR_FIELDX + 2)
+#define MAX_BUF_YSIZE (SCR_FIELDY + 2)
+#define MIN_LEV_FIELDX 3
+#define MIN_LEV_FIELDY 3
+#define STD_LEV_FIELDX 64
+#define STD_LEV_FIELDY 32
+#define MAX_LEV_FIELDX 128
+#define MAX_LEV_FIELDY 128
+
+#define SCREENX(a) ((a) - scroll_x)
+#define SCREENY(a) ((a) - scroll_y)
+#define LEVELX(a) ((a) + scroll_x)
+#define LEVELY(a) ((a) + scroll_y)
#define IN_VIS_FIELD(x,y) ((x)>=0 && (x)<SCR_FIELDX && (y)>=0 &&(y)<SCR_FIELDY)
#define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2)
#define IN_LEV_FIELD(x,y) ((x)>=0 && (x)<lev_fieldx && (y)>=0 &&(y)<lev_fieldy)
#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_LOOP_SOUND(s) (sound_info[s].loop)
+
#if 0
#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)
-
-
-/* values for animation action types */
-#define GFX_ACTION_DEFAULT 0
-#define GFX_ACTION_WAITING 1
-#define GFX_ACTION_FALLING 2
-#define GFX_ACTION_MOVING 3
-#define GFX_ACTION_DIGGING 4
-#define GFX_ACTION_SNAPPING 5
-#define GFX_ACTION_COLLECTING 6
-#define GFX_ACTION_PUSHING 7
-#define GFX_ACTION_PASSING 8
-#define GFX_ACTION_IMPACT 9
-#define GFX_ACTION_CRACKING 10
-#define GFX_ACTION_BREAKING 11
-#define GFX_ACTION_ACTIVATING 12
-#define GFX_ACTION_OPENING 13
-#define GFX_ACTION_CLOSING 14
-#define GFX_ACTION_EATING 15
-#define GFX_ACTION_ATTACKING 16
-#define GFX_ACTION_GROWING 17
-#define GFX_ACTION_SHRINKING 18
-#define GFX_ACTION_OTHER 19
-
-#define NUM_GFX_ACTIONS 20
-#define NUM_GFX_ACTIONS_MAPPED 8
+#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)
+
+
+/* values for graphics/sounds action types */
+#define ACTION_DEFAULT 0
+#define ACTION_WAITING 1
+#define ACTION_FALLING 2
+#define ACTION_MOVING 3
+#define ACTION_DIGGING 4
+#define ACTION_SNAPPING 5
+#define ACTION_COLLECTING 6
+#define ACTION_PUSHING 7
+#define ACTION_PASSING 8
+#define ACTION_IMPACT 9
+#define ACTION_CRACKING 10
+#define ACTION_BREAKING 11
+#define ACTION_ACTIVATING 12
+#define ACTION_OPENING 13
+#define ACTION_CLOSING 14
+#define ACTION_EATING 15
+#define ACTION_ATTACKING 16
+#define ACTION_GROWING 17
+#define ACTION_SHRINKING 18
+#define ACTION_ACTIVE 19
+#define ACTION_OTHER 20
+
+#define NUM_ACTIONS 21
/* values for image configuration suffixes */
#define NUM_GFX_ARGS 16
-#define GFX_ARG_UNDEFINED "-1000000"
-#define GFX_ARG_UNDEFINED_VALUE (atoi(GFX_ARG_UNDEFINED))
-
/* values for sound configuration suffixes */
-/* (currently none) */
+#define SND_ARG_MODE_LOOP 0
+
+#define NUM_SND_ARGS 1
/* values for game_status */
struct ElementInfo
{
- char *token_name; /* element token used in config files */
+ 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 */
- /* default graphics for several actions */
- int graphic[NUM_GFX_ACTIONS_MAPPED];
-
+ int graphic[NUM_ACTIONS]; /* default graphics for several actions */
/* special graphics for left/right/up/down */
- int direction_graphic[NUM_GFX_ACTIONS_MAPPED][NUM_MV_DIRECTIONS];
-};
+ int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS];
-struct GraphicInfo
-{
- Bitmap *bitmap;
- int src_x, src_y;
+ int sound[NUM_ACTIONS]; /* default sounds for several actions */
};
-struct NewGraphicInfo
+struct GraphicInfo
{
Bitmap *bitmap;
int src_x, src_y; /* derived from (tile sized) .xpos/.ypos */
#endif
};
+struct SoundInfo
+{
+ boolean loop;
+};
+
+struct ElementActionInfo
+{
+ char *suffix;
+ int value;
+ boolean is_loop_sound;
+};
+
+struct ElementDirectionInfo
+{
+ char *suffix;
+ int value;
+};
+
+
#if 0
-extern GC tile_clip_gc;
-extern Bitmap *pix[];
+extern GC tile_clip_gc;
+extern Bitmap *pix[];
#endif
-extern Bitmap *bitmap_db_field, *bitmap_db_door;
-extern Pixmap tile_clipmask[];
-extern DrawBuffer *fieldbuffer;
-extern DrawBuffer *drawto_field;
-
-extern int game_status;
-extern boolean level_editor_test_game;
-extern boolean network_playing;
-
-extern int key_joystick_mapping;
-
-extern boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
-extern int redraw_x1, redraw_y1;
-
-extern short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
-extern short ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-
-extern unsigned long Properties1[MAX_NUM_ELEMENTS];
-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 lev_fieldx,lev_fieldy, scroll_x,scroll_y;
-
-extern int FX,FY, ScrollStepSize;
-extern int ScreenMovDir, ScreenMovPos, ScreenGfxPos;
-extern int BorderElement;
-extern int GameFrameDelay;
-extern int FfwdFrameDelay;
-extern int BX1,BY1, BX2,BY2;
-extern int SBX_Left, SBX_Right;
-extern int SBY_Upper, SBY_Lower;
-extern int ZX,ZY, ExitX,ExitY;
-extern int AllPlayersGone;
-
-extern int TimeFrames, TimePlayed, TimeLeft;
-extern boolean SiebAktiv;
-extern int SiebCount;
-
-extern boolean network_player_action_received;
-
-extern int graphics_action_mapping[];
+extern Bitmap *bitmap_db_field, *bitmap_db_door;
+extern Pixmap tile_clipmask[];
+extern DrawBuffer *fieldbuffer;
+extern DrawBuffer *drawto_field;
+
+extern int game_status;
+extern boolean level_editor_test_game;
+extern boolean network_playing;
+
+extern int key_joystick_mapping;
+
+extern boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
+extern int redraw_x1, redraw_y1;
+
+extern short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short AmoebaCnt[MAX_NUM_AMOEBA];
+extern short AmoebaCnt2[MAX_NUM_AMOEBA];
+extern short ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+
+extern unsigned long Properties1[MAX_NUM_ELEMENTS];
+extern unsigned long Properties2[MAX_NUM_ELEMENTS];
+
+extern int GfxFrame[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 int FX, FY;
+extern int ScrollStepSize;
+extern int ScreenMovDir, ScreenMovPos, ScreenGfxPos;
+extern int BorderElement;
+extern int GameFrameDelay;
+extern int FfwdFrameDelay;
+extern int BX1, BY1;
+extern int BX2, BY2;
+extern int SBX_Left, SBX_Right;
+extern int SBY_Upper, SBY_Lower;
+extern int ZX, ZY;
+extern int ExitX, ExitY;
+extern int AllPlayersGone;
+
+extern int TimeFrames, TimePlayed, TimeLeft;
+extern boolean SiebAktiv;
+extern int SiebCount;
+
+extern boolean network_player_action_received;
+
+extern int graphics_action_mapping[];
extern struct LevelInfo level;
extern struct PlayerInfo stored_player[], *local_player;
extern struct GameInfo game;
extern struct GlobalInfo global;
extern struct ElementInfo element_info[];
-extern struct NewGraphicInfo graphic_info[];
+extern struct ElementActionInfo element_action_info[];
+extern struct ElementDirectionInfo element_direction_info[];
+extern struct GraphicInfo *graphic_info;
+extern struct SoundInfo *sound_info;
extern struct ConfigInfo image_config[], sound_config[];
extern struct ConfigInfo image_config_suffix[], sound_config_suffix[];
-extern struct FileInfo *image_files, *sound_files;
#endif /* MAIN_H */