#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
-
-#ifndef MSDOS
-#define XK_MISCELLANY
-#define XK_LATIN1
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xatom.h>
-#include <X11/Xos.h>
-#include <X11/Intrinsic.h>
-#include <X11/keysymdef.h>
-
-#ifdef XPM_INCLUDE_FILE
-#define USE_XPM_LIBRARY
-#include XPM_INCLUDE_FILE
-#endif
-#else /* MSDOS */
-#include "msdos.h"
-#endif /* MSDOS */
+#include <unistd.h>
+#include <fcntl.h>
#ifdef DEBUG
#define DEBUG_TIMING 0
#endif
-typedef unsigned char boolean;
-typedef unsigned char byte;
+#if 0
+#include "libgame/libgame.h"
+#endif
#ifndef FALSE
#define FALSE 0
#define WIN_XSIZE 672
#define WIN_YSIZE 560
-#ifndef MSDOS
+#define WIN_SDL_DEPTH 16 /* !!! change this !!! */
+
+#if !defined(PLATFORM_MSDOS)
#define WIN_XPOS 0
#define WIN_YPOS 0
-#else /* MSDOS */
+#else
#define WIN_XPOS ((XRES - WIN_XSIZE) / 2)
#define WIN_YPOS ((YRES - WIN_YSIZE) / 2)
-#endif /* MSDOS */
+#endif
+
#define SCR_FIELDX 17
#define SCR_FIELDY 17
#define MAX_BUF_XSIZE (SCR_FIELDX + 2)
#define MAX_PLAYERS 4
+#if 0
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
#ifndef SIGN
#define SIGN(a) ((a) < 0 ? -1 : ((a)>0 ? 1 : 0))
#endif
+#endif
#define SCREENX(a) ((a) - scroll_x)
#define SCREENY(a) ((a) - scroll_y)
#define PLAYER_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \
PROTECTED_FIELD(x, y))
-/* Pixmaps with graphic file */
+/* Bitmaps with graphic file */
#define PIX_BACK 0
#define PIX_DOOR 1
#define PIX_HEROES 2
#define PIX_BIGFONT 7
#define PIX_SMALLFONT 8
#define PIX_MEDIUMFONT 9
-/* Pixmaps without graphic file */
-#define PIX_DB_BACK 10
-#define PIX_DB_DOOR 11
-#define PIX_DB_FIELD 12
+/* Bitmaps without graphic file */
+#define PIX_DB_DOOR 10
+#define PIX_DB_FIELD 11
#define NUM_PICTURES 10
-#define NUM_PIXMAPS 13
+#define NUM_BITMAPS 12
/* boundaries of arrays etc. */
#define MAX_PLAYER_NAME_LEN 10
#define GAME_FRAME_DELAY 20 /* frame delay in milliseconds */
#define FFWD_FRAME_DELAY 10 /* 200% speed for fast forward */
#define FRAMES_PER_SECOND (1000 / GAME_FRAME_DELAY)
+#if 0
#define GADGET_FRAME_DELAY 150 /* delay between gadget actions */
+#endif
#define MICROLEVEL_SCROLL_DELAY 50 /* delay for scrolling micro level */
#define MICROLEVEL_LABEL_DELAY 250 /* delay for micro level label */
int Score;
};
-struct OptionInfo
-{
- char *display_name;
- char *server_host;
- int server_port;
- char *ro_base_directory;
- char *rw_base_directory;
- char *level_directory;
- boolean serveronly;
- boolean network;
- boolean verbose;
-};
-
struct SetupJoystickInfo
{
char *device_name;
struct SetupKeyboardInfo
{
- KeySym left;
- KeySym right;
- KeySym up;
- KeySym down;
- KeySym snap;
- KeySym bomb;
+ Key left;
+ Key right;
+ Key up;
+ Key down;
+ Key snap;
+ Key bomb;
};
struct SetupInputInfo
boolean team_mode;
boolean handicap;
boolean time_limit;
+ boolean fullscreen;
struct SetupInputInfo input[MAX_PLAYERS];
};
boolean gravity;
};
-struct LevelDirInfo
-{
- char *filename; /* level series single directory name */
- char *fullpath; /* complete path relative to level directory */
- char *basepath; /* absolute base path of level directory */
- char *name; /* level series name, as displayed on main screen */
- char *name_short; /* optional short name for level selection screen */
- char *name_sorting; /* optional sorting name for correct level sorting */
- char *author; /* level series author name levels without author */
- char *imported_from; /* optional comment for imported level series */
- 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 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 readonly; /* readonly levels can not be changed with editor */
- int color; /* color to use on selection screen for this level */
- char *class_desc; /* description of level series class */
- int handicap_level; /* number of the lowest unsolved level */
- int cl_first; /* internal control field for "choose level" screen */
- int cl_cursor; /* internal control field for "choose level" screen */
-
- struct LevelDirInfo *node_parent; /* parent level directory info */
- struct LevelDirInfo *node_group; /* level group sub-directory info */
- struct LevelDirInfo *next; /* next level series structure node */
-};
-
struct TapeInfo
{
int level_nr;
struct GlobalInfo
{
- int dummy;
+ float frames_per_second;
+ boolean fps_slowdown;
+ int fps_slowdown_factor;
};
-extern Display *display;
-extern Visual *visual;
-extern int screen;
-extern Window window;
-extern GC gc, clip_gc[], tile_clip_gc;
-extern Pixmap pix[];
-extern Pixmap clipmask[], tile_clipmask[];
+#if 0
+extern DrawWindow window;
+extern DrawBuffer backbuffer;
+extern GC gc;
+#endif
-#ifdef USE_XPM_LIBRARY
-extern XpmAttributes xpm_att[];
+#if 0
+extern GC clip_gc[];
#endif
+extern GC tile_clip_gc;
+extern Bitmap pix[];
+#if 0
+extern Bitmap pix_masked[];
+
+extern Bitmap tile_masked[];
-extern Drawable drawto, drawto_field, backbuffer, fieldbuffer;
+extern Pixmap clipmask[];
+#endif
+extern Pixmap tile_clipmask[];
+
+#if 0
+extern DrawBuffer drawto;
+#endif
+extern DrawBuffer drawto_field, fieldbuffer;
+#if 0
extern Colormap cmap;
+#endif
-extern int sound_pipe[2];
-extern int sound_device;
+#if 0
extern char *sound_device_name;
+#endif
+
extern int joystick_device;
extern char *joystick_device_name[];
+#if 0
extern char *program_name;
+#endif
extern int game_status;
extern boolean level_editor_test_game;
extern boolean network_playing;
+
+#if 0
extern int button_status;
extern boolean motion_status;
+#endif
+
extern int key_joystick_mapping;
extern int global_joystick_status, joystick_status;
-extern int sound_status;
-extern boolean sound_loops_allowed;
+
+#if 0
+extern boolean fullscreen_available;
+extern boolean fullscreen_enabled;
+#endif
extern boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
extern int redraw_x1, redraw_y1;
+
+#if 0
extern int redraw_mask;
extern int redraw_tiles;
+#endif
extern short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int SBY_Upper, SBY_Lower;
extern int ZX,ZY, ExitX,ExitY;
extern int AllPlayersGone;
-extern int FrameCounter, TimeFrames, TimePlayed, TimeLeft;
+
+#if 0
+extern int FrameCounter;
+#endif
+
+extern int TimeFrames, TimePlayed, TimeLeft;
extern boolean SiebAktiv;
extern int SiebCount;
extern boolean network_player_action_received;
+#if 0
extern struct LevelDirInfo *leveldir_first, *leveldir_current;
+#endif
extern struct LevelInfo level;
extern struct PlayerInfo stored_player[], *local_player;
extern struct HiScore highscore[];
extern struct TapeInfo tape;
-extern struct SoundInfo Sound[];
+extern struct SampleInfo Sound[];
extern struct JoystickInfo joystick[];
+
+#if 0
extern struct OptionInfo options;
+#endif
+
extern struct SetupInfo setup;
extern struct GameInfo game;
+
+#if 0
+extern struct VideoSystemInfo video;
+extern struct AudioSystemInfo audio;
+#endif
+
extern struct GlobalInfo global;
extern char *sound_name[];
extern int background_loop[];
extern int num_bg_loops;
extern char *element_info[];
-
+extern int num_element_info;
/* often used screen positions */
#define SX 8
#define MICROLEV_XPOS (SX + (SXSIZE - MICROLEV_XSIZE) / 2)
#define MICROLEV_YPOS (SX + 12 * TILEY - MICRO_TILEY)
#define MICROLABEL_YPOS (MICROLEV_YPOS + MICROLEV_YSIZE + 7)
+
+#if 0
#define FONT1_XSIZE 32
#define FONT1_YSIZE 32
#define FONT2_XSIZE 14
#define FONT5_YSIZE 14
#define FONT6_XSIZE 16
#define FONT6_YSIZE 32
+#endif
#define GFX_STARTX SX
#define GFX_STARTY SY
#define MINI_MORE_PER_LINE 16
#define MICRO_MORE_PER_LINE 16
+#if 0
#define FONT_CHARS_PER_LINE 16
#define FONT_LINES_PER_FONT 4
+#endif
/* game elements:
** 0 - 499: real elements, stored in level file
#define NUM_SOUNDS 62
/* default input keys */
-#define KEY_UNDEFINDED XK_VoidSymbol
-#define DEFAULT_KEY_LEFT XK_Left
-#define DEFAULT_KEY_RIGHT XK_Right
-#define DEFAULT_KEY_UP XK_Up
-#define DEFAULT_KEY_DOWN XK_Down
-#define DEFAULT_KEY_SNAP XK_Shift_L
-#define DEFAULT_KEY_BOMB XK_Shift_R
-#define DEFAULT_KEY_OKAY XK_Return
-#define DEFAULT_KEY_CANCEL XK_Escape
+#define DEFAULT_KEY_LEFT KSYM_Left
+#define DEFAULT_KEY_RIGHT KSYM_Right
+#define DEFAULT_KEY_UP KSYM_Up
+#define DEFAULT_KEY_DOWN KSYM_Down
+#define DEFAULT_KEY_SNAP KSYM_Shift_L
+#define DEFAULT_KEY_BOMB KSYM_Shift_R
+#define DEFAULT_KEY_OKAY KSYM_Return
+#define DEFAULT_KEY_CANCEL KSYM_Escape
/* directions for moving */
#define MV_NO_MOVING 0
#define MV_UP (1 << 2)
#define MV_DOWN (1 << 3)
+#if 0
/* font types */
#define FS_SMALL 0
#define FS_BIG 1
#define FC_SPECIAL1 4
#define FC_SPECIAL2 5
#define FC_SPECIAL3 6
+#endif
/* values for game_status */
#define EXITGAME 0
#define SETUPINPUT 9
#define CALIBRATION 10
+#if 0
#ifndef RO_GAME_DIR
#define RO_GAME_DIR "."
#endif
#define LEVELS_DIRECTORY "levels"
#define TAPES_DIRECTORY "tapes"
#define SCORES_DIRECTORY "scores"
+#endif
-#define PROGRAM_VERSION_STRING "1.4.0"
+#define PROGRAM_VERSION_STRING "1.5.0"
#define PROGRAM_TITLE_STRING "Rocks'n'Diamonds"
#define PROGRAM_AUTHOR_STRING "Holger Schemel"
-#define WINDOW_TITLE_STRING PROGRAM_TITLE_STRING " " PROGRAM_VERSION_STRING
-#define COPYRIGHT_STRING "Copyright ^1995-99 by " PROGRAM_AUTHOR_STRING
-
+#define PROGRAM_RIGHTS_STRING "Copyright ^1995-2000 by"
+#define PROGRAM_DOS_PORT_STRING "DOS port done by Guido Schulz"
+#define PROGRAM_IDENT_STRING PROGRAM_VERSION_STRING " " TARGET_STRING
+#define WINDOW_TITLE_STRING PROGRAM_TITLE_STRING " " PROGRAM_IDENT_STRING
+#define WINDOW_SUBTITLE_STRING PROGRAM_RIGHTS_STRING " " PROGRAM_AUTHOR_STRING
+#define ICON_TITLE_STRING PROGRAM_TITLE_STRING
+#define UNIX_USERDATA_DIRECTORY ".rocksndiamonds"
+
+#define X11_ICON_FILENAME "rocks_icon.xbm"
+#define X11_ICONMASK_FILENAME "rocks_iconmask.xbm"
+#define MSDOS_POINTER_FILENAME "mouse.pcx"
+
+#if 0
/* default name for empty highscore entry */
#define EMPTY_PLAYER_NAME "no name"
/* default name for new levels */
#define NAMELESS_LEVEL_NAME "nameless level"
+#endif
+#if 0
/* values for button_status */
#define MB_NOT_PRESSED FALSE
#define MB_RELEASED FALSE
#define MB_MENU_CHOICE FALSE
#define MB_MENU_MARK TRUE
#define MB_MENU_INITIALIZE (-1)
-#define MB_LEFT 1
-#define MB_MIDDLE 2
-#define MB_RIGHT 3
+#define MB_LEFTBUTTON 1
+#define MB_MIDDLEBUTTON 2
+#define MB_RIGHTBUTTON 3
+#endif
+#if 0
/* values for redraw_mask */
#define REDRAW_ALL (1 << 0)
#define REDRAW_FIELD (1 << 1)
#define REDRAW_MAIN (REDRAW_FIELD | \
REDRAW_TILES | \
REDRAW_MICROLEVEL)
+#define REDRAW_FPS (1 << 10)
#define REDRAWTILES_THRESHOLD (SCR_FIELDX * SCR_FIELDY / 2)
+#endif
-/* areas in pixmap PIX_DOOR */
+#if 0
+/* areas in bitmap PIX_DOOR */
/* meaning in PIX_DB_DOOR: (3 PAGEs)
PAGEX1: 1. buffer for DOOR_1
PAGEX2: 2. buffer for DOOR_1
#define DOOR_GFX_PAGEX8 (7 * DOOR_GFX_PAGESIZE)
#define DOOR_GFX_PAGEY1 0
#define DOOR_GFX_PAGEY2 DYSIZE
+#endif
/* for DrawGraphicAnimation() [tools.c] and AnimateToon() [cartoons.c] */
#define ANIM_NORMAL 0