version number set to 4.3.0.1
[rocksndiamonds.git] / src / main.h
index 003b3b522936830fe0f559c21ca4b5b95b3bcebb..f153b244e09a7e963208d14807b343941c9e1ddd 100644 (file)
@@ -4,7 +4,7 @@
 // (c) 1995-2014 by Artsoft Entertainment
 //                         Holger Schemel
 //                 info@artsoft.org
-//                 http://www.artsoft.org/
+//                 https://www.artsoft.org/
 // ----------------------------------------------------------------------------
 // main.h
 // ============================================================================
 #define CH_SIDE_TOP_BOTTOM             MV_VERTICAL
 #define CH_SIDE_ANY                    MV_ANY_DIRECTION
 
+#define CH_SIDE_FROM_BUTTON(b) ((b) == MB_LEFTBUTTON   ? CH_SIDE_LEFT :       \
+                                (b) == MB_RIGHTBUTTON  ? CH_SIDE_RIGHT :      \
+                                (b) == MB_MIDDLEBUTTON ? CH_SIDE_TOP_BOTTOM : \
+                                CH_SIDE_NONE)
+
 // values for change player for custom elements
 #define CH_PLAYER_NONE                 PLAYER_BITS_NONE
 #define CH_PLAYER_1                    PLAYER_BITS_1
 #define GFX_CRUMBLED(e)                HAS_PROPERTY(GFX_ELEMENT(e), EP_GFX_CRUMBLED)
 
 // macros for pre-defined properties
-#define ELEM_IS_PLAYER(e)      HAS_PROPERTY(e, EP_PLAYER)
+#define IS_PLAYER_ELEMENT(e)   HAS_PROPERTY(e, EP_PLAYER)
 #define CAN_PASS_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_MAGIC_WALL)
 #define CAN_PASS_DC_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_DC_MAGIC_WALL)
 #define IS_SWITCHABLE(e)       HAS_PROPERTY(e, EP_SWITCHABLE)
 #define IS_DC_STEELWALL_2(e)   ((e) >= EL_DC_STEELWALL_2_LEFT &&       \
                                 (e) <= EL_DC_STEELWALL_2_SINGLE)
 
+// !!! IMPROVE THIS !!!
+#define IS_EM_ELEMENT(e)       (map_element_EM_to_RND_cave(map_element_RND_to_EM_cave(e)) == (e))
+
 #define MM_WALL_BASE(e)                ((e) & 0xfff0)
 #define MM_WALL_BITS(e)                ((e) & 0x000f)
 
 #if 1
 #define TILE_GFX_ELEMENT(x, y)                                         \
                   (GfxElement[x][y] != EL_UNDEFINED &&                 \
-                   Feld[x][y] != EL_EXPLOSION ?                        \
-                   GfxElement[x][y] : Feld[x][y])
+                   Tile[x][y] != EL_EXPLOSION ?                        \
+                   GfxElement[x][y] : Tile[x][y])
 #else
 #define TILE_GFX_ELEMENT(x, y)                                         \
        GFX_ELEMENT(GfxElement[x][y] != EL_UNDEFINED &&                 \
-                   Feld[x][y] != EL_EXPLOSION ?                        \
-                   GfxElement[x][y] : Feld[x][y])
+                   Tile[x][y] != EL_EXPLOSION ?                        \
+                   GfxElement[x][y] : Tile[x][y])
 #endif
 
 // !!! "use sound" deactivated due to problems with level "bug machine" !!!
        (ge == EL_ANY_ELEMENT ? TRUE :                                  \
         IS_GROUP_ELEMENT(ge) ? IS_IN_GROUP(e, GROUP_NR(ge)) : (e) == (ge))
 
-#define IS_PLAYER(x, y)                (ELEM_IS_PLAYER(StorePlayer[x][y]))
+#define IS_PLAYER(x, y)                (IS_PLAYER_ELEMENT(StorePlayer[x][y]))
 
-#define IS_FREE(x, y)          (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x, y))
-#define IS_FREE_OR_PLAYER(x, y)        (Feld[x][y] == EL_EMPTY)
+#define IS_FREE(x, y)          (Tile[x][y] == EL_EMPTY && !IS_PLAYER(x, y))
+#define IS_FREE_OR_PLAYER(x, y)        (Tile[x][y] == EL_EMPTY)
 
 #define IS_MOVING(x,y)         (MovPos[x][y] != 0)
 #define IS_FALLING(x,y)                (MovPos[x][y] != 0 && MovDir[x][y] == MV_DOWN)
