added support for stacked global animations
[rocksndiamonds.git] / src / main.h
index e689b266ef6b6263d0e689c330df1e6e375f2b0b..618db1fb84097a4a82094ff982b99f5a09b3ae48 100644 (file)
 #define EP_BITMASK_BASE_DEFAULT                (1 << EP_CAN_MOVE_INTO_ACID)
 #define EP_BITMASK_DEFAULT             0
 
-#define PROPERTY_BIT(p)                        (1 << ((p) % 32))
+#define PROPERTY_BIT(p)                        (1u << ((p) % 32))
 #define PROPERTY_VAR(e,p)              (element_info[e].properties[(p) / 32])
 #define HAS_PROPERTY(e,p)      ((PROPERTY_VAR(e, p) & PROPERTY_BIT(p)) != 0)
 #define SET_PROPERTY(e,p,v)    ((v) ?                                     \
 #define IS_ENVELOPE(e)         ((e) >= EL_ENVELOPE_1 &&                \
                                 (e) <= EL_ENVELOPE_4)
 
+#define IS_MM_ENVELOPE(e)      ((e) >= EL_MM_ENVELOPE_1 &&             \
+                                (e) <= EL_MM_ENVELOPE_4)
+
 #define IS_BALLOON_ELEMENT(e)  ((e) == EL_BALLOON ||                   \
                                 (e) == EL_BALLOON_SWITCH_LEFT ||       \
                                 (e) == EL_BALLOON_SWITCH_RIGHT ||      \
                                 IS_EM_GATE_GRAY(e) ?  EM_GATE_GRAY_NR(e) :   \
                                 IS_EMC_GATE_GRAY(e) ? EMC_GATE_GRAY_NR(e) : 0)
 
+#define RND_ENVELOPE_NR(e)     ((e) - EL_ENVELOPE_1)
+#define MM_ENVELOPE_NR(e)      ((e) - EL_MM_ENVELOPE_1)
+#define ENVELOPE_NR(e)         (IS_ENVELOPE(e) ? RND_ENVELOPE_NR(e) :  \
+                                MM_ENVELOPE_NR(e))
+
 #define IS_ACID_POOL_OR_ACID(e)        (IS_ACID_POOL(e) || (e) == EL_ACID)
 
 #define IS_EMC_PILLAR(e)       ((e) >= EL_EMC_WALL_1 &&                \
 #define STD_ELEMENT_CONTENTS   4
 #define MAX_ELEMENT_CONTENTS   8
 
+#define MIN_MM_BALL_CONTENTS   1
+#define STD_MM_BALL_CONTENTS   8
+#define MAX_MM_BALL_CONTENTS   16
+
 // values for initial player inventory
 #define MIN_INITIAL_INVENTORY_SIZE     1
 #define MAX_INITIAL_INVENTORY_SIZE     8
 #define EL_MM_WOODEN_GRID_FIXED_4      (EL_MM_WOODEN_GRID_FIXED_START + 3)
 #define EL_MM_WOODEN_GRID_FIXED_END    EL_MM_WOODEN_GRID_FIXED_03
 #define EL_MM_FUEL_EMPTY               (EL_MM_START + 155)
-
-#define EL_MM_UNUSED_156               (EL_MM_START + 156)
-#define EL_MM_UNUSED_157               (EL_MM_START + 157)
-#define EL_MM_UNUSED_158               (EL_MM_START + 158)
-#define EL_MM_UNUSED_159               (EL_MM_START + 159)
+#define EL_MM_ENVELOPE_1               (EL_MM_START + 156)
+#define EL_MM_ENVELOPE_2               (EL_MM_START + 157)
+#define EL_MM_ENVELOPE_3               (EL_MM_START + 158)
+#define EL_MM_ENVELOPE_4               (EL_MM_START + 159)
 
 #define EL_MM_END_1                    (EL_MM_START + 159)
 #define EL_MM_START_2                  (EL_MM_START + 160)
 #define EL_MM_PACMAN_EATING_UP         (EL_FIRST_RUNTIME_REAL + 78)
 #define EL_MM_PACMAN_EATING_LEFT       (EL_FIRST_RUNTIME_REAL + 79)
 #define EL_MM_PACMAN_EATING_DOWN       (EL_FIRST_RUNTIME_REAL + 80)
+#define EL_MM_BOMB_ACTIVE              (EL_FIRST_RUNTIME_REAL + 81)
+#define EL_DF_MINE_ACTIVE              (EL_FIRST_RUNTIME_REAL + 82)
 
