added optional button to restart game (door, panel and touch variants)
[rocksndiamonds.git] / src / libgame / system.h
index 26254d9cd52d8c612db80c4da23a72da2db8c66f..73d50ddc0b4ccfcb2b9df2c6b908aa197fae4b61 100644 (file)
@@ -16,9 +16,9 @@
 #include "types.h"
 
 
-#if defined(PLATFORM_MACOSX)
+#if defined(PLATFORM_MAC)
 #include "macosx.h"
-#elif defined(PLATFORM_WIN32)
+#elif defined(PLATFORM_WINDOWS)
 #include "windows.h"
 #elif defined(PLATFORM_ANDROID)
 #include "android.h"
 #define STR_NETWORK_AUTO_DETECT                "auto_detect_network_server"
 #define STR_NETWORK_AUTO_DETECT_SETUP  "(auto detect network server)"
 
+// values for API server settings
+#define API_SERVER_HOSTNAME            "api.artsoft.org"
+#define API_SERVER_PORT                        80
+#define API_SERVER_METHOD              "POST"
+#define API_SERVER_URI_ADD             "/api/scores/add"
+#define API_SERVER_URI_GET             "/api/scores/get"
+#define API_SERVER_URI_GETTAPE         "/api/scores/gettape"
+#define API_SERVER_URI_RENAME          "/api/players/rename"
+#define API_SERVER_URI_RESETUUID       "/api/players/resetuuid"
+
+#if defined(TESTING)
+#undef API_SERVER_HOSTNAME
+#define API_SERVER_HOSTNAME            "api-test.artsoft.org"
+#define TEST_PREFIX                    "test."
+#else
+#define TEST_PREFIX                    ""
+#endif
+
 // values for touch control
 #define TOUCH_CONTROL_OFF              "off"
 #define TOUCH_CONTROL_VIRTUAL_BUTTONS  "virtual_buttons"
 #define USE_TOUCH_INPUT_OVERLAY
 #define USE_COMPLETE_DISPLAY
 #define HAS_SCREEN_KEYBOARD
-#define SCREEN_KEYBOARD_POS(h)         ((h) / 2)
+#define SCREEN_KEYBOARD_POS(h)         ((h) * 40 / 100)
 #endif
 
 // values for drag-and-drop support (some parts not added before SDL 2.0.5)
 #define DEFAULT_KEY_RIGHT              KSYM_Right
 #define DEFAULT_KEY_UP                 KSYM_Up
 #define DEFAULT_KEY_DOWN               KSYM_Down
-#if defined(PLATFORM_MACOSX)
+#if defined(PLATFORM_MAC)
 #define DEFAULT_KEY_SNAP               KSYM_Control_L
 #define DEFAULT_KEY_DROP               KSYM_KP_Enter
 #else
 // default shortcut keys
 #define DEFAULT_KEY_SAVE_GAME          KSYM_F1
 #define DEFAULT_KEY_LOAD_GAME          KSYM_F2
+#define DEFAULT_KEY_RESTART_GAME       KSYM_F3
+#define DEFAULT_KEY_PAUSE_BEFORE_END   KSYM_F4
 #define DEFAULT_KEY_TOGGLE_PAUSE       KSYM_space
 #define DEFAULT_KEY_FOCUS_PLAYER_1     KSYM_F5
 #define DEFAULT_KEY_FOCUS_PLAYER_2     KSYM_F6
 #define MB_MENU_MARK                   TRUE
 #define MB_MENU_INITIALIZE             (-1)
 #define MB_MENU_LEAVE                  (-2)
+#define MB_MENU_CONTINUE               (-3)
 #define MB_LEFTBUTTON                  1
 #define MB_MIDDLEBUTTON                        2
 #define MB_RIGHTBUTTON                 3
 // values for drawing stages for global animations
 #define DRAW_GLOBAL_ANIM_STAGE_1       1
 #define DRAW_GLOBAL_ANIM_STAGE_2       2
