#define EP_CAN_SMASH 69
#define EP_CAN_EXPLODE 70
#define EP_CAN_EXPLODE_3X3 71
+#define EP_SP_PORT 72
/* values for internal purpose only (level editor) */
-#define EP_EXPLODE_RESULT 72
-#define EP_WALK_TO_OBJECT 73
-#define EP_DEADLY 74
+#define EP_EXPLODE_RESULT 73
+#define EP_WALK_TO_OBJECT 74
+#define EP_DEADLY 75
-#define NUM_ELEMENT_PROPERTIES 75
+#define NUM_ELEMENT_PROPERTIES 76
#define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32)
#define EP_BITFIELD_BASE 0
#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)
+#define IS_SP_PORT(e) HAS_PROPERTY(e, EP_SP_PORT)
/* special macros used in game engine */
#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \
/* 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 (1000 / GAME_FRAME_DELAY)
+#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 */
boolean use_murphy_graphic;
+ boolean block_last_field;
+
boolean LevelSolved, GameOver;
int last_move_dir;
int nr;
int type;
boolean packed;
+ char *basename;
char *filename;
};
boolean double_speed;
boolean initial_gravity;
boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */
+ boolean block_last_field; /* player blocks previous field while moving */
+ boolean sp_block_last_field; /* player blocks previous field while moving */
short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
int num_elements; /* number of elements in this group */
short element[MAX_ELEMENTS_IN_GROUP]; /* list of elements in this group */
+ int choice_mode; /* how to choose element from group */
+
/* ---------- internal values used at runtime when playing ---------- */
/* the following is the same as above, but with recursively resolved group
elements (group elements may also contain further group elements!) */
int num_elements_resolved;
short element_resolved[NUM_FILE_ELEMENTS];
+
+ int choice_pos; /* current element choice position */
};
struct ElementInfo