/***********************************************************
* Rocks'n'Diamonds -- McDuffin Strikes Back! *
*----------------------------------------------------------*
-* (c) 1995-2002 Artsoft Entertainment *
+* (c) 1995-2006 Artsoft Entertainment *
* Holger Schemel *
* Detmolder Strasse 189 *
* 33604 Bielefeld *
#define WIN_XSIZE 672
#define WIN_YSIZE 560
+#define DEFAULT_FULLSCREEN_MODE "800x600"
+
#define SCR_FIELDX 17
#define SCR_FIELDY 17
#define MAX_BUF_XSIZE (SCR_FIELDX + 2)
#define EP_BITMASK_DEFAULT 0
#define PROPERTY_BIT(p) (1 << ((p) % 32))
-#if 1
#define PROPERTY_VAR(e,p) (element_info[e].properties[(p) / 32])
-#else
-#define PROPERTY_VAR(e,p) (Properties[e][(p) / 32])
-#endif
#define HAS_PROPERTY(e,p) ((PROPERTY_VAR(e, p) & PROPERTY_BIT(p)) != 0)
#define SET_PROPERTY(e,p,v) ((v) ? \
(PROPERTY_VAR(e,p) |= PROPERTY_BIT(p)) : \
#define SND_ELEMENT(e) (e)
#endif
-#if 1
#define GROUP_NR(e) ((e) - EL_GROUP_START)
#define IS_IN_GROUP(e, nr) (element_info[e].in_group[nr] == TRUE)
#define IS_IN_GROUP_EL(e, ge) (IS_IN_GROUP(e, (ge) - EL_GROUP_START))
#define IS_EQUAL_OR_IN_GROUP(e, ge) \
- (IS_GROUP_ELEMENT(ge) ? IS_IN_GROUP(e, GROUP_NR(ge)) : (e) == (ge))
-#endif
+ (ge == EL_ANY_ELEMENT ? TRUE : \
+ IS_GROUP_ELEMENT(ge) ? IS_IN_GROUP(e, GROUP_NR(ge)) : (e) == (ge))
#define IS_PLAYER(x, y) (ELEM_IS_PLAYER(StorePlayer[x][y]))
#define ANIM_DELAY(g) (graphic_info[g].anim_delay)
#define ANIM_MODE(g) (graphic_info[g].anim_mode)
+#define IS_ANIM_MODE_CE(g) (graphic_info[g].anim_mode & (ANIM_CE_VALUE | \
+ ANIM_CE_SCORE | \
+ ANIM_CE_DELAY))
#define IS_ANIMATED(g) (ANIM_FRAMES(g) > 1)
#define IS_NEW_DELAY(f, g) ((f) % ANIM_DELAY(g) == 0)
#define IS_NEW_FRAME(f, g) (IS_ANIMATED(g) && IS_NEW_DELAY(f, g))
IS_EDITOR_CASCADE_ACTIVE(e) ? (e) - 1 : (e))
#define EL_NAME(e) ((e) >= 0 ? element_info[e].token_name : "(?)")
+#define MV_TEXT(d) ((d) == MV_NONE ? "MV_NONE" : \
+ (d) == MV_LEFT ? "MV_LEFT" : \
+ (d) == MV_RIGHT ? "MV_RIGHT" : \
+ (d) == MV_UP ? "MV_UP" : \
+ (d) == MV_DOWN ? "MV_DOWN" : "(various)")
/* fundamental game speed values */
#define MICROLEVEL_SCROLL_DELAY 50 /* delay for scrolling micro level */
#define MAX_NUM_AMOEBA 100
-#if 0 /* game.h */
-#define MAX_INVENTORY_SIZE 1000
-#define STD_NUM_KEYS 4
-#define MAX_NUM_KEYS 8
-#endif
-
#define NUM_BELTS 4
#define NUM_BELT_PARTS 3
#define NUM_ENVELOPES 4
#define MICROLEVEL_XSIZE ((STD_LEV_FIELDX + 2) * MICRO_TILEX)
#define MICROLEVEL_YSIZE ((STD_LEV_FIELDY + 2) * MICRO_TILEY)
#define MICROLEVEL_XPOS (SX + (SXSIZE - MICROLEVEL_XSIZE) / 2)
-#define MICROLEVEL_YPOS (SX + 12 * TILEY - MICRO_TILEY)
+#define MICROLEVEL_YPOS (SY + 12 * TILEY - MICRO_TILEY)
#define MICROLABEL1_YPOS (MICROLEVEL_YPOS - 36)
#define MICROLABEL2_YPOS (MICROLEVEL_YPOS + MICROLEVEL_YSIZE + 7)
#define EL_YAMYAM_UP 711
#define EL_YAMYAM_DOWN 712
-#define NUM_FILE_ELEMENTS 713
+#define EL_BD_EXPANDABLE_WALL 713
+
+#define EL_PREV_CE_8 714
+#define EL_PREV_CE_7 715
+#define EL_PREV_CE_6 716
+#define EL_PREV_CE_5 717
+#define EL_PREV_CE_4 718
+#define EL_PREV_CE_3 719
+#define EL_PREV_CE_2 720
+#define EL_PREV_CE_1 721
+#define EL_SELF 722
+#define EL_NEXT_CE_1 723
+#define EL_NEXT_CE_2 724
+#define EL_NEXT_CE_3 725
+#define EL_NEXT_CE_4 726
+#define EL_NEXT_CE_5 727
+#define EL_NEXT_CE_6 728
+#define EL_NEXT_CE_7 729
+#define EL_NEXT_CE_8 730
+#define EL_ANY_ELEMENT 731
+
+#define NUM_FILE_ELEMENTS 732
/* "real" (and therefore drawable) runtime elements */
#define EL_INTERNAL_CASCADE_CE_ACTIVE (EL_FIRST_INTERNAL + 23)
#define EL_INTERNAL_CASCADE_GE (EL_FIRST_INTERNAL + 24)
#define EL_INTERNAL_CASCADE_GE_ACTIVE (EL_FIRST_INTERNAL + 25)
-#define EL_INTERNAL_CASCADE_USER (EL_FIRST_INTERNAL + 26)
-#define EL_INTERNAL_CASCADE_USER_ACTIVE (EL_FIRST_INTERNAL + 27)
-#define EL_INTERNAL_CASCADE_GENERIC (EL_FIRST_INTERNAL + 28)
-#define EL_INTERNAL_CASCADE_GENERIC_ACTIVE (EL_FIRST_INTERNAL + 29)
+#define EL_INTERNAL_CASCADE_REF (EL_FIRST_INTERNAL + 26)
+#define EL_INTERNAL_CASCADE_REF_ACTIVE (EL_FIRST_INTERNAL + 27)
+#define EL_INTERNAL_CASCADE_USER (EL_FIRST_INTERNAL + 28)
+#define EL_INTERNAL_CASCADE_USER_ACTIVE (EL_FIRST_INTERNAL + 29)
#define EL_INTERNAL_CASCADE_DYNAMIC (EL_FIRST_INTERNAL + 30)
#define EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE (EL_FIRST_INTERNAL + 31)
#define NUM_SPECIAL_GFX_ARGS 12
+/* these additional definitions are currently only used for draw offsets */
+#define GFX_SPECIAL_ARG_INFO_MAIN 0
+#define GFX_SPECIAL_ARG_INFO_TITLE 1
+#define GFX_SPECIAL_ARG_INFO_ELEMENTS 2
+#define GFX_SPECIAL_ARG_INFO_MUSIC 3
+#define GFX_SPECIAL_ARG_INFO_CREDITS 4
+#define GFX_SPECIAL_ARG_INFO_PROGRAM 5
+#define GFX_SPECIAL_ARG_INFO_LEVELSET 6
+
+#define NUM_SPECIAL_GFX_INFO_ARGS 7
+
/* values for image configuration suffixes */
#define GFX_ARG_X 0
#define GFX_ARG_NAME 36
#define GFX_ARG_SCALE_UP_FACTOR 37
#define GFX_ARG_CLONE_FROM 38
+#define GFX_ARG_FADE_DELAY 39
+#define GFX_ARG_POST_DELAY 40
+#define GFX_ARG_AUTO_DELAY 41
-#define NUM_GFX_ARGS 39
+#define NUM_GFX_ARGS 42
/* values for sound configuration suffixes */
#define NUM_MUS_ARGS 1
-/* values for font configuration */
+/* values for font configuration (definitions must match those from main.c) */
#define FONT_INITIAL_1 0
#define FONT_INITIAL_2 1
#define FONT_INITIAL_3 2
#define FONT_INITIAL_4 3
#define FONT_TITLE_1 4
#define FONT_TITLE_2 5
-#define FONT_MENU_1 6
-#define FONT_MENU_2 7
-#define FONT_TEXT_1_ACTIVE 8
-#define FONT_TEXT_2_ACTIVE 9
-#define FONT_TEXT_3_ACTIVE 10
-#define FONT_TEXT_4_ACTIVE 11
-#define FONT_TEXT_1 12
-#define FONT_TEXT_2 13
-#define FONT_TEXT_3 14
-#define FONT_TEXT_4 15
-#define FONT_ENVELOPE_1 16
-#define FONT_ENVELOPE_2 17
-#define FONT_ENVELOPE_3 18
-#define FONT_ENVELOPE_4 19
-#define FONT_INPUT_1_ACTIVE 20
-#define FONT_INPUT_2_ACTIVE 21
-#define FONT_INPUT_1 22
-#define FONT_INPUT_2 23
-#define FONT_OPTION_OFF 24
-#define FONT_OPTION_ON 25
-#define FONT_VALUE_1 26
-#define FONT_VALUE_2 27
-#define FONT_VALUE_OLD 28
-#define FONT_LEVEL_NUMBER_ACTIVE 29
-#define FONT_LEVEL_NUMBER 30
-#define FONT_TAPE_RECORDER 31
-#define FONT_GAME_INFO 32
-
-#define NUM_FONTS 33
+#define FONT_MENU_1_ACTIVE 6
+#define FONT_MENU_2_ACTIVE 7
+#define FONT_MENU_1 8
+#define FONT_MENU_2 9
+#define FONT_TEXT_1_ACTIVE 10
+#define FONT_TEXT_2_ACTIVE 11
+#define FONT_TEXT_3_ACTIVE 12
+#define FONT_TEXT_4_ACTIVE 13
+#define FONT_TEXT_1 14
+#define FONT_TEXT_2 15
+#define FONT_TEXT_3 16
+#define FONT_TEXT_4 17
+#define FONT_ENVELOPE_1 18
+#define FONT_ENVELOPE_2 19
+#define FONT_ENVELOPE_3 20
+#define FONT_ENVELOPE_4 21
+#define FONT_INPUT_1_ACTIVE 22
+#define FONT_INPUT_2_ACTIVE 23
+#define FONT_INPUT_1 24
+#define FONT_INPUT_2 25
+#define FONT_OPTION_OFF 26
+#define FONT_OPTION_ON 27
+#define FONT_VALUE_1 28
+#define FONT_VALUE_2 29
+#define FONT_VALUE_OLD 30
+#define FONT_LEVEL_NUMBER_ACTIVE 31
+#define FONT_LEVEL_NUMBER 32
+#define FONT_TAPE_RECORDER 33
+#define FONT_GAME_INFO 34
+
+#define NUM_FONTS 35
#define NUM_INITIAL_FONTS 4
+#define FONT_ACTIVE(f) \
+ ((f) == FONT_MENU_1 ? FONT_MENU_1_ACTIVE : \
+ (f) == FONT_MENU_2 ? FONT_MENU_2_ACTIVE : \
+ (f) == FONT_TEXT_1 ? FONT_TEXT_1_ACTIVE : \
+ (f) == FONT_TEXT_2 ? FONT_TEXT_2_ACTIVE : \
+ (f) == FONT_TEXT_3 ? FONT_TEXT_3_ACTIVE : \
+ (f) == FONT_TEXT_4 ? FONT_TEXT_4_ACTIVE : \
+ (f) == FONT_INPUT_1 ? FONT_INPUT_1_ACTIVE : \
+ (f) == FONT_INPUT_2 ? FONT_INPUT_2_ACTIVE : \
+ (f) == FONT_LEVEL_NUMBER ? FONT_LEVEL_NUMBER_ACTIVE : \
+ (f))
+
+
/* values for game_status (must match special image configuration suffixes) */
#define GAME_MODE_DEFAULT 0
#define GAME_MODE_TITLE 1
/* program information and versioning definitions */
#define PROGRAM_VERSION_MAJOR 3
#define PROGRAM_VERSION_MINOR 2
-#define PROGRAM_VERSION_PATCH 0
-#define PROGRAM_VERSION_BUILD 9
+#define PROGRAM_VERSION_PATCH 3
+#define PROGRAM_VERSION_BUILD 0
#define PROGRAM_TITLE_STRING "Rocks'n'Diamonds"
#define PROGRAM_AUTHOR_STRING "Holger Schemel"
-#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2006 by Holger Schemel"
+#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2006 by Holger Schemel"
+#define PROGRAM_EMAIL_STRING "info@artsoft.org"
+#define PROGRAM_WEBSITE_STRING "http://www.artsoft.org/"
+#define PROGRAM_GAME_BY_STRING "A Game by Artsoft Entertainment"
#define ICON_TITLE_STRING PROGRAM_TITLE_STRING
#define COOKIE_PREFIX "ROCKSNDIAMONDS"
#define FILENAME_PREFIX "Rocks"
-#if defined(PLATFORM_UNIX)
-#define USERDATA_DIRECTORY ".rocksndiamonds"
-#elif defined(PLATFORM_WIN32)
-#define USERDATA_DIRECTORY PROGRAM_TITLE_STRING
+#define USERDATA_DIRECTORY_WIN32 PROGRAM_TITLE_STRING
+#define USERDATA_DIRECTORY_MACOSX PROGRAM_TITLE_STRING
+#define USERDATA_DIRECTORY_UNIX ".rocksndiamonds"
+#define USERDATA_DIRECTORY_DOS "userdata"
+
+#if defined(PLATFORM_WIN32)
+#define USERDATA_DIRECTORY USERDATA_DIRECTORY_WIN32
+#elif defined(PLATFORM_MACOSX)
+#define USERDATA_DIRECTORY USERDATA_DIRECTORY_MACOSX
+#elif defined(PLATFORM_UNIX)
+#define USERDATA_DIRECTORY USERDATA_DIRECTORY_UNIX
#else
-#define USERDATA_DIRECTORY "userdata"
+#define USERDATA_DIRECTORY USERDATA_DIRECTORY_DOS
#endif
#define X11_ICON_FILENAME "rocks_icon.xbm"
#define X11_ICONMASK_FILENAME "rocks_iconmask.xbm"
+#define SDL_ICON_FILENAME "rocks_icon_32x32.pcx"
#define MSDOS_POINTER_FILENAME "mouse.pcx"
/* file version numbers for resource files (levels, tapes, score, setup, etc.)
#define NUM_ENGINE_TYPES 3
+struct BorderInfo
+{
+ int draw_masked[NUM_SPECIAL_GFX_ARGS];
+};
+
+struct MenuPosInfo
+{
+ int x, y;
+ int width, height;
+ int align;
+};
+
+struct MenuMainButtonInfo
+{
+ struct MenuPosInfo name;
+ struct MenuPosInfo levels;
+ struct MenuPosInfo scores;
+ struct MenuPosInfo editor;
+ struct MenuPosInfo info;
+ struct MenuPosInfo game;
+ struct MenuPosInfo setup;
+ struct MenuPosInfo quit;
+
+ struct MenuPosInfo prev_level;
+ struct MenuPosInfo next_level;
+};
+
+struct MenuMainTextInfo
+{
+ struct MenuPosInfo name;
+ struct MenuPosInfo levels;
+ struct MenuPosInfo scores;
+ struct MenuPosInfo editor;
+ struct MenuPosInfo info;
+ struct MenuPosInfo game;
+ struct MenuPosInfo setup;
+ struct MenuPosInfo quit;
+
+ struct MenuPosInfo current_level;
+ struct MenuPosInfo first_level;
+ struct MenuPosInfo last_level;
+ struct MenuPosInfo level_info_1;
+ struct MenuPosInfo level_info_2;
+ struct MenuPosInfo title_1;
+ struct MenuPosInfo title_2;
+ struct MenuPosInfo title_3;
+};
+
+struct MenuMainInputInfo
+{
+ struct MenuPosInfo name;
+};
+
+struct MenuMainInfo
+{
+ struct MenuMainButtonInfo button;
+ struct MenuMainTextInfo text;
+ struct MenuMainInputInfo input;
+};
+
+struct TitleInfo
+{
+ int fade_delay;
+ int post_delay;
+ int auto_delay;
+
+ int fade_delay_final;
+ int post_delay_final;
+ int auto_delay_final;
+};
+
struct MenuInfo
{
int draw_xoffset[NUM_SPECIAL_GFX_ARGS];
int draw_yoffset[NUM_SPECIAL_GFX_ARGS];
+ int draw_xoffset_info[NUM_SPECIAL_GFX_INFO_ARGS];
+ int draw_yoffset_info[NUM_SPECIAL_GFX_INFO_ARGS];
int scrollbar_xoffset;
int list_size[NUM_SPECIAL_GFX_ARGS];
+ int fade_delay;
+ int post_delay;
+ int auto_delay;
+
int sound[NUM_SPECIAL_GFX_ARGS];
int music[NUM_SPECIAL_GFX_ARGS];
+
+ struct MenuMainInfo main;
};
struct DoorInfo
int anim_mode;
};
+struct PreviewInfo
+{
+ int x, y;
+ int align;
+ int xsize, ysize;
+ int xoffset, yoffset;
+ int tile_size;
+ int step_offset;
+ int step_delay;
+ int anim_mode;
+};
+
struct HiScore
{
char Name[MAX_PLAYER_NAME_LEN + 1];
int explosion_element[MAX_PLAYERS];
boolean use_explosion_element[MAX_PLAYERS];
-#if 1
/* values for the new EMC elements */
int android_move_time;
int android_clone_time;
struct Content ball_content[MAX_ELEMENT_CONTENTS];
int num_ball_contents;
-#if 0
- boolean android_array[16];
-#endif
int num_android_clone_elements;
int android_clone_element[MAX_ANDROID_ELEMENTS];
-#endif
int can_move_into_acid_bits; /* bitfield to store property for elements */
int dont_collide_with_bits; /* bitfield to store property for elements */
int src_x, src_y; /* start position of animation frames */
int width, height; /* width/height of each animation frame */
+
int offset_x, offset_y; /* x/y offset to next animation frame */
int offset2_x, offset2_y; /* x/y offset to second movement tile */
+
boolean double_movement; /* animation has second movement tile */
int swap_double_tiles; /* explicitely force or forbid tile swapping */
+
int anim_frames;
int anim_frames_per_line;
int anim_start_frame;
int anim_delay; /* important: delay of 1 means "no delay"! */
int anim_mode;
+
boolean anim_global_sync;
+
int crumbled_like; /* element for cloning crumble graphics */
int diggable_like; /* element for cloning digging graphics */
+
int border_size; /* border size for "crumbled" graphics */
+
int scale_up_factor; /* optional factor for scaling image up */
+
int clone_from; /* graphic for cloning *all* settings */
int anim_delay_fixed; /* optional delay values for bored and */
int draw_masked; /* optional setting for drawing envelope gfx */
+ int fade_delay; /* optional setting for drawing title screens */
+ int post_delay; /* optional setting for drawing title screens */
+ int auto_delay; /* optional setting for drawing title screens */
+
+ boolean use_image_size; /* use image size as default width and height */
+
#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
Pixmap clip_mask; /* single-graphic-only clip mask for X11 */
GC clip_gc; /* single-graphic-only clip gc for X11 */
};
-extern Bitmap *bitmap_db_title;
+extern Bitmap *bitmap_db_cross;
extern Bitmap *bitmap_db_field;
+extern Bitmap *bitmap_db_panel;
extern Bitmap *bitmap_db_door;
extern Pixmap tile_clipmask[];
extern DrawBuffer *fieldbuffer;
extern int RunnerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int PlayerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-#if 0
-extern unsigned long Properties[MAX_NUM_ELEMENTS][NUM_EP_BITFIELDS];
-#endif
-
extern int GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern int AllPlayersGone;
extern int TimeFrames, TimePlayed, TimeLeft, TapeTime;
-extern boolean SiebAktiv;
-extern int SiebCount;
extern boolean network_player_action_received;
extern struct HiScore highscore[];
extern struct TapeInfo tape;
extern struct GlobalInfo global;
+extern struct BorderInfo border;
+extern struct TitleInfo title;
extern struct MenuInfo menu;
extern struct DoorInfo door_1, door_2;
+extern struct PreviewInfo preview;
extern struct ElementInfo element_info[];
extern struct ElementNameInfo element_name_info[];
extern struct ElementActionInfo element_action_info[];