+#define DRAW_GLOBAL_ANIM_STAGE_3       3
+#define DRAW_GLOBAL_ANIM_STAGE_RESTART 4
 
 // values for drawing target (various functions)
 #define DRAW_TO_BACKBUFFER             0
 #define ANIM_CE_DELAY          (1 << 7)
 #define ANIM_REVERSE           (1 << 8)
 #define ANIM_OPAQUE_PLAYER     (1 << 9)
+#define ANIM_LEVEL_NR          (1 << 10)
 
 // values for special (non game element) animation modes
 // (not stored in level files -- can be changed, if needed)
-#define ANIM_HORIZONTAL                (1 << 10)
-#define ANIM_VERTICAL          (1 << 11)
-#define ANIM_CENTERED          (1 << 12)
-#define ANIM_STATIC_PANEL      (1 << 13)
-#define ANIM_ALL               (1 << 14)
-#define ANIM_ONCE              (1 << 15)
+#define ANIM_HORIZONTAL                (1 << 11)
+#define ANIM_VERTICAL          (1 << 12)
+#define ANIM_CENTERED          (1 << 13)
+#define ANIM_STATIC_PANEL      (1 << 14)
+#define ANIM_ALL               (1 << 15)
+#define ANIM_ONCE              (1 << 16)
+#define ANIM_TILED             (1 << 17)
+#define ANIM_RANDOM_STATIC     (1 << 18)
 
 #define ANIM_DEFAULT           ANIM_LOOP
 
+// values for special global animation events
+#define ANIM_EVENT_UNDEFINED   -1
+#define ANIM_EVENT_NONE                0
+#define ANIM_EVENT_SELF                (1 << 0)
+#define ANIM_EVENT_ANY         (1 << 1)
+#define ANIM_EVENT_CLICK       (1 << 2)
+#define ANIM_EVENT_INIT                (1 << 3)
+#define ANIM_EVENT_START       (1 << 4)
+#define ANIM_EVENT_END         (1 << 5)
+#define ANIM_EVENT_POST                (1 << 6)
+#define ANIM_EVENT_UNCLICK_ANY (1 << 7)
+#define ANIM_EVENT_CE_CHANGE   (1 << 8)
+
+// event mask:  bits 0-15
+// CE number:   bits 16-23
+// anim number: bits 16-23
+// page number: bits 24-31
+// part number: bits 24-31
+#define ANIM_EVENT_CE_BIT      16
+#define ANIM_EVENT_ANIM_BIT    16
+#define ANIM_EVENT_PAGE_BIT    24
+#define ANIM_EVENT_PART_BIT    24
+
+#define ANIM_EVENT_CE_MASK     (0xff << ANIM_EVENT_CE_BIT)
+#define ANIM_EVENT_ANIM_MASK   (0xff << ANIM_EVENT_ANIM_BIT)
+#define ANIM_EVENT_PAGE_MASK   (0xff << ANIM_EVENT_PAGE_BIT)
+#define ANIM_EVENT_PART_MASK   (0xff << ANIM_EVENT_PART_BIT)
+
+#define ANIM_EVENT_DEFAULT     ANIM_EVENT_NONE
+
+// values for special global animation event actions
+#define ANIM_EVENT_ACTION_NONE -1
+
+// values for special global animation delay types
+#define ANIM_DELAY_UNDEFINED   -1
+#define ANIM_DELAY_NONE                0
+#define ANIM_DELAY_INIT                1
+#define ANIM_DELAY_ANIM                2
+#define ANIM_DELAY_POST                3
+
+// values for special global animation delay actions
+#define ANIM_DELAY_ACTION_NONE -1
+
 // values for special drawing styles and event handling
 #define STYLE_NONE             0
 
 #define STYLE_BLOCK            (1 << 4)
 #define STYLE_PASSTHROUGH      (1 << 5)
 #define STYLE_MULTIPLE_ACTIONS (1 << 6)
+#define STYLE_CONSUME_CE_EVENT (1 << 7)
 
 #define STYLE_DEFAULT          STYLE_NONE
 
