rnd-20060304-1-src
[rocksndiamonds.git] / src / game_em / main_em.h
index 4523a2181c534e3526c008fef26f76f74d913619..cd931fcf7913dbac25fd77133c2e1e556d8cc519 100644 (file)
@@ -6,8 +6,14 @@
 
 /* 2000-07-30T11:06:03Z ---------------------------------------------------- */
 
+#if 1
+/* one border for ZBORDER elements, one border for steelwall, if needed */
+#define EM_MAX_CAVE_WIDTH              (MAX_PLAYFIELD_WIDTH  + 2 + 2)
+#define EM_MAX_CAVE_HEIGHT             (MAX_PLAYFIELD_HEIGHT + 2 + 2)
+#else
 #define EM_MAX_CAVE_WIDTH              102
 #define EM_MAX_CAVE_HEIGHT             102
+#endif
 
 /* define these for backwards compatibility */
 #define EM_ENGINE_BAD_ROLL
@@ -18,9 +24,9 @@
   -----------------------------------------------------------------------------
   definition of elements used in the Emerald Mine Club engine;
   the element names have the following properties:
-  - elements that start with an 'X' can be stored in a level file;
-  - elements that start with an 'Y' indicate moving elements;
-  - elements that end with a 'B' are the "backside" of a moving element.
+  - elements that start with 'X' can be stored in a level file
+  - elements that start with 'Y' indicate moving elements
+  - elements that end with 'B' are the "backside" of moving elements
   -----------------------------------------------------------------------------
 */
 
@@ -362,6 +368,18 @@ enum
   Xfake_door_6,
   Xfake_door_7,
   Xfake_door_8,
+
+#if 1
+  Xfake_acid_1,
+  Xfake_acid_2,
+  Xfake_acid_3,
+  Xfake_acid_4,
+  Xfake_acid_5,
+  Xfake_acid_6,
+  Xfake_acid_7,
+  Xfake_acid_8,
+#endif
+
   Xsteel_1,
   Xsteel_2,
   Xsteel_3,
@@ -474,10 +492,12 @@ enum
   SAMPLE_crack,                /* stone hits nut */
   SAMPLE_bug,          /* bug moves */
   SAMPLE_tank,         /* tank moves */
-  SAMPLE_android,      /* android places something */
+  SAMPLE_android_clone,        /* android places something */
+  SAMPLE_android_move, /* android moves */
   SAMPLE_spring,       /* spring hits ground/wall/bumper, stone hits spring */
   SAMPLE_slurp,                /* spring kills alien */
-  SAMPLE_eater,                /* eater sits/eats diamond */
+  SAMPLE_eater,                /* eater sits */
+  SAMPLE_eater_eat,    /* eater eats diamond */
   SAMPLE_alien,                /* alien moves */
   SAMPLE_collect,      /* player collects object */
   SAMPLE_diamond,      /* diamond/emerald hits ground */
@@ -491,7 +511,8 @@ enum
   SAMPLE_grow,         /* growing wall grows */
   SAMPLE_wonder,       /* wonderwall is active */
   SAMPLE_door,         /* player goes thru door (gate) */
-  SAMPLE_exit,         /* player goes into exit */
+  SAMPLE_exit_open,    /* exit opens */
+  SAMPLE_exit_leave,   /* player goes into exit */
   SAMPLE_dynamite,     /* player places dynamite */
   SAMPLE_tick,         /* dynamite ticks */
   SAMPLE_press,                /* player presses wheel/wind/switch */