-#define NUM_DRAWABLE_ELEMENTS          (EL_FIRST_RUNTIME_REAL + 81)
+#define NUM_DRAWABLE_ELEMENTS          (EL_FIRST_RUNTIME_REAL + 83)
 
 #define EL_MM_RUNTIME_START            EL_MM_EXIT_OPENING
 #define EL_MM_RUNTIME_END              EL_MM_AMOEBA_WALL_GROWING
 #define EL_MM_LIGHTBALL_RED            (EL_FIRST_DUMMY + 21)
 #define EL_MM_LIGHTBALL_BLUE           (EL_FIRST_DUMMY + 22)
 #define EL_MM_LIGHTBALL_YELLOW         (EL_FIRST_DUMMY + 23)
-#define EL_MM_MASK_MCDUFFIN_RIGHT      (EL_FIRST_DUMMY + 24)
-#define EL_MM_MASK_MCDUFFIN_UP         (EL_FIRST_DUMMY + 25)
-#define EL_MM_MASK_MCDUFFIN_LEFT       (EL_FIRST_DUMMY + 26)
-#define EL_MM_MASK_MCDUFFIN_DOWN       (EL_FIRST_DUMMY + 27)
-#define EL_MM_MASK_GRID_1              (EL_FIRST_DUMMY + 28)
-#define EL_MM_MASK_GRID_2              (EL_FIRST_DUMMY + 29)
-#define EL_MM_MASK_GRID_3              (EL_FIRST_DUMMY + 30)
-#define EL_MM_MASK_GRID_4              (EL_FIRST_DUMMY + 31)
-#define EL_MM_MASK_RECTANGLE           (EL_FIRST_DUMMY + 32)
-#define EL_MM_MASK_CIRCLE              (EL_FIRST_DUMMY + 33)
-#define EL_DEFAULT                     (EL_FIRST_DUMMY + 34)
-#define EL_BD_DEFAULT                  (EL_FIRST_DUMMY + 35)
-#define EL_SP_DEFAULT                  (EL_FIRST_DUMMY + 36)
-#define EL_SB_DEFAULT                  (EL_FIRST_DUMMY + 37)
-#define EL_MM_DEFAULT                  (EL_FIRST_DUMMY + 38)
-#define EL_GRAPHIC_1                   (EL_FIRST_DUMMY + 39)
-#define EL_GRAPHIC_2                   (EL_FIRST_DUMMY + 40)
-#define EL_GRAPHIC_3                   (EL_FIRST_DUMMY + 41)
-#define EL_GRAPHIC_4                   (EL_FIRST_DUMMY + 42)
-#define EL_GRAPHIC_5                   (EL_FIRST_DUMMY + 43)
-#define EL_GRAPHIC_6                   (EL_FIRST_DUMMY + 44)
-#define EL_GRAPHIC_7                   (EL_FIRST_DUMMY + 45)
-#define EL_GRAPHIC_8                   (EL_FIRST_DUMMY + 46)
-
-#define EL_MM_DUMMY_START              EL_MM_MASK_MCDUFFIN_RIGHT
-#define EL_MM_DUMMY_END                        EL_MM_MASK_CIRCLE
+#define EL_DEFAULT                     (EL_FIRST_DUMMY + 24)
+#define EL_BD_DEFAULT                  (EL_FIRST_DUMMY + 25)
+#define EL_SP_DEFAULT                  (EL_FIRST_DUMMY + 26)
+#define EL_SB_DEFAULT                  (EL_FIRST_DUMMY + 27)
+#define EL_MM_DEFAULT                  (EL_FIRST_DUMMY + 28)
+#define EL_GRAPHIC_1                   (EL_FIRST_DUMMY + 29)
+#define EL_GRAPHIC_2                   (EL_FIRST_DUMMY + 30)
+#define EL_GRAPHIC_3                   (EL_FIRST_DUMMY + 31)
+#define EL_GRAPHIC_4                   (EL_FIRST_DUMMY + 32)
+#define EL_GRAPHIC_5                   (EL_FIRST_DUMMY + 33)
+#define EL_GRAPHIC_6                   (EL_FIRST_DUMMY + 34)
+#define EL_GRAPHIC_7                   (EL_FIRST_DUMMY + 35)
+#define EL_GRAPHIC_8                   (EL_FIRST_DUMMY + 36)
 
 // internal elements (only used for internal purposes like copying)
