X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=cc08a6690f133a6675e83312b26d43b200221302;hb=472e5e90;hp=cdb7b4cb70bc20bf5a75af60be8df3387c9f7890;hpb=45483d224aed58ac2cf856b0fcdd2d4707084047;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index cdb7b4cb..cc08a669 100644 --- a/src/tools.c +++ b/src/tools.c @@ -500,7 +500,9 @@ void RedrawPlayfield(void) if (game_status != GAME_MODE_PLAYING) return; - if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + RedrawPlayfield_BD(TRUE); + else if (level.game_engine_type == GAME_ENGINE_TYPE_EM) RedrawPlayfield_EM(TRUE); else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) RedrawPlayfield_SP(TRUE); @@ -668,7 +670,9 @@ void BlitScreenToBitmap_RND(Bitmap *target_bitmap) void BlitScreenToBitmap(Bitmap *target_bitmap) { - if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + BlitScreenToBitmap_BD(target_bitmap); + else if (level.game_engine_type == GAME_ENGINE_TYPE_EM) BlitScreenToBitmap_EM(target_bitmap); else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) BlitScreenToBitmap_SP(target_bitmap); @@ -1026,6 +1030,10 @@ void FadeOut(int fade_mask) fade_type_skip != FADE_MODE_SKIP_FADE_OUT) BackToFront(); + // when using BD game engine, cover playfield before fading out after a game + if (game_bd.cover_screen) + CoverScreen_BD(); + SetScreenStates_BeforeFadingOut(); SetTileCursorActive(FALSE); @@ -3388,6 +3396,14 @@ static void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) game.envelope_active = FALSE; } +static Bitmap *GetPreviewTileBitmap(Bitmap *bitmap) +{ + if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + return GetPreviewTileBitmap_BD(bitmap); + + return bitmap; +} + static void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize) { if (IS_MM_WALL(element)) @@ -3401,6 +3417,10 @@ static void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize) int graphic = el2preimg(element); getSizedGraphicSource(graphic, 0, tilesize, &src_bitmap, &src_x, &src_y); + + // for BD style levels, maybe use bitmap with level-specific colors + src_bitmap = GetPreviewTileBitmap(src_bitmap); + BlitBitmap(src_bitmap, drawto, src_x, src_y, tilesize, tilesize, dst_x, dst_y); } @@ -3445,11 +3465,27 @@ void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y) redraw_mask |= REDRAW_FIELD; } +static int getPreviewLevelWidth(void) +{ + if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + return (level.native_bd_level->cave->x2 - level.native_bd_level->cave->x1 + 1); + + return lev_fieldx; +} + +static int getPreviewLevelHeight(void) +{ + if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + return (level.native_bd_level->cave->y2 - level.native_bd_level->cave->y1 + 1); + + return lev_fieldy; +} + static void DrawPreviewLevelPlayfield(int from_x, int from_y) { boolean show_level_border = (BorderElement != EL_EMPTY); - int level_xsize = lev_fieldx + (show_level_border ? 2 : 0); - int level_ysize = lev_fieldy + (show_level_border ? 2 : 0); + int level_xsize = getPreviewLevelWidth() + (show_level_border ? 2 : 0); + int level_ysize = getPreviewLevelHeight() + (show_level_border ? 2 : 0); int tile_size = preview.tile_size; int preview_width = preview.xsize * tile_size; int preview_height = preview.ysize * tile_size; @@ -3807,8 +3843,35 @@ void DrawPreviewPlayers(void) } } +static void PreparePreviewTileBitmap(void) +{ + // check if special preview bitmap with level-specific colors should be created + if (level.game_engine_type != GAME_ENGINE_TYPE_BD) + return; + + // use original sized bitmap (else reduced color palette is lost by downscaling) + int original_tilesize = MAX(MINI_TILESIZE, preview.tile_size); + int scale_down_factor = original_tilesize / preview.tile_size; + Bitmap *src_bitmap; + int src_x, src_y; + int element_template = EL_BD_GAME_GRAPHICS_COLOR_TEMPLATE; + int graphic_template = el2preimg(element_template); + int element_default = EL_BD_ROCK; + int graphic_default = el2preimg(element_default); + + // create special preview bitmap and scale it down to preview tile size + getSizedGraphicSource(graphic_template, 0, original_tilesize, &src_bitmap, &src_x, &src_y); + PreparePreviewTileBitmap_BD(src_bitmap, scale_down_factor); + + // force using special preview bitmap to replace original preview bitmap + getSizedGraphicSource(graphic_default, 0, preview.tile_size, &src_bitmap, &src_x, &src_y); + SetPreviewTileBitmapReference_BD(src_bitmap); +} + void DrawPreviewLevelInitial(void) { + PreparePreviewTileBitmap(); // only needed for native BD style levels + DrawPreviewLevelExt(TRUE); DrawPreviewPlayers(); } @@ -5517,8 +5580,8 @@ unsigned int MoveDoor(unsigned int door_state) if (!door_panel_drawn[door_index]) { - ClearRectangle(drawto, door_rect->x, door_rect->y, - door_rect->width, door_rect->height); + ClearRectangleOnBackground(drawto, door_rect->x, door_rect->y, + door_rect->width, door_rect->height); door_panel_drawn[door_index] = TRUE; } @@ -6221,7 +6284,7 @@ bd_object_mapping_list[] = }, { O_CONVEYOR_DIR_SWITCH, TRUE, - EL_BD_CONVEYOR_DIR_SWITCH_RIGHT, -1, -1 + EL_BD_CONVEYOR_DIR_SWITCH_NORMAL, -1, -1 }, { O_ACID, TRUE, @@ -6968,11 +7031,11 @@ bd_object_mapping_list[] = }, { O_CONVEYOR_DIR_NORMAL, FALSE, - EL_BD_CONVEYOR_DIR_SWITCH_RIGHT, -1, -1 + EL_BD_CONVEYOR_DIR_SWITCH_NORMAL, -1, -1 }, { O_CONVEYOR_DIR_CHANGED, FALSE, - EL_BD_CONVEYOR_DIR_SWITCH_LEFT, -1, -1 + EL_BD_CONVEYOR_DIR_SWITCH_CHANGED, -1, -1 }, { O_CONVEYOR_SWITCH_OFF, FALSE, @@ -9678,7 +9741,9 @@ boolean isActivePlayer_EM(int player_nr) unsigned int InitRND(int seed) { - if (level.game_engine_type == GAME_ENGINE_TYPE_EM) + if (level.game_engine_type == GAME_ENGINE_TYPE_BD) + return InitEngineRandom_BD(seed); + else if (level.game_engine_type == GAME_ENGINE_TYPE_EM) return InitEngineRandom_EM(seed); else if (level.game_engine_type == GAME_ENGINE_TYPE_SP) return InitEngineRandom_SP(seed); @@ -10108,6 +10173,20 @@ void InitGraphicInfo_BD(void) g_bd->height = TILEY; } } + + // game graphics template for level-specific colors for native BD levels + int graphic = IMG_BD_GAME_GRAPHICS_COLOR_TEMPLATE; + struct GraphicInfo_BD *g_bd = &graphic_info_bd_color_template; + Bitmap *src_bitmap; + int src_x, src_y; + + getGraphicSourceExt(graphic, 0, &src_bitmap, &src_x, &src_y, FALSE); + + g_bd->bitmap = src_bitmap; + g_bd->src_x = src_x; + g_bd->src_y = src_y; + g_bd->width = TILEX; + g_bd->height = TILEY; } void InitGraphicInfo_EM(void) @@ -11211,6 +11290,11 @@ void OpenURLFromHash(SetupFileHash *hash, int hash_key) OpenURL(getHashEntry(hash, int2str(hash_key, 0))); } +char *getCurrentLevelsetName(void) +{ + return leveldir_current->name; +} + // ============================================================================ // tests @@ -11306,10 +11390,10 @@ static unsigned int test_uuid_random_function_better(int max) static void TestGeneratingUUIDs_RunTest(int nr, int always_seed, int num_uuids) { - struct hashtable *hash_seeds = - create_hashtable(16, 0.75, get_hash_from_key, hash_keys_are_equal); - struct hashtable *hash_uuids = - create_hashtable(16, 0.75, get_hash_from_key, hash_keys_are_equal); + HashTable *hash_seeds = + create_hashtable(get_hash_from_string, hash_key_strings_are_equal, free, NULL); + HashTable *hash_uuids = + create_hashtable(get_hash_from_string, hash_key_strings_are_equal, free, NULL); static char message[100]; int i; @@ -11388,8 +11472,8 @@ static void TestGeneratingUUIDs_RunTest(int nr, int always_seed, int num_uuids) Request(message, REQ_CONFIRM); - hashtable_destroy(hash_seeds, 0); - hashtable_destroy(hash_uuids, 0); + hashtable_destroy(hash_seeds); + hashtable_destroy(hash_uuids); } void TestGeneratingUUIDs(void)