if (player_is_moving)
{
- if (Store[last_jx][last_jy] && IS_DRAWABLE(last_element))
+ if (Back[last_jx][last_jy] && IS_DRAWABLE(last_element))
{
- DrawLevelElement(last_jx, last_jy, Store[last_jx][last_jy]);
+ DrawLevelElement(last_jx, last_jy, Back[last_jx][last_jy]);
if (last_element == EL_DYNAMITE_ACTIVE ||
last_element == EL_SP_DISK_RED_ACTIVE)
/* draw things behind the player, if needed */
/* ----------------------------------------------------------------------- */
- if (Store[jx][jy])
- DrawLevelElement(jx, jy, Store[jx][jy]);
+ if (Back[jx][jy])
+ DrawLevelElement(jx, jy, Back[jx][jy]);
else if (IS_ACTIVE_BOMB(element))
DrawLevelElement(jx, jy, EL_EMPTY);
else
}
/* ----------------------------------------------------------------------- */
- /* draw elements that stay over the player */
+ /* draw elements the player is just walking/passing through/under */
/* ----------------------------------------------------------------------- */
/* handle the field the player is leaving ... */
- if (player_is_moving && IS_OVER_PLAYER(last_element))
+ if (player_is_moving && IS_ACCESSIBLE_INSIDE(last_element))
DrawLevelField(last_jx, last_jy);
+ else if (player_is_moving && IS_ACCESSIBLE_UNDER(last_element))
+ DrawLevelFieldThruMask(last_jx, last_jy);
/* ... and the field the player is entering */
- if (IS_OVER_PLAYER(element))
+ if (IS_ACCESSIBLE_INSIDE(element))
DrawLevelField(jx, jy);
+ else if (IS_ACCESSIBLE_UNDER(element))
+ DrawLevelFieldThruMask(jx, jy);
if (setup.direct_draw)
{
void getGraphicSource(int graphic, int frame, Bitmap **bitmap, int *x, int *y)
{
- Bitmap *src_bitmap = graphic_info[graphic].bitmap;
- int offset_x = graphic_info[graphic].offset_x;
- int offset_y = graphic_info[graphic].offset_y;
- int src_x = graphic_info[graphic].src_x + frame * offset_x;
- int src_y = graphic_info[graphic].src_y + frame * offset_y;
+ struct GraphicInfo *g = &graphic_info[graphic];
- *bitmap = src_bitmap;
- *x = src_x;
- *y = src_y;
+ *bitmap = g->bitmap;
+
+ if (g->offset_y == 0) /* frames are ordered horizontally */
+ {
+ int max_width = g->anim_frames_per_line * g->width;
+
+ *x = (g->src_x + frame * g->offset_x) % max_width;
+ *y = g->src_y + (g->src_x + frame * g->offset_x) / max_width * g->height;
+ }
+ else if (g->offset_x == 0) /* frames are ordered vertically */
+ {
+ int max_height = g->anim_frames_per_line * g->height;
+
+ *x = g->src_x + (g->src_y + frame * g->offset_y) / max_height * g->width;
+ *y = (g->src_y + frame * g->offset_y) % max_height;
+ }
+ else /* frames are ordered diagonally */
+ {
+ *x = g->src_x + frame * g->offset_x;
+ *y = g->src_y + frame * g->offset_y;
+ }
}
void DrawGraphic(int x, int y, int graphic, int frame)
void getMiniGraphicSource(int graphic, Bitmap **bitmap, int *x, int *y)
{
- Bitmap *src_bitmap = graphic_info[graphic].bitmap;
+ struct GraphicInfo *g = &graphic_info[graphic];
int mini_startx = 0;
- int mini_starty = src_bitmap->height * 2 / 3;
- int src_x = mini_startx + graphic_info[graphic].src_x / 2;
- int src_y = mini_starty + graphic_info[graphic].src_y / 2;
-
-#if 0
- /* !!! not needed anymore, because of automatically created mini graphics */
- if (src_x + MINI_TILEX > src_bitmap->width ||
- src_y + MINI_TILEY > src_bitmap->height)
- {
- /* graphic of desired size seems not to be contained in this image;
- dirty workaround: get it from the middle of the normal sized image */
-
- printf("::: using dirty workaround for %d (%d, %d)\n",
- graphic, src_bitmap->width, src_bitmap->height);
-
- getGraphicSource(graphic, 0, &src_bitmap, &src_x, &src_y);
- src_x += (TILEX / 2 - MINI_TILEX / 2);
- src_y += (TILEY / 2 - MINI_TILEY / 2);
- }
-#endif
+ int mini_starty = g->bitmap->height * 2 / 3;
- *bitmap = src_bitmap;
- *x = src_x;
- *y = src_y;
+ *bitmap = g->bitmap;
+ *x = mini_startx + g->src_x / 2;
+ *y = mini_starty + g->src_y / 2;
}
void DrawMiniGraphicExt(DrawBuffer *d, int x, int y, int graphic)
{
boolean left_stopped = FALSE, right_stopped = FALSE;
- if (!IN_LEV_FIELD(lx - 1, ly) || IS_MAUER(Feld[lx - 1][ly]))
+ if (!IN_LEV_FIELD(lx - 1, ly) || IS_WALL(Feld[lx - 1][ly]))
left_stopped = TRUE;
- if (!IN_LEV_FIELD(lx + 1, ly) || IS_MAUER(Feld[lx + 1][ly]))
+ if (!IN_LEV_FIELD(lx + 1, ly) || IS_WALL(Feld[lx + 1][ly]))
right_stopped = TRUE;
if (left_stopped && right_stopped)
redraw_mask |= REDRAW_ALL;
}
-#ifndef TARGET_SDL
-int ReadPixel(DrawBuffer *bitmap, int x, int y)
-{
- XImage *pixel_image;
- unsigned long pixel_value;
-
- pixel_image = XGetImage(display, bitmap->drawable,
- x, y, 1, 1, AllPlanes, ZPixmap);
- pixel_value = XGetPixel(pixel_image, 0, 0);
-
- XDestroyImage(pixel_image);
-
- return pixel_value;
-}
-#endif
/* ---------- new tool button stuff ---------------------------------------- */