#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)
#define EP_KEYGATE 49
#define EP_AMOEBOID 50
#define EP_AMOEBALIVE 51
-#define EP_HAS_CONTENT 52
+#define EP_HAS_EDITOR_CONTENT 52
#define EP_CAN_TURN_EACH_MOVE 53
#define EP_CAN_GROW 54
#define EP_ACTIVE_BOMB 55
#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
-#define NUM_ELEMENT_PROPERTIES 88
+#define NUM_ELEMENT_PROPERTIES 89
#define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32)
#define EP_BITFIELD_BASE 0
#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 CE_SNAPPED_BY_PLAYER 33
#define CE_PLAYER_SNAPS_X 34
#define CE_MOVE_OF_X 35
+#define CE_DIGGING_X 36
+#define CE_CREATION_OF_X 37
-#define NUM_CHANGE_EVENTS 36
+#define NUM_CHANGE_EVENTS 38
#define CE_BITMASK_DEFAULT 0
#define MV_BIT_PREVIOUS 4
#define MV_BIT_TRIGGER 5
#define MV_BIT_TRIGGER_BACK 6
+#define MV_BIT_NORMAL MV_BIT_TRIGGER
+#define MV_BIT_REVERSE MV_BIT_TRIGGER_BACK
#define MV_PREVIOUS (1 << MV_BIT_PREVIOUS)
#define MV_TRIGGER (1 << MV_BIT_TRIGGER)
#define MV_TRIGGER_BACK (1 << MV_BIT_TRIGGER_BACK)
+#define MV_NORMAL (1 << MV_BIT_NORMAL)
+#define MV_REVERSE (1 << MV_BIT_REVERSE)
+
+/* values for move stepsize */
+#define STEPSIZE_NOT_MOVING 0
+#define STEPSIZE_VERY_SLOW 1
+#define STEPSIZE_SLOW 2
+#define STEPSIZE_NORMAL 4
+#define STEPSIZE_FAST 8
+#define STEPSIZE_VERY_FAST 16
+#define STEPSIZE_EVEN_FASTER 32
+#define STEPSIZE_SLOWER 50 /* (symbolic value only) */
+#define STEPSIZE_FASTER 200 /* (symbolic value only) */
+#define STEPSIZE_RESET 100 /* (symbolic value only) */
/* values for change side for custom elements */
#define CH_SIDE_NONE MV_NONE
#define CA_SET_PLAYER_ARTWORK 14
#define CA_SET_CE_SCORE 15
#define CA_SET_CE_VALUE 16
+#define CA_SET_ENGINE_SCAN_MODE 17
#define CA_HEADLINE_LEVEL_ACTIONS 250
#define CA_HEADLINE_PLAYER_ACTIONS 251
#define CA_HEADLINE_CE_ACTIONS 252
+#define CA_HEADLINE_ENGINE_ACTIONS 253
#define CA_UNDEFINED 255
/* values for change action mode for custom elements */
#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 + 0)
-#define CA_ARG_SPEED_VERY_SLOW (CA_ARG_SPEED + 1)
-#define CA_ARG_SPEED_SLOW (CA_ARG_SPEED + 2)
-#define CA_ARG_SPEED_NORMAL (CA_ARG_SPEED + 4)
-#define CA_ARG_SPEED_FAST (CA_ARG_SPEED + 8)
-#define CA_ARG_SPEED_VERY_FAST (CA_ARG_SPEED + 16)
-#define CA_ARG_SPEED_EVEN_FASTER (CA_ARG_SPEED + 32)
-#define CA_ARG_SPEED_SLOWER (CA_ARG_SPEED + 50)
-#define CA_ARG_SPEED_FASTER (CA_ARG_SPEED + 200)
-#define CA_ARG_SPEED_RESET (CA_ARG_SPEED + 100)
+#define CA_ARG_SPEED_NOT_MOVING (CA_ARG_SPEED + STEPSIZE_NOT_MOVING)
+#define CA_ARG_SPEED_VERY_SLOW (CA_ARG_SPEED + STEPSIZE_VERY_SLOW)
+#define CA_ARG_SPEED_SLOW (CA_ARG_SPEED + STEPSIZE_SLOW)
+#define CA_ARG_SPEED_NORMAL (CA_ARG_SPEED + STEPSIZE_NORMAL)
+#define CA_ARG_SPEED_FAST (CA_ARG_SPEED + STEPSIZE_FAST)
+#define CA_ARG_SPEED_VERY_FAST (CA_ARG_SPEED + STEPSIZE_VERY_FAST)
+#define CA_ARG_SPEED_EVEN_FASTER (CA_ARG_SPEED + STEPSIZE_EVEN_FASTER)
+#define CA_ARG_SPEED_SLOWER (CA_ARG_SPEED + STEPSIZE_SLOWER)
+#define CA_ARG_SPEED_FASTER (CA_ARG_SPEED + STEPSIZE_FASTER)
+#define CA_ARG_SPEED_RESET (CA_ARG_SPEED + STEPSIZE_RESET)
#define CA_ARG_SPEED_HEADLINE (CA_ARG_SPEED + 999)
#define CA_ARG_GRAVITY 14000
#define CA_ARG_GRAVITY_OFF (CA_ARG_GRAVITY + 0)
#define CA_ARG_SHIELD_NORMAL (CA_ARG_SHIELD + 1)
#define CA_ARG_SHIELD_DEADLY (CA_ARG_SHIELD + 2)
#define CA_ARG_SHIELD_HEADLINE (CA_ARG_SHIELD + 999)
-#define CA_ARG_UNDEFINED 19999
+#define CA_ARG_SCAN_MODE 17000
+#define CA_ARG_SCAN_MODE_NORMAL (CA_ARG_SCAN_MODE + MV_NORMAL)
+#define CA_ARG_SCAN_MODE_REVERSE (CA_ARG_SCAN_MODE + MV_REVERSE)
+#define CA_ARG_SCAN_MODE_HEADLINE (CA_ARG_SCAN_MODE + 999)
+#define CA_ARG_UNDEFINED 65535
/* values for custom move patterns (bits 0 - 3: basic move directions) */
#define MV_BIT_TOWARDS_PLAYER 4
#define IS_KEYGATE(e) HAS_PROPERTY(e, EP_KEYGATE)
#define IS_AMOEBOID(e) HAS_PROPERTY(e, EP_AMOEBOID)
#define IS_AMOEBALIVE(e) HAS_PROPERTY(e, EP_AMOEBALIVE)
-#define HAS_CONTENT(e) HAS_PROPERTY(e, EP_HAS_CONTENT)
+#define HAS_EDITOR_CONTENT(e) HAS_PROPERTY(e, EP_HAS_EDITOR_CONTENT)
#define CAN_TURN_EACH_MOVE(e) HAS_PROPERTY(e, EP_CAN_TURN_EACH_MOVE)
#define CAN_GROW(e) HAS_PROPERTY(e, EP_CAN_GROW)
#define IS_ACTIVE_BOMB(e) HAS_PROPERTY(e, EP_ACTIVE_BOMB)
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) \
#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
#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
+
#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))
#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 : \
#define EL_CASCADE_TOGGLE(e) (IS_EDITOR_CASCADE_INACTIVE(e) ? (e) + 1 : \
IS_EDITOR_CASCADE_ACTIVE(e) ? (e) - 1 : (e))
+#define EL_NAME(e) ((e) >= 0 ? element_info[e].token_name : "(?)")
/* 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 */
#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_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 MIN_ENVELOPE_XSIZE 1
#define MAX_CHANGE_PAGES 32
#define MIN_ELEMENTS_IN_GROUP 1
#define MAX_ELEMENTS_IN_GROUP 16
+#define MIN_ANDROID_ELEMENTS 1
+#define MAX_ANDROID_ELEMENTS 16
/* values for elements with content */
#define MIN_ELEMENT_CONTENTS 1
#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
#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
#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
#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 NUM_FILE_ELEMENTS 713
/* "real" (and therefore drawable) runtime elements */
#define EL_EMC_GATE_7_GRAY_ACTIVE (EL_FIRST_RUNTIME_REAL + 56)
#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)
/* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 59)
+#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)
#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)
#define EL_INTERNAL_CLIPBOARD_GROUP (EL_FIRST_INTERNAL + 2)
#define EL_INTERNAL_DUMMY (EL_FIRST_INTERNAL + 3)
-#define EL_INTERNAL_CASCADE_BD (EL_FIRST_INTERNAL + 4)
-#define EL_INTERNAL_CASCADE_BD_ACTIVE (EL_FIRST_INTERNAL + 5)
-#define EL_INTERNAL_CASCADE_EM (EL_FIRST_INTERNAL + 6)
-#define EL_INTERNAL_CASCADE_EM_ACTIVE (EL_FIRST_INTERNAL + 7)
-#define EL_INTERNAL_CASCADE_EMC (EL_FIRST_INTERNAL + 8)
-#define EL_INTERNAL_CASCADE_EMC_ACTIVE (EL_FIRST_INTERNAL + 9)
-#define EL_INTERNAL_CASCADE_RND (EL_FIRST_INTERNAL + 10)
-#define EL_INTERNAL_CASCADE_RND_ACTIVE (EL_FIRST_INTERNAL + 11)
-#define EL_INTERNAL_CASCADE_SB (EL_FIRST_INTERNAL + 12)
-#define EL_INTERNAL_CASCADE_SB_ACTIVE (EL_FIRST_INTERNAL + 13)
-#define EL_INTERNAL_CASCADE_SP (EL_FIRST_INTERNAL + 14)
-#define EL_INTERNAL_CASCADE_SP_ACTIVE (EL_FIRST_INTERNAL + 15)
-#define EL_INTERNAL_CASCADE_DC (EL_FIRST_INTERNAL + 16)
-#define EL_INTERNAL_CASCADE_DC_ACTIVE (EL_FIRST_INTERNAL + 17)
-#define EL_INTERNAL_CASCADE_DX (EL_FIRST_INTERNAL + 18)
-#define EL_INTERNAL_CASCADE_DX_ACTIVE (EL_FIRST_INTERNAL + 19)
-#define EL_INTERNAL_CASCADE_TEXT (EL_FIRST_INTERNAL + 20)
-#define EL_INTERNAL_CASCADE_TEXT_ACTIVE (EL_FIRST_INTERNAL + 21)
-#define EL_INTERNAL_CASCADE_CE (EL_FIRST_INTERNAL + 22)
-#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_DYNAMIC (EL_FIRST_INTERNAL + 30)
-#define EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE (EL_FIRST_INTERNAL + 31)
+#define EL_INTERNAL_CASCADE_BD (EL_FIRST_INTERNAL + 4)
+#define EL_INTERNAL_CASCADE_BD_ACTIVE (EL_FIRST_INTERNAL + 5)
+#define EL_INTERNAL_CASCADE_EM (EL_FIRST_INTERNAL + 6)
+#define EL_INTERNAL_CASCADE_EM_ACTIVE (EL_FIRST_INTERNAL + 7)
+#define EL_INTERNAL_CASCADE_EMC (EL_FIRST_INTERNAL + 8)
+#define EL_INTERNAL_CASCADE_EMC_ACTIVE (EL_FIRST_INTERNAL + 9)
+#define EL_INTERNAL_CASCADE_RND (EL_FIRST_INTERNAL + 10)
+#define EL_INTERNAL_CASCADE_RND_ACTIVE (EL_FIRST_INTERNAL + 11)
+#define EL_INTERNAL_CASCADE_SB (EL_FIRST_INTERNAL + 12)
+#define EL_INTERNAL_CASCADE_SB_ACTIVE (EL_FIRST_INTERNAL + 13)
+#define EL_INTERNAL_CASCADE_SP (EL_FIRST_INTERNAL + 14)
+#define EL_INTERNAL_CASCADE_SP_ACTIVE (EL_FIRST_INTERNAL + 15)
+#define EL_INTERNAL_CASCADE_DC (EL_FIRST_INTERNAL + 16)
+#define EL_INTERNAL_CASCADE_DC_ACTIVE (EL_FIRST_INTERNAL + 17)
+#define EL_INTERNAL_CASCADE_DX (EL_FIRST_INTERNAL + 18)
+#define EL_INTERNAL_CASCADE_DX_ACTIVE (EL_FIRST_INTERNAL + 19)
+#define EL_INTERNAL_CASCADE_CHARS (EL_FIRST_INTERNAL + 20)
+#define EL_INTERNAL_CASCADE_CHARS_ACTIVE (EL_FIRST_INTERNAL + 21)
+#define EL_INTERNAL_CASCADE_CE (EL_FIRST_INTERNAL + 22)
+#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_DYNAMIC (EL_FIRST_INTERNAL + 30)
+#define EL_INTERNAL_CASCADE_DYNAMIC_ACTIVE (EL_FIRST_INTERNAL + 31)
#define EL_INTERNAL_CLIPBOARD_START (EL_FIRST_INTERNAL + 0)
#define EL_INTERNAL_CLIPBOARD_END (EL_FIRST_INTERNAL + 2)
#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
#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) */
/* program information and versioning definitions */
-
-#define RELEASE_3_1_2 FALSE
-
-#if RELEASE_3_1_2
-#define PROGRAM_VERSION_MAJOR 3
-#define PROGRAM_VERSION_MINOR 1
-#define PROGRAM_VERSION_PATCH 2
-#define PROGRAM_VERSION_BUILD 0
-#else
-/* !!! make sure that packaging script can find unique version number !!! */
#define PROGRAM_VERSION_MAJOR 3
#define PROGRAM_VERSION_MINOR 2
#define PROGRAM_VERSION_PATCH 0
-#define PROGRAM_VERSION_BUILD 6
-#endif
+#define PROGRAM_VERSION_BUILD 8
#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 ICON_TITLE_STRING PROGRAM_TITLE_STRING
#define COOKIE_PREFIX "ROCKSNDIAMONDS"
struct DoorInfo
{
+ int width;
+ int height;
int step_offset;
int step_delay;
int anim_mode;
int e[3][3];
};
-struct PlayerInfo
-{
- 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;
-
- 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;
-};
-
struct LevelSetInfo
{
int music[MAX_LEVELS];
int start_element[MAX_PLAYERS];
boolean use_start_element[MAX_PLAYERS];
+ int artwork_element[MAX_PLAYERS];
+ boolean use_artwork_element[MAX_PLAYERS];
+
+ int explosion_element[MAX_PLAYERS];
+ boolean use_explosion_element[MAX_PLAYERS];
+
#if 1
/* values for the new EMC elements */
int android_move_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 */
- boolean double_speed;
+ int initial_player_stepsize; /* initial player speed */
+
boolean initial_gravity;
boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */
boolean use_spring_bug; /* for compatibility with old levels */
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 */
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;
-
- /* 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;
-#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;
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 */
/* ---------- 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];
/* ---------- 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 */
extern short Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern boolean Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern boolean Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short ChangeCount[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
extern short WasJustFalling[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];
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;