X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=9739a87cbb032590ee8ded85d20107f2b36c7a12;hb=5e616edfe5f101927d2ff3f7a14d2c65897de3cc;hp=fbd741c32c84d2111585755e2ed21ad810f326f4;hpb=ad8306cba93c058f00e21871a290302ce728d6b8;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index fbd741c3..9739a87c 100644 --- a/src/main.h +++ b/src/main.h @@ -156,7 +156,7 @@ (PROPERTY_VAR(e,p) &= ~PROPERTY_BIT(p))) -/* values for change events for custom elements */ +/* values for change events for custom elements (stored in level file) */ #define CE_DELAY 0 #define CE_TOUCHED_BY_PLAYER 1 #define CE_PRESSED_BY_PLAYER 2 @@ -173,26 +173,45 @@ #define CE_OTHER_GETS_PUSHED 13 #define CE_OTHER_GETS_COLLECTED 14 #define CE_OTHER_GETS_DROPPED 15 +#define CE_BY_PLAYER 16 /* obsolete; now CE_BY_DIRECT_ACTION */ +#define CE_BY_COLLISION 17 /* obsolete; now CE_BY_DIRECT_ACTION */ +#define CE_BY_OTHER_ACTION 18 /* activates other element events */ +#define CE_BY_DIRECT_ACTION 19 /* activates direct element events */ +#define CE_OTHER_GETS_DIGGED 20 +#define CE_ENTERED_BY_PLAYER 21 +#define CE_LEFT_BY_PLAYER 22 +#define CE_OTHER_GETS_ENTERED 23 +#define CE_OTHER_GETS_LEFT 24 -/* values for internal purpose only (level editor) */ -#define CE_BY_PLAYER 16 -#define CE_BY_COLLISION 17 -#define CE_BY_OTHER 18 +/* values for derived change events (determined from properties above) */ +#define CE_TOUCHING_SOME_SIDE 25 /* summarized left/right/up/down/any */ -#define NUM_CHANGE_EVENTS 19 +#define NUM_CHANGE_EVENTS 26 #define CE_BITMASK_DEFAULT 0 #define CH_EVENT_BIT(c) (1 << (c)) -#define CH_EVENT_VAR(e) (element_info[e].change.events) +#define CH_EVENT_VAR(e) (element_info[e].change->events) +#define CH_ANY_EVENT_VAR(e) (element_info[e].change_events) #define HAS_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \ (CH_EVENT_VAR(e) & CH_EVENT_BIT(c)) != 0) +#define HAS_ANY_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) && \ + (CH_ANY_EVENT_VAR(e) & CH_EVENT_BIT(c)) != 0) #define SET_CHANGE_EVENT(e,c,v) (IS_CUSTOM_ELEMENT(e) ? \ ((v) ? \ (CH_EVENT_VAR(e) |= CH_EVENT_BIT(c)) : \ (CH_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0) +/* values for change sides for custom elements */ +#define CH_SIDE_LEFT MV_LEFT +#define CH_SIDE_RIGHT MV_RIGHT +#define CH_SIDE_TOP MV_UP +#define CH_SIDE_BOTTOM MV_DOWN +#define CH_SIDE_LEFT_RIGHT MV_HORIZONTAL +#define CH_SIDE_TOP_BOTTOM MV_VERTICAL +#define CH_SIDE_ANY MV_ANY_DIRECTION + /* values for change power for custom elements */ #define CP_NON_DESTRUCTIVE 0 #define CP_HALF_DESTRUCTIVE 1 @@ -304,6 +323,9 @@ #define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \ (e) <= EL_CUSTOM_END) +#define IS_ENVELOPE(e) ((e) >= EL_ENVELOPE_1 && \ + (e) <= EL_ENVELOPE_4) + #define GFX_ELEMENT(e) (element_info[e].use_gfx_element ? \ element_info[e].gfx_element : e) @@ -352,14 +374,28 @@ #define IS_LOOP_SOUND(s) (sound_info[s].loop) +/* fundamental game speed values */ +#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) +#define MICROLEVEL_SCROLL_DELAY 50 /* delay for scrolling micro level */ +#define MICROLEVEL_LABEL_DELAY 250 /* delay for micro level label */ + /* boundaries of arrays etc. */ #define MAX_LEVEL_NAME_LEN 32 #define MAX_LEVEL_AUTHOR_LEN 32 #define MAX_ELEMENT_NAME_LEN 32 -#define MAX_TAPELEN (1000 * 50) /* max. time * framerate */ +#define MAX_TAPELEN (1000 * FRAMES_PER_SECOND) /* max.time x fps */ #define MAX_SCORE_ENTRIES 100 #define MAX_NUM_AMOEBA 100 #define MAX_INVENTORY_SIZE 1000 +#define MIN_ENVELOPE_XSIZE 1 +#define MIN_ENVELOPE_YSIZE 1 +#define MAX_ENVELOPE_XSIZE 30 +#define MAX_ENVELOPE_YSIZE 20 +#define MAX_ENVELOPE_TEXT_LEN (MAX_ENVELOPE_XSIZE * MAX_ENVELOPE_YSIZE) +#define MIN_CHANGE_PAGES 1 +#define MAX_CHANGE_PAGES 16 /* values for elements with content */ #define MIN_ELEMENT_CONTENTS 1 @@ -368,13 +404,6 @@ #define LEVEL_SCORE_ELEMENTS 16 /* level elements with score */ -/* fundamental game speed values */ -#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) -#define MICROLEVEL_SCROLL_DELAY 50 /* delay for scrolling micro level */ -#define MICROLEVEL_LABEL_DELAY 250 /* delay for micro level label */ - /* often used screen positions */ #define SX 8 #define SY 8 @@ -422,10 +451,10 @@ #define EL_WALL 2 #define EL_WALL_SLIPPERY 3 #define EL_ROCK 4 -#define EL_KEY_OBSOLETE 5 /* obsolete; mapped to EL_KEY_1 */ +#define EL_KEY_OBSOLETE 5 /* obsolete; now EL_KEY_1 */ #define EL_EMERALD 6 #define EL_EXIT_CLOSED 7 -#define EL_PLAYER_OBSOLETE 8 /* obsolete; mapped to EL_PLAYER_1 */ +#define EL_PLAYER_OBSOLETE 8 /* obsolete; now EL_PLAYER_1 */ #define EL_BUG 9 #define EL_SPACESHIP 10 #define EL_YAMYAM 11 @@ -547,7 +576,7 @@ #define EL_PIG 117 #define EL_DRAGON 118 -#define EL_EM_KEY_1_FILE 119 +#define EL_EM_KEY_1_FILE_OBSOLETE 119 /* obsolete; now EL_EM_KEY_1 */ #define EL_CHAR_START 120 #define EL_CHAR_ASCII0 (EL_CHAR_START - 32) @@ -569,9 +598,9 @@ #define EL_EM_GATE_3 205 #define EL_EM_GATE_4 206 -#define EL_EM_KEY_2_FILE 207 -#define EL_EM_KEY_3_FILE 208 -#define EL_EM_KEY_4_FILE 209 +#define EL_EM_KEY_2_FILE_OBSOLETE 207 /* obsolete; now EL_EM_KEY_2 */ +#define EL_EM_KEY_3_FILE_OBSOLETE 208 /* obsolete; now EL_EM_KEY_3 */ +#define EL_EM_KEY_4_FILE_OBSOLETE 209 /* obsolete; now EL_EM_KEY_4 */ #define EL_SP_START 210 #define EL_SP_EMPTY_SPACE (EL_SP_START + 0) @@ -667,7 +696,7 @@ #define EL_CONVEYOR_BELT_4_SWITCH_MIDDLE 293 #define EL_CONVEYOR_BELT_4_SWITCH_RIGHT 294 #define EL_LANDMINE 295 -#define EL_ENVELOPE 296 +#define EL_ENVELOPE_OBSOLETE 296 /* obsolete; now EL_ENVELOPE_1 */ #define EL_LIGHT_SWITCH 297 #define EL_LIGHT_SWITCH_ACTIVE 298 #define EL_SIGN_EXCLAMATION 299 @@ -738,68 +767,76 @@ #define EL_UNUSED_358 358 #define EL_UNUSED_359 359 +/* ---------- begin of custom elements section ----------------------------- */ #define EL_CUSTOM_START 360 #include "conf_cus.h" /* include auto-generated data structure definitions */ #define NUM_CUSTOM_ELEMENTS 256 +#define EL_CUSTOM_END 615 +/* ---------- end of custom elements section ------------------------------- */ + +#define EL_EM_KEY_1 616 +#define EL_EM_KEY_2 617 +#define EL_EM_KEY_3 618 +#define EL_EM_KEY_4 619 +#define EL_ENVELOPE_1 620 +#define EL_ENVELOPE_2 621 +#define EL_ENVELOPE_3 622 +#define EL_ENVELOPE_4 623 -#define EL_CUSTOM_END (EL_CUSTOM_START + NUM_CUSTOM_ELEMENTS - 1) -#define NUM_FILE_ELEMENTS (EL_CUSTOM_START + NUM_CUSTOM_ELEMENTS) +#define NUM_FILE_ELEMENTS 624 /* "real" (and therefore drawable) runtime elements */ #define EL_FIRST_RUNTIME_REAL NUM_FILE_ELEMENTS -#define EL_EM_KEY_1 (EL_FIRST_RUNTIME_REAL + 0) -#define EL_EM_KEY_2 (EL_FIRST_RUNTIME_REAL + 1) -#define EL_EM_KEY_3 (EL_FIRST_RUNTIME_REAL + 2) -#define EL_EM_KEY_4 (EL_FIRST_RUNTIME_REAL + 3) -#define EL_DYNABOMB_PLAYER_1_ACTIVE (EL_FIRST_RUNTIME_REAL + 4) -#define EL_DYNABOMB_PLAYER_2_ACTIVE (EL_FIRST_RUNTIME_REAL + 5) -#define EL_DYNABOMB_PLAYER_3_ACTIVE (EL_FIRST_RUNTIME_REAL + 6) -#define EL_DYNABOMB_PLAYER_4_ACTIVE (EL_FIRST_RUNTIME_REAL + 7) -#define EL_SP_DISK_RED_ACTIVE (EL_FIRST_RUNTIME_REAL + 8) -#define EL_SWITCHGATE_OPENING (EL_FIRST_RUNTIME_REAL + 9) -#define EL_SWITCHGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 10) -#define EL_TIMEGATE_OPENING (EL_FIRST_RUNTIME_REAL + 11) -#define EL_TIMEGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 12) -#define EL_PEARL_BREAKING (EL_FIRST_RUNTIME_REAL + 13) -#define EL_TRAP_ACTIVE (EL_FIRST_RUNTIME_REAL + 14) -#define EL_INVISIBLE_STEELWALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 15) -#define EL_INVISIBLE_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 16) -#define EL_INVISIBLE_SAND_ACTIVE (EL_FIRST_RUNTIME_REAL + 17) -#define EL_CONVEYOR_BELT_1_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 18) -#define EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 19) -#define EL_CONVEYOR_BELT_1_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 20) -#define EL_CONVEYOR_BELT_2_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 21) -#define EL_CONVEYOR_BELT_2_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 22) -#define EL_CONVEYOR_BELT_2_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 23) -#define EL_CONVEYOR_BELT_3_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 24) -#define EL_CONVEYOR_BELT_3_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 25) -#define EL_CONVEYOR_BELT_3_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 26) -#define EL_CONVEYOR_BELT_4_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 27) -#define EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 28) -#define EL_CONVEYOR_BELT_4_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 29) -#define EL_EXIT_OPENING (EL_FIRST_RUNTIME_REAL + 30) -#define EL_SP_EXIT_OPEN (EL_FIRST_RUNTIME_REAL + 31) -#define EL_SP_TERMINAL_ACTIVE (EL_FIRST_RUNTIME_REAL + 32) -#define EL_SP_BUGGY_BASE_ACTIVATING (EL_FIRST_RUNTIME_REAL + 33) -#define EL_SP_BUGGY_BASE_ACTIVE (EL_FIRST_RUNTIME_REAL + 34) -#define EL_SP_MURPHY_CLONE (EL_FIRST_RUNTIME_REAL + 35) -#define EL_AMOEBA_DROPPING (EL_FIRST_RUNTIME_REAL + 36) -#define EL_QUICKSAND_EMPTYING (EL_FIRST_RUNTIME_REAL + 37) -#define EL_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 38) -#define EL_BD_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 39) -#define EL_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 40) -#define EL_BD_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 41) -#define EL_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 42) -#define EL_BD_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 43) -#define EL_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 44) -#define EL_BD_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 45) +#define EL_DYNABOMB_PLAYER_1_ACTIVE (EL_FIRST_RUNTIME_REAL + 0) +#define EL_DYNABOMB_PLAYER_2_ACTIVE (EL_FIRST_RUNTIME_REAL + 1) +#define EL_DYNABOMB_PLAYER_3_ACTIVE (EL_FIRST_RUNTIME_REAL + 2) +#define EL_DYNABOMB_PLAYER_4_ACTIVE (EL_FIRST_RUNTIME_REAL + 3) +#define EL_SP_DISK_RED_ACTIVE (EL_FIRST_RUNTIME_REAL + 4) +#define EL_SWITCHGATE_OPENING (EL_FIRST_RUNTIME_REAL + 5) +#define EL_SWITCHGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 6) +#define EL_TIMEGATE_OPENING (EL_FIRST_RUNTIME_REAL + 7) +#define EL_TIMEGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 8) +#define EL_PEARL_BREAKING (EL_FIRST_RUNTIME_REAL + 9) +#define EL_TRAP_ACTIVE (EL_FIRST_RUNTIME_REAL + 10) +#define EL_INVISIBLE_STEELWALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 11) +#define EL_INVISIBLE_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 12) +#define EL_INVISIBLE_SAND_ACTIVE (EL_FIRST_RUNTIME_REAL + 13) +#define EL_CONVEYOR_BELT_1_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 14) +#define EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 15) +#define EL_CONVEYOR_BELT_1_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 16) +#define EL_CONVEYOR_BELT_2_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 17) +#define EL_CONVEYOR_BELT_2_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 18) +#define EL_CONVEYOR_BELT_2_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 19) +#define EL_CONVEYOR_BELT_3_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 20) +#define EL_CONVEYOR_BELT_3_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 21) +#define EL_CONVEYOR_BELT_3_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 22) +#define EL_CONVEYOR_BELT_4_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 23) +#define EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 24) +#define EL_CONVEYOR_BELT_4_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 25) +#define EL_EXIT_OPENING (EL_FIRST_RUNTIME_REAL + 26) +#define EL_EXIT_CLOSING (EL_FIRST_RUNTIME_REAL + 27) +#define EL_SP_EXIT_OPEN (EL_FIRST_RUNTIME_REAL + 28) +#define EL_SP_TERMINAL_ACTIVE (EL_FIRST_RUNTIME_REAL + 29) +#define EL_SP_BUGGY_BASE_ACTIVATING (EL_FIRST_RUNTIME_REAL + 30) +#define EL_SP_BUGGY_BASE_ACTIVE (EL_FIRST_RUNTIME_REAL + 31) +#define EL_SP_MURPHY_CLONE (EL_FIRST_RUNTIME_REAL + 32) +#define EL_AMOEBA_DROPPING (EL_FIRST_RUNTIME_REAL + 33) +#define EL_QUICKSAND_EMPTYING (EL_FIRST_RUNTIME_REAL + 34) +#define EL_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 35) +#define EL_BD_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 36) +#define EL_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 37) +#define EL_BD_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 38) +#define EL_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 39) +#define EL_BD_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 40) +#define EL_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 41) +#define EL_BD_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 42) /* "unreal" (and therefore not drawable) runtime elements */ -#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 46) +#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 43) #define EL_BLOCKED (EL_FIRST_RUNTIME_UNREAL + 0) #define EL_EXPLOSION (EL_FIRST_RUNTIME_UNREAL + 1) @@ -885,11 +922,12 @@ #define GFX_SPECIAL_ARG_EDITOR 3 #define GFX_SPECIAL_ARG_INFO 4 #define GFX_SPECIAL_ARG_SETUP 5 -#define GFX_SPECIAL_ARG_DOOR 6 -#define GFX_SPECIAL_ARG_PREVIEW 7 -#define GFX_SPECIAL_ARG_CRUMBLED 8 +#define GFX_SPECIAL_ARG_PLAYING 6 +#define GFX_SPECIAL_ARG_DOOR 7 +#define GFX_SPECIAL_ARG_PREVIEW 8 +#define GFX_SPECIAL_ARG_CRUMBLED 9 -#define NUM_SPECIAL_GFX_ARGS 9 +#define NUM_SPECIAL_GFX_ARGS 10 /* values for image configuration suffixes */ @@ -911,15 +949,17 @@ #define GFX_ARG_GLOBAL_SYNC 15 #define GFX_ARG_CRUMBLED_LIKE 16 #define GFX_ARG_DIGGABLE_LIKE 17 -#define GFX_ARG_STEP_OFFSET 18 -#define GFX_ARG_STEP_DELAY 19 -#define GFX_ARG_DIRECTION 20 -#define GFX_ARG_POSITION 21 -#define GFX_ARG_DRAW_XOFFSET 22 -#define GFX_ARG_DRAW_YOFFSET 23 -#define GFX_ARG_NAME 24 +#define GFX_ARG_BORDER_SIZE 18 +#define GFX_ARG_STEP_OFFSET 19 +#define GFX_ARG_STEP_DELAY 20 +#define GFX_ARG_DIRECTION 21 +#define GFX_ARG_POSITION 22 +#define GFX_ARG_DRAW_XOFFSET 23 +#define GFX_ARG_DRAW_YOFFSET 24 +#define GFX_ARG_DRAW_MASKED 25 +#define GFX_ARG_NAME 26 -#define NUM_GFX_ARGS 25 +#define NUM_GFX_ARGS 27 /* values for sound configuration suffixes */ @@ -969,20 +1009,20 @@ #define GAME_MODE_EDITOR 3 #define GAME_MODE_INFO 4 #define GAME_MODE_SETUP 5 -#define GAME_MODE_PSEUDO_DOOR 6 -#define GAME_MODE_PSEUDO_PREVIEW 7 -#define GAME_MODE_PSEUDO_CRUMBLED 8 +#define GAME_MODE_PLAYING 6 +#define GAME_MODE_PSEUDO_DOOR 7 +#define GAME_MODE_PSEUDO_PREVIEW 8 +#define GAME_MODE_PSEUDO_CRUMBLED 9 /* there are no special config file suffixes for these modes */ -#define GAME_MODE_PLAYING 9 #define GAME_MODE_PSEUDO_TYPENAME 10 #define GAME_MODE_QUIT 11 #define PROGRAM_VERSION_MAJOR 3 #define PROGRAM_VERSION_MINOR 0 -#define PROGRAM_VERSION_PATCH 0 +#define PROGRAM_VERSION_PATCH 5 #define PROGRAM_VERSION_RELEASE 0 -#define PROGRAM_VERSION_STRING "3.0.0" +#define PROGRAM_VERSION_STRING "3.0.5" #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" @@ -1040,6 +1080,31 @@ #define EMU_SOKOBAN 2 #define EMU_SUPAPLEX 3 +struct MenuInfo +{ + int draw_xoffset_default; + int draw_yoffset_default; + int draw_xoffset[NUM_SPECIAL_GFX_ARGS]; + int draw_yoffset[NUM_SPECIAL_GFX_ARGS]; + + int scrollbar_xoffset; + + int list_size_default; + int list_size[NUM_SPECIAL_GFX_ARGS]; +}; + +struct DoorInfo +{ + int step_offset; + int step_delay; + int anim_mode; +}; + +struct EnvelopeInfo +{ + int anim_mode; +}; + struct HiScore { char Name[MAX_PLAYER_NAME_LEN + 1]; @@ -1081,6 +1146,8 @@ struct PlayerInfo boolean is_digging; boolean is_collecting; + int show_envelope; + unsigned long move_delay; int move_delay_value; @@ -1112,12 +1179,13 @@ struct LevelInfo boolean encoding_16bit_yamyam; /* yamyam contains 16-bit elements */ boolean encoding_16bit_amoeba; /* amoeba contains 16-bit elements */ - int fieldx; - int fieldy; + int fieldx, fieldy; int time; int gems_needed; 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]; int score[LEVEL_SCORE_ELEMENTS]; int yamyam_content[MAX_ELEMENT_CONTENTS][3][3]; int num_yamyam_contents; @@ -1135,7 +1203,7 @@ struct LevelInfo boolean use_custom_template; /* use custom properties from template file */ - boolean no_level_file; + boolean no_level_file; /* set for currently undefined levels */ }; struct TapeInfo @@ -1179,6 +1247,8 @@ struct GameInfo int initial_move_delay; int initial_move_delay_value; + struct EnvelopeInfo envelope; + /* variable within running game */ int yamyam_content_nr; boolean magic_wall_active; @@ -1204,28 +1274,12 @@ struct GlobalInfo int fps_slowdown_factor; }; -struct MenuInfo -{ - int draw_xoffset_default; - int draw_yoffset_default; - int draw_xoffset[NUM_SPECIAL_GFX_ARGS]; - int draw_yoffset[NUM_SPECIAL_GFX_ARGS]; - - int scrollbar_xoffset; - - int list_size_default; - int list_size[NUM_SPECIAL_GFX_ARGS]; -}; - -struct DoorInfo -{ - int step_offset; - int step_delay; -}; - struct ElementChangeInfo { - unsigned long events; /* bitfield for change events */ + boolean can_change; /* use or ignore this change info */ + + unsigned long events; /* change events */ + int sides; /* change sides */ short target_element; /* target element after change */ @@ -1249,6 +1303,11 @@ struct ElementChangeInfo void (*pre_change_function)(int x, int y); void (*change_function)(int x, int y); void (*post_change_function)(int x, int y); + + /* ---------- internal values used in level editor ---------- */ + + int direct_action; /* change triggered by actions on element */ + int other_action; /* change triggered by other element actions */ }; struct ElementInfo @@ -1297,7 +1356,18 @@ struct ElementInfo int content[3][3]; /* new elements after explosion */ - struct ElementChangeInfo change; + struct ElementChangeInfo *change_page; /* actual list of change pages */ + struct ElementChangeInfo *change; /* pointer to current change page */ + + int num_change_pages; /* actual number of change pages */ + int current_change_page; /* currently edited change page */ + + /* ---------- internal values used at runtime when playing ---------- */ + + unsigned long change_events; /* bitfield for combined change events */ + + int event_page_nr[NUM_CHANGE_EVENTS]; /* page number for each event */ + struct ElementChangeInfo *event_page[NUM_CHANGE_EVENTS]; /* page for event */ /* ---------- internal values used in level editor ---------- */ @@ -1307,9 +1377,6 @@ struct ElementInfo int smash_targets; /* can smash player/enemies/everything */ int deadliness; /* deadly when running/colliding/touching */ int consistency; /* indestructible/can explode */ - int change_player_action; /* touched/pressed/pushed by player */ - int change_collide_action; /* collision/impact/smashed */ - int change_other_action; /* various change actions */ boolean can_explode_by_fire; /* element explodes by fire */ boolean can_explode_smashed; /* element explodes when smashed */ @@ -1343,12 +1410,15 @@ struct GraphicInfo 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 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_masked; /* optional setting for drawing envelope gfx */ + #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 */ @@ -1409,7 +1479,8 @@ 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 boolean Changing[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern unsigned long Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern unsigned long ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short AmoebaCnt[MAX_NUM_AMOEBA];