#define DEFAULT_KEY_DOWN KSYM_Down
#if defined(PLATFORM_MACOSX)
#define DEFAULT_KEY_SNAP KSYM_Control_L
-#define DEFAULT_KEY_BOMB KSYM_KP_Enter
+#define DEFAULT_KEY_DROP KSYM_KP_Enter
#else
-#define DEFAULT_KEY_SNAP KSYM_Shift_L
-#define DEFAULT_KEY_BOMB KSYM_Shift_R
+#define DEFAULT_KEY_SNAP KSYM_Control_L
+#define DEFAULT_KEY_DROP KSYM_Control_R
#endif
#define DEFAULT_KEY_OKAY KSYM_Return
#define DEFAULT_KEY_CANCEL KSYM_Escape
#define NUM_DIRECTIONS 4
+/* diagonal movement directions are used in a different contect than buttons */
+#define MV_BIT_UPLEFT 4
+#define MV_BIT_UPRIGHT 5
+#define MV_BIT_DOWNLEFT 6
+#define MV_BIT_DOWNRIGHT 7
+
+#define NUM_DIRECTIONS_FULL 8
+
/* values for special "button" bitmasks */
#define BUTTON_1 4
#define BUTTON_2 5
-/* values for move direction and special "button" key bitmasks */
-#define MV_NO_MOVING 0
+/* values for move directions and special "button" key bitmasks */
+#define MV_NONE 0
#define MV_LEFT (1 << MV_BIT_LEFT)
#define MV_RIGHT (1 << MV_BIT_RIGHT)
#define MV_UP (1 << MV_BIT_UP)
#define MV_DOWN (1 << MV_BIT_DOWN)
+#define MV_UPLEFT (MV_UP | MV_LEFT)
+#define MV_UPRIGHT (MV_UP | MV_RIGHT)
+#define MV_DOWNLEFT (MV_DOWN | MV_LEFT)
+#define MV_DOWNRIGHT (MV_DOWN | MV_RIGHT)
+
+#define MV_HORIZONTAL (MV_LEFT | MV_RIGHT)
+#define MV_VERTICAL (MV_UP | MV_DOWN)
+#define MV_ALL_DIRECTIONS (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)
+#define MV_ANY_DIRECTION (MV_ALL_DIRECTIONS)
+#define MV_NO_DIRECTION (MV_NONE)
+
#define KEY_BUTTON_1 (1 << BUTTON_1)
#define KEY_BUTTON_2 (1 << BUTTON_2)
#define KEY_MOTION (MV_LEFT | MV_RIGHT | MV_UP | MV_DOWN)
#define KEY_BUTTON (KEY_BUTTON_1 | KEY_BUTTON_2)
#define KEY_ACTION (KEY_MOTION | KEY_BUTTON)
-#define MV_DIR_BIT(x) ((x) == MV_LEFT ? MV_BIT_LEFT : \
- (x) == MV_RIGHT ? MV_BIT_RIGHT : \
- (x) == MV_UP ? MV_BIT_UP : MV_BIT_DOWN)
-
+#define MV_DIR_FROM_BIT(x) ((x) < NUM_DIRECTIONS ? 1 << (x) : \
+ (x) == MV_BIT_UPLEFT ? MV_UPLEFT : \
+ (x) == MV_BIT_UPRIGHT ? MV_UPRIGHT : \
+ (x) == MV_BIT_DOWNLEFT ? MV_DOWNLEFT : \
+ (x) == MV_BIT_DOWNRIGHT ? MV_DOWNRIGHT : \
+ MV_NONE)
+
+#define MV_DIR_TO_BIT(x) ((x) == MV_LEFT ? MV_BIT_LEFT : \
+ (x) == MV_RIGHT ? MV_BIT_RIGHT : \
+ (x) == MV_UP ? MV_BIT_UP : \
+ (x) == MV_DOWN ? MV_BIT_DOWN : \
+ (x) == MV_UPLEFT ? MV_BIT_UPLEFT : \
+ (x) == MV_UPRIGHT ? MV_BIT_UPRIGHT : \
+ (x) == MV_DOWNLEFT ? MV_BIT_DOWNLEFT : \
+ (x) == MV_DOWNRIGHT ? MV_BIT_DOWNRIGHT : \
+ MV_BIT_DOWN)
+
+#define MV_DIR_OPPOSITE(x) ((x) == MV_LEFT ? MV_RIGHT : \
+ (x) == MV_RIGHT ? MV_LEFT : \
+ (x) == MV_UP ? MV_DOWN : \
+ (x) == MV_DOWN ? MV_UP : \
+ (x) == MV_UPLEFT ? MV_DOWNRIGHT : \
+ (x) == MV_UPRIGHT ? MV_DOWNLEFT : \
+ (x) == MV_DOWNLEFT ? MV_UPRIGHT : \
+ (x) == MV_DOWNRIGHT ? MV_UPLEFT : \
+ MV_NONE)
/* values for animation mode (frame order and direction) */
#define ANIM_NONE 0
#define ANIM_PINGPONG (1 << 2)
#define ANIM_PINGPONG2 (1 << 3)
#define ANIM_RANDOM (1 << 4)
-#define ANIM_REVERSE (1 << 5)
+#define ANIM_CE_VALUE (1 << 5)
+#define ANIM_CE_SCORE (1 << 6)
+#define ANIM_REVERSE (1 << 7)
+/* values for special (non game element) animation modes */
+#define ANIM_HORIZONTAL (1 << 8)
+#define ANIM_VERTICAL (1 << 9)
+#define ANIM_STATIC_PANEL (1 << 10)
+
+#define ANIM_DEFAULT ANIM_LOOP
/* values for redraw_mask */
#define REDRAW_NONE (0)
#define REDRAW_FPS (1 << 11)
#define REDRAWTILES_THRESHOLD (SCR_FIELDX * SCR_FIELDY / 2)
+#define IN_GFX_SCREEN(x, y) (x >= gfx.sx && x < gfx.sx + gfx.sxsize && \
+ y >= gfx.sy && y < gfx.sy + gfx.sysize)
+#define IN_GFX_DOOR(x, y) (x >= gfx.dx && x < gfx.dx + gfx.dxsize && \
+ y >= gfx.dy && y < gfx.dy + gfx.dysize)
+#define IN_GFX_VIDEO(x, y) (x >= gfx.vx && x < gfx.vx + gfx.vxsize && \
+ y >= gfx.vy && y < gfx.vy + gfx.vysize)
/* values for mouse cursor */
#define CURSOR_DEFAULT 0
/* default name for unknown player names */
#define ANONYMOUS_NAME "anonymous"
+/* default for other unknown names */
+#define UNKNOWN_NAME "unknown"
+
/* default name for new levels */
#define NAMELESS_LEVEL_NAME "nameless level"
#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 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 EDITORCASCADE_FILENAME "editorcascade.conf"
+#define HELPANIM_FILENAME "helpanim.conf"
+#define HELPTEXT_FILENAME "helptext.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 LEVELSETUP_DIRECTORY "lvlsetup"
+#define SETUP_FILENAME "setup.cnf"
+#define LEVELSETUP_FILENAME "lvlsetup.cnf"
+#define EDITORSETUP_FILENAME "edsetup.cnf"
+#define EDITORCASCADE_FILENAME "edcascad.conf"
+#define HELPANIM_FILENAME "helpanim.cnf"
+#define HELPTEXT_FILENAME "helptext.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)
PAGEX3: buffer for animations
*/
-#define DOOR_GFX_PAGESIZE (gfx.dxsize)
+/* these values are hard-coded to be able to use them in initialization */
+#define DOOR_GFX_PAGE_WIDTH 100 /* should be set to "gfx.dxsize" */
+#define DOOR_GFX_PAGE_HEIGHT 280 /* should be set to "gfx.dysize" */
+
+#define DOOR_GFX_PAGESIZE (DOOR_GFX_PAGE_WIDTH)
#define DOOR_GFX_PAGEX1 (0 * DOOR_GFX_PAGESIZE)
#define DOOR_GFX_PAGEX2 (1 * DOOR_GFX_PAGESIZE)
#define DOOR_GFX_PAGEX3 (2 * DOOR_GFX_PAGESIZE)
#define DOOR_GFX_PAGEX7 (6 * DOOR_GFX_PAGESIZE)
#define DOOR_GFX_PAGEX8 (7 * DOOR_GFX_PAGESIZE)
#define DOOR_GFX_PAGEY1 (0)
-#define DOOR_GFX_PAGEY2 (gfx.dysize)
+#define DOOR_GFX_PAGEY2 (DOOR_GFX_PAGE_HEIGHT)
/* macros 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))
#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))
/* macros for parent/child process identification */
/* values for artwork handling */
+#define LEVELDIR_ARTWORK_SET_PTR(leveldir, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ &(leveldir)->graphics_set : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ &(leveldir)->sounds_set : \
+ &(leveldir)->music_set)
+
#define LEVELDIR_ARTWORK_SET(leveldir, type) \
((type) == ARTWORK_TYPE_GRAPHICS ? \
(leveldir)->graphics_set : \
(leveldir)->sounds_set : \
(leveldir)->music_set)
+#define LEVELDIR_ARTWORK_PATH_PTR(leveldir, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ &(leveldir)->graphics_path : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ &(leveldir)->sounds_path : \
+ &(leveldir)->music_path)
+
#define LEVELDIR_ARTWORK_PATH(leveldir, type) \
((type) == ARTWORK_TYPE_GRAPHICS ? \
(leveldir)->graphics_path : \
(artwork).snd_first : \
(artwork).mus_first)
+#define ARTWORK_CURRENT_IDENTIFIER_PTR(artwork, type) \
+ ((type) == ARTWORK_TYPE_GRAPHICS ? \
+ &(artwork).gfx_current_identifier : \
+ (type) == ARTWORK_TYPE_SOUNDS ? \
+ &(artwork).snd_current_identifier : \
+ &(artwork).mus_current_identifier)
+
#define ARTWORK_CURRENT_IDENTIFIER(artwork, type) \
((type) == ARTWORK_TYPE_GRAPHICS ? \
(artwork).gfx_current_identifier : \
(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 *);
struct ProgramInfo
{
- char *command_basename;
- char *userdata_directory;
+ char *command_basepath; /* directory that contains the program */
+ char *command_basename; /* base filename of the program binary */
+ char *userdata_directory; /* personal user data directory */
char *program_title;
char *window_title;
int xleft, xmiddle, xright;
int yupper, ymiddle, ylower;
- int snap;
- int bomb;
+ int snap, drop;
};
struct SetupKeyboardInfo
{
- Key left;
- Key right;
- Key up;
- Key down;
- Key snap;
- Key bomb;
+ Key left, right, up, down;
+ Key snap, drop;
};
struct SetupInputInfo
{
boolean el_boulderdash;
boolean el_emerald_mine;
+ boolean el_emerald_mine_club;
boolean el_more;
boolean el_sokoban;
boolean el_supaplex;
boolean el_dx_boulderdash;
boolean el_chars;
boolean el_custom;
- boolean el_custom_more;
+ boolean el_user_defined;
+ boolean el_dynamic;
+
+ boolean el_headlines;
+};
+
+struct SetupEditorCascadeInfo
+{
+ boolean el_bd;
+ boolean el_em;
+ boolean el_emc;
+ boolean el_rnd;
+ boolean el_sb;
+ boolean el_sp;
+ boolean el_dc;
+ boolean el_dx;
+ boolean el_chars;
+ boolean el_ce;
+ boolean el_ge;
+ boolean el_user;
+ boolean el_generic;
+ boolean el_dynamic;
};
struct SetupShortcutInfo
boolean quick_doors;
boolean team_mode;
boolean handicap;
+ boolean skip_levels;
boolean time_limit;
boolean fullscreen;
boolean ask_on_escape;
boolean override_level_music;
struct SetupEditorInfo editor;
+ struct SetupEditorCascadeInfo editor_cascade;
struct SetupShortcutInfo shortcut;
struct SetupInputInfo input[MAX_PLAYERS];
struct SetupSystemInfo system;
/* fields for "type == TREE_TYPE_LEVEL_DIR" */
- char *filename; /* tree info sub-directory basename (may be ".") */
+ char *subdir; /* tree info sub-directory basename (may be ".") */
char *fullpath; /* complete path relative to tree base directory */
char *basepath; /* absolute base path of tree base directory */
char *identifier; /* identifier string for configuration files */
char *name_sorting; /* optional sorting name for correct name sorting */
char *author; /* level or artwork author name */
char *imported_from; /* optional comment for imported levels or artwork */
+ char *imported_by; /* optional comment for imported levels or artwork */
char *graphics_set; /* optional custom graphics set (level tree only) */
char *sounds_set; /* optional custom sounds set (level tree only) */
char *sounds_path; /* path to optional custom sounds set (level only) */
char *music_path; /* path to optional custom music set (level only) */
+ char *level_filename; /* filename of level file (for packed level file) */
+ char *level_filetype; /* type of levels in level directory or level file */
+
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 */
+ 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 */
+ 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 */
+ boolean handicap; /* level set has no handicap when set to "false" */
+ boolean skip_levels; /* levels can be skipped when set to "true" */
int color; /* color to use on selection screen for this level */
char *class_desc; /* description of level series class */
};
struct ConfigInfo
+{
+ char *token;
+ char *value;
+};
+
+struct ConfigTypeInfo
{
char *token;
char *value;
char **parameter; /* array of file parameters */
boolean redefined;
+ boolean fallback_to_default;
};
struct SetupFileList
struct FileInfo *dynamic_file_list; /* dynamic artwrk file array */
int num_suffix_list_entries;
- struct ConfigInfo *suffix_list; /* parameter suffixes array */
+ struct ConfigTypeInfo *suffix_list; /* parameter suffixes array */
int num_base_prefixes;
int num_ext1_suffixes;
inline boolean DrawingOnBackground(int, int);
inline void BlitBitmapOnBackground(Bitmap *, Bitmap *, int, int, int, int, int,
int);
+inline void DrawSimpleBlackLine(Bitmap *, int, int, int, int);
inline void DrawSimpleWhiteLine(Bitmap *, int, int, int, int);
inline void DrawLines(Bitmap *, struct XY *, int, Pixel);
inline Pixel GetPixel(Bitmap *, int, int);
void ReloadCustomImage(Bitmap *, char *);
Bitmap *ZoomBitmap(Bitmap *, int, int);
-void CreateBitmapWithSmallBitmaps(Bitmap *);
+void CreateBitmapWithSmallBitmaps(Bitmap *, int);
void SetMouseCursor(int);
inline void InitEventFilter(EventFilter);
inline boolean PendingEvent(void);
inline void NextEvent(Event *event);
+inline void PeekEvent(Event *event);
inline Key GetEventKey(KeyEvent *, boolean);
inline KeyMod HandleKeyModState(Key, int);
inline KeyMod GetKeyModState();