X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=3dcfe04e8358b4370643f3f1e22450fcd571cab9;hb=91d08fad2fcec7e2b5931b4f336a89d14af313dd;hp=1861e0485c31663f7e8867a5067a3dc1c50c7cfd;hpb=6c2ebd029ab05c3f48e84247b81da3fff8519694;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 1861e048..3dcfe04e 100644 --- a/src/init.c +++ b/src/init.c @@ -26,8 +26,21 @@ #include "cartoons.h" #include "config.h" +#include "conf_e2g.c" /* include auto-generated data structure definitions */ +#include "conf_esg.c" /* include auto-generated data structure definitions */ + + static char *image_filename[NUM_PICTURES] = { +#if 0 + "RocksScreen.pcx", + "RocksDoor.pcx", + "RocksToons.pcx", + "RocksFontBig.pcx", + "RocksFontSmall.pcx", + "RocksFontMedium.pcx", + "RocksFontEM.pcx" +#else "RocksScreen.pcx", "RocksElements.pcx", "RocksDoor.pcx", @@ -40,34 +53,41 @@ static char *image_filename[NUM_PICTURES] = "RocksFontSmall.pcx", "RocksFontMedium.pcx", "RocksFontEM.pcx" +#endif }; -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 Bitmap *bitmap_font_initial = NULL; + +static void InitGlobal(); +static void InitSetup(); +static void InitPlayerInfo(); +static void InitLevelInfo(); +static void InitArtworkInfo(); +static void InitLevelArtworkInfo(); +static void InitNetworkServer(); +static void InitArtworkConfig(); +static void InitImages(); +static void InitMixer(); +static void InitSound(); +static void InitMusic(); +static void InitGfx(); +static void InitGfxBackground(); +static void InitGadgets(); +static void InitElementImages(); +static void InitElementGraphicInfo(); +static void InitElementEditorGraphicInfo(); +static void InitElementSoundInfo(); +static void InitElementProperties(); +static void InitGraphicInfo(); static void InitSoundInfo(); -static void Execute_Debug_Command(char *); +static void Execute_Command(char *); -void OpenAll(void) +void OpenAll() { - if (options.debug_command) - { - Execute_Debug_Command(options.debug_command); + InitGlobal(); /* initialize some global variables */ - exit(0); - } + if (options.execute_command) + Execute_Command(options.execute_command); if (options.serveronly) { @@ -88,9 +108,11 @@ void OpenAll(void) InitSetup(); InitPlayerInfo(); InitArtworkInfo(); /* needed before loading gfx, sound & music */ + InitArtworkConfig(); /* needed before forking sound child process */ + InitMixer(); InitCounter(); - InitMixer(); + InitJoysticks(); InitRND(NEW_RANDOMIZE); @@ -100,30 +122,45 @@ void OpenAll(void) InitEventFilter(FilterMouseMotionEvents); + InitElementProperties(); + 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 */ + InitMusic(); /* needs to know current level directory */ InitGfxBackground(); - InitToons(); + + if (global.autoplay_leveldir) + { + AutoPlayTape(); + return; + } DrawMainMenu(); InitNetworkServer(); } -void InitSetup() +static void InitGlobal() +{ + global.autoplay_leveldir = NULL; + + global.frames_per_second = 0; + global.fps_slowdown = FALSE; + global.fps_slowdown_factor = 1; +} + +static void InitSetup() { LoadSetup(); /* global setup info */ } -void InitPlayerInfo() +static void InitPlayerInfo() { int i; @@ -136,18 +173,45 @@ void InitPlayerInfo() local_player->connected = TRUE; } -void InitLevelInfo() +static void InitLevelInfo() { LoadLevelInfo(); /* global level info */ LoadLevelSetup_LastSeries(); /* last played series info */ LoadLevelSetup_SeriesInfo(); /* last played level info */ } -void InitArtworkInfo() +static void InitArtworkInfo() { LoadArtworkInfo(); } +static void InitArtworkConfig() +{ + static char *element_prefix[MAX_NUM_ELEMENTS + 1]; + static char *sound_class_prefix[MAX_NUM_ELEMENTS + 1]; + static char *action_suffix[NUM_ACTIONS + 1]; + static char *direction_suffix[NUM_DIRECTIONS + 1]; + static char *special_suffix[NUM_SPECIAL_GFX_ARGS + 1]; + static char *dummy[1] = { NULL }; + int i; + + for (i=0; i game graphic mapping */ + InitElementEditorGraphicInfo(); /* element => editor graphic mapping */ + InitGraphicInfo(); /* graphic => properties mapping */ + + InitFontInfo(bitmap_font_initial, + graphic_info[IMG_FONT_BIG].bitmap, + graphic_info[IMG_FONT_MEDIUM].bitmap, + graphic_info[IMG_FONT_SMALL].bitmap, + graphic_info[IMG_FONT_EM].bitmap); + + SetMainBackgroundImage(IMG_BACKGROUND_DEFAULT); + SetDoorBackgroundImage(IMG_BACKGROUND_DOOR); + + InitGadgets(); + InitToons(); + + + + /* !!! TEST ONLY !!! */ + if (0) + { + Bitmap *tst_bitmap = graphic_info[IMG_SAND].bitmap; + Bitmap *tmp_bitmap = ZoomBitmap(tst_bitmap, + tst_bitmap->width / 2, + tst_bitmap->height / 2); + + BlitBitmap(tmp_bitmap, tst_bitmap, 0, 0, 256, 224, 0, 448); + + FreeBitmap(tmp_bitmap); + } + + if (1) + { + printf("CREATING SMALL IMAGES...\n"); - InitGraphicInfo(); +#if 1 + InitElementImages(); +#else + CreateImageWithSmallImages(IMG_SAND); + CreateImageWithSmallImages(IMG_SAND); +#endif + + printf("DONE!\n"); + } } -static void InitMixer() +static void ReinitializeSounds() { - OpenAudio(); + InitElementSoundInfo(); /* element => game sound mapping */ + InitSoundInfo(); /* sound => properties mapping */ - InitSoundList(sound_config, sound_config_suffix, NUM_SOUND_FILES); + InitPlaySoundLevel(); /* internal game sound settings */ +} - StartMixer(); +static void ReinitializeMusic() +{ + /* currently nothing to do */ +} + +static void InitImages() +{ + ReloadCustomImages(); + ReinitializeGraphics(); + + LoadCustomElementDescriptions(); } static void InitSound() { - /* load custom sounds and music */ - InitReloadSounds(artwork.snd_current->identifier); - InitReloadMusic(artwork.mus_current->identifier); + InitReloadCustomSounds(artwork.snd_current->identifier); + ReinitializeSounds(); +} - InitSoundInfo(); +static void InitMusic() +{ + InitReloadCustomMusic(artwork.mus_current->identifier); + ReinitializeMusic(); } static void InitTileClipmasks() { +#if 0 #if defined(TARGET_X11) XGCValues clip_gc_values; unsigned long clip_gc_valuemask; #if defined(TARGET_X11_NATIVE) + +#if 0 GC copy_clipmask_gc; static struct @@ -264,13 +390,15 @@ static void InitTileClipmasks() { GFX2_SHIELD_ACTIVE, 3 }, { -1, 0 } }; +#endif + #endif /* TARGET_X11_NATIVE */ #endif /* TARGET_X11 */ int i; /* 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) { @@ -295,9 +424,11 @@ static void InitTileClipmasks() clip_gc_valuemask, &clip_gc_values); } } +#endif #if defined(TARGET_X11_NATIVE) +#if 0 /* create graphic context structures needed for clipping */ clip_gc_values.graphics_exposures = False; clip_gc_valuemask = GCGraphicsExposures; @@ -305,11 +436,11 @@ static void InitTileClipmasks() clip_gc_valuemask, &clip_gc_values); /* create only those clipping Pixmaps we really need */ - for(i=0; tile_needs_clipping[i].start>=0; i++) + for (i=0; tile_needs_clipping[i].start>=0; i++) { int j; - for(j=0; jstored_clip_gc) { @@ -360,17 +495,17 @@ void FreeTileClipmasks() pix[i]->stored_clip_gc = None; } } +#endif + #endif /* TARGET_X11 */ +#endif } void InitGfx() { +#if 0 int i; - - /* initialize some global variables */ - global.frames_per_second = 0; - global.fps_slowdown = FALSE; - global.fps_slowdown_factor = 1; +#endif /* initialize screen properties */ InitGfxFieldInfo(SX, SY, SXSIZE, SYSIZE, @@ -380,30 +515,42 @@ void InitGfx() InitGfxScrollbufferInfo(FXSIZE, FYSIZE); /* create additional image buffers for double-buffering */ - pix[PIX_DB_DOOR] = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH); - pix[PIX_DB_FIELD] = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH); + bitmap_db_field = CreateBitmap(FXSIZE, FYSIZE, DEFAULT_DEPTH); + bitmap_db_door = CreateBitmap(3 * DXSIZE, DYSIZE + VYSIZE, DEFAULT_DEPTH); +#if 0 pix[PIX_FONT_SMALL] = LoadCustomImage(image_filename[PIX_FONT_SMALL]); InitFontInfo(NULL, NULL, pix[PIX_FONT_SMALL], NULL); +#else + bitmap_font_initial = LoadCustomImage(image_filename[PIX_FONT_SMALL]); + + InitFontInfo(bitmap_font_initial, NULL, NULL, NULL, NULL); +#endif DrawInitText(WINDOW_TITLE_STRING, 20, FC_YELLOW); DrawInitText(WINDOW_SUBTITLE_STRING, 50, FC_RED); DrawInitText("Loading graphics:", 120, FC_GREEN); - for(i=0; iidentifier; char *snd_new_identifier = artwork.snd_current->identifier; char *mus_new_identifier = artwork.mus_current->identifier; + boolean redraw_screen = FALSE; + + if (leveldir_current_identifier == NULL) + leveldir_current_identifier = leveldir_current->identifier; + +#if 0 + printf("CURRENT GFX: '%s' ['%s']\n", artwork.gfx_current->identifier, + leveldir_current->graphics_set); + printf("CURRENT LEV: '%s' / '%s'\n", leveldir_current_identifier, + leveldir_current->identifier); +#endif #if 0 printf("graphics --> '%s' ('%s')\n", @@ -452,10 +610,6 @@ void ReloadCustomArtwork() 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) @@ -489,43 +643,51 @@ void ReloadCustomArtwork() if (strcmp(artwork.gfx_current_identifier, gfx_new_identifier) != 0 || last_override_level_graphics != setup.override_level_graphics) { - int i; +#if 0 + printf("RELOADING GRAPHICS '%s' -> '%s' ('%s')\n", + artwork.gfx_current_identifier, + artwork.gfx_current->identifier, + gfx_new_identifier); +#endif setLevelArtworkDir(artwork.gfx_first); ClearRectangle(window, 0, 0, WIN_XSIZE, WIN_YSIZE); - for(i=0; iidentifier; last_override_level_graphics = setup.override_level_graphics; + + redraw_screen = TRUE; } if (strcmp(artwork.snd_current_identifier, snd_new_identifier) != 0 || last_override_level_sounds != setup.override_level_sounds) { +#if 0 + printf("RELOADING SOUNDS '%s' -> '%s' ('%s')\n", + artwork.snd_current_identifier, + artwork.snd_current->identifier, + snd_new_identifier); +#endif + /* set artwork path to send it to the sound server process */ setLevelArtworkDir(artwork.snd_first); - InitReloadSounds(snd_new_identifier); + InitReloadCustomSounds(snd_new_identifier); + ReinitializeSounds(); - artwork.snd_current_identifier = snd_new_identifier; + artwork.snd_current_identifier = artwork.snd_current->identifier; last_override_level_sounds = setup.override_level_sounds; + + redraw_screen = TRUE; } if (strcmp(artwork.mus_current_identifier, mus_new_identifier) != 0 || @@ -534,512 +696,503 @@ void ReloadCustomArtwork() /* set artwork path to send it to the sound server process */ setLevelArtworkDir(artwork.mus_first); - InitReloadMusic(mus_new_identifier); + InitReloadCustomMusic(mus_new_identifier); + ReinitializeMusic(); - artwork.mus_current_identifier = mus_new_identifier; + artwork.mus_current_identifier = artwork.mus_current->identifier; last_override_level_music = setup.override_level_music; + + redraw_screen = TRUE; } -#if 0 - printf("<-- '%s'\n", artwork.gfx_current_identifier); -#endif + if (redraw_screen) + { + InitGfxBackground(); + + /* force redraw of (open or closed) door graphics */ + SetDoorState(DOOR_OPEN_ALL); + CloseDoor(DOOR_CLOSE_ALL | DOOR_NO_DELAY); + } +} + +void FreeGadgets() +{ + FreeLevelEditorGadgets(); + FreeGameButtons(); + FreeTapeButtons(); + FreeToolButtons(); + FreeScreenGadgets(); } void InitGadgets() { + static boolean gadgets_initialized = FALSE; + + if (gadgets_initialized) + FreeGadgets(); + CreateLevelEditorGadgets(); CreateGameButtons(); CreateTapeButtons(); CreateToolButtons(); CreateScreenGadgets(); + + gadgets_initialized = TRUE; } -void InitElementInfo() +void InitElementImages() { - int i, j; + struct PropertyMapping *property_mapping = getImageListPropertyMapping(); + int num_property_mappings = getImageListPropertyMappingSize(); + int i; - static struct + /* initialize images from static configuration */ + for (i=0; element_to_graphic[i].element > -1; i++) + CreateImageWithSmallImages(element_to_graphic[i].graphic); + + /* initialize images from dynamic configuration */ + for (i=0; i < num_property_mappings; i++) + CreateImageWithSmallImages(property_mapping[i].artwork_index); +} + +void InitElementGraphicInfo() +{ + struct PropertyMapping *property_mapping = getImageListPropertyMapping(); + int num_property_mappings = getImageListPropertyMappingSize(); + int i, act, dir; + + /* set values to -1 to identify later as "uninitialized" values */ + for (i=0; i -1; i++) { - int element; - int graphic_left; - int graphic_right; - int graphic_up; - int graphic_down; + int element = element_to_graphic[i].element; + int action = element_to_graphic[i].action; + int direction = element_to_graphic[i].direction; + int graphic = element_to_graphic[i].graphic; + + if (action < 0) + action = ACTION_DEFAULT; + + if (direction > -1) + element_info[element].direction_graphic[action][direction] = graphic; + else + element_info[element].graphic[action] = graphic; } - element_to_direction_graphic[] = + + /* initialize normal element/graphic mapping from dynamic configuration */ + for (i=0; i < num_property_mappings; i++) { + int element = property_mapping[i].base_index; + int action = property_mapping[i].ext1_index; + int direction = property_mapping[i].ext2_index; + int special = property_mapping[i].ext3_index; + int graphic = property_mapping[i].artwork_index; + + if (special != -1) + continue; + + if (action < 0) + action = ACTION_DEFAULT; + + if (direction > -1) + element_info[element].direction_graphic[action][direction] = graphic; + else + element_info[element].graphic[action] = graphic; + } + + /* now set all '-1' values to element specific default values */ + for (i=0; i -1; i++) { - int nr_element = i - EL_SP_START; - int gfx_per_line = 8; - int nr_graphic = - (nr_element / gfx_per_line) * SP_PER_LINE + - (nr_element % gfx_per_line); + int element = element_to_special_graphic[i].element; + int special = element_to_special_graphic[i].special; + int graphic = element_to_special_graphic[i].graphic; + + if (special != GFX_SPECIAL_ARG_EDITOR) + continue; - element_info[i].graphic[GFX_ACTION_DEFAULT] = - GFX_START_ROCKSSP + nr_graphic; + element_info[element].editor_graphic = graphic; } - /* this overrides some of the above default settings (GFX_SP_ZONK etc.) */ - i = 0; - while (element_to_graphic[i].element > -1) + /* initialize special element/graphic mapping from dynamic configuration */ + for (i=0; i < num_property_mappings; i++) { - int element = element_to_graphic[i].element; - int graphic = element_to_graphic[i].graphic; + int element = property_mapping[i].base_index; + int special = property_mapping[i].ext3_index; + int graphic = property_mapping[i].artwork_index; - element_info[element].graphic[GFX_ACTION_DEFAULT] = graphic; - i++; + if (special != GFX_SPECIAL_ARG_EDITOR) + continue; + + element_info[element].editor_graphic = graphic; } +} - /* 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; +static void InitElementSoundInfo() +{ + /* soon to come */ +} - 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; +static void set_graphic_parameters(int graphic, int *parameter) +{ + Bitmap *src_bitmap = getBitmapFromImageID(graphic); + int num_xtiles = (src_bitmap ? src_bitmap->width : TILEX) / TILEX; + int num_ytiles = (src_bitmap ? src_bitmap->height * 2 / 3 : TILEY) / TILEY; - element_info[element].has_direction_graphic[GFX_ACTION_DEFAULT] = TRUE; - i++; + graphic_info[graphic].bitmap = src_bitmap; + + graphic_info[graphic].src_x = parameter[GFX_ARG_XPOS] * TILEX; + graphic_info[graphic].src_y = parameter[GFX_ARG_YPOS] * TILEY; + graphic_info[graphic].offset_x = parameter[GFX_ARG_OFFSET]; + graphic_info[graphic].offset_y = 0; + + /* animation frames are ordered vertically instead of horizontally */ + if (parameter[GFX_ARG_VERTICAL]) + { + graphic_info[graphic].offset_x = 0; + graphic_info[graphic].offset_y = parameter[GFX_ARG_OFFSET]; } + + /* optionally, the x and y offset of frames can be specified directly */ + if (parameter[GFX_ARG_XOFFSET] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].offset_x = parameter[GFX_ARG_XOFFSET]; + if (parameter[GFX_ARG_YOFFSET] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].offset_y = parameter[GFX_ARG_YOFFSET]; + + /* automatically determine correct number of frames, if not defined */ + if (parameter[GFX_ARG_FRAMES] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].anim_frames = parameter[GFX_ARG_FRAMES]; + else if (parameter[GFX_ARG_XPOS] == 0 && !parameter[GFX_ARG_VERTICAL]) + graphic_info[graphic].anim_frames = num_xtiles; + else if (parameter[GFX_ARG_YPOS] == 0 && parameter[GFX_ARG_VERTICAL]) + graphic_info[graphic].anim_frames = num_ytiles; + else + graphic_info[graphic].anim_frames = 1; + + graphic_info[graphic].anim_delay = parameter[GFX_ARG_DELAY]; + if (graphic_info[graphic].anim_delay == 0) /* delay must be at least 1 */ + graphic_info[graphic].anim_delay = 1; + + /* set mode for animation frame order */ + if (parameter[GFX_ARG_MODE_LOOP]) + graphic_info[graphic].anim_mode = ANIM_LOOP; + else if (parameter[GFX_ARG_MODE_LINEAR]) + graphic_info[graphic].anim_mode = ANIM_LINEAR; + else if (parameter[GFX_ARG_MODE_PINGPONG]) + graphic_info[graphic].anim_mode = ANIM_PINGPONG; + else if (parameter[GFX_ARG_MODE_PINGPONG2]) + graphic_info[graphic].anim_mode = ANIM_PINGPONG2; + else if (parameter[GFX_ARG_MODE_RANDOM]) + graphic_info[graphic].anim_mode = ANIM_RANDOM; + else if (graphic_info[graphic].anim_frames > 1) + graphic_info[graphic].anim_mode = ANIM_LOOP; + else + graphic_info[graphic].anim_mode = ANIM_NONE; + + /* set additional flag to play animation frames in reverse order */ + if (parameter[GFX_ARG_MODE_REVERSE]) + graphic_info[graphic].anim_mode |= ANIM_REVERSE; + + /* automatically determine correct start frame, if not defined */ + if (parameter[GFX_ARG_START_FRAME] == ARG_UNDEFINED_VALUE) + graphic_info[graphic].anim_start_frame = 0; + else if (graphic_info[graphic].anim_mode & ANIM_REVERSE) + graphic_info[graphic].anim_start_frame = + graphic_info[graphic].anim_frames - parameter[GFX_ARG_START_FRAME] - 1; + else + graphic_info[graphic].anim_start_frame = parameter[GFX_ARG_START_FRAME]; + + /* animation synchronized with global frame counter, not move position */ + graphic_info[graphic].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC]; } static void InitGraphicInfo() { + static boolean clipmasks_initialized = FALSE; + int num_images = getImageListSize(); int i; +#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) + Pixmap src_pixmap; + XGCValues clip_gc_values; + unsigned long clip_gc_valuemask; + GC copy_clipmask_gc = None; +#endif - image_files = getCurrentImageList(); + if (graphic_info != NULL) + free(graphic_info); - for(i=0; iparameter); - new_graphic_info[i].anim_frames = parameter[GFX_ARG_FRAMES]; + /* now check if no animation frames are outside of the loaded image */ - new_graphic_info[i].anim_delay = parameter[GFX_ARG_DELAY]; - if (new_graphic_info[i].anim_delay == 0) /* delay must be at least 1 */ - new_graphic_info[i].anim_delay = 1; + if (graphic_info[i].bitmap == NULL) + continue; /* skip check for optional images that are undefined */ - /* basically, animation can be either normal or reverse direction */ - if (parameter[GFX_ARG_REVERSE]) - new_graphic_info[i].anim_mode = ANIM_REVERSE; - else - new_graphic_info[i].anim_mode = ANIM_NORMAL; + first_frame = 0; + getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); + if (src_x < 0 || src_y < 0 || + src_x + TILEX > src_bitmap->width || + src_y + TILEY > src_bitmap->height) + { + Error(ERR_RETURN_LINE, "-"); + Error(ERR_RETURN, "warning: error found in config file:"); + Error(ERR_RETURN, "- config file: '%s'", + getImageConfigFilename()); + Error(ERR_RETURN, "- config token: '%s'", + getTokenFromImageID(i)); + Error(ERR_RETURN, "- image file: '%s'", + src_bitmap->source_filename); + Error(ERR_RETURN, + "error: first animation frame out of bounds (%d, %d)", + src_x, src_y); + Error(ERR_RETURN, "custom graphic rejected for this element/action"); + Error(ERR_RETURN_LINE, "-"); + + set_graphic_parameters(i, image->default_parameter); + } - /* additionally, animation can be either pingpong or pingpong2 layout */ - if (parameter[GFX_ARG_PINGPONG]) - new_graphic_info[i].anim_mode |= ANIM_PINGPONG; - else if (parameter[GFX_ARG_PINGPONG2]) - new_graphic_info[i].anim_mode |= ANIM_PINGPONG2; + last_frame = graphic_info[i].anim_frames - 1; + getGraphicSource(i, last_frame, &src_bitmap, &src_x, &src_y); + if (src_x < 0 || src_y < 0 || + src_x + TILEX > src_bitmap->width || + src_y + TILEY > src_bitmap->height) + { + Error(ERR_RETURN_LINE, "-"); + Error(ERR_RETURN, "warning: error found in config file:"); + Error(ERR_RETURN, "- config file: '%s'", + getImageConfigFilename()); + Error(ERR_RETURN, "- config token: '%s'", + getTokenFromImageID(i)); + Error(ERR_RETURN, "- image file: '%s'", + src_bitmap->source_filename); + Error(ERR_RETURN, + "error: last animation frame (%d) out of bounds (%d, %d)", + last_frame, src_x, src_y); + Error(ERR_RETURN, "custom graphic rejected for this element/action"); + Error(ERR_RETURN_LINE, "-"); + + set_graphic_parameters(i, image->default_parameter); + } - /* animation synchronized with global frame counter, not move position */ - new_graphic_info[i].anim_global_sync = parameter[GFX_ARG_GLOBAL_SYNC]; +#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) + /* currently we need only a tile clip mask from the first frame */ + getGraphicSource(i, first_frame, &src_bitmap, &src_x, &src_y); - new_graphic_info[i].anim_vertical = parameter[GFX_ARG_VERTICAL]; + if (copy_clipmask_gc == None) + { + clip_gc_values.graphics_exposures = False; + clip_gc_valuemask = GCGraphicsExposures; + copy_clipmask_gc = XCreateGC(display, src_bitmap->clip_mask, + clip_gc_valuemask, &clip_gc_values); + } + + graphic_info[i].clip_mask = + XCreatePixmap(display, window->drawable, TILEX, TILEY, 1); + + src_pixmap = src_bitmap->clip_mask; + XCopyArea(display, src_pixmap, graphic_info[i].clip_mask, + copy_clipmask_gc, src_x, src_y, TILEX, TILEY, 0, 0); + + clip_gc_values.graphics_exposures = False; + clip_gc_values.clip_mask = graphic_info[i].clip_mask; + clip_gc_valuemask = GCGraphicsExposures | GCClipMask; + graphic_info[i].clip_gc = + XCreateGC(display, window->drawable, clip_gc_valuemask, &clip_gc_values); +#endif } -#if 0 - printf("D> %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; +#if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND) + if (copy_clipmask_gc) + XFreeGC(display, copy_clipmask_gc); #endif + + clipmasks_initialized = TRUE; +} + +static void set_sound_parameters(int sound, int *parameter) +{ + /* explicit loop mode setting in configuration overrides default value */ + if (parameter[SND_ARG_MODE_LOOP] != ARG_UNDEFINED_VALUE) + sound_info[sound].loop = parameter[SND_ARG_MODE_LOOP]; } static void InitSoundInfo() { - sound_files = getCurrentSoundList(); + int *sound_effect_properties; + int num_sounds = getSoundListSize(); + int i, j; + + if (sound_info != NULL) + free(sound_info); + + sound_effect_properties = checked_calloc(num_sounds * sizeof(int)); + sound_info = checked_calloc(num_sounds * sizeof(struct SoundInfo)); - /* initialize sound effect lookup table for element actions */ - InitGameSound(); + /* initialize sound effect for all elements to "no sound" */ + for (i=0; itoken); + + sound_effect_properties[i] = ACTION_OTHER; + sound_info[i].loop = FALSE; + + /* determine all loop sounds and identify certain sound classes */ + + for (j=0; element_action_info[j].suffix; j++) + { + int len_action_text = strlen(element_action_info[j].suffix); + + if (len_action_text < len_effect_text && + strcmp(&sound->token[len_effect_text - len_action_text], + element_action_info[j].suffix) == 0) + { + sound_effect_properties[i] = element_action_info[j].value; + + if (element_action_info[j].is_loop_sound) + sound_info[i].loop = TRUE; + } + } + + /* associate elements and some selected sound actions */ + + for (j=0; jtoken, + element_info[j].sound_class_name, len_class_text) == 0 && + sound->token[len_class_text] == '.') + { + int sound_action_value = sound_effect_properties[i]; + + element_info[j].sound[sound_action_value] = i; + } + } + } + + set_sound_parameters(i, sound->parameter); + } + + free(sound_effect_properties); + +#if 0 + /* TEST ONLY */ + { + int element = EL_SAND; + int sound_action = ACTION_DIGGING; + int j = 0; + + while (element_action_info[j].suffix) + { + if (element_action_info[j].value == sound_action) + printf("element %d, sound action '%s' == %d\n", + element, element_action_info[j].suffix, + element_info_[element].sound[sound_action]); + j++; + } + } +#endif } void InitElementProperties() @@ -1104,13 +1257,13 @@ void InitElementProperties() EL_TIMEGATE_OPENING, EL_TIMEGATE_CLOSED, EL_TIMEGATE_CLOSING, - EL_TUBE_CROSS, + EL_TUBE_ALL, EL_TUBE_VERTICAL, EL_TUBE_HORIZONTAL, - EL_TUBE_VERT_LEFT, - EL_TUBE_VERT_RIGHT, - EL_TUBE_HORIZ_UP, - EL_TUBE_HORIZ_DOWN, + EL_TUBE_VERTICAL_LEFT, + EL_TUBE_VERTICAL_RIGHT, + EL_TUBE_HORIZONTAL_UP, + EL_TUBE_HORIZONTAL_DOWN, EL_TUBE_LEFT_UP, EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, @@ -1129,7 +1282,7 @@ void InitElementProperties() EL_BD_WALL, EL_WALL_CRUMBLED, EL_EXIT_CLOSED, - EL_AUSGANG_ACT, + EL_EXIT_OPENING, EL_EXIT_OPEN, EL_AMOEBA_DEAD, EL_AMOEBA_WET, @@ -1141,17 +1294,17 @@ void InitElementProperties() EL_QUICKSAND_FILLING, EL_QUICKSAND_EMPTYING, EL_MAGIC_WALL, - EL_MAGIC_WALL_EMPTY, + EL_MAGIC_WALL_ACTIVE, 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_BD_MAGIC_WALL, + EL_BD_MAGIC_WALL_ACTIVE, + EL_BD_MAGIC_WALL_EMPTYING, + EL_BD_MAGIC_WALL_FULL, + EL_BD_MAGIC_WALL_FILLING, + EL_BD_MAGIC_WALL_DEAD, EL_GAMEOFLIFE, EL_BIOMAZE, EL_ACIDPOOL_TOPLEFT, @@ -1180,6 +1333,9 @@ void InitElementProperties() EL_SP_EXIT_CLOSED, EL_SP_EXIT_OPEN, EL_INVISIBLE_STEELWALL, + EL_INVISIBLE_STEELWALL_ACTIVE, + EL_INVISIBLE_WALL, + EL_INVISIBLE_WALL_ACTIVE, EL_CONVEYOR_BELT1_SWITCH_LEFT, EL_CONVEYOR_BELT1_SWITCH_MIDDLE, EL_CONVEYOR_BELT1_SWITCH_RIGHT, @@ -1196,8 +1352,8 @@ void InitElementProperties() EL_SWITCHGATE_SWITCH_DOWN, EL_LIGHT_SWITCH, EL_LIGHT_SWITCH_ACTIVE, - EL_TIMEGATE_SWITCH_OFF, - EL_TIMEGATE_SWITCH_ON, + EL_TIMEGATE_SWITCH, + EL_TIMEGATE_SWITCH_ACTIVE, EL_SIGN_EXCLAMATION, EL_SIGN_RADIOACTIVITY, EL_SIGN_STOP, @@ -1250,13 +1406,13 @@ void InitElementProperties() EL_TIMEGATE_OPENING, EL_TIMEGATE_CLOSED, EL_TIMEGATE_CLOSING, - EL_TUBE_CROSS, + EL_TUBE_ALL, EL_TUBE_VERTICAL, EL_TUBE_HORIZONTAL, - EL_TUBE_VERT_LEFT, - EL_TUBE_VERT_RIGHT, - EL_TUBE_HORIZ_UP, - EL_TUBE_HORIZ_DOWN, + EL_TUBE_VERTICAL_LEFT, + EL_TUBE_VERTICAL_RIGHT, + EL_TUBE_HORIZONTAL_UP, + EL_TUBE_HORIZONTAL_DOWN, EL_TUBE_LEFT_UP, EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, @@ -1285,6 +1441,7 @@ void InitElementProperties() EL_SP_HARD_BASE5, EL_SP_HARD_BASE6, EL_INVISIBLE_STEELWALL, + EL_INVISIBLE_STEELWALL_ACTIVE, EL_CONVEYOR_BELT1_SWITCH_LEFT, EL_CONVEYOR_BELT1_SWITCH_MIDDLE, EL_CONVEYOR_BELT1_SWITCH_RIGHT, @@ -1341,13 +1498,13 @@ void InitElementProperties() EL_TIMEGATE_OPENING, EL_TIMEGATE_CLOSED, EL_TIMEGATE_CLOSING, - EL_TUBE_CROSS, + EL_TUBE_ALL, EL_TUBE_VERTICAL, EL_TUBE_HORIZONTAL, - EL_TUBE_VERT_LEFT, - EL_TUBE_VERT_RIGHT, - EL_TUBE_HORIZ_UP, - EL_TUBE_HORIZ_DOWN, + EL_TUBE_VERTICAL_LEFT, + EL_TUBE_VERTICAL_RIGHT, + EL_TUBE_HORIZONTAL_UP, + EL_TUBE_HORIZONTAL_DOWN, EL_TUBE_LEFT_UP, EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, @@ -1396,8 +1553,8 @@ void InitElementProperties() { EL_BUG, EL_SPACESHIP, - EL_BUTTERFLY, - EL_FIREFLY, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, EL_YAMYAM, EL_DARK_YAMYAM, EL_ROBOT, @@ -1427,7 +1584,7 @@ void InitElementProperties() EL_EM_GATE3_GRAY, EL_EM_GATE4_GRAY, EL_EXIT_CLOSED, - EL_AUSGANG_ACT, + EL_EXIT_OPENING, EL_EXIT_OPEN, EL_WALL, EL_WALL_CRUMBLED, @@ -1435,7 +1592,7 @@ void InitElementProperties() EL_WALL_GROWING_X, EL_WALL_GROWING_Y, EL_WALL_GROWING_XY, - EL_MAUERND, + EL_WALL_GROWING_ACTIVE, EL_BD_WALL, EL_SP_CHIP_SINGLE, EL_SP_CHIP_LEFT, @@ -1458,6 +1615,9 @@ void InitElementProperties() EL_SP_EXIT_CLOSED, EL_SP_EXIT_OPEN, EL_INVISIBLE_STEELWALL, + EL_INVISIBLE_STEELWALL_ACTIVE, + EL_INVISIBLE_WALL, + EL_INVISIBLE_WALL_ACTIVE, EL_STEELWALL_SLANTED, EL_EMC_STEELWALL1, EL_EMC_STEELWALL2, @@ -1489,7 +1649,7 @@ void InitElementProperties() EL_AMOEBA_DROP, EL_QUICKSAND_FULL, EL_MAGIC_WALL_FULL, - EL_MAGIC_WALL_BD_FULL, + EL_BD_MAGIC_WALL_FULL, EL_TIME_ORB_FULL, EL_TIME_ORB_EMPTY, EL_SP_ZONK, @@ -1552,8 +1712,8 @@ void InitElementProperties() { EL_BUG, EL_SPACESHIP, - EL_BUTTERFLY, - EL_FIREFLY, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, EL_YAMYAM, EL_DARK_YAMYAM, EL_ROBOT, @@ -1566,7 +1726,7 @@ void InitElementProperties() EL_SP_SNIKSNAK, EL_SP_ELECTRON, EL_BALLOON, - EL_SPRING_MOVING + EL_SPRING }; static int ep_can_move_num = SIZEOF_ARRAY_INT(ep_can_move); @@ -1580,14 +1740,14 @@ void InitElementProperties() 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_BD_BUTTERFLY_RIGHT, + EL_BD_BUTTERFLY_UP, + EL_BD_BUTTERFLY_LEFT, + EL_BD_BUTTERFLY_DOWN, + EL_BD_FIREFLY_RIGHT, + EL_BD_FIREFLY_UP, + EL_BD_FIREFLY_LEFT, + EL_BD_FIREFLY_DOWN, EL_PACMAN_RIGHT, EL_PACMAN_UP, EL_PACMAN_LEFT, @@ -1599,8 +1759,8 @@ void InitElementProperties() { EL_BUG, EL_SPACESHIP, - EL_BUTTERFLY, - EL_FIREFLY + EL_BD_BUTTERFLY, + EL_BD_FIREFLY }; static int ep_dont_touch_num = SIZEOF_ARRAY_INT(ep_dont_touch); @@ -1608,8 +1768,8 @@ void InitElementProperties() { EL_BUG, EL_SPACESHIP, - EL_BUTTERFLY, - EL_FIREFLY, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, EL_YAMYAM, EL_DARK_YAMYAM, EL_ROBOT, @@ -1618,7 +1778,7 @@ void InitElementProperties() EL_ACID, EL_SP_SNIKSNAK, EL_SP_ELECTRON, - EL_SP_BUG_ACTIVE, + EL_SP_BUGGY_BASE_ACTIVE, EL_TRAP_ACTIVE, EL_LANDMINE }; @@ -1629,8 +1789,8 @@ void InitElementProperties() EL_SAND, EL_BUG, EL_SPACESHIP, - EL_BUTTERFLY, - EL_FIREFLY, + EL_BD_BUTTERFLY, + EL_BD_FIREFLY, EL_YAMYAM, EL_ROBOT, EL_PACMAN, @@ -1660,21 +1820,21 @@ void InitElementProperties() EL_ROCK, EL_BD_ROCK, EL_BD_DIAMOND, - EL_MAGIC_WALL_BD_OFF, + EL_BD_MAGIC_WALL, 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_PLAYER1, + EL_BD_FIREFLY, + EL_BD_FIREFLY_1, + EL_BD_FIREFLY_2, + EL_BD_FIREFLY_3, + EL_BD_FIREFLY_4, + EL_BD_BUTTERFLY, + EL_BD_BUTTERFLY_1, + EL_BD_BUTTERFLY_2, + EL_BD_BUTTERFLY_3, + EL_BD_BUTTERFLY_4, EL_BD_AMOEBA, EL_CHAR_QUESTION }; @@ -1684,10 +1844,10 @@ void InitElementProperties() { EL_EMPTY, EL_STEELWALL, - EL_SOKOBAN_OBJEKT, - EL_SOKOBAN_FELD_LEER, - EL_SOKOBAN_FELD_VOLL, - EL_PLAYER, + EL_SOKOBAN_OBJECT, + EL_SOKOBAN_FIELD_EMPTY, + EL_SOKOBAN_FIELD_FULL, + EL_PLAYER1, EL_INVISIBLE_STEELWALL }; static int ep_sb_element_num = SIZEOF_ARRAY_INT(ep_sb_element); @@ -1710,7 +1870,6 @@ void InitElementProperties() EL_WALL, EL_BD_WALL, EL_WALL_CRUMBLED, - EL_KEY, EL_STEELWALL, EL_AMOEBA_DEAD, EL_QUICKSAND_EMPTY, @@ -1741,7 +1900,9 @@ void InitElementProperties() EL_EM_GATE3_GRAY, EL_EM_GATE4_GRAY, EL_DYNAMITE, + EL_INVISIBLE_STEELWALL, EL_INVISIBLE_WALL, + EL_INVISIBLE_SAND, EL_LAMP, EL_LAMP_ACTIVE, EL_WALL_EMERALD, @@ -1751,9 +1912,9 @@ void InitElementProperties() EL_DYNABOMB_NR, EL_DYNABOMB_SZ, EL_DYNABOMB_XL, - EL_SOKOBAN_OBJEKT, - EL_SOKOBAN_FELD_LEER, - EL_SOKOBAN_FELD_VOLL, + EL_SOKOBAN_OBJECT, + EL_SOKOBAN_FIELD_EMPTY, + EL_SOKOBAN_FIELD_FULL, EL_WALL_EMERALD_RED, EL_WALL_EMERALD_PURPLE, EL_ACIDPOOL_TOPLEFT, @@ -1763,8 +1924,8 @@ void InitElementProperties() EL_ACIDPOOL_BOTTOMRIGHT, EL_MAGIC_WALL, EL_MAGIC_WALL_DEAD, - EL_MAGIC_WALL_BD_OFF, - EL_MAGIC_WALL_BD_DEAD, + EL_BD_MAGIC_WALL, + EL_BD_MAGIC_WALL_DEAD, EL_AMOEBA_TO_DIAMOND, EL_BLOCKED, EL_SP_EMPTY, @@ -1798,7 +1959,6 @@ void InitElementProperties() EL_SP_HARD_BASE4, EL_SP_HARD_BASE5, EL_SP_HARD_BASE6, - EL_INVISIBLE_STEELWALL, EL_CONVEYOR_BELT1_SWITCH_LEFT, EL_CONVEYOR_BELT1_SWITCH_MIDDLE, EL_CONVEYOR_BELT1_SWITCH_RIGHT, @@ -1844,10 +2004,10 @@ void InitElementProperties() 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_PLAYER1_ACTIVE, + EL_DYNABOMB_PLAYER2_ACTIVE, + EL_DYNABOMB_PLAYER3_ACTIVE, + EL_DYNABOMB_PLAYER4_ACTIVE, EL_DYNABOMB_NR, EL_DYNABOMB_SZ, EL_DYNABOMB_XL, @@ -1886,8 +2046,8 @@ void InitElementProperties() EL_BOMB, EL_NUT, EL_TIME_ORB_EMPTY, - EL_SOKOBAN_FELD_VOLL, - EL_SOKOBAN_OBJEKT, + EL_SOKOBAN_FIELD_FULL, + EL_SOKOBAN_OBJECT, EL_SATELLITE, EL_SP_ZONK, EL_SP_DISK_ORANGE, @@ -1900,7 +2060,6 @@ void InitElementProperties() static int ep_player[] = { - EL_PLAYER, EL_PLAYER1, EL_PLAYER2, EL_PLAYER3, @@ -1922,9 +2081,11 @@ void InitElementProperties() { EL_SAND, EL_SP_BASE, - EL_SP_BUG, - EL_TRAP_INACTIVE, - EL_SAND_INVISIBLE + EL_SP_BUGGY_BASE, + EL_SP_BUGGY_BASE_ACTIVATING, + EL_TRAP, + EL_INVISIBLE_SAND, + EL_INVISIBLE_SAND_ACTIVE }; static int ep_eatable_num = SIZEOF_ARRAY_INT(ep_eatable); @@ -1956,7 +2117,7 @@ void InitElementProperties() EL_SP_PORT_X, EL_SP_PORT_XY, EL_SP_ELECTRON, - EL_SP_BUG, + EL_SP_BUGGY_BASE, EL_SP_CHIP_LEFT, EL_SP_CHIP_RIGHT, EL_SP_HARD_BASE1, @@ -2017,13 +2178,13 @@ void InitElementProperties() EL_SP_PORT_X, EL_SP_PORT_Y, EL_SP_PORT_XY, - EL_TUBE_CROSS, + EL_TUBE_ALL, EL_TUBE_VERTICAL, EL_TUBE_HORIZONTAL, - EL_TUBE_VERT_LEFT, - EL_TUBE_VERT_RIGHT, - EL_TUBE_HORIZ_UP, - EL_TUBE_HORIZ_DOWN, + EL_TUBE_VERTICAL_LEFT, + EL_TUBE_VERTICAL_RIGHT, + EL_TUBE_HORIZONTAL_UP, + EL_TUBE_HORIZONTAL_DOWN, EL_TUBE_LEFT_UP, EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, @@ -2034,10 +2195,10 @@ void InitElementProperties() static int ep_active_bomb[] = { EL_DYNAMITE_ACTIVE, - EL_DYNABOMB_ACTIVE_1, - EL_DYNABOMB_ACTIVE_2, - EL_DYNABOMB_ACTIVE_3, - EL_DYNABOMB_ACTIVE_4 + EL_DYNABOMB_PLAYER1_ACTIVE, + EL_DYNABOMB_PLAYER2_ACTIVE, + EL_DYNABOMB_PLAYER3_ACTIVE, + EL_DYNABOMB_PLAYER4_ACTIVE }; static int ep_active_bomb_num = SIZEOF_ARRAY_INT(ep_active_bomb); @@ -2058,6 +2219,23 @@ void InitElementProperties() }; static int ep_belt_num = SIZEOF_ARRAY_INT(ep_belt); + static int ep_belt_active[] = + { + EL_CONVEYOR_BELT1_LEFT_ACTIVE, + EL_CONVEYOR_BELT1_MIDDLE_ACTIVE, + EL_CONVEYOR_BELT1_RIGHT_ACTIVE, + EL_CONVEYOR_BELT2_LEFT_ACTIVE, + EL_CONVEYOR_BELT2_MIDDLE_ACTIVE, + EL_CONVEYOR_BELT2_RIGHT_ACTIVE, + EL_CONVEYOR_BELT3_LEFT_ACTIVE, + EL_CONVEYOR_BELT3_MIDDLE_ACTIVE, + EL_CONVEYOR_BELT3_RIGHT_ACTIVE, + EL_CONVEYOR_BELT4_LEFT_ACTIVE, + EL_CONVEYOR_BELT4_MIDDLE_ACTIVE, + EL_CONVEYOR_BELT4_RIGHT_ACTIVE, + }; + static int ep_belt_active_num = SIZEOF_ARRAY_INT(ep_belt_active); + static int ep_belt_switch[] = { EL_CONVEYOR_BELT1_SWITCH_LEFT, @@ -2077,13 +2255,13 @@ void InitElementProperties() static int ep_tube[] = { - EL_TUBE_CROSS, + EL_TUBE_ALL, EL_TUBE_VERTICAL, EL_TUBE_HORIZONTAL, - EL_TUBE_VERT_LEFT, - EL_TUBE_VERT_RIGHT, - EL_TUBE_HORIZ_UP, - EL_TUBE_HORIZ_DOWN, + EL_TUBE_VERTICAL_LEFT, + EL_TUBE_VERTICAL_RIGHT, + EL_TUBE_HORIZONTAL_UP, + EL_TUBE_HORIZONTAL_DOWN, EL_TUBE_LEFT_UP, EL_TUBE_LEFT_DOWN, EL_TUBE_RIGHT_UP, @@ -2128,6 +2306,7 @@ void InitElementProperties() static long ep2_bit[] = { EP_BIT_BELT, + EP_BIT_BELT_ACTIVE, EP_BIT_BELT_SWITCH, EP_BIT_TUBE }; @@ -2168,6 +2347,7 @@ void InitElementProperties() static int *ep2_array[] = { ep_belt, + ep_belt_active, ep_belt_switch, ep_tube }; @@ -2208,32 +2388,33 @@ void InitElementProperties() static int *ep2_num[] = { &ep_belt_num, + &ep_belt_active_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