#define EP_HAS_ACTION 87
#define EP_CAN_CHANGE_OR_HAS_ACTION 88
-#define NUM_ELEMENT_PROPERTIES 89
+/* values for internal purpose only (other) */
+#define EP_OBSOLETE 89
+
+#define NUM_ELEMENT_PROPERTIES 90
#define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32)
-#define EP_BITFIELD_BASE 0
+#define EP_BITFIELD_BASE_NR 0
+#define EP_BITMASK_BASE_DEFAULT (1 << EP_CAN_MOVE_INTO_ACID)
#define EP_BITMASK_DEFAULT 0
#define PROPERTY_BIT(p) (1 << ((p) % 32))
#define CE_MOVE_OF_X 35
#define CE_DIGGING_X 36
#define CE_CREATION_OF_X 37
+#define CE_SCORE_GETS_ZERO 38
+#define CE_SCORE_GETS_ZERO_OF_X 39
+#define CE_VALUE_CHANGES 40
+#define CE_VALUE_CHANGES_OF_X 41
+#define CE_SCORE_CHANGES 42
+#define CE_SCORE_CHANGES_OF_X 43
+
+#define NUM_CHANGE_EVENTS 44
-#define NUM_CHANGE_EVENTS 38
+#define NUM_CE_BITFIELDS ((NUM_CHANGE_EVENTS + 31) / 32)
#define CE_BITMASK_DEFAULT 0
+#define CH_EVENT_BITFIELD_NR(e) (e / 32)
+#define CH_EVENT_BIT(e) (1 << ((e) % 32))
+
#define CH_EVENT_VAR(e,c) (element_info[e].change->has_event[c])
#define CH_ANY_EVENT_VAR(e,c) (element_info[e].has_change_event[c])
#define CA_SET_LEVEL_GEMS 7
#define CA_SET_LEVEL_SCORE 8
#define CA_SET_LEVEL_WIND 9
-#define CA_SET_LEVEL_GRAVITY 10
+#define CA_SET_PLAYER_GRAVITY 10
#define CA_SET_PLAYER_KEYS 11
#define CA_SET_PLAYER_SPEED 12
#define CA_SET_PLAYER_SHIELD 13
#define CAN_CHANGE_OR_HAS_ACTION(e) \
HAS_PROPERTY(e, EP_CAN_CHANGE_OR_HAS_ACTION)
+#define IS_OBSOLETE(e) HAS_PROPERTY(e, EP_OBSOLETE)
+
/* special macros used in game engine */
#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \
(e) <= EL_CUSTOM_END)
#define MAX_ELEMENT_NAME_LEN 32
#define MAX_TAPES_PER_SET 1024
#define MAX_SCORE_ENTRIES 100
+#define MAX_NUM_TITLE_SCREENS 5
+
#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 NUM_ENVELOPES 4
#define MIN_ENVELOPE_XSIZE 1
#define MIN_ENVELOPE_YSIZE 1
#define MAX_ENVELOPE_XSIZE 30
#define STD_ELEMENT_CONTENTS 4
#define MAX_ELEMENT_CONTENTS 8
-#define LEVEL_SCORE_ELEMENTS 16 /* level elements with score */
-
/* often used screen positions */
#define SX 8
#define SY 8
#define SC_CRYSTAL 11
#define SC_PEARL 12
#define SC_SHIELD 13
+#define SC_UNKNOWN_14 14
+#define SC_UNKNOWN_15 15
+
+#define LEVEL_SCORE_ELEMENTS 16 /* level elements with score */
/* "real" level file elements */
/* values for special image configuration suffixes (must match game mode) */
#define GFX_SPECIAL_ARG_DEFAULT 0
-#define GFX_SPECIAL_ARG_MAIN 1
-#define GFX_SPECIAL_ARG_LEVELS 2
-#define GFX_SPECIAL_ARG_SCORES 3
-#define GFX_SPECIAL_ARG_EDITOR 4
-#define GFX_SPECIAL_ARG_INFO 5
-#define GFX_SPECIAL_ARG_SETUP 6
-#define GFX_SPECIAL_ARG_PLAYING 7
-#define GFX_SPECIAL_ARG_DOOR 8
-#define GFX_SPECIAL_ARG_PREVIEW 9
-#define GFX_SPECIAL_ARG_CRUMBLED 10
+#define GFX_SPECIAL_ARG_TITLE 1
+#define GFX_SPECIAL_ARG_MAIN 2
+#define GFX_SPECIAL_ARG_LEVELS 3
+#define GFX_SPECIAL_ARG_SCORES 4
+#define GFX_SPECIAL_ARG_EDITOR 5
+#define GFX_SPECIAL_ARG_INFO 6
+#define GFX_SPECIAL_ARG_SETUP 7
+#define GFX_SPECIAL_ARG_PLAYING 8
+#define GFX_SPECIAL_ARG_DOOR 9
+#define GFX_SPECIAL_ARG_PREVIEW 10
+#define GFX_SPECIAL_ARG_CRUMBLED 11
-#define NUM_SPECIAL_GFX_ARGS 11
+#define NUM_SPECIAL_GFX_ARGS 12
/* values for image configuration suffixes */
/* values for game_status (must match special image configuration suffixes) */
#define GAME_MODE_DEFAULT 0
-#define GAME_MODE_MAIN 1
-#define GAME_MODE_LEVELS 2
-#define GAME_MODE_SCORES 3
-#define GAME_MODE_EDITOR 4
-#define GAME_MODE_INFO 5
-#define GAME_MODE_SETUP 6
-#define GAME_MODE_PLAYING 7
-#define GAME_MODE_PSEUDO_DOOR 8
-#define GAME_MODE_PSEUDO_PREVIEW 9
-#define GAME_MODE_PSEUDO_CRUMBLED 10
+#define GAME_MODE_TITLE 1
+#define GAME_MODE_MAIN 2
+#define GAME_MODE_LEVELS 3
+#define GAME_MODE_SCORES 4
+#define GAME_MODE_EDITOR 5
+#define GAME_MODE_INFO 6
+#define GAME_MODE_SETUP 7
+#define GAME_MODE_PLAYING 8
+#define GAME_MODE_PSEUDO_DOOR 9
+#define GAME_MODE_PSEUDO_PREVIEW 10
+#define GAME_MODE_PSEUDO_CRUMBLED 11
/* there are no special config file suffixes for these modes */
-#define GAME_MODE_PSEUDO_TYPENAME 11
-#define GAME_MODE_QUIT 12
+#define GAME_MODE_PSEUDO_TYPENAME 12
+#define GAME_MODE_QUIT 13
/* special definitions currently only used for custom artwork configuration */
#define MUSIC_PREFIX_BACKGROUND 0
int e[3][3];
};
+struct EnvelopeInfo
+{
+ int xsize;
+ int ysize;
+
+ char text[MAX_ENVELOPE_TEXT_LEN + 1];
+};
+
struct LevelSetInfo
{
int music[MAX_LEVELS];
char *filename;
};
+struct DateInfo
+{
+ int year;
+ int month;
+ int day;
+};
+
struct LevelInfo
{
struct LevelFileInfo file_info;
int file_version; /* file format version the level is stored with */
int game_version; /* game release version the level was created with */
+ struct DateInfo creation_date;
+
boolean encoding_16bit_field; /* level contains 16-bit elements */
boolean encoding_16bit_yamyam; /* yamyam contains 16-bit elements */
boolean encoding_16bit_amoeba; /* amoeba contains 16-bit elements */
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];
+ struct EnvelopeInfo envelope[NUM_ENVELOPES];
int score[LEVEL_SCORE_ELEMENTS];
int can_move_into_acid_bits; /* bitfield to store property for elements */
int dont_collide_with_bits; /* bitfield to store property for elements */
- int initial_player_stepsize; /* initial player speed */
+ int initial_player_stepsize[MAX_PLAYERS]; /* initial player speed */
+ boolean initial_player_gravity[MAX_PLAYERS];
- boolean initial_gravity;
boolean em_slippery_gems; /* EM style "gems slip from wall" behaviour */
boolean use_spring_bug; /* for compatibility with old levels */
boolean use_time_orb_bug; /* for compatibility with old levels */
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_xoffset; /* optional offset for drawing font chars */
+ int draw_yoffset; /* optional offset for drawing font chars */
int draw_masked; /* optional setting for drawing envelope gfx */
};
-extern Bitmap *bitmap_db_field, *bitmap_db_door;
+extern Bitmap *bitmap_db_title;
+extern Bitmap *bitmap_db_field;
+extern Bitmap *bitmap_db_door;
extern Pixmap tile_clipmask[];
-extern DrawBuffer *fieldbuffer;
-extern DrawBuffer *drawto_field;
+extern DrawBuffer *fieldbuffer;
+extern DrawBuffer *drawto_field;
extern int game_status;
extern boolean level_editor_test_game;