-#define EL_FIRST_INTERNAL              (EL_FIRST_DUMMY + 47)
+#define EL_FIRST_INTERNAL              (EL_FIRST_DUMMY + 37)
 
 #define EL_INTERNAL_CLIPBOARD_CUSTOM   (EL_FIRST_INTERNAL + 0)
 #define EL_INTERNAL_CLIPBOARD_CHANGE   (EL_FIRST_INTERNAL + 1)
@@ -2299,6 +2299,7 @@ enum
 enum
 {
   GFX_SPECIAL_ARG_DEFAULT = 0,
+  GFX_SPECIAL_ARG_LOADING_INITIAL,
   GFX_SPECIAL_ARG_LOADING,
   GFX_SPECIAL_ARG_TITLE_INITIAL,
   GFX_SPECIAL_ARG_TITLE_INITIAL_1,
@@ -2329,6 +2330,7 @@ enum
   GFX_SPECIAL_ARG_CRUMBLED,
   GFX_SPECIAL_ARG_MAINONLY,
   GFX_SPECIAL_ARG_NAMESONLY,
+  GFX_SPECIAL_ARG_SCORESONLY,
   GFX_SPECIAL_ARG_TYPENAME,
   GFX_SPECIAL_ARG_TYPENAMES,
   GFX_SPECIAL_ARG_SUBMENU,
@@ -2409,6 +2411,7 @@ enum
   GFX_ARG_DELAY,
   GFX_ARG_ANIM_MODE,
   GFX_ARG_GLOBAL_SYNC,
+  GFX_ARG_GLOBAL_ANIM_SYNC,
   GFX_ARG_CRUMBLED_LIKE,
   GFX_ARG_DIGGABLE_LIKE,
   GFX_ARG_BORDER_SIZE,
@@ -2453,6 +2456,10 @@ enum
   GFX_ARG_ACTIVE_YOFFSET,
   GFX_ARG_PRESSED_XOFFSET,
   GFX_ARG_PRESSED_YOFFSET,
+  GFX_ARG_STACKED_XFACTOR,
+  GFX_ARG_STACKED_YFACTOR,
+  GFX_ARG_STACKED_XOFFSET,
+  GFX_ARG_STACKED_YOFFSET,
 
   NUM_GFX_ARGS
 };
@@ -2551,6 +2558,7 @@ enum
 
 // values for game_status (must match special image configuration suffixes)
 #define GAME_MODE_DEFAULT              GFX_SPECIAL_ARG_DEFAULT
+#define GAME_MODE_LOADING_INITIAL      GFX_SPECIAL_ARG_LOADING_INITIAL
 #define GAME_MODE_LOADING              GFX_SPECIAL_ARG_LOADING
 #define GAME_MODE_TITLE_INITIAL                GFX_SPECIAL_ARG_TITLE_INITIAL
 #define GAME_MODE_TITLE_INITIAL_1      GFX_SPECIAL_ARG_TITLE_INITIAL_1
@@ -2581,6 +2589,7 @@ enum
 #define GAME_MODE_PSEUDO_CRUMBLED      GFX_SPECIAL_ARG_CRUMBLED
 #define GAME_MODE_PSEUDO_MAINONLY      GFX_SPECIAL_ARG_MAINONLY
 #define GAME_MODE_PSEUDO_NAMESONLY     GFX_SPECIAL_ARG_NAMESONLY
+#define GAME_MODE_PSEUDO_SCORESONLY    GFX_SPECIAL_ARG_SCORESONLY
 #define GAME_MODE_PSEUDO_TYPENAME      GFX_SPECIAL_ARG_TYPENAME
 #define GAME_MODE_PSEUDO_TYPENAMES     GFX_SPECIAL_ARG_TYPENAMES
 #define GAME_MODE_PSEUDO_SUBMENU       GFX_SPECIAL_ARG_SUBMENU
@@ -2606,18 +2615,18 @@ enum
 // program information and versioning definitions
 #define PROGRAM_VERSION_SUPER          4
 #define PROGRAM_VERSION_MAJOR          3
-#define PROGRAM_VERSION_MINOR          2
-#define PROGRAM_VERSION_PATCH          0
+#define PROGRAM_VERSION_MINOR          4
+#define PROGRAM_VERSION_PATCH          1
 #define PROGRAM_VERSION_EXTRA          ""
 
 #define PROGRAM_TITLE_STRING           "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING          "Holger Schemel"
 #define PROGRAM_EMAIL_STRING           "info@artsoft.org"
 #define PROGRAM_WEBSITE_STRING         "https://www.artsoft.org/"
