X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Finit.c;h=903cd8d93274cd215bb34c85fcad961d2d3dee38;hb=7d171d862abdecced79f60535b49a686386cefe1;hp=704081719c88cb8127b3f141bee300cd27cb349b;hpb=496ac49402b1cfe5e8a664ef351fc3188a20935c;p=rocksndiamonds.git diff --git a/src/init.c b/src/init.c index 70408171..903cd8d9 100644 --- a/src/init.c +++ b/src/init.c @@ -239,6 +239,11 @@ void InitGadgets() gadgets_initialized = TRUE; } +inline void InitElementSmallImagesScaledUp(int graphic) +{ + CreateImageWithSmallImages(graphic, graphic_info[graphic].scale_up_factor); +} + void InitElementSmallImages() { struct PropertyMapping *property_mapping = getImageListPropertyMapping(); @@ -247,18 +252,33 @@ void InitElementSmallImages() /* initialize normal images from static configuration */ for (i = 0; element_to_graphic[i].element > -1; i++) - CreateImageWithSmallImages(element_to_graphic[i].graphic); + InitElementSmallImagesScaledUp(element_to_graphic[i].graphic); /* initialize special images from static configuration */ for (i = 0; element_to_special_graphic[i].element > -1; i++) - CreateImageWithSmallImages(element_to_special_graphic[i].graphic); + InitElementSmallImagesScaledUp(element_to_special_graphic[i].graphic); /* initialize images from dynamic configuration */ for (i = 0; i < num_property_mappings; i++) if (property_mapping[i].artwork_index < MAX_NUM_ELEMENTS) - CreateImageWithSmallImages(property_mapping[i].artwork_index); + InitElementSmallImagesScaledUp(property_mapping[i].artwork_index); + +#if 1 + /* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */ + for (i = IMG_EMC_OBJECT; i <= IMG_EMC_SPRITE; i++) + InitElementSmallImagesScaledUp(i); +#endif } +#if 1 +/* !!! FIX THIS (CHANGE TO USING NORMAL ELEMENT GRAPHIC DEFINITIONS) !!! */ +void SetBitmaps_EM(Bitmap **em_bitmap) +{ + em_bitmap[0] = graphic_info[IMG_EMC_OBJECT].bitmap; + em_bitmap[1] = graphic_info[IMG_EMC_SPRITE].bitmap; +} +#endif + static int getFontBitmapID(int font_nr) { int special = -1; @@ -560,6 +580,11 @@ void InitElementGraphicInfo() } } +#if 1 + /* set hardcoded definitions for some runtime elements without graphic */ + element_info[EL_AMOEBA_TO_DIAMOND].graphic[ACTION_DEFAULT] = IMG_AMOEBA_DEAD; +#endif + #if 1 /* now set all undefined/invalid graphics to -1 to set to default after it */ for (i = 0; i < MAX_NUM_ELEMENTS; i++) @@ -646,6 +671,7 @@ void InitElementGraphicInfo() default_action_crumbled = element_info[EL_SB_DEFAULT].crumbled[act]; #if 1 + /* !!! needed because EL_EMPTY_SPACE treated as IS_SP_ELEMENT !!! */ /* !!! make this better !!! */ if (i == EL_EMPTY_SPACE) { @@ -840,6 +866,7 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) graphic_info[graphic].crumbled_like = -1; /* do not use clone element */ graphic_info[graphic].diggable_like = -1; /* do not use clone element */ graphic_info[graphic].border_size = TILEX / 8; /* "CRUMBLED" border size */ + graphic_info[graphic].scale_up_factor = 1; /* default: no scaling up */ graphic_info[graphic].anim_delay_fixed = 0; graphic_info[graphic].anim_delay_random = 0; graphic_info[graphic].post_delay_fixed = 0; @@ -939,6 +966,12 @@ static void set_graphic_parameters(int graphic, char **parameter_raw) if (parameter[GFX_ARG_BORDER_SIZE] != ARG_UNDEFINED_VALUE) graphic_info[graphic].border_size = parameter[GFX_ARG_BORDER_SIZE]; + /* optional zoom factor for scaling up the image to a larger size */ + if (parameter[GFX_ARG_SCALE_UP] != ARG_UNDEFINED_VALUE) + graphic_info[graphic].scale_up_factor = parameter[GFX_ARG_SCALE_UP]; + if (graphic_info[graphic].scale_up_factor < 1) + graphic_info[graphic].scale_up_factor = 1; /* no scaling */ + /* this is only used for player "boring" and "sleeping" actions */ if (parameter[GFX_ARG_ANIM_DELAY_FIXED] != ARG_UNDEFINED_VALUE) graphic_info[graphic].anim_delay_fixed = @@ -1266,6 +1299,12 @@ static void set_sound_parameters(int sound, char **parameter_raw) /* 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]; + + /* sound volume to change the original volume when loading the sound file */ + sound_info[sound].volume = parameter[SND_ARG_VOLUME]; + + /* sound priority to give certain sounds a higher or lower priority */ + sound_info[sound].volume = parameter[SND_ARG_VOLUME]; } static void InitSoundInfo() @@ -2201,6 +2240,14 @@ void InitElementPropertiesStatic() EL_SP_GRAVITY_PORT_RIGHT, EL_SP_GRAVITY_PORT_UP, EL_SP_GRAVITY_PORT_DOWN, + EL_SP_GRAVITY_ON_PORT_LEFT, + EL_SP_GRAVITY_ON_PORT_RIGHT, + EL_SP_GRAVITY_ON_PORT_UP, + EL_SP_GRAVITY_ON_PORT_DOWN, + EL_SP_GRAVITY_OFF_PORT_LEFT, + EL_SP_GRAVITY_OFF_PORT_RIGHT, + EL_SP_GRAVITY_OFF_PORT_UP, + EL_SP_GRAVITY_OFF_PORT_DOWN, -1 }; @@ -2282,6 +2329,14 @@ void InitElementPropertiesStatic() EL_SP_GRAVITY_PORT_RIGHT, EL_SP_GRAVITY_PORT_UP, EL_SP_GRAVITY_PORT_DOWN, + EL_SP_GRAVITY_ON_PORT_LEFT, + EL_SP_GRAVITY_ON_PORT_RIGHT, + EL_SP_GRAVITY_ON_PORT_UP, + EL_SP_GRAVITY_ON_PORT_DOWN, + EL_SP_GRAVITY_OFF_PORT_LEFT, + EL_SP_GRAVITY_OFF_PORT_RIGHT, + EL_SP_GRAVITY_OFF_PORT_UP, + EL_SP_GRAVITY_OFF_PORT_DOWN, -1 }; @@ -2326,6 +2381,35 @@ void InitElementPropertiesStatic() -1 }; + static int ep_gravity_reachable[] = + { + EL_SAND, + EL_SP_BASE, + EL_TRAP, + EL_INVISIBLE_SAND, + EL_INVISIBLE_SAND_ACTIVE, + EL_SP_PORT_LEFT, + EL_SP_PORT_RIGHT, + EL_SP_PORT_UP, + EL_SP_PORT_DOWN, + EL_SP_PORT_HORIZONTAL, + EL_SP_PORT_VERTICAL, + EL_SP_PORT_ANY, + EL_SP_GRAVITY_PORT_LEFT, + EL_SP_GRAVITY_PORT_RIGHT, + EL_SP_GRAVITY_PORT_UP, + EL_SP_GRAVITY_PORT_DOWN, + EL_SP_GRAVITY_ON_PORT_LEFT, + EL_SP_GRAVITY_ON_PORT_RIGHT, + EL_SP_GRAVITY_ON_PORT_UP, + EL_SP_GRAVITY_ON_PORT_DOWN, + EL_SP_GRAVITY_OFF_PORT_LEFT, + EL_SP_GRAVITY_OFF_PORT_RIGHT, + EL_SP_GRAVITY_OFF_PORT_UP, + EL_SP_GRAVITY_OFF_PORT_DOWN, + -1 + }; + static int ep_player[] = { EL_PLAYER_1, @@ -2420,6 +2504,7 @@ void InitElementPropertiesStatic() /* should always be valid */ EL_EMPTY, + /* standard classic Supaplex elements */ EL_SP_EMPTY, EL_SP_ZONK, EL_SP_BASE, @@ -2461,11 +2546,24 @@ void InitElementPropertiesStatic() EL_SP_HARDWARE_BASE_6, EL_SP_CHIP_TOP, EL_SP_CHIP_BOTTOM, + /* additional elements that appeared in newer Supaplex levels */ EL_INVISIBLE_WALL, - /* more than one murphy in a level results in an inactive clone */ + + /* additional gravity port elements (not switching, but setting gravity) */ + EL_SP_GRAVITY_ON_PORT_LEFT, + EL_SP_GRAVITY_ON_PORT_RIGHT, + EL_SP_GRAVITY_ON_PORT_UP, + EL_SP_GRAVITY_ON_PORT_DOWN, + EL_SP_GRAVITY_OFF_PORT_LEFT, + EL_SP_GRAVITY_OFF_PORT_RIGHT, + EL_SP_GRAVITY_OFF_PORT_UP, + EL_SP_GRAVITY_OFF_PORT_DOWN, + + /* more than one Murphy in a level results in an inactive clone */ EL_SP_MURPHY_CLONE, - /* runtime elements*/ + + /* runtime Supaplex elements */ EL_SP_DISK_RED_ACTIVE, EL_SP_TERMINAL_ACTIVE, EL_SP_BUGGY_BASE_ACTIVATING, @@ -2491,14 +2589,6 @@ void InitElementPropertiesStatic() -1 }; - static int ep_sp_buggy_base[] = - { - EL_SP_BUGGY_BASE, - EL_SP_BUGGY_BASE_ACTIVATING, - EL_SP_BUGGY_BASE_ACTIVE, - -1 - }; - static int ep_gem[] = { EL_BD_DIAMOND, @@ -3048,6 +3138,14 @@ void InitElementPropertiesStatic() EL_SP_HARDWARE_BASE_4, EL_SP_HARDWARE_BASE_5, EL_SP_HARDWARE_BASE_6, + EL_SP_GRAVITY_ON_PORT_LEFT, + EL_SP_GRAVITY_ON_PORT_RIGHT, + EL_SP_GRAVITY_ON_PORT_UP, + EL_SP_GRAVITY_ON_PORT_DOWN, + EL_SP_GRAVITY_OFF_PORT_LEFT, + EL_SP_GRAVITY_OFF_PORT_RIGHT, + EL_SP_GRAVITY_OFF_PORT_UP, + EL_SP_GRAVITY_OFF_PORT_DOWN, EL_CONVEYOR_BELT_1_SWITCH_LEFT, EL_CONVEYOR_BELT_1_SWITCH_MIDDLE, EL_CONVEYOR_BELT_1_SWITCH_RIGHT, @@ -3137,6 +3235,7 @@ void InitElementPropertiesStatic() { ep_protected, EP_PROTECTED }, { ep_throwable, EP_THROWABLE }, { ep_can_explode, EP_CAN_EXPLODE }, + { ep_gravity_reachable, EP_GRAVITY_REACHABLE }, { ep_player, EP_PLAYER }, { ep_can_pass_magic_wall, EP_CAN_PASS_MAGIC_WALL }, @@ -3144,7 +3243,6 @@ void InitElementPropertiesStatic() { ep_bd_element, EP_BD_ELEMENT }, { ep_sp_element, EP_SP_ELEMENT }, { ep_sb_element, EP_SB_ELEMENT }, - { ep_sp_buggy_base, EP_SP_BUGGY_BASE }, { ep_gem, EP_GEM }, { ep_food_dark_yamyam, EP_FOOD_DARK_YAMYAM }, { ep_food_penguin, EP_FOOD_PENGUIN }, @@ -3472,10 +3570,6 @@ void InitElementPropertiesEngine(int engine_version) SET_PROPERTY(i, EP_MAYBE_DONT_COLLIDE_WITH, (i == EL_SP_SNIKSNAK || i == EL_SP_ELECTRON)); - /* ---------- DIGGABLE_WITH_GRAVITY ------------------------------------ */ - SET_PROPERTY(i, EP_DIGGABLE_WITH_GRAVITY, (IS_DIGGABLE(i) && - !IS_SP_BUGGY_BASE(i))); - /* ---------- CAN_MOVE_INTO_ACID --------------------------------------- */ if (COULD_MOVE_INTO_ACID(i) && !IS_CUSTOM_ELEMENT(i)) SET_PROPERTY(i, EP_CAN_MOVE_INTO_ACID, @@ -3600,7 +3694,17 @@ void InitElementPropertiesEngine(int engine_version) static void InitGlobal() { + int i; + + for (i = 0; i < MAX_NUM_ELEMENTS + 1; i++) + { + element_info[i].token_name = element_name_info[i].token_name; + element_info[i].class_name = element_name_info[i].class_name; + element_info[i].editor_description=element_name_info[i].editor_description; + } + global.autoplay_leveldir = NULL; + global.convert_leveldir = NULL; global.frames_per_second = 0; global.fps_slowdown = FALSE; @@ -3736,6 +3840,20 @@ void Execute_Command(char *command) global.autoplay_level_nr = atoi(str_ptr); /* get level_nr value */ } } + else if (strncmp(command, "convert ", 8) == 0) + { + char *str_copy = getStringCopy(&command[8]); + char *str_ptr = strchr(str_copy, ' '); + + global.convert_leveldir = str_copy; + global.convert_level_nr = -1; + + if (str_ptr != NULL) + { + *str_ptr++ = '\0'; /* terminate leveldir string */ + global.convert_level_nr = atoi(str_ptr); /* get level_nr value */ + } + } else { Error(ERR_EXIT_HELP, "unrecognized command '%s'", command); @@ -4077,14 +4195,14 @@ static void InitMusic(char *identifier) void InitNetworkServer() { -#if defined(PLATFORM_UNIX) +#if defined(NETWORK_AVALIABLE) int nr_wanted; #endif if (!options.network) return; -#if defined(PLATFORM_UNIX) +#if defined(NETWORK_AVALIABLE) nr_wanted = Request("Choose player", REQ_PLAYER | REQ_STAY_CLOSED); if (!ConnectToServer(options.server_host, options.server_port)) @@ -4341,9 +4459,18 @@ void OpenAll() AutoPlayTape(); return; } + else if (global.convert_leveldir) + { + ConvertLevels(); + return; + } game_status = GAME_MODE_MAIN; +#if 1 + em_open_all(); +#endif + DrawMainMenu(); InitNetworkServer(); @@ -4356,9 +4483,18 @@ void CloseAllAndExit(int exit_value) FreeAllMusic(); CloseAudio(); /* called after freeing sounds (needed for SDL) */ +#if 1 + em_close_all(); +#endif + FreeAllImages(); FreeTileClipmasks(); +#if defined(TARGET_SDL) + if (network_server) /* terminate network server */ + SDL_KillThread(server_thread); +#endif + CloseVideoDisplay(); ClosePlatformDependentStuff();