X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=d3909d5eedbfff6901940af9c64a692d8481f1fc;hb=5c94351c5b8a12d8615b447b6275dd2f68615be4;hp=b0e419f6e6485c50ef051e6c5765eb687888cb69;hpb=96e81193abbb278dd3b79d109ff99d061fe43973;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index b0e419f6..d3909d5e 100644 --- a/src/tools.c +++ b/src/tools.c @@ -242,8 +242,7 @@ void DrawMaskedBorder_ALL() void DrawMaskedBorder(int redraw_mask) { /* do not draw masked screen borders when displaying title screens */ - if (effectiveGameStatus() == GAME_MODE_TITLE || - effectiveGameStatus() == GAME_MODE_MESSAGE) + if (effectiveGameStatus() == GAME_MODE_TITLE) return; if (redraw_mask & REDRAW_ALL) @@ -522,11 +521,39 @@ void FadeToFront() void FadeExt(int fade_mask, int fade_mode) { + static int fade_mode_skip = FADE_MODE_NONE; void (*draw_border_function)(void) = NULL; Bitmap *bitmap = (fade_mode == FADE_MODE_CROSSFADE ? bitmap_db_cross : NULL); int x, y, width, height; int fade_delay, post_delay; + redraw_mask |= fade_mask; + + if (fade_mode & FADE_TYPE_SKIP) + { + fade_mode_skip = fade_mode; + + return; + } + + if (fade_mode_skip & FADE_TYPE_SKIP) + { +#if 0 + printf("::: skipping %d ... [%d]\n", fade_mode, fade_mode_skip); +#endif + + /* skip all fade operations until specified fade operation */ + if (fade_mode & fade_mode_skip) + fade_mode_skip = FADE_MODE_NONE; + + return; + } + +#if 1 + if (fading.fade_mode == FADE_MODE_NONE) + return; +#endif + if (fade_mask & REDRAW_FIELD) { x = REAL_SX; @@ -534,8 +561,8 @@ void FadeExt(int fade_mask, int fade_mode) width = FULL_SXSIZE; height = FULL_SYSIZE; - fade_delay = menu.fade_delay; - post_delay = (fade_mode == FADE_MODE_FADE_OUT ? menu.post_delay : 0); + fade_delay = fading.fade_delay; + post_delay = (fade_mode == FADE_MODE_FADE_OUT ? fading.post_delay : 0); draw_border_function = DrawMaskedBorder_FIELD; } @@ -546,13 +573,15 @@ void FadeExt(int fade_mask, int fade_mode) width = WIN_XSIZE; height = WIN_YSIZE; - fade_delay = title.fade_delay_final; - post_delay = (fade_mode == FADE_MODE_FADE_OUT ? title.post_delay_final : 0); + fade_delay = fading.fade_delay; + post_delay = (fade_mode == FADE_MODE_FADE_OUT ? fading.post_delay : 0); } - redraw_mask |= fade_mask; - +#if 1 if (!setup.fade_screens || fade_delay == 0) +#else + if (!setup.fade_screens || fade_delay == 0 || fading.anim_mode == ANIM_NONE) +#endif { if (fade_mode == FADE_MODE_FADE_OUT) ClearRectangle(backbuffer, x, y, width, height); @@ -570,12 +599,26 @@ void FadeExt(int fade_mask, int fade_mode) void FadeIn(int fade_mask) { +#if 1 + if (fading.fade_mode == FADE_MODE_CROSSFADE) + FadeExt(fade_mask, FADE_MODE_CROSSFADE); + else + FadeExt(fade_mask, FADE_MODE_FADE_IN); +#else FadeExt(fade_mask, FADE_MODE_FADE_IN); +#endif } void FadeOut(int fade_mask) { +#if 1 + if (fading.fade_mode == FADE_MODE_CROSSFADE) + FadeCrossSaveBackbuffer(); + else + FadeExt(fade_mask, FADE_MODE_FADE_OUT); +#else FadeExt(fade_mask, FADE_MODE_FADE_OUT); +#endif } void FadeCross(int fade_mask) @@ -588,6 +631,48 @@ void FadeCrossSaveBackbuffer() BlitBitmap(backbuffer, bitmap_db_cross, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); } +void FadeSetEnterMenu() +{ + fading = menu.enter_menu; +} + +void FadeSetLeaveMenu() +{ + fading = menu.leave_menu; +} + +void FadeSetStartItem() +{ + fading = menu.start_item; +} + +void FadeSetFromType(int type) +{ + if (type & TYPE_ENTER_SCREEN) + FadeSetStartItem(); + else if (type & TYPE_ENTER) + FadeSetEnterMenu(); + else if (type & TYPE_LEAVE) + FadeSetLeaveMenu(); +} + +void FadeSetDisabled() +{ + static struct TitleFadingInfo fading_none = { FADE_MODE_NONE, -1, -1, -1 }; + + fading = fading_none; +} + +void FadeSkipNextFadeIn() +{ + FadeExt(0, FADE_MODE_SKIP_FADE_IN); +} + +void FadeSkipNextFadeOut() +{ + FadeExt(0, FADE_MODE_SKIP_FADE_OUT); +} + void SetWindowBackgroundImageIfDefined(int graphic) { if (graphic_info[graphic].bitmap) @@ -1766,7 +1851,7 @@ static void DrawPreviewLevelExt(int from_x, int from_y) int real_preview_xsize = MIN(level_xsize, preview.xsize); int real_preview_ysize = MIN(level_ysize, preview.ysize); int dst_x = SX + ALIGNED_XPOS(preview.x, preview_width, preview.align); - int dst_y = SY + preview.y; + int dst_y = SY + ALIGNED_YPOS(preview.y, preview_height, preview.valign); int x, y; DrawBackground(dst_x, dst_y, preview_width, preview_height); @@ -1820,6 +1905,15 @@ static void DrawPreviewLevelLabelExt(int mode) struct TextPosInfo *pos = &menu.main.text.level_info_2; char label_text[MAX_OUTPUT_LINESIZE + 1]; int max_len_label_text; +#if 1 + int font_nr = pos->font; + int i; + + if (mode == MICROLABEL_LEVEL_AUTHOR_HEAD || + mode == MICROLABEL_IMPORTED_FROM_HEAD || + mode == MICROLABEL_IMPORTED_BY_HEAD) + font_nr = pos->font_alt; +#else int font_nr = FONT_TEXT_2; int i; @@ -1827,6 +1921,7 @@ static void DrawPreviewLevelLabelExt(int mode) mode == MICROLABEL_IMPORTED_FROM_HEAD || mode == MICROLABEL_IMPORTED_BY_HEAD) font_nr = FONT_TEXT_3; +#endif #if 1 max_len_label_text = getMaxTextLength(pos, font_nr); @@ -1893,8 +1988,10 @@ void DrawPreviewLevel(boolean restart) int level_ysize = lev_fieldy + (show_level_border ? 2 : 0); int last_game_status = game_status; /* save current game status */ +#if 0 /* force PREVIEW font on preview level */ game_status = GAME_MODE_PSEUDO_PREVIEW; +#endif if (restart) { @@ -1927,7 +2024,11 @@ void DrawPreviewLevel(boolean restart) { struct TextPosInfo *pos = &menu.main.text.level_info_1; char label_text[MAX_OUTPUT_LINESIZE + 1]; +#if 1 + int font_nr = pos->font; +#else int font_nr = FONT_TEXT_1; +#endif #if 1 int max_len_label_text = getMaxTextLength(pos, font_nr); #else @@ -2610,7 +2711,7 @@ boolean Request(char *text, unsigned int req_state) /* clear door drawing field */ DrawBackground(DX, DY, DXSIZE, DYSIZE); - /* force DOOR font on preview level */ + /* force DOOR font inside door area */ game_status = GAME_MODE_PSEUDO_DOOR; /* write text for request */ @@ -2973,7 +3074,7 @@ unsigned int MoveDoor(unsigned int door_state) if (setup.quick_doors) { - stepsize = 20; /* must be choosen to always draw last frame */ + stepsize = 20; /* must be chosen to always draw last frame */ door_delay_value = 0; } @@ -5730,25 +5831,66 @@ static struct Mapping_EM_to_RND_object object_mapping[TILE_MAX]; static struct Mapping_EM_to_RND_player player_mapping[MAX_PLAYERS][SPR_MAX]; #endif -void getGraphicSourceExt_EM(int player_nr, int anim, int frame_em, - Bitmap **src_bitmap, int *src_x, int *src_y) +void ResetGfxAnimation_EM(int x, int y, int tile) { - int element = player_mapping[player_nr][anim].element_rnd; - int action = player_mapping[player_nr][anim].action; - int direction = player_mapping[player_nr][anim].direction; + GfxFrame[x][y] = 0; +} + +void getGraphicSourceObjectExt_EM(int tile, int frame_em, + Bitmap **src_bitmap, int *src_x, int *src_y, + int x, int y) +{ + int element = object_mapping[tile].element_rnd; + int action = object_mapping[tile].action; + int direction = object_mapping[tile].direction; + boolean is_backside = object_mapping[tile].is_backside; + boolean action_removing = (action == ACTION_DIGGING || + action == ACTION_SNAPPING || + action == ACTION_COLLECTING); + int effective_element = (frame_em > 0 ? element : + is_backside ? EL_EMPTY : + action_removing ? EL_EMPTY : + element); + int graphic = (direction == MV_NONE ? + el_act2img(effective_element, action) : + el_act_dir2img(effective_element, action, direction)); + struct GraphicInfo *g = &graphic_info[graphic]; + int sync_frame; + + if (graphic_info[graphic].anim_global_sync) + sync_frame = FrameCounter; + else + sync_frame = 7 - frame_em; + + SetRandomAnimationValue(x, y); + + int frame = getAnimationFrame(g->anim_frames, + g->anim_delay, + g->anim_mode, + g->anim_start_frame, + sync_frame); + + getGraphicSourceExt(graphic, frame, src_bitmap, src_x, src_y, FALSE); +} +void getGraphicSourcePlayerExt_EM(int player_nr, int anim, int frame_em, + Bitmap **src_bitmap, int *src_x, int *src_y) +{ + int element = player_mapping[player_nr][anim].element_rnd; + int action = player_mapping[player_nr][anim].action; + int direction = player_mapping[player_nr][anim].direction; int graphic = (direction == MV_NONE ? el_act2img(element, action) : el_act_dir2img(element, action, direction)); struct GraphicInfo *g = &graphic_info[graphic]; - // struct GraphicInfo_EM *g_em = &graphic_info_em_player[p][i][7 - j]; - // Bitmap *src_bitmap; - // int src_x, src_y; - // int sync_frame = j; - int sync_frame = 7 - frame_em; + int sync_frame; InitPlayerGfxAnimation(&stored_player[player_nr], action, direction); + stored_player[player_nr].StepFrame = 7 - frame_em; + + sync_frame = stored_player[player_nr].Frame; + #if 0 printf("::: %d: %d, %d [%d]\n", player_nr, @@ -5757,8 +5899,6 @@ void getGraphicSourceExt_EM(int player_nr, int anim, int frame_em, FrameCounter); #endif - sync_frame = stored_player[player_nr].Frame; - int frame = getAnimationFrame(g->anim_frames, g->anim_delay, g->anim_mode, @@ -5766,18 +5906,6 @@ void getGraphicSourceExt_EM(int player_nr, int anim, int frame_em, sync_frame); getGraphicSourceExt(graphic, frame, src_bitmap, src_x, src_y, FALSE); - -#if 0 - g_em->bitmap = src_bitmap; - g_em->src_x = src_x; - g_em->src_y = src_y; - g_em->src_offset_x = 0; - g_em->src_offset_y = 0; - g_em->dst_offset_x = 0; - g_em->dst_offset_y = 0; - g_em->width = TILEX; - g_em->height = TILEY; -#endif } void InitGraphicInfo_EM(void) @@ -6403,10 +6531,8 @@ void InitGraphicInfo_EM(void) #endif } -void PlayMenuSound() +void PlayMenuSoundExt(int sound) { - int sound = menu.sound[game_status]; - if (sound == SND_UNDEFINED) return; @@ -6420,6 +6546,11 @@ void PlayMenuSound() PlaySound(sound); } +void PlayMenuSound() +{ + PlayMenuSoundExt(menu.sound[game_status]); +} + void PlayMenuSoundStereo(int sound, int stereo_position) { if (sound == SND_UNDEFINED) @@ -6435,10 +6566,8 @@ void PlayMenuSoundStereo(int sound, int stereo_position) PlaySoundStereo(sound, stereo_position); } -void PlayMenuSoundIfLoop() +void PlayMenuSoundIfLoopExt(int sound) { - int sound = menu.sound[game_status]; - if (sound == SND_UNDEFINED) return; @@ -6450,10 +6579,13 @@ void PlayMenuSoundIfLoop() PlaySoundLoop(sound); } -void PlayMenuMusic() +void PlayMenuSoundIfLoop() { - int music = menu.music[game_status]; + PlayMenuSoundIfLoopExt(menu.sound[game_status]); +} +void PlayMenuMusicExt(int music) +{ if (music == MUS_UNDEFINED) return; @@ -6463,6 +6595,11 @@ void PlayMenuMusic() PlayMusic(music); } +void PlayMenuMusic() +{ + PlayMenuMusicExt(menu.music[game_status]); +} + void PlaySoundActivating() { #if 0