// constant definitions
// ----------------------------------------------------------------------------
+/* maximum cave size */
#define CAVE_WIDTH MAX_PLAYFIELD_WIDTH
#define CAVE_HEIGHT MAX_PLAYFIELD_HEIGHT
#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,
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,
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,
Xalpha_8,
Xalpha_9,
Xalpha_excla,
- Xalpha_quote,
+ Xalpha_apost,
Xalpha_comma,
Xalpha_minus,
Xalpha_perio,
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 */
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 */
// data structure definitions
// ----------------------------------------------------------------------------
-struct LEVEL
+/* structure used by logic() for gameplay */
+
+struct PLAYER
{
- int width; /* playfield width */
- int height; /* playfield height */
+ int num; /* player number */
+ int anim;
- int left; /* playfield left edge */
- int top; /* playfield top edge */
- int right; /* playfield right edge */
- int bottom; /* playfield bottom edge */
+ int x;
+ int y;
+ int prev_x;
+ int prev_y;
- int player_x[MAX_PLAYERS]; /* player x pos */
- int player_y[MAX_PLAYERS]; /* player y pos */
+ boolean exists; /* flag if player exists in cave */
+ boolean alive; /* flag if player is alive */
- int time_seconds; /* available time (seconds) */
- int time_initial; /* available time (initial) */
- int time; /* time remaining (runtime) */
+ 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 required_initial; /* emeralds needed (initial) */
- int required; /* emeralds needed (runtime) */
+ int last_move_dir;
- int score; /* score */
+ boolean joy_n;
+ boolean joy_e;
+ boolean joy_s;
+ boolean joy_w;
+ boolean joy_snap;
+ boolean joy_drop;
+ boolean joy_stick;
+};
- /* all below entries must be filled every time a level is read */
+struct LOGIC
+{
+ int width; /* cave width */
+ int height; /* cave height */
+
+ int left; /* cave left edge */
+ int top; /* cave top edge */
+ int right; /* cave right edge */
+ int bottom; /* cave bottom edge */
+
+ int time; /* time remaining */
+ int gems_needed; /* emeralds needed */
+ int score; /* score */
+ int eater_score; /* score for killing eater */
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 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 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 exit_score; /* score for entering exit */
+
+ 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 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 */
+ 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 table */
-
- short cave_raw[CAVE_WIDTH][CAVE_HEIGHT];
+ 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];
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