X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=c730e8510e89648d87e5540d2b466c319c857d11;hb=2f2136af253708ed24acbf57150d7c74fab95a9c;hp=accded22545e5bb8e1eba390403e551a2c87b4c4;hpb=2276a40b6ceb93c0e54317a6f3aa85c09e535f68;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index accded22..c730e851 100644 --- a/src/tools.c +++ b/src/tools.c @@ -175,6 +175,7 @@ static struct XY xy_topdown[] = // forward declaration for internal use +static void MapToolButtons(unsigned int); static void UnmapToolButtons(void); static void HandleToolButtons(struct GadgetInfo *); static int el_act_dir2crm(int, int, int); @@ -3063,7 +3064,7 @@ static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy, void DrawEnvelopeRequestToScreen(int drawing_target) { if (global.use_envelope_request && - game.request_active_or_moving && + game.request_active && drawing_target == DRAW_TO_SCREEN) { if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked) @@ -3203,8 +3204,8 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) setRequestPosition(&sx, &sy, FALSE); - // draw envelope request to temporary bitmap - drawto = bitmap_db_store_2; + // draw complete envelope request to temporary bitmap + drawto = bitmap_db_store_1; ClearRectangle(drawto, sx, sy, width, height); @@ -3223,30 +3224,13 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) ResetFontStatus(); - 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]); - } + MapToolButtons(req_state); // 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); @@ -3254,6 +3238,7 @@ static void DrawEnvelopeRequest(char *text, unsigned int req_state) static void AnimateEnvelopeRequest(int anim_mode, int action) { + boolean game_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); @@ -3302,6 +3287,9 @@ static void AnimateEnvelopeRequest(int anim_mode, int action) int dst_x, dst_y; int xx, yy; + if (game_ended) + HandleGameActions(); + setRequestPosition(&src_x, &src_y, FALSE); setRequestPositionExt(&dst_x, &dst_y, width, height, FALSE); @@ -3316,12 +3304,14 @@ static void AnimateEnvelopeRequest(int anim_mode, int action) int xx_size = (xx ? tile_size : xsize_size_left); int yy_size = (yy ? tile_size : ysize_size_top); - BlitBitmap(bitmap_db_store_2, bitmap_db_store_1, + // 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(bitmap_db_store_1, dst_x, dst_y, + // prepare partial (animated) envelope request from temporary bitmap + PrepareEnvelopeRequestToScreen(bitmap_db_store_2, dst_x, dst_y, width, height); redraw_mask |= REDRAW_FIELD; @@ -3349,8 +3339,6 @@ static void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) if (action == ACTION_OPENING) { - DrawEnvelopeRequest(text, req_state); - PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE); if (anim_mode == ANIM_DEFAULT) @@ -4493,20 +4481,13 @@ void WaitForEventToContinue(void) static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) { - boolean game_just_ended = (game_status == GAME_MODE_PLAYING && - checkGameEnded()); + boolean game_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded()); int draw_buffer_last = GetDrawtoField(); int width = request.width; int height = request.height; 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; @@ -4516,7 +4497,7 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) while (result < 0) { - if (game_just_ended) + if (game_ended) { SetDrawtoField(draw_buffer_game); @@ -4563,7 +4544,7 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) if (global.use_envelope_request) { // draw changed button states to temporary bitmap - drawto = bitmap_db_store_2; + drawto = bitmap_db_store_1; } // this sets 'request_gadget_id' @@ -4571,10 +4552,12 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) if (global.use_envelope_request) { - PrepareEnvelopeRequestToScreen(drawto, sx, sy, width, height); - // 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) @@ -4805,27 +4788,11 @@ static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game) SetDrawtoField(draw_buffer_last); - game.request_active = FALSE; - return result; } -static boolean RequestDoor(char *text, unsigned int req_state) +static void DoRequestBefore(unsigned int req_state) { - int draw_buffer_last = GetDrawtoField(); - unsigned int old_door_state; - int max_request_line_len = MAX_REQUEST_LINE_FONT1_LEN; - int font_nr = FONT_TEXT_2; - char *text_ptr; - int result; - int ty; - - if (maxWordLengthInRequestString(text) > MAX_REQUEST_LINE_FONT1_LEN) - { - max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN; - font_nr = FONT_TEXT_1; - } - if (game_status == GAME_MODE_PLAYING) BlitScreenToBitmap(backbuffer); @@ -4842,13 +4809,56 @@ static boolean RequestDoor(char *text, unsigned int req_state) req_state & REQUEST_WAIT_FOR_INPUT) SendToServer_PausePlaying(); - old_door_state = GetDoorState(); - // simulate releasing mouse button over last gadget, if still pressed if (button_status) HandleGadgets(-1, -1, 0); UnmapAllGadgets(); +} + +static void DoRequestAfter(unsigned int req_state) +{ + RemapAllGadgets(); + + if (game_status == GAME_MODE_PLAYING) + { + SetPanelBackground(); + SetDrawBackgroundMask(REDRAW_DOOR_1); + } + else + { + SetDrawBackgroundMask(REDRAW_FIELD); + } + + // continue network game after request + if (network.enabled && + game_status == GAME_MODE_PLAYING && + !game.all_players_gone && + req_state & REQUEST_WAIT_FOR_INPUT) + SendToServer_ContinuePlaying(); + + // restore deactivated drawing when quick-loading level tape recording + if (tape.playing && tape.deactivate_display) + TapeDeactivateDisplayOn(); +} + +static boolean RequestDoor(char *text, unsigned int req_state) +{ + int draw_buffer_last = GetDrawtoField(); + unsigned int old_door_state = GetDoorState(); + int max_request_line_len = MAX_REQUEST_LINE_FONT1_LEN; + int font_nr = FONT_TEXT_2; + char *text_ptr; + int result; + int ty; + + if (maxWordLengthInRequestString(text) > MAX_REQUEST_LINE_FONT1_LEN) + { + max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN; + font_nr = FONT_TEXT_1; + } + + DoRequestBefore(req_state); // draw released gadget before proceeding // BackToFront(); @@ -4911,25 +4921,7 @@ static boolean RequestDoor(char *text, unsigned int req_state) ResetFontStatus(); - 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]); - } + MapToolButtons(req_state); // copy request gadgets to door backbuffer BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0); @@ -4967,28 +4959,7 @@ static boolean RequestDoor(char *text, unsigned int req_state) OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK); } - RemapAllGadgets(); - - if (game_status == GAME_MODE_PLAYING) - { - SetPanelBackground(); - SetDrawBackgroundMask(REDRAW_DOOR_1); - } - else - { - SetDrawBackgroundMask(REDRAW_FIELD); - } - - // continue network game after request - if (network.enabled && - game_status == GAME_MODE_PLAYING && - !game.all_players_gone && - req_state & REQUEST_WAIT_FOR_INPUT) - SendToServer_ContinuePlaying(); - - // restore deactivated drawing when quick-loading level tape recording - if (tape.playing && tape.deactivate_display) - TapeDeactivateDisplayOn(); + DoRequestAfter(req_state); return result; } @@ -4998,35 +4969,9 @@ static boolean RequestEnvelope(char *text, unsigned int req_state) int draw_buffer_last = GetDrawtoField(); int result; - if (game_status == GAME_MODE_PLAYING) - BlitScreenToBitmap(backbuffer); - - // disable deactivated drawing when quick-loading level tape recording - if (tape.playing && tape.deactivate_display) - TapeDeactivateDisplayOff(TRUE); - - SetMouseCursor(CURSOR_DEFAULT); - - // pause network game while waiting for request to answer - if (network.enabled && - game_status == GAME_MODE_PLAYING && - !game.all_players_gone && - req_state & REQUEST_WAIT_FOR_INPUT) - SendToServer_PausePlaying(); - - // simulate releasing mouse button over last gadget, if still pressed - if (button_status) - HandleGadgets(-1, -1, 0); - - UnmapAllGadgets(); - - // (replace with setting corresponding request background) - // SetDoorBackgroundImage(IMG_BACKGROUND_DOOR); - // SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1); - - // clear door drawing field - // DrawBackground(DX, DY, DXSIZE, DYSIZE); + DoRequestBefore(req_state); + DrawEnvelopeRequest(text, req_state); ShowEnvelopeRequest(text, req_state, ACTION_OPENING); if (!(req_state & REQUEST_WAIT_FOR_INPUT)) @@ -5053,38 +4998,22 @@ static boolean RequestEnvelope(char *text, unsigned int req_state) ShowEnvelopeRequest(text, req_state, ACTION_CLOSING); - RemapAllGadgets(); - - if (game_status == GAME_MODE_PLAYING) - { - SetPanelBackground(); - SetDrawBackgroundMask(REDRAW_DOOR_1); - } - else - { - SetDrawBackgroundMask(REDRAW_FIELD); - } - - // continue network game after request - if (network.enabled && - game_status == GAME_MODE_PLAYING && - !game.all_players_gone && - req_state & REQUEST_WAIT_FOR_INPUT) - SendToServer_ContinuePlaying(); - - // restore deactivated drawing when quick-loading level tape recording - if (tape.playing && tape.deactivate_display) - TapeDeactivateDisplayOn(); + DoRequestAfter(req_state); return result; } boolean Request(char *text, unsigned int req_state) { + boolean game_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_ended) + game.panel.active = FALSE; + + game.request_active = TRUE; SetOverlayEnabled(FALSE); @@ -5095,7 +5024,7 @@ boolean Request(char *text, unsigned int req_state) SetOverlayEnabled(overlay_enabled); - game.request_active_or_moving = FALSE; + game.request_active = FALSE; return result; } @@ -5399,6 +5328,7 @@ unsigned int MoveDoor(unsigned int door_state) if (door_state & DOOR_ACTION) { + boolean game_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]; @@ -5665,6 +5595,9 @@ unsigned int MoveDoor(unsigned int door_state) if (!(door_state & DOOR_NO_DELAY)) { + if (game_ended) + HandleGameActions(); + BackToFront(); SkipUntilDelayReached(&door_delay, &k, last_frame); @@ -5688,7 +5621,12 @@ unsigned int MoveDoor(unsigned int door_state) door_delay.value = door_2.post_delay; while (!DelayReached(&door_delay)) + { + if (game_ended) + HandleGameActions(); + BackToFront(); + } } } @@ -5951,6 +5889,29 @@ void FreeToolButtons(void) FreeGadget(tool_gadget[i]); } +static void MapToolButtons(unsigned int req_state) +{ + 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]); + } +} + static void UnmapToolButtons(void) { int i;