gfx.masked_border_bitmap_ptr = gfx.fade_bitmap_target;
}
+ // always use global border for PLAYING when restarting the game
+ if (global.border_status == GAME_MODE_PSEUDO_RESTARTING)
+ global.border_status = GAME_MODE_PLAYING;
+
DrawMaskedBorderExt(REDRAW_ALL, draw_target);
global.border_status = last_border_status;
static void SetScreenStates_AfterFadingOut(void)
{
global.border_status = game_status;
+
+ // always use global border for PLAYING when restarting the game
+ if (global.border_status == GAME_MODE_PSEUDO_RESTARTING)
+ global.border_status = GAME_MODE_PLAYING;
}
void FadeIn(int fade_mask)
static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy,
int xsize, int ysize)
{
- if (!global.use_envelope_request ||
- request.sort_priority <= 0)
+ if (!global.use_envelope_request)
return;
if (request.bitmap == NULL ||
BlitBitmap(bitmap, request.bitmap, sx, sy, xsize, ysize, 0, 0);
+ // create masked surface for request bitmap, if needed
+ if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked)
+ {
+ SDL_Surface *surface = request.bitmap->surface;
+ SDL_Surface *surface_masked = request.bitmap->surface_masked;
+
+ SDLBlitSurface(surface, surface_masked, 0, 0, xsize, ysize, 0, 0);
+ SDL_SetColorKey(surface_masked, SET_TRANSPARENT_PIXEL,
+ SDL_MapRGB(surface_masked->format, 0x00, 0x00, 0x00));
+ }
+
SDLFreeBitmapTextures(request.bitmap);
SDLCreateBitmapTextures(request.bitmap);
request.ysize = ysize;
}
-void DrawEnvelopeRequestToScreen(int drawing_target, int drawing_stage)
+void DrawEnvelopeRequestToScreen(int drawing_target)
{
if (global.use_envelope_request &&
- game.request_active_or_moving &&
- request.sort_priority > 0 &&
- drawing_target == DRAW_TO_SCREEN &&
- drawing_stage == DRAW_GLOBAL_ANIM_STAGE_2)
+ game.request_active &&
+ drawing_target == DRAW_TO_SCREEN)
{
- BlitToScreen(request.bitmap, 0, 0, request.xsize, request.ysize,
- request.sx, request.sy);
+ if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked)
+ BlitToScreenMasked(request.bitmap, 0, 0, request.xsize, request.ysize,
+ request.sx, request.sy);
+ else
+ BlitToScreen(request.bitmap, 0, 0, request.xsize, request.ysize,
+ request.sx, request.sy);
}
}
setRequestPositionExt(x, y, request.width, request.height, add_border_size);
}
-static void DrawEnvelopeRequest(char *text)
+static void DrawEnvelopeRequest(char *text, unsigned int req_state)
{
+ DrawBuffer *drawto_last = drawto;
char *text_final = text;
char *text_door_style = NULL;
int graphic = IMG_BACKGROUND_REQUEST;
int sx_offset = border_size;
int sy_offset = border_size;
int sx, sy;
- int i, x, y;
+ int x, y;
if (request.centered)
sx_offset = (request.width - text_width) / 2;
setRequestPosition(&sx, &sy, FALSE);
- ClearRectangle(backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE);
+ // draw complete envelope request to temporary bitmap
+ drawto = bitmap_db_store_1;
+
+ ClearRectangle(drawto, sx, sy, width, height);
for (y = 0; y < y_steps; y++)
for (x = 0; x < x_steps; x++)
ResetFontStatus();
- for (i = 0; i < NUM_TOOL_BUTTONS; i++)
- RedrawGadget(tool_gadget[i]);
+ if (req_state & REQ_ASK)
+ {
+ MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_NO]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_YES]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_NO]);
+ }
+ else if (req_state & REQ_CONFIRM)
+ {
+ MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_CONFIRM]);
+ }
+ else if (req_state & REQ_PLAYER)
+ {
+ MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]);
+ }
- // store readily prepared envelope request for later use when animating
- BlitBitmap(backbuffer, bitmap_db_store_2, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+ // restore pointer to drawing buffer
+ drawto = drawto_last;
- PrepareEnvelopeRequestToScreen(bitmap_db_store_2, sx, sy, width, height);
+ // 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)
{
- int graphic = IMG_BACKGROUND_REQUEST;
- boolean draw_masked = graphic_info[graphic].draw_masked;
+ boolean game_just_ended = (game_status == GAME_MODE_PLAYING &&
+ checkGameEnded());
int delay_value_normal = request.step_delay;
int delay_value_fast = delay_value_normal / 2;
boolean ffwd_delay = (tape.playing && tape.fast_forward);
int dst_x, dst_y;
int xx, yy;
+ if (game_just_ended)
+ HandleGameActions();
+
setRequestPosition(&src_x, &src_y, FALSE);
setRequestPositionExt(&dst_x, &dst_y, width, height, FALSE);
- BlitBitmap(bitmap_db_store_1, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
-
for (yy = 0; yy < 2; yy++)
{
for (xx = 0; xx < 2; xx++)
int xx_size = (xx ? tile_size : xsize_size_left);
int yy_size = (yy ? tile_size : ysize_size_top);
- if (draw_masked)
- BlitBitmapMasked(bitmap_db_store_2, backbuffer,
- src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy);
- else
- BlitBitmap(bitmap_db_store_2, backbuffer,
- src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy);
+ // draw partial (animated) envelope request to temporary bitmap
+ BlitBitmap(bitmap_db_store_1, bitmap_db_store_2,
+ src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy);
}
}
- PrepareEnvelopeRequestToScreen(backbuffer, dst_x, dst_y, width, height);
+ // prepare partial (animated) envelope request from temporary bitmap
+ PrepareEnvelopeRequestToScreen(bitmap_db_store_2, dst_x, dst_y,
+ width, height);
redraw_mask |= REDRAW_FIELD;
int main_anim_mode = (anim_mode == ANIM_NONE ? ANIM_VERTICAL|ANIM_HORIZONTAL:
anim_mode == ANIM_DEFAULT ? ANIM_VERTICAL : anim_mode);
- if (game_status == GAME_MODE_PLAYING)
- BlitScreenToBitmap(backbuffer);
-
- SetDrawtoField(DRAW_TO_BACKBUFFER);
-
- // SetDrawBackgroundMask(REDRAW_NONE);
-
- if (action == ACTION_OPENING)
- {
- BlitBitmap(backbuffer, bitmap_db_store_1, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
-
- if (req_state & REQ_ASK)
- {
- MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_NO]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_YES]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_NO]);
- }
- else if (req_state & REQ_CONFIRM)
- {
- MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_CONFIRM]);
- }
- else if (req_state & REQ_PLAYER)
- {
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]);
- }
-
- DrawEnvelopeRequest(text);
- }
-
game.envelope_active = TRUE; // needed for RedrawPlayfield() events
if (action == ACTION_OPENING)
{
+ DrawEnvelopeRequest(text, req_state);
+
PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE);
if (anim_mode == ANIM_DEFAULT)
}
game.envelope_active = FALSE;
-
- if (action == ACTION_CLOSING)
- BlitBitmap(bitmap_db_store_1, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
-
- // SetDrawBackgroundMask(last_draw_background_mask);
-
- redraw_mask |= REDRAW_FIELD;
-
- BackToFront();
-
- if (action == ACTION_CLOSING &&
- game_status == GAME_MODE_PLAYING &&
- level.game_engine_type == GAME_ENGINE_TYPE_RND)
- SetDrawtoField(DRAW_TO_FIELDBUFFER);
}
static void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize)
int sx, sy;
int result;
- // when showing request dialog after game ended, deactivate game panel
- if (game_just_ended)
- game.panel.active = FALSE;
-
- game.request_active = TRUE;
-
setRequestPosition(&sx, &sy, FALSE);
button_status = MB_RELEASED;
while (result < 0)
{
- boolean event_handled = FALSE;
-
if (game_just_ended)
{
SetDrawtoField(draw_buffer_game);
HandleGameActions();
SetDrawtoField(DRAW_TO_BACKBUFFER);
-
- if (global.use_envelope_request)
- {
- // copy current state of request area to middle of playfield area
- BlitBitmap(bitmap_db_store_2, drawto, sx, sy, width, height, sx, sy);
- }
}
if (PendingEvent())
while (NextValidEvent(&event))
{
- event_handled = TRUE;
-
switch (event.type)
{
case EVENT_BUTTONPRESS:
case EVENT_BUTTONRELEASE:
case EVENT_MOTIONNOTIFY:
{
+ DrawBuffer *drawto_last = drawto;
int mx, my;
if (event.type == EVENT_MOTIONNOTIFY)
button_status = MB_RELEASED;
}
+ if (global.use_envelope_request)
+ {
+ // draw changed button states to temporary bitmap
+ drawto = bitmap_db_store_1;
+ }
+
// this sets 'request_gadget_id'
HandleGadgets(mx, my, button_status);
+ if (global.use_envelope_request)
+ {
+ // restore pointer to drawing buffer
+ drawto = drawto_last;
+
+ // prepare complete envelope request from temporary bitmap
+ PrepareEnvelopeRequestToScreen(bitmap_db_store_1, sx, sy,
+ width, height);
+ }
+
switch (request_gadget_id)
{
case TOOL_CTRL_ID_YES:
}
}
- if (event_handled)
- {
- if (game_just_ended)
- {
- if (global.use_envelope_request)
- {
- // copy back current state of pressed buttons inside request area
- BlitBitmap(drawto, bitmap_db_store_2, sx, sy, width, height, sx, sy);
- }
- }
-
- PrepareEnvelopeRequestToScreen(drawto, sx, sy, width, height);
- }
-
BackToFront();
}
SetDrawtoField(draw_buffer_last);
- game.request_active = FALSE;
-
return result;
}
boolean Request(char *text, unsigned int req_state)
{
+ boolean game_just_ended = (game_status == GAME_MODE_PLAYING &&
+ checkGameEnded());
boolean overlay_enabled = GetOverlayEnabled();
boolean result;
- game.request_active_or_moving = TRUE;
+ // when showing request dialog after game ended, deactivate game panel
+ if (game_just_ended)
+ game.panel.active = FALSE;
+
+ game.request_active = TRUE;
SetOverlayEnabled(FALSE);
SetOverlayEnabled(overlay_enabled);
- game.request_active_or_moving = FALSE;
+ game.request_active = FALSE;
return result;
}
if (door_state & DOOR_ACTION)
{
+ boolean game_just_ended = (game_status == GAME_MODE_PLAYING &&
+ checkGameEnded());
boolean door_panel_drawn[NUM_DOORS];
boolean panel_has_doors[NUM_DOORS];
boolean door_part_skip[MAX_DOOR_PARTS];
if (!(door_state & DOOR_NO_DELAY))
{
+ if (game_just_ended)
+ HandleGameActions();
+
BackToFront();
SkipUntilDelayReached(&door_delay, &k, last_frame);
door_delay.value = door_2.post_delay;
while (!DelayReached(&door_delay))
+ {
+ if (game_just_ended)
+ HandleGameActions();
+
BackToFront();
+ }
}
}