fixed handling of player at fake acid for EM engine
[rocksndiamonds.git] / src / game_em / emerald.h
index 13854ac2868da25bccbf798eeec5f920d5efd532..01219b9ea9726f4a9d743f70117ad05f8aced617 100644 (file)
@@ -48,6 +48,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 // constant definitions
 // ----------------------------------------------------------------------------
 
+/* maximum cave size */
 #define CAVE_WIDTH                     MAX_PLAYFIELD_WIDTH
 #define CAVE_HEIGHT                    MAX_PLAYFIELD_HEIGHT
 
@@ -57,19 +58,35 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #define CAVE_BUFFER_WIDTH              (CAVE_WIDTH  + 2 * CAVE_BUFFER_XOFFSET)
 #define CAVE_BUFFER_HEIGHT             (CAVE_HEIGHT + 2 * CAVE_BUFFER_YOFFSET)
 
-/*
-  -----------------------------------------------------------------------------
-  definition of elements used in the Emerald Mine Club engine;
-  the element names (mostly) have the following properties:
-  - elements that start with 'X' can be stored in a level file
-  - elements that start with 'Y' indicate moving or active elements
-  - elements that end with 'B' are the "backside" of moving elements
-  -----------------------------------------------------------------------------
-*/
+
+// ----------------------------------------------------------------------------
+// definition of elements used in the Emerald Mine Club engine;
+// the element names (mostly) have the following properties:
+// - elements that start with 'X' are not animated (more or less)
+// - elements that start with 'Y' are animated elements
+// - elements that start with 'Z' are internal elements (without graphics)
+// - elements that end with 'B' or '_blank' change to the "Xblank" element
+// ----------------------------------------------------------------------------
 
 enum
 {
-  Xblank = 0,
+  Zborder,             /* special code to indicate border */
+  Zplayer,             /* special code to indicate player */
+
+  Zbug,                        /* internal bug explosion */
+  Ztank,               /* internal tank/alien/bomb explosion */
+  Zeater,              /* internal eater explosion */
+  Zdynamite,           /* internal dynamite explosion */
+  Zboom,               /* explosion */
+
+  Xchain,              /* chain explosion; transition to Zboom */
+  Xboom_bug,           /* bug explosion; transition to Zbug */
+  Xboom_tank,          /* tank/alien/bomb explosion; transition to Ztank */
+  Xboom_android,       /* android explosion; transition to Xboom_2 */
+  Xboom_1,             /* tile explosion; transition to Xboom_2 */
+  Xboom_2,             /* transition to boom[] */
+
+  Xblank,
 
   Xsplash_e,
   Xsplash_w,
@@ -95,6 +112,15 @@ enum
   Xfake_acid_7,
   Xfake_acid_8,
 
+  Xfake_acid_1_player,         /* newly added to EM engine */
+  Xfake_acid_2_player,
+  Xfake_acid_3_player,
+  Xfake_acid_4_player,
+  Xfake_acid_5_player,
+  Xfake_acid_6_player,
+  Xfake_acid_7_player,
+  Xfake_acid_8_player,
+
   Xgrass,
   Ygrass_nB,
   Ygrass_eB,
@@ -109,12 +135,12 @@ enum
 
   Xandroid,
   Xandroid_1_n,
-  Xandroid_2_n,
   Xandroid_1_e,
-  Xandroid_2_e,
   Xandroid_1_w,
-  Xandroid_2_w,
   Xandroid_1_s,
+  Xandroid_2_n,
+  Xandroid_2_e,
+  Xandroid_2_w,
   Xandroid_2_s,
   Yandroid_n,
   Yandroid_nB,
@@ -477,7 +503,7 @@ enum
   Xalpha_8,
   Xalpha_9,
   Xalpha_excla,
-  Xalpha_quote,
+  Xalpha_apost,
   Xalpha_comma,
   Xalpha_minus,
   Xalpha_perio,
@@ -526,26 +552,7 @@ enum
   Ygrass_blank,
   Ydirt_blank,
 
-  Xboom_bug,           /* passed from explode to synchro (linked explosion);
-                          transition to explode_normal */
-  Xboom_bomb,          /* passed from explode to synchro (linked explosion);
-                          transition to explode_normal */
-  Xboom_android,       /* passed from explode to synchro;
-                          transition to boom_2 */
-  Xboom_1,             /* passed from explode to synchro;
-                          transition to boom_2 */
-  Xboom_2,             /* transition to boom[] */
-
-  Znormal,             /* passed from synchro to explode, only in next[];
-                          no picture */
-  Zdynamite,           /* passed from synchro to explode, only in next[];
-                          no picture */
-  Zplayer,             /* special code to indicate player;
-                          no picture */
-  Zborder,             /* special code to indicate border;
-                          no picture */
-
-  TILE_MAX
+  GAME_TILE_MAX
 };
 
 /* other definitions */
