void SetDrawtoField(int mode)
{
- if (mode == DRAW_BUFFERED && setup.soft_scrolling)
+ if (mode == DRAW_FIELDBUFFER)
{
FX = 2 * TILEX_VAR;
FY = 2 * TILEY_VAR;
BY1 = -2;
BX2 = SCR_FIELDX + 1;
BY2 = SCR_FIELDY + 1;
- redraw_x1 = 2;
- redraw_y1 = 2;
drawto_field = fieldbuffer;
}
BY1 = 0;
BX2 = SCR_FIELDX - 1;
BY2 = SCR_FIELDY - 1;
- redraw_x1 = 0;
- redraw_y1 = 0;
drawto_field = backbuffer;
}
void BackToFront()
{
- int x, y;
DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field);
- if (redraw_mask & REDRAW_TILES && redraw_tiles > REDRAWTILES_THRESHOLD)
- redraw_mask |= REDRAW_FIELD;
-
-#if 0
- // never redraw single tiles, always redraw the whole field
- // (redrawing single tiles up to a certain threshold was faster on old,
- // now legacy graphics, but slows things down on modern graphics now)
- // UPDATE: this is now globally defined by value of REDRAWTILES_THRESHOLD
- if (redraw_mask & REDRAW_TILES)
- redraw_mask |= REDRAW_FIELD;
-#endif
-
#if 0
/* !!! TEST ONLY !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* (force full redraw) */
redraw_mask |= REDRAW_FIELD;
#endif
- if (redraw_mask & REDRAW_FIELD)
- redraw_mask &= ~REDRAW_TILES;
-
if (redraw_mask == REDRAW_NONE)
return;
printf("[REDRAW_ALL]");
if (redraw_mask & REDRAW_FIELD)
printf("[REDRAW_FIELD]");
- if (redraw_mask & REDRAW_TILES)
- printf("[REDRAW_TILES]");
if (redraw_mask & REDRAW_DOOR_1)
printf("[REDRAW_DOOR_1]");
if (redraw_mask & REDRAW_DOOR_2)
printf(" [%d]\n", FrameCounter);
#endif
- if (redraw_mask & REDRAW_TILES &&
- game_status == GAME_MODE_PLAYING &&
- border.draw_masked[GAME_MODE_PLAYING])
- redraw_mask |= REDRAW_FIELD;
-
if (global.fps_slowdown && game_status == GAME_MODE_PLAYING)
{
static boolean last_frame_skipped = FALSE;
redraw_mask &= ~REDRAW_MICROLEVEL;
}
- if (redraw_mask & REDRAW_TILES)
- {
- int sx = SX;
- int sy = SY;
-
- int dx = 0, dy = 0;
- int dx_var = dx * TILESIZE_VAR / TILESIZE;
- int dy_var = dy * TILESIZE_VAR / TILESIZE;
- int ffx, ffy;
- int fx = FX, fy = FY;
-
- int scr_fieldx = SCR_FIELDX + (EVEN(SCR_FIELDX) ? 2 : 0);
- int scr_fieldy = SCR_FIELDY + (EVEN(SCR_FIELDY) ? 2 : 0);
-
- InitGfxClipRegion(TRUE, SX, SY, SXSIZE, SYSIZE);
-
- ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx_var;
- ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy_var;
-
- if (EVEN(SCR_FIELDX))
- {
- if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + TILEX_VAR)
- {
- fx += dx_var - MIN(ffx, TILEX_VAR / 2) + TILEX_VAR;
-
- if (fx % TILEX_VAR)
- sx -= TILEX_VAR / 2;
- else
- sx -= TILEX_VAR;
- }
- else
- {
- fx += (dx_var > 0 ? TILEX_VAR : 0);
- }
- }
-
- if (EVEN(SCR_FIELDY))
- {
- if (ffy < SBY_Lower * TILEY_VAR + TILEY_VAR / 2 + TILEY_VAR)
- {
- fy += dy_var - MIN(ffy, TILEY_VAR / 2) + TILEY_VAR;
-
- if (fy % TILEY_VAR)
- sy -= TILEY_VAR / 2;
- else
- sy -= TILEY_VAR;
- }
- else
- {
- fy += (dy_var > 0 ? TILEY_VAR : 0);
- }
- }
-
- for (x = 0; x < scr_fieldx; x++)
- for (y = 0 ; y < scr_fieldy; y++)
- if (redraw[redraw_x1 + x][redraw_y1 + y])
- BlitBitmap(buffer, window,
- FX + x * TILEX_VAR, FY + y * TILEY_VAR,
- TILEX_VAR, TILEY_VAR,
- sx + x * TILEX_VAR, sy + y * TILEY_VAR);
-
- InitGfxClipRegion(FALSE, -1, -1, -1, -1);
- }
-
if (redraw_mask & REDRAW_FPS) /* display frames per second */
{
char text[100];
DrawTextExt(window, SX + SXSIZE + SX, 0, text, FONT_TEXT_2, BLIT_OPAQUE);
}
- for (x = 0; x < MAX_BUF_XSIZE; x++)
- for (y = 0; y < MAX_BUF_YSIZE; y++)
- redraw[x][y] = 0;
- redraw_tiles = 0;
redraw_mask = REDRAW_NONE;
}
DrawBackground(REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
/* !!! maybe this should be done before clearing the background !!! */
- if (setup.soft_scrolling && game_status == GAME_MODE_PLAYING)
+ if (game_status == GAME_MODE_PLAYING)
{
ClearRectangle(fieldbuffer, 0, 0, FXSIZE, FYSIZE);
- SetDrawtoField(DRAW_BUFFERED);
+ SetDrawtoField(DRAW_FIELDBUFFER);
}
else
SetDrawtoField(DRAW_BACKBUFFER);
void MarkTileDirty(int x, int y)
{
- int xx = redraw_x1 + x;
- int yy = redraw_y1 + y;
-
- if (!redraw[xx][yy])
- redraw_tiles++;
-
- redraw[xx][yy] = TRUE;
- redraw_mask |= REDRAW_TILES;
+ redraw_mask |= REDRAW_FIELD;
}
void SetBorderElement()
int sy = SY + (SYSIZE - ysize * font_height) / 2;
int xx, yy;
- SetDrawtoField(DRAW_BUFFERED);
+ SetDrawtoField(DRAW_FIELDBUFFER);
BlitScreenToBitmap(backbuffer);
game.envelope_active = FALSE;
- SetDrawtoField(DRAW_BUFFERED);
+ SetDrawtoField(DRAW_FIELDBUFFER);
redraw_mask |= REDRAW_FIELD;
BackToFront();
AnimateEnvelopeRequest(ANIM_DEFAULT, ACTION_OPENING);
AnimateEnvelopeRequest(main_anim_mode, ACTION_OPENING);
-
}
else
{
if (action == ACTION_CLOSING &&
game_status == GAME_MODE_PLAYING &&
level.game_engine_type == GAME_ENGINE_TYPE_RND)
- SetDrawtoField(DRAW_BUFFERED);
+ SetDrawtoField(DRAW_FIELDBUFFER);
}
void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize)
syy = player->GfxPos;
}
- if (!setup.soft_scrolling && ScreenMovPos)
- sxx = syy = 0;
-
if (player_is_opaque)
DrawGraphicShifted(sx, sy, sxx, syy, graphic, frame,NO_CUTTING,NO_MASKING);
else
syy = player->GfxPos;
}
- if (!setup.soft_scrolling && ScreenMovPos)
- sxx = syy = 0;
-
if (player_is_opaque)
DrawGraphicShifted(sx, sy, sxx, syy, graphic, frame,NO_CUTTING,NO_MASKING);
else
{
if (event.type == EVENT_MOTIONNOTIFY)
{
- if (!PointerInWindow(window))
- continue; /* window and pointer on different screens */
-
if (!button_status)
continue;