// constant definitions
// ----------------------------------------------------------------------------
-/* define these to use additional elements */
-#define EM_ENGINE_USE_ADDITIONAL_ELEMENTS
+#define CAVE_WIDTH MAX_PLAYFIELD_WIDTH
+#define CAVE_HEIGHT MAX_PLAYFIELD_HEIGHT
-/* 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)
+/* additional padding for Zborder elements and linked cave buffer columns */
+#define CAVE_BUFFER_XOFFSET 4
+#define CAVE_BUFFER_YOFFSET 2
+#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 have the following properties:
+ 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 elements
+ - elements that start with 'Y' indicate moving or active elements
- elements that end with 'B' are the "backside" of moving elements
-----------------------------------------------------------------------------
*/
{
Xblank = 0,
- Xacid_splash_e,
- Xacid_splash_w,
+ Xsplash_e,
+ Xsplash_w,
Xplant,
Yplant,
Xacid_7,
Xacid_8,
-#ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
- Xfake_acid_1,
+ Xfake_acid_1, /* newly added to EM engine */
Xfake_acid_2,
Xfake_acid_3,
Xfake_acid_4,
Xfake_acid_6,
Xfake_acid_7,
Xfake_acid_8,
-#endif
Xgrass,
Ygrass_nB,
Ydrip_2_sB,
Xwonderwall,
- XwonderwallB,
+ Ywonderwall,
Xwheel,
- XwheelB,
+ Ywheel,
Xswitch,
- XswitchB,
+ Yswitch,
Xbumper,
- XbumperB,
+ Ybumper,
Xacid_nw,
Xacid_ne,
Xacid_se,
Xfake_blank,
- Xfake_blankB,
+ Yfake_blank,
Xfake_grass,
- Xfake_grassB,
+ Yfake_grass,
- Xfake_amoeba, /* dripper */
- Xfake_amoebaB,
+ Xfake_amoeba, /* dripper */
+ Yfake_amoeba,
Xlenses,
Xsand_stonesand_4,
Xsand_stoneout_1,
Xsand_stoneout_2,
-#ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
- Xsand_stonesand_quickout_1,
+ Xsand_stonesand_quickout_1, /* newly added to EM engine */
Xsand_stonesand_quickout_2,
-#endif
- Xslidewall_ns, /* growing wall */
- Yslidewall_ns_blank,
- Xslidewall_ew,
- Yslidewall_ew_blank,
+ Xslide_ns, /* growing wall */
+ Yslide_ns_blank,
+ Xslide_ew,
+ Yslide_ew_blank,
Xwind_n,
Xwind_e,
Xexit_2,
Xexit_3,
+ Xpause,
+
Xwall_1,
Xwall_2,
Xwall_3,
Xalpha_arrow_w,
Xalpha_copyr,
-#ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
- Ykey_1_blank,
+ Ykey_1_blank, /* newly added to EM engine */
Ykey_2_blank,
Ykey_3_blank,
Ykey_4_blank,
Ymagnify_blank,
Ygrass_blank,
Ydirt_blank,
-#endif
Xboom_bug, /* passed from explode to synchro (linked explosion);
transition to explode_normal */
SOUND_dirt, /* player digs into dirt */
SOUND_acid, /* acid splashes */
SOUND_ball, /* ball places something */
- SOUND_slidewall, /* slide wall grows */
+ SOUND_slide, /* slide wall grows */
SOUND_wonder, /* wonderwall is active */
SOUND_door, /* player goes thru door (gate) */
SOUND_exit_open, /* exit opens */
// data structure definitions
// ----------------------------------------------------------------------------
-struct LEVEL
+struct LOGIC
{
- 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 width; /* cave width */
+ int height; /* cave 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 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 */
- /* all below entries must be filled every time a level is read */
-
+ 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 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_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 lenses_time; /* lenses reset time */
+ int magnify_time; /* magnify reset time */
int wind_time; /* wind reset time */
- int wonderwall_state_initial; /* wonderwall active flag (initial) */
+ 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 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 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 */
+
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 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 cavebuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
+ short nextbuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
+ short drawbuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
+ short boombuf[CAVE_BUFFER_WIDTH][CAVE_BUFFER_HEIGHT];
+
+ short *cavecol[CAVE_BUFFER_WIDTH];
+ short *nextcol[CAVE_BUFFER_WIDTH];
+ short *drawcol[CAVE_BUFFER_WIDTH];
+ short *boomcol[CAVE_BUFFER_WIDTH];
+
+ short **cave;
+ short **next;
+ short **draw;
+ short **boom;
};
struct PLAYER
int keys;
int anim;
- int x_initial;
- int y_initial;
int x;
int y;
int oldx;