X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Ftools.c;h=79cf0885135681310694fdc4dc562fd40dfa5cf0;hp=c1b367a600776bad7a9a9bd163ef8de58e6d74fb;hb=HEAD;hpb=7b969bbc735e5a6754610952d1f815c5d3886611 diff --git a/src/tools.c b/src/tools.c index c1b367a6..4083e77e 100644 --- a/src/tools.c +++ b/src/tools.c @@ -646,9 +646,11 @@ void DrawMaskedBorderToTarget(int draw_target) } } -void DrawTileCursor(int draw_target) +void DrawTileCursor(int draw_target, int drawing_stage) { - DrawTileCursor_MM(draw_target, game_status == GAME_MODE_PLAYING); + int tile_cursor_active = (game_status == GAME_MODE_PLAYING); + + DrawTileCursor_MM(draw_target, drawing_stage, tile_cursor_active); } void BlitScreenToBitmapExt_RND(Bitmap *target_bitmap, int fx, int fy) @@ -1515,6 +1517,11 @@ void SetRandomAnimationValue(int x, int y) gfx.anim_random_frame = GfxRandom[x][y]; } +void SetAnimationFirstLevel(int first_level) +{ + gfx.anim_first_level = first_level; +} + int getGraphicAnimationFrame(int graphic, int sync_frame) { // animation synchronized with global frame counter, not move position @@ -3054,6 +3061,8 @@ static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy, SDLFreeBitmapTextures(request.bitmap); SDLCreateBitmapTextures(request.bitmap); + ResetBitmapAlpha(request.bitmap); + // set envelope request run-time values request.sx = sx; request.sy = sy; @@ -3067,7 +3076,11 @@ void DrawEnvelopeRequestToScreen(int drawing_target) game.request_active && drawing_target == DRAW_TO_SCREEN) { - if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked) + struct GraphicInfo *g = &graphic_info[IMG_BACKGROUND_REQUEST]; + + SetBitmapAlphaNextBlit(request.bitmap, g->alpha); + + if (g->draw_masked) BlitToScreenMasked(request.bitmap, 0, 0, request.xsize, request.ysize, request.sx, request.sy); else @@ -3143,9 +3156,8 @@ static void setRequestPosition(int *x, int *y, boolean add_border_size) setRequestPositionExt(x, y, request.width, request.height, add_border_size); } -static void DrawEnvelopeRequest(char *text, unsigned int req_state) +static void DrawEnvelopeRequestText(int sx, int sy, char *text) { - DrawBuffer *drawto_last = drawto; char *text_final = text; char *text_door_style = NULL; int graphic = IMG_BACKGROUND_REQUEST; @@ -3162,15 +3174,11 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) int line_length = max_text_width / font_width; int max_lines = max_text_height / line_height; int text_width = line_length * font_width; - int width = request.width; - int height = request.height; - int tile_size = MAX(request.step_offset, 1); - int x_steps = width / tile_size; - int y_steps = height / tile_size; int sx_offset = border_size; int sy_offset = border_size; - int sx, sy; - int x, y; + + // force DOOR font inside door area + SetFontStatus(GAME_MODE_PSEUDO_DOOR); if (request.centered) sx_offset = (request.width - text_width) / 2; @@ -3179,6 +3187,13 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) { char *src_text_ptr, *dst_text_ptr; + if (maxWordLengthInRequestString(text) > line_length) + { + font_nr = FONT_REQUEST_NARROW; + font_width = getFontWidth(font_nr); + line_length = max_text_width / font_width; + } + text_door_style = checked_malloc(2 * strlen(text) + 1); src_text_ptr = text; @@ -3202,6 +3217,28 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) text_final = text_door_style; } + DrawTextBuffer(sx + sx_offset, sy + sy_offset, text_final, font_nr, + line_length, -1, max_lines, line_spacing, mask_mode, + request.autowrap, request.centered, FALSE); + + if (text_door_style) + free(text_door_style); + + ResetFontStatus(); +} + +static void DrawEnvelopeRequest(char *text, unsigned int req_state) +{ + DrawBuffer *drawto_last = drawto; + int graphic = IMG_BACKGROUND_REQUEST; + int width = request.width; + int height = request.height; + int tile_size = MAX(request.step_offset, 1); + int x_steps = width / tile_size; + int y_steps = height / tile_size; + int sx, sy; + int x, y; + setRequestPosition(&sx, &sy, FALSE); // draw complete envelope request to temporary bitmap @@ -3215,14 +3252,8 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) x, y, x_steps, y_steps, tile_size, tile_size); - // force DOOR font inside door area - SetFontStatus(GAME_MODE_PSEUDO_DOOR); - - DrawTextBuffer(sx + sx_offset, sy + sy_offset, text_final, font_nr, - line_length, -1, max_lines, line_spacing, mask_mode, - request.autowrap, request.centered, FALSE); - - ResetFontStatus(); + // write text for request + DrawEnvelopeRequestText(sx, sy, text); MapToolButtons(req_state); @@ -3231,9 +3262,6 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) // prepare complete envelope request from temporary bitmap PrepareEnvelopeRequestToScreen(bitmap_db_store_1, sx, sy, width, height); - - if (text_door_style) - free(text_door_style); } static void AnimateEnvelopeRequest(int anim_mode, int action) @@ -4475,10 +4503,6 @@ void WaitForEventToContinue(void) } } -#define MAX_REQUEST_LINES 13 -#define MAX_REQUEST_LINE_FONT1_LEN 7 -#define MAX_REQUEST_LINE_FONT2_LEN 10 - static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) { boolean game_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded()); @@ -4589,11 +4613,12 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) break; default: - // only check clickable animations if no request gadget clicked - HandleGlobalAnimClicks(mx, my, button_status, FALSE); break; } + // only needed to handle clickable pointer animations here + HandleGlobalAnimClicks(mx, my, button_status, FALSE); + break; } @@ -4793,6 +4818,12 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) static void DoRequestBefore(void) { + boolean game_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded()); + + // when showing request dialog after game ended, deactivate game panel + if (game_ended) + game.panel.active = FALSE; + if (game_status == GAME_MODE_PLAYING) BlitScreenToBitmap(backbuffer); @@ -4840,23 +4871,54 @@ static void DoRequestAfter(void) TapeDeactivateDisplayOn(); } +static void setRequestDoorTextProperties(char *text, + int text_spacing, + int line_spacing, + int *set_font_nr, + int *set_max_lines, + int *set_max_line_length) +{ + struct RectWithBorder *vp_door_1 = &viewport.door_1[game_status]; + struct TextPosInfo *pos = &request.button.confirm; + int button_ypos = pos->y; + int font_nr = FONT_TEXT_2; + int font_width = getFontWidth(font_nr); + int font_height = getFontHeight(font_nr); + int line_height = font_height + line_spacing; + int max_text_width = vp_door_1->width; + int max_text_height = button_ypos - 2 * text_spacing; + int max_line_length = max_text_width / font_width; + int max_lines = max_text_height / line_height; + + if (maxWordLengthInRequestString(text) > max_line_length) + { + font_nr = FONT_TEXT_1; + font_width = getFontWidth(font_nr); + max_line_length = max_text_width / font_width; + } + + *set_font_nr = font_nr; + *set_max_lines = max_lines; + *set_max_line_length = max_line_length; +} + static void DrawRequestDoorText(char *text) { char *text_ptr = text; - int max_request_line_len = MAX_REQUEST_LINE_FONT1_LEN; - int font_nr = FONT_TEXT_2; + int text_spacing = 8; + int line_spacing = 2; + int max_request_lines; + int max_request_line_len; + int font_nr; int ty; // force DOOR font inside door area SetFontStatus(GAME_MODE_PSEUDO_DOOR); - if (maxWordLengthInRequestString(text) > MAX_REQUEST_LINE_FONT1_LEN) - { - max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN; - font_nr = FONT_TEXT_1; - } + setRequestDoorTextProperties(text, text_spacing, line_spacing, &font_nr, + &max_request_lines, &max_request_line_len); - for (text_ptr = text, ty = 0; ty < MAX_REQUEST_LINES; ty++) + for (text_ptr = text, ty = 0; ty < max_request_lines; ty++) { char text_line[max_request_line_len + 1]; int tx, tl, tc = 0; @@ -4885,7 +4947,7 @@ static void DrawRequestDoorText(char *text) text_line[tl] = 0; DrawText(DX + (DXSIZE - tl * getFontWidth(font_nr)) / 2, - DY + 8 + ty * (getFontHeight(font_nr) + 2), + DY + text_spacing + ty * (getFontHeight(font_nr) + line_spacing), text_line, font_nr); text_ptr += tl + (tc == ' ' ? 1 : 0); @@ -4896,12 +4958,10 @@ static void DrawRequestDoorText(char *text) static int RequestDoor(char *text, unsigned int req_state) { - int draw_buffer_last = GetDrawtoField(); unsigned int old_door_state = GetDoorState(); + int draw_buffer_last = GetDrawtoField(); int result; - DoRequestBefore(); - if (old_door_state & DOOR_OPEN_1) { CloseDoor(DOOR_CLOSE_1); @@ -4941,8 +5001,6 @@ static int RequestDoor(char *text, unsigned int req_state) OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK); } - DoRequestAfter(); - return result; } @@ -4951,8 +5009,6 @@ static int RequestEnvelope(char *text, unsigned int req_state) int draw_buffer_last = GetDrawtoField(); int result; - DoRequestBefore(); - DrawEnvelopeRequest(text, req_state); ShowEnvelopeRequest(text, req_state, ACTION_OPENING); @@ -4963,30 +5019,27 @@ static int RequestEnvelope(char *text, unsigned int req_state) ShowEnvelopeRequest(text, req_state, ACTION_CLOSING); - DoRequestAfter(); - return result; } int Request(char *text, unsigned int req_state) { - boolean game_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded()); boolean overlay_enabled = GetOverlayEnabled(); int result; - // when showing request dialog after game ended, deactivate game panel - if (game_ended) - game.panel.active = FALSE; - game.request_active = TRUE; SetOverlayEnabled(FALSE); + DoRequestBefore(); + if (global.use_envelope_request) result = RequestEnvelope(text, req_state); else result = RequestDoor(text, req_state); + DoRequestAfter(); + SetOverlayEnabled(overlay_enabled); game.request_active = FALSE;