X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=55b70f76d5d5d28604479014b03ea0a10fe0175b;hb=d4b0925a000fb490f5ade0feecdd4781fc8d0bd5;hp=929b37f57a2e9bfff2ed22408367324644a6dd75;hpb=63f41483ea7866802a7f6382c1d1b7135a1cd86a;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index 929b37f5..55b70f76 100644 --- a/src/main.h +++ b/src/main.h @@ -115,7 +115,7 @@ #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 @@ -150,19 +150,20 @@ #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 @@ -214,8 +215,10 @@ #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 @@ -249,10 +252,26 @@ #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 @@ -302,10 +321,12 @@ #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 */ @@ -356,18 +377,24 @@ #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 + 998) +#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 + 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) @@ -388,7 +415,11 @@ #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 @@ -509,7 +540,7 @@ #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) @@ -540,6 +571,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) \ @@ -638,6 +671,15 @@ #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)) @@ -647,6 +689,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 : \ @@ -702,6 +746,7 @@ #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) /* fundamental game speed values */ #define ONE_SECOND_DELAY 1000 /* delay value for one second */ @@ -733,6 +778,8 @@ #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 @@ -1154,6 +1201,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 @@ -1163,8 +1211,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 @@ -1204,7 +1251,9 @@ #define EL_EMC_FAKE_ACID 703 #define EL_EMC_DRIPPER 704 -#define NUM_FILE_ELEMENTS 705 +#define EL_TRIGGER_CE_VALUE 705 + +#define NUM_FILE_ELEMENTS 706 /* "real" (and therefore drawable) runtime elements */ @@ -1269,9 +1318,10 @@ #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) @@ -1292,9 +1342,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) @@ -1599,21 +1653,10 @@ /* 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 7 #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" @@ -1703,6 +1746,8 @@ struct MenuInfo struct DoorInfo { + int width; + int height; int step_offset; int step_delay; int anim_mode; @@ -1908,13 +1953,18 @@ struct LevelInfo 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 */ @@ -1993,6 +2043,7 @@ struct GameInfo 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; @@ -2012,6 +2063,8 @@ struct GameInfo /* 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) */ @@ -2132,11 +2185,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]; @@ -2369,7 +2422,7 @@ extern short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; 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 short 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];