@@ -574,7 +581,7 @@ enum
 
 enum
 {
-  SOUND_blank = 0,     /* player walks on blank */
+  SOUND_blank,         /* player walks on blank */
   SOUND_roll,          /* player pushes stone/bomb/nut/spring */
   SOUND_stone,         /* stone hits ground */
   SOUND_nut,           /* nut hits ground */
@@ -618,6 +625,36 @@ enum
 // data structure definitions
 // ----------------------------------------------------------------------------
 
+/* structure used by logic() for gameplay */
+
+struct PLAYER
+{
+  int num;                     /* player number */
+  int anim;
+
+  int x;
+  int y;
+  int prev_x;
+  int prev_y;
+
+  boolean exists;              /* flag if player exists in cave */
+  boolean alive;               /* flag if player is alive */
+
+  int dynamite;                        /* number of pieces of collected dynamite */
+  int dynamite_cnt;            /* how long the player has held down fire */
+  int keys;                    /* keys the player has collected */
+
+  int last_move_dir;
+
+  boolean joy_n;
+  boolean joy_e;
+  boolean joy_s;
+  boolean joy_w;
+  boolean joy_snap;
+  boolean joy_drop;
+  boolean joy_stick;
+};
+
 struct LOGIC
 {
   int width;                   /* cave width */
@@ -629,64 +666,68 @@ struct LOGIC
   int bottom;                  /* cave bottom edge */
 
   int time;                    /* time remaining */
-  int required;                        /* emeralds needed */
+  int gems_needed;             /* emeralds needed */
   int score;                   /* score */
 
   int eater_score;             /* score for killing eater */
   int alien_score;             /* score for killing alien */
   int bug_score;               /* score for killing bug */
   int tank_score;              /* score for killing tank */
+  int slurp_score;             /* score for slurping alien with spring */
+  int nut_score;               /* score for cracking nut to emerald */
   int emerald_score;           /* score for collecting emerald */
   int diamond_score;           /* score for collecting diamond */
-  int nut_score;               /* score for cracking nut */
-  int slurp_score;             /* score for slurping alien with spring */
   int dynamite_score;          /* score for collecting dynamite */
   int key_score;               /* score for colleting key */
   int lenses_score;            /* score for collecting lenses */
   int magnify_score;           /* score for collecting magnifier */
   int exit_score;              /* score for entering exit */
 
-  int android_move_time;       /* android move reset time */
-  int android_clone_time;      /* android clone reset time */
-  int ball_time;               /* ball reset time */
-  int amoeba_time;             /* amoeba speed */
-  int wonderwall_time;         /* wonderwall time */
-  int wheel_time;              /* wheel reset time */
-  int wheel_x;                 /* wheel x pos */
-  int wheel_y;                 /* wheel y pos */
-  int lenses_time;             /* lenses reset time */
-  int magnify_time;            /* magnify reset time */
-  int wind_time;               /* wind reset time */
+  int android_move_time;       /* reset time for android movement */
+  int android_clone_time;      /* reset time for android cloning */
+  int ball_time;               /* reset time for ball activity */
+  int amoeba_time;             /* amoeba growth speed */
+  int wonderwall_time;         /* reset time for wonderwall activity */
+  int wheel_time;              /* reset time for wheel activity */
+  int wheel_x;                 /* wheel x position */
+  int wheel_y;                 /* wheel y position */
+  int lenses_time;             /* reset time for lenses activity */
+  int magnify_time;            /* reset time for magnifier activity */
+  int wind_time;               /* reset time for wind activity */
   int wind_direction;          /* wind direction */
 
-  int ball_random;             /* ball is random flag */
-  int ball_state;              /* ball active flag */
-  int wonderwall_state;                /* wonderwall active flag */
-  int wheel_cnt;               /* wheel counter */
-  int lenses_cnt;              /* lenses counter */
-  int magnify_cnt;             /* magnify counter */
-  int wind_cnt;                        /* wind time counter */
-
-  int android_move_cnt;                /* android move counter */
-  int android_clone_cnt;       /* android clone counter */
-  int ball_cnt;                        /* ball counter */
-  int ball_pos;                        /* ball array pos counter */
-  int eater_pos;               /* eater array pos */
-  int shine_cnt;               /* shine counter for emerald/diamond */
-
+  boolean ball_random;         /* flag if ball is random */
+  boolean ball_active;         /* flag if ball is already active */
+  boolean wonderwall_active;   /* flag if wonderwall is already active */
+
+  int wheel_cnt;               /* counter for wheel activity */
+  int lenses_cnt;              /* counter for lenses activity */
+  int magnify_cnt;             /* counter for magnifier activity */
+  int wind_cnt;                        /* counter for wind activity */
+  int android_move_cnt;                /* counter for android movement */
+  int android_clone_cnt;       /* counter for android cloning */
+  int ball_cnt;                        /* counter for ball activity */
+  int ball_pos;                        /* counter for ball array position */
+  int eater_pos;               /* counter for eater array position */
+  int shine_cnt;               /* counter for emerald/diamond shining */
+
+  int num_eater_arrays;                /* number of eater data arrays used */
   int num_ball_arrays;         /* number of ball data arrays used */
 
   int home_initial;            /* number of players (initial) */
   int home;                    /* number of players not yet at home */
                                /* 0 == all players at home */
 
+  boolean testmode;            /* test mode */
+  boolean infinite;            /* flag for infinitely wide cave */
+  boolean infinite_true;       /* flag for truely infinitely wide cave */
   boolean killed_out_of_time;  /* kill player due to time out */
 
   int exit_x, exit_y;          /* kludge for playing player exit sound */
 
   short eater_array[8][9];             /* eater data */
   short ball_array[8][8];              /* ball data */
-  short android_array[TILE_MAX];       /* android clone data */
+  short android_array[GAME_TILE_MAX];  /* android clone data */
 
   short cavebuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
   short nextbuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
@@ -704,33 +745,4 @@ struct LOGIC
   short **boom;
 };
 
-struct PLAYER
-{
-  int num;
-  int exists;
-  int alive_initial;
-  int alive;
-
-  int dynamite;
-  int dynamite_cnt;
-  int keys;
-  int anim;
-
-  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;
-};
-
 #endif // EMERALD_H