-#define IS_BLOCKED(x,y)                (Feld[x][y] == EL_BLOCKED)
+#define IS_BLOCKED(x,y)                (Tile[x][y] == EL_BLOCKED)
 
 #define IS_MV_DIAGONAL(x)      ((x) & MV_HORIZONTAL && (x) & MV_VERTICAL)
 
 #define PLAYERINFO(x,y)                (&stored_player[StorePlayer[x][y]-EL_PLAYER_1])
 #define SHIELD_ON(p)           ((p)->shield_normal_time_left > 0)
 
-#define ENEMY_PROTECTED_FIELD(x,y)     (IS_PROTECTED(Feld[x][y]) ||       \
+#define ENEMY_PROTECTED_FIELD(x,y)     (IS_PROTECTED(Tile[x][y]) ||       \
                                         IS_PROTECTED(Back[x][y]))
-#define EXPLOSION_PROTECTED_FIELD(x,y)  (IS_EXPLOSION_PROOF(Feld[x][y]))
+#define EXPLOSION_PROTECTED_FIELD(x,y)  (IS_EXPLOSION_PROOF(Tile[x][y]))
 #define PLAYER_ENEMY_PROTECTED(x,y)     (SHIELD_ON(PLAYERINFO(x, y)) ||           \
                                         ENEMY_PROTECTED_FIELD(x, y))
 #define PLAYER_EXPLOSION_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) ||           \
 #define MAX_ELEMENTS_IN_GROUP  16
 #define MIN_ANDROID_ELEMENTS   1
 #define MAX_ANDROID_ELEMENTS   32
-#define MAX_ANDROID_ELEMENTS_OLD 16    // (extended after version 4.1.4.1)
+#define MAX_ANDROID_ELEMENTS_OLD 16    // (extended since version 4.2.0.0)
 
 // values for elements with content
 #define MIN_ELEMENT_CONTENTS   1
 #define EL_MM_END_2                    (EL_DF_START2 + 430)
 #define EL_MM_END                      EL_MM_END_2
 
-#define NUM_FILE_ELEMENTS              1215
+#define EL_SPRING_LEFT                 1215
+#define EL_SPRING_RIGHT                        1216
+
+#define NUM_FILE_ELEMENTS              1217
 
 
 // "real" (and therefore drawable) runtime elements
@@ -2273,6 +2284,7 @@ enum
   GFX_SPECIAL_ARG_TITLE_4,
   GFX_SPECIAL_ARG_TITLE_5,
   GFX_SPECIAL_ARG_MAIN,
+  GFX_SPECIAL_ARG_NAMES,
   GFX_SPECIAL_ARG_LEVELS,
   GFX_SPECIAL_ARG_LEVELNR,
   GFX_SPECIAL_ARG_SCORES,
@@ -2286,7 +2298,9 @@ enum
   GFX_SPECIAL_ARG_PREVIEW,
   GFX_SPECIAL_ARG_CRUMBLED,
   GFX_SPECIAL_ARG_MAINONLY,
+  GFX_SPECIAL_ARG_NAMESONLY,
   GFX_SPECIAL_ARG_TYPENAME,
+  GFX_SPECIAL_ARG_TYPENAMES,
   GFX_SPECIAL_ARG_SUBMENU,
   GFX_SPECIAL_ARG_MENU,
   GFX_SPECIAL_ARG_TOONS,
@@ -2521,6 +2535,7 @@ enum
 #define GAME_MODE_TITLE_4              GFX_SPECIAL_ARG_TITLE_4
 #define GAME_MODE_TITLE_5              GFX_SPECIAL_ARG_TITLE_5
 #define GAME_MODE_MAIN                 GFX_SPECIAL_ARG_MAIN
+#define GAME_MODE_NAMES                        GFX_SPECIAL_ARG_NAMES
 #define GAME_MODE_LEVELS               GFX_SPECIAL_ARG_LEVELS
 #define GAME_MODE_LEVELNR              GFX_SPECIAL_ARG_LEVELNR
 #define GAME_MODE_SCORES               GFX_SPECIAL_ARG_SCORES
