#define DEFAULT_KEY_LOAD_GAME KSYM_F2
#define DEFAULT_KEY_TOGGLE_PAUSE KSYM_space
+/* values for key_status */
+#define KEY_NOT_PRESSED FALSE
+#define KEY_RELEASED FALSE
+#define KEY_PRESSED TRUE
-/* values for basic move directions (effective at runtime) */
+/* values for button status */
+#define MB_NOT_PRESSED FALSE
+#define MB_NOT_RELEASED TRUE
+#define MB_RELEASED FALSE
+#define MB_PRESSED TRUE
+#define MB_MENU_CHOICE FALSE
+#define MB_MENU_MARK TRUE
+#define MB_MENU_INITIALIZE (-1)
+#define MB_MENU_LEAVE (-2)
+#define MB_LEFTBUTTON 1
+#define MB_MIDDLEBUTTON 2
+#define MB_RIGHTBUTTON 3
+
+
+/* values for move directions */
#define MV_BIT_LEFT 0
#define MV_BIT_RIGHT 1
#define MV_BIT_UP 2
#define NUM_DIRECTIONS 4
-/* values for special "button" bitmasks (effective at runtime) */
+/* values for special "button" bitmasks */
#define BUTTON_1 4
#define BUTTON_2 5
-/* values for special move patterns (stored in level files) */
-#define MV_BIT_TOWARDS_PLAYER 6
-#define MV_BIT_AWAY_FROM_PLAYER 7
-#define MV_BIT_ALONG_LEFT_SIDE 8
-#define MV_BIT_ALONG_RIGHT_SIDE 9
-
-/* values for move direction/pattern and special "button" key bitmasks */
+/* values for move direction and special "button" key bitmasks */
#define MV_NO_MOVING 0
#define MV_LEFT (1 << MV_BIT_LEFT)
#define MV_RIGHT (1 << MV_BIT_RIGHT)
(x) == MV_RIGHT ? MV_BIT_RIGHT : \
(x) == MV_UP ? MV_BIT_UP : MV_BIT_DOWN)
-#define MV_HORIZONTAL (MV_LEFT | MV_RIGHT)
-#define MV_VERTICAL (MV_UP | MV_DOWN)
-#define MV_ALL_DIRECTIONS (MV_HORIZONTAL | MV_VERTICAL)
-#define MV_ANY_DIRECTION (MV_ALL_DIRECTIONS)
-#define MV_TOWARDS_PLAYER (1 << MV_BIT_TOWARDS_PLAYER)
-#define MV_AWAY_FROM_PLAYER (1 << MV_BIT_AWAY_FROM_PLAYER)
-#define MV_ALONG_LEFT_SIDE (1 << MV_BIT_ALONG_LEFT_SIDE)
-#define MV_ALONG_RIGHT_SIDE (1 << MV_BIT_ALONG_RIGHT_SIDE)
-
-/* values for button status */
-#define MB_NOT_PRESSED FALSE
-#define MB_NOT_RELEASED TRUE
-#define MB_RELEASED FALSE
-#define MB_PRESSED TRUE
-#define MB_MENU_CHOICE FALSE
-#define MB_MENU_MARK TRUE
-#define MB_MENU_INITIALIZE (-1)
-#define MB_MENU_LEAVE (-2)
-#define MB_LEFTBUTTON 1
-#define MB_MIDDLEBUTTON 2
-#define MB_RIGHTBUTTON 3
-
/* values for animation mode (frame order and direction) */
#define ANIM_NONE 0
#define ANIM_RANDOM (1 << 4)
#define ANIM_REVERSE (1 << 5)
+/* values for special (non game element) animation modes */
+#define ANIM_HORIZONTAL (1 << 6)
+#define ANIM_VERTICAL (1 << 7)
+
+#define ANIM_DEFAULT ANIM_LOOP
/* values for redraw_mask */
#define REDRAW_NONE (0)
#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 MUSIC_DIRECTORY "music"
#define DOCS_DIRECTORY "docs"
#if !defined(PLATFORM_MSDOS)
-#define GRAPHICS_SUBDIR "gfx_classic"
-#define SOUNDS_SUBDIR "snd_classic"
-#define MUSIC_SUBDIR "mus_classic"
+#define GFX_CLASSIC_SUBDIR "gfx_classic"
+#define SND_CLASSIC_SUBDIR "snd_classic"
+#define MUS_CLASSIC_SUBDIR "mus_classic"
+#else
+#define GFX_CLASSIC_SUBDIR "gfx_orig"
+#define SND_CLASSIC_SUBDIR "snd_orig"
+#define MUS_CLASSIC_SUBDIR "mus_orig"
+#endif
+
+/* file names and filename extensions */
+#if !defined(PLATFORM_MSDOS)
+#define LEVELSETUP_DIRECTORY "levelsetup"
+#define SETUP_FILENAME "setup.conf"
+#define LEVELSETUP_FILENAME "levelsetup.conf"
+#define EDITORSETUP_FILENAME "editorsetup.conf"
+#define DEMOANIMINFO_FILENAME "demoaniminfo.conf"
+#define DEMOANIMTEXT_FILENAME "demoanimtext.conf"
+#define LEVELINFO_FILENAME "levelinfo.conf"
+#define GRAPHICSINFO_FILENAME "graphicsinfo.conf"
+#define SOUNDSINFO_FILENAME "soundsinfo.conf"
+#define MUSICINFO_FILENAME "musicinfo.conf"
+#define LEVELFILE_EXTENSION "level"
+#define TAPEFILE_EXTENSION "tape"
+#define SCOREFILE_EXTENSION "score"
#else
-#define GRAPHICS_SUBDIR "gfx_orig"
-#define SOUNDS_SUBDIR "snd_orig"
-#define MUSIC_SUBDIR "mus_orig"
+#define LEVELSETUP_DIRECTORY "lvlsetup"
+#define SETUP_FILENAME "setup.cnf"
+#define LEVELSETUP_FILENAME "lvlsetup.cnf"
+#define EDITORSETUP_FILENAME "edsetup.cnf"
+#define DEMOANIMINFO_FILENAME "demoainf.cnf"
+#define DEMOANIMTEXT_FILENAME "demoatxt.cnf"
+#define LEVELINFO_FILENAME "lvlinfo.cnf"
+#define GRAPHICSINFO_FILENAME "gfxinfo.cnf"
+#define SOUNDSINFO_FILENAME "sndinfo.cnf"
+#define MUSICINFO_FILENAME "musinfo.cnf"
+#define LEVELFILE_EXTENSION "lvl"
+#define TAPEFILE_EXTENSION "tap"
+#define SCOREFILE_EXTENSION "sco"
#endif
+
/* areas in bitmap PIX_DOOR */
/* meaning in PIX_DB_DOOR: (3 PAGEs)
PAGEX1: 1. buffer for DOOR_1
#define DOOR_GFX_PAGEY1 (0)
#define DOOR_GFX_PAGEY2 (gfx.dysize)
-/* functions for version handling */
-#define VERSION_IDENT(x,y,z) ((x) * 1000000 + (y) * 10000 + (z) * 100)
-#define RELEASE_IDENT(x,y,z,r) (VERSION_IDENT(x,y,z) + (r))
+
+/* macros for version handling */
#define VERSION_MAJOR(x) ((x) / 1000000)
#define VERSION_MINOR(x) (((x) % 1000000) / 10000)
#define VERSION_PATCH(x) (((x) % 10000) / 100)
-#define VERSION_RELEASE(x) ((x) % 100)
+#define VERSION_BUILD(x) ((x) % 100)
+#define VERSION_IDENT(a,b,c,d) ((a) * 1000000 + (b) * 10000 + (c) * 100 + (d))
-/* functions for parent/child process identification */
+
+/* macros for parent/child process identification */
#if defined(PLATFORM_UNIX)
#define IS_PARENT_PROCESS() (audio.mixer_pid != getpid())
#define IS_CHILD_PROCESS() (audio.mixer_pid == getpid())
#define HAS_CHILD_PROCESS() FALSE
#endif
+
+/* values for artwork type */
+#define ARTWORK_TYPE_GRAPHICS 0
+#define ARTWORK_TYPE_SOUNDS 1
+#define ARTWORK_TYPE_MUSIC 2
+
+#define NUM_ARTWORK_TYPES 3
+
+
+/* values for tree type (chosen to match artwork type) */
+#define TREE_TYPE_UNDEFINED -1
+#define TREE_TYPE_GRAPHICS_DIR ARTWORK_TYPE_GRAPHICS
+#define TREE_TYPE_SOUNDS_DIR ARTWORK_TYPE_SOUNDS
+#define TREE_TYPE_MUSIC_DIR ARTWORK_TYPE_MUSIC
+#define TREE_TYPE_LEVEL_DIR 3
+
+#define NUM_TREE_TYPES 4
+
+
+/* values for artwork handling */
+#define LEVELDIR_ARTWORK_SET(leveldir, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ (leveldir)->graphics_set : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ (leveldir)->sounds_set : \
+ (leveldir)->music_set)
+
+#define LEVELDIR_ARTWORK_PATH(leveldir, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ (leveldir)->graphics_path : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ (leveldir)->sounds_path : \
+ (leveldir)->music_path)
+
+#define SETUP_ARTWORK_SET(setup, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ (setup).graphics_set : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ (setup).sounds_set : \
+ (setup).music_set)
+
+#define SETUP_OVERRIDE_ARTWORK(setup, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ (setup).override_level_graphics : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ (setup).override_level_sounds : \
+ (setup).override_level_music)
+
+#define ARTWORK_FIRST_NODE(artwork, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ (artwork).gfx_first : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ (artwork).snd_first : \
+ (artwork).mus_first)
+
+#define ARTWORK_CURRENT_IDENTIFIER(artwork, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ (artwork).gfx_current_identifier : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ (artwork).snd_current_identifier : \
+ (artwork).mus_current_identifier)
+
+#define ARTWORKINFO_FILENAME(type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ GRAPHICSINFO_FILENAME : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ SOUNDSINFO_FILENAME : \
+ (type) == ARTWORK_TYPE_MUSIC ? \
+ MUSICINFO_FILENAME : "")
+
+#define ARTWORK_DIRECTORY(type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ GRAPHICS_DIRECTORY : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ SOUNDS_DIRECTORY : \
+ (type) == ARTWORK_TYPE_MUSIC ? \
+ MUSIC_DIRECTORY : "")
+
+#define OPTIONS_ARTWORK_DIRECTORY(type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ options.graphics_directory : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ options.sounds_directory : \
+ (type) == ARTWORK_TYPE_MUSIC ? \
+ options.music_directory : "")
+
+
/* type definitions */
typedef int (*EventFilter)(const Event *);
boolean el_dx_boulderdash;
boolean el_chars;
boolean el_custom;
+ boolean el_custom_more;
+ boolean el_user_defined;
+
+ boolean el_headlines;
};
struct SetupShortcutInfo
struct OptionInfo options;
};
-#define TREE_TYPE_GENERIC 0
-#define TREE_TYPE_GRAPHICS_DIR 1
-#define TREE_TYPE_SOUNDS_DIR 2
-#define TREE_TYPE_MUSIC_DIR 3
-#define TREE_TYPE_LEVEL_DIR 4
-
-#define ARTWORK_TYPE_GRAPHICS TREE_TYPE_GRAPHICS_DIR
-#define ARTWORK_TYPE_SOUNDS TREE_TYPE_SOUNDS_DIR
-#define ARTWORK_TYPE_MUSIC TREE_TYPE_MUSIC_DIR
-
struct TreeInfo
{
struct TreeInfo **node_top; /* topmost node in tree */
int last_level; /* last level number (automatically calculated) */
int sort_priority; /* sort levels by 'sort_priority' and then by name */
+ 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 user_defined; /* user defined levels are stored in home directory */
char *, char *, char *, int);
void InitExitFunction(void (*exit_function)(int));
-void InitPlatformDependantStuff(void);
-void ClosePlatformDependantStuff(void);
+void InitPlatformDependentStuff(void);
+void ClosePlatformDependentStuff(void);
void InitGfxFieldInfo(int, int, int, int, int, int, int, int, Bitmap *);
void InitGfxDoor1Info(int, int, int, int);
inline boolean PendingEvent(void);
inline void NextEvent(Event *event);
inline Key GetEventKey(KeyEvent *, boolean);
+inline KeyMod HandleKeyModState(Key, int);
+inline KeyMod GetKeyModState();
inline boolean CheckCloseWindowEvent(ClientMessageEvent *);
inline void InitJoysticks();