X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=ba0ec81ca5ffe036047f565321ccb0f5793cfe47;hb=8848a001bf529a3e06710b80b928094e48f25aa8;hp=eb6f0765d47d04c55c8647fed6ef2d9a076996dc;hpb=90bf2712051fd9dd255f3269891daec81f746566;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index eb6f0765..ba0ec81c 100644 --- a/src/tools.c +++ b/src/tools.c @@ -108,6 +108,27 @@ void SetDrawtoField(int mode) { if (mode == DRAW_BUFFERED && setup.soft_scrolling) { +#if NEW_TILESIZE +#if NEW_SCROLL + FX = 2 * TILEX_VAR; + FY = 2 * TILEY_VAR; + BX1 = -2; + BY1 = -2; + BX2 = SCR_FIELDX + 1; + BY2 = SCR_FIELDY + 1; + redraw_x1 = 2; + redraw_y1 = 2; +#else + FX = TILEX_VAR; + FY = TILEY_VAR; + BX1 = -1; + BY1 = -1; + BX2 = SCR_FIELDX; + BY2 = SCR_FIELDY; + redraw_x1 = 1; + redraw_y1 = 1; +#endif +#else #if NEW_SCROLL FX = 2 * TILEX; FY = 2 * TILEY; @@ -126,6 +147,7 @@ void SetDrawtoField(int mode) BY2 = SCR_FIELDY; redraw_x1 = 1; redraw_y1 = 1; +#endif #endif drawto_field = fieldbuffer; @@ -282,6 +304,78 @@ void DrawMaskedBorder(int redraw_mask) } } +void BlitScreenToBitmap(Bitmap *target_bitmap) +{ + DrawBuffer *buffer = (drawto_field == window ? backbuffer : drawto_field); + int fx = FX, fy = FY; + +#if NEW_TILESIZE + int dx = (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + int dy = (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); + int dx_var = dx * TILESIZE_VAR / TILESIZE; + int dy_var = dy * TILESIZE_VAR / TILESIZE; + int ffx, ffy; + + // fx += dx * TILESIZE_VAR / TILESIZE; + // fy += dy * TILESIZE_VAR / TILESIZE; +#else + fx += (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); +#endif + + /* !!! THIS WORKS !!! */ + + printf("::: (%d, %d) [(%d / %d, %d / %d)]\n", + scroll_x, scroll_y, + SBX_Left, SBX_Right, + SBY_Upper, SBY_Lower); + + 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; + else + fx += (dx > 0 ? TILEX_VAR : 0); + } + else + { + fx += dx; + } + + 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; + else + fy += (dy > 0 ? TILEY_VAR : 0); + } + else + { + fy += dy; + } + + if (border.draw_masked[GAME_MODE_PLAYING]) + { + if (buffer != backbuffer) + { + /* copy playfield buffer to backbuffer to add masked border */ + BlitBitmap(buffer, backbuffer, fx, fy, SXSIZE, SYSIZE, SX, SY); + DrawMaskedBorder(REDRAW_FIELD); + } + + BlitBitmap(backbuffer, target_bitmap, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, + REAL_SX, REAL_SY); + } + else + { + BlitBitmap(buffer, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY); + } +} + void BackToFront() { int x, y; @@ -377,51 +471,88 @@ void BackToFront() } else { +#if 1 + BlitScreenToBitmap(window); +#else int fx = FX, fy = FY; - if (setup.soft_scrolling) +#if NEW_TILESIZE + int dx = (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + int dy = (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); + int dx_var = dx * TILESIZE_VAR / TILESIZE; + int dy_var = dy * TILESIZE_VAR / TILESIZE; + int ffx, ffy; + + // fx += dx * TILESIZE_VAR / TILESIZE; + // fy += dy * TILESIZE_VAR / TILESIZE; +#else + fx += (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); +#endif + + /* !!! THIS WORKS !!! */ + + printf("::: %d, %d\n", scroll_x, scroll_y); + + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx_var; + ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy_var; + + if (EVEN(SCR_FIELDX)) { - fx += (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); - fy += (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + TILEX_VAR) + fx += dx_var - MIN(ffx, TILEX_VAR / 2) + TILEX_VAR; + else + fx += (dx > 0 ? TILEX_VAR : 0); } - - if (setup.soft_scrolling || - ABS(ScreenMovPos) + ScrollStepSize == TILEX || - ABS(ScreenMovPos) == ScrollStepSize || - redraw_tiles > REDRAWTILES_THRESHOLD) + else { - if (border.draw_masked[GAME_MODE_PLAYING]) - { - if (buffer != backbuffer) - { - /* copy playfield buffer to backbuffer to add masked border */ - BlitBitmap(buffer, backbuffer, fx, fy, SXSIZE, SYSIZE, SX, SY); - DrawMaskedBorder(REDRAW_FIELD); - } + fx += dx; + } - BlitBitmap(backbuffer, window, - REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, - REAL_SX, REAL_SY); - } + 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; else + fy += (dy > 0 ? TILEY_VAR : 0); + } + else + { + fy += dy; + } + + if (border.draw_masked[GAME_MODE_PLAYING]) + { + if (buffer != backbuffer) { - BlitBitmap(buffer, window, fx, fy, SXSIZE, SYSIZE, SX, SY); + /* copy playfield buffer to backbuffer to add masked border */ + BlitBitmap(buffer, backbuffer, fx, fy, SXSIZE, SYSIZE, SX, SY); + DrawMaskedBorder(REDRAW_FIELD); } + BlitBitmap(backbuffer, window, + REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE, + REAL_SX, REAL_SY); + } + else + { + BlitBitmap(buffer, window, fx, fy, SXSIZE, SYSIZE, SX, SY); + } +#endif + #if 0 #ifdef DEBUG - printf("redrawing all (ScreenGfxPos == %d) because %s\n", - ScreenGfxPos, - (setup.soft_scrolling ? - "setup.soft_scrolling" : - ABS(ScreenGfxPos) + ScrollStepSize == TILEX ? - "ABS(ScreenGfxPos) + ScrollStepSize == TILEX" : - ABS(ScreenGfxPos) == ScrollStepSize ? - "ABS(ScreenGfxPos) == ScrollStepSize" : - "redraw_tiles > REDRAWTILES_THRESHOLD")); + printf("redrawing all (ScreenGfxPos == %d) because %s\n", + ScreenGfxPos, + (setup.soft_scrolling ? + "setup.soft_scrolling" : + ABS(ScreenGfxPos) + ScrollStepSize == TILEX ? + "ABS(ScreenGfxPos) + ScrollStepSize == TILEX" : + ABS(ScreenGfxPos) == ScrollStepSize ? + "ABS(ScreenGfxPos) == ScrollStepSize" : + "redraw_tiles > REDRAWTILES_THRESHOLD")); #endif #endif - } } redraw_mask &= ~REDRAW_MAIN; @@ -455,12 +586,86 @@ void BackToFront() printf("::: REDRAW_TILES\n"); #endif +#if NEW_TILESIZE + +#if 1 + InitGfxClipRegion(TRUE, SX, SY, SXSIZE, SYSIZE); + + { + int sx = SX; // - (EVEN(SCR_FIELDX) ? TILEX_VAR / 2 : 0); + int sy = SY; // + (EVEN(SCR_FIELDY) ? TILEY_VAR / 2 : 0); + + int dx = 0, dy = 0; + int ffx, ffy; + int fx = FX, fy = FY; + + ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx * TILESIZE_VAR / TILESIZE; + ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy * TILESIZE_VAR / TILESIZE; + + if (EVEN(SCR_FIELDX)) + { + if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + TILEX_VAR) + { + fx = fx + dx * TILESIZE_VAR / TILESIZE - MIN(ffx, TILEX_VAR / 2) + + TILEX_VAR; + + if (fx % TILEX_VAR) + sx -= TILEX_VAR / 2; + else + sx -= TILEX_VAR; + } + else + { + fx = fx - (dx <= 0 ? TILEX_VAR : 0) + TILEX_VAR; + } + } + + if (EVEN(SCR_FIELDY)) + { + if (ffy < SBY_Lower * TILEY_VAR + TILEY_VAR / 2 + TILEY_VAR) + { + fy = fy + dy * TILESIZE_VAR / TILESIZE - MIN(ffy, TILEY_VAR / 2) + + TILEY_VAR; + + if (fy % TILEY_VAR) + sy -= TILEY_VAR / 2; + else + sy -= TILEY_VAR; + } + else + { + fy = fy - (dy <= 0 ? TILEY_VAR : 0) + TILEY_VAR; + } + } + + 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); +#else + 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); +#endif + +#else 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, FY + y * TILEY, TILEX, TILEY, SX + x * TILEX, SY + y * TILEY); +#endif } if (redraw_mask & REDRAW_FPS) /* display frames per second */ @@ -962,8 +1167,9 @@ inline int getGraphicAnimationFrame(int graphic, int sync_frame) sync_frame); } -void getSizedGraphicSource(int graphic, int frame, int tilesize_raw, - Bitmap **bitmap, int *x, int *y) +void getSizedGraphicSourceExt(int graphic, int frame, int tilesize_raw, + Bitmap **bitmap, int *x, int *y, + boolean get_backside) { struct { @@ -989,8 +1195,15 @@ void getSizedGraphicSource(int graphic, int frame, int tilesize_raw, int height_div = offset_calc[offset_calc_pos].height_div; int startx = src_bitmap->width * width_mult / width_div; int starty = src_bitmap->height * height_mult / height_div; +#if NEW_TILESIZE + int src_x = (g->src_x + (get_backside ? g->offset2_x : 0)) * + tilesize / TILESIZE; + int src_y = (g->src_y + (get_backside ? g->offset2_y : 0)) * + tilesize / TILESIZE; +#else int src_x = g->src_x * tilesize / TILESIZE; int src_y = g->src_y * tilesize / TILESIZE; +#endif int width = g->width * tilesize / TILESIZE; int height = g->height * tilesize / TILESIZE; int offset_x = g->offset_x * tilesize / TILESIZE; @@ -1023,6 +1236,25 @@ void getSizedGraphicSource(int graphic, int frame, int tilesize_raw, *y = starty + src_y; } +void getFixedGraphicSourceExt(int graphic, int frame, Bitmap **bitmap, + int *x, int *y, boolean get_backside) +{ + getSizedGraphicSourceExt(graphic, frame, TILESIZE, bitmap, x, y, + get_backside); +} + +void getSizedGraphicSource(int graphic, int frame, int tilesize_raw, + Bitmap **bitmap, int *x, int *y) +{ + getSizedGraphicSourceExt(graphic, frame, tilesize_raw, bitmap, x, y, FALSE); +} + +void getFixedGraphicSource(int graphic, int frame, + Bitmap **bitmap, int *x, int *y) +{ + getSizedGraphicSourceExt(graphic, frame, TILESIZE, bitmap, x, y, FALSE); +} + void getMiniGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y) { #if 1 @@ -1045,6 +1277,12 @@ inline void getGraphicSourceExt(int graphic, int frame, Bitmap **bitmap, int src_x = g->src_x + (get_backside ? g->offset2_x : 0); int src_y = g->src_y + (get_backside ? g->offset2_y : 0); +#if NEW_TILESIZE + if (TILESIZE_VAR != TILESIZE) + return getSizedGraphicSourceExt(graphic, frame, TILESIZE_VAR, bitmap, x, y, + get_backside); +#endif + *bitmap = g->bitmap; if (g->offset_y == 0) /* frames are ordered horizontally */ @@ -1086,7 +1324,28 @@ void DrawGraphic(int x, int y, int graphic, int frame) } #endif +#if NEW_TILESIZE + DrawGraphicExt(drawto_field, FX + x * TILEX_VAR, FY + y * TILEY_VAR, graphic, + frame); +#else DrawGraphicExt(drawto_field, FX + x * TILEX, FY + y * TILEY, graphic, frame); +#endif + MarkTileDirty(x, y); +} + +void DrawFixedGraphic(int x, int y, int graphic, int frame) +{ +#if DEBUG + if (!IN_SCR_FIELD(x, y)) + { + printf("DrawGraphic(): x = %d, y = %d, graphic = %d\n", x, y, graphic); + printf("DrawGraphic(): This should never happen!\n"); + return; + } +#endif + + DrawFixedGraphicExt(drawto_field, FX + x * TILEX, FY + y * TILEY, graphic, + frame); MarkTileDirty(x, y); } @@ -1097,6 +1356,20 @@ void DrawGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic, int src_x, src_y; getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); +#if NEW_TILESIZE + BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, TILEX_VAR, TILEY_VAR, x, y); +#else + BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, TILEX, TILEY, x, y); +#endif +} + +void DrawFixedGraphicExt(DrawBuffer *dst_bitmap, int x, int y, int graphic, + int frame) +{ + Bitmap *src_bitmap; + int src_x, src_y; + + getFixedGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); BlitBitmap(src_bitmap, dst_bitmap, src_x, src_y, TILEX, TILEY, x, y); } @@ -1111,8 +1384,29 @@ void DrawGraphicThruMask(int x, int y, int graphic, int frame) } #endif - DrawGraphicThruMaskExt(drawto_field, FX + x * TILEX, FY + y *TILEY, graphic, +#if NEW_TILESIZE + DrawGraphicThruMaskExt(drawto_field, FX + x * TILEX_VAR, FY + y * TILEY_VAR, + graphic, frame); +#else + DrawGraphicThruMaskExt(drawto_field, FX + x * TILEX, FY + y * TILEY, graphic, frame); +#endif + MarkTileDirty(x, y); +} + +void DrawFixedGraphicThruMask(int x, int y, int graphic, int frame) +{ +#if DEBUG + if (!IN_SCR_FIELD(x, y)) + { + printf("DrawGraphicThruMask(): x = %d,y = %d, graphic = %d\n",x,y,graphic); + printf("DrawGraphicThruMask(): This should never happen!\n"); + return; + } +#endif + + DrawFixedGraphicThruMaskExt(drawto_field, FX + x * TILEX, FY + y * TILEY, + graphic, frame); MarkTileDirty(x, y); } @@ -1124,6 +1418,24 @@ void DrawGraphicThruMaskExt(DrawBuffer *d, int dst_x, int dst_y, int graphic, getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); + SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, + dst_x - src_x, dst_y - src_y); +#if NEW_TILESIZE + BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX_VAR, TILEY_VAR, + dst_x, dst_y); +#else + BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX, TILEY, dst_x, dst_y); +#endif +} + +void DrawFixedGraphicThruMaskExt(DrawBuffer *d, int dst_x, int dst_y, + int graphic, int frame) +{ + Bitmap *src_bitmap; + int src_x, src_y; + + getFixedGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); + SetClipOrigin(src_bitmap, src_bitmap->stored_clip_gc, dst_x - src_x, dst_y - src_y); BlitBitmapMasked(src_bitmap, d, src_x, src_y, TILEX, TILEY, dst_x, dst_y); @@ -1244,6 +1556,15 @@ inline static void DrawGraphicShiftedNormal(int x, int y, int dx, int dy, } #endif +#if NEW_TILESIZE + width = width * TILESIZE_VAR / TILESIZE; + height = height * TILESIZE_VAR / TILESIZE; + cx = cx * TILESIZE_VAR / TILESIZE; + cy = cy * TILESIZE_VAR / TILESIZE; + dx = dx * TILESIZE_VAR / TILESIZE; + dy = dy * TILESIZE_VAR / TILESIZE; +#endif + if (width > 0 && height > 0) { getGraphicSource(graphic, frame, &src_bitmap, &src_x, &src_y); @@ -1251,8 +1572,13 @@ inline static void DrawGraphicShiftedNormal(int x, int y, int dx, int dy, src_x += cx; src_y += cy; +#if NEW_TILESIZE + dst_x = FX + x * TILEX_VAR + dx; + dst_y = FY + y * TILEY_VAR + dy; +#else dst_x = FX + x * TILEX + dx; dst_y = FY + y * TILEY + dy; +#endif if (mask_mode == USE_MASKING) { @@ -1276,7 +1602,11 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy, Bitmap *src_bitmap; int src_x, src_y; int dst_x, dst_y; +#if NEW_TILESIZE + int width = TILEX_VAR, height = TILEY_VAR; +#else int width = TILEX, height = TILEY; +#endif int x1 = x; int y1 = y; int x2 = x + SIGN(dx); @@ -1323,8 +1653,13 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy, { getGraphicSourceExt(graphic, frame, &src_bitmap, &src_x, &src_y, TRUE); +#if NEW_TILESIZE + dst_x = FX + x1 * TILEX_VAR; + dst_y = FY + y1 * TILEY_VAR; +#else dst_x = FX + x1 * TILEX; dst_y = FY + y1 * TILEY; +#endif if (mask_mode == USE_MASKING) { @@ -1345,8 +1680,13 @@ inline static void DrawGraphicShiftedDouble(int x, int y, int dx, int dy, { getGraphicSourceExt(graphic, frame, &src_bitmap, &src_x, &src_y, FALSE); +#if NEW_TILESIZE + dst_x = FX + x2 * TILEX_VAR; + dst_y = FY + y2 * TILEY_VAR; +#else dst_x = FX + x2 * TILEX; dst_y = FY + y2 * TILEY; +#endif if (mask_mode == USE_MASKING) { @@ -1516,6 +1856,15 @@ static void DrawLevelFieldCrumbledInnerCorners(int x, int y, int dx, int dy, getGraphicSource(graphic, 1, &src_bitmap, &src_x, &src_y); +#if NEW_TILESIZE + width = crumbled_border_size * TILESIZE_VAR / TILESIZE; + height = crumbled_border_size * TILESIZE_VAR / TILESIZE; + cx = (dx > 0 ? TILEX - crumbled_border_size : 0) * TILESIZE_VAR / TILESIZE; + cy = (dy > 0 ? TILEY - crumbled_border_size : 0) * TILESIZE_VAR / TILESIZE; + + BlitBitmap(src_bitmap, drawto_field, src_x + cx, src_y + cy, + width, height, FX + sx * TILEX_VAR + cx, FY + sy * TILEY_VAR + cy); +#else width = crumbled_border_size; height = crumbled_border_size; cx = (dx > 0 ? TILEX - crumbled_border_size : 0); @@ -1523,6 +1872,7 @@ static void DrawLevelFieldCrumbledInnerCorners(int x, int y, int dx, int dy, BlitBitmap(src_bitmap, drawto_field, src_x + cx, src_y + cy, width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy); +#endif } static void DrawLevelFieldCrumbledBorders(int x, int y, int graphic, int frame, @@ -1561,8 +1911,18 @@ static void DrawLevelFieldCrumbledBorders(int x, int y, int graphic, int frame, } #endif +#if NEW_TILESIZE + BlitBitmap(src_bitmap, drawto_field, + src_x + cx * TILESIZE_VAR / TILESIZE, + src_y + cy * TILESIZE_VAR / TILESIZE, + width * TILESIZE_VAR / TILESIZE, + height * TILESIZE_VAR / TILESIZE, + FX + sx * TILEX_VAR + cx * TILESIZE_VAR / TILESIZE, + FY + sy * TILEY_VAR + cy * TILESIZE_VAR / TILESIZE); +#else BlitBitmap(src_bitmap, drawto_field, src_x + cx, src_y + cy, width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy); +#endif /* (remaining middle border part must be at least as big as corner part) */ if (!(graphic_info[graphic].style & STYLE_ACCURATE_BORDERS) || @@ -1609,8 +1969,18 @@ static void DrawLevelFieldCrumbledBorders(int x, int y, int graphic, int frame, by = cy; } +#if NEW_TILESIZE + BlitBitmap(src_bitmap, drawto_field, + src_x + bx * TILESIZE_VAR / TILESIZE, + src_y + by * TILESIZE_VAR / TILESIZE, + width * TILESIZE_VAR / TILESIZE, + height * TILESIZE_VAR / TILESIZE, + FX + sx * TILEX_VAR + cx * TILESIZE_VAR / TILESIZE, + FY + sy * TILEY_VAR + cy * TILESIZE_VAR / TILESIZE); +#else BlitBitmap(src_bitmap, drawto_field, src_x + bx, src_y + by, width, height, FX + sx * TILEX + cx, FY + sy * TILEY + cy); +#endif } } #else @@ -2061,7 +2431,7 @@ void DrawEnvelopeBackground(int envelope_nr, int startx, int starty, int inner_sy = (height >= 3 * font_height ? font_height : 0); boolean draw_masked = graphic_info[graphic].draw_masked; - getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); + getFixedGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y); if (src_bitmap == NULL || width < font_width || height < font_height) { @@ -2860,6 +3230,18 @@ inline void DrawGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, DrawGraphicExt(dst_bitmap, x, y, graphic, frame); } +inline void DrawFixedGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y, + int graphic, int sync_frame, + int mask_mode) +{ + int frame = getGraphicAnimationFrame(graphic, sync_frame); + + if (mask_mode == USE_MASKING) + DrawFixedGraphicThruMaskExt(dst_bitmap, x, y, graphic, frame); + else + DrawFixedGraphicExt(dst_bitmap, x, y, graphic, frame); +} + inline void DrawGraphicAnimation(int x, int y, int graphic) { int lx = LEVELX(x), ly = LEVELY(y); @@ -2867,6 +3249,23 @@ inline void DrawGraphicAnimation(int x, int y, int graphic) if (!IN_SCR_FIELD(x, y)) return; +#if NEW_TILESIZE + DrawGraphicAnimationExt(drawto_field, FX + x * TILEX_VAR, FY + y * TILEY_VAR, + graphic, GfxFrame[lx][ly], NO_MASKING); +#else + DrawGraphicAnimationExt(drawto_field, FX + x * TILEX, FY + y * TILEY, + graphic, GfxFrame[lx][ly], NO_MASKING); +#endif + MarkTileDirty(x, y); +} + +inline void DrawFixedGraphicAnimation(int x, int y, int graphic) +{ + int lx = LEVELX(x), ly = LEVELY(y); + + if (!IN_SCR_FIELD(x, y)) + return; + DrawGraphicAnimationExt(drawto_field, FX + x * TILEX, FY + y * TILEY, graphic, GfxFrame[lx][ly], NO_MASKING); MarkTileDirty(x, y); @@ -3417,7 +3816,9 @@ boolean Request(char *text, unsigned int req_state) char *text_ptr; int i; - global.use_envelope_request = TRUE * 1; +#if 1 + global.use_envelope_request = 0; +#endif #if 1 if (maxWordLengthInString(text) > MAX_REQUEST_LINE_FONT1_LEN) @@ -6828,6 +7229,7 @@ inline static int get_effective_element_EM(int tile, int frame_em) return (frame_em > 5 ? EL_EMPTY : element); #if 0 + /* !!! FIX !!! */ case Ydiamond_stone: // if (!game.use_native_emc_graphics_engine) return EL_ROCK; @@ -8583,8 +8985,27 @@ void ChangeViewportPropertiesIfNeeded() int border_size = vp_playfield->border_size; int new_sx = vp_playfield->x + border_size; int new_sy = vp_playfield->y + border_size; + int new_sxsize = vp_playfield->width - 2 * border_size; + int new_sysize = vp_playfield->height - 2 * border_size; + int new_real_sx = vp_playfield->x; + int new_real_sy = vp_playfield->y; + int new_full_sxsize = vp_playfield->width; + int new_full_sysize = vp_playfield->height; +#if NEW_TILESIZE + int new_tilesize_var = TILESIZE / (setup.small_game_graphics ? 2 : 1); + int tilesize = (gfx_game_mode == GAME_MODE_PLAYING ? new_tilesize_var : + gfx_game_mode == GAME_MODE_EDITOR ? MINI_TILESIZE : TILESIZE); + int new_scr_fieldx = new_sxsize / tilesize; + int new_scr_fieldy = new_sysize / tilesize; + int new_scr_fieldx_buffers = new_sxsize / new_tilesize_var; + int new_scr_fieldy_buffers = new_sysize / new_tilesize_var; +#else int new_scr_fieldx = (vp_playfield->width - 2 * border_size) / TILESIZE; int new_scr_fieldy = (vp_playfield->height - 2 * border_size) / TILESIZE; +#endif + boolean init_gfx_buffers = FALSE; + boolean init_video_buffer = FALSE; + boolean init_gadgets_and_toons = FALSE; #if 0 /* !!! TEST ONLY !!! */ @@ -8598,6 +9019,10 @@ void ChangeViewportPropertiesIfNeeded() WIN_XSIZE = viewport.window.width; WIN_YSIZE = viewport.window.height; +#if 1 + init_video_buffer = TRUE; + init_gfx_buffers = TRUE; +#else InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); InitGfxBuffers(); @@ -8607,40 +9032,123 @@ void ChangeViewportPropertiesIfNeeded() // RedrawBackground(); #endif +#endif + + // printf("::: video: init_video_buffer, init_gfx_buffers\n"); } if (new_scr_fieldx != SCR_FIELDX || - new_scr_fieldy != SCR_FIELDY || - new_sx != SX || + new_scr_fieldy != SCR_FIELDY) + { + /* this always toggles between MAIN and GAME when using small tile size */ + + SCR_FIELDX = new_scr_fieldx; + SCR_FIELDY = new_scr_fieldy; + + // printf("::: new_scr_fieldx != SCR_FIELDX ...\n"); + } + +#if 0 + if (new_tilesize_var != TILESIZE_VAR && + gfx_game_mode == GAME_MODE_PLAYING) + { + /* doing this outside GAME_MODE_PLAYING would give wrong playfield size */ + + TILESIZE_VAR = new_tilesize_var; + + init_gfx_buffers = TRUE; + + // printf("::: tilesize: init_gfx_buffers\n"); + } +#endif + + if (new_sx != SX || new_sy != SY || - vp_playfield->x != REAL_SX || - vp_playfield->y != REAL_SY || + new_sxsize != SXSIZE || + new_sysize != SYSIZE || + new_real_sx != REAL_SX || + new_real_sy != REAL_SY || + new_full_sxsize != FULL_SXSIZE || + new_full_sysize != FULL_SYSIZE || + new_tilesize_var != TILESIZE_VAR || vp_door_1->x != *door_1_x || vp_door_1->y != *door_1_y || vp_door_2->x != *door_2_x || vp_door_2->y != *door_2_y) { - SCR_FIELDX = new_scr_fieldx; - SCR_FIELDY = new_scr_fieldy; SX = new_sx; SY = new_sy; - REAL_SX = vp_playfield->x; - REAL_SY = vp_playfield->y; + SXSIZE = new_sxsize; + SYSIZE = new_sysize; + REAL_SX = new_real_sx; + REAL_SY = new_real_sy; + FULL_SXSIZE = new_full_sxsize; + FULL_SYSIZE = new_full_sysize; + TILESIZE_VAR = new_tilesize_var; + +#if 0 + printf("::: %d, %d, %d [%d]\n", + SCR_FIELDX, SCR_FIELDY, TILESIZE_VAR, + setup.small_game_graphics); +#endif *door_1_x = vp_door_1->x; *door_1_y = vp_door_1->y; *door_2_x = vp_door_2->x; *door_2_y = vp_door_2->y; +#if 1 + init_gfx_buffers = TRUE; + + // printf("::: viewports: init_gfx_buffers\n"); +#else InitGfxBuffers(); +#endif if (gfx_game_mode == GAME_MODE_MAIN) { +#if 1 + init_gadgets_and_toons = TRUE; + + // printf("::: viewports: init_gadgets_and_toons\n"); +#else InitGadgets(); InitToons(); +#endif } } + if (init_gfx_buffers) + { + // printf("::: init_gfx_buffers\n"); + + SCR_FIELDX = new_scr_fieldx_buffers; + SCR_FIELDY = new_scr_fieldy_buffers; + + InitGfxBuffers(); + + SCR_FIELDX = new_scr_fieldx; + SCR_FIELDY = new_scr_fieldy; + } + + if (init_video_buffer) + { + // printf("::: init_video_buffer\n"); + + InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); + + SetDrawDeactivationMask(REDRAW_NONE); + SetDrawBackgroundMask(REDRAW_FIELD); + } + + if (init_gadgets_and_toons) + { + // printf("::: init_gadgets_and_toons\n"); + + InitGadgets(); + InitToons(); + } + #if 0 printf("::: %d, %d / %d, %d [%d]\n", VX, VY, EX, EY, game_status); #endif