}
}
-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)
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;
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;
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
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);
// 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)
}
}
-#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());
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);
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;
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);
ResetFontStatus();
}
-static boolean RequestDoor(char *text, unsigned int req_state)
+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);
OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
}
- DoRequestAfter();
-
return result;
}
-static boolean RequestEnvelope(char *text, unsigned int req_state)
+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);
ShowEnvelopeRequest(text, req_state, ACTION_CLOSING);
- DoRequestAfter();
-
return result;
}
-boolean Request(char *text, unsigned int req_state)
+int Request(char *text, unsigned int req_state)
{
- boolean game_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded());
boolean overlay_enabled = GetOverlayEnabled();
- boolean result;
-
- // when showing request dialog after game ended, deactivate game panel
- if (game_ended)
- game.panel.active = FALSE;
+ int result;
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;