void AddLaserEdge(int lx, int ly)
{
- if (lx < -2 || ly < -2 || lx >= SXSIZE + 2 || ly >= SYSIZE + 2)
+ int clx = dSX + lx;
+ int cly = dSY + ly;
+
+ if (clx < -2 || cly < -2 || clx >= SXSIZE + 2 || cly >= SYSIZE + 2)
{
Error(ERR_WARN, "AddLaserEdge: out of bounds: %d, %d", lx, ly);
return;
}
- laser.edge[laser.num_edges].x = SX + 2 + lx;
- laser.edge[laser.num_edges].y = SY + 2 + ly;
+ laser.edge[laser.num_edges].x = cSX2 + lx;
+ laser.edge[laser.num_edges].y = cSY2 + ly;
laser.num_edges++;
laser.redraw = TRUE;
{
int x = LX - XS;
int y = LY - YS;
- int last_x = laser.edge[laser.num_edges - 1].x - SX - 2;
- int last_y = laser.edge[laser.num_edges - 1].y - SY - 2;
+ int last_x = laser.edge[laser.num_edges - 1].x - cSX2;
+ int last_y = laser.edge[laser.num_edges - 1].y - cSY2;
return ((x - last_x) * XS < 0 || (y - last_y) * YS < 0);
}
}
else
{
- pixel = (SX + px < REAL_SX || SX + px >= REAL_SX + FULL_SXSIZE ||
- SY + py < REAL_SY || SY + py >= REAL_SY + FULL_SYSIZE);
+ pixel = (cSX + px < REAL_SX || cSX + px >= REAL_SX + FULL_SXSIZE ||
+ cSY + py < REAL_SY || cSY + py >= REAL_SY + FULL_SYSIZE);
}
if ((Sign[laser.current_angle] & (1 << i)) && pixel)
if (start_edge == 0)
laser.current_angle = laser.start_angle;
- LX = laser.edge[start_edge].x - (SX + 2);
- LY = laser.edge[start_edge].y - (SY + 2);
+ LX = laser.edge[start_edge].x - cSX2;
+ LY = laser.edge[start_edge].y - cSY2;
XS = 2 * Step[laser.current_angle].x;
YS = 2 * Step[laser.current_angle].y;
getGraphicSource(graphic, 0, &bitmap, &gx, &gy);
BlitBitmap(bitmap, drawto, gx + dx, gy + dy, 6, 6,
- SX + x * TILEX + dx, SY + y * TILEY + dy);
+ cSX + x * TILEX + dx, cSY + y * TILEY + dy);
MarkTileDirty(x, y);
}
getGraphicSource(graphic, graphic_phase, &bitmap, &src_x, &src_y);
BlitBitmap(bitmap, drawto_field, src_x, src_y, TILEX, TILEY,
- FX + x * TILEX, FY + y * TILEY);
+ cFX + x * TILEX, cFY + y * TILEY);
MarkTileDirty(x, y);
}
if (bits & HIT_POS_CENTER)
{
- if (CheckLaserPixel(SX + obx + 15,
- SY + oby + 15))
+ if (CheckLaserPixel(cSX + obx + 15,
+ cSY + oby + 15))
return TRUE;
}
if (bits & HIT_POS_EDGE)
{
for (i = 0; i < 4; i++)
- if (CheckLaserPixel(SX + obx + 31 * (i % 2),
- SY + oby + 31 * (i / 2)))
+ if (CheckLaserPixel(cSX + obx + 31 * (i % 2),
+ cSY + oby + 31 * (i / 2)))
return TRUE;
}
if (bits & HIT_POS_BETWEEN)
{
for (i = 0; i < 4; i++)
- if (CheckLaserPixel(SX + 4 + obx + 22 * (i % 2),
- SY + 4 + oby + 22 * (i / 2)))
+ if (CheckLaserPixel(cSX + 4 + obx + 22 * (i % 2),
+ cSY + 4 + oby + 22 * (i / 2)))
return TRUE;
}
/*
laser.num_edges--;
- LX = laser.edge[laser.num_edges].x - (SX + 2);
- LY = laser.edge[laser.num_edges].y - (SY + 2);
+ LX = laser.edge[laser.num_edges].x - cSX2;
+ LY = laser.edge[laser.num_edges].y - cSY2;
*/
for (i = (laser.num_damages > 0 ? laser.num_damages - 1 : 0); i >= 0; i--)
{
if (laser.wall_mask & (1 << i))
{
- if (CheckLaserPixel(SX + ELX * TILEX + 14 + (i % 2) * 2,
- SY + ELY * TILEY + 31 * (i / 2)))
+ if (CheckLaserPixel(cSX + ELX * TILEX + 14 + (i % 2) * 2,
+ cSY + ELY * TILEY + 31 * (i / 2)))
break;
- if (CheckLaserPixel(SX + ELX * TILEX + 31 * (i % 2),
- SY + ELY * TILEY + 14 + (i / 2) * 2))
+ if (CheckLaserPixel(cSX + ELX * TILEX + 31 * (i % 2),
+ cSY + ELY * TILEY + 14 + (i / 2) * 2))
break;
}
}
{
if (laser.wall_mask & (1 << i))
{
- if (CheckLaserPixel(SX + ELX * TILEX + 31 * (i % 2),
- SY + ELY * TILEY + 31 * (i / 2)))
+ if (CheckLaserPixel(cSX + ELX * TILEX + 31 * (i % 2),
+ cSY + ELY * TILEY + 31 * (i / 2)))
break;
}
}
if (laser.num_beamers > 0 ||
k1 < 1 || k2 < 4 || k3 < 4 ||
- CheckLaserPixel(SX + ELX * TILEX + 14,
- SY + ELY * TILEY + 14))
+ CheckLaserPixel(cSX + ELX * TILEX + 14,
+ cSY + ELY * TILEY + 14))
{
laser.num_edges = r;
laser.num_damages = d;
getGraphicSource(graphic, 0, &bitmap, &src_x, &src_y);
CT = FrameCounter;
- ox = SX + ox * TILEX;
- oy = SY + oy * TILEY;
+ ox = cSX + ox * TILEX;
+ oy = cSY + oy * TILEY;
for (i = 1; i < 33; i += 2)
BlitBitmap(bitmap, window,
int getButtonFromTouchPosition(int x, int y, int dst_mx, int dst_my)
{
// calculate start (source) position to be at the middle of the tile
- int src_mx = SX + x * TILESIZE_VAR + TILESIZE_VAR / 2;
- int src_my = SY + y * TILESIZE_VAR + TILESIZE_VAR / 2;
+ int src_mx = cSX + x * TILESIZE_VAR + TILESIZE_VAR / 2;
+ int src_my = cSY + y * TILESIZE_VAR + TILESIZE_VAR / 2;
int dx = dst_mx - src_mx;
int dy = dst_my - src_my;
int element;
#include "mm_tools.h"
+void SetDrawtoField_MM(int mode)
+{
+ int full_xsize = lev_fieldx * TILESIZE_VAR;
+ int full_ysize = lev_fieldy * TILESIZE_VAR;
+
+ // distance (delta) from screen border (SX/SY) to centered level playfield
+ dSX = (full_xsize < SXSIZE ? (SXSIZE - full_xsize) / 2 : 0);
+ dSY = (full_ysize < SYSIZE ? (SYSIZE - full_ysize) / 2 : 0);
+
+ // for convenience, absolute screen position to centered level playfield
+ cSX = SX + dSX;
+ cSY = SY + dSY;
+ cSX2 = SX + dSX + 2; // including playfield border
+ cSY2 = SY + dSY + 2; // including playfield border
+
+ if (mode == DRAW_TO_BACKBUFFER)
+ {
+ cFX = FX + dSX;
+ cFY = FY + dSY;
+ }
+}
+
void ClearWindow()
{
ClearRectangle(backbuffer, REAL_SX, REAL_SY, FULL_SXSIZE, FULL_SYSIZE);
- SetDrawtoField(DRAW_BACKBUFFER);
+ SetDrawtoField(DRAW_TO_BACKBUFFER);
+ SetDrawtoField_MM(DRAW_TO_BACKBUFFER);
redraw_mask |= REDRAW_FIELD;
}
getGraphicSource(graphic, frame, &bitmap, &src_x, &src_y);
BlitBitmap(bitmap, drawto_field, src_x, src_y, TILEX, TILEY,
- FX + x * TILEX, FY + y * TILEY);
+ cFX + x * TILEX, cFY + y * TILEY);
}
void DrawGraphic_MM(int x, int y, int graphic)
}
#endif
- DrawGraphicExt_MM(drawto_field, FX + x*TILEX, FY + y*TILEY, graphic);
+ DrawGraphicExt_MM(drawto_field, cFX + x * TILEX, cFY + y * TILEY, graphic);
MarkTileDirty(x, y);
}
}
#endif
- DrawGraphicThruMaskExt_MM(drawto_field, FX + x * TILEX, FY + y * TILEY,
+ DrawGraphicThruMaskExt_MM(drawto_field, cFX + x * TILEX, cFY + y * TILEY,
graphic);
MarkTileDirty(x,y);
void DrawMiniGraphic_MM(int x, int y, int graphic)
{
- DrawMiniGraphicExt_MM(drawto, SX + x * MINI_TILEX, SY + y * MINI_TILEY,
+ DrawMiniGraphicExt_MM(drawto, cSX + x * MINI_TILEX, cSY + y * MINI_TILEY,
graphic);
MarkTileDirty(x / 2, y / 2);
src_x += cx;
src_y += cy;
- dest_x = FX + x * TILEX + dx;
- dest_y = FY + y * TILEY + dy;
+ dest_x = cFX + x * TILEX + dx;
+ dest_y = cFY + y * TILEY + dy;
#if DEBUG
if (!IN_SCR_FIELD(x,y))
for (i = 0; i < 4; i++)
{
- int dest_x = SX + x * TILEX + MINI_TILEX * (i % 2);
- int dest_y = SY + y * TILEY + MINI_TILEY * (i / 2);
+ int dest_x = cSX + x * TILEX + MINI_TILEX * (i % 2);
+ int dest_y = cSY + y * TILEY + MINI_TILEY * (i / 2);
if (!((1 << i) & draw_mask))
continue;
int frame;
Bitmap *bitmap;
int src_x, src_y;
- int dst_x = SX + x * TILEX + (i % 2) * MINI_TILEX;
- int dst_y = SY + y * TILEY + (i / 2) * MINI_TILEY;
+ int dst_x = cSX + x * TILEX + (i % 2) * MINI_TILEX;
+ int dst_y = cSY + y * TILEY + (i / 2) * MINI_TILEY;
if (bit_mask & (1 << i))
{