X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fmain.h;h=68ad89ca303d0a240c3c656f0e3d25204e26c355;hb=c42450df0ac6ff7b6db97bf0df12b9c73055c727;hp=040412fda890087f1c5db67e8331263e2632be04;hpb=e946a4f25cf18a083043d05beca2887ad16d7b53;p=rocksndiamonds.git diff --git a/src/main.h b/src/main.h index 040412fd..68ad89ca 100644 --- a/src/main.h +++ b/src/main.h @@ -27,12 +27,13 @@ #include "libgame/libgame.h" -#include "conf_gfx.h" -#include "conf_snd.h" +#include "conf_gfx.h" /* include auto-generated data structure definitions */ +#include "conf_snd.h" /* include auto-generated data structure definitions */ #define IMG_UNDEFINED (-1) #define IMG_EMPTY IMG_EMPTY_SPACE #define IMG_SP_EMPTY IMG_SP_EMPTY_SPACE +#define IMG_EXPLOSION IMG_DEFAULT_EXPLODING #define IMG_CHAR_START IMG_CHAR_SPACE #define IMG_CUSTOM_START IMG_CUSTOM_1 @@ -60,85 +61,254 @@ #define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2) #define IN_LEV_FIELD(x,y) ((x)>=0 && (x)=0 &&(y)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 power for custom elements */ +#define CP_NON_DESTRUCTIVE 0 +#define CP_HALF_DESTRUCTIVE 1 +#define CP_FULL_DESTRUCTIVE 2 + +/* values for special move patterns (bits 0-3: basic move directions) */ +#define MV_BIT_TOWARDS_PLAYER 4 +#define MV_BIT_AWAY_FROM_PLAYER 5 +#define MV_BIT_ALONG_LEFT_SIDE 6 +#define MV_BIT_ALONG_RIGHT_SIDE 7 +#define MV_BIT_TURNING_LEFT 8 +#define MV_BIT_TURNING_RIGHT 9 + +/* values for special move patterns for custom elements */ +#define MV_HORIZONTAL (MV_LEFT | MV_RIGHT) +#define MV_VERTICAL (MV_UP | MV_DOWN) +#define MV_ALL_DIRECTIONS (MV_HORIZONTAL | MV_VERTICAL) +#define MV_ANY_DIRECTION (MV_ALL_DIRECTIONS) +#define MV_TOWARDS_PLAYER (1 << MV_BIT_TOWARDS_PLAYER) +#define MV_AWAY_FROM_PLAYER (1 << MV_BIT_AWAY_FROM_PLAYER) +#define MV_ALONG_LEFT_SIDE (1 << MV_BIT_ALONG_LEFT_SIDE) +#define MV_ALONG_RIGHT_SIDE (1 << MV_BIT_ALONG_RIGHT_SIDE) +#define MV_TURNING_LEFT (1 << MV_BIT_TURNING_LEFT) +#define MV_TURNING_RIGHT (1 << MV_BIT_TURNING_RIGHT) + +/* values for slippery property for custom elements */ +#define SLIPPERY_ANY_RANDOM 0 +#define SLIPPERY_ANY_LEFT_RIGHT 1 +#define SLIPPERY_ANY_RIGHT_LEFT 2 +#define SLIPPERY_ONLY_LEFT 3 +#define SLIPPERY_ONLY_RIGHT 4 + +/* macros for configurable properties */ +#define IS_DIGGABLE(e) HAS_PROPERTY(e, EP_DIGGABLE) +#define IS_COLLECTIBLE_ONLY(e) HAS_PROPERTY(e, EP_COLLECTIBLE_ONLY) +#define DONT_RUN_INTO(e) HAS_PROPERTY(e, EP_DONT_RUN_INTO) +#define DONT_COLLIDE_WITH(e) HAS_PROPERTY(e, EP_DONT_COLLIDE_WITH) +#define DONT_TOUCH(e) HAS_PROPERTY(e, EP_DONT_TOUCH) +#define IS_INDESTRUCTIBLE(e) HAS_PROPERTY(e, EP_INDESTRUCTIBLE) +#define IS_SLIPPERY(e) HAS_PROPERTY(e, EP_SLIPPERY) +#define CAN_CHANGE(e) HAS_PROPERTY(e, EP_CAN_CHANGE) +#define CAN_MOVE(e) HAS_PROPERTY(e, EP_CAN_MOVE) +#define CAN_FALL(e) HAS_PROPERTY(e, EP_CAN_FALL) +#define CAN_SMASH_PLAYER(e) HAS_PROPERTY(e, EP_CAN_SMASH_PLAYER) +#define CAN_SMASH_ENEMIES(e) HAS_PROPERTY(e, EP_CAN_SMASH_ENEMIES) +#define CAN_SMASH_EVERYTHING(e) HAS_PROPERTY(e, EP_CAN_SMASH_EVERYTHING) +#define CAN_EXPLODE_BY_FIRE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_FIRE) +#define CAN_EXPLODE_SMASHED(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_SMASHED) +#define CAN_EXPLODE_IMPACT(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_IMPACT) +#define IS_WALKABLE_OVER(e) HAS_PROPERTY(e, EP_WALKABLE_OVER) +#define IS_WALKABLE_INSIDE(e) HAS_PROPERTY(e, EP_WALKABLE_INSIDE) +#define IS_WALKABLE_UNDER(e) HAS_PROPERTY(e, EP_WALKABLE_UNDER) +#define IS_PASSABLE_OVER(e) HAS_PROPERTY(e, EP_PASSABLE_OVER) +#define IS_PASSABLE_INSIDE(e) HAS_PROPERTY(e, EP_PASSABLE_INSIDE) +#define IS_PASSABLE_UNDER(e) HAS_PROPERTY(e, EP_PASSABLE_UNDER) +#define IS_DROPPABLE(e) HAS_PROPERTY(e, EP_DROPPABLE) +#define CAN_EXPLODE_1X1(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_1X1) +#define IS_PUSHABLE(e) HAS_PROPERTY(e, EP_PUSHABLE) + +/* macros for special configurable properties */ +#define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL) + +/* macros for special graphics properties */ +#define CAN_BE_CRUMBLED(e) HAS_PROPERTY(GFX_ELEMENT(e),EP_CAN_BE_CRUMBLED) + +/* macros for pre-defined properties */ +#define ELEM_IS_PLAYER(e) HAS_PROPERTY(e, EP_PLAYER) +#define CAN_PASS_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_MAGIC_WALL) +#define IS_SWITCHABLE(e) HAS_PROPERTY(e, EP_SWITCHABLE) +#define IS_BD_ELEMENT(e) HAS_PROPERTY(e, EP_BD_ELEMENT) +#define IS_SP_ELEMENT(e) HAS_PROPERTY(e, EP_SP_ELEMENT) +#define IS_SB_ELEMENT(e) HAS_PROPERTY(e, EP_SB_ELEMENT) +#define IS_GEM(e) HAS_PROPERTY(e, EP_GEM) +#define IS_FOOD_DARK_YAMYAM(e) HAS_PROPERTY(e, EP_FOOD_DARK_YAMYAM) +#define IS_FOOD_PENGUIN(e) HAS_PROPERTY(e, EP_FOOD_PENGUIN) +#define IS_FOOD_PIG(e) HAS_PROPERTY(e, EP_FOOD_PIG) +#define IS_HISTORIC_WALL(e) HAS_PROPERTY(e, EP_HISTORIC_WALL) +#define IS_HISTORIC_SOLID(e) HAS_PROPERTY(e, EP_HISTORIC_SOLID) +#define IS_CLASSIC_ENEMY(e) HAS_PROPERTY(e, EP_CLASSIC_ENEMY) +#define IS_BELT(e) HAS_PROPERTY(e, EP_BELT) +#define IS_BELT_ACTIVE(e) HAS_PROPERTY(e, EP_BELT_ACTIVE) +#define IS_BELT_SWITCH(e) HAS_PROPERTY(e, EP_BELT_SWITCH) +#define IS_TUBE(e) HAS_PROPERTY(e, EP_TUBE) +#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 IS_ACTIVE_BOMB(e) HAS_PROPERTY(e, EP_ACTIVE_BOMB) +#define IS_INACTIVE(e) HAS_PROPERTY(e, EP_INACTIVE) + +/* macros for derived properties */ +#define IS_ACCESSIBLE_OVER(e) HAS_PROPERTY(e, EP_ACCESSIBLE_OVER) +#define IS_ACCESSIBLE_INSIDE(e) HAS_PROPERTY(e, EP_ACCESSIBLE_INSIDE) +#define IS_ACCESSIBLE_UNDER(e) HAS_PROPERTY(e, EP_ACCESSIBLE_UNDER) +#define IS_WALKABLE(e) HAS_PROPERTY(e, EP_WALKABLE) +#define IS_PASSABLE(e) HAS_PROPERTY(e, EP_PASSABLE) +#define IS_ACCESSIBLE(e) HAS_PROPERTY(e, EP_ACCESSIBLE) +#define IS_COLLECTIBLE(e) HAS_PROPERTY(e, EP_COLLECTIBLE) +#define IS_SNAPPABLE(e) HAS_PROPERTY(e, EP_SNAPPABLE) +#define IS_WALL(e) HAS_PROPERTY(e, EP_WALL) +#define IS_SOLID_FOR_PUSHING(e) HAS_PROPERTY(e, EP_SOLID_FOR_PUSHING) +#define IS_DRAGONFIRE_PROOF(e) HAS_PROPERTY(e, EP_DRAGONFIRE_PROOF) +#define IS_EXPLOSION_PROOF(e) HAS_PROPERTY(e, EP_EXPLOSION_PROOF) +#define CAN_SMASH(e) HAS_PROPERTY(e, EP_CAN_SMASH) +#define CAN_EXPLODE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE) +#define CAN_EXPLODE_3X3(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_3X3) + +/* special macros used in game engine */ +#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \ + (e) <= EL_CUSTOM_END) + +#define GFX_ELEMENT(e) (element_info[e].use_gfx_element ? \ + element_info[e].gfx_element : e) #define IS_PLAYER(x,y) (ELEM_IS_PLAYER(StorePlayer[x][y])) @@ -164,13 +334,14 @@ #define TAPE_IS_EMPTY(x) ((x).length == 0) #define TAPE_IS_STOPPED(x) (!(x).recording && !(x).playing) -#define PLAYERINFO(x,y) (&stored_player[StorePlayer[x][y]-EL_PLAYER1]) +#define PLAYERINFO(x,y) (&stored_player[StorePlayer[x][y]-EL_PLAYER_1]) #define SHIELD_ON(p) ((p)->shield_normal_time_left > 0) -#define PROTECTED_FIELD(x,y) (IS_TUBE(Feld[x][y])) +#define PROTECTED_FIELD(x,y) (IS_ACCESSIBLE_INSIDE(Feld[x][y]) && \ + IS_INDESTRUCTIBLE(Feld[x][y])) #define PLAYER_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \ PROTECTED_FIELD(x, y)) -#define PLAYER_NR_GFX(g,i) ((g) + i * (IMG_PLAYER2 - IMG_PLAYER1)) +#define PLAYER_NR_GFX(g,i) ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1)) #define ANIM_FRAMES(g) (graphic_info[g].anim_frames) #define ANIM_DELAY(g) (graphic_info[g].anim_delay) @@ -179,61 +350,33 @@ #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)) +#define IS_NEXT_FRAME(f, g) (IS_NEW_FRAME(f, g) && (f) > 0) #define IS_LOOP_SOUND(s) (sound_info[s].loop) -#if 0 - -/* Bitmaps with graphic file */ -#define PIX_BACK 0 -#define PIX_DOOR 1 -#define PIX_TOONS 2 -#define PIX_FONT_BIG 3 -#define PIX_FONT_SMALL 4 -#define PIX_FONT_MEDIUM 5 -#define PIX_FONT_EM 6 -/* Bitmaps without graphic file */ -#define PIX_DB_DOOR 7 -#define PIX_DB_FIELD 8 - -#define NUM_PICTURES 7 -#define NUM_BITMAPS 9 - -#else - -/* Bitmaps with graphic file */ -#define PIX_BACK 0 -#define PIX_ELEMENTS 1 -#define PIX_DOOR 2 -#define PIX_HEROES 3 -#define PIX_TOONS 4 -#define PIX_SP 5 -#define PIX_DC 6 -#define PIX_MORE 7 -#define PIX_FONT_BIG 8 -#define PIX_FONT_SMALL 9 -#define PIX_FONT_MEDIUM 10 -#define PIX_FONT_EM 11 -/* Bitmaps without graphic file */ -#define PIX_DB_DOOR 12 -#define PIX_DB_FIELD 13 - -#define NUM_PICTURES 12 -#define NUM_BITMAPS 14 - -#endif +/* 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_TAPELEN (1000 * 50) /* max. time * framerate */ +#define MAX_ELEMENT_NAME_LEN 32 +#define MAX_TAPELEN (1000 * FRAMES_PER_SECOND) /* max.time x fps */ #define MAX_SCORE_ENTRIES 100 -#if 0 -#define MAX_ELEMENTS 700 /* 500 static + 200 runtime */ -#define MAX_GRAPHICS 1536 /* see below: NUM_TILES */ -#endif #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 10 /* values for elements with content */ #define MIN_ELEMENT_CONTENTS 1 @@ -242,13 +385,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 @@ -294,12 +430,12 @@ #define EL_EMPTY EL_EMPTY_SPACE #define EL_SAND 1 #define EL_WALL 2 -#define EL_WALL_CRUMBLED 3 +#define EL_WALL_SLIPPERY 3 #define EL_ROCK 4 -#define EL_KEY_OBSOLETE 5 /* obsolete; mapped to EL_KEY1 */ +#define EL_KEY_OBSOLETE 5 /* obsolete; mapped to EL_KEY_1 */ #define EL_EMERALD 6 #define EL_EXIT_CLOSED 7 -#define EL_PLAYER_OBSOLETE 8 /* obsolete; mapped to EL_PLAYER1 */ +#define EL_PLAYER_OBSOLETE 8 /* obsolete; mapped to EL_PLAYER_1 */ #define EL_BUG 9 #define EL_SPACESHIP 10 #define EL_YAMYAM 11 @@ -317,24 +453,24 @@ #define EL_AMOEBA_WET 23 #define EL_AMOEBA_DRY 24 #define EL_NUT 25 -#define EL_GAMEOFLIFE 26 +#define EL_GAME_OF_LIFE 26 #define EL_BIOMAZE 27 #define EL_DYNAMITE_ACTIVE 28 #define EL_STONEBLOCK 29 #define EL_ROBOT_WHEEL 30 #define EL_ROBOT_WHEEL_ACTIVE 31 -#define EL_KEY1 32 -#define EL_KEY2 33 -#define EL_KEY3 34 -#define EL_KEY4 35 -#define EL_GATE1 36 -#define EL_GATE2 37 -#define EL_GATE3 38 -#define EL_GATE4 39 -#define EL_GATE1_GRAY 40 -#define EL_GATE2_GRAY 41 -#define EL_GATE3_GRAY 42 -#define EL_GATE4_GRAY 43 +#define EL_KEY_1 32 +#define EL_KEY_2 33 +#define EL_KEY_3 34 +#define EL_KEY_4 35 +#define EL_GATE_1 36 +#define EL_GATE_2 37 +#define EL_GATE_3 38 +#define EL_GATE_4 39 +#define EL_GATE_1_GRAY 40 +#define EL_GATE_2_GRAY 41 +#define EL_GATE_3_GRAY 42 +#define EL_GATE_4_GRAY 43 #define EL_DYNAMITE 44 #define EL_PACMAN 45 #define EL_INVISIBLE_WALL 46 @@ -346,7 +482,7 @@ #define EL_BD_AMOEBA 52 #define EL_TIME_ORB_FULL 53 #define EL_TIME_ORB_EMPTY 54 -#define EL_WALL_GROWING 55 +#define EL_EXPANDABLE_WALL 55 #define EL_BD_DIAMOND 56 #define EL_EMERALD_YELLOW 57 #define EL_WALL_BD_DIAMOND 58 @@ -357,9 +493,9 @@ #define EL_UNUSED_63 63 -#define EL_DYNABOMB_NR 64 -#define EL_DYNABOMB_SZ 65 -#define EL_DYNABOMB_XL 66 +#define EL_DYNABOMB_INCREASE_NUMBER 64 +#define EL_DYNABOMB_INCREASE_SIZE 65 +#define EL_DYNABOMB_INCREASE_POWER 66 #define EL_SOKOBAN_OBJECT 67 #define EL_SOKOBAN_FIELD_EMPTY 68 #define EL_SOKOBAN_FIELD_FULL 69 @@ -381,10 +517,10 @@ #define EL_BD_FIREFLY_4 EL_BD_FIREFLY_UP #define EL_BD_BUTTERFLY 78 #define EL_BD_FIREFLY 79 -#define EL_PLAYER1 80 -#define EL_PLAYER2 81 -#define EL_PLAYER3 82 -#define EL_PLAYER4 83 +#define EL_PLAYER_1 80 +#define EL_PLAYER_2 81 +#define EL_PLAYER_3 82 +#define EL_PLAYER_4 83 #define EL_BUG_RIGHT 84 #define EL_BUG_UP 85 #define EL_BUG_LEFT 86 @@ -401,11 +537,11 @@ #define EL_EMERALD_PURPLE 97 #define EL_WALL_EMERALD_RED 98 #define EL_WALL_EMERALD_PURPLE 99 -#define EL_ACIDPOOL_TOPLEFT 100 -#define EL_ACIDPOOL_TOPRIGHT 101 -#define EL_ACIDPOOL_BOTTOMLEFT 102 -#define EL_ACIDPOOL_BOTTOM 103 -#define EL_ACIDPOOL_BOTTOMRIGHT 104 +#define EL_ACID_POOL_TOPLEFT 100 +#define EL_ACID_POOL_TOPRIGHT 101 +#define EL_ACID_POOL_BOTTOMLEFT 102 +#define EL_ACID_POOL_BOTTOM 103 +#define EL_ACID_POOL_BOTTOMRIGHT 104 #define EL_BD_WALL 105 #define EL_BD_ROCK 106 #define EL_EXIT_OPEN 107 @@ -414,78 +550,38 @@ #define EL_MOLE 110 #define EL_PENGUIN 111 #define EL_SATELLITE 112 -#define EL_ARROW_BLUE_LEFT 113 -#define EL_ARROW_BLUE_RIGHT 114 -#define EL_ARROW_BLUE_UP 115 -#define EL_ARROW_BLUE_DOWN 116 +#define EL_ARROW_LEFT 113 +#define EL_ARROW_RIGHT 114 +#define EL_ARROW_UP 115 +#define EL_ARROW_DOWN 116 #define EL_PIG 117 #define EL_DRAGON 118 -#define EL_EM_KEY1_FILE 119 +#define EL_EM_KEY_1_FILE 119 #define EL_CHAR_START 120 #define EL_CHAR_ASCII0 (EL_CHAR_START - 32) #define EL_CHAR_ASCII0_START (EL_CHAR_ASCII0 + 32) -#define EL_CHAR_EXCLAM (EL_CHAR_ASCII0 + 33) -#define EL_CHAR_QUOTEDBL (EL_CHAR_ASCII0 + 34) -#define EL_CHAR_NUMBERSIGN (EL_CHAR_ASCII0 + 35) -#define EL_CHAR_DOLLAR (EL_CHAR_ASCII0 + 36) -#define EL_CHAR_PROCENT (EL_CHAR_ASCII0 + 37) -#define EL_CHAR_AMPERSAND (EL_CHAR_ASCII0 + 38) -#define EL_CHAR_APOSTROPHE (EL_CHAR_ASCII0 + 39) -#define EL_CHAR_PARENLEFT (EL_CHAR_ASCII0 + 40) -#define EL_CHAR_PARENRIGHT (EL_CHAR_ASCII0 + 41) -#define EL_CHAR_ASTERISK (EL_CHAR_ASCII0 + 42) -#define EL_CHAR_PLUS (EL_CHAR_ASCII0 + 43) -#define EL_CHAR_COMMA (EL_CHAR_ASCII0 + 44) -#define EL_CHAR_MINUS (EL_CHAR_ASCII0 + 45) -#define EL_CHAR_PERIOD (EL_CHAR_ASCII0 + 46) -#define EL_CHAR_SLASH (EL_CHAR_ASCII0 + 47) -#define EL_CHAR_0 (EL_CHAR_ASCII0 + 48) -#define EL_CHAR_9 (EL_CHAR_ASCII0 + 57) -#define EL_CHAR_COLON (EL_CHAR_ASCII0 + 58) -#define EL_CHAR_SEMICOLON (EL_CHAR_ASCII0 + 59) -#define EL_CHAR_LESS (EL_CHAR_ASCII0 + 60) -#define EL_CHAR_EQUAL (EL_CHAR_ASCII0 + 61) -#define EL_CHAR_GREATER (EL_CHAR_ASCII0 + 62) -#define EL_CHAR_QUESTION (EL_CHAR_ASCII0 + 63) -#define EL_CHAR_AT (EL_CHAR_ASCII0 + 64) -#define EL_CHAR_A (EL_CHAR_ASCII0 + 65) -#define EL_CHAR_Z (EL_CHAR_ASCII0 + 90) -#define EL_CHAR_AE (EL_CHAR_ASCII0 + 91) -#define EL_CHAR_OE (EL_CHAR_ASCII0 + 92) -#define EL_CHAR_UE (EL_CHAR_ASCII0 + 93) -#define EL_CHAR_COPYRIGHT (EL_CHAR_ASCII0 + 94) -#define EL_CHAR_UNDERSCORE (EL_CHAR_ASCII0 + 95) -#define EL_CHAR_EMPTY (EL_CHAR_ASCII0 + 96) -#define EL_CHAR_DEGREE (EL_CHAR_ASCII0 + 97) -#define EL_CHAR_TM (EL_CHAR_ASCII0 + 98) -#define EL_CHAR_CURSOR (EL_CHAR_ASCII0 + 99) + +#include "conf_chr.h" /* include auto-generated data structure definitions */ + #define EL_CHAR_ASCII0_END (EL_CHAR_ASCII0 + 111) #define EL_CHAR_END (EL_CHAR_START + 79) -#define EL_CHAR(x) ((x) == 'Ä' ? EL_CHAR_AE : \ - (x) == 'Ö' ? EL_CHAR_OE : \ - (x) == 'Ü' ? EL_CHAR_UE : \ - (x) == '^' ? EL_CHAR_COPYRIGHT : \ - (x) == '_' ? EL_CHAR_UNDERSCORE : \ - (x) == '°' ? EL_CHAR_DEGREE : \ - (x) == '´' ? EL_CHAR_TM : \ - (x) == '|' ? EL_CHAR_CURSOR : \ - EL_CHAR_A + (x) - 'A') - -#define EL_WALL_GROWING_X 200 -#define EL_WALL_GROWING_Y 201 -#define EL_WALL_GROWING_XY 202 - -#define EL_EM_GATE1 203 -#define EL_EM_GATE2 204 -#define EL_EM_GATE3 205 -#define EL_EM_GATE4 206 - -#define EL_EM_KEY2_FILE 207 -#define EL_EM_KEY3_FILE 208 -#define EL_EM_KEY4_FILE 209 +#define EL_CHAR(c) (EL_CHAR_ASCII0 + MAP_FONT_ASCII(c)) + +#define EL_EXPANDABLE_WALL_HORIZONTAL 200 +#define EL_EXPANDABLE_WALL_VERTICAL 201 +#define EL_EXPANDABLE_WALL_ANY 202 + +#define EL_EM_GATE_1 203 +#define EL_EM_GATE_2 204 +#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_SP_START 210 #define EL_SP_EMPTY_SPACE (EL_SP_START + 0) @@ -495,46 +591,46 @@ #define EL_SP_MURPHY (EL_SP_START + 3) #define EL_SP_INFOTRON (EL_SP_START + 4) #define EL_SP_CHIP_SINGLE (EL_SP_START + 5) -#define EL_SP_HARD_GRAY (EL_SP_START + 6) +#define EL_SP_HARDWARE_GRAY (EL_SP_START + 6) #define EL_SP_EXIT_CLOSED (EL_SP_START + 7) #define EL_SP_DISK_ORANGE (EL_SP_START + 8) -#define EL_SP_PORT1_RIGHT (EL_SP_START + 9) -#define EL_SP_PORT1_DOWN (EL_SP_START + 10) -#define EL_SP_PORT1_LEFT (EL_SP_START + 11) -#define EL_SP_PORT1_UP (EL_SP_START + 12) -#define EL_SP_PORT2_RIGHT (EL_SP_START + 13) -#define EL_SP_PORT2_DOWN (EL_SP_START + 14) -#define EL_SP_PORT2_LEFT (EL_SP_START + 15) -#define EL_SP_PORT2_UP (EL_SP_START + 16) +#define EL_SP_PORT_RIGHT (EL_SP_START + 9) +#define EL_SP_PORT_DOWN (EL_SP_START + 10) +#define EL_SP_PORT_LEFT (EL_SP_START + 11) +#define EL_SP_PORT_UP (EL_SP_START + 12) +#define EL_SP_GRAVITY_PORT_RIGHT (EL_SP_START + 13) +#define EL_SP_GRAVITY_PORT_DOWN (EL_SP_START + 14) +#define EL_SP_GRAVITY_PORT_LEFT (EL_SP_START + 15) +#define EL_SP_GRAVITY_PORT_UP (EL_SP_START + 16) #define EL_SP_SNIKSNAK (EL_SP_START + 17) #define EL_SP_DISK_YELLOW (EL_SP_START + 18) #define EL_SP_TERMINAL (EL_SP_START + 19) #define EL_SP_DISK_RED (EL_SP_START + 20) -#define EL_SP_PORT_Y (EL_SP_START + 21) -#define EL_SP_PORT_X (EL_SP_START + 22) -#define EL_SP_PORT_XY (EL_SP_START + 23) +#define EL_SP_PORT_VERTICAL (EL_SP_START + 21) +#define EL_SP_PORT_HORIZONTAL (EL_SP_START + 22) +#define EL_SP_PORT_ANY (EL_SP_START + 23) #define EL_SP_ELECTRON (EL_SP_START + 24) #define EL_SP_BUGGY_BASE (EL_SP_START + 25) #define EL_SP_CHIP_LEFT (EL_SP_START + 26) #define EL_SP_CHIP_RIGHT (EL_SP_START + 27) -#define EL_SP_HARD_BASE1 (EL_SP_START + 28) -#define EL_SP_HARD_GREEN (EL_SP_START + 29) -#define EL_SP_HARD_BLUE (EL_SP_START + 30) -#define EL_SP_HARD_RED (EL_SP_START + 31) -#define EL_SP_HARD_YELLOW (EL_SP_START + 32) -#define EL_SP_HARD_BASE2 (EL_SP_START + 33) -#define EL_SP_HARD_BASE3 (EL_SP_START + 34) -#define EL_SP_HARD_BASE4 (EL_SP_START + 35) -#define EL_SP_HARD_BASE5 (EL_SP_START + 36) -#define EL_SP_HARD_BASE6 (EL_SP_START + 37) -#define EL_SP_CHIP_UPPER (EL_SP_START + 38) -#define EL_SP_CHIP_LOWER (EL_SP_START + 39) +#define EL_SP_HARDWARE_BASE_1 (EL_SP_START + 28) +#define EL_SP_HARDWARE_GREEN (EL_SP_START + 29) +#define EL_SP_HARDWARE_BLUE (EL_SP_START + 30) +#define EL_SP_HARDWARE_RED (EL_SP_START + 31) +#define EL_SP_HARDWARE_YELLOW (EL_SP_START + 32) +#define EL_SP_HARDWARE_BASE_2 (EL_SP_START + 33) +#define EL_SP_HARDWARE_BASE_3 (EL_SP_START + 34) +#define EL_SP_HARDWARE_BASE_4 (EL_SP_START + 35) +#define EL_SP_HARDWARE_BASE_5 (EL_SP_START + 36) +#define EL_SP_HARDWARE_BASE_6 (EL_SP_START + 37) +#define EL_SP_CHIP_TOP (EL_SP_START + 38) +#define EL_SP_CHIP_BOTTOM (EL_SP_START + 39) #define EL_SP_END (EL_SP_START + 39) -#define EL_EM_GATE1_GRAY 250 -#define EL_EM_GATE2_GRAY 251 -#define EL_EM_GATE3_GRAY 252 -#define EL_EM_GATE4_GRAY 253 +#define EL_EM_GATE_1_GRAY 250 +#define EL_EM_GATE_2_GRAY 251 +#define EL_EM_GATE_3_GRAY 252 +#define EL_EM_GATE_4_GRAY 253 #define EL_UNUSED_254 254 #define EL_UNUSED_255 255 @@ -556,30 +652,30 @@ #define EL_UNUSED_269 269 #define EL_UNUSED_270 270 -#define EL_CONVEYOR_BELT1_LEFT 271 -#define EL_CONVEYOR_BELT1_MIDDLE 272 -#define EL_CONVEYOR_BELT1_RIGHT 273 -#define EL_CONVEYOR_BELT1_SWITCH_LEFT 274 -#define EL_CONVEYOR_BELT1_SWITCH_MIDDLE 275 -#define EL_CONVEYOR_BELT1_SWITCH_RIGHT 276 -#define EL_CONVEYOR_BELT2_LEFT 277 -#define EL_CONVEYOR_BELT2_MIDDLE 278 -#define EL_CONVEYOR_BELT2_RIGHT 279 -#define EL_CONVEYOR_BELT2_SWITCH_LEFT 280 -#define EL_CONVEYOR_BELT2_SWITCH_MIDDLE 281 -#define EL_CONVEYOR_BELT2_SWITCH_RIGHT 282 -#define EL_CONVEYOR_BELT3_LEFT 283 -#define EL_CONVEYOR_BELT3_MIDDLE 284 -#define EL_CONVEYOR_BELT3_RIGHT 285 -#define EL_CONVEYOR_BELT3_SWITCH_LEFT 286 -#define EL_CONVEYOR_BELT3_SWITCH_MIDDLE 287 -#define EL_CONVEYOR_BELT3_SWITCH_RIGHT 288 -#define EL_CONVEYOR_BELT4_LEFT 289 -#define EL_CONVEYOR_BELT4_MIDDLE 290 -#define EL_CONVEYOR_BELT4_RIGHT 291 -#define EL_CONVEYOR_BELT4_SWITCH_LEFT 292 -#define EL_CONVEYOR_BELT4_SWITCH_MIDDLE 293 -#define EL_CONVEYOR_BELT4_SWITCH_RIGHT 294 +#define EL_CONVEYOR_BELT_1_LEFT 271 +#define EL_CONVEYOR_BELT_1_MIDDLE 272 +#define EL_CONVEYOR_BELT_1_RIGHT 273 +#define EL_CONVEYOR_BELT_1_SWITCH_LEFT 274 +#define EL_CONVEYOR_BELT_1_SWITCH_MIDDLE 275 +#define EL_CONVEYOR_BELT_1_SWITCH_RIGHT 276 +#define EL_CONVEYOR_BELT_2_LEFT 277 +#define EL_CONVEYOR_BELT_2_MIDDLE 278 +#define EL_CONVEYOR_BELT_2_RIGHT 279 +#define EL_CONVEYOR_BELT_2_SWITCH_LEFT 280 +#define EL_CONVEYOR_BELT_2_SWITCH_MIDDLE 281 +#define EL_CONVEYOR_BELT_2_SWITCH_RIGHT 282 +#define EL_CONVEYOR_BELT_3_LEFT 283 +#define EL_CONVEYOR_BELT_3_MIDDLE 284 +#define EL_CONVEYOR_BELT_3_RIGHT 285 +#define EL_CONVEYOR_BELT_3_SWITCH_LEFT 286 +#define EL_CONVEYOR_BELT_3_SWITCH_MIDDLE 287 +#define EL_CONVEYOR_BELT_3_SWITCH_RIGHT 288 +#define EL_CONVEYOR_BELT_4_LEFT 289 +#define EL_CONVEYOR_BELT_4_MIDDLE 290 +#define EL_CONVEYOR_BELT_4_RIGHT 291 +#define EL_CONVEYOR_BELT_4_SWITCH_LEFT 292 +#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_LIGHT_SWITCH 297 @@ -600,7 +696,7 @@ #define EL_MOLE_RIGHT 312 #define EL_MOLE_UP 313 #define EL_MOLE_DOWN 314 -#define EL_STEELWALL_SLANTED 315 +#define EL_STEELWALL_SLIPPERY 315 #define EL_INVISIBLE_SAND 316 #define EL_DX_UNKNOWN_15 317 #define EL_DX_UNKNOWN_42 318 @@ -615,26 +711,26 @@ #define EL_TIMEGATE_SWITCH 325 #define EL_BALLOON 326 -#define EL_BALLOON_SEND_LEFT 327 -#define EL_BALLOON_SEND_RIGHT 328 -#define EL_BALLOON_SEND_UP 329 -#define EL_BALLOON_SEND_DOWN 330 -#define EL_BALLOON_SEND_ANY_DIRECTION 331 - -#define EL_EMC_STEELWALL1 332 -#define EL_EMC_STEELWALL2 333 -#define EL_EMC_STEELWALL3 334 -#define EL_EMC_STEELWALL4 335 -#define EL_EMC_WALL_PILLAR_UPPER 336 -#define EL_EMC_WALL_PILLAR_MIDDLE 337 -#define EL_EMC_WALL_PILLAR_LOWER 338 -#define EL_EMC_WALL4 339 -#define EL_EMC_WALL5 340 -#define EL_EMC_WALL6 341 -#define EL_EMC_WALL7 342 -#define EL_EMC_WALL8 343 - -#define EL_TUBE_ALL 344 +#define EL_BALLOON_SWITCH_LEFT 327 +#define EL_BALLOON_SWITCH_RIGHT 328 +#define EL_BALLOON_SWITCH_UP 329 +#define EL_BALLOON_SWITCH_DOWN 330 +#define EL_BALLOON_SWITCH_ANY 331 + +#define EL_EMC_STEELWALL_1 332 +#define EL_EMC_STEELWALL_2 333 +#define EL_EMC_STEELWALL_3 334 +#define EL_EMC_STEELWALL_4 335 +#define EL_EMC_WALL_1 336 +#define EL_EMC_WALL_2 337 +#define EL_EMC_WALL_3 338 +#define EL_EMC_WALL_4 339 +#define EL_EMC_WALL_5 340 +#define EL_EMC_WALL_6 341 +#define EL_EMC_WALL_7 342 +#define EL_EMC_WALL_8 343 + +#define EL_TUBE_ANY 344 #define EL_TUBE_VERTICAL 345 #define EL_TUBE_HORIZONTAL 346 #define EL_TUBE_VERTICAL_LEFT 347 @@ -653,81 +749,85 @@ #define EL_UNUSED_359 359 #define EL_CUSTOM_START 360 -#define EL_CUSTOM_1 (EL_CUSTOM_START + 0) -#define EL_CUSTOM_128 (EL_CUSTOM_START + 127) -#define EL_CUSTOM_END (EL_CUSTOM_START + 127) -#define NUM_FILE_ELEMENTS 488 +#include "conf_cus.h" /* include auto-generated data structure definitions */ + +#define NUM_CUSTOM_ELEMENTS 256 + +#define EL_CUSTOM_END (EL_CUSTOM_START + NUM_CUSTOM_ELEMENTS - 1) +#define NUM_FILE_ELEMENTS (EL_CUSTOM_START + NUM_CUSTOM_ELEMENTS) /* "real" (and therefore drawable) runtime elements */ #define EL_FIRST_RUNTIME_REAL NUM_FILE_ELEMENTS -#define EL_EM_KEY1 (EL_FIRST_RUNTIME_REAL + 0) -#define EL_EM_KEY2 (EL_FIRST_RUNTIME_REAL + 1) -#define EL_EM_KEY3 (EL_FIRST_RUNTIME_REAL + 2) -#define EL_EM_KEY4 (EL_FIRST_RUNTIME_REAL + 3) -#define EL_DYNABOMB_PLAYER1_ACTIVE (EL_FIRST_RUNTIME_REAL + 4) -#define EL_DYNABOMB_PLAYER2_ACTIVE (EL_FIRST_RUNTIME_REAL + 5) -#define EL_DYNABOMB_PLAYER3_ACTIVE (EL_FIRST_RUNTIME_REAL + 6) -#define EL_DYNABOMB_PLAYER4_ACTIVE (EL_FIRST_RUNTIME_REAL + 7) -#define EL_SWITCHGATE_OPENING (EL_FIRST_RUNTIME_REAL + 8) -#define EL_SWITCHGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 9) -#define EL_TIMEGATE_OPENING (EL_FIRST_RUNTIME_REAL + 10) -#define EL_TIMEGATE_CLOSING (EL_FIRST_RUNTIME_REAL + 11) -#define EL_PEARL_BREAKING (EL_FIRST_RUNTIME_REAL + 12) -#define EL_TRAP_ACTIVE (EL_FIRST_RUNTIME_REAL + 13) -#define EL_INVISIBLE_STEELWALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 14) -#define EL_INVISIBLE_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 15) -#define EL_INVISIBLE_SAND_ACTIVE (EL_FIRST_RUNTIME_REAL + 16) -#define EL_CONVEYOR_BELT1_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 17) -#define EL_CONVEYOR_BELT1_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 18) -#define EL_CONVEYOR_BELT1_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 19) -#define EL_CONVEYOR_BELT2_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 20) -#define EL_CONVEYOR_BELT2_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 21) -#define EL_CONVEYOR_BELT2_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 22) -#define EL_CONVEYOR_BELT3_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 23) -#define EL_CONVEYOR_BELT3_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 24) -#define EL_CONVEYOR_BELT3_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 25) -#define EL_CONVEYOR_BELT4_LEFT_ACTIVE (EL_FIRST_RUNTIME_REAL + 26) -#define EL_CONVEYOR_BELT4_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 27) -#define EL_CONVEYOR_BELT4_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 28) -#define EL_EXIT_OPENING (EL_FIRST_RUNTIME_REAL + 29) -#define EL_SP_EXIT_OPEN (EL_FIRST_RUNTIME_REAL + 30) -#define EL_SP_TERMINAL_ACTIVE (EL_FIRST_RUNTIME_REAL + 31) -#define EL_SP_BUGGY_BASE_ACTIVATING (EL_FIRST_RUNTIME_REAL + 32) -#define EL_SP_BUGGY_BASE_ACTIVE (EL_FIRST_RUNTIME_REAL + 33) -#define EL_SP_MURPHY_CLONE (EL_FIRST_RUNTIME_REAL + 34) -#define EL_AMOEBA_DRIPPING (EL_FIRST_RUNTIME_REAL + 35) -#define EL_QUICKSAND_EMPTYING (EL_FIRST_RUNTIME_REAL + 36) -#define EL_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 37) -#define EL_BD_MAGIC_WALL_ACTIVE (EL_FIRST_RUNTIME_REAL + 38) -#define EL_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 39) -#define EL_BD_MAGIC_WALL_FULL (EL_FIRST_RUNTIME_REAL + 40) -#define EL_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 41) -#define EL_BD_MAGIC_WALL_EMPTYING (EL_FIRST_RUNTIME_REAL + 42) -#define EL_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 43) -#define EL_BD_MAGIC_WALL_DEAD (EL_FIRST_RUNTIME_REAL + 44) +#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) /* "unreal" (and therefore not drawable) runtime elements */ -#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 45) +#define EL_FIRST_RUNTIME_UNREAL (EL_FIRST_RUNTIME_REAL + 46) #define EL_BLOCKED (EL_FIRST_RUNTIME_UNREAL + 0) #define EL_EXPLOSION (EL_FIRST_RUNTIME_UNREAL + 1) -#define EL_NUT_CRACKING (EL_FIRST_RUNTIME_UNREAL + 2) -#define EL_ACID_SPLASH_LEFT (EL_FIRST_RUNTIME_UNREAL + 3) -#define EL_ACID_SPLASH_RIGHT (EL_FIRST_RUNTIME_UNREAL + 4) -#define EL_AMOEBA_CREATING (EL_FIRST_RUNTIME_UNREAL + 5) -#define EL_AMOEBA_SHRINKING (EL_FIRST_RUNTIME_UNREAL + 6) -#define EL_WALL_GROWING_ACTIVE (EL_FIRST_RUNTIME_UNREAL + 7) -#define EL_FLAMES (EL_FIRST_RUNTIME_UNREAL + 8) -#define EL_PLAYER_IS_LEAVING (EL_FIRST_RUNTIME_UNREAL + 9) -#define EL_QUICKSAND_FILLING (EL_FIRST_RUNTIME_UNREAL + 10) -#define EL_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 11) -#define EL_BD_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 12) - -/* dummy (not drawable) runtime elements (internal use only) */ -#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 13) +#define EL_NUT_BREAKING (EL_FIRST_RUNTIME_UNREAL + 2) +#define EL_DIAMOND_BREAKING (EL_FIRST_RUNTIME_UNREAL + 3) +#define EL_ACID_SPLASH_LEFT (EL_FIRST_RUNTIME_UNREAL + 4) +#define EL_ACID_SPLASH_RIGHT (EL_FIRST_RUNTIME_UNREAL + 5) +#define EL_AMOEBA_GROWING (EL_FIRST_RUNTIME_UNREAL + 6) +#define EL_AMOEBA_SHRINKING (EL_FIRST_RUNTIME_UNREAL + 7) +#define EL_EXPANDABLE_WALL_GROWING (EL_FIRST_RUNTIME_UNREAL + 8) +#define EL_FLAMES (EL_FIRST_RUNTIME_UNREAL + 9) +#define EL_PLAYER_IS_LEAVING (EL_FIRST_RUNTIME_UNREAL + 10) +#define EL_QUICKSAND_FILLING (EL_FIRST_RUNTIME_UNREAL + 11) +#define EL_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 12) +#define EL_BD_MAGIC_WALL_FILLING (EL_FIRST_RUNTIME_UNREAL + 13) + +/* dummy elements (never used as game elements, only used as graphics) */ +#define EL_FIRST_DUMMY (EL_FIRST_RUNTIME_UNREAL + 14) #define EL_STEELWALL_TOPLEFT (EL_FIRST_DUMMY + 0) #define EL_STEELWALL_TOPRIGHT (EL_FIRST_DUMMY + 1) @@ -741,36 +841,20 @@ #define EL_INVISIBLE_STEELWALL_BOTTOMRIGHT (EL_FIRST_DUMMY + 9) #define EL_INVISIBLE_STEELWALL_HORIZONTAL (EL_FIRST_DUMMY + 10) #define EL_INVISIBLE_STEELWALL_VERTICAL (EL_FIRST_DUMMY + 11) -#define EL_SAND_CRUMBLED (EL_FIRST_DUMMY + 12) -#define EL_BD_AMOEBA_PART1 (EL_FIRST_DUMMY + 13) -#define EL_BD_AMOEBA_PART2 (EL_FIRST_DUMMY + 14) -#define EL_BD_AMOEBA_PART3 (EL_FIRST_DUMMY + 15) -#define EL_BD_AMOEBA_PART4 (EL_FIRST_DUMMY + 16) -#define EL_AMOEBA_WET_PART1 (EL_FIRST_DUMMY + 17) -#define EL_AMOEBA_WET_PART2 (EL_FIRST_DUMMY + 18) -#define EL_AMOEBA_WET_PART3 (EL_FIRST_DUMMY + 19) -#define EL_AMOEBA_WET_PART4 (EL_FIRST_DUMMY + 20) -#define EL_AMOEBA_DRY_PART1 (EL_FIRST_DUMMY + 21) -#define EL_AMOEBA_DRY_PART2 (EL_FIRST_DUMMY + 22) -#define EL_AMOEBA_DRY_PART3 (EL_FIRST_DUMMY + 23) -#define EL_AMOEBA_DRY_PART4 (EL_FIRST_DUMMY + 24) -#define EL_AMOEBA_FULL_PART1 (EL_FIRST_DUMMY + 25) -#define EL_AMOEBA_FULL_PART2 (EL_FIRST_DUMMY + 26) -#define EL_AMOEBA_FULL_PART3 (EL_FIRST_DUMMY + 27) -#define EL_AMOEBA_FULL_PART4 (EL_FIRST_DUMMY + 28) -#define EL_AMOEBA_DEAD_PART1 (EL_FIRST_DUMMY + 29) -#define EL_AMOEBA_DEAD_PART2 (EL_FIRST_DUMMY + 30) -#define EL_AMOEBA_DEAD_PART3 (EL_FIRST_DUMMY + 31) -#define EL_AMOEBA_DEAD_PART4 (EL_FIRST_DUMMY + 32) -#define EL_DYNABOMB_ACTIVE (EL_FIRST_DUMMY + 33) -#define EL_SHIELD_NORMAL_ACTIVE (EL_FIRST_DUMMY + 34) -#define EL_SHIELD_DEADLY_ACTIVE (EL_FIRST_DUMMY + 35) -#define EL_ARROW_RED_LEFT (EL_FIRST_DUMMY + 36) -#define EL_ARROW_RED_RIGHT (EL_FIRST_DUMMY + 37) -#define EL_ARROW_RED_UP (EL_FIRST_DUMMY + 38) -#define EL_ARROW_RED_DOWN (EL_FIRST_DUMMY + 39) - -#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 40) +#define EL_DYNABOMB (EL_FIRST_DUMMY + 12) +#define EL_DYNABOMB_ACTIVE (EL_FIRST_DUMMY + 13) +#define EL_DYNABOMB_PLAYER_1 (EL_FIRST_DUMMY + 14) +#define EL_DYNABOMB_PLAYER_2 (EL_FIRST_DUMMY + 15) +#define EL_DYNABOMB_PLAYER_3 (EL_FIRST_DUMMY + 16) +#define EL_DYNABOMB_PLAYER_4 (EL_FIRST_DUMMY + 17) +#define EL_SHIELD_NORMAL_ACTIVE (EL_FIRST_DUMMY + 18) +#define EL_SHIELD_DEADLY_ACTIVE (EL_FIRST_DUMMY + 19) +#define EL_DEFAULT (EL_FIRST_DUMMY + 20) +#define EL_BD_DEFAULT (EL_FIRST_DUMMY + 21) +#define EL_SP_DEFAULT (EL_FIRST_DUMMY + 22) +#define EL_SB_DEFAULT (EL_FIRST_DUMMY + 23) + +#define MAX_NUM_ELEMENTS (EL_FIRST_DUMMY + 24) /* values for graphics/sounds action types */ @@ -781,43 +865,72 @@ #define ACTION_DIGGING 4 #define ACTION_SNAPPING 5 #define ACTION_COLLECTING 6 -#define ACTION_PUSHING 7 -#define ACTION_PASSING 8 -#define ACTION_IMPACT 9 -#define ACTION_CRACKING 10 -#define ACTION_BREAKING 11 -#define ACTION_ACTIVATING 12 -#define ACTION_OPENING 13 -#define ACTION_CLOSING 14 -#define ACTION_EATING 15 -#define ACTION_ATTACKING 16 -#define ACTION_GROWING 17 -#define ACTION_SHRINKING 18 -#define ACTION_ACTIVE 19 -#define ACTION_OTHER 20 - -#define NUM_ACTIONS 21 +#define ACTION_DROPPING 7 +#define ACTION_PUSHING 8 +#define ACTION_WALKING 9 +#define ACTION_PASSING 10 +#define ACTION_IMPACT 11 +#define ACTION_BREAKING 12 +#define ACTION_ACTIVATING 13 +#define ACTION_DEACTIVATING 14 +#define ACTION_OPENING 15 +#define ACTION_CLOSING 16 +#define ACTION_ATTACKING 17 +#define ACTION_GROWING 18 +#define ACTION_SHRINKING 19 +#define ACTION_ACTIVE 20 +#define ACTION_FILLING 21 +#define ACTION_EMPTYING 22 +#define ACTION_CHANGING 23 +#define ACTION_EXPLODING 24 +#define ACTION_DYING 25 +#define ACTION_OTHER 26 + +#define NUM_ACTIONS 27 + +/* values for special image configuration suffixes (must match game mode) */ +#define GFX_SPECIAL_ARG_MAIN 0 +#define GFX_SPECIAL_ARG_LEVELS 1 +#define GFX_SPECIAL_ARG_SCORES 2 +#define GFX_SPECIAL_ARG_EDITOR 3 +#define GFX_SPECIAL_ARG_INFO 4 +#define GFX_SPECIAL_ARG_SETUP 5 +#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 10 /* values for image configuration suffixes */ -#define GFX_ARG_XPOS 0 -#define GFX_ARG_YPOS 1 -#define GFX_ARG_OFFSET 2 -#define GFX_ARG_VERTICAL 3 -#define GFX_ARG_XOFFSET 4 -#define GFX_ARG_YOFFSET 5 -#define GFX_ARG_FRAMES 6 -#define GFX_ARG_START_FRAME 7 -#define GFX_ARG_DELAY 8 -#define GFX_ARG_MODE_LOOP 9 -#define GFX_ARG_MODE_LINEAR 10 -#define GFX_ARG_MODE_PINGPONG 11 -#define GFX_ARG_MODE_PINGPONG2 12 -#define GFX_ARG_MODE_RANDOM 13 -#define GFX_ARG_MODE_REVERSE 14 +#define GFX_ARG_X 0 +#define GFX_ARG_Y 1 +#define GFX_ARG_XPOS 2 +#define GFX_ARG_YPOS 3 +#define GFX_ARG_WIDTH 4 +#define GFX_ARG_HEIGHT 5 +#define GFX_ARG_OFFSET 6 +#define GFX_ARG_VERTICAL 7 +#define GFX_ARG_XOFFSET 8 +#define GFX_ARG_YOFFSET 9 +#define GFX_ARG_FRAMES 10 +#define GFX_ARG_FRAMES_PER_LINE 11 +#define GFX_ARG_START_FRAME 12 +#define GFX_ARG_DELAY 13 +#define GFX_ARG_ANIM_MODE 14 #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 NUM_GFX_ARGS 16 +#define NUM_GFX_ARGS 25 /* values for sound configuration suffixes */ @@ -826,34 +939,81 @@ #define NUM_SND_ARGS 1 -/* values for game_status */ -#define EXITGAME 0 -#define MAINMENU 1 -#define PLAYING 2 -#define LEVELED 3 -#define HELPSCREEN 4 -#define CHOOSELEVEL 5 -#define TYPENAME 6 -#define HALLOFFAME 7 -#define SETUP 8 - -#define PROGRAM_VERSION_MAJOR 2 -#define PROGRAM_VERSION_MINOR 2 -#define PROGRAM_VERSION_PATCH 0 -#define PROGRAM_VERSION_STRING "2.2.0rc3" +/* values for font configuration */ + +#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_INPUT_1_ACTIVE 16 +#define FONT_INPUT_2_ACTIVE 17 +#define FONT_INPUT_1 18 +#define FONT_INPUT_2 19 +#define FONT_OPTION_OFF 20 +#define FONT_OPTION_ON 21 +#define FONT_VALUE_1 22 +#define FONT_VALUE_2 23 +#define FONT_VALUE_OLD 24 +#define FONT_LEVEL_NUMBER 25 +#define FONT_TAPE_RECORDER 26 +#define FONT_GAME_INFO 27 + +#define NUM_FONTS 28 +#define NUM_INITIAL_FONTS 4 + +/* values for game_status (must match special image configuration suffixes) */ +#define GAME_MODE_MAIN 0 +#define GAME_MODE_LEVELS 1 +#define GAME_MODE_SCORES 2 +#define GAME_MODE_EDITOR 3 +#define GAME_MODE_INFO 4 +#define GAME_MODE_SETUP 5 +#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_PSEUDO_TYPENAME 10 +#define GAME_MODE_QUIT 11 + +#define PROGRAM_VERSION_MAJOR 3 +#define PROGRAM_VERSION_MINOR 0 +#define PROGRAM_VERSION_PATCH 3 +#define PROGRAM_VERSION_RELEASE 0 +#define PROGRAM_VERSION_STRING "3.0.3" #define PROGRAM_TITLE_STRING "Rocks'n'Diamonds" #define PROGRAM_AUTHOR_STRING "Holger Schemel" -#define PROGRAM_RIGHTS_STRING "Copyright ^1995-2003 by" +#define PROGRAM_RIGHTS_STRING "Copyright ©1995-2003 by" #define PROGRAM_DOS_PORT_STRING "DOS port done by Guido Schulz" #define PROGRAM_IDENT_STRING PROGRAM_VERSION_STRING " " TARGET_STRING #define WINDOW_TITLE_STRING PROGRAM_TITLE_STRING " " PROGRAM_IDENT_STRING #define WINDOW_SUBTITLE_STRING PROGRAM_RIGHTS_STRING " " PROGRAM_AUTHOR_STRING #define ICON_TITLE_STRING PROGRAM_TITLE_STRING -#define UNIX_USERDATA_DIRECTORY ".rocksndiamonds" #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 +#else +#define USERDATA_DIRECTORY "userdata" +#endif + #define X11_ICON_FILENAME "rocks_icon.xbm" #define X11_ICONMASK_FILENAME "rocks_iconmask.xbm" #define MSDOS_POINTER_FILENAME "mouse.pcx" @@ -880,9 +1040,10 @@ #define GAME_VERSION_1_4 FILE_VERSION_1_4 #define GAME_VERSION_2_0 FILE_VERSION_2_0 -#define GAME_VERSION_ACTUAL VERSION_IDENT(PROGRAM_VERSION_MAJOR, \ +#define GAME_VERSION_ACTUAL RELEASE_IDENT(PROGRAM_VERSION_MAJOR, \ PROGRAM_VERSION_MINOR, \ - PROGRAM_VERSION_PATCH) + PROGRAM_VERSION_PATCH, \ + PROGRAM_VERSION_RELEASE) /* values for game_emulation */ #define EMU_NONE 0 @@ -912,8 +1073,13 @@ struct PlayerInfo through doors); overrides other actions */ int jx,jy, last_jx,last_jy; - int MovDir, MovPos, GfxPos; - int Frame; + int MovDir, MovPos, GfxDir, GfxPos; + int Frame, StepFrame; + + int GfxAction; + + boolean use_murphy_graphic; + boolean use_disk_red_graphic; boolean Pushing; boolean Switching; @@ -921,7 +1087,10 @@ struct PlayerInfo boolean snapped; int last_move_dir; - int is_moving; + boolean is_moving; + boolean is_waiting; + boolean is_digging; + boolean is_collecting; unsigned long move_delay; int move_delay_value; @@ -929,8 +1098,6 @@ struct PlayerInfo unsigned long push_delay; unsigned long push_delay_value; - int frame_reset_delay; - unsigned long actual_frame_counter; int score; @@ -939,10 +1106,12 @@ struct PlayerInfo int lights_still_needed; int friends_still_needed; int key[4]; - int dynamite; 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_size; }; struct LevelInfo @@ -954,15 +1123,16 @@ 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[MAX_ENVELOPE_TEXT_LEN + 1]; + int envelope_xsize, envelope_ysize; int score[LEVEL_SCORE_ELEMENTS]; - int yam_content[MAX_ELEMENT_CONTENTS][3][3]; - int num_yam_contents; + int yamyam_content[MAX_ELEMENT_CONTENTS][3][3]; + int num_yamyam_contents; int amoeba_speed; int amoeba_content; int time_magic_wall; @@ -973,7 +1143,11 @@ struct LevelInfo boolean gravity; boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */ - boolean no_level_file; + short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; + + boolean use_custom_template; /* use custom properties from template file */ + + boolean no_level_file; /* set for currently undefined levels */ }; struct TapeInfo @@ -982,6 +1156,7 @@ struct TapeInfo 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; @@ -1017,7 +1192,7 @@ struct GameInfo int initial_move_delay_value; /* variable within running game */ - int yam_content_nr; + int yamyam_content_nr; boolean magic_wall_active; int magic_wall_time_left; int light_time_left; @@ -1034,35 +1209,173 @@ struct GlobalInfo char *autoplay_leveldir; int autoplay_level_nr; + int num_toons; + float frames_per_second; boolean fps_slowdown; 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 +{ + boolean can_change; /* use or ignore this change info */ + + unsigned long events; /* bitfield for change events */ + + short target_element; /* target element after change */ + + int delay_fixed; /* added frame delay before changed (fixed) */ + int delay_random; /* added frame delay before changed (random) */ + int delay_frames; /* either 1 (frames) or 50 (seconds; 50 fps) */ + + short trigger_element; /* custom element triggering change */ + + int content[3][3]; /* new elements after extended change */ + boolean use_content; /* use extended change content */ + boolean only_complete; /* only use complete content */ + boolean use_random_change; /* use random value for setting content */ + int random; /* random value for setting content */ + int power; /* power of extended change */ + + boolean explode; /* explode instead of change */ + + /* functions that are called before, while and after the change of an + element -- currently only used for non-custom elements */ + 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 player_action; /* touched/pressed/pushed by player */ + int collide_action; /* collision/impact/smashed */ + int other_action; /* various change actions */ +}; + struct ElementInfo { - char *token_name; /* element token prefix used in config files */ - char *sound_class_name; /* classification for custom sound effects */ - char *editor_description; /* short description for level editor */ - char *custom_description; /* custom description for level editor */ + /* ---------- token and description strings ---------- */ + + char *token_name; /* element token used in config files */ + char *class_name; /* element class used in config files */ + char *editor_description; /* pre-defined description for level editor */ + char *custom_description; /* alternative description from config file */ + char description[MAX_ELEMENT_NAME_LEN + 1]; /* for custom elements */ + + /* ---------- graphic and sound definitions ---------- */ int graphic[NUM_ACTIONS]; /* default graphics for several actions */ - /* special graphics for left/right/up/down */ int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS]; + /* special graphics for left/right/up/down */ + + int crumbled[NUM_ACTIONS]; /* crumbled graphics for several actions */ + int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS]; + /* crumbled graphics for left/right/up/down */ + + int special_graphic[NUM_SPECIAL_GFX_ARGS]; + /* special graphics for certain screens */ int sound[NUM_ACTIONS]; /* default sounds for several actions */ + + /* ---------- special element property values ---------- */ + + boolean use_gfx_element; /* use custom graphic element */ + short gfx_element; /* optional custom graphic element */ + + int collect_score; /* score value for collecting */ + int collect_count; /* count value for collecting */ + + int push_delay_fixed; /* constant frame delay for pushing */ + int push_delay_random; /* additional random frame delay for pushing */ + int move_delay_fixed; /* constant frame delay for moving */ + int move_delay_random; /* additional random frame delay for moving */ + + int move_pattern; /* direction movable element moves to */ + int move_direction_initial; /* initial direction element moves to */ + int move_stepsize; /* step size element moves with */ + + int slippery_type; /* how/where other elements slip away */ + + int content[3][3]; /* new elements after explosion */ + + 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_num[NUM_CHANGE_EVENTS]; /* page number for each event */ + struct ElementChangeInfo *event_page[NUM_CHANGE_EVENTS]; /* page for event */ + + /* ---------- internal values used in level editor ---------- */ + + int access_type; /* walkable or passable */ + int access_layer; /* accessible over/inside/under */ + int walk_to_action; /* diggable/collectible/pushable */ + int smash_targets; /* can smash player/enemies/everything */ + int deadliness; /* deadly when running/colliding/touching */ + int consistency; /* indestructible/can explode */ + + boolean can_explode_by_fire; /* element explodes by fire */ + boolean can_explode_smashed; /* element explodes when smashed */ + boolean can_explode_impact; /* element explodes on impact */ + + boolean modified_settings; /* set for all modified custom elements */ +}; + +struct FontInfo +{ + char *token_name; /* font token used in config files */ + + int graphic; /* default graphic for this font */ + int special_graphic[NUM_SPECIAL_GFX_ARGS]; + /* special graphics for certain screens */ + int special_bitmap_id[NUM_SPECIAL_GFX_ARGS]; + /* internal bitmap ID for special graphics */ }; struct GraphicInfo { Bitmap *bitmap; - int src_x, src_y; /* derived from (tile sized) .xpos/.ypos */ + 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 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 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 */ #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) Pixmap clip_mask; /* single-graphic-only clip mask for X11 */ @@ -1088,6 +1401,12 @@ struct ElementDirectionInfo int value; }; +struct SpecialSuffixInfo +{ + char *suffix; + int value; +}; + #if 0 extern GC tile_clip_gc; @@ -1108,14 +1427,17 @@ extern boolean redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE]; extern int redraw_x1, redraw_y1; extern short Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; -extern short Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; +extern short ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; 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 short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short AmoebaCnt[MAX_NUM_AMOEBA]; @@ -1123,12 +1445,12 @@ extern short AmoebaCnt2[MAX_NUM_AMOEBA]; extern short ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern short ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; -extern unsigned long Properties1[MAX_NUM_ELEMENTS]; -extern unsigned long Properties2[MAX_NUM_ELEMENTS]; +extern unsigned long Properties[MAX_NUM_ELEMENTS][NUM_EP_BITFIELDS]; extern int GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY]; extern int GfxAction[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 lev_fieldx, lev_fieldy; extern int scroll_x, scroll_y; @@ -1155,15 +1477,20 @@ extern boolean network_player_action_received; extern int graphics_action_mapping[]; -extern struct LevelInfo level; +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; extern struct ElementInfo element_info[]; extern struct ElementActionInfo element_action_info[]; extern struct ElementDirectionInfo element_direction_info[]; +extern struct SpecialSuffixInfo special_suffix_info[]; +extern struct TokenIntPtrInfo image_config_vars[]; +extern struct FontInfo font_info[]; extern struct GraphicInfo *graphic_info; extern struct SoundInfo *sound_info; extern struct ConfigInfo image_config[], sound_config[];