-// values for special global animation delay types
-#define ANIM_DELAY_UNDEFINED   -1
-#define ANIM_DELAY_NONE                0
-#define ANIM_DELAY_INIT                1
-#define ANIM_DELAY_ANIM                2
-#define ANIM_DELAY_POST                3
-
-// values for special global animation delay actions
-#define ANIM_DELAY_ACTION_NONE -1
-
-// values for special global animation events
-#define ANIM_EVENT_UNDEFINED   -1
-#define ANIM_EVENT_NONE                0
-#define ANIM_EVENT_SELF                (1 << 16)
-#define ANIM_EVENT_ANY         (1 << 17)
-#define ANIM_EVENT_CLICK       (1 << 18)
-#define ANIM_EVENT_INIT                (1 << 19)
-#define ANIM_EVENT_START       (1 << 20)
-#define ANIM_EVENT_END         (1 << 21)
-#define ANIM_EVENT_POST                (1 << 22)
-#define ANIM_EVENT_UNCLICK_ANY (1 << 23)
-
-// anim number: bits 0-7
-// part number: bits 8-15
-#define ANIM_EVENT_ANIM_BIT    0
-#define ANIM_EVENT_PART_BIT    8
-
-#define ANIM_EVENT_ANIM_MASK   (0xff << ANIM_EVENT_ANIM_BIT)
-#define ANIM_EVENT_PART_MASK   (0xff << ANIM_EVENT_PART_BIT)
-
-#define ANIM_EVENT_DEFAULT     ANIM_EVENT_NONE
-
-// values for special global animation event actions
-#define ANIM_EVENT_ACTION_NONE -1
-
 // values for fade mode
 #define FADE_TYPE_NONE         0
 #define FADE_TYPE_FADE_IN      (1 << 0)
 #define POS_LOWER              5
 #define POS_BOTTOM             6
 #define POS_ANY                        7
-#define POS_LAST               8
+#define POS_CE                 8
+#define POS_CE_TRIGGER         9
+#define POS_LAST               10
 
 // values for text alignment
 #define ALIGN_LEFT             (1 << 0)
 #define VALIGN_MIDDLE          (1 << 2)
 #define VALIGN_DEFAULT         VALIGN_TOP
 
-#define ALIGNED_XPOS(x,w,a)    ((a) == ALIGN_CENTER  ? (x) - (w) / 2 : \
+#define ALIGNED_XPOS(x, w, a)  ((a) == ALIGN_CENTER  ? (x) - (w) / 2 : \
                                 (a) == ALIGN_RIGHT   ? (x) - (w) : (x))
-#define ALIGNED_YPOS(y,h,v)    ((v) == VALIGN_MIDDLE ? (y) - (h) / 2 : \
+#define ALIGNED_YPOS(y, h, v)  ((v) == VALIGN_MIDDLE ? (y) - (h) / 2 : \
                                 (v) == VALIGN_BOTTOM ? (y) - (h) : (y))
 #define ALIGNED_TEXT_XPOS(p)   ALIGNED_XPOS((p)->x, (p)->width,  (p)->align)
 #define ALIGNED_TEXT_YPOS(p)   ALIGNED_YPOS((p)->y, (p)->height, (p)->valign)
                                         JOY_NO_ACTION)
 
 // maximum number of level sets in the level set history
-#define MAX_LEVELDIR_HISTORY   12
+#define MAX_LEVELDIR_HISTORY   100
 
 // default name for empty highscore entry
 #define EMPTY_PLAYER_NAME      "no name"
 // default value for undefined levelset
 #define UNDEFINED_LEVELSET     "[NONE]"
 
-// default value for undefined parameter
+// default value for undefined password
+#define UNDEFINED_PASSWORD     "[undefined]"
+
+// default value for undefined string parameter
+#define ARG_UNDEFINED_STRING   "[undefined]"
+
+// default value for default string parameter
 #define ARG_DEFAULT            "[DEFAULT]"
 
-// default values for undefined configuration file parameters
+// default values for undefined numerical parameter (as string and integer)
 #define ARG_UNDEFINED          "-1000000"
 #define ARG_UNDEFINED_VALUE    (-1000000)
 
 // default value for off-screen positions
 #define POS_OFFSCREEN          (-1000000)
 