-#define PROGRAM_COPYRIGHT_STRING       "Copyright \xa9""1995-2022 by Holger Schemel"
+#define PROGRAM_COPYRIGHT_STRING       "1995-2022 by Holger Schemel"
 #define PROGRAM_COMPANY_STRING         "A Game by Artsoft Entertainment"
 
-#define PROGRAM_ICON_FILENAME          "RocksIcon32x32.png"
+#define PROGRAM_ICON_FILENAME          "icons/icon.png"
 
 #define COOKIE_PREFIX                  "ROCKSNDIAMONDS"
 
@@ -2745,6 +2754,7 @@ struct MenuMainButtonInfo
   struct MenuPosInfo insert_solution;
   struct MenuPosInfo play_solution;
 
+  struct MenuPosInfo levelset_info;
   struct MenuPosInfo switch_ecs_aga;
 };
 
@@ -2810,6 +2820,9 @@ struct MenuScoresButtonInfo
 {
   struct MenuPosInfo prev_level;
   struct MenuPosInfo next_level;
+  struct MenuPosInfo prev_score;
+  struct MenuPosInfo next_score;
+  struct MenuPosInfo play_tape;
 };
 
 struct MenuScoresInfo
@@ -2847,7 +2860,9 @@ struct TitleMessageInfo
 
 struct InitInfo
 {
+  struct MenuPosInfo busy_initial;
   struct MenuPosInfo busy;
+  struct MenuPosInfo busy_playfield;
 };
 
 struct MenuInfo
@@ -3114,10 +3129,14 @@ struct ScoreInfo
   int last_added_local;
   int last_level_nr;
   int last_entry_nr;
+  int next_level_nr;
 
   boolean updated;
   boolean uploaded;
+  boolean tape_downloaded;
   boolean force_last_added;
+  boolean continue_playing;
+  boolean continue_on_return;
 
   struct ScoreEntry entry[MAX_SCORE_ENTRIES];
 };
@@ -3286,6 +3305,10 @@ struct LevelInfo
   int mm_time_ball;
   int mm_time_block;
 
+  int num_mm_ball_contents;
+  int mm_ball_choice_mode;
+  int mm_ball_content[MAX_MM_BALL_CONTENTS];
+
   // ('int' instead of 'boolean' because used as selectbox value in editor)
   int use_step_counter;                // count steps instead of seconds for level
 
@@ -3613,6 +3636,7 @@ struct GraphicInfo
   int anim_mode;
 
   boolean anim_global_sync;
+  boolean anim_global_anim_sync;
 
   int crumbled_like;           // element for cloning crumble graphics
   int diggable_like;           // element for cloning digging graphics
@@ -3670,6 +3694,11 @@ struct GraphicInfo
   int pressed_xoffset;
   int pressed_yoffset;
 
+  int stacked_xfactor;
+  int stacked_yfactor;
+  int stacked_xoffset;
+  int stacked_yoffset;
+
   boolean use_image_size;      // use image size as default width and height
 };
 
@@ -3709,7 +3738,7 @@ struct MusicFileInfo
 
   boolean is_sound;
 
-  struct MusicFileInfo *next;
+  struct MusicFileInfo *prev, *next;
 };
 
 struct ElementActionInfo
@@ -3742,7 +3771,6 @@ struct HelpAnimInfo
 
 
 extern Bitmap                 *bitmap_db_field;
-extern Bitmap                 *bitmap_db_panel;
 extern Bitmap                 *bitmap_db_door_1;
 extern Bitmap                 *bitmap_db_door_2;
 extern Bitmap                 *bitmap_db_store_1;
@@ -3753,6 +3781,7 @@ extern DrawBuffer        *drawto_field;
 extern int                     game_status;
 extern int                     game_status_last_screen;
 extern boolean                 level_editor_test_game;
+extern boolean                 score_info_tape_play;
 extern boolean                 network_playing;
 
 extern int                     key_joystick_mapping;
@@ -3895,6 +3924,7 @@ extern SetupFileHash             *element_token_hash;
 extern SetupFileHash          *graphic_token_hash;
 extern SetupFileHash          *font_token_hash;
 extern SetupFileHash          *hide_setup_hash;
+extern SetupFileHash          *anim_url_hash;
 extern struct ConfigTypeInfo   image_config_suffix[];
 extern struct ConfigTypeInfo   sound_config_suffix[];
 extern struct ConfigTypeInfo   music_config_suffix[];