X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=daac63969d198c445b8bc923ab1acfac8c8d20d3;hb=aff866268cfa75327030bedcbf64a507fdc3fac2;hp=ec0a1c74a26369bf9e7361bc3b3c063552ce73a8;hpb=d0893e6987c21c25ec137438a18cfe1288362139;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index ec0a1c74..8c391363 100644 --- a/src/init.c +++ b/src/init.c @@ -1,456 +1,2303 @@ /*********************************************************** -* Rocks'n'Diamonds -- McDuffin Strikes Back! * +* Rocks'n'Diamonds -- McDuffin Strikes Back! * *----------------------------------------------------------* -* ©1995 Artsoft Development * -* Holger Schemel * -* 33659 Bielefeld-Senne * -* Telefon: (0521) 493245 * -* eMail: aeglos@valinor.owl.de * -* aeglos@uni-paderborn.de * -* q99492@pbhrzx.uni-paderborn.de * +* (c) 1995-2002 Artsoft Entertainment * +* Holger Schemel * +* Detmolder Strasse 189 * +* 33604 Bielefeld * +* Germany * +* e-mail: info@artsoft.org * *----------------------------------------------------------* -* init.c * -* * -* Letzte Aenderung: 15.06.1995 * +* init.c * ***********************************************************/ +#include "libgame/libgame.h" + #include "init.h" -#include "images.h" -#include "sound.h" +#include "events.h" #include "screens.h" -#include "tools.h" +#include "editor.h" #include "game.h" -#include "misc.h" +#include "tape.h" +#include "tools.h" +#include "files.h" +#include "network.h" +#include "netserv.h" +#include "cartoons.h" +#include "config.h" -#include +static char *image_filename[NUM_PICTURES] = +{ + "RocksScreen.pcx", + "RocksElements.pcx", + "RocksDoor.pcx", + "RocksHeroes.pcx", + "RocksToons.pcx", + "RocksSP.pcx", + "RocksDC.pcx", + "RocksMore.pcx", + "RocksFontBig.pcx", + "RocksFontSmall.pcx", + "RocksFontMedium.pcx", + "RocksFontEM.pcx" +}; -int sound_process_id=0; +static void InitSetup(void); +static void InitPlayerInfo(void); +static void InitLevelInfo(void); +static void InitArtworkInfo(void); +static void InitLevelArtworkInfo(void); +static void InitNetworkServer(void); +static void InitImages(void); +static void InitMixer(void); +static void InitSound(void); +static void InitGfx(void); +static void InitGfxBackground(void); +static void InitGadgets(void); +static void InitElementProperties(void); +static void InitElementInfo(void); +static void InitGraphicInfo(void); +static void InitSoundInfo(); +static void Execute_Debug_Command(char *); -void OpenAll(int argc, char *argv[]) +void OpenAll(void) { - LoadLevelInfo(); - LoadPlayerInfo(PLAYER_SETUP); - LoadPlayerInfo(PLAYER_LEVEL); + if (options.debug_command) + { + Execute_Debug_Command(options.debug_command); + + exit(0); + } + + if (options.serveronly) + { +#if defined(PLATFORM_UNIX) + NetworkServer(options.server_port, options.serveronly); +#else + Error(ERR_WARN, "networking only supported in Unix version"); +#endif + exit(0); /* never reached */ + } + + InitProgramInfo(UNIX_USERDATA_DIRECTORY, + PROGRAM_TITLE_STRING, getWindowTitleString(), + ICON_TITLE_STRING, X11_ICON_FILENAME, X11_ICONMASK_FILENAME, + MSDOS_POINTER_FILENAME, + COOKIE_PREFIX, FILENAME_PREFIX, GAME_VERSION_ACTUAL); + + InitSetup(); + InitPlayerInfo(); + InitArtworkInfo(); /* needed before loading gfx, sound & music */ InitCounter(); - InitSound(); - InitSoundProcess(); - InitJoystick(); + InitMixer(); + InitJoysticks(); InitRND(NEW_RANDOMIZE); - signal(SIGINT, CloseAll); - signal(SIGTERM, CloseAll); + InitVideoDisplay(); + InitVideoBuffer(&backbuffer, &window, WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, + setup.fullscreen); + + InitEventFilter(FilterMouseMotionEvents); - InitDisplay(argc, argv); - InitWindow(argc, argv); InitGfx(); + InitElementProperties(); /* initializes IS_CHAR() for el2gfx() */ + InitElementInfo(); + + InitLevelInfo(); + InitLevelArtworkInfo(); + InitGadgets(); /* needs to know number of level series */ + InitImages(); /* needs to know current level directory */ + InitSound(); /* needs to know current level directory */ + + InitGfxBackground(); + InitToons(); DrawMainMenu(); - XMapWindow(display, window); - XFlush(display); + InitNetworkServer(); +} + +void InitSetup() +{ + LoadSetup(); /* global setup info */ } -void InitSound() +void InitPlayerInfo() { int i; - if (sound_status==SOUND_OFF) - return; + /* choose default local player */ + local_player = &stored_player[0]; - if (access(sound_device_name,W_OK)<0) - { - fprintf(stderr,"%s: cannot access sound device - no sounds\n",progname); - sound_status=SOUND_OFF; + for (i=0; iconnected = TRUE; +} + +void InitLevelInfo() +{ + LoadLevelInfo(); /* global level info */ + LoadLevelSetup_LastSeries(); /* last played series info */ + LoadLevelSetup_SeriesInfo(); /* last played level info */ +} + +void InitArtworkInfo() +{ + LoadArtworkInfo(); +} + +void InitLevelArtworkInfo() +{ + LoadLevelArtworkInfo(); +} + +void InitNetworkServer() +{ +#if defined(PLATFORM_UNIX) + int nr_wanted; +#endif + + if (!options.network) return; - } - if ((sound_device=open(sound_device_name,O_WRONLY))<0) +#if defined(PLATFORM_UNIX) + nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED); + + if (!ConnectToServer(options.server_host, options.server_port)) + Error(ERR_EXIT, "cannot connect to network game server"); + + SendToServer_PlayerName(setup.player_name); + SendToServer_ProtocolVersion(); + + if (nr_wanted) + SendToServer_NrWanted(nr_wanted); +#endif +} + +static void InitImages() +{ + InitImageList(image_config, image_config_suffix, NUM_IMAGE_FILES); + + /* load custom images */ + ReloadCustomImages(); + + InitGraphicInfo(); +} + +static void InitMixer() +{ + OpenAudio(); + + InitSoundList(sound_config, sound_config_suffix, NUM_SOUND_FILES); + + StartMixer(); +} + +static void InitSound() +{ + /* load custom sounds and music */ + InitReloadSounds(artwork.snd_current->identifier); + InitReloadMusic(artwork.mus_current->identifier); + + InitSoundInfo(); +} + +static void InitTileClipmasks() +{ +#if defined(TARGET_X11) + XGCValues clip_gc_values; + unsigned long clip_gc_valuemask; + +#if defined(TARGET_X11_NATIVE) + GC copy_clipmask_gc; + + static struct { - fprintf(stderr,"%s: cannot open sound device - no sounds\n",progname); - sound_status=SOUND_OFF; - return; + int start; + int count; } + tile_needs_clipping[] = + { + { GFX_SPIELER1_UP, 4 }, + { GFX_SPIELER1_DOWN, 4 }, + { GFX_SPIELER1_LEFT, 4 }, + { GFX_SPIELER1_RIGHT, 4 }, + { GFX_SPIELER1_PUSH_LEFT, 4 }, + { GFX_SPIELER1_PUSH_RIGHT, 4 }, + { GFX_SPIELER2_UP, 4 }, + { GFX_SPIELER2_DOWN, 4 }, + { GFX_SPIELER2_LEFT, 4 }, + { GFX_SPIELER2_RIGHT, 4 }, + { GFX_SPIELER2_PUSH_LEFT, 4 }, + { GFX_SPIELER2_PUSH_RIGHT, 4 }, + { GFX_SPIELER3_UP, 4 }, + { GFX_SPIELER3_DOWN, 4 }, + { GFX_SPIELER3_LEFT, 4 }, + { GFX_SPIELER3_RIGHT, 4 }, + { GFX_SPIELER3_PUSH_LEFT, 4 }, + { GFX_SPIELER3_PUSH_RIGHT, 4 }, + { GFX_SPIELER4_UP, 4 }, + { GFX_SPIELER4_DOWN, 4 }, + { GFX_SPIELER4_LEFT, 4 }, + { GFX_SPIELER4_RIGHT, 4 }, + { GFX_SPIELER4_PUSH_LEFT, 4 }, + { GFX_SPIELER4_PUSH_RIGHT, 4 }, + { GFX_SP_MURPHY, 1 }, + { GFX_MURPHY_GO_LEFT, 3 }, + { GFX_MURPHY_GO_RIGHT, 3 }, + { GFX_MURPHY_SNAP_UP, 1 }, + { GFX_MURPHY_SNAP_DOWN, 1 }, + { GFX_MURPHY_SNAP_RIGHT, 1 }, + { GFX_MURPHY_SNAP_LEFT, 1 }, + { GFX_MURPHY_PUSH_RIGHT, 1 }, + { GFX_MURPHY_PUSH_LEFT, 1 }, + { GFX_GEBLUBBER, 4 }, + { GFX_DYNAMIT, 7 }, + { GFX_DYNABOMB, 4 }, + { GFX_EXPLOSION, 8 }, + { GFX_SOKOBAN_OBJEKT, 1 }, + { GFX_FUNKELN_BLAU, 3 }, + { GFX_FUNKELN_WEISS, 3 }, + { GFX2_SHIELD_PASSIVE, 3 }, + { GFX2_SHIELD_ACTIVE, 3 }, + { -1, 0 } + }; +#endif /* TARGET_X11_NATIVE */ +#endif /* TARGET_X11 */ + + int i; - close(sound_device); - sound_status=SOUND_AVAILABLE; + /* initialize pixmap array for special X11 tile clipping to Pixmap 'None' */ + for(i=0; idrawable, + clip_gc_valuemask, &clip_gc_values); - for(i=0;iclip_mask) { - sound_status=SOUND_OFF; - return; + clip_gc_values.graphics_exposures = False; + clip_gc_values.clip_mask = pix[i]->clip_mask; + clip_gc_valuemask = GCGraphicsExposures | GCClipMask; + pix[i]->stored_clip_gc = XCreateGC(display, window->drawable, + clip_gc_valuemask, &clip_gc_values); } } -} -void InitSoundProcess() -{ - if (sound_status==SOUND_OFF) - return; +#if defined(TARGET_X11_NATIVE) - if (pipe(sound_pipe)<0) + /* create graphic context structures needed for clipping */ + clip_gc_values.graphics_exposures = False; + clip_gc_valuemask = GCGraphicsExposures; + copy_clipmask_gc = XCreateGC(display, pix[PIX_BACK]->clip_mask, + clip_gc_valuemask, &clip_gc_values); + + /* create only those clipping Pixmaps we really need */ + for(i=0; tile_needs_clipping[i].start>=0; i++) { - fprintf(stderr,"%s: cannot create pipe - no sounds\n",progname); - sound_status=SOUND_OFF; - return; - } + int j; - if ((sound_process_id=fork())<0) - { - fprintf(stderr,"%s: cannot create child process - no sounds\n",progname); - sound_status=SOUND_OFF; - return; + for(j=0; jclip_mask; + + tile_clipmask[tile] = XCreatePixmap(display, window->drawable, + TILEX, TILEY, 1); + + XCopyArea(display, src_pixmap, tile_clipmask[tile], copy_clipmask_gc, + src_x, src_y, TILEX, TILEY, 0, 0); + } } - if (!sound_process_id) /* we are child */ - SoundServer(); - else /* we are parent */ - close(sound_pipe[0]); /* no reading from pipe needed */ + XFreeGC(display, copy_clipmask_gc); + +#endif /* TARGET_X11_NATIVE */ +#endif /* TARGET_X11 */ } -void InitJoystick() +void FreeTileClipmasks() { - if (global_joystick_status==JOYSTICK_OFF) - return; +#if defined(TARGET_X11) + int i; - if (access(joystick_device_name[joystick_nr],R_OK)<0) + for(i=0; istored_clip_gc) + { + XFreeGC(display, pix[i]->stored_clip_gc); + pix[i]->stored_clip_gc = None; + } } - - joystick_status = JOYSTICK_AVAILABLE; - LoadJoystickData(); +#endif /* TARGET_X11 */ } -void InitDisplay(int argc, char *argv[]) +void InitGfx() { - char *display_name = NULL; int i; - /* get X server to connect to, if given as an argument */ - for (i=1;iidentifier; + char *snd_new_identifier = artwork.snd_current->identifier; + char *mus_new_identifier = artwork.mus_current->identifier; + +#if 0 + printf("graphics --> '%s' ('%s')\n", + artwork.gfx_current_identifier, artwork.gfx_current->filename); + printf("sounds --> '%s' ('%s')\n", + artwork.snd_current_identifier, artwork.snd_current->filename); + printf("music --> '%s' ('%s')\n", + artwork.mus_current_identifier, artwork.mus_current->filename); +#endif + + /* leveldir_current may be invalid (level group, parent link) */ + if (!validLevelSeries(leveldir_current)) + return; + +#if 0 + printf("--> '%s'\n", artwork.gfx_current_identifier); +#endif + + /* when a new level series was selected, check if there was a change + in custom artwork stored in level series directory */ + if (leveldir_current_identifier != leveldir_current->identifier) { - fprintf(stderr, "%s: cannot read icon bitmap file '%s'.\n", - progname,icon_filename); - exit(-1); + char *identifier_old = leveldir_current_identifier; + char *identifier_new = leveldir_current->identifier; + + if (getTreeInfoFromIdentifier(artwork.gfx_first, identifier_old) != + getTreeInfoFromIdentifier(artwork.gfx_first, identifier_new)) + gfx_new_identifier = identifier_new; + if (getTreeInfoFromIdentifier(artwork.snd_first, identifier_old) != + getTreeInfoFromIdentifier(artwork.snd_first, identifier_new)) + snd_new_identifier = identifier_new; + if (getTreeInfoFromIdentifier(artwork.mus_first, identifier_new) != + getTreeInfoFromIdentifier(artwork.mus_first, identifier_new)) + mus_new_identifier = identifier_new; + + leveldir_current_identifier = leveldir_current->identifier; } - size_hints.flags = PSize | PMinSize | PMaxSize; - size_hints.width = size_hints.min_width = size_hints.max_width = width; - size_hints.height = size_hints.min_height = size_hints.max_height = height; + /* custom level artwork configured in level series configuration file + always overrides custom level artwork stored in level series directory + and (level independant) custom artwork configured in setup menue */ + if (leveldir_current->graphics_set != NULL) + gfx_new_identifier = leveldir_current->graphics_set; + if (leveldir_current->sounds_set != NULL) + snd_new_identifier = leveldir_current->sounds_set; + if (leveldir_current->music_set != NULL) + mus_new_identifier = leveldir_current->music_set; + + if (strcmp(artwork.gfx_current_identifier, gfx_new_identifier) != 0 || + last_override_level_graphics != setup.override_level_graphics) + { + int i; + + setLevelArtworkDir(artwork.gfx_first); + + ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); + + for(i=0; i -1) { - fprintf(stderr, "%s: cannot create additional Pixmaps!\n",progname); - CloseAll(); - exit(-1); + int element = element_to_graphic[i].element; + int graphic = element_to_graphic[i].graphic; + + element_info[element].graphic[GFX_ACTION_DEFAULT] = graphic; + i++; } - /* create GC for drawing with bitplane depth */ - gc_values.graphics_exposures = False; - gc_values.foreground = pen_bg; - gc_values.background = pen_bg; - gc_valuemask = GCGraphicsExposures | GCForeground | GCBackground; - plane_gc = XCreateGC(display, clipmask[PIX_BACK], gc_valuemask, &gc_values); + /* this initializes special graphics for left/right/up/down directions */ + i = 0; + while (element_to_direction_graphic[i].element > -1) + { + int element = element_to_direction_graphic[i].element; + + element_info[element].direction_graphic[GFX_ACTION_DEFAULT][MV_BIT_LEFT] = + element_to_direction_graphic[i].graphic_left; + element_info[element].direction_graphic[GFX_ACTION_DEFAULT][MV_BIT_RIGHT] = + element_to_direction_graphic[i].graphic_right; + element_info[element].direction_graphic[GFX_ACTION_DEFAULT][MV_BIT_UP] = + element_to_direction_graphic[i].graphic_up; + element_info[element].direction_graphic[GFX_ACTION_DEFAULT][MV_BIT_DOWN] = + element_to_direction_graphic[i].graphic_down; + + element_info[element].has_direction_graphic[GFX_ACTION_DEFAULT] = TRUE; + i++; + } +} + +static void InitGraphicInfo() +{ + int i; - for(y=0;y<=SCR_FIELDY;y++) for(x=0;x<=SCR_FIELDX;x++) - XCopyArea(display,clipmask[PIX_BACK],clipmask[PIX_FADEMASK],plane_gc, - SX+2*TILEX,SY+10*TILEY,TILEX,TILEY,x*TILEX,y*TILEY); + image_files = getCurrentImageList(); - for(i=0;i %d\n", image_files[GFX_BD_DIAMOND].parameter[GFX_ARG_NUM_FRAMES]); + printf("W> %d\n", image_files[GFX_ROBOT_WHEEL].parameter[GFX_ARG_NUM_FRAMES]); + + graphic_info[GFX_ABLENK].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL); + graphic_info[GFX_ABLENK].src_x = 0; + graphic_info[GFX_ABLENK].src_y = 0; + + graphic_info[GFX_ABLENK + 1].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL); + graphic_info[GFX_ABLENK + 2].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL); + graphic_info[GFX_ABLENK + 3].bitmap = getBitmapFromImageID(GFX_ROBOT_WHEEL); + graphic_info[GFX_ABLENK + 1].src_x = 1 * TILEX; + graphic_info[GFX_ABLENK + 2].src_x = 2 * TILEX; + graphic_info[GFX_ABLENK + 3].src_x = 3 * TILEX; + graphic_info[GFX_ABLENK + 1].src_y = 0; + graphic_info[GFX_ABLENK + 2].src_y = 0; + graphic_info[GFX_ABLENK + 3].src_y = 0; +#endif } -void CloseAll() +static void InitSoundInfo() { - int i; + sound_files = getCurrentSoundList(); + + /* initialize sound effect lookup table for element actions */ + InitGameSound(); +} + +void InitElementProperties() +{ + int i, j; + + static int ep_amoebalive[] = + { + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA + }; + static int ep_amoebalive_num = SIZEOF_ARRAY_INT(ep_amoebalive); + + static int ep_amoeboid[] = + { + EL_AMOEBA_DEAD, + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA + }; + static int ep_amoeboid_num = SIZEOF_ARRAY_INT(ep_amoeboid); + + static int ep_schluessel[] = + { + EL_KEY1, + EL_KEY2, + EL_KEY3, + EL_KEY4, + EL_EM_KEY_1, + EL_EM_KEY_2, + EL_EM_KEY_3, + EL_EM_KEY_4 + }; + static int ep_schluessel_num = SIZEOF_ARRAY_INT(ep_schluessel); + + static int ep_pforte[] = + { + EL_GATE1, + EL_GATE2, + EL_GATE3, + EL_GATE4, + EL_GATE1_GRAY, + EL_GATE2_GRAY, + EL_GATE3_GRAY, + EL_GATE4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1X, + EL_EM_GATE_2X, + EL_EM_GATE_3X, + EL_EM_GATE_4X, + EL_SWITCHGATE_OPEN, + EL_SWITCHGATE_OPENING, + EL_SWITCHGATE_CLOSED, + EL_SWITCHGATE_CLOSING, + EL_TIMEGATE_OPEN, + EL_TIMEGATE_OPENING, + EL_TIMEGATE_CLOSED, + EL_TIMEGATE_CLOSING, + EL_TUBE_CROSS, + EL_TUBE_VERTICAL, + EL_TUBE_HORIZONTAL, + EL_TUBE_VERT_LEFT, + EL_TUBE_VERT_RIGHT, + EL_TUBE_HORIZ_UP, + EL_TUBE_HORIZ_DOWN, + EL_TUBE_LEFT_UP, + EL_TUBE_LEFT_DOWN, + EL_TUBE_RIGHT_UP, + EL_TUBE_RIGHT_DOWN + }; + static int ep_pforte_num = SIZEOF_ARRAY_INT(ep_pforte); + + static int ep_solid[] = + { + EL_STEELWALL, + EL_WALL, + EL_MAUER_LEBT, + EL_MAUER_X, + EL_MAUER_Y, + EL_MAUER_XY, + EL_BD_WALL, + EL_WALL_CRUMBLED, + EL_EXIT_CLOSED, + EL_AUSGANG_ACT, + EL_EXIT_OPEN, + EL_AMOEBA_DEAD, + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA, + EL_QUICKSAND_FULL, + EL_QUICKSAND_EMPTY, + EL_QUICKSAND_FILLING, + EL_QUICKSAND_EMPTYING, + EL_MAGIC_WALL, + EL_MAGIC_WALL_EMPTY, + EL_MAGIC_WALL_EMPTYING, + EL_MAGIC_WALL_FILLING, + EL_MAGIC_WALL_FULL, + EL_MAGIC_WALL_DEAD, + EL_MAGIC_WALL_BD_OFF, + EL_MAGIC_WALL_BD_EMPTY, + EL_MAGIC_WALL_BD_EMPTYING, + EL_MAGIC_WALL_BD_FULL, + EL_MAGIC_WALL_BD_FILLING, + EL_MAGIC_WALL_BD_DEAD, + EL_GAMEOFLIFE, + EL_BIOMAZE, + EL_ACIDPOOL_TOPLEFT, + EL_ACIDPOOL_TOPRIGHT, + EL_ACIDPOOL_BOTTOMLEFT, + EL_ACIDPOOL_BOTTOM, + EL_ACIDPOOL_BOTTOMRIGHT, + EL_SP_CHIP_SINGLE, + EL_SP_CHIP_LEFT, + EL_SP_CHIP_RIGHT, + EL_SP_CHIP_UPPER, + EL_SP_CHIP_LOWER, + EL_SP_HARD_GRAY, + EL_SP_HARD_GREEN, + EL_SP_HARD_BLUE, + EL_SP_HARD_RED, + EL_SP_HARD_YELLOW, + EL_SP_HARD_BASE1, + EL_SP_HARD_BASE2, + EL_SP_HARD_BASE3, + EL_SP_HARD_BASE4, + EL_SP_HARD_BASE5, + EL_SP_HARD_BASE6, + EL_SP_TERMINAL, + EL_SP_TERMINAL_ACTIVE, + EL_SP_EXIT, + EL_INVISIBLE_STEEL, + EL_BELT1_SWITCH_LEFT, + EL_BELT1_SWITCH_MIDDLE, + EL_BELT1_SWITCH_RIGHT, + EL_BELT2_SWITCH_LEFT, + EL_BELT2_SWITCH_MIDDLE, + EL_BELT2_SWITCH_RIGHT, + EL_BELT3_SWITCH_LEFT, + EL_BELT3_SWITCH_MIDDLE, + EL_BELT3_SWITCH_RIGHT, + EL_BELT4_SWITCH_LEFT, + EL_BELT4_SWITCH_MIDDLE, + EL_BELT4_SWITCH_RIGHT, + EL_SWITCHGATE_SWITCH_1, + EL_SWITCHGATE_SWITCH_2, + EL_LIGHT_SWITCH_OFF, + EL_LIGHT_SWITCH_ON, + EL_TIMEGATE_SWITCH_OFF, + EL_TIMEGATE_SWITCH_ON, + EL_SIGN_EXCLAMATION, + EL_SIGN_RADIOACTIVITY, + EL_SIGN_STOP, + EL_SIGN_WHEELCHAIR, + EL_SIGN_PARKING, + EL_SIGN_ONEWAY, + EL_SIGN_HEART, + EL_SIGN_TRIANGLE, + EL_SIGN_ROUND, + EL_SIGN_EXIT, + EL_SIGN_YINYANG, + EL_SIGN_OTHER, + EL_STEEL_SLANTED, + EL_EMC_STEEL_WALL_1, + EL_EMC_STEEL_WALL_2, + EL_EMC_STEEL_WALL_3, + EL_EMC_STEEL_WALL_4, + EL_EMC_WALL_1, + EL_EMC_WALL_2, + EL_EMC_WALL_3, + EL_EMC_WALL_4, + EL_EMC_WALL_5, + EL_EMC_WALL_6, + EL_EMC_WALL_7, + EL_EMC_WALL_8, + EL_CRYSTAL, + EL_WALL_PEARL, + EL_WALL_CRYSTAL, + EL_GATE1, + EL_GATE2, + EL_GATE3, + EL_GATE4, + EL_GATE1_GRAY, + EL_GATE2_GRAY, + EL_GATE3_GRAY, + EL_GATE4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1X, + EL_EM_GATE_2X, + EL_EM_GATE_3X, + EL_EM_GATE_4X, + EL_SWITCHGATE_OPEN, + EL_SWITCHGATE_OPENING, + EL_SWITCHGATE_CLOSED, + EL_SWITCHGATE_CLOSING, + EL_TIMEGATE_OPEN, + EL_TIMEGATE_OPENING, + EL_TIMEGATE_CLOSED, + EL_TIMEGATE_CLOSING, + EL_TUBE_CROSS, + EL_TUBE_VERTICAL, + EL_TUBE_HORIZONTAL, + EL_TUBE_VERT_LEFT, + EL_TUBE_VERT_RIGHT, + EL_TUBE_HORIZ_UP, + EL_TUBE_HORIZ_DOWN, + EL_TUBE_LEFT_UP, + EL_TUBE_LEFT_DOWN, + EL_TUBE_RIGHT_UP, + EL_TUBE_RIGHT_DOWN + }; + static int ep_solid_num = SIZEOF_ARRAY_INT(ep_solid); + + static int ep_massive[] = + { + EL_STEELWALL, + EL_ACID, + EL_ACIDPOOL_TOPLEFT, + EL_ACIDPOOL_TOPRIGHT, + EL_ACIDPOOL_BOTTOMLEFT, + EL_ACIDPOOL_BOTTOM, + EL_ACIDPOOL_BOTTOMRIGHT, + EL_SP_HARD_GRAY, + EL_SP_HARD_GREEN, + EL_SP_HARD_BLUE, + EL_SP_HARD_RED, + EL_SP_HARD_YELLOW, + EL_SP_HARD_BASE1, + EL_SP_HARD_BASE2, + EL_SP_HARD_BASE3, + EL_SP_HARD_BASE4, + EL_SP_HARD_BASE5, + EL_SP_HARD_BASE6, + EL_INVISIBLE_STEEL, + EL_BELT1_SWITCH_LEFT, + EL_BELT1_SWITCH_MIDDLE, + EL_BELT1_SWITCH_RIGHT, + EL_BELT2_SWITCH_LEFT, + EL_BELT2_SWITCH_MIDDLE, + EL_BELT2_SWITCH_RIGHT, + EL_BELT3_SWITCH_LEFT, + EL_BELT3_SWITCH_MIDDLE, + EL_BELT3_SWITCH_RIGHT, + EL_BELT4_SWITCH_LEFT, + EL_BELT4_SWITCH_MIDDLE, + EL_BELT4_SWITCH_RIGHT, + EL_LIGHT_SWITCH_OFF, + EL_LIGHT_SWITCH_ON, + EL_SIGN_EXCLAMATION, + EL_SIGN_RADIOACTIVITY, + EL_SIGN_STOP, + EL_SIGN_WHEELCHAIR, + EL_SIGN_PARKING, + EL_SIGN_ONEWAY, + EL_SIGN_HEART, + EL_SIGN_TRIANGLE, + EL_SIGN_ROUND, + EL_SIGN_EXIT, + EL_SIGN_YINYANG, + EL_SIGN_OTHER, + EL_STEEL_SLANTED, + EL_EMC_STEEL_WALL_1, + EL_EMC_STEEL_WALL_2, + EL_EMC_STEEL_WALL_3, + EL_EMC_STEEL_WALL_4, + EL_CRYSTAL, + EL_GATE1, + EL_GATE2, + EL_GATE3, + EL_GATE4, + EL_GATE1_GRAY, + EL_GATE2_GRAY, + EL_GATE3_GRAY, + EL_GATE4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1X, + EL_EM_GATE_2X, + EL_EM_GATE_3X, + EL_EM_GATE_4X, + EL_SWITCHGATE_OPEN, + EL_SWITCHGATE_OPENING, + EL_SWITCHGATE_CLOSED, + EL_SWITCHGATE_CLOSING, + EL_TIMEGATE_OPEN, + EL_TIMEGATE_OPENING, + EL_TIMEGATE_CLOSED, + EL_TIMEGATE_CLOSING, + EL_TUBE_CROSS, + EL_TUBE_VERTICAL, + EL_TUBE_HORIZONTAL, + EL_TUBE_VERT_LEFT, + EL_TUBE_VERT_RIGHT, + EL_TUBE_HORIZ_UP, + EL_TUBE_HORIZ_DOWN, + EL_TUBE_LEFT_UP, + EL_TUBE_LEFT_DOWN, + EL_TUBE_RIGHT_UP, + EL_TUBE_RIGHT_DOWN + }; + static int ep_massive_num = SIZEOF_ARRAY_INT(ep_massive); + + static int ep_slippery[] = + { + EL_WALL_CRUMBLED, + EL_BD_WALL, + EL_ROCK, + EL_BD_ROCK, + EL_EMERALD, + EL_EDELSTEIN_BD, + EL_EDELSTEIN_YELLOW, + EL_EDELSTEIN_RED, + EL_EDELSTEIN_PURPLE, + EL_DIAMOND, + EL_BOMB, + EL_NUT, + EL_ROBOT_WHEEL_ACTIVE, + EL_ROBOT_WHEEL, + EL_TIME_ORB_FULL, + EL_TIME_ORB_EMPTY, + EL_LAMP_ACTIVE, + EL_LAMP, + EL_ACIDPOOL_TOPLEFT, + EL_ACIDPOOL_TOPRIGHT, + EL_SONDE, + EL_SP_ZONK, + EL_SP_INFOTRON, + EL_SP_CHIP_SINGLE, + EL_SP_CHIP_LEFT, + EL_SP_CHIP_RIGHT, + EL_SP_CHIP_UPPER, + EL_SP_CHIP_LOWER, + EL_SPEED_PILL, + EL_STEEL_SLANTED, + EL_PEARL, + EL_CRYSTAL + }; + static int ep_slippery_num = SIZEOF_ARRAY_INT(ep_slippery); + + static int ep_enemy[] = + { + EL_BUG, + EL_SPACESHIP, + EL_BUTTERFLY, + EL_FIREFLY, + EL_YAMYAM, + EL_DARK_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON + }; + static int ep_enemy_num = SIZEOF_ARRAY_INT(ep_enemy); + + static int ep_mauer[] = + { + EL_STEELWALL, + EL_GATE1, + EL_GATE2, + EL_GATE3, + EL_GATE4, + EL_GATE1_GRAY, + EL_GATE2_GRAY, + EL_GATE3_GRAY, + EL_GATE4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1X, + EL_EM_GATE_2X, + EL_EM_GATE_3X, + EL_EM_GATE_4X, + EL_EXIT_CLOSED, + EL_AUSGANG_ACT, + EL_EXIT_OPEN, + EL_WALL, + EL_WALL_CRUMBLED, + EL_MAUER_LEBT, + EL_MAUER_X, + EL_MAUER_Y, + EL_MAUER_XY, + EL_MAUERND, + EL_BD_WALL, + EL_SP_CHIP_SINGLE, + EL_SP_CHIP_LEFT, + EL_SP_CHIP_RIGHT, + EL_SP_CHIP_UPPER, + EL_SP_CHIP_LOWER, + EL_SP_HARD_GRAY, + EL_SP_HARD_GREEN, + EL_SP_HARD_BLUE, + EL_SP_HARD_RED, + EL_SP_HARD_YELLOW, + EL_SP_HARD_BASE1, + EL_SP_HARD_BASE2, + EL_SP_HARD_BASE3, + EL_SP_HARD_BASE4, + EL_SP_HARD_BASE5, + EL_SP_HARD_BASE6, + EL_SP_TERMINAL, + EL_SP_TERMINAL_ACTIVE, + EL_SP_EXIT, + EL_INVISIBLE_STEEL, + EL_STEEL_SLANTED, + EL_EMC_STEEL_WALL_1, + EL_EMC_STEEL_WALL_2, + EL_EMC_STEEL_WALL_3, + EL_EMC_STEEL_WALL_4, + EL_EMC_WALL_1, + EL_EMC_WALL_2, + EL_EMC_WALL_3, + EL_EMC_WALL_4, + EL_EMC_WALL_5, + EL_EMC_WALL_6, + EL_EMC_WALL_7, + EL_EMC_WALL_8 + }; + static int ep_mauer_num = SIZEOF_ARRAY_INT(ep_mauer); + + static int ep_can_fall[] = + { + EL_ROCK, + EL_BD_ROCK, + EL_EMERALD, + EL_EDELSTEIN_BD, + EL_EDELSTEIN_YELLOW, + EL_EDELSTEIN_RED, + EL_EDELSTEIN_PURPLE, + EL_DIAMOND, + EL_BOMB, + EL_NUT, + EL_AMOEBA_DROP, + EL_QUICKSAND_FULL, + EL_MAGIC_WALL_FULL, + EL_MAGIC_WALL_BD_FULL, + EL_TIME_ORB_FULL, + EL_TIME_ORB_EMPTY, + EL_SP_ZONK, + EL_SP_INFOTRON, + EL_SP_DISK_ORANGE, + EL_PEARL, + EL_CRYSTAL, + EL_SPRING, + EL_DX_SUPABOMB + }; + static int ep_can_fall_num = SIZEOF_ARRAY_INT(ep_can_fall); + + static int ep_can_smash[] = + { + EL_ROCK, + EL_BD_ROCK, + EL_EMERALD, + EL_EDELSTEIN_BD, + EL_EDELSTEIN_YELLOW, + EL_EDELSTEIN_RED, + EL_EDELSTEIN_PURPLE, + EL_DIAMOND, + EL_KEY1, + EL_KEY2, + EL_KEY3, + EL_KEY4, + EL_EM_KEY_1, + EL_EM_KEY_2, + EL_EM_KEY_3, + EL_EM_KEY_4, + EL_BOMB, + EL_NUT, + EL_AMOEBA_DROP, + EL_TIME_ORB_FULL, + EL_TIME_ORB_EMPTY, + EL_SP_ZONK, + EL_SP_INFOTRON, + EL_SP_DISK_ORANGE, + EL_PEARL, + EL_CRYSTAL, + EL_SPRING, + EL_DX_SUPABOMB + }; + static int ep_can_smash_num = SIZEOF_ARRAY_INT(ep_can_smash); + + static int ep_can_change[] = + { + EL_ROCK, + EL_BD_ROCK, + EL_EMERALD, + EL_EDELSTEIN_BD, + EL_EDELSTEIN_YELLOW, + EL_EDELSTEIN_RED, + EL_EDELSTEIN_PURPLE, + EL_DIAMOND + }; + static int ep_can_change_num = SIZEOF_ARRAY_INT(ep_can_change); - if (sound_process_id) + static int ep_can_move[] = { - StopSounds(); - kill(sound_process_id, SIGTERM); - FreeSounds(NUM_SOUNDS); + EL_BUG, + EL_SPACESHIP, + EL_BUTTERFLY, + EL_FIREFLY, + EL_YAMYAM, + EL_DARK_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_MOLE, + EL_PINGUIN, + EL_SCHWEIN, + EL_DRACHE, + EL_SONDE, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON, + EL_BALLOON, + EL_SPRING_MOVING + }; + static int ep_can_move_num = SIZEOF_ARRAY_INT(ep_can_move); + + static int ep_could_move[] = + { + EL_BUG_RIGHT, + EL_BUG_UP, + EL_BUG_LEFT, + EL_BUG_DOWN, + EL_SPACESHIP_RIGHT, + EL_SPACESHIP_UP, + EL_SPACESHIP_LEFT, + EL_SPACESHIP_DOWN, + EL_BUTTERFLY_RIGHT, + EL_BUTTERFLY_UP, + EL_BUTTERFLY_LEFT, + EL_BUTTERFLY_DOWN, + EL_FIREFLY_RIGHT, + EL_FIREFLY_UP, + EL_FIREFLY_LEFT, + EL_FIREFLY_DOWN, + EL_PACMAN_RIGHT, + EL_PACMAN_UP, + EL_PACMAN_LEFT, + EL_PACMAN_DOWN + }; + static int ep_could_move_num = SIZEOF_ARRAY_INT(ep_could_move); + + static int ep_dont_touch[] = + { + EL_BUG, + EL_SPACESHIP, + EL_BUTTERFLY, + EL_FIREFLY + }; + static int ep_dont_touch_num = SIZEOF_ARRAY_INT(ep_dont_touch); + + static int ep_dont_go_to[] = + { + EL_BUG, + EL_SPACESHIP, + EL_BUTTERFLY, + EL_FIREFLY, + EL_YAMYAM, + EL_DARK_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_AMOEBA_DROP, + EL_ACID, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON, + EL_SP_BUG_ACTIVE, + EL_TRAP_ACTIVE, + EL_LANDMINE + }; + static int ep_dont_go_to_num = SIZEOF_ARRAY_INT(ep_dont_go_to); + + static int ep_mampf2[] = + { + EL_SAND, + EL_BUG, + EL_SPACESHIP, + EL_BUTTERFLY, + EL_FIREFLY, + EL_YAMYAM, + EL_ROBOT, + EL_PACMAN, + EL_AMOEBA_DROP, + EL_AMOEBA_DEAD, + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA, + EL_EMERALD, + EL_EDELSTEIN_BD, + EL_EDELSTEIN_YELLOW, + EL_EDELSTEIN_RED, + EL_EDELSTEIN_PURPLE, + EL_DIAMOND, + EL_PEARL, + EL_CRYSTAL + }; + static int ep_mampf2_num = SIZEOF_ARRAY_INT(ep_mampf2); + + static int ep_bd_element[] = + { + EL_EMPTY, + EL_SAND, + EL_WALL_CRUMBLED, + EL_BD_WALL, + EL_ROCK, + EL_BD_ROCK, + EL_EDELSTEIN_BD, + EL_MAGIC_WALL_BD_OFF, + EL_EXIT_CLOSED, + EL_EXIT_OPEN, + EL_STEELWALL, + EL_PLAYER, + EL_FIREFLY, + EL_FIREFLY_1, + EL_FIREFLY_2, + EL_FIREFLY_3, + EL_FIREFLY_4, + EL_BUTTERFLY, + EL_BUTTERFLY_1, + EL_BUTTERFLY_2, + EL_BUTTERFLY_3, + EL_BUTTERFLY_4, + EL_BD_AMOEBA, + EL_CHAR_FRAGE + }; + static int ep_bd_element_num = SIZEOF_ARRAY_INT(ep_bd_element); + + static int ep_sb_element[] = + { + EL_EMPTY, + EL_STEELWALL, + EL_SOKOBAN_OBJEKT, + EL_SOKOBAN_FELD_LEER, + EL_SOKOBAN_FELD_VOLL, + EL_PLAYER, + EL_INVISIBLE_STEEL + }; + static int ep_sb_element_num = SIZEOF_ARRAY_INT(ep_sb_element); + + static int ep_gem[] = + { + EL_EMERALD, + EL_EDELSTEIN_BD, + EL_EDELSTEIN_YELLOW, + EL_EDELSTEIN_RED, + EL_EDELSTEIN_PURPLE, + EL_DIAMOND + }; + static int ep_gem_num = SIZEOF_ARRAY_INT(ep_gem); + + static int ep_inactive[] = + { + EL_EMPTY, + EL_SAND, + EL_WALL, + EL_BD_WALL, + EL_WALL_CRUMBLED, + EL_KEY, + EL_STEELWALL, + EL_AMOEBA_DEAD, + EL_QUICKSAND_EMPTY, + EL_BADEWANNE, + EL_ROBOT_WHEEL, + EL_KEY1, + EL_KEY2, + EL_KEY3, + EL_KEY4, + EL_EM_KEY_1, + EL_EM_KEY_2, + EL_EM_KEY_3, + EL_EM_KEY_4, + EL_GATE1, + EL_GATE2, + EL_GATE3, + EL_GATE4, + EL_GATE1_GRAY, + EL_GATE2_GRAY, + EL_GATE3_GRAY, + EL_GATE4_GRAY, + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1X, + EL_EM_GATE_2X, + EL_EM_GATE_3X, + EL_EM_GATE_4X, + EL_DYNAMITE, + EL_INVISIBLE_WALL, + EL_LAMP, + EL_LAMP_ACTIVE, + EL_WALL_EMERALD, + EL_WALL_DIAMOND, + EL_WALL_BD_DIAMOND, + EL_WALL_EMERALD_YELLOW, + EL_DYNABOMB_NR, + EL_DYNABOMB_SZ, + EL_DYNABOMB_XL, + EL_SOKOBAN_OBJEKT, + EL_SOKOBAN_FELD_LEER, + EL_SOKOBAN_FELD_VOLL, + EL_WALL_EMERALD_RED, + EL_WALL_EMERALD_PURPLE, + EL_ACIDPOOL_TOPLEFT, + EL_ACIDPOOL_TOPRIGHT, + EL_ACIDPOOL_BOTTOMLEFT, + EL_ACIDPOOL_BOTTOM, + EL_ACIDPOOL_BOTTOMRIGHT, + EL_MAGIC_WALL, + EL_MAGIC_WALL_DEAD, + EL_MAGIC_WALL_BD_OFF, + EL_MAGIC_WALL_BD_DEAD, + EL_AMOEBA2DIAM, + EL_BLOCKED, + EL_SP_EMPTY, + EL_SP_BASE, + EL_SP_PORT1_RIGHT, + EL_SP_PORT1_DOWN, + EL_SP_PORT1_LEFT, + EL_SP_PORT1_UP, + EL_SP_PORT2_RIGHT, + EL_SP_PORT2_DOWN, + EL_SP_PORT2_LEFT, + EL_SP_PORT2_UP, + EL_SP_PORT_X, + EL_SP_PORT_Y, + EL_SP_PORT_XY, + EL_SP_DISK_RED, + EL_SP_DISK_YELLOW, + EL_SP_CHIP_SINGLE, + EL_SP_CHIP_LEFT, + EL_SP_CHIP_RIGHT, + EL_SP_CHIP_UPPER, + EL_SP_CHIP_LOWER, + EL_SP_HARD_GRAY, + EL_SP_HARD_GREEN, + EL_SP_HARD_BLUE, + EL_SP_HARD_RED, + EL_SP_HARD_YELLOW, + EL_SP_HARD_BASE1, + EL_SP_HARD_BASE2, + EL_SP_HARD_BASE3, + EL_SP_HARD_BASE4, + EL_SP_HARD_BASE5, + EL_SP_HARD_BASE6, + EL_SP_EXIT, + EL_INVISIBLE_STEEL, + EL_BELT1_SWITCH_LEFT, + EL_BELT1_SWITCH_MIDDLE, + EL_BELT1_SWITCH_RIGHT, + EL_BELT2_SWITCH_LEFT, + EL_BELT2_SWITCH_MIDDLE, + EL_BELT2_SWITCH_RIGHT, + EL_BELT3_SWITCH_LEFT, + EL_BELT3_SWITCH_MIDDLE, + EL_BELT3_SWITCH_RIGHT, + EL_BELT4_SWITCH_LEFT, + EL_BELT4_SWITCH_MIDDLE, + EL_BELT4_SWITCH_RIGHT, + EL_SIGN_EXCLAMATION, + EL_SIGN_RADIOACTIVITY, + EL_SIGN_STOP, + EL_SIGN_WHEELCHAIR, + EL_SIGN_PARKING, + EL_SIGN_ONEWAY, + EL_SIGN_HEART, + EL_SIGN_TRIANGLE, + EL_SIGN_ROUND, + EL_SIGN_EXIT, + EL_SIGN_YINYANG, + EL_SIGN_OTHER, + EL_STEEL_SLANTED, + EL_EMC_STEEL_WALL_1, + EL_EMC_STEEL_WALL_2, + EL_EMC_STEEL_WALL_3, + EL_EMC_STEEL_WALL_4, + EL_EMC_WALL_1, + EL_EMC_WALL_2, + EL_EMC_WALL_3, + EL_EMC_WALL_4, + EL_EMC_WALL_5, + EL_EMC_WALL_6, + EL_EMC_WALL_7, + EL_EMC_WALL_8 + }; + static int ep_inactive_num = SIZEOF_ARRAY_INT(ep_inactive); + + static int ep_explosive[] = + { + EL_BOMB, + EL_DYNAMITE_ACTIVE, + EL_DYNAMITE, + EL_DYNABOMB_ACTIVE_1, + EL_DYNABOMB_ACTIVE_2, + EL_DYNABOMB_ACTIVE_3, + EL_DYNABOMB_ACTIVE_4, + EL_DYNABOMB_NR, + EL_DYNABOMB_SZ, + EL_DYNABOMB_XL, + EL_BUG, + EL_MOLE, + EL_PINGUIN, + EL_SCHWEIN, + EL_DRACHE, + EL_SONDE, + EL_SP_DISK_RED, + EL_SP_DISK_ORANGE, + EL_SP_DISK_YELLOW, + EL_SP_SNIKSNAK, + EL_SP_ELECTRON, + EL_DX_SUPABOMB + }; + static int ep_explosive_num = SIZEOF_ARRAY_INT(ep_explosive); + + static int ep_mampf3[] = + { + EL_EMERALD, + EL_EDELSTEIN_BD, + EL_EDELSTEIN_YELLOW, + EL_EDELSTEIN_RED, + EL_EDELSTEIN_PURPLE, + EL_DIAMOND, + EL_PEARL, + EL_CRYSTAL + }; + static int ep_mampf3_num = SIZEOF_ARRAY_INT(ep_mampf3); + + static int ep_pushable[] = + { + EL_ROCK, + EL_BD_ROCK, + EL_BOMB, + EL_NUT, + EL_TIME_ORB_EMPTY, + EL_SOKOBAN_FELD_VOLL, + EL_SOKOBAN_OBJEKT, + EL_SONDE, + EL_SP_ZONK, + EL_SP_DISK_ORANGE, + EL_SP_DISK_YELLOW, + EL_BALLOON, + EL_SPRING, + EL_DX_SUPABOMB + }; + static int ep_pushable_num = SIZEOF_ARRAY_INT(ep_pushable); + + static int ep_player[] = + { + EL_PLAYER, + EL_SPIELER1, + EL_SPIELER2, + EL_SPIELER3, + EL_SPIELER4 + }; + static int ep_player_num = SIZEOF_ARRAY_INT(ep_player); + + static int ep_has_content[] = + { + EL_YAMYAM, + EL_AMOEBA_WET, + EL_AMOEBA_DRY, + EL_AMOEBA_FULL, + EL_BD_AMOEBA + }; + static int ep_has_content_num = SIZEOF_ARRAY_INT(ep_has_content); + + static int ep_eatable[] = + { + EL_SAND, + EL_SP_BASE, + EL_SP_BUG, + EL_TRAP_INACTIVE, + EL_SAND_INVISIBLE + }; + static int ep_eatable_num = SIZEOF_ARRAY_INT(ep_eatable); + + static int ep_sp_element[] = + { + EL_SP_EMPTY, + EL_SP_ZONK, + EL_SP_BASE, + EL_SP_MURPHY, + EL_SP_INFOTRON, + EL_SP_CHIP_SINGLE, + EL_SP_HARD_GRAY, + EL_SP_EXIT, + EL_SP_DISK_ORANGE, + EL_SP_PORT1_RIGHT, + EL_SP_PORT1_DOWN, + EL_SP_PORT1_LEFT, + EL_SP_PORT1_UP, + EL_SP_PORT2_RIGHT, + EL_SP_PORT2_DOWN, + EL_SP_PORT2_LEFT, + EL_SP_PORT2_UP, + EL_SP_SNIKSNAK, + EL_SP_DISK_YELLOW, + EL_SP_TERMINAL, + EL_SP_DISK_RED, + EL_SP_PORT_Y, + EL_SP_PORT_X, + EL_SP_PORT_XY, + EL_SP_ELECTRON, + EL_SP_BUG, + EL_SP_CHIP_LEFT, + EL_SP_CHIP_RIGHT, + EL_SP_HARD_BASE1, + EL_SP_HARD_GREEN, + EL_SP_HARD_BLUE, + EL_SP_HARD_RED, + EL_SP_HARD_YELLOW, + EL_SP_HARD_BASE2, + EL_SP_HARD_BASE3, + EL_SP_HARD_BASE4, + EL_SP_HARD_BASE5, + EL_SP_HARD_BASE6, + EL_SP_CHIP_UPPER, + EL_SP_CHIP_LOWER, + /* additional elements that appeared in newer Supaplex levels */ + EL_INVISIBLE_WALL, + /* more than one murphy in a level results in an inactive clone */ + EL_SP_MURPHY_CLONE + }; + static int ep_sp_element_num = SIZEOF_ARRAY_INT(ep_sp_element); + + static int ep_quick_gate[] = + { + EL_EM_GATE_1, + EL_EM_GATE_2, + EL_EM_GATE_3, + EL_EM_GATE_4, + EL_EM_GATE_1X, + EL_EM_GATE_2X, + EL_EM_GATE_3X, + EL_EM_GATE_4X, + EL_SP_PORT1_LEFT, + EL_SP_PORT2_LEFT, + EL_SP_PORT1_RIGHT, + EL_SP_PORT2_RIGHT, + EL_SP_PORT1_UP, + EL_SP_PORT2_UP, + EL_SP_PORT1_DOWN, + EL_SP_PORT2_DOWN, + EL_SP_PORT_X, + EL_SP_PORT_Y, + EL_SP_PORT_XY, + EL_SWITCHGATE_OPEN, + EL_TIMEGATE_OPEN + }; + static int ep_quick_gate_num = SIZEOF_ARRAY_INT(ep_quick_gate); + + static int ep_over_player[] = + { + EL_SP_PORT1_LEFT, + EL_SP_PORT2_LEFT, + EL_SP_PORT1_RIGHT, + EL_SP_PORT2_RIGHT, + EL_SP_PORT1_UP, + EL_SP_PORT2_UP, + EL_SP_PORT1_DOWN, + EL_SP_PORT2_DOWN, + EL_SP_PORT_X, + EL_SP_PORT_Y, + EL_SP_PORT_XY, + EL_TUBE_CROSS, + EL_TUBE_VERTICAL, + EL_TUBE_HORIZONTAL, + EL_TUBE_VERT_LEFT, + EL_TUBE_VERT_RIGHT, + EL_TUBE_HORIZ_UP, + EL_TUBE_HORIZ_DOWN, + EL_TUBE_LEFT_UP, + EL_TUBE_LEFT_DOWN, + EL_TUBE_RIGHT_UP, + EL_TUBE_RIGHT_DOWN + }; + static int ep_over_player_num = SIZEOF_ARRAY_INT(ep_over_player); + + static int ep_active_bomb[] = + { + EL_DYNAMITE_ACTIVE, + EL_DYNABOMB_ACTIVE_1, + EL_DYNABOMB_ACTIVE_2, + EL_DYNABOMB_ACTIVE_3, + EL_DYNABOMB_ACTIVE_4 + }; + static int ep_active_bomb_num = SIZEOF_ARRAY_INT(ep_active_bomb); + + static int ep_belt[] = + { + EL_BELT1_LEFT, + EL_BELT1_MIDDLE, + EL_BELT1_RIGHT, + EL_BELT2_LEFT, + EL_BELT2_MIDDLE, + EL_BELT2_RIGHT, + EL_BELT3_LEFT, + EL_BELT3_MIDDLE, + EL_BELT3_RIGHT, + EL_BELT4_LEFT, + EL_BELT4_MIDDLE, + EL_BELT4_RIGHT, + }; + static int ep_belt_num = SIZEOF_ARRAY_INT(ep_belt); + + static int ep_belt_switch[] = + { + EL_BELT1_SWITCH_LEFT, + EL_BELT1_SWITCH_MIDDLE, + EL_BELT1_SWITCH_RIGHT, + EL_BELT2_SWITCH_LEFT, + EL_BELT2_SWITCH_MIDDLE, + EL_BELT2_SWITCH_RIGHT, + EL_BELT3_SWITCH_LEFT, + EL_BELT3_SWITCH_MIDDLE, + EL_BELT3_SWITCH_RIGHT, + EL_BELT4_SWITCH_LEFT, + EL_BELT4_SWITCH_MIDDLE, + EL_BELT4_SWITCH_RIGHT, + }; + static int ep_belt_switch_num = SIZEOF_ARRAY_INT(ep_belt_switch); + + static int ep_tube[] = + { + EL_TUBE_CROSS, + EL_TUBE_VERTICAL, + EL_TUBE_HORIZONTAL, + EL_TUBE_VERT_LEFT, + EL_TUBE_VERT_RIGHT, + EL_TUBE_HORIZ_UP, + EL_TUBE_HORIZ_DOWN, + EL_TUBE_LEFT_UP, + EL_TUBE_LEFT_DOWN, + EL_TUBE_RIGHT_UP, + EL_TUBE_RIGHT_DOWN + }; + static int ep_tube_num = SIZEOF_ARRAY_INT(ep_tube); + + static long ep1_bit[] = + { + EP_BIT_AMOEBALIVE, + EP_BIT_AMOEBOID, + EP_BIT_SCHLUESSEL, + EP_BIT_PFORTE, + EP_BIT_SOLID, + EP_BIT_MASSIVE, + EP_BIT_SLIPPERY, + EP_BIT_ENEMY, + EP_BIT_MAUER, + EP_BIT_CAN_FALL, + EP_BIT_CAN_SMASH, + EP_BIT_CAN_CHANGE, + EP_BIT_CAN_MOVE, + EP_BIT_COULD_MOVE, + EP_BIT_DONT_TOUCH, + EP_BIT_DONT_GO_TO, + EP_BIT_MAMPF2, + EP_BIT_BD_ELEMENT, + EP_BIT_SB_ELEMENT, + EP_BIT_GEM, + EP_BIT_INACTIVE, + EP_BIT_EXPLOSIVE, + EP_BIT_MAMPF3, + EP_BIT_PUSHABLE, + EP_BIT_PLAYER, + EP_BIT_HAS_CONTENT, + EP_BIT_EATABLE, + EP_BIT_SP_ELEMENT, + EP_BIT_QUICK_GATE, + EP_BIT_OVER_PLAYER, + EP_BIT_ACTIVE_BOMB + }; + static long ep2_bit[] = + { + EP_BIT_BELT, + EP_BIT_BELT_SWITCH, + EP_BIT_TUBE + }; + static int *ep1_array[] = + { + ep_amoebalive, + ep_amoeboid, + ep_schluessel, + ep_pforte, + ep_solid, + ep_massive, + ep_slippery, + ep_enemy, + ep_mauer, + ep_can_fall, + ep_can_smash, + ep_can_change, + ep_can_move, + ep_could_move, + ep_dont_touch, + ep_dont_go_to, + ep_mampf2, + ep_bd_element, + ep_sb_element, + ep_gem, + ep_inactive, + ep_explosive, + ep_mampf3, + ep_pushable, + ep_player, + ep_has_content, + ep_eatable, + ep_sp_element, + ep_quick_gate, + ep_over_player, + ep_active_bomb + }; + static int *ep2_array[] = + { + ep_belt, + ep_belt_switch, + ep_tube + }; + static int *ep1_num[] = + { + &ep_amoebalive_num, + &ep_amoeboid_num, + &ep_schluessel_num, + &ep_pforte_num, + &ep_solid_num, + &ep_massive_num, + &ep_slippery_num, + &ep_enemy_num, + &ep_mauer_num, + &ep_can_fall_num, + &ep_can_smash_num, + &ep_can_change_num, + &ep_can_move_num, + &ep_could_move_num, + &ep_dont_touch_num, + &ep_dont_go_to_num, + &ep_mampf2_num, + &ep_bd_element_num, + &ep_sb_element_num, + &ep_gem_num, + &ep_inactive_num, + &ep_explosive_num, + &ep_mampf3_num, + &ep_pushable_num, + &ep_player_num, + &ep_has_content_num, + &ep_eatable_num, + &ep_sp_element_num, + &ep_quick_gate_num, + &ep_over_player_num, + &ep_active_bomb_num + }; + static int *ep2_num[] = + { + &ep_belt_num, + &ep_belt_switch_num, + &ep_tube_num + }; + static int num_properties1 = SIZEOF_ARRAY(ep1_num, int *); + static int num_properties2 = SIZEOF_ARRAY(ep2_num, int *); + + for(i=0; i