-// definitions for game sub-directories
-#ifndef RO_GAME_DIR
-#define RO_GAME_DIR            "."
-#endif
-
-#ifndef RW_GAME_DIR
-#define RW_GAME_DIR            "."
+// definitions for game base path and sub-directories
+#ifndef BASE_PATH
+#define BASE_PATH              "."
 #endif
 
-#define RO_BASE_PATH           RO_GAME_DIR
-#define RW_BASE_PATH           RW_GAME_DIR
-
 // directory names
 #define GRAPHICS_DIRECTORY     "graphics"
 #define SOUNDS_DIRECTORY       "sounds"
 #define TAPES_DIRECTORY                "tapes"
 #define SCORES_DIRECTORY       "scores"
 #define DOCS_DIRECTORY         "docs"
+#define ELEMENTS_DIRECTORY     "elements"
+#define CREDITS_DIRECTORY      "credits"
+#define PROGRAM_INFO_DIRECTORY "program"
+#define LEVELSET_INFO_DIRECTORY        "levelset"
 #define CACHE_DIRECTORY                "cache"
 #define CONF_DIRECTORY         "conf"
 #define NETWORK_DIRECTORY      "network"
 #define USERS_DIRECTORY                "users"
+#define PERSISTENT_DIRECTORY   "/persistent"
 
 #define GFX_CLASSIC_SUBDIR     "gfx_classic"
 #define SND_CLASSIC_SUBDIR     "snd_classic"
 #define USERSETUP_FILENAME     "usersetup.conf"
 #define AUTOSETUP_FILENAME     "autosetup.conf"
 #define LEVELSETUP_FILENAME    "levelsetup.conf"
+#define SERVERSETUP_FILENAME   "serversetup.conf"
 #define EDITORSETUP_FILENAME   "editorsetup.conf"
 #define EDITORCASCADE_FILENAME "editorcascade.conf"
 #define HELPANIM_FILENAME      "helpanim.conf"
 #define MUSICINFO_FILENAME     "musicinfo.conf"
 #define ARTWORKINFO_CACHE_FILE "artworkinfo.cache"
 #define LEVELTEMPLATE_FILENAME "template.level"
+#define UPLOADED_FILENAME      ".uploaded"
 #define LEVELFILE_EXTENSION    "level"
 #define TAPEFILE_EXTENSION     "tape"
 #define SCOREFILE_EXTENSION    "score"
 
 #define GAMECONTROLLER_BASENAME        "gamecontrollerdb.txt"
 
-#define LOG_OUT_BASENAME       "stdout.txt"
-#define LOG_ERR_BASENAME       "stderr.txt"
-
-#define LOG_OUT_ID             0
-#define LOG_ERR_ID             1
-#define NUM_LOGS               2
+#define FALLBACK_TEXT_FILENAME "fallback.txt"
 
 #define STRING_PARENT_DIRECTORY                ".."
 #define STRING_TOP_DIRECTORY           "/"
 #define STRING_NEWLINE_UNIX            "\n"
 #define STRING_NEWLINE_DOS             "\r\n"
 
-#if defined(PLATFORM_WIN32)
+#if defined(PLATFORM_WINDOWS)
 #define CHAR_PATH_SEPARATOR    CHAR_PATH_SEPARATOR_DOS
 #define STRING_PATH_SEPARATOR  STRING_PATH_SEPARATOR_DOS
 #define STRING_NEWLINE         STRING_NEWLINE_DOS
 #define TREE_TYPE_LEVEL_DIR    3
 #define TREE_TYPE_LEVEL_NR     4
 #define TREE_TYPE_PLAYER_NAME  5
+#define TREE_TYPE_SCORE_ENTRY  6
 
 #define NUM_BASE_TREE_TYPES    4
-#define NUM_TREE_TYPES         6
+#define NUM_TREE_TYPES         7
 
 #define TREE_TYPE_IS_DIR(type) ((type) == TREE_TYPE_GRAPHICS_DIR ||    \
                                 (type) == TREE_TYPE_SOUNDS_DIR ||      \
 #define INFOTEXT_LEVEL_DIR     "Level Sets"
 #define INFOTEXT_LEVEL_NR      "Levels"
 #define INFOTEXT_PLAYER_NAME   "Players & Teams"
