X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=6f67e1432953addc1ea27e143c3613ece3b14bb6;hb=6f20c46794de2b6e936f9f9ea46f893a059ffd47;hp=6c8e96be5a74d37404300725dd923892b04bf775;hpb=80aa0e4b2b060112407417a9d2896395023a21cc;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 6c8e96be..6f67e143 100644 --- a/src/tools.c +++ b/src/tools.c @@ -2465,12 +2465,12 @@ void DrawMiniElementOrWall(int sx, int sy, int scroll_x, int scroll_y) DrawMiniGraphic(sx, sy, el2edimg(getBorderElement(x, y))); } -void DrawEnvelopeBackground(int envelope_nr, int startx, int starty, - int x, int y, int xsize, int ysize, int font_nr) +void DrawEnvelopeBackground(int graphic, int startx, int starty, + int x, int y, int xsize, int ysize, int font_nr, + int line_spacing) { int font_width = getFontWidth(font_nr); - int font_height = getFontHeight(font_nr); - int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr; + int font_height = getFontHeight(font_nr) + line_spacing; Bitmap *src_bitmap; int src_x, src_y; int dst_x = SX + startx + x * font_width; @@ -2541,12 +2541,18 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) SetDrawtoField(DRAW_BUFFERED); +#if 1 + BlitScreenToBitmap(backbuffer); +#else BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY); +#endif SetDrawtoField(DRAW_BACKBUFFER); - for (yy = 0; yy < ysize; yy++) for (xx = 0; xx < xsize; xx++) - DrawEnvelopeBackground(envelope_nr, sx,sy, xx,yy, xsize, ysize, font_nr); + for (yy = 0; yy < ysize; yy++) + for (xx = 0; xx < xsize; xx++) + DrawEnvelopeBackground(graphic, sx,sy, xx,yy, xsize, ysize, + font_nr, 0); #if 1 DrawTextBuffer(SX + sx + font_width, SY + sy + font_height, @@ -2567,19 +2573,23 @@ void AnimateEnvelope(int envelope_nr, int anim_mode, int action) } } -void AnimateEnvelopeDoor(char *text, int anim_mode, int action) +void AnimateEnvelopeRequest(char *text, int anim_mode, int action) { -#if 1 +#if 0 int envelope_nr = 0; #endif +#if 1 + int graphic = IMG_BACKGROUND_REQUEST; +#else int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr; +#endif Bitmap *src_bitmap = graphic_info[graphic].bitmap; int mask_mode = (src_bitmap != NULL ? BLIT_MASKED : BLIT_ON_BACKGROUND); boolean ffwd_delay = (tape.playing && tape.fast_forward); boolean no_delay = (tape.warp_forward); unsigned int anim_delay = 0; int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay); - int anim_delay_value = (no_delay ? 0 : frame_delay_value); + int anim_delay_value = (no_delay ? 0 : frame_delay_value + 500 * 0); #if 1 int max_word_len = maxWordLengthInString(text); int font_nr = (max_word_len > 7 ? FONT_TEXT_1 : FONT_TEXT_2); @@ -2588,11 +2598,13 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) #endif int font_width = getFontWidth(font_nr); int font_height = getFontHeight(font_nr); + int line_spacing = 2 * 1; #if 1 #if 1 int max_xsize = DXSIZE / font_width; - int max_ysize = DYSIZE / font_height; + // int max_ysize = DYSIZE / font_height; + int max_ysize = DYSIZE / (font_height + line_spacing); #else int max_xsize = 7; /* tools.c: MAX_REQUEST_LINE_FONT1_LEN == 7 */ int max_ysize = 13; /* tools.c: MAX_REQUEST_LINES == 13 */ @@ -2663,7 +2675,8 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) int xsize = (action == ACTION_CLOSING ? xend - (x - xstart) : x) + 2; int ysize = (action == ACTION_CLOSING ? yend - (y - ystart) : y) + 2; int sx = (SXSIZE - xsize * font_width) / 2; - int sy = (SYSIZE - ysize * font_height) / 2; + // int sy = (SYSIZE - ysize * font_height) / 2; + int sy = (SYSIZE - ysize * (font_height + line_spacing)) / 2; int xx, yy; #if 1 @@ -2671,20 +2684,26 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) #else SetDrawtoField(DRAW_BUFFERED); +#if 1 + BlitScreenToBitmap(backbuffer); +#else BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY); +#endif SetDrawtoField(DRAW_BACKBUFFER); #endif - for (yy = 0; yy < ysize; yy++) for (xx = 0; xx < xsize; xx++) - DrawEnvelopeBackground(envelope_nr, sx,sy, xx,yy, xsize, ysize, font_nr); + for (yy = 0; yy < ysize; yy++) + for (xx = 0; xx < xsize; xx++) + DrawEnvelopeBackground(graphic, sx,sy, xx,yy, xsize, ysize, + font_nr, line_spacing); #if 1 #if 1 DrawTextBuffer(SX + sx + font_width, SY + sy + font_height + 8, text_copy, font_nr, max_xsize, - xsize - 2, ysize - 2, 2, mask_mode, + xsize - 2, ysize - 2, line_spacing, mask_mode, FALSE, TRUE, FALSE); #else DrawTextBuffer(SX + sx + font_width, SY + sy + font_height, @@ -2702,6 +2721,7 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) /* copy request gadgets to door backbuffer */ #if 1 + /* if ((ysize - 2) > 13) BlitBitmap(bitmap_db_door, drawto, DOOR_GFX_PAGEX1 + (DXSIZE - (xsize - 2) * font_width) / 2, @@ -2710,6 +2730,15 @@ void AnimateEnvelopeDoor(char *text, int anim_mode, int action) (ysize - 2 - 13) * font_height, SX + sx + font_width, SY + sy + font_height * (1 + 13)); + */ + if ((ysize - 2) > 13) + BlitBitmap(bitmap_db_door, drawto, + DOOR_GFX_PAGEX1 + (DXSIZE - (xsize - 2) * font_width) / 2, + DOOR_GFX_PAGEY1 + 11 * (font_height + line_spacing * 0), + (xsize - 2) * font_width, + (ysize - 2 - 13) * (font_height + line_spacing), + SX + sx + font_width, + SY + sy + (font_height + line_spacing) * (1 + 13)); #else if ((ysize - 2) > 13) BlitBitmap(bitmap_db_door, drawto, @@ -2787,17 +2816,23 @@ void ShowEnvelope(int envelope_nr) BackToFront(); } -void ShowEnvelopeDoor(char *text, int action) +void ShowEnvelopeRequest(char *text, int action) { #if 1 int last_game_status = game_status; /* save current game status */ // int last_draw_background_mask = gfx.draw_background_mask; - int envelope_nr = 0; #endif +#if 1 + int graphic = IMG_BACKGROUND_REQUEST; + int sound_opening = SND_REQUEST_OPENING; + int sound_closing = SND_REQUEST_CLOSING; +#else + int envelope_nr = 0; int element = EL_ENVELOPE_1 + envelope_nr; int graphic = IMG_BACKGROUND_ENVELOPE_1 + envelope_nr; int sound_opening = element_info[element].sound[ACTION_OPENING]; int sound_closing = element_info[element].sound[ACTION_CLOSING]; +#endif #if 0 boolean ffwd_delay = (tape.playing && tape.fast_forward); boolean no_delay = (tape.warp_forward); @@ -2844,9 +2879,9 @@ void ShowEnvelopeDoor(char *text, int action) PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE); if (anim_mode == ANIM_DEFAULT) - AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_OPENING); + AnimateEnvelopeRequest(text, ANIM_DEFAULT, ACTION_OPENING); - AnimateEnvelopeDoor(text, main_anim_mode, ACTION_OPENING); + AnimateEnvelopeRequest(text, main_anim_mode, ACTION_OPENING); #if 0 if (tape.playing) @@ -2860,10 +2895,10 @@ void ShowEnvelopeDoor(char *text, int action) PlayMenuSoundStereo(sound_closing, SOUND_MIDDLE); if (anim_mode != ANIM_NONE) - AnimateEnvelopeDoor(text, main_anim_mode, ACTION_CLOSING); + AnimateEnvelopeRequest(text, main_anim_mode, ACTION_CLOSING); if (anim_mode == ANIM_DEFAULT) - AnimateEnvelopeDoor(text, ANIM_DEFAULT, ACTION_CLOSING); + AnimateEnvelopeRequest(text, ANIM_DEFAULT, ACTION_CLOSING); } game.envelope_active = FALSE; @@ -2949,7 +2984,7 @@ void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y) redraw_mask |= REDRAW_FIELD; } -static void DrawPreviewLevelExt(int from_x, int from_y) +static void DrawPreviewLevelPlayfieldExt(int from_x, int from_y) { boolean show_level_border = (BorderElement != EL_EMPTY); int level_xsize = lev_fieldx + (show_level_border ? 2 : 0); @@ -3085,7 +3120,7 @@ static void DrawPreviewLevelLabelExt(int mode) redraw_mask |= REDRAW_MICROLEVEL; } -void DrawPreviewLevel(boolean restart) +static void DrawPreviewLevelExt(boolean restart) { static unsigned int scroll_delay = 0; static unsigned int label_delay = 0; @@ -3122,7 +3157,7 @@ void DrawPreviewLevel(boolean restart) label_state = 1; label_counter = 0; - DrawPreviewLevelExt(from_x, from_y); + DrawPreviewLevelPlayfieldExt(from_x, from_y); DrawPreviewLevelLabelExt(label_state); /* initialize delay counters */ @@ -3224,7 +3259,7 @@ void DrawPreviewLevel(boolean restart) break; } - DrawPreviewLevelExt(from_x, from_y); + DrawPreviewLevelPlayfieldExt(from_x, from_y); } /* !!! THIS ALL SUCKS -- SHOULD BE CLEANLY REWRITTEN !!! */ @@ -3271,6 +3306,16 @@ void DrawPreviewLevel(boolean restart) game_status = last_game_status; /* restore current game status */ } +void DrawPreviewLevelInitial() +{ + DrawPreviewLevelExt(TRUE); +} + +void DrawPreviewLevelAnimation() +{ + DrawPreviewLevelExt(FALSE); +} + inline void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, int graphic, int sync_frame, int mask_mode) { @@ -3868,8 +3913,8 @@ boolean Request(char *text, unsigned int req_state) char *text_ptr; int i; -#if 1 - global.use_envelope_request = 0; +#if 0 + global.use_envelope_request = 1; #endif #if 1 @@ -4030,7 +4075,7 @@ boolean Request(char *text, unsigned int req_state) #if 1 if (global.use_envelope_request) { - ShowEnvelopeDoor(text, ACTION_OPENING); + ShowEnvelopeRequest(text, ACTION_OPENING); for (i = 0; i < NUM_TOOL_BUTTONS; i++) { @@ -4172,6 +4217,9 @@ boolean Request(char *text, unsigned int req_state) break; case KSYM_Escape: +#if defined(TARGET_SDL2) + case KSYM_Back: +#endif result = 0; break; @@ -4248,7 +4296,7 @@ boolean Request(char *text, unsigned int req_state) #if 1 if (global.use_envelope_request) - ShowEnvelopeDoor(text, ACTION_CLOSING); + ShowEnvelopeRequest(text, ACTION_CLOSING); #endif #if 1 @@ -4656,6 +4704,102 @@ void UndrawSpecialEditorDoor() /* ---------- new tool button stuff ---------------------------------------- */ +#if 1 + +static struct +{ + int graphic; + struct TextPosInfo *pos; + int gadget_id; + char *infotext; +} toolbutton_info[NUM_TOOL_BUTTONS] = +{ + { + IMG_REQUEST_BUTTON_GFX_YES, &request.button.yes, + TOOL_CTRL_ID_YES, "yes" + }, + { + IMG_REQUEST_BUTTON_GFX_NO, &request.button.no, + TOOL_CTRL_ID_NO, "no" + }, + { + IMG_REQUEST_BUTTON_GFX_CONFIRM, &request.button.confirm, + TOOL_CTRL_ID_CONFIRM, "confirm" + }, + { + IMG_REQUEST_BUTTON_GFX_PLAYER_1, &request.button.player_1, + TOOL_CTRL_ID_PLAYER_1, "player 1" + }, + { + IMG_REQUEST_BUTTON_GFX_PLAYER_2, &request.button.player_2, + TOOL_CTRL_ID_PLAYER_2, "player 2" + }, + { + IMG_REQUEST_BUTTON_GFX_PLAYER_3, &request.button.player_3, + TOOL_CTRL_ID_PLAYER_3, "player 3" + }, + { + IMG_REQUEST_BUTTON_GFX_PLAYER_4, &request.button.player_4, + TOOL_CTRL_ID_PLAYER_4, "player 4" + } +}; + +void CreateToolButtons() +{ + int i; + + for (i = 0; i < NUM_TOOL_BUTTONS; i++) + { + struct GraphicInfo *gfx = &graphic_info[toolbutton_info[i].graphic]; + struct TextPosInfo *pos = toolbutton_info[i].pos; + struct GadgetInfo *gi; + Bitmap *deco_bitmap = None; + int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0; + unsigned int event_mask = GD_EVENT_RELEASED; + int gd_x = gfx->src_x; + int gd_y = gfx->src_y; + int gd_xp = gfx->src_x + gfx->pressed_xoffset; + int gd_yp = gfx->src_y + gfx->pressed_yoffset; + int id = i; + + if (id >= TOOL_CTRL_ID_PLAYER_1 && id <= TOOL_CTRL_ID_PLAYER_4) + { + int player_nr = id - TOOL_CTRL_ID_PLAYER_1; + + getSizedGraphicSource(PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0, + pos->size, &deco_bitmap, &deco_x, &deco_y); + deco_xpos = (gfx->width - pos->size) / 2; + deco_ypos = (gfx->height - pos->size) / 2; + } + + gi = CreateGadget(GDI_CUSTOM_ID, id, + GDI_INFO_TEXT, toolbutton_info[i].infotext, + GDI_X, DX + pos->x, + GDI_Y, DY + pos->y, + GDI_WIDTH, gfx->width, + GDI_HEIGHT, gfx->height, + GDI_TYPE, GD_TYPE_NORMAL_BUTTON, + GDI_STATE, GD_BUTTON_UNPRESSED, + GDI_DESIGN_UNPRESSED, gfx->bitmap, gd_x, gd_y, + GDI_DESIGN_PRESSED, gfx->bitmap, gd_xp, gd_yp, + GDI_DECORATION_DESIGN, deco_bitmap, deco_x, deco_y, + GDI_DECORATION_POSITION, deco_xpos, deco_ypos, + GDI_DECORATION_SIZE, pos->size, pos->size, + GDI_DECORATION_SHIFTING, 1, 1, + GDI_DIRECT_DRAW, FALSE, + GDI_EVENT_MASK, event_mask, + GDI_CALLBACK_ACTION, HandleToolButtons, + GDI_END); + + if (gi == NULL) + Error(ERR_EXIT, "cannot create gadget"); + + tool_gadget[id] = gi; + } +} + +#else + /* graphic position values for tool buttons */ #define TOOL_BUTTON_YES_XPOS 2 #define TOOL_BUTTON_YES_YPOS 250 @@ -4814,6 +4958,8 @@ void CreateToolButtons() } } +#endif + void FreeToolButtons() { int i; @@ -8980,18 +9126,44 @@ void PlaySoundSelecting() #endif } -void ToggleFullscreenIfNeeded() +void ToggleFullscreenOrChangeWindowScalingIfNeeded() { boolean change_fullscreen = (setup.fullscreen != video.fullscreen_enabled); boolean change_fullscreen_mode = (video.fullscreen_enabled && !strEqual(setup.fullscreen_mode, video.fullscreen_mode_current)); + boolean change_window_scaling_percent = (!video.fullscreen_enabled && + setup.window_scaling_percent != + video.window_scaling_percent); - if (!video.fullscreen_available) + if (change_window_scaling_percent && video.fullscreen_enabled) return; - if (change_fullscreen || change_fullscreen_mode) + if (!change_window_scaling_percent && !video.fullscreen_available) + return; + +#if defined(TARGET_SDL2) + if (change_window_scaling_percent) + { + SDLSetWindowScaling(setup.window_scaling_percent); + + return; + } + else if (change_fullscreen) + { + SDLSetWindowFullscreen(setup.fullscreen); + + /* set setup value according to successfully changed fullscreen mode */ + setup.fullscreen = video.fullscreen_enabled; + + return; + } +#endif + + if (change_fullscreen || + change_fullscreen_mode || + change_window_scaling_percent) { Bitmap *tmp_backbuffer = CreateBitmap(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH); @@ -9004,9 +9176,16 @@ void ToggleFullscreenIfNeeded() video.fullscreen_enabled = FALSE; /* force new fullscreen mode */ } + if (change_window_scaling_percent) + { + /* keep window mode, but change window scaling */ + video.fullscreen_enabled = TRUE; /* force new window scaling */ + } + /* toggle fullscreen */ ChangeVideoModeIfNeeded(setup.fullscreen); + /* set setup value according to successfully changed fullscreen mode */ setup.fullscreen = video.fullscreen_enabled; /* restore backbuffer content from temporary backbuffer backup bitmap */