X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=7eb432119ef905c6acbbb24f8e78c0a8474034cd;hb=fa1cf5ef4a93a5e1202a4a4af019af2477708906;hp=a6a08d72aaaccce1b8dcc035c76d287af54d81d8;hpb=8f8fae700807f82bb4cb322d38215d99b1e3b483;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index a6a08d72..7eb43211 100644 --- a/src/tools.c +++ b/src/tools.c @@ -462,6 +462,11 @@ void SetDrawtoField(int mode) } } +int GetDrawtoField(void) +{ + return (drawto_field == fieldbuffer ? DRAW_TO_FIELDBUFFER : DRAW_TO_BACKBUFFER); +} + static void RedrawPlayfield_RND(void) { if (game.envelope_active) @@ -616,60 +621,7 @@ void DrawMaskedBorderToTarget(int draw_target) void DrawTileCursor(int draw_target) { - Bitmap *fade_bitmap; - Bitmap *src_bitmap; - int src_x, src_y; - int dst_x, dst_y; - int graphic = IMG_GLOBAL_TILE_CURSOR; - int frame = 0; - int tilesize = TILESIZE_VAR; - int width = tilesize; - int height = tilesize; - - if (game_status != GAME_MODE_PLAYING) - return; - - if (!tile_cursor.enabled || - !tile_cursor.active) - return; - - if (tile_cursor.moving) - { - int step = TILESIZE_VAR / 4; - int dx = tile_cursor.target_x - tile_cursor.x; - int dy = tile_cursor.target_y - tile_cursor.y; - - if (ABS(dx) < step) - tile_cursor.x = tile_cursor.target_x; - else - tile_cursor.x += SIGN(dx) * step; - - if (ABS(dy) < step) - tile_cursor.y = tile_cursor.target_y; - else - tile_cursor.y += SIGN(dy) * step; - - if (tile_cursor.x == tile_cursor.target_x && - tile_cursor.y == tile_cursor.target_y) - tile_cursor.moving = FALSE; - } - - dst_x = tile_cursor.x; - dst_y = tile_cursor.y; - - frame = getGraphicAnimationFrame(graphic, -1); - - getSizedGraphicSource(graphic, frame, tilesize, &src_bitmap, &src_x, &src_y); - - fade_bitmap = - (draw_target == DRAW_TO_FADE_SOURCE ? gfx.fade_bitmap_source : - draw_target == DRAW_TO_FADE_TARGET ? gfx.fade_bitmap_target : NULL); - - if (draw_target == DRAW_TO_SCREEN) - BlitToScreenMasked(src_bitmap, src_x, src_y, width, height, dst_x, dst_y); - else - BlitBitmapMasked(src_bitmap, fade_bitmap, src_x, src_y, width, height, - dst_x, dst_y); + DrawTileCursor_MM(draw_target, game_status == GAME_MODE_PLAYING); } void BlitScreenToBitmapExt_RND(Bitmap *target_bitmap, int fx, int fy) @@ -2820,9 +2772,13 @@ void ShowEnvelope(int envelope_nr) int anim_mode = graphic_info[graphic].anim_mode; int main_anim_mode = (anim_mode == ANIM_NONE ? ANIM_VERTICAL|ANIM_HORIZONTAL: anim_mode == ANIM_DEFAULT ? ANIM_VERTICAL : anim_mode); + boolean overlay_enabled = GetOverlayEnabled(); game.envelope_active = TRUE; // needed for RedrawPlayfield() events + SetOverlayEnabled(FALSE); + UnmapAllGadgets(); + PlayMenuSoundStereo(sound_opening, SOUND_MIDDLE); if (anim_mode == ANIM_DEFAULT) @@ -2835,6 +2791,9 @@ void ShowEnvelope(int envelope_nr) else WaitForEventToContinue(); + RemapAllGadgets(); + SetOverlayEnabled(overlay_enabled); + PlayMenuSoundStereo(sound_closing, SOUND_MIDDLE); if (anim_mode != ANIM_NONE) @@ -4196,6 +4155,7 @@ void DrawPlayerField(int x, int y) void WaitForEventToContinue(void) { + boolean first_wait = TRUE; boolean still_wait = TRUE; if (program.headless) @@ -4218,7 +4178,16 @@ void WaitForEventToContinue(void) { switch (event.type) { - case EVENT_BUTTONRELEASE: + case EVENT_BUTTONPRESS: + case EVENT_FINGERPRESS: + first_wait = FALSE; + break; + + case EVENT_BUTTONRELEASE: + case EVENT_FINGERRELEASE: + still_wait = first_wait; + break; + case EVENT_KEYPRESS: case SDL_CONTROLLERBUTTONDOWN: case SDL_JOYBUTTONDOWN: @@ -4235,7 +4204,8 @@ void WaitForEventToContinue(void) still_wait = FALSE; } - BackToFront(); + if (!PendingEvent()) + BackToFront(); } } @@ -4247,6 +4217,7 @@ static int RequestHandleEvents(unsigned int req_state) { boolean game_just_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded()); + int draw_buffer_last = GetDrawtoField(); int width = request.width; int height = request.height; int sx, sy; @@ -4267,11 +4238,11 @@ static int RequestHandleEvents(unsigned int req_state) while (result < 0) { + boolean event_handled = FALSE; + if (game_just_ended) { - // the MM game engine does not use a special (scrollable) field buffer - if (level.game_engine_type != GAME_ENGINE_TYPE_MM) - SetDrawtoField(DRAW_TO_FIELDBUFFER); + SetDrawtoField(draw_buffer_last); HandleGameActions(); @@ -4290,6 +4261,8 @@ static int RequestHandleEvents(unsigned int req_state) while (NextValidEvent(&event)) { + event_handled = TRUE; + switch (event.type) { case EVENT_BUTTONPRESS: @@ -4544,18 +4517,23 @@ static int RequestHandleEvents(unsigned int req_state) } } - if (game_just_ended) + if (event_handled) { - if (global.use_envelope_request) + if (game_just_ended) { - // copy back current state of pressed buttons inside request area - BlitBitmap(drawto, bitmap_db_store_2, sx, sy, width, height, sx, sy); + 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); + } } } BackToFront(); } + SetDrawtoField(draw_buffer_last); + game.request_active = FALSE; return result; @@ -4833,6 +4811,8 @@ boolean Request(char *text, unsigned int req_state) boolean overlay_enabled = GetOverlayEnabled(); boolean result; + game.request_active_or_moving = TRUE; + SetOverlayEnabled(FALSE); if (global.use_envelope_request) @@ -4842,6 +4822,8 @@ boolean Request(char *text, unsigned int req_state) SetOverlayEnabled(overlay_enabled); + game.request_active_or_moving = FALSE; + return result; } @@ -5864,6 +5846,39 @@ em_object_mapping_list[GAME_TILE_MAX + 1] = EL_EMC_FAKE_ACID, -1, -1 }, + { + Xfake_acid_1_player, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 + }, + { + Xfake_acid_2_player, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 + }, + { + Xfake_acid_3_player, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 + }, + { + Xfake_acid_4_player, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 + }, + { + Xfake_acid_5_player, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 + }, + { + Xfake_acid_6_player, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 + }, + { + Xfake_acid_7_player, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 + }, + { + Xfake_acid_8_player, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 + }, + { Xgrass, TRUE, FALSE, EL_EMC_GRASS, -1, -1 @@ -8756,6 +8771,14 @@ void InitGraphicInfo_EM(void) i == Xfake_acid_6 ? 50 : i == Xfake_acid_7 ? 60 : i == Xfake_acid_8 ? 70 : + i == Xfake_acid_1_player ? 0 : + i == Xfake_acid_2_player ? 10 : + i == Xfake_acid_3_player ? 20 : + i == Xfake_acid_4_player ? 30 : + i == Xfake_acid_5_player ? 40 : + i == Xfake_acid_6_player ? 50 : + i == Xfake_acid_7_player ? 60 : + i == Xfake_acid_8_player ? 70 : i == Xball_2 ? 7 : i == Yball_2 ? j + 8 : i == Yball_blank ? j + 1 : @@ -9085,7 +9108,7 @@ boolean CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame, boolean any_player_dropping) { if (tape.single_step && tape.recording && !tape.pausing) - if (frame == 7 && !any_player_dropping) + if (frame == 7 && !any_player_dropping && FrameCounter > 6) TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); CheckSaveEngineSnapshot_EM(action, frame, any_player_moving, @@ -9345,6 +9368,8 @@ void SetAnimStatus(int anim_status_new) { if (anim_status_new == GAME_MODE_MAIN) anim_status_new = GAME_MODE_PSEUDO_MAINONLY; + else if (anim_status_new == GAME_MODE_NAMES) + anim_status_new = GAME_MODE_PSEUDO_NAMESONLY; else if (anim_status_new == GAME_MODE_SCORES) anim_status_new = GAME_MODE_PSEUDO_SCORESOLD; @@ -9354,7 +9379,11 @@ void SetAnimStatus(int anim_status_new) if ((global.anim_status == GAME_MODE_PSEUDO_MAINONLY && global.anim_status_next == GAME_MODE_PSEUDO_TYPENAME) || (global.anim_status == GAME_MODE_PSEUDO_TYPENAME && - global.anim_status_next == GAME_MODE_PSEUDO_MAINONLY)) + global.anim_status_next == GAME_MODE_PSEUDO_MAINONLY) || + (global.anim_status == GAME_MODE_PSEUDO_NAMESONLY && + global.anim_status_next == GAME_MODE_PSEUDO_TYPENAMES) || + (global.anim_status == GAME_MODE_PSEUDO_TYPENAMES && + global.anim_status_next == GAME_MODE_PSEUDO_NAMESONLY)) global.anim_status = global.anim_status_next; }