+#define INFOTEXT_SCORE_ENTRY   "Hall of Fame"
 
 #define BACKLINK_TEXT_MAIN     ".. (main menu)"
 #define BACKLINK_TEXT_SETUP    ".. (setup menu)"
 #define BACKLINK_TEXT_PARENT   ".. (parent directory)"
+#define BACKLINK_TEXT_BACK     "back"
+#define BACKLINK_TEXT_NEXT     "next"
 
-#define TREE_INFOTEXT(t)       ((t) == TREE_TYPE_PLAYER_NAME ?         \
+#define TREE_INFOTEXT(t)       ((t) == TREE_TYPE_SCORE_ENTRY ?         \
+                                INFOTEXT_SCORE_ENTRY :                 \
+                                (t) == TREE_TYPE_PLAYER_NAME ?         \
                                 INFOTEXT_PLAYER_NAME :                 \
                                 (t) == TREE_TYPE_LEVEL_NR ?            \
                                 INFOTEXT_LEVEL_NR :                    \
                                 INFOTEXT_MUSIC_DIR :                   \
                                 INFOTEXT_UNDEFINED)
 
-#define TREE_BACKLINK_TEXT(t)  ((t) == TREE_TYPE_LEVEL_DIR ?           \
+#define TREE_BACKLINK_TEXT(t)  ((t) == TREE_TYPE_SCORE_ENTRY ?         \
+                                BACKLINK_TEXT_BACK :                   \
+                                (t) == TREE_TYPE_LEVEL_DIR ?           \
                                 BACKLINK_TEXT_MAIN :                   \
                                 BACKLINK_TEXT_SETUP)
 
 #define UPDATE_BUSY_STATE()                    \
 {                                              \
   if (gfx.draw_busy_anim_function != NULL)     \
-    gfx.draw_busy_anim_function();             \
+    gfx.draw_busy_anim_function(TRUE);         \
+}
+#define UPDATE_BUSY_STATE_NOT_LOADING()                \
+{                                              \
+  if (gfx.draw_busy_anim_function != NULL)     \
+    gfx.draw_busy_anim_function(FALSE);                \
 }
 
 
@@ -986,17 +1037,17 @@ struct ProgramInfo
   char *userdata_subdir;       // personal user game data directory
   char *userdata_path;         // resulting full path to game data directory
 
+  char *program_basename;
   char *program_title;
   char *window_title;
-  char *icon_title;
 
   char *icon_filename;
 
   char *cookie_prefix;
 
-  char *log_filename[NUM_LOGS];                // log filenames for out/err messages
-  FILE *log_file[NUM_LOGS];            // log file handles for out/err files
-  FILE *log_file_default[NUM_LOGS];    // default log file handles (out/err)
+  char *log_filename;                  // filename for log messages
+  FILE *log_file;                      // file handle for log files
+  FILE *log_file_default;              // default log file handle
 
   int version_super;
   int version_major;
@@ -1010,8 +1061,7 @@ struct ProgramInfo
   void (*exit_message_function)(char *, va_list);
   void (*exit_function)(int);
 
-  boolean global_scores;
-  boolean many_scores_per_name;
+  int api_thread_count;
 
   boolean headless;
 };
@@ -1032,6 +1082,8 @@ struct NetworkInfo
 struct RuntimeInfo
 {
   boolean uses_touch_device;
+
+  boolean use_api_server;
 };
 
 struct OptionInfo
@@ -1039,8 +1091,7 @@ struct OptionInfo
   char *server_host;
   int server_port;
 
-  char *ro_base_directory;
-  char *rw_base_directory;
+  char *base_directory;
   char *level_directory;
   char *graphics_directory;
   char *sounds_directory;
@@ -1049,10 +1100,17 @@ struct OptionInfo
   char *conf_directory;
 
   char *execute_command;
+  char *tape_log_filename;
 
   char *special_flags;
   char *debug_mode;
 
+  char *player_name;
+  char *identifier;
+  char *level_nr;
+
+  int display_nr;
+
   boolean mytapes;
   boolean serveronly;
   boolean network;
