#include "windows.h"
#elif defined(PLATFORM_ANDROID)
#include "android.h"
+#elif defined(PLATFORM_EMSCRIPTEN)
+#include "emscripten.h"
#endif
#include "sdl.h"
#define STR_SPECIAL_RENDERING_TARGET "target_texture_only"
#define STR_SPECIAL_RENDERING_DOUBLE "stream_and_target_texture"
+#if defined(PLATFORM_EMSCRIPTEN)
+#define STR_SPECIAL_RENDERING_DEFAULT STR_SPECIAL_RENDERING_BITMAP
+#else
#define STR_SPECIAL_RENDERING_DEFAULT STR_SPECIAL_RENDERING_DOUBLE
+#endif
#define SPECIAL_RENDERING_OFF 0
#define SPECIAL_RENDERING_BITMAP 1
#define SPECIAL_RENDERING_TARGET 2
#define SPECIAL_RENDERING_DOUBLE 3
-#define SPECIAL_RENDERING_DEFAULT SPECIAL_RENDERING_DOUBLE
-
// values for vertical screen retrace synchronization (vsync)
#define STR_VSYNC_MODE_OFF "off"
#define STR_VSYNC_MODE_NORMAL "normal"
#define VSYNC_MODE_DEFAULT VSYNC_MODE_OFF
+#define VSYNC_MODE_STR_TO_INT(s) \
+ (strEqual((s), STR_VSYNC_MODE_NORMAL) ? VSYNC_MODE_NORMAL : \
+ strEqual((s), STR_VSYNC_MODE_ADAPTIVE) ? VSYNC_MODE_ADAPTIVE : \
+ VSYNC_MODE_OFF)
+
+#define VSYNC_MODE_INT_TO_STR(i) \
+ ((i) == VSYNC_MODE_NORMAL ? STR_VSYNC_MODE_NORMAL : \
+ (i) == VSYNC_MODE_ADAPTIVE ? STR_VSYNC_MODE_ADAPTIVE : \
+ STR_VSYNC_MODE_OFF)
+
// values for network server settings
#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_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"
// 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 ANIM_STATIC_PANEL (1 << 13)
#define ANIM_ALL (1 << 14)
#define ANIM_ONCE (1 << 15)
+#define ANIM_TILED (1 << 16)
+#define ANIM_RANDOM_STATIC (1 << 17)
#define ANIM_DEFAULT ANIM_LOOP
-// values for special drawing styles (currently only for crumbled graphics)
+// values for special drawing styles and event handling
#define STYLE_NONE 0
+
+// values used for crumbled graphics
#define STYLE_ACCURATE_BORDERS (1 << 0)
#define STYLE_INNER_CORNERS (1 << 1)
+
+// values used for game panel graphics
#define STYLE_REVERSE (1 << 2)
+#define STYLE_LEFTMOST_POSITION (1 << 3)
-// values for special event handling style (used for global animation)
-#define STYLE_BLOCK (1 << 3)
-#define STYLE_PASSTHROUGH (1 << 4)
-#define STYLE_MULTIPLE_ACTIONS (1 << 5)
+// values used for global animations
+#define STYLE_BLOCK (1 << 4)
+#define STYLE_PASSTHROUGH (1 << 5)
+#define STYLE_MULTIPLE_ACTIONS (1 << 6)
#define STYLE_DEFAULT STYLE_NONE
// maximum number of parallel players supported by libgame functions
#define MAX_PLAYERS 4
+// maximum number of player names
+#define MAX_PLAYER_NAMES 12
+
// maximum allowed length of player name
#define MAX_PLAYER_NAME_LEN 10
JOY_BUTTON_2 : \
JOY_NO_ACTION)
+// maximum number of level sets in the level set history
+#define MAX_LEVELDIR_HISTORY 12
+
// 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 password
+#define UNDEFINED_PASSWORD "[undefined]"
+
// default value for undefined parameter
#define ARG_DEFAULT "[DEFAULT]"
// default value for off-screen positions
#define POS_OFFSCREEN (-1000000)
-// definitions for game sub-directories
-#ifndef RO_GAME_DIR
-#define RO_GAME_DIR "."
+// definitions for game base path and sub-directories
+#ifndef BASE_PATH
+#define BASE_PATH "."
#endif
-#ifndef RW_GAME_DIR
-#define RW_GAME_DIR "."
-#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 CACHE_DIRECTORY "cache"
#define CONF_DIRECTORY "conf"
#define NETWORK_DIRECTORY "network"
+#define USERS_DIRECTORY "users"
#define GFX_CLASSIC_SUBDIR "gfx_classic"
#define SND_CLASSIC_SUBDIR "snd_classic"
// file names and filename extensions
#define LEVELSETUP_DIRECTORY "levelsetup"
#define SETUP_FILENAME "setup.conf"
+#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 TREE_TYPE_MUSIC_DIR ARTWORK_TYPE_MUSIC
#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 5
+#define NUM_TREE_TYPES 7
+
+#define TREE_TYPE_IS_DIR(type) ((type) == TREE_TYPE_GRAPHICS_DIR || \
+ (type) == TREE_TYPE_SOUNDS_DIR || \
+ (type) == TREE_TYPE_MUSIC_DIR || \
+ (type) == TREE_TYPE_LEVEL_DIR)
#define INFOTEXT_UNDEFINED ""
#define INFOTEXT_GRAPHICS_DIR "Custom Graphics"
#define INFOTEXT_MUSIC_DIR "Custom Music"
#define INFOTEXT_LEVEL_DIR "Level Sets"
#define INFOTEXT_LEVEL_NR "Levels"
-
-#define TREE_INFOTEXT(t) ((t) == TREE_TYPE_LEVEL_NR ? \
+#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 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 : \
(t) == TREE_TYPE_LEVEL_DIR ? \
INFOTEXT_LEVEL_DIR : \
INFOTEXT_MUSIC_DIR : \
INFOTEXT_UNDEFINED)
+#define TREE_BACKLINK_TEXT(t) ((t) == TREE_TYPE_SCORE_ENTRY || \
+ (t) == TREE_TYPE_LEVEL_DIR ? \
+ BACKLINK_TEXT_MAIN : \
+ BACKLINK_TEXT_SETUP)
+
#define TREE_USERDIR(t) ((t) == TREE_TYPE_LEVEL_DIR ? \
getUserLevelDir(NULL) : \
(t) == TREE_TYPE_GRAPHICS_DIR ? \
(artwork).snd_first : \
(artwork).mus_first)
+#define ARTWORK_CURRENT_PTR(artwork, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ &(artwork).gfx_current : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ &(artwork).snd_current : \
+ &(artwork).mus_current)
+
+#define ARTWORK_CURRENT(artwork, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ (artwork).gfx_current : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ (artwork).snd_current : \
+ (artwork).mus_current)
+
#define ARTWORK_CURRENT_IDENTIFIER_PTR(artwork, type) \
((type) == ARTWORK_TYPE_GRAPHICS ? \
&(artwork).gfx_current_identifier : \
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;
};
char *server_host;
int server_port;
+ SDL_Thread *server_thread;
+ boolean is_server_thread;
};
struct RuntimeInfo
{
boolean uses_touch_device;
+
+ boolean use_api_server;
};
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;
char *conf_directory;
char *execute_command;
+ char *tape_log_filename;
char *special_flags;
+ char *debug_mode;
+
+ char *player_name;
+ char *identifier;
+ char *level_nr;
boolean mytapes;
boolean serveronly;
int target_x, target_y; // tile cursor target screen position
int sx, sy; // tile cursor screen start position
+
+ boolean xsn_debug; // enable or disable XSN debugging
};
struct OverlayInfo
boolean show_element_token;
+ boolean show_read_only_warning;
+
boolean use_template_for_new_levels;
};
int editor_zoom_tilesize;
};
+struct SetupLevelSetupInfo
+{
+ char *last_level_series[MAX_LEVELDIR_HISTORY + 1];
+};
+
struct SetupEditorCascadeInfo
{
boolean el_bd;
boolean el_steel_chars;
boolean el_ce;
boolean el_ge;
+ boolean el_es;
boolean el_ref;
boolean el_user;
boolean el_dynamic;
{
Key save_game;
Key load_game;
+ Key restart_game;
+ Key pause_before_end;
Key toggle_pause;
Key focus_player[MAX_PLAYERS];
boolean frame_delay_use_mod_key;
boolean frame_delay_game_only;
boolean show_frames_per_second;
+ int xsn_mode;
+ int xsn_percent;
};
struct SetupInfo
{
char *player_name;
+ char *player_uuid;
+ int player_version;
+
+ boolean multiple_users;
boolean sound;
boolean sound_loops;
int engine_snapshot_memory;
boolean fade_screens;
boolean autorecord;
+ boolean auto_pause_on_start;
boolean show_titlescreen;
boolean quick_doors;
boolean team_mode;
boolean skip_levels;
boolean increment_levels;
boolean auto_play_next_level;
- boolean skip_scores_after_game;
+ boolean count_score_after_game;
+ boolean show_scores_after_game;
boolean time_limit;
boolean fullscreen;
int window_scaling_percent;
boolean ask_on_escape;
boolean ask_on_escape_editor;
boolean ask_on_game_over;
+ boolean ask_on_quit_game;
+ boolean ask_on_quit_program;
boolean quick_switch;
boolean input_on_focus;
boolean prefer_aga_graphics;
boolean prefer_lowpass_sounds;
+ boolean prefer_extra_panel_items;
boolean game_speed_extended;
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;
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;
+
struct SetupEditorInfo editor;
struct SetupEditorCascadeInfo editor_cascade;
struct SetupShortcutInfo shortcut;
struct OptionInfo options;
};
+struct UserInfo
+{
+ int nr;
+};
+
struct TreeInfo
{
struct TreeInfo **node_top; // topmost node in tree
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
boolean level_group; // directory contains more level series directories
boolean parent_link; // entry links back to parent directory
+ boolean is_copy; // this entry is a copy of another entry in the tree
boolean in_user_dir; // user defined levels are stored in home directory
boolean user_defined; // levels in user directory and marked as "private"
boolean readonly; // readonly levels can not be changed with editor
extern struct ArtworkInfo artwork;
extern struct JoystickInfo joystick;
extern struct SetupInfo setup;
+extern struct UserInfo user;
extern LevelDirTree *leveldir_first_all;
extern LevelDirTree *leveldir_first;
void InitNetworkInfo(boolean, boolean, boolean, char *, int);
void InitRuntimeInfo(void);
-void InitScoresInfo(void);
void SetWindowTitle(void);
void InitWindowTitleFunction(char *(*window_title_function)(void));
void InitGfxOtherSettings(void);
void InitTileCursorInfo(void);
void InitOverlayInfo(void);
+void SetOverlayGridSizeAndButtons(void);
void SetTileCursorEnabled(boolean);
void SetTileCursorActive(boolean);
void SetTileCursorTargetXY(int, int);
Bitmap *LoadCustomImage(char *);
void ReloadCustomImage(Bitmap *, char *);
+Bitmap *ZoomBitmap(Bitmap *, int, int);
void ReCreateGameTileSizeBitmap(Bitmap **);
void CreateBitmapWithSmallBitmaps(Bitmap **, int, int);
void CreateBitmapTextures(Bitmap **);
boolean CheckJoystickOpened(int);
void ClearJoystickState(void);
+void InitEmscriptenFilesystem(void);
+void SyncEmscriptenFilesystem(void);
+
#endif // SYSTEM_H