Bitmap *src_bitmap = getGlobalBorderBitmapFromStatus(global.border_status);
Bitmap *dst_bitmap = gfx.masked_border_bitmap_ptr;
+ // may happen for "border.draw_masked.*" with undefined "global.border.*"
+ if (src_bitmap == NULL)
+ return;
+
if (x == -1 && y == -1)
return;
int ysize = MAX(1, g->anim_frames / xsize);
int xoffset = g->anim_start_frame % xsize;
int yoffset = g->anim_start_frame % ysize;
- int x = (lx + xoffset + xsize) % xsize;
- int y = (ly + yoffset + ysize) % ysize;
+ // may be needed if screen field is significantly larger than playfield
+ int x = (lx + xoffset + SCR_FIELDX * xsize) % xsize;
+ int y = (ly + yoffset + SCR_FIELDY * ysize) % ysize;
int sync_frame = y * xsize + x;
return sync_frame % g->anim_frames;
else if (graphic_info[graphic].anim_mode & ANIM_RANDOM_STATIC)
{
struct GraphicInfo *g = &graphic_info[graphic];
- int x = (lx + lev_fieldx) % lev_fieldx;
- int y = (ly + lev_fieldy) % lev_fieldy;
+ // may be needed if screen field is significantly larger than playfield
+ int x = (lx + SCR_FIELDX * lev_fieldx) % lev_fieldx;
+ int y = (ly + SCR_FIELDY * lev_fieldy) % lev_fieldy;
int sync_frame = GfxRandomStatic[x][y];
return sync_frame % g->anim_frames;
}
+ else
+ {
+ int sync_frame = (IN_LEV_FIELD(lx, ly) ? GfxFrame[lx][ly] : -1);
- return getGraphicAnimationFrame(graphic, GfxFrame[lx][ly]);
+ return getGraphicAnimationFrame(graphic, sync_frame);
+ }
}
void getGraphicSourceBitmap(int graphic, int tilesize, Bitmap **bitmap)
}
}
+void DrawLevelGraphic(int x, int y, int graphic, int frame)
+{
+ DrawScreenGraphic(SCREENX(x), SCREENY(y), graphic, frame);
+}
+
void DrawScreenElement(int x, int y, int element)
{
int mask_mode = NO_MASKING;