@@ -1080,14 +1138,12 @@ struct VideoSystemInfo
   int vsync_mode;
 
   unsigned int frame_counter;
-  unsigned int frame_delay;
-  unsigned int frame_delay_value;
+  DelayCounter frame_delay;
 
   boolean shifted_up;
   int shifted_up_pos;
   int shifted_up_pos_last;
-  unsigned int shifted_up_delay;
-  unsigned int shifted_up_delay_value;
+  DelayCounter shifted_up_delay;
 
   boolean initialized;
 };
@@ -1182,13 +1238,16 @@ struct GfxInfo
   struct FontBitmapInfo *font_bitmap_info;
   int (*select_font_function)(int);
   int (*get_font_from_token_function)(char *);
+  char * (*get_token_from_font_function)(int);
 
   int anim_random_frame;
+  int anim_first_level;
 
-  void (*draw_busy_anim_function)(void);
+  void (*draw_busy_anim_function)(boolean);
   void (*draw_global_anim_function)(int, int);
   void (*draw_global_border_function)(int);
-  void (*draw_tile_cursor_function)(int);
+  void (*draw_tile_cursor_function)(int, int);
+  void (*draw_envelope_request_function)(int);
 
   int cursor_mode;
   int cursor_mode_override;
@@ -1264,6 +1323,8 @@ struct SetupTouchInfo
   boolean draw_pressed;
 
   boolean grid_initialized;
+
+  boolean overlay_buttons;
 };
 
 struct SetupInputInfo
@@ -1333,6 +1394,7 @@ struct SetupEditorCascadeInfo
   boolean el_steel_chars;
   boolean el_ce;
   boolean el_ge;
+  boolean el_es;
   boolean el_ref;
   boolean el_user;
   boolean el_dynamic;
@@ -1342,6 +1404,8 @@ struct SetupShortcutInfo
 {
   Key save_game;
   Key load_game;
+  Key restart_game;
+  Key pause_before_end;
   Key toggle_pause;
 
   Key focus_player[MAX_PLAYERS];
@@ -1400,6 +1464,7 @@ struct SetupInternalInfo
   boolean choose_from_top_leveldir;
   boolean show_scaling_in_title;
   boolean create_user_levelset;
+  boolean info_screens_from_main;
 
   boolean menu_game;
   boolean menu_engines;
@@ -1412,6 +1477,21 @@ struct SetupInternalInfo
   boolean menu_shortcuts;
   boolean menu_exit;
   boolean menu_save_and_exit;
+
+  boolean menu_shortcuts_various;
+  boolean menu_shortcuts_focus;
+  boolean menu_shortcuts_tape;
+  boolean menu_shortcuts_sound;
+  boolean menu_shortcuts_snap;
+
+  boolean info_title;
+  boolean info_elements;
+  boolean info_music;
+  boolean info_credits;
+  boolean info_program;
+  boolean info_version;
+  boolean info_levelset;
+  boolean info_exit;
 };
 
 struct SetupDebugInfo
