#include "events.h"
GC tile_clip_gc;
+#if 0
Bitmap *pix[NUM_BITMAPS];
+#endif
+Bitmap *bitmap_db_field, *bitmap_db_door;
Pixmap tile_clipmask[NUM_TILES];
DrawBuffer *fieldbuffer;
DrawBuffer *drawto_field;
short Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-short Frame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
boolean Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short AmoebaCnt[MAX_NUM_AMOEBA], AmoebaCnt2[MAX_NUM_AMOEBA];
+short ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
short ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
unsigned long Elementeigenschaften1[MAX_ELEMENTS];
unsigned long Elementeigenschaften2[MAX_ELEMENTS];
+int GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+
int lev_fieldx,lev_fieldy, scroll_x,scroll_y;
int FX = SX, FY = SY, ScrollStepSize;
int ScreenMovDir = MV_NO_MOVING, ScreenMovPos = 0;
int ScreenGfxPos = 0;
-int BorderElement = EL_BETON;
+int BorderElement = EL_STEELWALL;
int GameFrameDelay = GAME_FRAME_DELAY;
int FfwdFrameDelay = FFWD_FRAME_DELAY;
int BX1 = 0, BY1 = 0, BX2 = SCR_FIELDX-1, BY2 = SCR_FIELDY-1;
"gate.wav"
};
-struct ConfigInfo image_config_suffix[] =
-{
- { ".frame_xpos", "0" },
- { ".frame_ypos", "0" },
- { ".num_frames", "1" },
-
- { NULL, NULL }
-};
-
-struct ConfigInfo sound_config_suffix[] =
+/* this is used to reduce memory usage of the different animation types */
+int graphics_action_mapping[] =
{
- { NULL, NULL }
-};
-
-struct ConfigInfo image_config[] =
-{
- /* graphics for Boulder Dash style elements and actions */
- { "bd_diamond", "bd_diamond.pcx" },
- { "bd_diamond.frame_xpos", "0" },
- { "bd_diamond.num_frames", "1" },
- { "robot_wheel", "bd_diamond.pcx" },
- { "robot_wheel.frame_xpos", "0" },
- { "robot_wheel.num_frames", "4" },
-
- { NULL, NULL }
-};
-
-struct ConfigInfo sound_config[] =
-{
- /* sounds for Boulder Dash style elements and actions */
- { "bd_empty_space.digging", "empty.wav" },
- { "bd_sand.digging", "schlurf.wav" },
- { "bd_diamond.collecting", "pong.wav" },
- { "bd_diamond.impact", "pling.wav" },
- { "bd_rock.pushing", "pusch.wav" },
- { "bd_rock.impact", "klopf.wav" },
- { "bd_magic_wall.activating", "quirk.wav" },
- { "bd_magic_wall.changing", "quirk.wav" },
- { "bd_magic_wall.running", "miep.wav" },
- { "bd_amoeba.waiting", SND_FILE_UNDEFINED },
- { "bd_amoeba.creating", "amoebe.wav" },
- { "bd_amoeba.turning_to_gem", "pling.wav" },
- { "bd_amoeba.turning_to_rock", "klopf.wav" },
- { "bd_butterfly.moving", "klapper.wav" },
- { "bd_butterfly.waiting", "klapper.wav" },
- { "bd_firefly.moving", "roehr.wav" },
- { "bd_firefly.waiting", "roehr.wav" },
- { "bd_exit.entering", "buing.wav" },
-
- /* sounds for Supaplex style elements and actions */
- { "sp_empty_space.digging", "empty.wav" },
- { "sp_base.digging", "base.wav" },
- { "sp_buggy_base.digging", "base.wav" },
- { "sp_buggy_base.activating", "bug.wav" },
- { "sp_infotron.collecting", "infotron.wav" },
- { "sp_infotron.impact", "pling.wav" },
- { "sp_zonk.pushing", "zonkpush.wav" },
- { "sp_zonk.impact", "zonkdown.wav" },
- { "sp_disk_red.collecting", "infotron.wav" },
- { "sp_disk_orange.pushing", "zonkpush.wav" },
- { "sp_disk_yellow.pushing", "pusch.wav" },
- { "sp_port.passing", "gate.wav" },
- { "sp_exit.entering", "exit.wav" },
- { "sp_element.exploding", "booom.wav" },
- { "sp_sniksnak.moving", SND_FILE_UNDEFINED },
- { "sp_sniksnak.waiting", SND_FILE_UNDEFINED },
- { "sp_electron.moving", SND_FILE_UNDEFINED },
- { "sp_electron.waiting", SND_FILE_UNDEFINED },
- { "sp_terminal.activating", SND_FILE_UNDEFINED },
-
- /* sounds for Sokoban style elements and actions */
- { "sokoban_object.pushing", "pusch.wav" },
- { "sokoban_field.filling", "deng.wav" },
- { "sokoban_field.clearing", SND_FILE_UNDEFINED },
- { "sokoban_game.solving", "buing.wav" },
-
- /* sounds for Emerald Mine style elements and actions */
- { "empty_space.digging", "empty.wav" },
- { "sand.digging", "schlurf.wav" },
- { "emerald.collecting", "pong.wav" },
- { "emerald.impact", "pling.wav" },
- { "diamond.collecting", "pong.wav" },
- { "diamond.impact", "pling.wav" },
- { "diamond.breaking", "quirk.wav" },
- { "rock.pushing", "pusch.wav" },
- { "rock.impact", "klopf.wav" },
- { "bomb.pushing", "pusch.wav" },
- { "nut.pushing", "knurk.wav" },
- { "nut.cracking", "knack.wav" },
- { "nut.impact", "klumpf.wav" },
- { "dynamite.collecting", "pong.wav" },
- { "dynamite.placing", "deng.wav" },
- { "dynamite.burning", "zisch.wav" },
- { "key.collecting", "pong.wav" },
- { "gate.passing", "gate.wav" },
- { "bug.moving", "klapper.wav" },
- { "bug.waiting", "klapper.wav" },
- { "spaceship.moving", "roehr.wav" },
- { "spaceship.waiting", "roehr.wav" },
- { "yamyam.moving", SND_FILE_UNDEFINED },
- { "yamyam.waiting", "njam.wav" },
- { "yamyam.eating_diamond", SND_FILE_UNDEFINED },
- { "robot.stepping", "schlurf.wav" },
- { "robot.waiting", SND_FILE_UNDEFINED },
- { "robot_wheel.activating", "deng.wav" },
- { "robot_wheel.running", "miep.wav" },
- { "magic_wall.activating", "quirk.wav" },
- { "magic_wall.changing", "quirk.wav" },
- { "magic_wall.running", "miep.wav" },
- { "amoeba.waiting", SND_FILE_UNDEFINED },
- { "amoeba.creating", "amoebe.wav" },
- { "amoeba.dropping", SND_FILE_UNDEFINED },
- { "acid.splashing", "blurb.wav" },
- { "quicksand.filling", SND_FILE_UNDEFINED },
- { "quicksand.slipping_through", SND_FILE_UNDEFINED },
- { "quicksand.emptying", SND_FILE_UNDEFINED },
- { "exit.opening", "oeffnen.wav" },
- { "exit.entering", "buing.wav" },
-
- /* sounds for Emerald Mine Club style elements and actions */
- { "balloon.moving", SND_FILE_UNDEFINED },
- { "balloon.waiting", SND_FILE_UNDEFINED },
- { "balloon.pushing", "schlurf.wav" },
- { "balloon_switch.activating", SND_FILE_UNDEFINED },
- { "spring.moving", SND_FILE_UNDEFINED },
- { "spring.pushing", "pusch.wav" },
- { "spring.impact", "klopf.wav" },
- { "wall.growing", SND_FILE_UNDEFINED },
-
- /* sounds for Diamond Caves style elements and actions */
- { "pearl.collecting", "pong.wav" },
- { "pearl.breaking", "knack.wav" },
- { "pearl.impact", "pling.wav" },
- { "crystal.collecting", "pong.wav" },
- { "crystal.impact", "pling.wav" },
- { "envelope.collecting", "pong.wav" },
- { "sand_invisible.digging", "schlurf.wav" },
- { "shield_passive.collecting", "pong.wav" },
- { "shield_passive.activated", SND_FILE_UNDEFINED },
- { "shield_active.collecting", "pong.wav" },
- { "shield_active.activated", SND_FILE_UNDEFINED },
- { "extra_time.collecting", "gong.wav" },
- { "mole.moving", SND_FILE_UNDEFINED },
- { "mole.waiting", SND_FILE_UNDEFINED },
- { "mole.eating_amoeba", "blurb.wav" },
- { "switchgate_switch.activating", SND_FILE_UNDEFINED },
- { "switchgate.opening", "oeffnen.wav" },
- { "switchgate.closing", "oeffnen.wav" },
- { "switchgate.passing", "gate.wav" },
- { "timegate_wheel.activating", "deng.wav" },
- { "timegate_wheel.running", "miep.wav" },
- { "timegate.opening", "oeffnen.wav" },
- { "timegate.closing", "oeffnen.wav" },
- { "timegate.passing", "gate.wav" },
- { "conveyor_belt_switch.activating", SND_FILE_UNDEFINED },
- { "conveyor_belt.running", SND_FILE_UNDEFINED },
- { "light_switch.activating", SND_FILE_UNDEFINED },
- { "light_switch.deactivating", SND_FILE_UNDEFINED },
-
- /* sounds for DX Boulderdash style elements and actions */
- { "dx_bomb.pushing", "pusch.wav" },
- { "trap_inactive.digging", "schlurf.wav" },
- { "trap.activating", SND_FILE_UNDEFINED },
- { "tube.passing", SND_FILE_UNDEFINED },
-
- /* sounds for Rocks'n'Diamonds style elements and actions */
- { "amoeba.turning_to_gem", "pling.wav" },
- { "amoeba.turning_to_rock", "klopf.wav" },
- { "speed_pill.collecting", "pong.wav" },
- { "dynabomb_nr.collecting", "pong.wav" },
- { "dynabomb_sz.collecting", "pong.wav" },
- { "dynabomb_xl.collecting", "pong.wav" },
- { "dynabomb.placing", "deng.wav" },
- { "dynabomb.burning", "zisch.wav" },
- { "satellite.moving", SND_FILE_UNDEFINED },
- { "satellite.waiting", SND_FILE_UNDEFINED },
- { "satellite.pushing", "pusch.wav" },
- { "lamp.activating", "deng.wav" },
- { "lamp.deactivating", "deng.wav" },
- { "time_orb_full.collecting", "gong.wav" },
- { "time_orb_full.impact", "deng.wav" },
- { "time_orb_empty.pushing", "pusch.wav" },
- { "time_orb_empty.impact", "deng.wav" },
- { "gameoflife.waiting", SND_FILE_UNDEFINED },
- { "gameoflife.creating", "amoebe.wav" },
- { "biomaze.waiting", SND_FILE_UNDEFINED },
- { "biomaze.creating", "amoebe.wav" },
- { "pacman.moving", SND_FILE_UNDEFINED },
- { "pacman.waiting", SND_FILE_UNDEFINED },
- { "pacman.eating_amoeba", SND_FILE_UNDEFINED },
- { "dark_yamyam.moving", SND_FILE_UNDEFINED },
- { "dark_yamyam.waiting", "njam.wav" },
- { "dark_yamyam.eating_any", SND_FILE_UNDEFINED },
- { "penguin.moving", SND_FILE_UNDEFINED },
- { "penguin.waiting", SND_FILE_UNDEFINED },
- { "penguin.entering_exit", "buing.wav" },
- { "pig.moving", SND_FILE_UNDEFINED },
- { "pig.waiting", SND_FILE_UNDEFINED },
- { "pig.eating_gem", SND_FILE_UNDEFINED },
- { "dragon.moving", SND_FILE_UNDEFINED },
- { "dragon.waiting", SND_FILE_UNDEFINED },
- { "dragon.attacking", SND_FILE_UNDEFINED },
-
- /* sounds for generic elements and actions */
- { "player.dying", "autsch.wav" },
- { "element.exploding", "roaaar.wav" },
-
- /* sounds for other game actions */
- { "game.starting", SND_FILE_UNDEFINED },
- { "game.running_out_of_time", "gong.wav" },
- { "game.leveltime_bonus", "sirr.wav" },
- { "game.losing", "lachen.wav" },
- { "game.winning", SND_FILE_UNDEFINED },
-
- /* sounds for other non-game actions */
- { "menu.door_opening", "oeffnen.wav" },
- { "menu.door_closing", "oeffnen.wav" },
- { "menu.hall_of_fame", "halloffame.wav" },
- { "menu.info_screen", "rhythmloop.wav" },
-
-#if 0
- { "[not used]", "antigrav.wav" },
- { "[not used]", "bong.wav" },
- { "[not used]", "fuel.wav" },
- { "[not used]", "holz.wav" },
- { "[not used]", "hui.wav" },
- { "[not used]", "kabumm.wav" },
- { "[not used]", "kink.wav" },
- { "[not used]", "kling.wav" },
- { "[not used]", "krach.wav" },
- { "[not used]", "laser.wav" },
- { "[not used]", "quiek.wav" },
- { "[not used]", "rumms.wav" },
- { "[not used]", "schlopp.wav" },
- { "[not used]", "schrff.wav" },
- { "[not used]", "schwirr.wav" },
- { "[not used]", "slurp.wav" },
- { "[not used]", "sproing.wav" },
- { "[not used]", "warnton.wav" },
- { "[not used]", "whoosh.wav" },
- { "[not used]", "boom.wav" },
-#endif
-
- { NULL, NULL }
+ 0, /* GFX_ACTION_DEFAULT (0) */
+ 0, /* GFX_ACTION_WAITING (1) */
+
+ 1, /* GFX_ACTION_FALLING (2) */
+ 2, /* GFX_ACTION_MOVING (3) */
+ 3, /* GFX_ACTION_DIGGING (4) */
+ 4, /* GFX_ACTION_SNAPPING (5) */
+ 5, /* GFX_ACTION_COLLECTING (6) */
+ 6, /* GFX_ACTION_PUSHING (7) */
+
+ 7, /* GFX_ACTION_PASSING (8) */
+ 7, /* GFX_ACTION_IMPACT (9) */
+ 7, /* GFX_ACTION_CRACKING (10) */
+ 7, /* GFX_ACTION_BREAKING (11) */
+ 7, /* GFX_ACTION_ACTIVATING (12) */
+ 7, /* GFX_ACTION_OPENING (13) */
+ 7, /* GFX_ACTION_CLOSING (14) */
+ 7, /* GFX_ACTION_EATING (15) */
+ 7, /* GFX_ACTION_ATTACKING (16) */
+ 7, /* GFX_ACTION_GROWING (17) */
+ 7, /* GFX_ACTION_SHRINKING (18) */
+ 7 /* GFX_ACTION_OTHER (19) */
};
struct FileInfo *image_files;
{ "bomb", "bomb" },
{ "magic_wall", "magic wall" }, /* 20 */
{ "speed_pill", "speed pill" },
- { "acid", "acid pool" },
+ { "acid", "acid" },
{ "amoeba", "dropping amoeba" },
{ "amoeba", "normal amoeba" },
{ "nut", "nut with emerald" },
{ "gameoflife", "Conway's wall of life" },
{ "biomaze", "biomaze" },
{ "dynamite", "burning dynamite" },
- { NULL, "unknown" },
+ { "wall", "wall" },
{ "robot_wheel", "magic wheel" }, /* 30 */
{ "robot_wheel", "magic wheel (running)" },
{ "key", "red key" },
{ "dark_yamyam", "dark yam yam" }, /* 60 */
{ "bd_magic_wall", "magic wall (BD style)" },
{ "wall", "invisible steel wall" },
- { NULL, "-" },
+
+ { NULL, "(not used)" },
+
{ "dynabomb_nr", "increases number of bombs" },
{ "dynabomb_sz", "increases explosion size" },
{ "dynabomb_xl", "increases power of explosion" },
{ "emerald", "purple emerald" },
{ "wall", "wall with red emerald" },
{ "wall", "wall with purple emerald" },
- { NULL, "unknown" }, /* 100 */
- { NULL, "unknown" },
- { NULL, "unknown" },
- { NULL, "unknown" },
- { NULL, "unknown" },
- { NULL, "normal wall (BD style)" },
+ { "wall", "acid pool (top left)" }, /* 100 */
+ { "wall", "acid pool (top right)" },
+ { "wall", "acid pool (bottom left)" },
+ { "wall", "acid pool (bottom)" },
+ { "wall", "acid pool (bottom right)" },
+ { "wall", "normal wall (BD style)" },
{ "bd_rock", "rock (BD style)" },
{ "exit", "open exit" },
{ NULL, "black orb bomb" },
{ "gate", "gray door (EM style, yellow key)"},
{ "gate", "gray door (EM style, green key)"},
{ "gate", "gray door (EM style, blue key)"},
- { NULL, "unknown" },
- { NULL, "unknown" },
+
+ { NULL, "(not used)" },
+ { NULL, "(not used)" },
/* 256 */
{ "gate", "white door" }, /* 260 */
{ "gate", "gray door (opened by white key)"},
{ "key", "white key" },
- { "shield_passive", "shield (passive)" },
+ { "shield_normal", "shield (normal)" },
{ "extra_time", "extra time" },
{ "switchgate", "switch gate (open)" },
{ "switchgate", "switch gate (closed)" },
{ "mole", "mole (starts moving down)" },
{ "wall", "steel wall (slanted)" },
{ "sand", "invisible sand" },
- { NULL, "dx unknown 15" },
- { NULL, "dx unknown 42" },
- { NULL, "-" },
- { NULL, "-" }, /* 320 */
- { "shield_active", "shield (active, kills enemies)"},
+
+ { NULL, "dx unknown element 15" },
+ { NULL, "dx unknown element 42" },
+
+ { NULL, "(not used)" },
+ { NULL, "(not used)" }, /* 320 */
+
+ { "shield_deadly", "shield (deadly, kills enemies)"},
{ "timegate", "time gate (open)" },
{ "timegate", "time gate (closed)" },
- { "timegate_wheel", "switch for time gate" },
- { "timegate_wheel", "switch for time gate" },
+ { "timegate_switch", "switch for time gate" },
+ { "timegate_switch", "switch for time gate" },
{ "balloon", "balloon" },
- { "wall", "send balloon to the left" },
- { "wall", "send balloon to the right" },
+ { "balloon_switch", "send balloon to the left" },
+ { "balloon_switch", "send balloon to the right" },
{ "balloon_switch", "send balloon up" },
{ "balloon_switch", "send balloon down" }, /* 330 */
{ "balloon_switch", "send balloon in any direction" },
{ "spring", "spring" },
{ "trap", "trap" },
{ "dx_bomb", "stable bomb (DX style)" },
+ { NULL, "-" },
+ { NULL, "-" },
+ { "custom", "custom element 1" },
+ { "custom", "custom element 2" },
+ { "custom", "custom element 3" },
+ { "custom", "custom element 4" },
+ { "custom", "custom element 5" },
+ { "custom", "custom element 6" },
+ { "custom", "custom element 7" },
+ { "custom", "custom element 8" },
+ { "custom", "custom element 9" },
+ { "custom", "custom element 10" },
+ { "custom", "custom element 11" },
+ { "custom", "custom element 12" },
+ { "custom", "custom element 13" },
+ { "custom", "custom element 14" },
+ { "custom", "custom element 15" },
+ { "custom", "custom element 16" },
+ { "custom", "custom element 17" },
+ { "custom", "custom element 18" },
+ { "custom", "custom element 19" },
+ { "custom", "custom element 20" },
+ { "custom", "custom element 21" },
+ { "custom", "custom element 22" },
+ { "custom", "custom element 23" },
+ { "custom", "custom element 24" },
+ { "custom", "custom element 25" },
+ { "custom", "custom element 26" },
+ { "custom", "custom element 27" },
+ { "custom", "custom element 28" },
+ { "custom", "custom element 29" },
+ { "custom", "custom element 30" },
+ { "custom", "custom element 31" },
+ { "custom", "custom element 32" },
+ { "custom", "custom element 33" },
+ { "custom", "custom element 34" },
+ { "custom", "custom element 35" },
+ { "custom", "custom element 36" },
+ { "custom", "custom element 37" },
+ { "custom", "custom element 38" },
+ { "custom", "custom element 39" },
+ { "custom", "custom element 40" },
+ { "custom", "custom element 41" },
+ { "custom", "custom element 42" },
+ { "custom", "custom element 43" },
+ { "custom", "custom element 44" },
+ { "custom", "custom element 45" },
+ { "custom", "custom element 46" },
+ { "custom", "custom element 47" },
+ { "custom", "custom element 48" },
+ { "custom", "custom element 49" },
+ { "custom", "custom element 50" },
+ { "custom", "custom element 51" },
+ { "custom", "custom element 52" },
+ { "custom", "custom element 53" },
+ { "custom", "custom element 54" },
+ { "custom", "custom element 55" },
+ { "custom", "custom element 56" },
+ { "custom", "custom element 57" },
+ { "custom", "custom element 58" },
+ { "custom", "custom element 59" },
+ { "custom", "custom element 60" },
+ { "custom", "custom element 61" },
+ { "custom", "custom element 62" },
+ { "custom", "custom element 63" },
+ { "custom", "custom element 64" },
+ { "custom", "custom element 65" },
+ { "custom", "custom element 66" },
+ { "custom", "custom element 67" },
+ { "custom", "custom element 68" },
+ { "custom", "custom element 69" },
+ { "custom", "custom element 70" },
+ { "custom", "custom element 71" },
+ { "custom", "custom element 72" },
+ { "custom", "custom element 73" },
+ { "custom", "custom element 74" },
+ { "custom", "custom element 75" },
+ { "custom", "custom element 76" },
+ { "custom", "custom element 77" },
+ { "custom", "custom element 78" },
+ { "custom", "custom element 79" },
+ { "custom", "custom element 80" },
+ { "custom", "custom element 81" },
+ { "custom", "custom element 82" },
+ { "custom", "custom element 83" },
+ { "custom", "custom element 84" },
+ { "custom", "custom element 85" },
+ { "custom", "custom element 86" },
+ { "custom", "custom element 87" },
+ { "custom", "custom element 88" },
+ { "custom", "custom element 89" },
+ { "custom", "custom element 90" },
+ { "custom", "custom element 91" },
+ { "custom", "custom element 92" },
+ { "custom", "custom element 93" },
+ { "custom", "custom element 94" },
+ { "custom", "custom element 95" },
+ { "custom", "custom element 96" },
+ { "custom", "custom element 97" },
+ { "custom", "custom element 98" },
+ { "custom", "custom element 99" },
+ { "custom", "custom element 100" },
+ { "custom", "custom element 101" },
+ { "custom", "custom element 102" },
+ { "custom", "custom element 103" },
+ { "custom", "custom element 104" },
+ { "custom", "custom element 105" },
+ { "custom", "custom element 106" },
+ { "custom", "custom element 107" },
+ { "custom", "custom element 108" },
+ { "custom", "custom element 109" },
+ { "custom", "custom element 110" },
+ { "custom", "custom element 111" },
+ { "custom", "custom element 112" },
+ { "custom", "custom element 113" },
+ { "custom", "custom element 114" },
+ { "custom", "custom element 115" },
+ { "custom", "custom element 116" },
+ { "custom", "custom element 117" },
+ { "custom", "custom element 118" },
+ { "custom", "custom element 119" },
+ { "custom", "custom element 120" },
+ { "custom", "custom element 121" },
+ { "custom", "custom element 122" },
+ { "custom", "custom element 123" },
+ { "custom", "custom element 124" },
+ { "custom", "custom element 125" },
+ { "custom", "custom element 126" },
+ { "custom", "custom element 127" },
+ { "custom", "custom element 128" },
+
{ NULL, "-" }
/*
};
struct GraphicInfo graphic_info[MAX_GRAPHICS];
+struct NewGraphicInfo new_graphic_info[NUM_IMAGE_FILES];
/* ========================================================================= */