@@ -505,106 +526,111 @@ enum
 
 struct LEVEL
 {
-  unsigned int home_initial;          /* number of players (initial) */
-  unsigned int home;                  /* number of players not yet at home */
-                                      /* 0 == all players at home */
-
-  unsigned int width;                 /* playfield width */
-  unsigned int height;                /* playfield height */
-
-  unsigned int time_seconds;          /* available time (seconds) */
-  unsigned int time_initial;          /* available time (initial) */
-  unsigned int time;                  /* time remaining (runtime) */
-
-  unsigned int required_initial;      /* emeralds needed (initial) */
-  unsigned int required;              /* emeralds needed (runtime) */
-
-  unsigned int score;                 /* score */
-
-  /* fill in all below /every/ time you read a level */
-  unsigned int alien_score;           /* alien popped by stone/spring score */
-  unsigned int amoeba_time;           /* amoeba speed */
-  unsigned int android_move_cnt_initial; /* android move time counter (initial) */
-  unsigned int android_move_cnt;      /* android move time counter */
-  unsigned int android_move_time;     /* android move reset time */
-  unsigned int android_clone_cnt_initial; /* android clone time counter (initial) */
-  unsigned int android_clone_cnt;     /* android clone time counter */
-  unsigned int android_clone_time;    /* android clone reset time */
-  unsigned int ball_cnt;              /* ball time counter */
-  unsigned int ball_pos;              /* ball array pos counter */
-  unsigned int ball_random;           /* ball is random flag */
-  unsigned int ball_state_initial;    /* ball currently on flag (initial) */
-  unsigned int ball_state;            /* ball currently on flag */
-  unsigned int ball_time;             /* ball reset time */
-  unsigned int bug_score;             /* bug popped by stone/spring score */
-  unsigned int diamond_score;         /* diamond collect score */
-  unsigned int dynamite_score;        /* dynamite collect scoer*/
-  unsigned int eater_pos;             /* eater array pos */
-  unsigned int eater_score;           /* eater popped by stone/spring score */
-  unsigned int emerald_score;         /* emerald collect score */
-  unsigned int exit_score;            /* exit score */
-  unsigned int key_score;             /* key collect score */
-  unsigned int lenses_cnt_initial;    /* lenses time counter (initial) */
-  unsigned int lenses_cnt;            /* lenses time counter */
-  unsigned int lenses_score;          /* lenses collect score */
-  unsigned int lenses_time;           /* lenses reset time */
-  unsigned int magnify_cnt_initial;   /* magnify time counter (initial) */
-  unsigned int magnify_cnt;           /* magnify time counter */
-  unsigned int magnify_score;         /* magnify collect score */
-  unsigned int magnify_time;          /* magnify reset time */
-  unsigned int nut_score;             /* nut crack score */
-  unsigned int shine_cnt;             /* shine counter for emerald/diamond */
-  unsigned int slurp_score;           /* slurp alien score */
-  unsigned int tank_score;            /* tank popped by stone/spring */
-  unsigned int wheel_cnt_initial;     /* wheel time counter (initial) */
-  unsigned int wheel_cnt;             /* wheel time counter */
-  unsigned int wheel_x_initial;       /* wheel x pos (initial) */
-  unsigned int wheel_x;               /* wheel x pos */
-  unsigned int wheel_y_initial;       /* wheel y pos (initial) */
-  unsigned int wheel_y;               /* wheel y pos */
-  unsigned int wheel_time;            /* wheel reset time */
-  unsigned int wind_cnt_initial;      /* wind time counter (initial) */
-  unsigned int wind_cnt;              /* wind time counter */
-  unsigned int wind_direction_initial;/* wind direction (initial) */
-  unsigned int wind_direction;        /* wind direction */
-  unsigned int wind_time;             /* wind reset time */
-  unsigned int wonderwall_state_initial; /* wonderwall currently on flag (initial) */
-  unsigned int wonderwall_state;      /* wonderwall currently on flag */
-  unsigned int wonderwall_time_initial;/* wonderwall time (initial) */
-  unsigned int wonderwall_time;       /* wonderwall time */
-  unsigned short eater_array[8][9];   /* eater data */
-  unsigned short ball_array[8][8];    /* ball data */
-  unsigned short android_array[TILE_MAX]; /* android clone table */
+  int home_initial;            /* number of players (initial) */
+  int home;                    /* number of players not yet at home */
+                               /* 0 == all players at home */
+
+  int width;                   /* playfield width */
+  int height;                  /* playfield height */
+
+  int time_seconds;            /* available time (seconds) */
+  int time_initial;            /* available time (initial) */
+  int time;                    /* time remaining (runtime) */
+
+  boolean killed_out_of_time;  /* kill player due to time out */
+
+  int required_initial;                /* emeralds needed (initial) */
+  int required;                        /* emeralds needed (runtime) */
+
+  int score;                   /* score */
+
+  /* all below entries must be filled every time a level is read */
+
+  int alien_score;             /* score for killing alien */
+  int amoeba_time;             /* amoeba speed */
+  int android_move_cnt_initial;        /* android move counter (initial) */
+  int android_move_cnt;                /* android move counter */
+  int android_move_time;       /* android move reset time */
+  int android_clone_cnt_initial;/* android clone counter (initial) */
+  int android_clone_cnt;       /* android clone counter */
+  int android_clone_time;      /* android clone reset time */
+  int ball_cnt;                        /* ball counter */
+  int ball_pos;                        /* ball array pos counter */
+  int ball_random;             /* ball is random flag */
+  int ball_state_initial;      /* ball active flag (initial) */
+  int ball_state;              /* ball active flag */
+  int ball_time;               /* ball reset time */
+  int bug_score;               /* score for killing bug */
+  int diamond_score;           /* score for collecting diamond */
+  int dynamite_score;          /* score for collecting dynamite */
+  int eater_pos;               /* eater array pos */
+  int eater_score;             /* score for killing eater */
+  int emerald_score;           /* score for collecting emerald */
+  int exit_score;              /* score for entering exit */
+  int key_score;               /* score for colleting key */
+  int lenses_cnt_initial;      /* lenses counter (initial) */
+  int lenses_cnt;              /* lenses counter */
+  int lenses_score;            /* score for collecting lenses */
+  int lenses_time;             /* lenses reset time */
+  int magnify_cnt_initial;     /* magnify counter (initial) */
+  int magnify_cnt;             /* magnify counter */
+  int magnify_score;           /* score for collecting magnifier */
+  int magnify_time;            /* magnify reset time */
+  int nut_score;               /* score for cracking nut */
+  int shine_cnt;               /* shine counter for emerald/diamond */
+  int slurp_score;             /* score for slurping alien */
+  int tank_score;              /* score for killing tank */
+  int wheel_cnt_initial;       /* wheel counter (initial) */
+  int wheel_cnt;               /* wheel counter */
+  int wheel_x_initial;         /* wheel x pos (initial) */
+  int wheel_x;                 /* wheel x pos */
+  int wheel_y_initial;         /* wheel y pos (initial) */
+  int wheel_y;                 /* wheel y pos */
+  int wheel_time;              /* wheel reset time */
+  int wind_cnt_initial;                /* wind counter (initial) */
+  int wind_cnt;                        /* wind time counter */
+  int wind_direction_initial;  /* wind direction (initial) */
+  int wind_direction;          /* wind direction */
+  int wind_time;               /* wind reset time */
+  int wonderwall_state_initial;        /* wonderwall active flag (initial) */
+  int wonderwall_state;                /* wonderwall active flag */
+  int wonderwall_time_initial; /* wonderwall time (initial) */
+  int wonderwall_time;         /* wonderwall time */
+  short eater_array[8][9];     /* eater data */
+  short ball_array[8][8];      /* ball data */
+  short android_array[TILE_MAX];/* android clone table */
+  int num_ball_arrays;         /* number of ball data arrays used */
 };
 
 struct PLAYER
 {
-  unsigned int num;
-  unsigned int alive_initial;
-  unsigned int alive;
-
-  unsigned int dynamite;
-  unsigned int dynamite_cnt;
-  unsigned int keys;
-  unsigned int anim;
-
-  unsigned int x_initial;
-  unsigned int y_initial;
-  unsigned int x;
-  unsigned int y;
-  unsigned int oldx;
-  unsigned int oldy;
-
-  unsigned int last_move_dir;
-
-  unsigned joy_n:1;
-  unsigned joy_e:1;
-  unsigned joy_s:1;
-  unsigned joy_w:1;
-  unsigned joy_snap:1;
-  unsigned joy_drop:1;
-  unsigned joy_stick:1;
-  unsigned joy_spin:1;
+  int num;
+  int exists;
+  int alive_initial;
+  int alive;
+
+  int dynamite;
+  int dynamite_cnt;
+  int keys;
+  int anim;
+
+  int x_initial;
+  int y_initial;
+  int x;
+  int y;
+  int oldx;
+  int oldy;
+
+  int last_move_dir;
+
+  int joy_n:1;
+  int joy_e:1;
+  int joy_s:1;
+  int joy_w:1;
+  int joy_snap:1;
+  int joy_drop:1;
+  int joy_stick:1;
+  int joy_spin:1;
 };
 
 