@@ -1428,6 +1508,8 @@ struct SetupDebugInfo
 struct SetupInfo
 {
   char *player_name;
+  char *player_uuid;
+  int player_version;
 
   boolean multiple_users;
 
@@ -1436,6 +1518,7 @@ struct SetupInfo
   boolean sound_music;
   boolean sound_simple;
   boolean toons;
+  boolean global_animations;
   boolean scroll_delay;
   boolean forced_scroll_delay;
   int scroll_delay_value;
@@ -1443,6 +1526,8 @@ struct SetupInfo
   int engine_snapshot_memory;
   boolean fade_screens;
   boolean autorecord;
+  boolean autorecord_after_replay;
+  boolean auto_pause_on_start;
   boolean show_titlescreen;
   boolean quick_doors;
   boolean team_mode;
@@ -1472,7 +1557,9 @@ struct SetupInfo
   int game_frame_delay;
   boolean sp_show_border_elements;
   boolean small_game_graphics;
-  boolean show_snapshot_buttons;
+  boolean show_load_save_buttons;
+  boolean show_undo_redo_buttons;
+  char *scores_in_highscore_list;
 
   char *graphics_set;
   char *sounds_set;
@@ -1489,6 +1576,15 @@ struct SetupInfo
   int network_player_nr;
   char *network_server_hostname;
 
+  boolean use_api_server;
+  char *api_server_hostname;
+  char *api_server_password;
+  boolean ask_for_uploading_tapes;
+  boolean ask_for_remaining_tapes;
+  boolean provide_uploading_tapes;
+  boolean ask_for_using_api_server;
+  boolean has_remaining_tapes;
+
   struct SetupAutoSetupInfo auto_setup;
   struct SetupLevelSetupInfo level_setup;
 
@@ -1556,10 +1652,14 @@ struct TreeInfo
 
   char *special_flags; // flags for special actions performed on level file
 
+  char *empty_level_name;   // name pattern if level title is "nameless level"
+  boolean force_level_name; // force also renaming non-nameless level titles
+
   int levels;          // number of levels in level series
   int first_level;     // first level number (to allow start with 0 or 1)
   int last_level;      // last level number (automatically calculated)
   int sort_priority;   // sort levels by 'sort_priority' and then by name
+  int pos;             // custom position information of node in tree
 
   boolean latest_engine;// force level set to use the latest game engine
 
@@ -1570,9 +1670,11 @@ struct TreeInfo
   boolean user_defined;        // levels in user directory and marked as "private"
   boolean readonly;    // readonly levels can not be changed with editor
   boolean handicap;    // level set has no handicap when set to "false"
+  boolean time_limit;  // level set has no time limit when set to "false"
   boolean skip_levels; // levels can be skipped when set to "true"
 
   boolean use_emc_tiles;// use (swapped) V5/V6 EMC tiles when set to "true"
+  boolean info_screens_from_main; // can invoke info screens from main menu
 
   int color;           // color to use on selection screen for this level
   char *class_desc;    // description of level series class
@@ -1826,7 +1928,6 @@ extern struct AudioSystemInfo     audio;
 extern struct GfxInfo          gfx;
 extern struct TileCursorInfo   tile_cursor;
 extern struct OverlayInfo      overlay;
-extern struct AnimInfo         anim;
 extern struct ArtworkInfo      artwork;
 extern struct JoystickInfo     joystick;
 extern struct SetupInfo                setup;
@@ -1862,7 +1963,6 @@ void InitProgramInfo(char *, char *, char *, char *, char *, char *, char *,
 void InitNetworkInfo(boolean, boolean, boolean, char *, int);
 void InitRuntimeInfo(void);
 
-void InitScoresInfo(void);
 void SetWindowTitle(void);
 
 void InitWindowTitleFunction(char *(*window_title_function)(void));
@@ -1879,10 +1979,11 @@ void InitGfxDoor3Info(int, int, int, int);
 void InitGfxWindowInfo(int, int);
 void InitGfxScrollbufferInfo(int, int);
 void InitGfxClipRegion(boolean, int, int, int, int);
-void InitGfxDrawBusyAnimFunction(void (*draw_busy_anim_function)(void));
+void InitGfxDrawBusyAnimFunction(void (*draw_busy_anim_function)(boolean));
 void InitGfxDrawGlobalAnimFunction(void (*draw_global_anim_function)(int, int));
 void InitGfxDrawGlobalBorderFunction(void (*draw_global_border_function)(int));
-void InitGfxDrawTileCursorFunction(void (*draw_tile_cursor_function)(int));
+void InitGfxDrawTileCursorFunction(void (*draw_tile_cursor_function)(int, int));
+void InitGfxDrawEnvelopeRequestFunction(void (*draw_envelope_request_function)(int));
 void InitGfxCustomArtworkInfo(void);
 void InitGfxOtherSettings(void);
 void InitTileCursorInfo(void);
@@ -1901,9 +2002,7 @@ boolean GetOverlayActive(void);
 void SetDrawDeactivationMask(int);
 int GetDrawDeactivationMask(void);
 void SetDrawBackgroundMask(int);
-void SetWindowBackgroundBitmap(Bitmap *);
-void SetMainBackgroundBitmap(Bitmap *);
-void SetDoorBackgroundBitmap(Bitmap *);
+void SetBackgroundBitmap(Bitmap *, int, int, int, int, int);
 void SetRedrawMaskFromArea(int, int, int, int);
 
 void LimitScreenUpdates(boolean);
@@ -1912,12 +2011,14 @@ void InitVideoDefaults(void);
 void InitVideoDisplay(void);
 void CloseVideoDisplay(void);
 void InitVideoBuffer(int, int, int, boolean);
+void ResetBitmapAlpha(Bitmap *);
 Bitmap *CreateBitmapStruct(void);
 Bitmap *CreateBitmap(int, int, int);
 void ReCreateBitmap(Bitmap **, int, int);
 void FreeBitmap(Bitmap *);
+void SetBitmapAlphaNextBlit(Bitmap *, int);
 void BlitBitmap(Bitmap *, Bitmap *, int, int, int, int, int, int);
-void BlitBitmapTiled(Bitmap *, Bitmap *, int, int, int, int, int, int, int,int);
+void BlitBitmapTiled(Bitmap *, Bitmap *, int, int, int, int, int, int, int, int);
 void FadeRectangle(int, int, int, int, int, int, int,
                   void (*draw_border_function)(void));
 void FillRectangle(Bitmap *, int, int, int, int, Pixel);
@@ -1925,7 +2026,7 @@ void ClearRectangle(Bitmap *, int, int, int, int);
 void ClearRectangleOnBackground(Bitmap *, int, int, int, int);
 void BlitBitmapMasked(Bitmap *, Bitmap *, int, int, int, int, int, int);
 boolean DrawingDeactivatedField(void);
-boolean DrawingDeactivated(int, int, int, int);
+boolean DrawingDeactivated(int, int);
 boolean DrawingOnBackground(int, int);
 boolean DrawingAreaChanged(void);
 void BlitBitmapOnBackground(Bitmap *, Bitmap *, int, int, int, int, int, int);
@@ -1933,12 +2034,10 @@ void BlitTexture(Bitmap *, int, int, int, int, int, int);
 void BlitTextureMasked(Bitmap *, int, int, int, int, int, int);
 void BlitToScreen(Bitmap *, int, int, int, int, int, int);
 void BlitToScreenMasked(Bitmap *, int, int, int, int, int, int);
-void DrawSimpleBlackLine(Bitmap *, int, int, int, int);
 void DrawSimpleWhiteLine(Bitmap *, int, int, int, int);
 void DrawLines(Bitmap *, struct XY *, int, Pixel);
 Pixel GetPixel(Bitmap *, int, int);
-Pixel GetPixelFromRGB(Bitmap *, unsigned int,unsigned int,unsigned int);
-Pixel GetPixelFromRGBcompact(Bitmap *, unsigned int);
+Pixel GetPixelFromRGB(Bitmap *, unsigned int, unsigned int, unsigned int);
 
 void KeyboardAutoRepeatOn(void);
 void KeyboardAutoRepeatOff(void);
@@ -1951,6 +2050,7 @@ Bitmap *LoadImage(char *);
 Bitmap *LoadCustomImage(char *);
 void ReloadCustomImage(Bitmap *, char *);
 
+Bitmap *ZoomBitmap(Bitmap *, int, int);
 void ReCreateGameTileSizeBitmap(Bitmap **);
 void CreateBitmapWithSmallBitmaps(Bitmap **, int, int);
 void CreateBitmapTextures(Bitmap **);
@@ -1971,13 +2071,14 @@ void WaitEvent(Event *event);
 void PeekEvent(Event *event);
 void PumpEvents(void);
 void CheckQuitEvent(void);
-Key GetEventKey(KeyEvent *, boolean);
+Key GetEventKey(KeyEvent *);
 KeyMod HandleKeyModState(Key, int);
 KeyMod GetKeyModState(void);
 KeyMod GetKeyModStateFromEvents(void);
 void StartTextInput(int, int, int, int);
 void StopTextInput(void);
 void PushUserEvent(int, int, int);
+boolean PendingEscapeKeyEvent(void);
 
 void InitJoysticks(void);
 boolean ReadJoystick(int, int *, int *, boolean *, boolean *);