@@ -2534,7 +2549,9 @@ enum
 #define GAME_MODE_PSEUDO_PREVIEW       GFX_SPECIAL_ARG_PREVIEW
 #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_TYPENAME      GFX_SPECIAL_ARG_TYPENAME
+#define GAME_MODE_PSEUDO_TYPENAMES     GFX_SPECIAL_ARG_TYPENAMES
 #define GAME_MODE_PSEUDO_SUBMENU       GFX_SPECIAL_ARG_SUBMENU
 #define GAME_MODE_PSEUDO_MENU          GFX_SPECIAL_ARG_MENU
 #define GAME_MODE_PSEUDO_TOONS         GFX_SPECIAL_ARG_TOONS
@@ -2557,16 +2574,16 @@ enum
 
 // program information and versioning definitions
 #define PROGRAM_VERSION_SUPER          4
-#define PROGRAM_VERSION_MAJOR          1
-#define PROGRAM_VERSION_MINOR          4
-#define PROGRAM_VERSION_PATCH          2
+#define PROGRAM_VERSION_MAJOR          3
+#define PROGRAM_VERSION_MINOR          0
+#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         "http://www.artsoft.org/"
-#define PROGRAM_COPYRIGHT_STRING       "Copyright \xa9""1995-2019 by Holger Schemel"
+#define PROGRAM_WEBSITE_STRING         "https://www.artsoft.org/"
+#define PROGRAM_COPYRIGHT_STRING       "Copyright \xa9""1995-2021 by Holger Schemel"
 #define PROGRAM_COMPANY_STRING         "A Game by Artsoft Entertainment"
 
 #define PROGRAM_ICON_FILENAME          "RocksIcon32x32.png"
@@ -2607,7 +2624,7 @@ enum
 // values for game_emulation
 #define EMU_NONE                       0
 #define EMU_BOULDERDASH                        1
-#define EMU_SOKOBAN                    2
+#define EMU_UNUSED_2                   2
 #define EMU_SUPAPLEX                   3
 
 // values for level file type identifier
@@ -2638,6 +2655,9 @@ enum
 #define AUTOPLAY_FFWD                  (1 << 1)
 #define AUTOPLAY_WARP                  (1 << 2)
 #define AUTOPLAY_TEST                  (1 << 3)
+#define AUTOPLAY_SAVE                  (1 << 4)
+#define AUTOPLAY_UPLOAD                        (1 << 5)
+#define AUTOPLAY_FIX                   (1 << 6)
 #define AUTOPLAY_WARP_NO_DISPLAY       AUTOPLAY_TEST
 
 #define AUTOPLAY_MODE_NONE             0
@@ -2645,6 +2665,9 @@ enum
 #define AUTOPLAY_MODE_FFWD             (AUTOPLAY_MODE_PLAY | AUTOPLAY_FFWD)
 #define AUTOPLAY_MODE_WARP             (AUTOPLAY_MODE_FFWD | AUTOPLAY_WARP)
 #define AUTOPLAY_MODE_TEST             (AUTOPLAY_MODE_WARP | AUTOPLAY_TEST)
+#define AUTOPLAY_MODE_SAVE             (AUTOPLAY_MODE_TEST | AUTOPLAY_SAVE)
+#define AUTOPLAY_MODE_UPLOAD           (AUTOPLAY_MODE_TEST | AUTOPLAY_UPLOAD)
+#define AUTOPLAY_MODE_FIX              (AUTOPLAY_MODE_TEST | AUTOPLAY_FIX)
 #define AUTOPLAY_MODE_WARP_NO_DISPLAY  AUTOPLAY_MODE_TEST
 
 
@@ -2876,9 +2899,15 @@ struct RequestInfo
   int anim_mode;
   int align;
   int valign;
+  int sort_priority;
   boolean autowrap;
   boolean centered;
   boolean wrap_single_words;
+
+  // run-time values
+  Bitmap *bitmap;
+  int sx, sy;
+  int xsize, ysize;
 };
 
 struct PreviewInfo
@@ -3013,10 +3042,31 @@ struct ViewportInfo
   struct RectWithBorder door_2[NUM_SPECIAL_GFX_ARGS];
 };
 
