X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=87478255cfe81a26d71ce89f7c9ea41906b22041;hb=e82d8640dfa77aa8fc3cee9d4385dd9419d1bb51;hp=3c301a3912f9b03461885a1102dfafe0807dee71;hpb=c9308ba3e7ddea2d7e44b4d98f0dfbb19e18f04f;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index 3c301a39..87478255 100644 --- a/src/tools.c +++ b/src/tools.c @@ -360,30 +360,26 @@ static int getLevelFromScreenY_SP(int sy) static int getLevelFromScreenX_MM(int sx) { -#if 0 int level_xsize = level.native_mm_level->fieldx; int full_xsize = level_xsize * TILESIZE_VAR; sx -= (full_xsize < SXSIZE ? (SXSIZE - full_xsize) / 2 : 0); -#endif int px = sx - SX; - int lx = px / TILESIZE_VAR; + int lx = (px + TILESIZE_VAR) / TILESIZE_VAR - 1; return lx; } static int getLevelFromScreenY_MM(int sy) { -#if 0 int level_ysize = level.native_mm_level->fieldy; int full_ysize = level_ysize * TILESIZE_VAR; sy -= (full_ysize < SYSIZE ? (SYSIZE - full_ysize) / 2 : 0); -#endif int py = sy - SY; - int ly = py / TILESIZE_VAR; + int ly = (py + TILESIZE_VAR) / TILESIZE_VAR - 1; return ly; } @@ -654,10 +650,9 @@ void DrawTileCursor(int draw_target) !tile_cursor.active) return; - if (tile_cursor.x != tile_cursor.target_x || - tile_cursor.y != tile_cursor.target_y) + if (tile_cursor.moving) { - int step = TILESIZE_VAR / (GADGET_FRAME_DELAY / video.frame_delay_value); + int step = TILESIZE_VAR / 4; int dx = tile_cursor.target_x - tile_cursor.x; int dy = tile_cursor.target_y - tile_cursor.y; @@ -670,6 +665,10 @@ void DrawTileCursor(int draw_target) 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; @@ -1266,6 +1265,8 @@ static int dx_last = -1, dy_last = -1; static int dxsize_last = -1, dysize_last = -1; static int vx_last = -1, vy_last = -1; static int vxsize_last = -1, vysize_last = -1; +static int ex_last = -1, ey_last = -1; +static int exsize_last = -1, eysize_last = -1; boolean CheckIfGlobalBorderHasChanged() { @@ -1308,6 +1309,11 @@ boolean CheckIfGlobalBorderRedrawIsNeeded() vxsize_last != VXSIZE || vysize_last != VYSIZE) return TRUE; + // redraw if position or size of editor area has changed + if (ex_last != EX || ey_last != EY || + exsize_last != EXSIZE || eysize_last != EYSIZE) + return TRUE; + return FALSE; } @@ -1328,20 +1334,29 @@ void RedrawGlobalBorder() redraw_mask = REDRAW_ALL; } +#define ONLY_REDRAW_GLOBAL_BORDER_IF_NEEDED 0 + static void RedrawGlobalBorderIfNeeded() { +#if ONLY_REDRAW_GLOBAL_BORDER_IF_NEEDED if (game_status == game_status_last) return; +#endif // copy current draw buffer to later copy back areas that have not changed if (game_status_last != GAME_MODE_TITLE) BlitBitmap(backbuffer, bitmap_db_store_1, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0); +#if ONLY_REDRAW_GLOBAL_BORDER_IF_NEEDED if (CheckIfGlobalBorderRedrawIsNeeded()) +#endif { // redraw global screen border (or clear, if defined to be empty) RedrawGlobalBorderFromBitmap(global_border_bitmap); + if (game_status == GAME_MODE_EDITOR) + DrawSpecialEditorDoor(); + // copy previous playfield and door areas, if they are defined on both // previous and current screen and if they still have the same size @@ -1358,11 +1373,22 @@ static void RedrawGlobalBorderIfNeeded() BlitBitmap(bitmap_db_store_1, backbuffer, dx_last, dy_last, DXSIZE, DYSIZE, DX, DY); - if (vx_last != -1 && vy_last != -1 && - VX != -1 && VY != -1 && - vxsize_last == VXSIZE && vysize_last == VYSIZE) - BlitBitmap(bitmap_db_store_1, backbuffer, - vx_last, vy_last, VXSIZE, VYSIZE, VX, VY); + if (game_status != GAME_MODE_EDITOR) + { + if (vx_last != -1 && vy_last != -1 && + VX != -1 && VY != -1 && + vxsize_last == VXSIZE && vysize_last == VYSIZE) + BlitBitmap(bitmap_db_store_1, backbuffer, + vx_last, vy_last, VXSIZE, VYSIZE, VX, VY); + } + else + { + if (ex_last != -1 && ey_last != -1 && + EX != -1 && EY != -1 && + exsize_last == EXSIZE && eysize_last == EYSIZE) + BlitBitmap(bitmap_db_store_1, backbuffer, + ex_last, ey_last, EXSIZE, EYSIZE, EX, EY); + } redraw_mask = REDRAW_ALL; } @@ -1383,6 +1409,10 @@ static void RedrawGlobalBorderIfNeeded() vy_last = VY; vxsize_last = VXSIZE; vysize_last = VYSIZE; + ex_last = EX; + ey_last = EY; + exsize_last = EXSIZE; + eysize_last = EYSIZE; } void ClearField() @@ -4151,6 +4181,8 @@ static int RequestHandleEvents(unsigned int req_state) break; case KSYM_Return: + case KSYM_y: + case KSYM_Y: #if defined(TARGET_SDL2) case KSYM_Select: case KSYM_Menu: @@ -4162,6 +4194,8 @@ static int RequestHandleEvents(unsigned int req_state) break; case KSYM_Escape: + case KSYM_n: + case KSYM_N: #if defined(TARGET_SDL2) case KSYM_Back: #if defined(KSYM_FastForward) @@ -8744,6 +8778,23 @@ void CheckSaveEngineSnapshot_SP(boolean murphy_is_waiting, } } +void CheckSaveEngineSnapshot_MM(boolean element_clicked, + boolean button_released) +{ + if (button_released) + { + if (game.snapshot.mode == SNAPSHOT_MODE_EVERY_MOVE) + CheckSaveEngineSnapshotToList(); + } + else if (element_clicked) + { + if (game.snapshot.mode != SNAPSHOT_MODE_EVERY_MOVE) + CheckSaveEngineSnapshotToList(); + + game.snapshot.changed_action = TRUE; + } +} + void CheckSingleStepMode_EM(byte action[MAX_PLAYERS], int frame, boolean any_player_moving, boolean any_player_snapping, @@ -8774,6 +8825,16 @@ void CheckSingleStepMode_SP(boolean murphy_is_waiting, CheckSaveEngineSnapshot_SP(murphy_is_waiting, murphy_is_dropping); } +void CheckSingleStepMode_MM(boolean element_clicked, + boolean button_released) +{ + if (tape.single_step && tape.recording && !tape.pausing) + if (button_released) + TapeTogglePause(TAPE_TOGGLE_AUTOMATIC); + + CheckSaveEngineSnapshot_MM(element_clicked, button_released); +} + void getGraphicSource_SP(struct GraphicInfo_SP *g_sp, int graphic, int sync_frame, int x, int y) {