+2006-03-19
+ * code cleanup for game action control for R'n'D and EMC game engine
+
2006-03-18
* fixed bug in multi-player movement with focus on both players
* added option to control only the focussed player with all input
-#define COMPILE_DATE_STRING "[2006-03-19 02:11]"
+#define COMPILE_DATE_STRING "[2006-03-19 20:13]"
extern void UpdateEngineValues(int, int);
extern void DrawAllGameValues(int, int, int, int, int);
-#if 0
-extern void setCenteredPlayerNr_EM(int);
-extern int getCenteredPlayerNr_EM();
-extern void setSetCenteredPlayer_EM(boolean);
-extern boolean getSetCenteredPlayer_EM();
-#endif
-
extern int getNumActivePlayers_EM();
extern int getGameFrameDelay_EM(int);
* cave data structures
*/
-#include "global.h"
-#include "tile.h"
-#include "level.h"
+#include "main_em.h"
struct LevelInfo_EM native_em_level;
* inconsequential, but no doubt it will break some caves.
*/
-#include "global.h"
-#include "tile.h"
-#include "level.h"
+#include "main_em.h"
static unsigned char remap_v6[256] =
+++ /dev/null
-#ifndef DISPLAY_H
-#define DISPLAY_H
-
-#include "main_em.h"
-
-#define ORIG_TILEX 16
-#define ORIG_TILEY 16
-#define ORIG_SCOREX 8
-#define ORIG_SCOREY 9
-#define ORIG_GFXMENUFONTX 14
-#define ORIG_GFXMENUFONTY 16
-#define ORIG_MENUFONTX 12
-#define ORIG_MENUFONTY 16
-
-#define ZOOM_FACTOR 2
-
-#define TILEX (ORIG_TILEX * ZOOM_FACTOR)
-#define TILEY (ORIG_TILEY * ZOOM_FACTOR)
-#define SCOREX (ORIG_SCOREX * ZOOM_FACTOR)
-#define SCOREY (ORIG_SCOREY * ZOOM_FACTOR)
-#define GFXMENUFONTX (ORIG_GFXMENUFONTX * ZOOM_FACTOR)
-#define GFXMENUFONTY (ORIG_GFXMENUFONTY * ZOOM_FACTOR)
-#define MENUFONTX (ORIG_MENUFONTX * ZOOM_FACTOR)
-#define MENUFONTY (ORIG_MENUFONTY * ZOOM_FACTOR)
-
-#define ORIG_SCR_MENUX 20
-#define ORIG_SCR_MENUY 12
-#define SCR_MENUX 17
-#define SCR_MENUY 12
-#define SCR_FIELDX 17
-#define SCR_FIELDY 17
-#define MAX_BUF_XSIZE (SCR_FIELDX + 2)
-#define MAX_BUF_YSIZE (SCR_FIELDY + 2)
-
-/* often used screen positions */
-#define ORIG_MENU_SX ((ORIG_SCR_MENUX - SCR_MENUX) * TILEX / 2)
-#define ORIG_MENU_SY 0
-#define SY 8
-#define SX 8
-#define SY 8
-#define SXSIZE (SCR_FIELDX * TILEX)
-#define SYSIZE (SCR_FIELDY * TILEY)
-
-#if 1
-
-#if 0
-#define FRAMES_PER_SECOND 50
-#endif
-
-#define ROUNDED_DIVIDE(x, y) (((x) + (y) - 1) / (y))
-
-#define SECONDS_TO_FRAMES(x) ((x) * FRAMES_PER_SECOND)
-#define FRAMES_TO_SECONDS(x) ((x) / FRAMES_PER_SECOND)
-
-#define SECONDS_TO_CYCLES(x) ROUNDED_DIVIDE((x) * FRAMES_PER_SECOND, 8)
-#define CYCLES_TO_SECONDS(x) ROUNDED_DIVIDE((x) * 8, FRAMES_PER_SECOND)
-
-#define DISPLAY_TIME(x) ROUNDED_DIVIDE(x, FRAMES_PER_SECOND)
-
-#else
-
-#define DISPLAY_TIME(x) (((x) * 8 + 49) / 50)
-#endif
-
-extern Bitmap *screenBitmap;
-extern Bitmap *scoreBitmap;
-
-extern Bitmap *objBitmap;
-extern Bitmap *sprBitmap;
-extern Bitmap *ttlBitmap;
-extern Bitmap *botBitmap;
-
-extern Pixmap screenPixmap;
-extern Pixmap scorePixmap;
-extern Pixmap spriteBitmap;
-
-extern Pixmap objmaskBitmap;
-extern Pixmap sprmaskBitmap;
-
-extern GC spriteGC;
-
-#endif
--- /dev/null
+#ifndef EXPORT_H
+#define EXPORT_H
+
+/* ========================================================================= */
+/* functions and definitions exported from game_em to main program */
+/* ========================================================================= */
+
+/* ------------------------------------------------------------------------- */
+/* constant definitions */
+/* ------------------------------------------------------------------------- */
+
+/* define these for backwards compatibility */
+#define EM_ENGINE_BAD_ROLL
+#define EM_ENGINE_BAD_SPRING
+
+/* define these to use additional elements */
+#define EM_ENGINE_USE_ADDITIONAL_ELEMENTS
+
+/* internal definitions for EM engine */
+#ifdef EM_ENGINE_BAD_ROLL
+#define BAD_ROLL
+#endif
+
+#ifdef EM_ENGINE_BAD_SPRING
+#define BAD_SPRING
+#endif
+
+/* 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)
+
+/*
+ -----------------------------------------------------------------------------
+ definition of elements used in the Emerald Mine Club engine;
+ the element names 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 end with 'B' are the "backside" of moving elements
+ -----------------------------------------------------------------------------
+*/
+
+enum
+{
+ Xblank = 0, /* still */
+ Yacid_splash_eB, /* hmm */
+ Yacid_splash_wB, /* hmm */
+
+#ifdef EM_ENGINE_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,
+
+#ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
+ Ykey_1_eat,
+ Ykey_2_eat,
+ Ykey_3_eat,
+ Ykey_4_eat,
+ Ykey_5_eat,
+ Ykey_6_eat,
+ Ykey_7_eat,
+ Ykey_8_eat,
+ Ylenses_eat,
+ Ymagnify_eat,
+ Ygrass_eat,
+ Ydirt_eat,
+#endif
+
+ Xgrow_ns,
+ Ygrow_ns_eat,
+ Xgrow_ew,
+ Ygrow_ew_eat,
+ Xwonderwall,
+ XwonderwallB,
+ Xamoeba_1,
+ Xamoeba_2,
+ Xamoeba_3,
+ Xamoeba_4,
+ Xamoeba_5,
+ Xamoeba_6,
+ Xamoeba_7,
+ Xamoeba_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,
+
+#ifdef EM_ENGINE_USE_ADDITIONAL_ELEMENTS
+ 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,
+ 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
+};
+
+/* other definitions */
+
+enum
+{
+ SPR_still = 0,
+ SPR_walk = 1,
+ SPR_push = 5,
+ SPR_spray = 9,
+
+ SPR_MAX = 13
+};
+
+enum
+{
+ SAMPLE_blank = 0, /* player walks on blank */
+ SAMPLE_roll, /* player pushes stone/bomb/nut/spring */
+ SAMPLE_stone, /* stone hits ground */
+ SAMPLE_nut, /* nut hits ground */
+ SAMPLE_crack, /* stone hits nut */
+ SAMPLE_bug, /* bug moves */
+ SAMPLE_tank, /* tank moves */
+ 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 */
+ SAMPLE_eater_eat, /* eater eats diamond */
+ SAMPLE_alien, /* alien moves */
+ SAMPLE_collect, /* player collects object */
+ SAMPLE_diamond, /* diamond/emerald hits ground */
+ SAMPLE_squash, /* stone squashes diamond */
+ SAMPLE_wonderfall, /* object falls thru wonderwall */
+ SAMPLE_drip, /* drip hits ground */
+ SAMPLE_push, /* player pushes balloon/android */
+ SAMPLE_dirt, /* player walks on dirt */
+ SAMPLE_acid, /* acid splashes */
+ SAMPLE_ball, /* ball places something */
+ SAMPLE_grow, /* growing wall grows */
+ SAMPLE_wonder, /* wonderwall is active */
+ SAMPLE_door, /* player goes thru door (gate) */
+ 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 */
+ SAMPLE_wheel, /* wheel moves */
+ SAMPLE_boom, /* explosion */
+ SAMPLE_time, /* time runs out */
+ SAMPLE_die, /* player dies */
+
+ SAMPLE_MAX
+};
+
+
+/* ------------------------------------------------------------------------- */
+/* data structure definitions */
+/* ------------------------------------------------------------------------- */
+
+struct LEVEL
+{
+ 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
+{
+ 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;
+};
+
+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;
+
+ short cave[EM_MAX_CAVE_WIDTH][EM_MAX_CAVE_HEIGHT];
+
+ struct LEVEL *lev;
+ struct PLAYER *ply[MAX_PLAYERS];
+};
+
+struct GraphicInfo_EM
+{
+ Bitmap *bitmap;
+ int src_x, src_y;
+ int src_offset_x, src_offset_y;
+ int dst_offset_x, dst_offset_y;
+ int width, height;
+
+ 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 */
+};
+
+
+/* ------------------------------------------------------------------------- */
+/* exported functions */
+/* ------------------------------------------------------------------------- */
+
+extern struct GlobalInfo_EM global_em_info;
+extern struct LevelInfo_EM native_em_level;
+extern struct GraphicInfo_EM graphic_info_em_object[TILE_MAX][8];
+extern struct GraphicInfo_EM graphic_info_em_player[MAX_PLAYERS][SPR_MAX][8];
+
+extern void em_open_all();
+extern void em_close_all();
+
+extern void InitGameEngine_EM();
+extern void GameActions_EM(byte *, boolean);
+
+extern unsigned int InitEngineRND_EM(long);
+
+extern void setLevelInfoToDefaults_EM();
+extern boolean LoadNativeLevel_EM(char *);
+
+extern void BlitScreenToBitmap_EM(Bitmap *);
+extern void RedrawPlayfield_EM(boolean);
+extern void DrawGameDoorValues_EM();
+
+#endif /* EXPORT_H */
#define GAME_EM_VERSION_1_0_0
-
-/* ========================================================================= */
-/* functions and definitions exported from game_em to main program */
-/* ========================================================================= */
-
-#include "main_em.h"
-
-extern struct GlobalInfo_EM global_em_info;
-extern struct LevelInfo_EM native_em_level;
-extern struct GraphicInfo_EM graphic_info_em_object[TILE_MAX][8];
-extern struct GraphicInfo_EM graphic_info_em_player[MAX_PLAYERS][SPR_MAX][8];
-
-extern void em_open_all();
-extern void em_close_all();
-
-extern void InitGameEngine_EM();
-#if 1
-extern void GameActions_EM(byte *, boolean);
-#else
-extern void GameActions_EM(byte);
-#endif
-
-extern unsigned int InitEngineRND_EM(long);
-
-extern void setLevelInfoToDefaults_EM();
-extern boolean LoadNativeLevel_EM(char *);
-
-extern void BlitScreenToBitmap_EM(Bitmap *);
-extern void RedrawPlayfield_EM(boolean);
-extern void DrawGameDoorValues_EM();
+#include "export.h"
#endif /* GAME_EM_H */
* graphics manipulation crap
*/
-#include "global.h"
-#include "display.h"
-#include "level.h"
+#include "main_em.h"
#define MIN_SCREEN_XPOS 1
#define MIN_SCREEN_YPOS 1
* open X11 display and sound
*/
+#include "main_em.h"
+
+
#include <signal.h>
#if !defined(TARGET_SDL)
#include <sys/wait.h>
#endif
-#include "main_em.h"
-
-#include "global.h"
-#include "display.h"
-#include "sample.h"
-#include "level.h"
-
Bitmap *objBitmap;
Bitmap *sprBitmap;
* handle input from x11 and keyboard and joystick
*/
-#include "global.h"
-#include "display.h"
-#include "level.h"
+#include "main_em.h"
unsigned long RandomEM;
+++ /dev/null
-#ifndef LEVEL_H
-#define LEVEL_H
-
-#include "main_em.h"
-#include "tile.h"
-
-#define WIDTH EM_MAX_CAVE_WIDTH
-#define HEIGHT EM_MAX_CAVE_HEIGHT
-
-extern unsigned long RandomEM;
-
-extern struct LEVEL lev;
-extern struct PLAYER ply[MAX_PLAYERS];
-
-extern struct LevelInfo_EM native_em_level;
-extern struct GraphicInfo_EM graphic_info_em_object[TILE_MAX][8];
-extern struct GraphicInfo_EM graphic_info_em_player[MAX_PLAYERS][SPR_MAX][8];
-
-extern short **Boom;
-extern short **Cave;
-extern short **Next;
-extern short **Draw;
-
-#endif
#ifndef MAIN_EM_H
#define MAIN_EM_H
+/* ========================================================================= */
+/* external functions and definitions imported from main program to game_em */
+/* ========================================================================= */
+
#include "../engines.h"
-/* 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
-#define EM_ENGINE_BAD_SPRING
-
-
-/*
- -----------------------------------------------------------------------------
- definition of elements used in the Emerald Mine Club engine;
- the element names 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 end with 'B' are the "backside" of moving elements
- -----------------------------------------------------------------------------
-*/
-
-enum
-{
- Xblank = 0, /* still */
- Yacid_splash_eB, /* hmm */
- Yacid_splash_wB, /* hmm */
-
-#ifdef EM_ENGINE_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,
-
-#if 1
- Ykey_1_eat,
- Ykey_2_eat,
- Ykey_3_eat,
- Ykey_4_eat,
- Ykey_5_eat,
- Ykey_6_eat,
- Ykey_7_eat,
- Ykey_8_eat,
- Ylenses_eat,
- Ymagnify_eat,
- Ygrass_eat,
- Ydirt_eat,
-#endif
-
- Xgrow_ns,
- Ygrow_ns_eat,
- Xgrow_ew,
- Ygrow_ew_eat,
- Xwonderwall,
- XwonderwallB,
- Xamoeba_1,
- Xamoeba_2,
- Xamoeba_3,
- Xamoeba_4,
- Xamoeba_5,
- Xamoeba_6,
- Xamoeba_7,
- Xamoeba_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,
-
-#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,
- 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
-};
-
-enum
-{
- SPR_still = 0,
- SPR_walk = 1,
- SPR_push = 5,
- SPR_spray = 9,
-
- SPR_MAX = 13
-};
-
-enum
-{
- SAMPLE_blank = 0, /* player walks on blank */
- SAMPLE_roll, /* player pushes stone/bomb/nut/spring */
- SAMPLE_stone, /* stone hits ground */
- SAMPLE_nut, /* nut hits ground */
- SAMPLE_crack, /* stone hits nut */
- SAMPLE_bug, /* bug moves */
- SAMPLE_tank, /* tank moves */
- 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 */
- SAMPLE_eater_eat, /* eater eats diamond */
- SAMPLE_alien, /* alien moves */
- SAMPLE_collect, /* player collects object */
- SAMPLE_diamond, /* diamond/emerald hits ground */
- SAMPLE_squash, /* stone squashes diamond */
- SAMPLE_wonderfall, /* object falls thru wonderwall */
- SAMPLE_drip, /* drip hits ground */
- SAMPLE_push, /* player pushes balloon/android */
- SAMPLE_dirt, /* player walks on dirt */
- SAMPLE_acid, /* acid splashes */
- SAMPLE_ball, /* ball places something */
- SAMPLE_grow, /* growing wall grows */
- SAMPLE_wonder, /* wonderwall is active */
- SAMPLE_door, /* player goes thru door (gate) */
- 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 */
- SAMPLE_wheel, /* wheel moves */
- SAMPLE_boom, /* explosion */
- SAMPLE_time, /* time runs out */
- SAMPLE_die, /* player dies */
-
- SAMPLE_MAX
-};
-
-struct LEVEL
-{
- 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
-{
- 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;
-};
+/* ========================================================================= */
+/* functions and definitions that are exported from game_em to main program */
+/* ========================================================================= */
+
+#include "export.h"
+
+
+/* ========================================================================= */
+/* internal functions and definitions that are not exported to main program */
+/* ========================================================================= */
+
+#include "global.h"
+#include "sample.h"
/* ------------------------------------------------------------------------- */
-/* definitions and structures for use by the main game functions */
+/* constant definitions */
/* ------------------------------------------------------------------------- */
/* values for native Emerald Mine game version */
#define FILE_VERSION_EM_ACTUAL FILE_VERSION_EM_V6
-struct GlobalInfo_EM
-{
- Bitmap *screenbuffer;
-};
+/* level sizes and positions for EM engine */
+
+#define WIDTH EM_MAX_CAVE_WIDTH
+#define HEIGHT EM_MAX_CAVE_HEIGHT
+
+/* screen sizes and positions for EM engine */
+
+#define ORIG_TILEX 16
+#define ORIG_TILEY 16
+#define ORIG_SCOREX 8
+#define ORIG_SCOREY 9
+#define ORIG_GFXMENUFONTX 14
+#define ORIG_GFXMENUFONTY 16
+#define ORIG_MENUFONTX 12
+#define ORIG_MENUFONTY 16
+
+#define ZOOM_FACTOR 2
+
+#define TILEX (ORIG_TILEX * ZOOM_FACTOR)
+#define TILEY (ORIG_TILEY * ZOOM_FACTOR)
+#define SCOREX (ORIG_SCOREX * ZOOM_FACTOR)
+#define SCOREY (ORIG_SCOREY * ZOOM_FACTOR)
+#define GFXMENUFONTX (ORIG_GFXMENUFONTX * ZOOM_FACTOR)
+#define GFXMENUFONTY (ORIG_GFXMENUFONTY * ZOOM_FACTOR)
+#define MENUFONTX (ORIG_MENUFONTX * ZOOM_FACTOR)
+#define MENUFONTY (ORIG_MENUFONTY * ZOOM_FACTOR)
+
+#define ORIG_SCR_MENUX 20
+#define ORIG_SCR_MENUY 12
+#define SCR_MENUX 17
+#define SCR_MENUY 12
+#define SCR_FIELDX 17
+#define SCR_FIELDY 17
+#define MAX_BUF_XSIZE (SCR_FIELDX + 2)
+#define MAX_BUF_YSIZE (SCR_FIELDY + 2)
+
+/* often used screen positions */
+#define ORIG_MENU_SX ((ORIG_SCR_MENUX - SCR_MENUX) * TILEX / 2)
+#define ORIG_MENU_SY 0
+#define SY 8
+#define SX 8
+#define SY 8
+#define SXSIZE (SCR_FIELDX * TILEX)
+#define SYSIZE (SCR_FIELDY * TILEY)
+
+
+/* ------------------------------------------------------------------------- */
+/* macro function definitions */
+/* ------------------------------------------------------------------------- */
-struct GameInfo_EM
-{
- boolean any_player_moving;
- int last_moving_player;
- int last_player_direction[MAX_PLAYERS];
-};
+#define ROUNDED_DIVIDE(x, y) (((x) + (y) - 1) / (y))
-struct LevelInfo_EM
-{
- int file_version;
+#define SECONDS_TO_FRAMES(x) ((x) * FRAMES_PER_SECOND)
+#define FRAMES_TO_SECONDS(x) ((x) / FRAMES_PER_SECOND)
- short cave[EM_MAX_CAVE_WIDTH][EM_MAX_CAVE_HEIGHT];
+#define SECONDS_TO_CYCLES(x) ROUNDED_DIVIDE((x) * FRAMES_PER_SECOND, 8)
+#define CYCLES_TO_SECONDS(x) ROUNDED_DIVIDE((x) * 8, FRAMES_PER_SECOND)
- struct LEVEL *lev;
- struct PLAYER *ply[MAX_PLAYERS];
-};
+#define DISPLAY_TIME(x) ROUNDED_DIVIDE(x, FRAMES_PER_SECOND)
-struct GraphicInfo_EM
-{
- Bitmap *bitmap;
- int src_x, src_y;
- int src_offset_x, src_offset_y;
- int dst_offset_x, dst_offset_y;
- int width, height;
- Bitmap *crumbled_bitmap;
- int crumbled_src_x, crumbled_src_y;
- int crumbled_border_size;
+/* ------------------------------------------------------------------------- */
+/* data structure definitions */
+/* ------------------------------------------------------------------------- */
+
+/* ------------------------------------------------------------------------- */
+/* exported variables */
+/* ------------------------------------------------------------------------- */
- boolean has_crumbled_graphics;
- boolean preserve_background;
+extern unsigned long RandomEM;
- int unique_identifier; /* used to identify needed screen updates */
-};
+extern struct LEVEL lev;
+extern struct PLAYER ply[MAX_PLAYERS];
+
+extern struct LevelInfo_EM native_em_level;
+extern struct GraphicInfo_EM graphic_info_em_object[TILE_MAX][8];
+extern struct GraphicInfo_EM graphic_info_em_player[MAX_PLAYERS][SPR_MAX][8];
+
+extern short **Boom;
+extern short **Cave;
+extern short **Next;
+extern short **Draw;
extern struct GameInfo_EM game_em;
+extern unsigned char tab_blank[TILE_MAX];
+extern unsigned char tab_acid[TILE_MAX];
+extern unsigned char tab_amoeba[TILE_MAX];
+extern unsigned char tab_android_move[TILE_MAX];
+extern unsigned short tab_explode_normal[TILE_MAX];
+extern unsigned short tab_explode_dynamite[TILE_MAX];
+
+extern unsigned short map_obj[8][TILE_MAX];
+extern unsigned short map_spr[2][8][SPR_MAX];
+extern unsigned short map_ttl[128];
+
+extern Bitmap *screenBitmap;
+extern Bitmap *scoreBitmap;
+
+extern Bitmap *objBitmap;
+extern Bitmap *sprBitmap;
+extern Bitmap *ttlBitmap;
+extern Bitmap *botBitmap;
+
+extern Pixmap screenPixmap;
+extern Pixmap scorePixmap;
+extern Pixmap spriteBitmap;
+
+extern Pixmap objmaskBitmap;
+extern Pixmap sprmaskBitmap;
+
+extern GC spriteGC;
+
+
+/* ------------------------------------------------------------------------- */
+/* exported functions */
+/* ------------------------------------------------------------------------- */
+
#endif /* MAIN_EM_H */
#include "main_em.h"
-#if 0
-
-enum
-{
- SAMPLE_blank = 0, /* player walks on blank */
- SAMPLE_roll, /* player pushes stone/bomb/nut/spring */
- SAMPLE_stone, /* stone hits ground */
- SAMPLE_nut, /* nut hits ground */
- SAMPLE_crack, /* stone hits nut */
- SAMPLE_bug, /* bug moves */
- SAMPLE_tank, /* tank moves */
- 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 */
- SAMPLE_eater_eat, /* eater eats diamond */
- SAMPLE_alien, /* alien moves */
- SAMPLE_collect, /* player collects object */
- SAMPLE_diamond, /* diamond/emerald hits ground */
- SAMPLE_squash, /* stone squashes diamond */
- SAMPLE_wonderfall, /* object falls thru wonderwall */
- SAMPLE_drip, /* drip hits ground */
- SAMPLE_push, /* player pushes balloon/android */
- SAMPLE_dirt, /* player walks on dirt */
- SAMPLE_acid, /* acid splashes */
- SAMPLE_ball, /* ball places something */
- SAMPLE_grow, /* growing wall grows */
- SAMPLE_wonder, /* wonderwall moves (is active) */
- SAMPLE_door, /* player goes thru door */
- 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 */
- SAMPLE_wheel, /* wheel moves */
- SAMPLE_boom, /* explosion */
- SAMPLE_time, /* time runs out */
- SAMPLE_die, /* player dies */
-
- SAMPLE_MAX
-};
-
-#endif
-
extern void play_sound(int, int, int);
extern void play_element_sound(int, int, int, int);
#include <soundcard.h>
#endif
-#include "global.h"
-#include "sample.h"
-
static char audioname[] = "/dev/audio";
static const int sound_priority[SAMPLE_MAX] =
* large switch statement for tiles the player interacts with.
*/
-#include "tile.h"
-#include "level.h"
-#include "sample.h"
-#include "display.h"
+#include "main_em.h"
#if 0
* compilers suck.
*/
-#include "display.h"
-#include "tile.h"
-#include "level.h"
-#include "sample.h"
+#include "main_em.h"
#define RANDOM (random = random << 31 | random >> 1)
* this should be spread over the frames for reduced cpu load.
*/
-#include "tile.h"
-#include "level.h"
-#include "sample.h"
+#include "main_em.h"
void synchro_3(void)
* modify.
*/
-#include "tile.h"
-#include "display.h"
+#include "main_em.h"
-/* ---------------------------------------------------------------------- */
+/* ------------------------------------------------------------------------- */
/* 0=stop 1=blank */
int tile_blank[] =
TILE_MAX
};
-/* ---------------------------------------------------------------------- */
+
+/* ------------------------------------------------------------------------- */
/* explosions: special format */
/* everything is initially filled with Xboom_1 */
TILE_MAX /* up until here are dynamite explosions */
};
-/* ---------------------------------------------------------------------- */
+
+/* ------------------------------------------------------------------------- */
/* map the graphics file to internal tiles and animations
*
+++ /dev/null
-#ifndef TILE_H
-#define TILE_H
-
-#include "main_em.h"
-
-#ifdef EM_ENGINE_BAD_ROLL
-#define BAD_ROLL
-#endif
-
-#ifdef EM_ENGINE_BAD_SPRING
-#define BAD_SPRING
-#endif
-
-
-#if 0
-
-/* 2000-07-30T11:06:03Z
- */
-
-/* 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,
- Xamoeba_1,
- Xamoeba_2,
- Xamoeba_3,
- Xamoeba_4,
- Xamoeba_5,
- Xamoeba_6,
- Xamoeba_7,
- Xamoeba_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, /* no picture */ /* this tile is passed from synchro to explode, only in next[] */
- Zdynamite, /* no picture */ /* this tile is passed from synchro to explode, only in next[] */
- Zplayer, /* no picture */ /* special code to indicate player */
- ZBORDER, /* no picture */ /* special code to indicate border */
-
- TILE_MAX
-};
-
-enum
-{
- SPR_still = 0,
- SPR_walk = 1,
- SPR_push = 5,
- SPR_spray = 9,
-
- SPR_MAX = 13
-};
-
-#endif
-
-extern unsigned char tab_blank[TILE_MAX];
-extern unsigned char tab_acid[TILE_MAX];
-extern unsigned char tab_amoeba[TILE_MAX];
-extern unsigned char tab_android_move[TILE_MAX];
-extern unsigned short tab_explode_normal[TILE_MAX];
-extern unsigned short tab_explode_dynamite[TILE_MAX];
-
-extern unsigned short map_obj[8][TILE_MAX];
-extern unsigned short map_spr[2][8][SPR_MAX];
-extern unsigned short map_ttl[128];
-
-#endif
int sx = SCREENX(x);
int sy = SCREENY(y);
+ if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ {
+ x--;
+ y--;
+ }
+
printf_line("-", 79);
printf("Field Info: SCREEN(%d, %d), LEVEL(%d, %d)\n", sx, sy, x, y);
printf_line("-", 79);
return num_players;
}
+#if 1
int getGameFrameDelay_EM(int native_em_game_frame_delay)
{
int game_frame_delay_value;
return game_frame_delay_value;
}
+#endif
unsigned int InitRND(long seed)
{