#include "platform.h"
#include "types.h"
-#if defined(PLATFORM_MSDOS)
+
+#if defined(PLATFORM_MACOSX)
+#include "macosx.h"
+#elif defined(PLATFORM_WIN32)
+#include "windows.h"
+#elif defined(PLATFORM_MSDOS)
#include "msdos.h"
#endif
#include "x11.h"
#endif
-#if defined(PLATFORM_MACOSX)
-/* some symbols are already defined on Mac OS X */
-#define Delay Delay_internal
-#define DrawLine DrawLine_internal
-#define DrawText DrawText_internal
-#define GetPixel GetPixel_internal
-#endif
-
/* the additional 'b' is needed for Win32 to open files in binary mode */
#define MODE_READ "rb"
#define DEFAULT_DEPTH 0
+#define BLIT_OPAQUE 0
+#define BLIT_MASKED 1
+#define BLIT_INVERSE 2
+#define BLIT_ON_BACKGROUND 3
+
#define FULLSCREEN_NOT_AVAILABLE FALSE
#define FULLSCREEN_AVAILABLE TRUE
#define DEFAULT_KEY_LOAD_GAME KSYM_F2
#define DEFAULT_KEY_TOGGLE_PAUSE KSYM_space
-/* values for move directions and special "button" keys */
-#define MV_NO_MOVING 0
-#define MV_LEFT (1 << 0)
-#define MV_RIGHT (1 << 1)
-#define MV_UP (1 << 2)
-#define MV_DOWN (1 << 3)
-#define KEY_BUTTON_1 (1 << 4)
-#define KEY_BUTTON_2 (1 << 5)
-#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)
+/* values for key_status */
+#define KEY_NOT_PRESSED FALSE
+#define KEY_RELEASED FALSE
+#define KEY_PRESSED TRUE
/* values for button status */
#define MB_NOT_PRESSED FALSE
#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 MV_BIT_DOWN 3
+
+#define NUM_DIRECTIONS 4
+
+/* 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
+#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 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)
+
+
+/* values for animation mode (frame order and direction) */
+#define ANIM_NONE 0
+#define ANIM_LOOP (1 << 0)
+#define ANIM_LINEAR (1 << 1)
+#define ANIM_PINGPONG (1 << 2)
+#define ANIM_PINGPONG2 (1 << 3)
+#define ANIM_RANDOM (1 << 4)
+#define ANIM_REVERSE (1 << 5)
+
+
/* values for redraw_mask */
#define REDRAW_NONE (0)
#define REDRAW_ALL (1 << 0)
#define REDRAW_FPS (1 << 11)
#define REDRAWTILES_THRESHOLD (SCR_FIELDX * SCR_FIELDY / 2)
+
+/* values for mouse cursor */
+#define CURSOR_DEFAULT 0
+#define CURSOR_PLAYFIELD 1
+
+
/* maximum number of parallel players supported by libgame functions */
#define MAX_PLAYERS 4
/* default name for unknown player names */
#define ANONYMOUS_NAME "anonymous"
+/* default name for new levels */
+#define NAMELESS_LEVEL_NAME "nameless level"
+
/* default text for non-existant artwork */
#define NOT_AVAILABLE "(not available)"
/* default value for undefined filename */
#define UNDEFINED_FILENAME "[NONE]"
-/* default name for new levels */
-#define NAMELESS_LEVEL_NAME "nameless level"
+/* default value for undefined parameter */
+#define ARG_DEFAULT "[DEFAULT]"
+
+/* default values for undefined configuration file parameters */
+#define ARG_UNDEFINED "-1000000"
+#define ARG_UNDEFINED_VALUE (atoi(ARG_UNDEFINED))
/* definitions for game sub-directories */
#ifndef RO_GAME_DIR
#define LEVELS_DIRECTORY "levels"
#define TAPES_DIRECTORY "tapes"
#define SCORES_DIRECTORY "scores"
+#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 GRAPHICS_SUBDIR "gfx_orig"
-#define SOUNDS_SUBDIR "snd_orig"
-#define MUSIC_SUBDIR "mus_orig"
+#define GFX_CLASSIC_SUBDIR "gfx_orig"
+#define SND_CLASSIC_SUBDIR "snd_orig"
+#define MUS_CLASSIC_SUBDIR "mus_orig"
#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) * 10000 + (y) * 100 + (z))
-#define VERSION_MAJOR(x) ((x) / 10000)
-#define VERSION_MINOR(x) (((x) % 10000) / 100)
-#define VERSION_PATCH(x) ((x) % 100)
-/* functions for parent/child process identification */
-#define IS_PARENT_PROCESS(pid) ((pid) > 0)
-#define IS_CHILD_PROCESS(pid) ((pid) == 0)
+/* 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)
+
+
+/* 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() (audio.mixer_pid > 0)
+#else
+#define IS_PARENT_PROCESS() TRUE
+#define IS_CHILD_PROCESS() FALSE
+#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)
/* type definitions */
char *x11_icon_filename;
char *x11_iconmask_filename;
- char *msdos_pointer_filename;
+ char *msdos_cursor_filename;
char *cookie_prefix;
char *filename_prefix; /* prefix to cut off from DOS filenames */
char *display_name;
char *server_host;
int server_port;
+
char *ro_base_directory;
char *rw_base_directory;
char *level_directory;
char *graphics_directory;
char *sounds_directory;
char *music_directory;
+ char *docs_directory;
+ char *execute_command;
+
boolean serveronly;
boolean network;
boolean verbose;
boolean debug;
- char *debug_command;
};
struct VideoSystemInfo
int first_sound_channel;
};
+struct FontBitmapInfo
+{
+ Bitmap *bitmap;
+ int src_x, src_y; /* start position of animation frames */
+ int width, height; /* width/height of each animation frame */
+ int draw_x, draw_y; /* offset for drawing font characters */
+ int num_chars;
+ int num_chars_per_line;
+
+#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
+ Pixmap *clip_mask; /* single-char-only clip mask array for X11 */
+#endif
+};
+
struct GfxInfo
{
int sx, sy;
int vx, vy;
int vxsize, vysize;
- boolean draw_deactivation_mask;
+ int draw_deactivation_mask;
+ int draw_background_mask;
+
+ Bitmap *field_save_buffer;
+
+ Bitmap *background_bitmap;
+ int background_bitmap_mask;
+
+ int num_fonts;
+ struct FontBitmapInfo *font_bitmap_info;
+ int (*select_font_function)(int);
+
+ int anim_random_frame;
};
struct JoystickInfo
struct SetupKeyboardInfo key;
};
+struct SetupEditorInfo
+{
+ boolean el_boulderdash;
+ boolean el_emerald_mine;
+ boolean el_more;
+ boolean el_sokoban;
+ boolean el_supaplex;
+ boolean el_diamond_caves;
+ boolean el_dx_boulderdash;
+ boolean el_chars;
+ boolean el_custom;
+ boolean el_custom_more;
+};
+
struct SetupShortcutInfo
{
Key save_game;
Key toggle_pause;
};
+struct SetupSystemInfo
+{
+ char *sdl_audiodriver;
+ int audio_fragment_size;
+};
+
struct SetupInfo
{
char *player_name;
boolean override_level_sounds;
boolean override_level_music;
+ struct SetupEditorInfo editor;
struct SetupShortcutInfo shortcut;
struct SetupInputInfo input[MAX_PLAYERS];
+ struct SetupSystemInfo system;
+ 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 */
char *mus_current_identifier;
};
+struct ValueTextInfo
+{
+ int value;
+ char *text;
+};
+
struct ConfigInfo
{
char *token;
char *value;
+ int type;
+};
+
+struct TokenIntPtrInfo
+{
+ char *token;
+ int *value;
};
struct FileInfo
{
char *token;
- char *default_filename;
+ char *default_filename;
char *filename;
+
+ char **default_parameter; /* array of file parameters */
+ char **parameter; /* array of file parameters */
+
+ boolean redefined;
+};
+
+struct SetupFileList
+{
+ char *token;
+ char *value;
+
+ struct SetupFileList *next;
};
struct ListNodeInfo
int num_references;
};
+struct PropertyMapping
+{
+ int base_index;
+ int ext1_index;
+ int ext2_index;
+ int ext3_index;
+
+ int artwork_index;
+};
+
struct ArtworkListInfo
{
int type; /* type of artwork */
- int num_list_entries;
- struct FileInfo *file_list; /* static artwork file list */
- struct ListNodeInfo **artwork_list; /* static artwork list */
- struct ListNode *content_list; /* dynamic artwork list */
+
+ int num_file_list_entries;
+ int num_dynamic_file_list_entries;
+ struct FileInfo *file_list; /* static artwork file array */
+ struct FileInfo *dynamic_file_list; /* dynamic artwrk file array */
+
+ int num_suffix_list_entries;
+ struct ConfigInfo *suffix_list; /* parameter suffixes array */
+
+ int num_base_prefixes;
+ int num_ext1_suffixes;
+ int num_ext2_suffixes;
+ int num_ext3_suffixes;
+ char **base_prefixes; /* base token prefixes array */
+ char **ext1_suffixes; /* property suffixes array 1 */
+ char **ext2_suffixes; /* property suffixes array 2 */
+ char **ext3_suffixes; /* property suffixes array 3 */
+
+ int num_ignore_tokens;
+ char **ignore_tokens; /* file tokens to be ignored */
+
+ int num_property_mapping_entries;
+ struct PropertyMapping *property_mapping; /* mapping token -> artwork */
+
+ int sizeof_artwork_list_entry;
+
+ struct ListNodeInfo **artwork_list; /* static artwork node array */
+ struct ListNodeInfo **dynamic_artwork_list; /* dynamic artwrk node array */
+ struct ListNode *content_list; /* dynamic artwork node list */
+
void *(*load_artwork)(char *); /* constructor function */
void (*free_artwork)(void *); /* destructor function */
};
extern struct VideoSystemInfo video;
extern struct AudioSystemInfo audio;
extern struct GfxInfo gfx;
+extern struct AnimInfo anim;
extern struct ArtworkInfo artwork;
extern struct JoystickInfo joystick;
extern struct SetupInfo setup;
/* function definitions */
-void InitCommandName(char *);
-void InitExitFunction(void (*exit_function)(int));
-void InitPlatformDependantStuff(void);
-void ClosePlatformDependantStuff(void);
-
void InitProgramInfo(char *, char *, char *, char *, char *, char *, char *,
- char *, char *, int);
+ char *, char *, char *, int);
+
+void InitExitFunction(void (*exit_function)(int));
+void InitPlatformDependentStuff(void);
+void ClosePlatformDependentStuff(void);
-void InitGfxFieldInfo(int, int, int, int, int, int, int, int);
+void InitGfxFieldInfo(int, int, int, int, int, int, int, int, Bitmap *);
void InitGfxDoor1Info(int, int, int, int);
void InitGfxDoor2Info(int, int, int, int);
void InitGfxScrollbufferInfo(int, int);
-void SetDrawDeactivationMask(int );
+void SetDrawDeactivationMask(int);
+void SetDrawBackgroundMask(int);
+void SetMainBackgroundBitmap(Bitmap *);
+void SetDoorBackgroundBitmap(Bitmap *);
inline void InitVideoDisplay(void);
inline void CloseVideoDisplay(void);
inline Bitmap *CreateBitmap(int, int, int);
inline void FreeBitmap(Bitmap *);
inline void BlitBitmap(Bitmap *, Bitmap *, int, int, int, int, int, int);
+inline void FillRectangle(Bitmap *, int, int, int, int, Pixel);
inline void ClearRectangle(Bitmap *, int, int, int, int);
+inline void ClearRectangleOnBackground(Bitmap *, int, int, int, int);
inline void SetClipMask(Bitmap *, GC, Pixmap);
inline void SetClipOrigin(Bitmap *, GC, int, int);
inline void BlitBitmapMasked(Bitmap *, Bitmap *, int, int, int, int, int, int);
+inline boolean DrawingOnBackground(int, int);
+inline void BlitBitmapOnBackground(Bitmap *, Bitmap *, int, int, 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);
Bitmap *LoadCustomImage(char *);
void ReloadCustomImage(Bitmap *, char *);
+Bitmap *ZoomBitmap(Bitmap *, int, int);
+void CreateBitmapWithSmallBitmaps(Bitmap *);
+
+void SetMouseCursor(int);
+
inline void OpenAudio(void);
inline void CloseAudio(void);
inline void SetAudioMode(boolean);
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();