X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Fmain.h;h=cd6ffe2b3bd8d9f020f56221c6a802e26321c2aa;hp=c131ffc0d95d602a2c856ea22689aa5b712c53ff;hb=c0c5862d9ee59c70412b1c35e558101b109a8ec9;hpb=380afea8229172182d887138b6e72751669cf6e0 diff --git a/src/main.h b/src/main.h index c131ffc0..cd6ffe2b 100644 --- a/src/main.h +++ b/src/main.h @@ -42,6 +42,8 @@ #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) @@ -50,8 +52,8 @@ #define MIN_LEV_FIELDY 3 #define STD_LEV_FIELDX 64 #define STD_LEV_FIELDY 32 -#define MAX_LEV_FIELDX 128 -#define MAX_LEV_FIELDY 128 +#define MAX_LEV_FIELDX MAX_PLAYFIELD_WIDTH +#define MAX_LEV_FIELDY MAX_PLAYFIELD_HEIGHT #define SCREENX(a) ((a) - scroll_x) #define SCREENY(a) ((a) - scroll_y) @@ -150,27 +152,36 @@ #define EP_CAN_EXPLODE_BY_EXPLOSION 78 #define EP_COULD_MOVE_INTO_ACID 79 #define EP_MAYBE_DONT_COLLIDE_WITH 80 +#define EP_CAN_BE_CLONED_BY_ANDROID 81 /* values for internal purpose only (level editor) */ -#define EP_WALK_TO_OBJECT 81 -#define EP_DEADLY 82 -#define EP_EDITOR_CASCADE 83 -#define EP_EDITOR_CASCADE_ACTIVE 84 -#define EP_EDITOR_CASCADE_INACTIVE 85 +#define EP_WALK_TO_OBJECT 82 +#define EP_DEADLY 83 +#define EP_EDITOR_CASCADE 84 +#define EP_EDITOR_CASCADE_ACTIVE 85 +#define EP_EDITOR_CASCADE_INACTIVE 86 /* values for internal purpose only (game engine) */ -#define EP_HAS_ACTION 86 -#define EP_CAN_CHANGE_OR_HAS_ACTION 87 +#define EP_HAS_ACTION 87 +#define EP_CAN_CHANGE_OR_HAS_ACTION 88 + +/* values for internal purpose only (other) */ +#define EP_OBSOLETE 89 -#define NUM_ELEMENT_PROPERTIES 88 +#define NUM_ELEMENT_PROPERTIES 90 #define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32) -#define EP_BITFIELD_BASE 0 +#define EP_BITFIELD_BASE_NR 0 +#define EP_BITMASK_BASE_DEFAULT (1 << EP_CAN_MOVE_INTO_ACID) #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)) : \ @@ -216,11 +227,22 @@ #define CE_MOVE_OF_X 35 #define CE_DIGGING_X 36 #define CE_CREATION_OF_X 37 +#define CE_SCORE_GETS_ZERO 38 +#define CE_SCORE_GETS_ZERO_OF_X 39 +#define CE_VALUE_CHANGES 40 +#define CE_VALUE_CHANGES_OF_X 41 +#define CE_SCORE_CHANGES 42 +#define CE_SCORE_CHANGES_OF_X 43 + +#define NUM_CHANGE_EVENTS 44 -#define NUM_CHANGE_EVENTS 38 +#define NUM_CE_BITFIELDS ((NUM_CHANGE_EVENTS + 31) / 32) #define CE_BITMASK_DEFAULT 0 +#define CH_EVENT_BITFIELD_NR(e) (e / 32) +#define CH_EVENT_BIT(e) (1 << ((e) % 32)) + #define CH_EVENT_VAR(e,c) (element_info[e].change->has_event[c]) #define CH_ANY_EVENT_VAR(e,c) (element_info[e].has_change_event[c]) @@ -313,7 +335,7 @@ #define CA_SET_LEVEL_GEMS 7 #define CA_SET_LEVEL_SCORE 8 #define CA_SET_LEVEL_WIND 9 -#define CA_SET_LEVEL_GRAVITY 10 +#define CA_SET_PLAYER_GRAVITY 10 #define CA_SET_PLAYER_KEYS 11 #define CA_SET_PLAYER_SPEED 12 #define CA_SET_PLAYER_SHIELD 13 @@ -376,7 +398,16 @@ #define CA_ARG_ELEMENT_RESET (CA_ARG_ELEMENT + 0) #define CA_ARG_ELEMENT_TARGET (CA_ARG_ELEMENT + 1) #define CA_ARG_ELEMENT_TRIGGER (CA_ARG_ELEMENT + 2) -#define CA_ARG_ELEMENT_HEADLINE (CA_ARG_ELEMENT + 999) +#define CA_ARG_ELEMENT_HEADLINE (CA_ARG_ELEMENT + 997) +#define CA_ARG_ELEMENT_CV_TARGET (CA_ARG_ELEMENT_TARGET) +#define CA_ARG_ELEMENT_CV_TRIGGER (CA_ARG_ELEMENT_TRIGGER) +#define CA_ARG_ELEMENT_CV_HEADLINE (CA_ARG_ELEMENT_HEADLINE) +#define CA_ARG_ELEMENT_NR_TARGET (CA_ARG_ELEMENT + 3) +#define CA_ARG_ELEMENT_NR_TRIGGER (CA_ARG_ELEMENT + 4) +#define CA_ARG_ELEMENT_NR_HEADLINE (CA_ARG_ELEMENT + 998) +#define CA_ARG_ELEMENT_CS_TARGET (CA_ARG_ELEMENT + 5) +#define CA_ARG_ELEMENT_CS_TRIGGER (CA_ARG_ELEMENT + 6) +#define CA_ARG_ELEMENT_CS_HEADLINE (CA_ARG_ELEMENT + 999) #define CA_ARG_SPEED 13000 #define CA_ARG_SPEED_NOT_MOVING (CA_ARG_SPEED + STEPSIZE_NOT_MOVING) #define CA_ARG_SPEED_VERY_SLOW (CA_ARG_SPEED + STEPSIZE_VERY_SLOW) @@ -564,6 +595,8 @@ HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_EXPLOSION) #define COULD_MOVE_INTO_ACID(e) HAS_PROPERTY(e, EP_COULD_MOVE_INTO_ACID) #define MAYBE_DONT_COLLIDE_WITH(e) HAS_PROPERTY(e, EP_MAYBE_DONT_COLLIDE_WITH) +#define CAN_BE_CLONED_BY_ANDROID(e) \ + HAS_PROPERTY(e, EP_CAN_BE_CLONED_BY_ANDROID) #define IS_EDITOR_CASCADE(e) HAS_PROPERTY(e, EP_EDITOR_CASCADE) #define IS_EDITOR_CASCADE_ACTIVE(e) \ @@ -575,6 +608,8 @@ #define CAN_CHANGE_OR_HAS_ACTION(e) \ HAS_PROPERTY(e, EP_CAN_CHANGE_OR_HAS_ACTION) +#define IS_OBSOLETE(e) HAS_PROPERTY(e, EP_OBSOLETE) + /* special macros used in game engine */ #define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \ (e) <= EL_CUSTOM_END) @@ -654,6 +689,19 @@ #define GFX_ELEMENT(e) (element_info[e].use_gfx_element ? \ element_info[e].gfx_element : e) +/* !!! CHECK THIS !!! */ +#if 1 +#define TILE_GFX_ELEMENT(x, y) \ + (GfxElement[x][y] != EL_UNDEFINED && \ + Feld[x][y] != EL_EXPLOSION ? \ + GfxElement[x][y] : Feld[x][y]) +#else +#define TILE_GFX_ELEMENT(x, y) \ + GFX_ELEMENT(GfxElement[x][y] != EL_UNDEFINED && \ + Feld[x][y] != EL_EXPLOSION ? \ + GfxElement[x][y] : Feld[x][y]) +#endif + /* !!! "use sound" deactivated due to problems with level "bug machine" !!! */ /* (solution: add separate "use sound of element" to level file and editor) */ #if 0 @@ -662,6 +710,22 @@ #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)) + +#if 1 +#define IS_EQUAL_OR_IN_GROUP(e, ge) \ + (ge == EL_ANY_ELEMENT ? TRUE : \ + IS_GROUP_ELEMENT(ge) ? IS_IN_GROUP(e, GROUP_NR(ge)) : (e) == (ge)) +#else +#define IS_EQUAL_OR_IN_GROUP(e, ge) \ + (IS_GROUP_ELEMENT(ge) ? IS_IN_GROUP(e, GROUP_NR(ge)) : (e) == (ge)) +#endif + +#endif + #define IS_PLAYER(x, y) (ELEM_IS_PLAYER(StorePlayer[x][y])) #define IS_FREE(x, y) (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x, y)) @@ -671,6 +735,8 @@ #define IS_FALLING(x,y) (MovPos[x][y] != 0 && MovDir[x][y] == MV_DOWN) #define IS_BLOCKED(x,y) (Feld[x][y] == EL_BLOCKED) +#define IS_MV_DIAGONAL(x) ((x) & MV_HORIZONTAL && (x) & MV_VERTICAL) + #define EL_CHANGED(e) ((e) == EL_ROCK ? EL_EMERALD : \ (e) == EL_BD_ROCK ? EL_BD_DIAMOND : \ (e) == EL_EMERALD ? EL_DIAMOND : \ @@ -714,6 +780,9 @@ #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)) @@ -726,13 +795,14 @@ #define EL_CASCADE_TOGGLE(e) (IS_EDITOR_CASCADE_INACTIVE(e) ? (e) + 1 : \ IS_EDITOR_CASCADE_ACTIVE(e) ? (e) - 1 : (e)) -#define EL_NAME(e) (element_info[e].token_name) +#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 ONE_SECOND_DELAY 1000 /* delay value for one second */ -#define GAME_FRAME_DELAY 20 /* frame delay in milliseconds */ -#define FFWD_FRAME_DELAY 10 /* 200% speed for fast forward */ -#define FRAMES_PER_SECOND (ONE_SECOND_DELAY / GAME_FRAME_DELAY) #define MICROLEVEL_SCROLL_DELAY 50 /* delay for scrolling micro level */ #define MICROLEVEL_LABEL_DELAY 250 /* delay for micro level label */ @@ -740,15 +810,21 @@ #define MAX_LEVEL_NAME_LEN 32 #define MAX_LEVEL_AUTHOR_LEN 32 #define MAX_ELEMENT_NAME_LEN 32 -#define MAX_TAPE_LEN (1000 * FRAMES_PER_SECOND) /* max.time x fps */ #define MAX_TAPES_PER_SET 1024 #define MAX_SCORE_ENTRIES 100 +#define MAX_NUM_TITLE_SCREENS 5 + #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 MIN_ENVELOPE_XSIZE 1 #define MIN_ENVELOPE_YSIZE 1 #define MAX_ENVELOPE_XSIZE 30 @@ -766,8 +842,6 @@ #define STD_ELEMENT_CONTENTS 4 #define MAX_ELEMENT_CONTENTS 8 -#define LEVEL_SCORE_ELEMENTS 16 /* level elements with score */ - /* often used screen positions */ #define SX 8 #define SY 8 @@ -805,7 +879,7 @@ #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) @@ -825,6 +899,10 @@ #define SC_CRYSTAL 11 #define SC_PEARL 12 #define SC_SHIELD 13 +#define SC_UNKNOWN_14 14 +#define SC_UNKNOWN_15 15 + +#define LEVEL_SCORE_ELEMENTS 16 /* level elements with score */ /* "real" level file elements */ @@ -1034,8 +1112,8 @@ #define EL_EM_GATE_3_GRAY 252 #define EL_EM_GATE_4_GRAY 253 -#define EL_UNUSED_254 254 -#define EL_UNUSED_255 255 +#define EL_EM_DYNAMITE 254 +#define EL_EM_DYNAMITE_ACTIVE 255 #define EL_PEARL 256 #define EL_CRYSTAL 257 @@ -1181,6 +1259,7 @@ #define EL_TRIGGER_ELEMENT 657 #define EL_TRIGGER_PLAYER 658 +/* SP style elements */ #define EL_SP_GRAVITY_ON_PORT_RIGHT 659 #define EL_SP_GRAVITY_ON_PORT_DOWN 660 #define EL_SP_GRAVITY_ON_PORT_LEFT 661 @@ -1190,8 +1269,7 @@ #define EL_SP_GRAVITY_OFF_PORT_LEFT 665 #define EL_SP_GRAVITY_OFF_PORT_UP 666 - -/* the following EMC style elements are currently not implemented in R'n'D */ +/* EMC style elements */ #define EL_BALLOON_SWITCH_NONE 667 #define EL_EMC_GATE_5 668 #define EL_EMC_GATE_6 669 @@ -1231,7 +1309,38 @@ #define EL_EMC_FAKE_ACID 703 #define EL_EMC_DRIPPER 704 -#define NUM_FILE_ELEMENTS 705 +#define EL_TRIGGER_CE_VALUE 705 +#define EL_TRIGGER_CE_SCORE 706 +#define EL_CURRENT_CE_VALUE 707 +#define EL_CURRENT_CE_SCORE 708 + +#define EL_YAMYAM_LEFT 709 +#define EL_YAMYAM_RIGHT 710 +#define EL_YAMYAM_UP 711 +#define EL_YAMYAM_DOWN 712 + +#define EL_BD_EXPANDABLE_WALL 713 + +#define EL_LAST_CE_8 714 +#define EL_LAST_CE_7 715 +#define EL_LAST_CE_6 716 +#define EL_LAST_CE_5 717 +#define EL_LAST_CE_4 718 +#define EL_LAST_CE_3 719 +#define EL_LAST_CE_2 720 +#define EL_LAST_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 */ @@ -1297,11 +1406,9 @@ #define EL_EMC_GATE_8_GRAY_ACTIVE (EL_FIRST_RUNTIME_REAL + 57) #define EL_EMC_DRIPPER_ACTIVE (EL_FIRST_RUNTIME_REAL + 58) #define EL_EMC_SPRING_BUMPER_ACTIVE (EL_FIRST_RUNTIME_REAL + 59) -#define EL_EMC_ANDROID_SHRINKING (EL_FIRST_RUNTIME_REAL + 60) -#define EL_EMC_ANDROID_GROWING (EL_FIRST_RUNTIME_REAL + 61) /* "unreal" (and therefore not drawable) runtime elements */ -#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 62) +#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 60) #define EL_BLOCKED (EL_FIRST_RUNTIME_UNREAL + 0) #define EL_EXPLOSION (EL_FIRST_RUNTIME_UNREAL + 1) @@ -1322,9 +1429,13 @@ #define EL_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 16) #define EL_BD_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 17) #define EL_ELEMENT_SNAPPING (EL_FIRST_RUNTIME_UNREAL + 18) +#define EL_DIAGONAL_SHRINKING (EL_FIRST_RUNTIME_UNREAL + 19) +#define EL_DIAGONAL_GROWING (EL_FIRST_RUNTIME_UNREAL + 20) + +#define NUM_RUNTIME_ELEMENTS (EL_FIRST_RUNTIME_UNREAL + 21) /* dummy elements (never used as game elements, only used as graphics) */ -#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 19) +#define EL_FIRST_DUMMY NUM_RUNTIME_ELEMENTS #define EL_STEELWALL_TOPLEFT (EL_FIRST_DUMMY + 0) #define EL_STEELWALL_TOPRIGHT (EL_FIRST_DUMMY + 1) @@ -1382,10 +1493,10 @@ #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) @@ -1447,7 +1558,7 @@ #define ACTION_TURNING_FROM_DOWN 46 #define ACTION_SMASHED_BY_ROCK 47 #define ACTION_SMASHED_BY_SPRING 48 -#define ACTION_SLURPED_BY_SPRING 49 +#define ACTION_EATING 49 #define ACTION_TWINKLING 50 #define ACTION_SPLASHING 51 #define ACTION_PAGE_1 52 @@ -1492,18 +1603,19 @@ /* values for special image configuration suffixes (must match game mode) */ #define GFX_SPECIAL_ARG_DEFAULT 0 -#define GFX_SPECIAL_ARG_MAIN 1 -#define GFX_SPECIAL_ARG_LEVELS 2 -#define GFX_SPECIAL_ARG_SCORES 3 -#define GFX_SPECIAL_ARG_EDITOR 4 -#define GFX_SPECIAL_ARG_INFO 5 -#define GFX_SPECIAL_ARG_SETUP 6 -#define GFX_SPECIAL_ARG_PLAYING 7 -#define GFX_SPECIAL_ARG_DOOR 8 -#define GFX_SPECIAL_ARG_PREVIEW 9 -#define GFX_SPECIAL_ARG_CRUMBLED 10 +#define GFX_SPECIAL_ARG_TITLE 1 +#define GFX_SPECIAL_ARG_MAIN 2 +#define GFX_SPECIAL_ARG_LEVELS 3 +#define GFX_SPECIAL_ARG_SCORES 4 +#define GFX_SPECIAL_ARG_EDITOR 5 +#define GFX_SPECIAL_ARG_INFO 6 +#define GFX_SPECIAL_ARG_SETUP 7 +#define GFX_SPECIAL_ARG_PLAYING 8 +#define GFX_SPECIAL_ARG_DOOR 9 +#define GFX_SPECIAL_ARG_PREVIEW 10 +#define GFX_SPECIAL_ARG_CRUMBLED 11 -#define NUM_SPECIAL_GFX_ARGS 11 +#define NUM_SPECIAL_GFX_ARGS 12 /* values for image configuration suffixes */ @@ -1594,29 +1706,31 @@ #define FONT_VALUE_1 26 #define FONT_VALUE_2 27 #define FONT_VALUE_OLD 28 -#define FONT_LEVEL_NUMBER 29 -#define FONT_TAPE_RECORDER 30 -#define FONT_GAME_INFO 31 +#define FONT_LEVEL_NUMBER_ACTIVE 29 +#define FONT_LEVEL_NUMBER 30 +#define FONT_TAPE_RECORDER 31 +#define FONT_GAME_INFO 32 -#define NUM_FONTS 32 +#define NUM_FONTS 33 #define NUM_INITIAL_FONTS 4 /* values for game_status (must match special image configuration suffixes) */ #define GAME_MODE_DEFAULT 0 -#define GAME_MODE_MAIN 1 -#define GAME_MODE_LEVELS 2 -#define GAME_MODE_SCORES 3 -#define GAME_MODE_EDITOR 4 -#define GAME_MODE_INFO 5 -#define GAME_MODE_SETUP 6 -#define GAME_MODE_PLAYING 7 -#define GAME_MODE_PSEUDO_DOOR 8 -#define GAME_MODE_PSEUDO_PREVIEW 9 -#define GAME_MODE_PSEUDO_CRUMBLED 10 +#define GAME_MODE_TITLE 1 +#define GAME_MODE_MAIN 2 +#define GAME_MODE_LEVELS 3 +#define GAME_MODE_SCORES 4 +#define GAME_MODE_EDITOR 5 +#define GAME_MODE_INFO 6 +#define GAME_MODE_SETUP 7 +#define GAME_MODE_PLAYING 8 +#define GAME_MODE_PSEUDO_DOOR 9 +#define GAME_MODE_PSEUDO_PREVIEW 10 +#define GAME_MODE_PSEUDO_CRUMBLED 11 /* there are no special config file suffixes for these modes */ -#define GAME_MODE_PSEUDO_TYPENAME 11 -#define GAME_MODE_QUIT 12 +#define GAME_MODE_PSEUDO_TYPENAME 12 +#define GAME_MODE_QUIT 13 /* special definitions currently only used for custom artwork configuration */ #define MUSIC_PREFIX_BACKGROUND 0 @@ -1631,27 +1745,37 @@ /* program information and versioning definitions */ #define PROGRAM_VERSION_MAJOR 3 #define PROGRAM_VERSION_MINOR 2 -#define PROGRAM_VERSION_PATCH 0 -#define PROGRAM_VERSION_BUILD 7 +#define PROGRAM_VERSION_PATCH 1 +#define PROGRAM_VERSION_BUILD 0 #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" -#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2005 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 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.) @@ -1665,16 +1789,18 @@ #define FILE_VERSION_1_2 VERSION_IDENT(1,2,0,0) #define FILE_VERSION_1_4 VERSION_IDENT(1,4,0,0) #define FILE_VERSION_2_0 VERSION_IDENT(2,0,0,0) +#define FILE_VERSION_3_0 VERSION_IDENT(3,0,0,0) /* file version does not change for every program version, but is changed when new features are introduced that are incompatible with older file versions, so that they can be treated accordingly */ -#define FILE_VERSION_ACTUAL FILE_VERSION_2_0 +#define FILE_VERSION_ACTUAL FILE_VERSION_3_0 #define GAME_VERSION_1_0 FILE_VERSION_1_0 #define GAME_VERSION_1_2 FILE_VERSION_1_2 #define GAME_VERSION_1_4 FILE_VERSION_1_4 #define GAME_VERSION_2_0 FILE_VERSION_2_0 +#define GAME_VERSION_3_0 FILE_VERSION_3_0 #define GAME_VERSION_ACTUAL VERSION_IDENT(PROGRAM_VERSION_MAJOR, \ PROGRAM_VERSION_MINOR, \ @@ -1716,6 +1842,9 @@ struct MenuInfo int list_size[NUM_SPECIAL_GFX_ARGS]; + int fade_delay; + int post_delay; + int sound[NUM_SPECIAL_GFX_ARGS]; int music[NUM_SPECIAL_GFX_ARGS]; }; @@ -1729,6 +1858,15 @@ struct DoorInfo int anim_mode; }; +struct PreviewInfo +{ + int x, y; + int xsize, ysize; + int tile_size; + int step_offset; + int step_delay; +}; + struct HiScore { char Name[MAX_PLAYER_NAME_LEN + 1]; @@ -1740,102 +1878,12 @@ struct Content int e[3][3]; }; -struct PlayerInfo +struct EnvelopeInfo { - boolean present; /* player present in level playfield */ - boolean connected; /* player connected (locally or via network) */ - boolean active; /* player present and connected */ - - int index_nr; /* player number (0 to 3) */ - int index_bit; /* player number bit (1 << 0 to 1 << 3) */ - int element_nr; /* element (EL_PLAYER_1 to EL_PLAYER_4) */ - int client_nr; /* network client identifier */ - - byte action; /* action from local input device */ - byte effective_action; /* action acknowledged from network server - or summarized over all configured input - devices when in single player mode */ - byte programmed_action; /* action forced by game itself (like moving - through doors); overrides other actions */ - - int jx, jy, last_jx, last_jy; - int MovDir, MovPos, GfxDir, GfxPos; - int Frame, StepFrame; - - int GfxAction; - - boolean use_murphy; - int artwork_element; - - boolean block_last_field; - int block_delay_adjustment; /* needed for different engine versions */ - - boolean can_fall_into_acid; + int xsize; + int ysize; - boolean LevelSolved, GameOver; - - int last_move_dir; - - boolean is_waiting; - boolean is_moving; - boolean is_auto_moving; - boolean is_digging; - boolean is_snapping; - boolean is_collecting; - boolean is_pushing; - boolean is_switching; - boolean is_dropping; - - boolean is_bored; - boolean is_sleeping; - - boolean cannot_move; - - int frame_counter_bored; - int frame_counter_sleeping; - - int anim_delay_counter; - int post_delay_counter; - - int action_waiting, last_action_waiting; - int special_action_bored; - int special_action_sleeping; - - int num_special_action_bored; - int num_special_action_sleeping; - - int switch_x, switch_y; - int drop_x, drop_y; - - int show_envelope; - - int move_delay; - int move_delay_value; - int move_delay_value_next; - int move_delay_reset_counter; - - int push_delay; - int push_delay_value; - - unsigned long actual_frame_counter; - - int drop_delay; - - int step_counter; - - int score; - int gems_still_needed; - int sokobanfields_still_needed; - int lights_still_needed; - int friends_still_needed; - int key[MAX_NUM_KEYS]; - int dynabomb_count, dynabomb_size, dynabombs_left, dynabomb_xl; - int shield_normal_time_left; - int shield_deadly_time_left; - - int inventory_element[MAX_INVENTORY_SIZE]; - int inventory_infinite_element; - int inventory_size; + char text[MAX_ENVELOPE_TEXT_LEN + 1]; }; struct LevelSetInfo @@ -1852,6 +1900,13 @@ struct LevelFileInfo char *filename; }; +struct DateInfo +{ + int year; + int month; + int day; +}; + struct LevelInfo { struct LevelFileInfo file_info; @@ -1864,6 +1919,8 @@ struct LevelInfo int file_version; /* file format version the level is stored with */ int game_version; /* game release version the level was created with */ + struct DateInfo creation_date; + boolean encoding_16bit_field; /* level contains 16-bit elements */ boolean encoding_16bit_yamyam; /* yamyam contains 16-bit elements */ boolean encoding_16bit_amoeba; /* amoeba contains 16-bit elements */ @@ -1876,8 +1933,7 @@ struct LevelInfo char name[MAX_LEVEL_NAME_LEN + 1]; char author[MAX_LEVEL_AUTHOR_LEN + 1]; - char envelope_text[4][MAX_ENVELOPE_TEXT_LEN + 1]; - int envelope_xsize[4], envelope_ysize[4]; + struct EnvelopeInfo envelope[NUM_ENVELOPES]; int score[LEVEL_SCORE_ELEMENTS]; @@ -1939,9 +1995,9 @@ struct LevelInfo int can_move_into_acid_bits; /* bitfield to store property for elements */ int dont_collide_with_bits; /* bitfield to store property for elements */ - int initial_player_stepsize; /* initial player speed */ + int initial_player_stepsize[MAX_PLAYERS]; /* initial player speed */ + boolean initial_player_gravity[MAX_PLAYERS]; - boolean initial_gravity; boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */ boolean use_spring_bug; /* for compatibility with old levels */ boolean use_time_orb_bug; /* for compatibility with old levels */ @@ -1949,6 +2005,7 @@ struct LevelInfo boolean can_pass_to_walkable; /* player can pass to empty or walkable tile */ boolean grow_into_diggable; /* amoeba can grow into anything diggable */ + boolean continuous_snapping; /* repeated snapping without releasing key */ boolean block_snap_field; /* snapping blocks field to show animation */ boolean block_last_field; /* player blocks previous field while moving */ boolean sp_block_last_field; /* player blocks previous field while moving */ @@ -1965,94 +2022,6 @@ struct LevelInfo boolean changed; /* set when level was changed in the editor */ }; -struct TapeInfo -{ - int file_version; /* file format version the tape is stored with */ - int game_version; /* game release version the tape was created with */ - int engine_version; /* game engine version the tape was recorded with */ - - char *level_identifier; - int level_nr; - unsigned long random_seed; - unsigned long date; - unsigned long counter; - unsigned long length; - unsigned long length_seconds; - unsigned int delay_played; - boolean pause_before_death; - boolean recording, playing, pausing; - boolean fast_forward; - boolean warp_forward; - boolean deactivate_display; - boolean auto_play; - boolean auto_play_level_solved; - boolean quick_resume; - boolean single_step; - boolean changed; - boolean player_participates[MAX_PLAYERS]; - int num_participating_players; - - struct - { - byte action[MAX_PLAYERS]; - byte delay; - } pos[MAX_TAPE_LEN]; - - boolean no_valid_file; /* set when tape file missing or invalid */ -}; - -struct GameInfo -{ - /* values for engine initialization */ - int default_push_delay_fixed; - int default_push_delay_random; - - /* constant within running game */ - int engine_version; - int emulation; - int initial_move_delay; - int initial_move_delay_value; - int initial_push_delay_value; - - /* flags to handle bugs in and changes between different engine versions */ - /* (for the latest engine version, these flags should always be "FALSE") */ - boolean use_change_when_pushing_bug; - boolean use_block_last_field_bug; - boolean max_num_changes_per_frame; - boolean use_reverse_scan_direction; - - /* variable within running game */ - int yamyam_content_nr; - boolean magic_wall_active; - int magic_wall_time_left; - int light_time_left; - int timegate_time_left; - int belt_dir[4]; - int belt_dir_nr[4]; - int switchgate_pos; - int wind_direction; - boolean gravity; - boolean explosions_delayed; - boolean envelope_active; - -#if 1 - /* values for the new EMC elements */ - int lenses_time_left; - int magnify_time_left; - boolean ball_state; - int ball_content_nr; -#endif - - /* values for player idle animation (no effect on engine) */ - int player_boring_delay_fixed; - int player_boring_delay_random; - int player_sleeping_delay_fixed; - int player_sleeping_delay_random; - - /* values for special game initialization control */ - boolean restart_level; -}; - struct GlobalInfo { char *autoplay_leveldir; @@ -2113,6 +2082,7 @@ struct ElementChangeInfo int actual_trigger_side; /* element side that triggered the change */ int actual_trigger_player; /* player which actually triggered change */ int actual_trigger_ce_value; /* CE value of element that triggered change */ + int actual_trigger_ce_score; /* CE score of element that triggered change */ boolean can_change_or_has_action; /* can_change | has_action */ @@ -2161,11 +2131,11 @@ struct ElementInfo /* ---------- graphic and sound definitions ---------- */ int graphic[NUM_ACTIONS]; /* default graphics for several actions */ - int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS]; + int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS_FULL]; /* special graphics for left/right/up/down */ int crumbled[NUM_ACTIONS]; /* crumbled graphics for several actions */ - int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS]; + int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS_FULL]; /* crumbled graphics for left/right/up/down */ int special_graphic[NUM_SPECIAL_GFX_ARGS]; @@ -2175,6 +2145,8 @@ struct ElementInfo /* ---------- special element property values ---------- */ + unsigned long properties[NUM_EP_BITFIELDS]; /* element base properties */ + boolean use_gfx_element; /* use custom graphic element */ int gfx_element; /* optional custom graphic element */ @@ -2264,20 +2236,28 @@ struct GraphicInfo 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 */ @@ -2288,7 +2268,8 @@ struct GraphicInfo int step_offset; /* optional step offset of toon animations */ int step_delay; /* optional step delay of toon animations */ - int draw_x, draw_y; /* optional offset for drawing fonts chars */ + int draw_xoffset; /* optional offset for drawing font chars */ + int draw_yoffset; /* optional offset for drawing font chars */ int draw_masked; /* optional setting for drawing envelope gfx */ @@ -2366,10 +2347,13 @@ struct HelpAnimInfo }; -extern Bitmap *bitmap_db_field, *bitmap_db_door; +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 DrawBuffer *drawto_field; +extern DrawBuffer *fieldbuffer; +extern DrawBuffer *drawto_field; extern int game_status; extern boolean level_editor_test_game; @@ -2412,7 +2396,9 @@ extern short ExplodeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; 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]; @@ -2447,13 +2433,12 @@ extern int graphics_action_mapping[]; extern struct LevelSetInfo levelset; extern struct LevelInfo level, level_template; -extern struct PlayerInfo stored_player[], *local_player; extern struct HiScore highscore[]; extern struct TapeInfo tape; -extern struct GameInfo game; extern struct GlobalInfo global; 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[];