rnd-20030202-1-src
[rocksndiamonds.git] / src / main.h
index a96668871dc942d820d77797fccb5ef33d3c6e1f..21906949f6bc1bfaa0dd010c9ef92a0a717c0362 100644 (file)
 #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 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_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_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 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 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 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 */
@@ -1025,24 +1051,22 @@ struct GlobalInfo
 
 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];
-
+  int graphic[NUM_ACTIONS];    /* default graphics for several actions */
                                /* special graphics for left/right/up/down */
-  int direction_graphic[NUM_GFX_ACTIONS][NUM_MV_DIRECTIONS];
-};
+  int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS];
 
-struct GraphicInfo
-{
-  Bitmap *bitmap;
-  int src_x, src_y;
+  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 NewGraphicInfo
+struct GraphicInfo
 {
   Bitmap *bitmap;
   int src_x, src_y;            /* derived from (tile sized) .xpos/.ypos */
@@ -1059,65 +1083,96 @@ struct NewGraphicInfo
 #endif
 };
 
+struct SoundInfo
+{
+  boolean loop;
+};
+
+struct ElementActionInfo
+{
+  char *suffix;
+  int value;
+  boolean is_loop_sound;
+};
+
+struct ElementDirectionInfo
+{
+  char *suffix;
+  int value;
+};
+
+struct SpecialSuffixInfo
+{
+  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;
@@ -1126,9 +1181,12 @@ extern struct TapeInfo           tape;
 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 SpecialSuffixInfo special_suffix_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 */