-struct HiScore
+struct ScoreEntry
+{
+  char tape_basename[MAX_FILENAME_LEN + 1];
+  char name[MAX_PLAYER_NAME_LEN + 1];
+  int score;
+  int time;            // time (in frames) or steps played
+};
+
+struct ScoreInfo
 {
-  char Name[MAX_PLAYER_NAME_LEN + 1];
-  int Score;
+  int file_version;    // file format version the score is stored with
+  int game_version;    // game release version the score was created with
+
+  char level_identifier[MAX_FILENAME_LEN + 1];
+  int level_nr;
+
+  int num_entries;
+  int last_added;
+  int last_added_local;
+
+  boolean updated;
+  boolean uploaded;
+  boolean force_last_added;
+
+  struct ScoreEntry entry[MAX_SCORE_ENTRIES];
 };
 
 struct Content
@@ -3082,6 +3132,7 @@ struct LevelInfo
   int time;                            // available time (seconds)
   int gems_needed;
   boolean auto_count_gems;
+  boolean rate_time_over_score;
 
   char name[MAX_LEVEL_NAME_LEN + 1];
   char author[MAX_LEVEL_AUTHOR_LEN + 1];
@@ -3166,6 +3217,8 @@ struct LevelInfo
   boolean sb_objects_needed;   // all Sokoban objects must be solved
   boolean auto_exit_sokoban;   // automatically finish solved Sokoban levels
   boolean solved_by_one_player;        // level is solved if one player enters exit
+  boolean finish_dig_collect;  // only finished dig/collect triggers ce action
+  boolean keep_walkable_ce;    // keep walkable CE if it changes to the player
 
   boolean continuous_snapping; // repeated snapping without releasing key
   boolean block_snap_field;    // snapping blocks field to show animation
@@ -3183,6 +3236,8 @@ struct LevelInfo
   // ('int' instead of 'boolean' because used as selectbox value in editor)
   int use_step_counter;                // count steps instead of seconds for level
 
+  int time_score_base;         // use time score for 1 or 10 seconds/steps
+
   short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
   boolean use_custom_template; // use custom properties from template file
@@ -3213,13 +3268,26 @@ struct GlobalInfo
 {
   char *autoplay_leveldir;
   int autoplay_level[MAX_TAPES_PER_SET];
+  int autoplay_mode;
   boolean autoplay_all;
-  boolean autoplay_mode;
+  time_t autoplay_time;
+
+  char *patchtapes_mode;
+  char *patchtapes_leveldir;
+  int patchtapes_level[MAX_TAPES_PER_SET];
+  boolean patchtapes_all;
 
   char *convert_leveldir;
   int convert_level_nr;
 
-  char *create_images_dir;
+  char *dumplevel_leveldir;
+  int dumplevel_level_nr;
+
+  char *dumptape_leveldir;
+  int dumptape_level_nr;
+
+  char *create_sketch_images_dir;
+  char *create_collect_images_dir;
 
   int num_toons;
 
@@ -3234,6 +3302,8 @@ struct GlobalInfo
   int anim_status_next;
 
   boolean use_envelope_request;
+
+  char **user_names;
 };
 
 struct ElementChangeInfo
@@ -3367,6 +3437,8 @@ struct ElementInfo
   int drop_delay_random;       // additional random delay after dropping
   int move_delay_fixed;                // constant delay after moving
   int move_delay_random;       // additional random delay after moving
+  int step_delay_fixed;                // constant delay while moving
+  int step_delay_random;       // additional random delay while moving
 
   int move_pattern;            // direction movable element moves to
   int move_direction_initial;  // initial direction element moves to
@@ -3626,15 +3698,13 @@ extern DrawBuffer              *fieldbuffer;
 extern DrawBuffer             *drawto_field;
 
 extern int                     game_status;
-extern boolean                 game_status_last_screen;
+extern int                     game_status_last_screen;
 extern boolean                 level_editor_test_game;
 extern boolean                 network_playing;
-extern boolean                 network_server;
-extern SDL_Thread             *server_thread;
 
 extern int                     key_joystick_mapping;
 
-extern short                   Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   Tile[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Last[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -3714,7 +3784,7 @@ extern boolean                    network_player_action_received;
 extern int                     graphics_action_mapping[];
 
 extern struct LevelInfo                level, level_template;
-extern struct HiScore          highscore[];
+extern struct ScoreInfo                scores, server_scores;
 extern struct TapeInfo         tape;
 extern struct GlobalInfo       global;
 extern struct BorderInfo       border;