@@ -625,14 +651,21 @@ struct GlobalInfo_EM
   Bitmap *screenbuffer;
 };
 
+struct GameInfo_EM
+{
+  boolean any_player_moving;
+  int last_moving_player;
+  int last_player_direction[MAX_PLAYERS];
+};
+
 struct LevelInfo_EM
 {
   int file_version;
 
-  struct LEVEL *lev;
-  struct PLAYER *ply1, *ply2;
+  short cave[EM_MAX_CAVE_WIDTH][EM_MAX_CAVE_HEIGHT];
 
-  unsigned short cave[EM_MAX_CAVE_WIDTH][EM_MAX_CAVE_HEIGHT];
+  struct LEVEL *lev;
+  struct PLAYER *ply[MAX_PLAYERS];
 };
 
 struct GraphicInfo_EM
@@ -643,12 +676,16 @@ struct GraphicInfo_EM
   int dst_offset_x, dst_offset_y;
   int width, height;
 
-  boolean has_crumbled_graphics;
   Bitmap *crumbled_bitmap;
   int crumbled_src_x, crumbled_src_y;
   int crumbled_border_size;
 
+  boolean has_crumbled_graphics;
+  boolean preserve_background;
+
   int unique_identifier;       /* used to identify needed screen updates */
 };
 
+extern struct GameInfo_EM game_em;
+
 #endif /* MAIN_EM_H */