-#define COMPILE_DATE_STRING "[2004-09-16 00:59]"
+#define COMPILE_DATE_STRING "[2004-09-17 20:19]"
/* functions for loading EM level */
/* ------------------------------------------------------------------------- */
+#if 0
+
static int map_em_element_yam(int element)
{
switch (element)
#define EM_LEVEL_XSIZE 64
#define EM_LEVEL_YSIZE 32
-static void LoadLevelFromFileInfo_EM(struct LevelInfo *level,
- struct LevelFileInfo *level_file_info)
+static void OLD_LoadLevelFromFileInfo_EM(struct LevelInfo *level,
+ struct LevelFileInfo *level_file_info)
{
char *filename = level_file_info->filename;
FILE *file;
unsigned char leveldata[EM_LEVEL_SIZE];
unsigned char *header = &leveldata[EM_LEVEL_XSIZE * EM_LEVEL_YSIZE];
- unsigned char code0 = 0x65;
- unsigned char code1 = 0x11;
- boolean level_is_crypted = FALSE;
int nr = level_file_info->nr;
int i, x, y;
return;
}
- for(i = 0; i < EM_LEVEL_SIZE; i++)
+ for (i = 0; i < EM_LEVEL_SIZE; i++)
leveldata[i] = fgetc(file);
fclose(file);
if ((leveldata[0] == 0xf1 ||
leveldata[0] == 0xf5) && leveldata[2] == 0xe7 && leveldata[3] == 0xee)
{
- level_is_crypted = TRUE;
+ unsigned char code0 = 0x65;
+ unsigned char code1 = 0x11;
if (leveldata[0] == 0xf5) /* error in crypted Emerald Mine 2 levels */
leveldata[0] = 0xf1;
- }
- if (level_is_crypted) /* decode crypted level data */
- {
- for(i = 0; i < EM_LEVEL_SIZE; i++)
+ /* decode crypted level data */
+
+ for (i = 0; i < EM_LEVEL_SIZE; i++)
{
leveldata[i] ^= code0;
leveldata[i] -= code1;
- code0 = (code0 + 7) & 0xff;
+ code0 = (code0 + 7) & 0xff;
}
}
level->num_yamyam_contents = 4;
- for(i = 0; i < level->num_yamyam_contents; i++)
- for(y = 0; y < 3; y++)
- for(x = 0; x < 3; x++)
+ for (i = 0; i < level->num_yamyam_contents; i++)
+ for (y = 0; y < 3; y++)
+ for (x = 0; x < 3; x++)
level->yamyam_content[i][x][y] =
map_em_element_yam(header[i * 9 + y * 3 + x]);
level->field[x][y] = EL_PLAYER_2;
}
+#else
+
+static void LoadLevelFromFileInfo_EM(struct LevelInfo *level,
+ struct LevelFileInfo *level_file_info)
+{
+ if (!LoadNativeLevel_EM(level_file_info->filename))
+ level->no_valid_file = TRUE;
+}
+
+#endif
+
+
/* ------------------------------------------------------------------------- */
/* functions for loading SP level */
/* ------------------------------------------------------------------------- */
level->time_wheel = 0;
level->amoeba_content = EL_EMPTY;
- for(i = 0; i < LEVEL_SCORE_ELEMENTS; i++)
+ for (i = 0; i < LEVEL_SCORE_ELEMENTS; i++)
level->score[i] = 0; /* !!! CORRECT THIS !!! */
/* there are no yamyams in supaplex levels */
- for(i = 0; i < level->num_yamyam_contents; i++)
- for(y = 0; y < 3; y++)
- for(x = 0; x < 3; x++)
+ for (i = 0; i < level->num_yamyam_contents; i++)
+ for (y = 0; y < 3; y++)
+ for (x = 0; x < 3; x++)
level->yamyam_content[i][x][y] = EL_EMPTY;
}
struct cave_node *cave_list;
-static void clear(void);
+static void setLevelInfoToDefaults_EM(void)
+{
+ lev.width = 64;
+ lev.height = 32;
+
+ ply1.x_initial = 0;
+ ply1.y_initial = 0;
+
+ ply2.x_initial = 0;
+ ply2.y_initial = 0;
+}
+
/* attempt load a cave
*
* completely initializes the level structure, ready for a game
*/
-int cave_convert(char *filename)
+int OLD_cave_convert(char *filename)
{
int result;
FILE *file;
int actual;
- unsigned long length;
+ int length;
unsigned char buffer[16384];
- clear();
+ /* always start with reliable default values */
+ setLevelInfoToDefaults_EM();
file = fopen(filename, "rb");
if (file == 0)
fclose(file);
file = 0;
- if (clean_emerald(buffer, &length))
+ if (!cleanup_em_level(buffer, &length))
{
fprintf(stderr, "%s: \"%s\": %s\n", progname, filename,
"unrecognized format");
goto fail;
}
- convert_emerald(buffer);
+ convert_em_level(buffer);
+ prepare_em_level();
result = 0;
return(result);
}
-static void clear(void)
+#define MAX_EM_LEVEL_SIZE 16384
+
+boolean LoadNativeLevel_EM(char *filename)
{
- lev.home = 1; /* number of players */
- lev.width = 0;
- lev.height = 0;
- lev.time = 0;
- lev.required = 0;
- lev.score = 0;
-
- ply1.num = 0;
- ply1.alive = (lev.home >= 1);
- ply1.dynamite = 0;
- ply1.dynamite_cnt = 0;
- ply1.keys = 0;
- ply1.anim = 0;
- ply1.oldx = ply1.x = 0;
- ply1.oldy = ply1.y = 0;
- ply1.joy_n = ply1.joy_e = ply1.joy_s = ply1.joy_w = ply1.joy_fire = 0;
- ply1.joy_stick = ply1.joy_spin = 0;
- ply2.num = 1;
- ply2.alive = (lev.home >= 2);
- ply2.dynamite = 0;
- ply2.dynamite_cnt = 0;
- ply2.keys = 0;
- ply2.anim = 0;
- ply2.oldx = ply2.x = 0;
- ply2.oldy = ply2.y = 0;
- ply2.joy_n = ply2.joy_e = ply2.joy_s = ply2.joy_w = ply2.joy_fire = 0;
- ply2.joy_stick = ply2.joy_spin = 0;
+ unsigned char raw_leveldata[MAX_EM_LEVEL_SIZE];
+ int raw_leveldata_length;
+ FILE *file;
+
+ /* always start with reliable default values */
+ setLevelInfoToDefaults_EM();
+
+ if (!(file = fopen(filename, MODE_READ)))
+ {
+ Error(ERR_WARN, "cannot open level '%s' -- using empty level", filename);
+
+ return FALSE;
+ }
+
+ raw_leveldata_length = fread(raw_leveldata, 1, MAX_EM_LEVEL_SIZE, file);
+
+ fclose(file);
+
+ if (raw_leveldata_length <= 0)
+ {
+ Error(ERR_WARN, "cannot read level '%s' -- using empty level", filename);
+
+ return FALSE;
+ }
+
+ if (!cleanup_em_level(raw_leveldata, &raw_leveldata_length))
+ {
+ Error(ERR_WARN, "unknown EM level '%s' -- using empty level", filename);
+
+ return FALSE;
+ }
+
+ convert_em_level(raw_leveldata);
+ prepare_em_level();
+
+ return TRUE;
}
void read_cave_list(void)
* inconsequential, but no doubt it will break some caves.
*/
+#include "global.h"
#include "tile.h"
#include "level.h"
146,147,175,65,66,64,2,18
};
-int clean_emerald(unsigned char *src, unsigned long *length)
+boolean cleanup_em_level(unsigned char *src, int *length)
{
unsigned int i;
goto v3;
}
- return 1; /* unrecognized cave */
+ return FALSE; /* unrecognized cave */
v3:
v4:
for (i = 0; i < 2048; i++)
if (src[i] == 40)
break;
-
for (i++; i < 2048; i++)
if (src[i] == 40)
src[i] = 147;
/* size of v6 cave */
*length = 2172;
- return 0;
+ return TRUE;
}
/* 2000-07-30T00:26:00Z
Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank, Xblank,
};
-void convert_emerald(unsigned char *src)
+void convert_em_level(unsigned char *src)
{
unsigned int x, y, temp;
- lev.width = 64;
- lev.height = 32;
-
temp = ((src[0x83E] << 8 | src[0x83F]) * 25 + 3) / 4;
if (temp == 0 || temp > 9999)
temp = 9999;
- lev.time = temp;
- lev.required = src[0x82F];
+ lev.time_initial = temp;
+ lev.required_initial = src[0x82F];
temp = src[0x830] << 8 | src[0x831];
- ply1.oldx = ply1.x = (temp & 63) + 1;
- ply1.oldy = ply1.y = (temp >> 6 & 31) + 1;
+ ply1.x_initial = (temp & 63) + 1;
+ ply1.y_initial = (temp >> 6 & 31) + 1;
temp = src[0x832] << 8 | src[0x833];
- ply2.oldx = ply2.x = (temp & 63) + 1;
- ply2.oldy = ply2.y = (temp >> 6 & 31) + 1;
-
- lev.alien_score = src[0x826];
+ ply2.x_initial = (temp & 63) + 1;
+ ply2.y_initial = (temp >> 6 & 31) + 1;
temp = (src[0x834] << 8 | src[0x835]) * 28;
if (temp > 9999)
temp = 9999;
lev.ameuba_time = temp;
- lev.android_move_cnt = lev.android_move_time = src[0x874] << 8 | src[0x875];
- lev.android_clone_cnt= lev.android_clone_time = src[0x876] << 8 | src[0x877];
- lev.ball_pos = 0;
+
+ lev.android_move_time = src[0x874] << 8 | src[0x875];
+ lev.android_clone_time = src[0x876] << 8 | src[0x877];
+
lev.ball_random = src[0x872] & 1 ? 1 : 0;
- lev.ball_state = src[0x872] & 128 ? 1 : 0;
- lev.ball_cnt = lev.ball_time = src[0x870] << 8 | src[0x871];
- lev.bug_score = src[0x828];
+ lev.ball_state_initial = src[0x872] & 128 ? 1 : 0;
+ lev.ball_time = src[0x870] << 8 | src[0x871];
+
+ lev.emerald_score = src[0x824];
lev.diamond_score = src[0x825];
- lev.dynamite_score = src[0x82B];
- lev.eater_pos = 0;
+ lev.alien_score = src[0x826];
+ lev.tank_score = src[0x827];
+ lev.bug_score = src[0x828];
lev.eater_score = src[0x829];
- lev.emerald_score = src[0x824];
- lev.exit_score = src[0x82D] * 8 / 5;
+ lev.nut_score = src[0x82A];
+ lev.dynamite_score = src[0x82B];
lev.key_score = src[0x82C];
- lev.lenses_cnt = 0;
+ lev.exit_score = src[0x82D] * 8 / 5;
lev.lenses_score = src[0x867];
- lev.lenses_time = src[0x86A] << 8 | src[0x86B];
- lev.magnify_cnt = 0;
lev.magnify_score = src[0x868];
- lev.magnify_time = src[0x86C] << 8 | src[0x86D];
- lev.nut_score = src[0x82A];
- lev.shine_cnt = 0;
lev.slurp_score = src[0x869];
- lev.tank_score = src[0x827];
- lev.wheel_cnt = 0;
- lev.wheel_x = 1;
- lev.wheel_y = 1;
+
+ lev.lenses_time = src[0x86A] << 8 | src[0x86B];
+ lev.lenses_cnt_initial = 0;
+
+ lev.magnify_time = src[0x86C] << 8 | src[0x86D];
+ lev.magnify_cnt_initial = 0;
+
lev.wheel_time = src[0x838] << 8 | src[0x839];
- lev.wind_cnt = src[0x865] & 15 ? 9999 : 0;
- temp = src[0x865];
- lev.wind_direction = (temp & 8 ? 0 :
- temp & 1 ? 1 :
- temp & 2 ? 2 :
- temp & 4 ? 3 : 0);
+ lev.wheel_cnt_initial = 0;
+ lev.wheel_x_initial = 1;
+ lev.wheel_y_initial = 1;
+
lev.wind_time = 9999;
- lev.wonderwall_state = 0;
- lev.wonderwall_time = src[0x836] << 8 | src[0x837];
+ lev.wind_cnt_initial = src[0x865] & 15 ? lev.wind_time : 0;
+ temp = src[0x865];
+ lev.wind_direction_initial = (temp & 8 ? 0 :
+ temp & 1 ? 1 :
+ temp & 2 ? 2 :
+ temp & 4 ? 3 : 0);
+
+ lev.wonderwall_state_initial = 0;
+ lev.wonderwall_time_initial = src[0x836] << 8 | src[0x837];
for (x = 0; x < 9; x++)
lev.eater_array[0][x] = remap_emerald[src[0x800 + x]];
switch (src[temp])
{
case 0x24: /* wonderwall */
- lev.wonderwall_state = 1;
- lev.wonderwall_time = 9999;
+ lev.wonderwall_state_initial = 1;
+ lev.wonderwall_time_initial = 9999;
break;
case 0x28: /* wheel */
- lev.wheel_x = temp & 63;
- lev.wheel_y = temp >> 6;
- lev.wheel_cnt = lev.wheel_time;
+ lev.wheel_x_initial = temp & 63;
+ lev.wheel_y_initial = temp >> 6;
+ lev.wheel_cnt_initial = lev.wheel_time;
break;
#ifndef BAD_ROLL
#endif
case 0xA3: /* fake blank */
- lev.lenses_cnt = 9999;
+ lev.lenses_cnt_initial = 9999;
break;
case 0xA4: /* fake grass */
- lev.magnify_cnt = 9999;
+ lev.magnify_cnt_initial = 9999;
break;
}
}
+ lev.home_initial = 1; /* initial number of players in this level */
+
+ ply1.alive_initial = (lev.home_initial >= 1);
+ ply2.alive_initial = (lev.home_initial >= 2);
+
+ /* first fill the complete playfield with the default border element */
for (y = 0; y < HEIGHT; y++)
for (x = 0; x < WIDTH; x++)
- Cave[y][x] = ZBORDER;
+ native_em_level.cave[x][y] = ZBORDER;
+ /* then copy the real level contents from level file into the playfield */
temp = 0;
for (y = 0; y < lev.height; y++)
for (x = 0; x < lev.width; x++)
- Cave[y+1][x+1] = remap_emerald[src[temp++]];
+ native_em_level.cave[x + 1][y + 1] = remap_emerald[src[temp++]];
- if (ply1.alive)
- Cave[ply1.y][ply1.x] = Zplayer;
- if (ply2.alive)
- Cave[ply2.y][ply2.x] = Zplayer;
+ /* at last, set the two players at their positions in the playfield */
+ if (ply1.alive_initial)
+ native_em_level.cave[ply1.x_initial][ply1.y_initial] = Zplayer;
+ if (ply2.alive_initial)
+ native_em_level.cave[ply2.x_initial][ply2.y_initial] = Zplayer;
+}
+
+void prepare_em_level(void)
+{
+ unsigned int x, y;
+
+ /* reset all runtime variables to their initial values */
+
+ for (y = 0; y < HEIGHT; y++)
+ for (x = 0; x < WIDTH; x++)
+ Cave[y][x] = native_em_level.cave[x][y];
for (y = 0; y < HEIGHT; y++)
for (x = 0; x < WIDTH; x++)
for (y = 0; y < HEIGHT; y++)
for (x = 0; x < WIDTH; x++)
Draw[y][x] = Cave[y][x];
+
+ lev.time = lev.time_initial;
+ lev.required = lev.required_initial;
+ lev.score = 0;
+
+ lev.android_move_cnt = lev.android_move_time;
+ lev.android_clone_cnt = lev.android_clone_time;
+
+ lev.ball_pos = 0;
+ lev.ball_state = lev.ball_state_initial;
+ lev.ball_cnt = lev.ball_time;
+
+ lev.eater_pos = 0;
+ lev.shine_cnt = 0;
+
+ lev.lenses_cnt = lev.lenses_cnt_initial;
+ lev.magnify_cnt = lev.magnify_cnt_initial;
+
+ lev.wheel_cnt = lev.wheel_cnt_initial;
+ lev.wheel_x = lev.wheel_x_initial;
+ lev.wheel_y = lev.wheel_y_initial;
+
+ lev.wind_cnt = lev.wind_cnt_initial;
+ lev.wind_direction = lev.wind_direction_initial;
+
+ lev.wonderwall_state = lev.wonderwall_state_initial;
+ lev.wonderwall_time = lev.wonderwall_time_initial;
+
+ lev.home = lev.home_initial;
+
+ ply1.num = 0;
+ ply1.alive = ply1.alive_initial;
+ ply1.dynamite = 0;
+ ply1.dynamite_cnt = 0;
+ ply1.keys = 0;
+ ply1.anim = 0;
+ ply1.oldx = ply1.x = ply1.x_initial;
+ ply1.oldy = ply1.y = ply1.y_initial;
+ ply1.joy_n = ply1.joy_e = ply1.joy_s = ply1.joy_w = ply1.joy_fire = 0;
+ ply1.joy_stick = ply1.joy_spin = 0;
+
+ ply2.num = 1;
+ ply2.alive = ply2.alive_initial;
+ ply2.dynamite = 0;
+ ply2.dynamite_cnt = 0;
+ ply2.keys = 0;
+ ply2.anim = 0;
+ ply2.oldx = ply2.x = ply2.x_initial;
+ ply2.oldy = ply2.y = ply2.y_initial;
+ ply2.joy_n = ply2.joy_e = ply2.joy_s = ply2.joy_w = ply2.joy_fire = 0;
+ ply2.joy_stick = ply2.joy_spin = 0;
}
#endif
/* ========================================================================= */
-/* functions exported from main program to game_em */
+/* functions and definitions imported from main program to game_em */
/* ========================================================================= */
#include "../libgame/libgame.h"
/* ========================================================================= */
-/* functions exported from game_em to main program */
+/* functions and definitions exported from game_em to main program */
/* ========================================================================= */
+#include "main_em.h"
+
extern void em_open_all();
extern void em_close_all();
extern int em_main_init_game(int, char *);
extern int em_main_handle_game(byte);
+boolean LoadNativeLevel_EM(char *);
+
-#endif /* GAME_EM_H */
+#endif /* GAME_EM_H */
void sound_play(void);
-int cave_convert(char *filename);
+int cave_convert(char *);
+boolean LoadNativeLevel_EM(char *);
void game_init_vars(void);
int game_play_init(int, char *);
void synchro_2(void);
void synchro_3(void);
-int clean_emerald(unsigned char *src, unsigned long *length);
-void convert_emerald(unsigned char *src);
+boolean cleanup_em_level(unsigned char *src, int *length);
+void convert_em_level(unsigned char *src);
+void prepare_em_level(void);
int sound_thread(void);
int read_sample(char *name, short **data, long *length);
#if defined(PLATFORM_LINUX) || defined(PLATFORM_BSD)
+#if 1
+ /* disable sound */
+ arg_silence = 1;
+#endif
+
if (arg_silence == 0)
{
for (i = 0; i < SAMPLE_MAX; i++)
struct PLAYER ply2;
struct LEVEL lev;
+struct LevelInfo_EM native_em_level;
+
unsigned short **Boom;
unsigned short **Cave;
unsigned short **Next;
int game_play_init(int level_nr, char *filename)
{
+#if 0
if (filename != NULL)
{
+#endif
+
player_level = level_nr;
- if (cave_convert(filename) != 0)
+#if 1
+ prepare_em_level();
+#else
+ if (!LoadNativeLevel_EM(filename))
return 1;
+#endif
+
+#if 0
}
else /* !!! SOON OBSOLETE !!! */
{
if (cave_convert(name) != 0)
return 1;
}
+#endif
game_initscreen();
game_blitscore();
#ifndef LEVEL_H
#define LEVEL_H
+#include "main_em.h"
#include "tile.h"
-#define WIDTH 102
-#define HEIGHT 102
+#define WIDTH EM_MAX_CAVE_WIDTH
+#define HEIGHT EM_MAX_CAVE_HEIGHT
+
+#if 0
struct LEVEL
{
unsigned joy_spin:1;
};
+#endif
+
extern unsigned long Random;
extern struct PLAYER ply1;
extern struct PLAYER ply2;
extern struct LEVEL lev;
+extern struct LevelInfo_EM native_em_level;
+
extern unsigned short **Boom;
extern unsigned short **Cave;
extern unsigned short **Next;
int em_main_init_game(int level_nr, char *filename)
{
+#if 0
if (skip_menu)
{
+#endif
+
em_game_status = EM_GAME_STATUS_PLAY;
if (game_play_init(level_nr, filename) != 0)
return 1;
+
+#if 0
}
else
{
em_game_status = EM_GAME_STATUS_MENU;
game_menu_init();
}
+#endif
return 0;
}
--- /dev/null
+#ifndef MAIN_EM_H
+#define MAIN_EM_H
+
+/* 2000-07-30T11:06:03Z ---------------------------------------------------- */
+
+#define EM_MAX_CAVE_WIDTH 102
+#define EM_MAX_CAVE_HEIGHT 102
+
+/* define these for backwards compatibility */
+#define BAD_ROLL
+#define BAD_SPRING
+
+enum
+{
+ Xblank = 0, /* still */
+ Yacid_splash_eB, /* hmm */
+ Yacid_splash_wB, /* hmm */
+
+#ifdef BAD_ROLL
+ Xstone_force_e, /* only use these in eater */
+ Xstone_force_w,
+ Xnut_force_e,
+ Xnut_force_w,
+ Xspring_force_e,
+ Xspring_force_w,
+ Xemerald_force_e,
+ Xemerald_force_w,
+ Xdiamond_force_e,
+ Xdiamond_force_w,
+ Xbomb_force_e,
+ Xbomb_force_w,
+#endif
+
+ Xstone,
+ Xstone_pause,
+ Xstone_fall,
+ Ystone_s,
+ Ystone_sB,
+ Ystone_e,
+ Ystone_eB,
+ Ystone_w,
+ Ystone_wB,
+ Xnut,
+ Xnut_pause,
+ Xnut_fall,
+ Ynut_s,
+ Ynut_sB,
+ Ynut_e,
+ Ynut_eB,
+ Ynut_w,
+ Ynut_wB,
+ Xbug_n,
+ Xbug_e,
+ Xbug_s,
+ Xbug_w,
+ Xbug_gon,
+ Xbug_goe,
+ Xbug_gos,
+ Xbug_gow,
+ Ybug_n,
+ Ybug_nB,
+ Ybug_e,
+ Ybug_eB,
+ Ybug_s,
+ Ybug_sB,
+ Ybug_w,
+ Ybug_wB,
+ Ybug_w_n,
+ Ybug_n_e,
+ Ybug_e_s,
+ Ybug_s_w,
+ Ybug_e_n,
+ Ybug_s_e,
+ Ybug_w_s,
+ Ybug_n_w,
+ Ybug_stone,
+ Ybug_spring,
+ Xtank_n,
+ Xtank_e,
+ Xtank_s,
+ Xtank_w,
+ Xtank_gon,
+ Xtank_goe,
+ Xtank_gos,
+ Xtank_gow,
+ Ytank_n,
+ Ytank_nB,
+ Ytank_e,
+ Ytank_eB,
+ Ytank_s,
+ Ytank_sB,
+ Ytank_w,
+ Ytank_wB,
+ Ytank_w_n,
+ Ytank_n_e,
+ Ytank_e_s,
+ Ytank_s_w,
+ Ytank_e_n,
+ Ytank_s_e,
+ Ytank_w_s,
+ Ytank_n_w,
+ Ytank_stone,
+ Ytank_spring,
+ Xandroid,
+ Xandroid_1_n,
+ Xandroid_2_n,
+ Xandroid_1_e,
+ Xandroid_2_e,
+ Xandroid_1_w,
+ Xandroid_2_w,
+ Xandroid_1_s,
+ Xandroid_2_s,
+ Yandroid_n,
+ Yandroid_nB,
+ Yandroid_ne,
+ Yandroid_neB,
+ Yandroid_e,
+ Yandroid_eB,
+ Yandroid_se,
+ Yandroid_seB,
+ Yandroid_s,
+ Yandroid_sB,
+ Yandroid_sw,
+ Yandroid_swB,
+ Yandroid_w,
+ Yandroid_wB,
+ Yandroid_nw,
+ Yandroid_nwB,
+ Xspring,
+ Xspring_pause,
+ Xspring_e,
+ Xspring_w,
+ Xspring_fall,
+ Yspring_s,
+ Yspring_sB,
+ Yspring_e,
+ Yspring_eB,
+ Yspring_w,
+ Yspring_wB,
+ Yspring_kill_e,
+ Yspring_kill_eB,
+ Yspring_kill_w,
+ Yspring_kill_wB,
+ Xeater_n,
+ Xeater_e,
+ Xeater_w,
+ Xeater_s,
+ Yeater_n,
+ Yeater_nB,
+ Yeater_e,
+ Yeater_eB,
+ Yeater_s,
+ Yeater_sB,
+ Yeater_w,
+ Yeater_wB,
+ Yeater_stone,
+ Yeater_spring,
+ Xalien,
+ Xalien_pause,
+ Yalien_n,
+ Yalien_nB,
+ Yalien_e,
+ Yalien_eB,
+ Yalien_s,
+ Yalien_sB,
+ Yalien_w,
+ Yalien_wB,
+ Yalien_stone,
+ Yalien_spring,
+ Xemerald,
+ Xemerald_pause,
+ Xemerald_fall,
+ Xemerald_shine,
+ Yemerald_s,
+ Yemerald_sB,
+ Yemerald_e,
+ Yemerald_eB,
+ Yemerald_w,
+ Yemerald_wB,
+ Yemerald_eat,
+ Yemerald_stone,
+ Xdiamond,
+ Xdiamond_pause,
+ Xdiamond_fall,
+ Xdiamond_shine,
+ Ydiamond_s,
+ Ydiamond_sB,
+ Ydiamond_e,
+ Ydiamond_eB,
+ Ydiamond_w,
+ Ydiamond_wB,
+ Ydiamond_eat,
+ Ydiamond_stone,
+ Xdrip_fall,
+ Xdrip_stretch,
+ Xdrip_stretchB,
+ Xdrip_eat,
+ Ydrip_s1,
+ Ydrip_s1B,
+ Ydrip_s2,
+ Ydrip_s2B,
+ Xbomb,
+ Xbomb_pause,
+ Xbomb_fall,
+ Ybomb_s,
+ Ybomb_sB,
+ Ybomb_e,
+ Ybomb_eB,
+ Ybomb_w,
+ Ybomb_wB,
+ Ybomb_eat,
+ Xballoon,
+ Yballoon_n,
+ Yballoon_nB,
+ Yballoon_e,
+ Yballoon_eB,
+ Yballoon_s,
+ Yballoon_sB,
+ Yballoon_w,
+ Yballoon_wB,
+ Xgrass,
+ Ygrass_nB,
+ Ygrass_eB,
+ Ygrass_sB,
+ Ygrass_wB,
+ Xdirt,
+ Ydirt_nB,
+ Ydirt_eB,
+ Ydirt_sB,
+ Ydirt_wB,
+ Xacid_ne,
+ Xacid_se,
+ Xacid_s,
+ Xacid_sw,
+ Xacid_nw,
+ Xacid_1,
+ Xacid_2,
+ Xacid_3,
+ Xacid_4,
+ Xacid_5,
+ Xacid_6,
+ Xacid_7,
+ Xacid_8,
+ Xball_1,
+ Xball_1B,
+ Xball_2,
+ Xball_2B,
+ Yball_eat,
+ Xgrow_ns,
+ Ygrow_ns_eat,
+ Xgrow_ew,
+ Ygrow_ew_eat,
+ Xwonderwall,
+ XwonderwallB,
+ Xameuba_1,
+ Xameuba_2,
+ Xameuba_3,
+ Xameuba_4,
+ Xameuba_5,
+ Xameuba_6,
+ Xameuba_7,
+ Xameuba_8,
+ Xdoor_1,
+ Xdoor_2,
+ Xdoor_3,
+ Xdoor_4,
+ Xdoor_5,
+ Xdoor_6,
+ Xdoor_7,
+ Xdoor_8,
+ Xkey_1,
+ Xkey_2,
+ Xkey_3,
+ Xkey_4,
+ Xkey_5,
+ Xkey_6,
+ Xkey_7,
+ Xkey_8,
+ Xwind_n,
+ Xwind_e,
+ Xwind_s,
+ Xwind_w,
+ Xwind_nesw,
+ Xwind_stop,
+ Xexit,
+ Xexit_1,
+ Xexit_2,
+ Xexit_3,
+ Xdynamite,
+ Ydynamite_eat,
+ Xdynamite_1,
+ Xdynamite_2,
+ Xdynamite_3,
+ Xdynamite_4,
+ Xbumper,
+ XbumperB,
+ Xwheel,
+ XwheelB,
+ Xswitch,
+ XswitchB,
+ Xsand,
+ Xsand_stone,
+ Xsand_stonein_1,
+ Xsand_stonein_2,
+ Xsand_stonein_3,
+ Xsand_stonein_4,
+ Xsand_stonesand_1,
+ Xsand_stonesand_2,
+ Xsand_stonesand_3,
+ Xsand_stonesand_4,
+ Xsand_stoneout_1,
+ Xsand_stoneout_2,
+ Xsand_sandstone_1,
+ Xsand_sandstone_2,
+ Xsand_sandstone_3,
+ Xsand_sandstone_4,
+ Xplant,
+ Yplant,
+ Xlenses,
+ Xmagnify,
+ Xdripper,
+ XdripperB,
+ Xfake_blank,
+ Xfake_blankB,
+ Xfake_grass,
+ Xfake_grassB,
+ Xfake_door_1,
+ Xfake_door_2,
+ Xfake_door_3,
+ Xfake_door_4,
+ Xfake_door_5,
+ Xfake_door_6,
+ Xfake_door_7,
+ Xfake_door_8,
+ Xsteel_1,
+ Xsteel_2,
+ Xsteel_3,
+ Xsteel_4,
+ Xwall_1,
+ Xwall_2,
+ Xwall_3,
+ Xwall_4,
+ Xround_wall_1,
+ Xround_wall_2,
+ Xround_wall_3,
+ Xround_wall_4,
+ Xdecor_1,
+ Xdecor_2,
+ Xdecor_3,
+ Xdecor_4,
+ Xdecor_5,
+ Xdecor_6,
+ Xdecor_7,
+ Xdecor_8,
+ Xdecor_9,
+ Xdecor_10,
+ Xdecor_11,
+ Xdecor_12,
+ Xalpha_0,
+ Xalpha_1,
+ Xalpha_2,
+ Xalpha_3,
+ Xalpha_4,
+ Xalpha_5,
+ Xalpha_6,
+ Xalpha_7,
+ Xalpha_8,
+ Xalpha_9,
+ Xalpha_excla,
+ Xalpha_quote,
+ Xalpha_comma,
+ Xalpha_minus,
+ Xalpha_perio,
+ Xalpha_colon,
+ Xalpha_quest,
+ Xalpha_a,
+ Xalpha_b,
+ Xalpha_c,
+ Xalpha_d,
+ Xalpha_e,
+ Xalpha_f,
+ Xalpha_g,
+ Xalpha_h,
+ Xalpha_i,
+ Xalpha_j,
+ Xalpha_k,
+ Xalpha_l,
+ Xalpha_m,
+ Xalpha_n,
+ Xalpha_o,
+ Xalpha_p,
+ Xalpha_q,
+ Xalpha_r,
+ Xalpha_s,
+ Xalpha_t,
+ Xalpha_u,
+ Xalpha_v,
+ Xalpha_w,
+ Xalpha_x,
+ Xalpha_y,
+ Xalpha_z,
+ Xalpha_arrow_e,
+ Xalpha_arrow_w,
+ Xalpha_copyr,
+
+ 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
+};
+
+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_initial; /* time remaining (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 ameuba_time; /* ameuba 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 */
+};
+
+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 joy_n:1;
+ unsigned joy_e:1;
+ unsigned joy_s:1;
+ unsigned joy_w:1;
+ unsigned joy_fire:1;
+ unsigned joy_stick:1;
+ unsigned joy_spin:1;
+};
+
+struct LevelInfo_EM
+{
+ struct LEVEL lev;
+ struct PLAYER ply1, ply2;
+
+ unsigned short cave[EM_MAX_CAVE_WIDTH][EM_MAX_CAVE_HEIGHT];
+
+ unsigned short **Boom;
+ unsigned short **Cave;
+ unsigned short **Next;
+ unsigned short **Draw;
+};
+
+#endif /* MAIN_EM_H */
#ifndef TILE_H
#define TILE_H
+#include "main_em.h"
+
+#if 0
+
/* 2000-07-30T11:06:03Z
*/
TILE_MAX
};
+#endif
+
enum
{
SPR_still = 0,
{
struct LevelFileInfo file_info;
+ /* level stored in native format for the native game engines */
+ struct LevelInfo_EM native_em_level;
+
int game_engine_type;
int file_version; /* file format version the level is stored with */