// forward declaration for internal use
+static void MapToolButtons(unsigned int);
static void UnmapToolButtons(void);
static void HandleToolButtons(struct GadgetInfo *);
static int el_act_dir2crm(int, int, int);
if (game_status != GAME_MODE_PLAYING)
return;
- if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ RedrawPlayfield_BD(TRUE);
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
RedrawPlayfield_EM(TRUE);
else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
RedrawPlayfield_SP(TRUE);
gfx.masked_border_bitmap_ptr = gfx.fade_bitmap_target;
}
+ // always use global border for PLAYING when restarting the game
+ if (global.border_status == GAME_MODE_PSEUDO_RESTARTING)
+ global.border_status = GAME_MODE_PLAYING;
+
DrawMaskedBorderExt(REDRAW_ALL, draw_target);
global.border_status = last_border_status;
}
}
-void DrawTileCursor(int draw_target)
+void DrawTileCursor(int draw_target, int drawing_stage)
{
- DrawTileCursor_MM(draw_target, game_status == GAME_MODE_PLAYING);
+ int tile_cursor_active = (game_status == GAME_MODE_PLAYING);
+
+ DrawTileCursor_MM(draw_target, drawing_stage, tile_cursor_active);
}
void BlitScreenToBitmapExt_RND(Bitmap *target_bitmap, int fx, int fy)
void BlitScreenToBitmap(Bitmap *target_bitmap)
{
- if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ BlitScreenToBitmap_BD(target_bitmap);
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
BlitScreenToBitmap_EM(target_bitmap);
else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
BlitScreenToBitmap_SP(target_bitmap);
static void SetScreenStates_AfterFadingOut(void)
{
global.border_status = game_status;
+
+ // always use global border for PLAYING when restarting the game
+ if (global.border_status == GAME_MODE_PSEUDO_RESTARTING)
+ global.border_status = GAME_MODE_PLAYING;
}
void FadeIn(int fade_mask)
fade_type_skip != FADE_MODE_SKIP_FADE_OUT)
BackToFront();
+ // when using BD game engine, cover playfield before fading out after a game
+ if (game_bd.cover_screen)
+ CoverScreen_BD();
+
SetScreenStates_BeforeFadingOut();
SetTileCursorActive(FALSE);
status);
}
-Bitmap *getBitmapFromGraphicOrDefault(int graphic, int default_graphic)
+int getImageFromGraphicOrDefault(int graphic, int default_graphic)
{
if (graphic == IMG_UNDEFINED)
- return NULL;
+ return IMG_UNDEFINED;
boolean redefined = getImageListEntryFromImageID(graphic)->redefined;
return (graphic_info[graphic].bitmap != NULL || redefined ?
- graphic_info[graphic].bitmap :
- graphic_info[default_graphic].bitmap);
+ graphic : default_graphic);
}
-static Bitmap *getBackgroundBitmap(int graphic)
+static int getBackgroundImage(int graphic)
{
- return getBitmapFromGraphicOrDefault(graphic, IMG_BACKGROUND);
+ return getImageFromGraphicOrDefault(graphic, IMG_BACKGROUND);
}
-static Bitmap *getGlobalBorderBitmap(int graphic)
+static int getGlobalBorderImage(int graphic)
{
- return getBitmapFromGraphicOrDefault(graphic, IMG_GLOBAL_BORDER);
+ return getImageFromGraphicOrDefault(graphic, IMG_GLOBAL_BORDER);
}
Bitmap *getGlobalBorderBitmapFromStatus(int status_raw)
status == GAME_MODE_EDITOR ? IMG_GLOBAL_BORDER_EDITOR :
status == GAME_MODE_PLAYING ? IMG_GLOBAL_BORDER_PLAYING :
IMG_GLOBAL_BORDER);
+ int graphic_final = getGlobalBorderImage(graphic);
+
+ return graphic_info[graphic_final].bitmap;
+}
- return getGlobalBorderBitmap(graphic);
+void SetBackgroundImage(int graphic, int redraw_mask)
+{
+ struct GraphicInfo *g = &graphic_info[graphic];
+ struct GraphicInfo g_undefined = { 0 };
+
+ if (graphic == IMG_UNDEFINED)
+ g = &g_undefined;
+
+ // always use original size bitmap for backgrounds, if existing
+ Bitmap *bitmap = (g->bitmaps != NULL &&
+ g->bitmaps[IMG_BITMAP_PTR_ORIGINAL] != NULL ?
+ g->bitmaps[IMG_BITMAP_PTR_ORIGINAL] : g->bitmap);
+
+ // remove every mask before setting mask for window, and
+ // remove window area mask before setting mask for main or door area
+ int remove_mask = (redraw_mask == REDRAW_ALL ? 0xffff : REDRAW_ALL);
+
+ // (!!! TO BE FIXED: The whole REDRAW_* system really sucks! !!!)
+ SetBackgroundBitmap(NULL, remove_mask, 0, 0, 0, 0); // !!! FIX THIS !!!
+ SetBackgroundBitmap(bitmap, redraw_mask,
+ g->src_x, g->src_y,
+ g->width, g->height);
}
void SetWindowBackgroundImageIfDefined(int graphic)
{
if (graphic_info[graphic].bitmap)
- SetWindowBackgroundBitmap(graphic_info[graphic].bitmap);
+ SetBackgroundImage(graphic, REDRAW_ALL);
}
void SetMainBackgroundImageIfDefined(int graphic)
{
if (graphic_info[graphic].bitmap)
- SetMainBackgroundBitmap(graphic_info[graphic].bitmap);
+ SetBackgroundImage(graphic, REDRAW_FIELD);
}
void SetDoorBackgroundImageIfDefined(int graphic)
{
if (graphic_info[graphic].bitmap)
- SetDoorBackgroundBitmap(graphic_info[graphic].bitmap);
+ SetBackgroundImage(graphic, REDRAW_DOOR_1);
}
void SetWindowBackgroundImage(int graphic)
{
- SetWindowBackgroundBitmap(getBackgroundBitmap(graphic));
+ SetBackgroundImage(getBackgroundImage(graphic), REDRAW_ALL);
}
void SetMainBackgroundImage(int graphic)
{
- SetMainBackgroundBitmap(getBackgroundBitmap(graphic));
+ SetBackgroundImage(getBackgroundImage(graphic), REDRAW_FIELD);
}
void SetDoorBackgroundImage(int graphic)
{
- SetDoorBackgroundBitmap(getBackgroundBitmap(graphic));
+ SetBackgroundImage(getBackgroundImage(graphic), REDRAW_DOOR_1);
}
void SetPanelBackground(void)
{
- struct GraphicInfo *gfx = &graphic_info[IMG_BACKGROUND_PANEL];
-
- BlitBitmapTiled(gfx->bitmap, bitmap_db_panel, gfx->src_x, gfx->src_y,
- gfx->width, gfx->height, 0, 0, DXSIZE, DYSIZE);
-
- SetDoorBackgroundBitmap(bitmap_db_panel);
+ SetDoorBackgroundImage(IMG_BACKGROUND_PANEL);
}
void DrawBackground(int x, int y, int width, int height)
gfx.anim_random_frame = GfxRandom[x][y];
}
+void SetAnimationFirstLevel(int first_level)
+{
+ gfx.anim_first_level = first_level;
+}
+
int getGraphicAnimationFrame(int graphic, int sync_frame)
{
// animation synchronized with global frame counter, not move position
#if DEBUG
if (!IN_SCR_FIELD(x, y))
{
- Debug("draw:DrawGraphicThruMask", "x = %d,y = %d, graphic = %d",
+ Debug("draw:DrawGraphicThruMask", "x = %d, y = %d, graphic = %d",
x, y, graphic);
Debug("draw:DrawGraphicThruMask", "This should never happen!");
#if DEBUG
if (!IN_SCR_FIELD(x, y))
{
- Debug("draw:DrawFixedGraphicThruMask", "x = %d,y = %d, graphic = %d",
+ Debug("draw:DrawFixedGraphicThruMask", "x = %d, y = %d, graphic = %d",
x, y, graphic);
Debug("draw:DrawFixedGraphicThruMask", "This should never happen!");
void DrawMiniGraphic(int x, int y, int graphic)
{
- DrawMiniGraphicExt(drawto, SX + x * MINI_TILEX,SY + y * MINI_TILEY, graphic);
+ DrawMiniGraphicExt(drawto, SX + x * MINI_TILEX, SY + y * MINI_TILEY, graphic);
MarkTileDirty(x / 2, y / 2);
}
}
if (graphic_info[graphic].double_movement) // EM style movement images
- DrawGraphicShiftedDouble(x, y, dx, dy, graphic, frame, cut_mode,mask_mode);
+ DrawGraphicShiftedDouble(x, y, dx, dy, graphic, frame, cut_mode, mask_mode);
else
- DrawGraphicShiftedNormal(x, y, dx, dy, graphic, frame, cut_mode,mask_mode);
+ DrawGraphicShiftedNormal(x, y, dx, dy, graphic, frame, cut_mode, mask_mode);
}
static void DrawGraphicShiftedThruMask(int x, int y, int dx, int dy,
DrawScreenField(SCREENX(x), SCREENY(y));
else if (IS_MOVING(x, y))
{
- int newx,newy;
+ int newx, newy;
Moving2Blocked(x, y, &newx, &newy);
if (IN_SCR_FIELD(SCREENX(newx), SCREENY(newy)))
}
else
{
- int graphic = el2edimg(element);
+ int graphic, frame;
+
+ el2edimg_with_frame(element, &graphic, &frame);
if (masked)
- DrawSizedGraphicThruMask(x, y, graphic, 0, tilesize);
+ DrawSizedGraphicThruMask(x, y, graphic, frame, tilesize);
else
- DrawSizedGraphic(x, y, graphic, 0, tilesize);
+ DrawSizedGraphic(x, y, graphic, frame, tilesize);
}
}
static void PrepareEnvelopeRequestToScreen(Bitmap *bitmap, int sx, int sy,
int xsize, int ysize)
{
- if (!global.use_envelope_request ||
- request.sort_priority <= 0)
+ if (!global.use_envelope_request)
return;
if (request.bitmap == NULL ||
BlitBitmap(bitmap, request.bitmap, sx, sy, xsize, ysize, 0, 0);
+ // create masked surface for request bitmap, if needed
+ if (graphic_info[IMG_BACKGROUND_REQUEST].draw_masked)
+ {
+ SDL_Surface *surface = request.bitmap->surface;
+ SDL_Surface *surface_masked = request.bitmap->surface_masked;
+
+ SDLBlitSurface(surface, surface_masked, 0, 0, xsize, ysize, 0, 0);
+ SDL_SetColorKey(surface_masked, SET_TRANSPARENT_PIXEL,
+ SDL_MapRGB(surface_masked->format, 0x00, 0x00, 0x00));
+ }
+
SDLFreeBitmapTextures(request.bitmap);
SDLCreateBitmapTextures(request.bitmap);
+ ResetBitmapAlpha(request.bitmap);
+
// set envelope request run-time values
request.sx = sx;
request.sy = sy;
request.ysize = ysize;
}
-void DrawEnvelopeRequestToScreen(int drawing_target, int drawing_stage)
+void DrawEnvelopeRequestToScreen(int drawing_target)
{
if (global.use_envelope_request &&
- game.request_active_or_moving &&
- request.sort_priority > 0 &&
- drawing_target == DRAW_TO_SCREEN &&
- drawing_stage == DRAW_GLOBAL_ANIM_STAGE_2)
+ game.request_active &&
+ drawing_target == DRAW_TO_SCREEN)
{
- BlitToScreen(request.bitmap, 0, 0, request.xsize, request.ysize,
- request.sx, request.sy);
+ struct GraphicInfo *g = &graphic_info[IMG_BACKGROUND_REQUEST];
+
+ SetBitmapAlphaNextBlit(request.bitmap, g->alpha);
+
+ if (g->draw_masked)
+ BlitToScreenMasked(request.bitmap, 0, 0, request.xsize, request.ysize,
+ request.sx, request.sy);
+ else
+ BlitToScreen(request.bitmap, 0, 0, request.xsize, request.ysize,
+ request.sx, request.sy);
}
}
setRequestPositionExt(x, y, request.width, request.height, add_border_size);
}
-static void DrawEnvelopeRequest(char *text)
+static void DrawEnvelopeRequestText(int sx, int sy, char *text)
{
char *text_final = text;
char *text_door_style = NULL;
int line_length = max_text_width / font_width;
int max_lines = max_text_height / line_height;
int text_width = line_length * font_width;
- int width = request.width;
- int height = request.height;
- int tile_size = MAX(request.step_offset, 1);
- int x_steps = width / tile_size;
- int y_steps = height / tile_size;
int sx_offset = border_size;
int sy_offset = border_size;
- int sx, sy;
- int i, x, y;
+
+ // force DOOR font inside door area
+ SetFontStatus(GAME_MODE_PSEUDO_DOOR);
if (request.centered)
sx_offset = (request.width - text_width) / 2;
{
char *src_text_ptr, *dst_text_ptr;
+ if (maxWordLengthInRequestString(text) > line_length)
+ {
+ font_nr = FONT_REQUEST_NARROW;
+ font_width = getFontWidth(font_nr);
+ line_length = max_text_width / font_width;
+ }
+
text_door_style = checked_malloc(2 * strlen(text) + 1);
src_text_ptr = text;
text_final = text_door_style;
}
+ DrawTextBuffer(sx + sx_offset, sy + sy_offset, text_final, font_nr,
+ line_length, -1, max_lines, line_spacing, mask_mode,
+ request.autowrap, request.centered, FALSE);
+
+ if (text_door_style)
+ free(text_door_style);
+
+ ResetFontStatus();
+}
+
+static void DrawEnvelopeRequest(char *text, unsigned int req_state)
+{
+ DrawBuffer *drawto_last = drawto;
+ int graphic = IMG_BACKGROUND_REQUEST;
+ int width = request.width;
+ int height = request.height;
+ int tile_size = MAX(request.step_offset, 1);
+ int x_steps = width / tile_size;
+ int y_steps = height / tile_size;
+ int sx, sy;
+ int x, y;
+
setRequestPosition(&sx, &sy, FALSE);
- ClearRectangle(backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE);
+ // draw complete envelope request to temporary bitmap
+ drawto = bitmap_db_store_1;
+
+ ClearRectangle(drawto, sx, sy, width, height);
for (y = 0; y < y_steps; y++)
for (x = 0; x < x_steps; x++)
x, y, x_steps, y_steps,
tile_size, tile_size);
- // force DOOR font inside door area
- SetFontStatus(GAME_MODE_PSEUDO_DOOR);
-
- DrawTextBuffer(sx + sx_offset, sy + sy_offset, text_final, font_nr,
- line_length, -1, max_lines, line_spacing, mask_mode,
- request.autowrap, request.centered, FALSE);
-
- ResetFontStatus();
-
- for (i = 0; i < NUM_TOOL_BUTTONS; i++)
- RedrawGadget(tool_gadget[i]);
+ // write text for request
+ DrawEnvelopeRequestText(sx, sy, text);
- // store readily prepared envelope request for later use when animating
- BlitBitmap(backbuffer, bitmap_db_store_2, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
+ MapToolButtons(req_state);
- PrepareEnvelopeRequestToScreen(bitmap_db_store_2, sx, sy, width, height);
+ // restore pointer to drawing buffer
+ drawto = drawto_last;
- if (text_door_style)
- free(text_door_style);
+ // prepare complete envelope request from temporary bitmap
+ PrepareEnvelopeRequestToScreen(bitmap_db_store_1, sx, sy, width, height);
}
static void AnimateEnvelopeRequest(int anim_mode, int action)
{
- int graphic = IMG_BACKGROUND_REQUEST;
- boolean draw_masked = graphic_info[graphic].draw_masked;
+ boolean game_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded());
int delay_value_normal = request.step_delay;
int delay_value_fast = delay_value_normal / 2;
boolean ffwd_delay = (tape.playing && tape.fast_forward);
boolean no_delay = (tape.warp_forward);
int delay_value = (ffwd_delay ? delay_value_fast : delay_value_normal);
- int anim_delay_value = MAX(1, (no_delay ? 0 : delay_value + 500 * 0) / 2);
+ int anim_delay_value = MAX(1, (no_delay ? 0 : delay_value) / 2);
DelayCounter anim_delay = { anim_delay_value };
int tile_size = MAX(request.step_offset, 1);
int dst_x, dst_y;
int xx, yy;
+ if (game_ended)
+ HandleGameActions();
+
setRequestPosition(&src_x, &src_y, FALSE);
setRequestPositionExt(&dst_x, &dst_y, width, height, FALSE);
- BlitBitmap(bitmap_db_store_1, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
-
for (yy = 0; yy < 2; yy++)
{
for (xx = 0; xx < 2; xx++)
int xx_size = (xx ? tile_size : xsize_size_left);
int yy_size = (yy ? tile_size : ysize_size_top);
- if (draw_masked)
- BlitBitmapMasked(bitmap_db_store_2, backbuffer,
- src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy);
- else
- BlitBitmap(bitmap_db_store_2, backbuffer,
- src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy);
+ // draw partial (animated) envelope request to temporary bitmap
+ BlitBitmap(bitmap_db_store_1, bitmap_db_store_2,
+ src_xx, src_yy, xx_size, yy_size, dst_xx, dst_yy);
}
}
- PrepareEnvelopeRequestToScreen(backbuffer, dst_x, dst_y, width, height);
+ // prepare partial (animated) envelope request from temporary bitmap
+ PrepareEnvelopeRequestToScreen(bitmap_db_store_2, dst_x, dst_y,
+ width, height);
redraw_mask |= REDRAW_FIELD;
int main_anim_mode = (anim_mode == ANIM_NONE ? ANIM_VERTICAL|ANIM_HORIZONTAL:
anim_mode == ANIM_DEFAULT ? ANIM_VERTICAL : anim_mode);
- if (game_status == GAME_MODE_PLAYING)
- BlitScreenToBitmap(backbuffer);
-
- SetDrawtoField(DRAW_TO_BACKBUFFER);
-
- // SetDrawBackgroundMask(REDRAW_NONE);
-
- if (action == ACTION_OPENING)
- {
- BlitBitmap(backbuffer, bitmap_db_store_1, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
-
- if (req_state & REQ_ASK)
- {
- MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_NO]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_YES]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_NO]);
- }
- else if (req_state & REQ_CONFIRM)
- {
- MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_CONFIRM]);
- }
- else if (req_state & REQ_PLAYER)
- {
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]);
- }
-
- DrawEnvelopeRequest(text);
- }
-
game.envelope_active = TRUE; // needed for RedrawPlayfield() events
if (action == ACTION_OPENING)
}
game.envelope_active = FALSE;
+}
- if (action == ACTION_CLOSING)
- BlitBitmap(bitmap_db_store_1, backbuffer, 0, 0, WIN_XSIZE, WIN_YSIZE, 0, 0);
-
- // SetDrawBackgroundMask(last_draw_background_mask);
-
- redraw_mask |= REDRAW_FIELD;
-
- BackToFront();
+static Bitmap *GetPreviewTileBitmap(Bitmap *bitmap)
+{
+ if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ return GetPreviewTileBitmap_BD(bitmap);
- if (action == ACTION_CLOSING &&
- game_status == GAME_MODE_PLAYING &&
- level.game_engine_type == GAME_ENGINE_TYPE_RND)
- SetDrawtoField(DRAW_TO_FIELDBUFFER);
+ return bitmap;
}
static void DrawPreviewElement(int dst_x, int dst_y, int element, int tilesize)
int graphic = el2preimg(element);
getSizedGraphicSource(graphic, 0, tilesize, &src_bitmap, &src_x, &src_y);
+
+ // for BD style levels, maybe use bitmap with level-specific colors
+ src_bitmap = GetPreviewTileBitmap(src_bitmap);
+
BlitBitmap(src_bitmap, drawto, src_x, src_y, tilesize, tilesize,
dst_x, dst_y);
}
void DrawLevel(int draw_background_mask)
{
- int x,y;
+ int x, y;
SetMainBackgroundImage(IMG_BACKGROUND_PLAYING);
SetDrawBackgroundMask(draw_background_mask);
void DrawSizedLevel(int size_x, int size_y, int scroll_x, int scroll_y,
int tilesize)
{
- int x,y;
+ int x, y;
for (x = 0; x < size_x; x++)
for (y = 0; y < size_y; y++)
void DrawMiniLevel(int size_x, int size_y, int scroll_x, int scroll_y)
{
- int x,y;
+ int x, y;
for (x = 0; x < size_x; x++)
for (y = 0; y < size_y; y++)
redraw_mask |= REDRAW_FIELD;
}
+static int getPreviewLevelWidth(void)
+{
+ if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ return (level.native_bd_level->cave->x2 - level.native_bd_level->cave->x1 + 1);
+
+ return lev_fieldx;
+}
+
+static int getPreviewLevelHeight(void)
+{
+ if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ return (level.native_bd_level->cave->y2 - level.native_bd_level->cave->y1 + 1);
+
+ return lev_fieldy;
+}
+
static void DrawPreviewLevelPlayfield(int from_x, int from_y)
{
boolean show_level_border = (BorderElement != EL_EMPTY);
- int level_xsize = lev_fieldx + (show_level_border ? 2 : 0);
- int level_ysize = lev_fieldy + (show_level_border ? 2 : 0);
+ int level_xsize = getPreviewLevelWidth() + (show_level_border ? 2 : 0);
+ int level_ysize = getPreviewLevelHeight() + (show_level_border ? 2 : 0);
int tile_size = preview.tile_size;
int preview_width = preview.xsize * tile_size;
int preview_height = preview.ysize * tile_size;
}
}
+static void PreparePreviewTileBitmap(void)
+{
+ // check if special preview bitmap with level-specific colors should be created
+ if (level.game_engine_type != GAME_ENGINE_TYPE_BD)
+ return;
+
+ // use original sized bitmap (else reduced color palette is lost by downscaling)
+ int original_tilesize = MAX(MINI_TILESIZE, preview.tile_size);
+ int scale_down_factor = original_tilesize / preview.tile_size;
+ Bitmap *src_bitmap;
+ int src_x, src_y;
+ int element_template = EL_BDX_GAME_GRAPHICS_COLOR_TEMPLATE;
+ int graphic_template = el2preimg(element_template);
+ int element_default = EL_BDX_ROCK;
+ int graphic_default = el2preimg(element_default);
+
+ // create special preview bitmap and scale it down to preview tile size
+ getSizedGraphicSource(graphic_template, 0, original_tilesize, &src_bitmap, &src_x, &src_y);
+ PreparePreviewTileBitmap_BD(src_bitmap, scale_down_factor);
+
+ // force using special preview bitmap to replace original preview bitmap
+ getSizedGraphicSource(graphic_default, 0, preview.tile_size, &src_bitmap, &src_x, &src_y);
+ SetPreviewTileBitmapReference_BD(src_bitmap);
+}
+
void DrawPreviewLevelInitial(void)
{
+ PreparePreviewTileBitmap(); // only needed for native BD style levels
+
DrawPreviewLevelExt(TRUE);
DrawPreviewPlayers();
}
DrawFixedGraphicExt(dst_bitmap, x, y, graphic, frame);
}
+void DrawSizedGraphicAnimationExt(DrawBuffer *dst_bitmap, int x, int y,
+ int graphic, int sync_frame, int tilesize,
+ int mask_mode)
+{
+ int frame = getGraphicAnimationFrame(graphic, sync_frame);
+
+ if (mask_mode == USE_MASKING)
+ DrawSizedGraphicThruMaskExt(dst_bitmap, x, y, graphic, frame, tilesize);
+ else
+ DrawSizedGraphicExt(dst_bitmap, x, y, graphic, frame, tilesize);
+}
+
static void DrawGraphicAnimation(int x, int y, int graphic)
{
int lx = LEVELX(x), ly = LEVELY(y);
return graphic;
}
else
- return el_act_dir2img(player->artwork_element, player->GfxAction,move_dir);
+ return el_act_dir2img(player->artwork_element, player->GfxAction, move_dir);
}
static boolean equalGraphics(int graphic1, int graphic2)
}
}
-#define MAX_REQUEST_LINES 13
-#define MAX_REQUEST_LINE_FONT1_LEN 7
-#define MAX_REQUEST_LINE_FONT2_LEN 10
-
static int RequestHandleEvents(unsigned int req_state, int draw_buffer_game)
{
- boolean game_just_ended = (game_status == GAME_MODE_PLAYING &&
- checkGameEnded());
+ boolean game_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded());
int draw_buffer_last = GetDrawtoField();
int width = request.width;
int height = request.height;
int sx, sy;
int result;
- // when showing request dialog after game ended, deactivate game panel
- if (game_just_ended)
- game.panel.active = FALSE;
-
- game.request_active = TRUE;
-
setRequestPosition(&sx, &sy, FALSE);
button_status = MB_RELEASED;
while (result < 0)
{
- boolean event_handled = FALSE;
-
- if (game_just_ended)
+ if (game_ended)
{
SetDrawtoField(draw_buffer_game);
HandleGameActions();
SetDrawtoField(DRAW_TO_BACKBUFFER);
-
- if (global.use_envelope_request)
- {
- // copy current state of request area to middle of playfield area
- BlitBitmap(bitmap_db_store_2, drawto, sx, sy, width, height, sx, sy);
- }
}
if (PendingEvent())
while (NextValidEvent(&event))
{
- event_handled = TRUE;
-
switch (event.type)
{
case EVENT_BUTTONPRESS:
case EVENT_BUTTONRELEASE:
case EVENT_MOTIONNOTIFY:
{
+ DrawBuffer *drawto_last = drawto;
int mx, my;
if (event.type == EVENT_MOTIONNOTIFY)
button_status = MB_RELEASED;
}
+ if (global.use_envelope_request)
+ {
+ // draw changed button states to temporary bitmap
+ drawto = bitmap_db_store_1;
+ }
+
// this sets 'request_gadget_id'
HandleGadgets(mx, my, button_status);
+ if (global.use_envelope_request)
+ {
+ // restore pointer to drawing buffer
+ drawto = drawto_last;
+
+ // prepare complete envelope request from temporary bitmap
+ PrepareEnvelopeRequestToScreen(bitmap_db_store_1, sx, sy,
+ width, height);
+ }
+
switch (request_gadget_id)
{
case TOOL_CTRL_ID_YES:
break;
default:
- // only check clickable animations if no request gadget clicked
- HandleGlobalAnimClicks(mx, my, button_status, FALSE);
break;
}
+ // only needed to handle clickable pointer animations here
+ HandleGlobalAnimClicks(mx, my, button_status, FALSE);
+
break;
}
}
}
- if (event_handled)
- {
- if (game_just_ended)
- {
- if (global.use_envelope_request)
- {
- // copy back current state of pressed buttons inside request area
- BlitBitmap(drawto, bitmap_db_store_2, sx, sy, width, height, sx, sy);
- }
- }
-
- PrepareEnvelopeRequestToScreen(drawto, sx, sy, width, height);
- }
-
BackToFront();
}
SetDrawtoField(draw_buffer_last);
- game.request_active = FALSE;
-
return result;
}
-static boolean RequestDoor(char *text, unsigned int req_state)
+static void DoRequestBefore(void)
{
- int draw_buffer_last = GetDrawtoField();
- unsigned int old_door_state;
- int max_request_line_len = MAX_REQUEST_LINE_FONT1_LEN;
- int font_nr = FONT_TEXT_2;
- char *text_ptr;
- int result;
- int ty;
+ boolean game_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded());
- if (maxWordLengthInRequestString(text) > MAX_REQUEST_LINE_FONT1_LEN)
- {
- max_request_line_len = MAX_REQUEST_LINE_FONT2_LEN;
- font_nr = FONT_TEXT_1;
- }
+ // when showing request dialog after game ended, deactivate game panel
+ if (game_ended)
+ game.panel.active = FALSE;
if (game_status == GAME_MODE_PLAYING)
BlitScreenToBitmap(backbuffer);
// pause network game while waiting for request to answer
if (network.enabled &&
game_status == GAME_MODE_PLAYING &&
- !game.all_players_gone &&
- req_state & REQUEST_WAIT_FOR_INPUT)
+ !game.all_players_gone)
SendToServer_PausePlaying();
- old_door_state = GetDoorState();
-
// simulate releasing mouse button over last gadget, if still pressed
if (button_status)
HandleGadgets(-1, -1, 0);
UnmapAllGadgets();
+}
- // draw released gadget before proceeding
- // BackToFront();
+static void DoRequestAfter(void)
+{
+ RemapAllGadgets();
- if (old_door_state & DOOR_OPEN_1)
+ if (game_status == GAME_MODE_PLAYING)
{
- CloseDoor(DOOR_CLOSE_1);
+ SetPanelBackground();
+ SetDrawBackgroundMask(REDRAW_DOOR_1);
+ }
+ else
+ {
+ SetDrawBackgroundMask(REDRAW_FIELD);
+ }
- // save old door content
- BlitBitmap(bitmap_db_door_1, bitmap_db_door_1,
- 0 * DXSIZE, 0, DXSIZE, DYSIZE, 1 * DXSIZE, 0);
+ // continue network game after request
+ if (network.enabled &&
+ game_status == GAME_MODE_PLAYING &&
+ !game.all_players_gone)
+ SendToServer_ContinuePlaying();
+
+ // restore deactivated drawing when quick-loading level tape recording
+ if (tape.playing && tape.deactivate_display)
+ TapeDeactivateDisplayOn();
+}
+
+static void setRequestDoorTextProperties(char *text,
+ int text_spacing,
+ int line_spacing,
+ int *set_font_nr,
+ int *set_max_lines,
+ int *set_max_line_length)
+{
+ struct RectWithBorder *vp_door_1 = &viewport.door_1[game_status];
+ struct TextPosInfo *pos = &request.button.confirm;
+ int button_ypos = pos->y;
+ int font_nr = FONT_TEXT_2;
+ int font_width = getFontWidth(font_nr);
+ int font_height = getFontHeight(font_nr);
+ int line_height = font_height + line_spacing;
+ int max_text_width = vp_door_1->width;
+ int max_text_height = button_ypos - 2 * text_spacing;
+ int max_line_length = max_text_width / font_width;
+ int max_lines = max_text_height / line_height;
+
+ if (maxWordLengthInRequestString(text) > max_line_length)
+ {
+ font_nr = FONT_TEXT_1;
+ font_width = getFontWidth(font_nr);
+ max_line_length = max_text_width / font_width;
}
- SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
- SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
+ *set_font_nr = font_nr;
+ *set_max_lines = max_lines;
+ *set_max_line_length = max_line_length;
+}
- // clear door drawing field
- DrawBackground(DX, DY, DXSIZE, DYSIZE);
+static void DrawRequestDoorText(char *text)
+{
+ char *text_ptr = text;
+ int text_spacing = 8;
+ int line_spacing = 2;
+ int max_request_lines;
+ int max_request_line_len;
+ int font_nr;
+ int ty;
// force DOOR font inside door area
SetFontStatus(GAME_MODE_PSEUDO_DOOR);
- // write text for request
- for (text_ptr = text, ty = 0; ty < MAX_REQUEST_LINES; ty++)
+ setRequestDoorTextProperties(text, text_spacing, line_spacing, &font_nr,
+ &max_request_lines, &max_request_line_len);
+
+ for (text_ptr = text, ty = 0; ty < max_request_lines; ty++)
{
char text_line[max_request_line_len + 1];
int tx, tl, tc = 0;
for (tl = 0, tx = 0; tx < max_request_line_len; tl++, tx++)
{
tc = *(text_ptr + tx);
- // if (!tc || tc == ' ')
if (!tc || tc == ' ' || tc == '?' || tc == '!')
break;
}
text_line[tl] = 0;
DrawText(DX + (DXSIZE - tl * getFontWidth(font_nr)) / 2,
- DY + 8 + ty * (getFontHeight(font_nr) + 2),
+ DY + text_spacing + ty * (getFontHeight(font_nr) + line_spacing),
text_line, font_nr);
text_ptr += tl + (tc == ' ' ? 1 : 0);
- // text_ptr += tl + (tc == ' ' || tc == '?' || tc == '!' ? 1 : 0);
}
ResetFontStatus();
+}
- if (req_state & REQ_ASK)
- {
- MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_NO]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_YES]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_NO]);
- }
- else if (req_state & REQ_CONFIRM)
- {
- MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_CONFIRM]);
- }
- else if (req_state & REQ_PLAYER)
+static int RequestDoor(char *text, unsigned int req_state)
+{
+ unsigned int old_door_state = GetDoorState();
+ int draw_buffer_last = GetDrawtoField();
+ int result;
+
+ if (old_door_state & DOOR_OPEN_1)
{
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]);
- MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]);
- }
+ CloseDoor(DOOR_CLOSE_1);
- // copy request gadgets to door backbuffer
- BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
+ // save old door content
+ BlitBitmap(bitmap_db_door_1, bitmap_db_door_1,
+ 0, 0, DXSIZE, DYSIZE, DXSIZE, 0);
+ }
- OpenDoor(DOOR_OPEN_1);
+ SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
+ SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
- if (!(req_state & REQUEST_WAIT_FOR_INPUT))
- {
- if (game_status == GAME_MODE_PLAYING)
- {
- SetPanelBackground();
- SetDrawBackgroundMask(REDRAW_DOOR_1);
- }
- else
- {
- SetDrawBackgroundMask(REDRAW_FIELD);
- }
+ // clear door drawing field
+ DrawBackground(DX, DY, DXSIZE, DYSIZE);
- return FALSE;
- }
+ // write text for request
+ DrawRequestDoorText(text);
- SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
+ MapToolButtons(req_state);
+
+ // copy request gadgets to door backbuffer
+ BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
+
+ OpenDoor(DOOR_OPEN_1);
// ---------- handle request buttons ----------
result = RequestHandleEvents(req_state, draw_buffer_last);
OpenDoor(DOOR_OPEN_1 | DOOR_COPY_BACK);
}
- RemapAllGadgets();
-
- if (game_status == GAME_MODE_PLAYING)
- {
- SetPanelBackground();
- SetDrawBackgroundMask(REDRAW_DOOR_1);
- }
- else
- {
- SetDrawBackgroundMask(REDRAW_FIELD);
- }
-
- // continue network game after request
- if (network.enabled &&
- game_status == GAME_MODE_PLAYING &&
- !game.all_players_gone &&
- req_state & REQUEST_WAIT_FOR_INPUT)
- SendToServer_ContinuePlaying();
-
- // restore deactivated drawing when quick-loading level tape recording
- if (tape.playing && tape.deactivate_display)
- TapeDeactivateDisplayOn();
-
return result;
}
-static boolean RequestEnvelope(char *text, unsigned int req_state)
+static int RequestEnvelope(char *text, unsigned int req_state)
{
int draw_buffer_last = GetDrawtoField();
int result;
- if (game_status == GAME_MODE_PLAYING)
- BlitScreenToBitmap(backbuffer);
-
- // disable deactivated drawing when quick-loading level tape recording
- if (tape.playing && tape.deactivate_display)
- TapeDeactivateDisplayOff(TRUE);
-
- SetMouseCursor(CURSOR_DEFAULT);
-
- // pause network game while waiting for request to answer
- if (network.enabled &&
- game_status == GAME_MODE_PLAYING &&
- !game.all_players_gone &&
- req_state & REQUEST_WAIT_FOR_INPUT)
- SendToServer_PausePlaying();
-
- // simulate releasing mouse button over last gadget, if still pressed
- if (button_status)
- HandleGadgets(-1, -1, 0);
-
- UnmapAllGadgets();
-
- // (replace with setting corresponding request background)
- // SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
- // SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
-
- // clear door drawing field
- // DrawBackground(DX, DY, DXSIZE, DYSIZE);
-
+ DrawEnvelopeRequest(text, req_state);
ShowEnvelopeRequest(text, req_state, ACTION_OPENING);
- if (!(req_state & REQUEST_WAIT_FOR_INPUT))
- {
- if (game_status == GAME_MODE_PLAYING)
- {
- SetPanelBackground();
- SetDrawBackgroundMask(REDRAW_DOOR_1);
- }
- else
- {
- SetDrawBackgroundMask(REDRAW_FIELD);
- }
-
- return FALSE;
- }
-
- SetDrawBackgroundMask(REDRAW_FIELD | REDRAW_DOOR_1);
-
// ---------- handle request buttons ----------
result = RequestHandleEvents(req_state, draw_buffer_last);
ShowEnvelopeRequest(text, req_state, ACTION_CLOSING);
- RemapAllGadgets();
-
- if (game_status == GAME_MODE_PLAYING)
- {
- SetPanelBackground();
- SetDrawBackgroundMask(REDRAW_DOOR_1);
- }
- else
- {
- SetDrawBackgroundMask(REDRAW_FIELD);
- }
-
- // continue network game after request
- if (network.enabled &&
- game_status == GAME_MODE_PLAYING &&
- !game.all_players_gone &&
- req_state & REQUEST_WAIT_FOR_INPUT)
- SendToServer_ContinuePlaying();
-
- // restore deactivated drawing when quick-loading level tape recording
- if (tape.playing && tape.deactivate_display)
- TapeDeactivateDisplayOn();
-
return result;
}
-boolean Request(char *text, unsigned int req_state)
+int Request(char *text, unsigned int req_state)
{
boolean overlay_enabled = GetOverlayEnabled();
- boolean result;
+ int result;
- game.request_active_or_moving = TRUE;
+ game.request_active = TRUE;
SetOverlayEnabled(FALSE);
+ DoRequestBefore();
+
if (global.use_envelope_request)
result = RequestEnvelope(text, req_state);
else
result = RequestDoor(text, req_state);
+ DoRequestAfter();
+
SetOverlayEnabled(overlay_enabled);
- game.request_active_or_moving = FALSE;
+ game.request_active = FALSE;
return result;
}
if (door_state & DOOR_ACTION)
{
+ boolean game_ended = (game_status == GAME_MODE_PLAYING && checkGameEnded());
boolean door_panel_drawn[NUM_DOORS];
boolean panel_has_doors[NUM_DOORS];
boolean door_part_skip[MAX_DOOR_PARTS];
}
}
+ SetDoorBackgroundImage(IMG_BACKGROUND_DOOR);
+
+ game.any_door_active = TRUE;
+
for (k = start; k < num_move_steps; k++)
{
int last_frame = num_move_steps - 1; // last frame of this "for" loop
if (!door_panel_drawn[door_index])
{
- ClearRectangle(drawto, door_rect->x, door_rect->y,
- door_rect->width, door_rect->height);
+ ClearRectangleOnBackground(drawto, door_rect->x, door_rect->y,
+ door_rect->width, door_rect->height);
door_panel_drawn[door_index] = TRUE;
}
if (!(door_state & DOOR_NO_DELAY))
{
+ if (game_ended)
+ HandleGameActions();
+
BackToFront();
SkipUntilDelayReached(&door_delay, &k, last_frame);
door_delay.value = door_2.post_delay;
while (!DelayReached(&door_delay))
+ {
+ if (game_ended)
+ HandleGameActions();
+
BackToFront();
+ }
}
+
+ game.any_door_active = FALSE;
}
if (door_state & DOOR_ACTION_1)
TOOL_CTRL_ID_TOUCH_NO, TRUE, "no"
},
{
- IMG_GFX_REQUEST_BUTTON_TOUCH_CONFIRM, &request.button.touch_confirm,
- TOOL_CTRL_ID_TOUCH_CONFIRM, TRUE, "confirm"
+ IMG_GFX_REQUEST_BUTTON_TOUCH_CONFIRM, &request.button.touch_confirm,
+ TOOL_CTRL_ID_TOUCH_CONFIRM, TRUE, "confirm"
+ }
+};
+
+void CreateToolButtons(void)
+{
+ int i;
+
+ for (i = 0; i < NUM_TOOL_BUTTONS; i++)
+ {
+ int graphic = toolbutton_info[i].graphic;
+ struct GraphicInfo *gfx = &graphic_info[graphic];
+ struct TextPosInfo *pos = toolbutton_info[i].pos;
+ struct GadgetInfo *gi;
+ Bitmap *deco_bitmap = None;
+ int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0;
+ unsigned int event_mask = GD_EVENT_RELEASED;
+ boolean is_touch_button = toolbutton_info[i].is_touch_button;
+ int base_x = (is_touch_button ? 0 : DX);
+ int base_y = (is_touch_button ? 0 : DY);
+ int gd_x = gfx->src_x;
+ int gd_y = gfx->src_y;
+ int gd_xp = gfx->src_x + gfx->pressed_xoffset;
+ int gd_yp = gfx->src_y + gfx->pressed_yoffset;
+ int x = pos->x;
+ int y = pos->y;
+ int id = i;
+
+ // do not use touch buttons if overlay touch buttons are disabled
+ if (is_touch_button && !setup.touch.overlay_buttons)
+ continue;
+
+ if (global.use_envelope_request && !is_touch_button)
+ {
+ setRequestPosition(&base_x, &base_y, TRUE);
+
+ // check if request buttons are outside of envelope and fix, if needed
+ if (x < 0 || x + gfx->width > request.width ||
+ y < 0 || y + gfx->height > request.height)
+ {
+ if (id == TOOL_CTRL_ID_YES)
+ {
+ x = 0;
+ y = request.height - 2 * request.border_size - gfx->height;
+ }
+ else if (id == TOOL_CTRL_ID_NO)
+ {
+ x = request.width - 2 * request.border_size - gfx->width;
+ y = request.height - 2 * request.border_size - gfx->height;
+ }
+ else if (id == TOOL_CTRL_ID_CONFIRM)
+ {
+ x = (request.width - 2 * request.border_size - gfx->width) / 2;
+ y = request.height - 2 * request.border_size - gfx->height;
+ }
+ else if (id >= TOOL_CTRL_ID_PLAYER_1 && id <= TOOL_CTRL_ID_PLAYER_4)
+ {
+ int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
+
+ x = (request.width - 2 * request.border_size - gfx->width) / 2;
+ y = request.height - 2 * request.border_size - gfx->height * 2;
+
+ x += (player_nr == 3 ? -1 : player_nr == 1 ? +1 : 0) * gfx->width;
+ y += (player_nr == 0 ? -1 : player_nr == 2 ? +1 : 0) * gfx->height;
+ }
+ }
+ }
+
+ if (id >= TOOL_CTRL_ID_PLAYER_1 && id <= TOOL_CTRL_ID_PLAYER_4 &&
+ pos->draw_player)
+ {
+ int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
+
+ getSizedGraphicSource(PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0,
+ pos->size, &deco_bitmap, &deco_x, &deco_y);
+ deco_xpos = (gfx->width - pos->size) / 2;
+ deco_ypos = (gfx->height - pos->size) / 2;
+ }
+
+ gi = CreateGadget(GDI_CUSTOM_ID, id,
+ GDI_IMAGE_ID, graphic,
+ GDI_INFO_TEXT, toolbutton_info[i].infotext,
+ GDI_X, base_x + x,
+ GDI_Y, base_y + y,
+ GDI_WIDTH, gfx->width,
+ GDI_HEIGHT, gfx->height,
+ GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
+ GDI_STATE, GD_BUTTON_UNPRESSED,
+ GDI_DESIGN_UNPRESSED, gfx->bitmap, gd_x, gd_y,
+ GDI_DESIGN_PRESSED, gfx->bitmap, gd_xp, gd_yp,
+ GDI_DECORATION_DESIGN, deco_bitmap, deco_x, deco_y,
+ GDI_DECORATION_POSITION, deco_xpos, deco_ypos,
+ GDI_DECORATION_SIZE, pos->size, pos->size,
+ GDI_DECORATION_SHIFTING, 1, 1,
+ GDI_DIRECT_DRAW, FALSE,
+ GDI_OVERLAY_TOUCH_BUTTON, is_touch_button,
+ GDI_EVENT_MASK, event_mask,
+ GDI_CALLBACK_ACTION, HandleToolButtons,
+ GDI_END);
+
+ if (gi == NULL)
+ Fail("cannot create gadget");
+
+ tool_gadget[id] = gi;
+ }
+}
+
+void FreeToolButtons(void)
+{
+ int i;
+
+ for (i = 0; i < NUM_TOOL_BUTTONS; i++)
+ FreeGadget(tool_gadget[i]);
+}
+
+static void MapToolButtons(unsigned int req_state)
+{
+ if (req_state & REQ_ASK)
+ {
+ MapGadget(tool_gadget[TOOL_CTRL_ID_YES]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_NO]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_YES]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_NO]);
+ }
+ else if (req_state & REQ_CONFIRM)
+ {
+ MapGadget(tool_gadget[TOOL_CTRL_ID_CONFIRM]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_TOUCH_CONFIRM]);
+ }
+ else if (req_state & REQ_PLAYER)
+ {
+ MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_1]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_2]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_3]);
+ MapGadget(tool_gadget[TOOL_CTRL_ID_PLAYER_4]);
+ }
+}
+
+static void UnmapToolButtons(void)
+{
+ int i;
+
+ for (i = 0; i < NUM_TOOL_BUTTONS; i++)
+ UnmapGadget(tool_gadget[i]);
+}
+
+static void HandleToolButtons(struct GadgetInfo *gi)
+{
+ request_gadget_id = gi->custom_id;
+}
+
+static int getEngineElement_Ext(int element, int game_engine_type, boolean is_drawing_element)
+{
+ int el_empty;
+ int el_player;
+ int el_sand;
+ int el_wall;
+ int el_steelwall;
+ int el_exit_closed;
+
+ if (game_engine_type == -1)
+ game_engine_type = level.game_engine_type;
+
+ if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ {
+ el_empty = EL_EMPTY;
+ el_player = EL_BDX_PLAYER;
+ el_sand = EL_BDX_SAND_1;
+ el_wall = EL_BDX_WALL;
+ el_steelwall = EL_BDX_STEELWALL;
+ el_exit_closed = EL_BDX_EXIT_CLOSED;
+ }
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ {
+ el_empty = EL_EMPTY;
+ el_player = EL_PLAYER_1;
+ el_sand = EL_SAND;
+ el_wall = EL_WALL;
+ el_steelwall = EL_STEELWALL;
+ el_exit_closed = EL_EM_EXIT_CLOSED;
+ }
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+ {
+ el_empty = EL_EMPTY;
+ el_player = EL_SP_MURPHY;
+ el_sand = EL_SP_BASE;
+ el_wall = EL_SP_CHIP_SINGLE;
+ el_steelwall = EL_SP_HARDWARE_GRAY;
+ el_exit_closed = EL_SP_EXIT_CLOSED;
+ }
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_MM)
+ {
+ el_empty = EL_EMPTY;
+ el_player = EL_MM_MCDUFFIN_DOWN;
+ el_sand = EL_EMPTY;
+ el_wall = EL_MM_WOODEN_WALL;
+ el_steelwall = EL_MM_STEEL_WALL;
+ el_exit_closed = EL_MM_EXIT_CLOSED;
+
+ if (is_drawing_element)
+ {
+ el_wall = EL_MM_MIRROR_START;
+ el_sand = EL_MM_WOODEN_WALL;
+ }
+ }
+ else
+ {
+ el_empty = EL_EMPTY;
+ el_player = EL_PLAYER_1;
+ el_sand = EL_SAND;
+ el_wall = EL_WALL;
+ el_steelwall = EL_STEELWALL;
+ el_exit_closed = EL_EXIT_CLOSED;
+ }
+
+ return (element == EL_EMPTY ? el_empty :
+ element == EL_PLAYER_1 ? el_player :
+ element == EL_SAND ? el_sand :
+ element == EL_WALL ? el_wall :
+ element == EL_STEELWALL ? el_steelwall :
+ element == EL_EXIT_CLOSED ? el_exit_closed : EL_EMPTY);
+}
+
+int getEngineElement(int element)
+{
+ return getEngineElement_Ext(element, -1, FALSE);
+}
+
+int getDrawingElement(int element)
+{
+ return getEngineElement_Ext(element, -1, TRUE);
+}
+
+static struct Mapping_BD_to_RND_object
+{
+ int element_bd;
+ boolean is_rnd_to_bd_mapping; // unique mapping BD <-> RND
+
+ int element_rnd;
+ int action;
+ int direction;
+}
+bd_object_mapping_list[] =
+{
+ // additional RND style elements mapped to BD style elements (must be listed first)
+
+ {
+ O_DIRT, TRUE,
+ EL_SAND, -1, -1
+ },
+ {
+ O_STONE, TRUE,
+ EL_BD_ROCK, -1, -1
+ },
+ {
+ O_BRICK, TRUE,
+ EL_BD_WALL, -1, -1
+ },
+ {
+ O_STEEL, TRUE,
+ EL_STEELWALL, -1, -1
+ },
+ {
+ O_DIAMOND, TRUE,
+ EL_BD_DIAMOND, -1, -1
+ },
+ {
+ O_INBOX, TRUE,
+ EL_PLAYER_1, -1, -1
+ },
+ {
+ O_INBOX, TRUE,
+ EL_PLAYER_2, -1, -1
+ },
+ {
+ O_INBOX, TRUE,
+ EL_PLAYER_3, -1, -1
+ },
+ {
+ O_INBOX, TRUE,
+ EL_PLAYER_4, -1, -1
+ },
+ {
+ O_PRE_OUTBOX, TRUE,
+ EL_EXIT_CLOSED, -1, -1
+ },
+
+ // BD style elements with their corresponding RND style elements
+
+ {
+ O_SPACE, TRUE,
+ EL_EMPTY, -1, -1
+ },
+ {
+ O_DIRT, TRUE,
+ EL_BDX_SAND_1, -1, -1
+ },
+ {
+ O_DIRT_SLOPED_UP_RIGHT, TRUE,
+ EL_BDX_SAND_SLOPED_UP_RIGHT, -1, -1
+ },
+ {
+ O_DIRT_SLOPED_UP_LEFT, TRUE,
+ EL_BDX_SAND_SLOPED_UP_LEFT, -1, -1
+ },
+ {
+ O_DIRT_SLOPED_DOWN_LEFT, TRUE,
+ EL_BDX_SAND_SLOPED_DOWN_LEFT, -1, -1
+ },
+ {
+ O_DIRT_SLOPED_DOWN_RIGHT, TRUE,
+ EL_BDX_SAND_SLOPED_DOWN_RIGHT, -1, -1
+ },
+ {
+ O_DIRT_BALL, TRUE,
+ EL_BDX_SAND_BALL, -1, -1
+ },
+ {
+ O_DIRT_BALL_F, TRUE,
+ EL_BDX_SAND_BALL_FALLING, -1, -1
+ },
+ {
+ O_DIRT_BALL_F, FALSE,
+ EL_BDX_SAND_BALL, ACTION_FALLING, -1
+ },
+ {
+ O_DIRT_LOOSE, TRUE,
+ EL_BDX_SAND_LOOSE, -1, -1
+ },
+ {
+ O_DIRT_LOOSE_F, TRUE,
+ EL_BDX_SAND_LOOSE_FALLING, -1, -1
+ },
+ {
+ O_DIRT_LOOSE_F, FALSE,
+ EL_BDX_SAND_LOOSE, ACTION_FALLING, -1
+ },
+ {
+ O_DIRT2, TRUE,
+ EL_BDX_SAND_2, -1, -1
+ },
+ {
+ O_BRICK, TRUE,
+ EL_BDX_WALL, -1, -1
+ },
+ {
+ O_BRICK_SLOPED_UP_RIGHT, TRUE,
+ EL_BDX_WALL_SLOPED_UP_RIGHT, -1, -1
+ },
+ {
+ O_BRICK_SLOPED_UP_LEFT, TRUE,
+ EL_BDX_WALL_SLOPED_UP_LEFT, -1, -1
+ },
+ {
+ O_BRICK_SLOPED_DOWN_LEFT, TRUE,
+ EL_BDX_WALL_SLOPED_DOWN_LEFT, -1, -1
+ },
+ {
+ O_BRICK_SLOPED_DOWN_RIGHT, TRUE,
+ EL_BDX_WALL_SLOPED_DOWN_RIGHT, -1, -1
+ },
+ {
+ O_BRICK_NON_SLOPED, TRUE,
+ EL_BDX_WALL_NON_SLOPED, -1, -1
+ },
+ {
+ O_MAGIC_WALL, TRUE,
+ EL_BDX_MAGIC_WALL, ACTION_ACTIVE, -1
+ },
+ {
+ O_PRE_OUTBOX, TRUE,
+ EL_BDX_EXIT_CLOSED, -1, -1
+ },
+ {
+ O_OUTBOX, TRUE,
+ EL_BDX_EXIT_OPEN, -1, -1
+ },
+ {
+ O_PRE_INVIS_OUTBOX, TRUE,
+ EL_BDX_INVISIBLE_EXIT_CLOSED, -1, -1
+ },
+ {
+ O_INVIS_OUTBOX, TRUE,
+ EL_BDX_INVISIBLE_EXIT_OPEN, -1, -1
+ },
+ {
+ O_STEEL, TRUE,
+ EL_BDX_STEELWALL, -1, -1
+ },
+ {
+ O_STEEL_SLOPED_UP_RIGHT, TRUE,
+ EL_BDX_STEELWALL_SLOPED_UP_RIGHT, -1, -1
+ },
+ {
+ O_STEEL_SLOPED_UP_LEFT, TRUE,
+ EL_BDX_STEELWALL_SLOPED_UP_LEFT, -1, -1
+ },
+ {
+ O_STEEL_SLOPED_DOWN_LEFT, TRUE,
+ EL_BDX_STEELWALL_SLOPED_DOWN_LEFT, -1, -1
+ },
+ {
+ O_STEEL_SLOPED_DOWN_RIGHT, TRUE,
+ EL_BDX_STEELWALL_SLOPED_DOWN_RIGHT, -1, -1
+ },
+ {
+ O_STEEL_EXPLODABLE, TRUE,
+ EL_BDX_STEELWALL_EXPLODABLE, -1, -1
+ },
+ {
+ O_STEEL_EATABLE, TRUE,
+ EL_BDX_STEELWALL_DIGGABLE, -1, -1
+ },
+ {
+ O_BRICK_EATABLE, TRUE,
+ EL_BDX_WALL_DIGGABLE, -1, -1
+ },
+ {
+ O_STONE, TRUE,
+ EL_BDX_ROCK, -1, -1
+ },
+ {
+ O_STONE_F, TRUE,
+ EL_BDX_ROCK_FALLING, -1, -1
+ },
+ {
+ O_STONE_F, FALSE,
+ EL_BDX_ROCK, ACTION_FALLING, -1
+ },
+ {
+ O_FLYING_STONE, TRUE,
+ EL_BDX_FLYING_ROCK, -1, -1
+ },
+ {
+ O_FLYING_STONE_F, TRUE,
+ EL_BDX_FLYING_ROCK_FLYING, -1, -1
+ },
+ {
+ O_FLYING_STONE_F, FALSE,
+ EL_BDX_FLYING_ROCK, ACTION_FLYING, -1
+ },
+ {
+ O_MEGA_STONE, TRUE,
+ EL_BDX_MEGA_ROCK, -1, -1
+ },
+ {
+ O_MEGA_STONE_F, TRUE,
+ EL_BDX_MEGA_ROCK_FALLING, -1, -1
+ },
+ {
+ O_MEGA_STONE_F, FALSE,
+ EL_BDX_MEGA_ROCK, ACTION_FALLING, -1
+ },
+ {
+ O_DIAMOND, TRUE,
+ EL_BDX_DIAMOND, -1, -1
+ },
+ {
+ O_DIAMOND_F, TRUE,
+ EL_BDX_DIAMOND_FALLING, -1, -1
+ },
+ {
+ O_DIAMOND_F, FALSE,
+ EL_BDX_DIAMOND, ACTION_FALLING, -1
+ },
+ {
+ O_FLYING_DIAMOND, TRUE,
+ EL_BDX_FLYING_DIAMOND, -1, -1
+ },
+ {
+ O_FLYING_DIAMOND_F, TRUE,
+ EL_BDX_FLYING_DIAMOND_FLYING, -1, -1
+ },
+ {
+ O_FLYING_DIAMOND_F, FALSE,
+ EL_BDX_FLYING_DIAMOND, ACTION_FLYING, -1
+ },
+ {
+ O_NUT, TRUE,
+ EL_BDX_NUT, -1, -1
+ },
+ {
+ O_NUT_F, TRUE,
+ EL_BDX_NUT_FALLING, -1, -1
+ },
+ {
+ O_NUT_F, FALSE,
+ EL_BDX_NUT, ACTION_FALLING, -1
+ },
+ {
+ O_BLADDER_SPENDER, TRUE,
+ EL_BDX_TRAPPED_BUBBLE, -1, -1
+ },
+ {
+ O_INBOX, TRUE,
+ EL_BDX_INBOX, -1, -1
+ },
+ {
+ O_H_EXPANDING_WALL, TRUE,
+ EL_BDX_EXPANDABLE_WALL_HORIZONTAL, -1, -1
+ },
+ {
+ O_V_EXPANDING_WALL, TRUE,
+ EL_BDX_EXPANDABLE_WALL_VERTICAL, -1, -1
+ },
+ {
+ O_EXPANDING_WALL, TRUE,
+ EL_BDX_EXPANDABLE_WALL_ANY, -1, -1
+ },
+ {
+ O_H_EXPANDING_STEEL_WALL, TRUE,
+ EL_BDX_EXPANDABLE_STEELWALL_HORIZONTAL, -1, -1
+ },
+ {
+ O_V_EXPANDING_STEEL_WALL, TRUE,
+ EL_BDX_EXPANDABLE_STEELWALL_VERTICAL, -1, -1
+ },
+ {
+ O_EXPANDING_STEEL_WALL, TRUE,
+ EL_BDX_EXPANDABLE_STEELWALL_ANY, -1, -1
+ },
+ {
+ O_EXPANDING_WALL_SWITCH, TRUE,
+ EL_BDX_EXPANDABLE_WALL_SWITCH, -1, -1
+ },
+ {
+ O_CREATURE_SWITCH, TRUE,
+ EL_BDX_CREATURE_SWITCH, -1, -1
+ },
+ {
+ O_BITER_SWITCH, TRUE,
+ EL_BDX_BITER_SWITCH_1, -1, -1
+ },
+ {
+ O_REPLICATOR_SWITCH, TRUE,
+ EL_BDX_REPLICATOR_SWITCH, -1, -1
+ },
+ {
+ O_CONVEYOR_SWITCH, TRUE,
+ EL_BDX_CONVEYOR_SWITCH, -1, -1
+ },
+ {
+ O_CONVEYOR_DIR_SWITCH, TRUE,
+ EL_BDX_CONVEYOR_DIR_SWITCH, -1, -1
+ },
+ {
+ O_ACID, TRUE,
+ EL_BDX_ACID, -1, -1
+ },
+ {
+ O_FALLING_WALL, TRUE,
+ EL_BDX_FALLING_WALL, -1, -1
+ },
+ {
+ O_FALLING_WALL_F, TRUE,
+ EL_BDX_FALLING_WALL_FALLING, -1, -1
+ },
+ {
+ O_FALLING_WALL_F, FALSE,
+ EL_BDX_FALLING_WALL, ACTION_FALLING, -1
+ },
+ {
+ O_BOX, TRUE,
+ EL_BDX_BOX, -1, -1
+ },
+ {
+ O_TIME_PENALTY, TRUE,
+ EL_BDX_TIME_PENALTY, -1, -1
+ },
+ {
+ O_GRAVESTONE, TRUE,
+ EL_BDX_GRAVESTONE, -1, -1
+ },
+ {
+ O_STONE_GLUED, TRUE,
+ EL_BDX_ROCK_GLUED, -1, -1
+ },
+ {
+ O_DIAMOND_GLUED, TRUE,
+ EL_BDX_DIAMOND_GLUED, -1, -1
+ },
+ {
+ O_DIAMOND_KEY, TRUE,
+ EL_BDX_DIAMOND_KEY, -1, -1
+ },
+ {
+ O_TRAPPED_DIAMOND, TRUE,
+ EL_BDX_TRAPPED_DIAMOND, -1, -1
+ },
+ {
+ O_CLOCK, TRUE,
+ EL_BDX_CLOCK, -1, -1
+ },
+ {
+ O_DIRT_GLUED, TRUE,
+ EL_BDX_SAND_GLUED, -1, -1
+ },
+ {
+ O_KEY_1, TRUE,
+ EL_BDX_KEY_1, -1, -1
+ },
+ {
+ O_KEY_2, TRUE,
+ EL_BDX_KEY_2, -1, -1
+ },
+ {
+ O_KEY_3, TRUE,
+ EL_BDX_KEY_3, -1, -1
+ },
+ {
+ O_DOOR_1, TRUE,
+ EL_BDX_GATE_1, -1, -1
+ },
+ {
+ O_DOOR_2, TRUE,
+ EL_BDX_GATE_2, -1, -1
+ },
+ {
+ O_DOOR_3, TRUE,
+ EL_BDX_GATE_3, -1, -1
+ },
+ {
+ O_POT, TRUE,
+ EL_BDX_POT, -1, -1
+ },
+ {
+ O_GRAVITY_SWITCH, TRUE,
+ EL_BDX_GRAVITY_SWITCH, -1, -1
+ },
+ {
+ O_PNEUMATIC_HAMMER, TRUE,
+ EL_BDX_PNEUMATIC_HAMMER, -1, -1
+ },
+ {
+ O_TELEPORTER, TRUE,
+ EL_BDX_TELEPORTER, -1, -1
+ },
+ {
+ O_SKELETON, TRUE,
+ EL_BDX_SKELETON, -1, -1
+ },
+ {
+ O_WATER, TRUE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_1, TRUE,
+ EL_BDX_WATER_1, -1, -1
+ },
+ {
+ O_WATER_1, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_2, TRUE,
+ EL_BDX_WATER_2, -1, -1
+ },
+ {
+ O_WATER_2, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_3, TRUE,
+ EL_BDX_WATER_3, -1, -1
+ },
+ {
+ O_WATER_3, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_4, TRUE,
+ EL_BDX_WATER_4, -1, -1
+ },
+ {
+ O_WATER_4, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_5, TRUE,
+ EL_BDX_WATER_5, -1, -1
+ },
+ {
+ O_WATER_5, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_6, TRUE,
+ EL_BDX_WATER_6, -1, -1
+ },
+ {
+ O_WATER_6, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_7, TRUE,
+ EL_BDX_WATER_7, -1, -1
+ },
+ {
+ O_WATER_7, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_8, TRUE,
+ EL_BDX_WATER_8, -1, -1
+ },
+ {
+ O_WATER_8, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_9, TRUE,
+ EL_BDX_WATER_9, -1, -1
+ },
+ {
+ O_WATER_9, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_10, TRUE,
+ EL_BDX_WATER_10, -1, -1
+ },
+ {
+ O_WATER_10, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_11, TRUE,
+ EL_BDX_WATER_11, -1, -1
+ },
+ {
+ O_WATER_11, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_12, TRUE,
+ EL_BDX_WATER_12, -1, -1
+ },
+ {
+ O_WATER_12, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_13, TRUE,
+ EL_BDX_WATER_13, -1, -1
+ },
+ {
+ O_WATER_13, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_14, TRUE,
+ EL_BDX_WATER_14, -1, -1
+ },
+ {
+ O_WATER_14, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_15, TRUE,
+ EL_BDX_WATER_15, -1, -1
+ },
+ {
+ O_WATER_15, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_WATER_16, TRUE,
+ EL_BDX_WATER_16, -1, -1
+ },
+ {
+ O_WATER_16, FALSE,
+ EL_BDX_WATER, -1, -1
+ },
+ {
+ O_COW_1, TRUE,
+ EL_BDX_COW_LEFT, -1, -1
+ },
+ {
+ O_COW_2, TRUE,
+ EL_BDX_COW_UP, -1, -1
+ },
+ {
+ O_COW_3, TRUE,
+ EL_BDX_COW_RIGHT, -1, -1
+ },
+ {
+ O_COW_4, TRUE,
+ EL_BDX_COW_DOWN, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_1, TRUE,
+ EL_BDX_COW_ENCLOSED_1, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_1, FALSE,
+ EL_BDX_COW_DOWN, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_2, TRUE,
+ EL_BDX_COW_ENCLOSED_2, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_2, FALSE,
+ EL_BDX_COW_DOWN, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_3, TRUE,
+ EL_BDX_COW_ENCLOSED_3, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_3, FALSE,
+ EL_BDX_COW_DOWN, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_4, TRUE,
+ EL_BDX_COW_ENCLOSED_4, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_4, FALSE,
+ EL_BDX_COW_DOWN, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_5, TRUE,
+ EL_BDX_COW_ENCLOSED_5, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_5, FALSE,
+ EL_BDX_COW_DOWN, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_6, TRUE,
+ EL_BDX_COW_ENCLOSED_6, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_6, FALSE,
+ EL_BDX_COW_DOWN, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_7, TRUE,
+ EL_BDX_COW_ENCLOSED_7, -1, -1
+ },
+ {
+ O_COW_ENCLOSED_7, FALSE,
+ EL_BDX_COW_DOWN, -1, -1
+ },
+ {
+ O_WALLED_DIAMOND, TRUE,
+ EL_BDX_WALL_DIAMOND, -1, -1
+ },
+ {
+ O_WALLED_KEY_1, TRUE,
+ EL_BDX_WALL_KEY_1, -1, -1
+ },
+ {
+ O_WALLED_KEY_2, TRUE,
+ EL_BDX_WALL_KEY_2, -1, -1
+ },
+ {
+ O_WALLED_KEY_3, TRUE,
+ EL_BDX_WALL_KEY_3, -1, -1
+ },
+ {
+ O_AMOEBA, TRUE,
+ EL_BDX_AMOEBA_1, -1, -1
+ },
+ {
+ O_AMOEBA_2, TRUE,
+ EL_BDX_AMOEBA_2, -1, -1
+ },
+ {
+ O_REPLICATOR, TRUE,
+ EL_BDX_REPLICATOR, -1, -1
+ },
+ {
+ O_CONVEYOR_LEFT, TRUE,
+ EL_BDX_CONVEYOR_LEFT, -1, -1
+ },
+ {
+ O_CONVEYOR_RIGHT, TRUE,
+ EL_BDX_CONVEYOR_RIGHT, -1, -1
+ },
+ {
+ O_LAVA, TRUE,
+ EL_BDX_LAVA, -1, -1
+ },
+ {
+ O_SWEET, TRUE,
+ EL_BDX_SWEET, -1, -1
+ },
+ {
+ O_VOODOO, TRUE,
+ EL_BDX_VOODOO_DOLL, -1, -1
+ },
+ {
+ O_SLIME, TRUE,
+ EL_BDX_SLIME, -1, -1
+ },
+ {
+ O_BLADDER, TRUE,
+ EL_BDX_BUBBLE, -1, -1
+ },
+ {
+ O_BLADDER_1, TRUE,
+ EL_BDX_BUBBLE_1, -1, -1
+ },
+ {
+ O_BLADDER_1, FALSE,
+ EL_BDX_BUBBLE, -1, -1
+ },
+ {
+ O_BLADDER_2, TRUE,
+ EL_BDX_BUBBLE_2, -1, -1
+ },
+ {
+ O_BLADDER_2, FALSE,
+ EL_BDX_BUBBLE, -1, -1
+ },
+ {
+ O_BLADDER_3, TRUE,
+ EL_BDX_BUBBLE_3, -1, -1
+ },
+ {
+ O_BLADDER_3, FALSE,
+ EL_BDX_BUBBLE, -1, -1
+ },
+ {
+ O_BLADDER_4, TRUE,
+ EL_BDX_BUBBLE_4, -1, -1
+ },
+ {
+ O_BLADDER_4, FALSE,
+ EL_BDX_BUBBLE, -1, -1
+ },
+ {
+ O_BLADDER_5, TRUE,
+ EL_BDX_BUBBLE_5, -1, -1
+ },
+ {
+ O_BLADDER_5, FALSE,
+ EL_BDX_BUBBLE, -1, -1
+ },
+ {
+ O_BLADDER_6, TRUE,
+ EL_BDX_BUBBLE_6, -1, -1
+ },
+ {
+ O_BLADDER_6, FALSE,
+ EL_BDX_BUBBLE, -1, -1
+ },
+ {
+ O_BLADDER_7, TRUE,
+ EL_BDX_BUBBLE_7, -1, -1
+ },
+ {
+ O_BLADDER_7, FALSE,
+ EL_BDX_BUBBLE, -1, -1
+ },
+ {
+ O_BLADDER_8, TRUE,
+ EL_BDX_BUBBLE_8, -1, -1
+ },
+ {
+ O_BLADDER_8, FALSE,
+ EL_BDX_BUBBLE, -1, -1
+ },
+ {
+ O_WAITING_STONE, TRUE,
+ EL_BDX_WAITING_ROCK, -1, -1
+ },
+ {
+ O_CHASING_STONE, TRUE,
+ EL_BDX_CHASING_ROCK, -1, -1
+ },
+ {
+ O_GHOST, TRUE,
+ EL_BDX_GHOST, -1, -1
+ },
+ {
+ O_FIREFLY_1, TRUE,
+ EL_BDX_FIREFLY_1_LEFT, -1, -1
+ },
+ {
+ O_FIREFLY_2, TRUE,
+ EL_BDX_FIREFLY_1_UP, -1, -1
+ },
+ {
+ O_FIREFLY_3, TRUE,
+ EL_BDX_FIREFLY_1_RIGHT, -1, -1
+ },
+ {
+ O_FIREFLY_4, TRUE,
+ EL_BDX_FIREFLY_1_DOWN, -1, -1
+ },
+ {
+ O_ALT_FIREFLY_1, TRUE,
+ EL_BDX_FIREFLY_2_LEFT, -1, -1
+ },
+ {
+ O_ALT_FIREFLY_2, TRUE,
+ EL_BDX_FIREFLY_2_UP, -1, -1
+ },
+ {
+ O_ALT_FIREFLY_3, TRUE,
+ EL_BDX_FIREFLY_2_RIGHT, -1, -1
+ },
+ {
+ O_ALT_FIREFLY_4, TRUE,
+ EL_BDX_FIREFLY_2_DOWN, -1, -1
+ },
+ {
+ O_BUTTER_1, TRUE,
+ EL_BDX_BUTTERFLY_1_LEFT, -1, -1
+ },
+ {
+ O_BUTTER_2, TRUE,
+ EL_BDX_BUTTERFLY_1_UP, -1, -1
+ },
+ {
+ O_BUTTER_3, TRUE,
+ EL_BDX_BUTTERFLY_1_RIGHT, -1, -1
+ },
+ {
+ O_BUTTER_4, TRUE,
+ EL_BDX_BUTTERFLY_1_DOWN, -1, -1
+ },
+ {
+ O_ALT_BUTTER_1, TRUE,
+ EL_BDX_BUTTERFLY_2_LEFT, -1, -1
+ },
+ {
+ O_ALT_BUTTER_2, TRUE,
+ EL_BDX_BUTTERFLY_2_UP, -1, -1
+ },
+ {
+ O_ALT_BUTTER_3, TRUE,
+ EL_BDX_BUTTERFLY_2_RIGHT, -1, -1
+ },
+ {
+ O_ALT_BUTTER_4, TRUE,
+ EL_BDX_BUTTERFLY_2_DOWN, -1, -1
+ },
+ {
+ O_STONEFLY_1, TRUE,
+ EL_BDX_STONEFLY_LEFT, -1, -1
+ },
+ {
+ O_STONEFLY_2, TRUE,
+ EL_BDX_STONEFLY_UP, -1, -1
+ },
+ {
+ O_STONEFLY_3, TRUE,
+ EL_BDX_STONEFLY_RIGHT, -1, -1
+ },
+ {
+ O_STONEFLY_4, TRUE,
+ EL_BDX_STONEFLY_DOWN, -1, -1
+ },
+ {
+ O_BITER_1, TRUE,
+ EL_BDX_BITER_UP, -1, -1
+ },
+ {
+ O_BITER_2, TRUE,
+ EL_BDX_BITER_RIGHT, -1, -1
+ },
+ {
+ O_BITER_3, TRUE,
+ EL_BDX_BITER_DOWN, -1, -1
+ },
+ {
+ O_BITER_4, TRUE,
+ EL_BDX_BITER_LEFT, -1, -1
+ },
+ {
+ O_DRAGONFLY_1, TRUE,
+ EL_BDX_DRAGONFLY_LEFT, -1, -1
+ },
+ {
+ O_DRAGONFLY_2, TRUE,
+ EL_BDX_DRAGONFLY_UP, -1, -1
+ },
+ {
+ O_DRAGONFLY_3, TRUE,
+ EL_BDX_DRAGONFLY_RIGHT, -1, -1
+ },
+ {
+ O_DRAGONFLY_4, TRUE,
+ EL_BDX_DRAGONFLY_DOWN, -1, -1
+ },
+ {
+ O_PRE_PL_1, TRUE,
+ EL_BDX_PLAYER_GROWING_1, -1, -1
+ },
+ {
+ O_PRE_PL_1, FALSE,
+ EL_BDX_PLAYER, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_PL_2, TRUE,
+ EL_BDX_PLAYER_GROWING_2, -1, -1
+ },
+ {
+ O_PRE_PL_2, FALSE,
+ EL_BDX_PLAYER, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_PL_3, TRUE,
+ EL_BDX_PLAYER_GROWING_3, -1, -1
+ },
+ {
+ O_PRE_PL_3, FALSE,
+ EL_BDX_PLAYER, ACTION_GROWING, -1
+ },
+ {
+ O_PLAYER, TRUE,
+ EL_BDX_PLAYER, -1, -1
+ },
+ {
+ O_PLAYER_BOMB, TRUE,
+ EL_BDX_PLAYER_WITH_BOMB, -1, -1
+ },
+ {
+ O_PLAYER_ROCKET_LAUNCHER, TRUE,
+ EL_BDX_PLAYER_WITH_ROCKET_LAUNCHER, -1, -1
+ },
+ {
+ O_PLAYER_GLUED, TRUE,
+ EL_BDX_PLAYER_GLUED, -1, -1
+ },
+ {
+ O_PLAYER_STIRRING, TRUE,
+ EL_BDX_PLAYER_STIRRING, -1, -1
+ },
+ {
+ O_ROCKET_LAUNCHER, TRUE,
+ EL_BDX_ROCKET_LAUNCHER, -1, -1
+ },
+ {
+ O_ROCKET_1, TRUE,
+ EL_BDX_ROCKET_RIGHT, -1, -1
+ },
+ {
+ O_ROCKET_2, TRUE,
+ EL_BDX_ROCKET_UP, -1, -1
+ },
+ {
+ O_ROCKET_3, TRUE,
+ EL_BDX_ROCKET_LEFT, -1, -1
+ },
+ {
+ O_ROCKET_4, TRUE,
+ EL_BDX_ROCKET_DOWN, -1, -1
+ },
+ {
+ O_BOMB, TRUE,
+ EL_BDX_BOMB, -1, -1
+ },
+ {
+ O_BOMB_TICK_1, TRUE,
+ EL_BDX_BOMB_TICKING_1, -1, -1
+ },
+ {
+ O_BOMB_TICK_1, FALSE,
+ EL_BDX_BOMB, ACTION_ACTIVE, -1
+ },
+ {
+ O_BOMB_TICK_2, TRUE,
+ EL_BDX_BOMB_TICKING_2, -1, -1
+ },
+ {
+ O_BOMB_TICK_2, FALSE,
+ EL_BDX_BOMB, ACTION_ACTIVE, -1
+ },
+ {
+ O_BOMB_TICK_3, TRUE,
+ EL_BDX_BOMB_TICKING_3, -1, -1
+ },
+ {
+ O_BOMB_TICK_3, FALSE,
+ EL_BDX_BOMB, ACTION_ACTIVE, -1
+ },
+ {
+ O_BOMB_TICK_4, TRUE,
+ EL_BDX_BOMB_TICKING_4, -1, -1
+ },
+ {
+ O_BOMB_TICK_4, FALSE,
+ EL_BDX_BOMB, ACTION_ACTIVE, -1
+ },
+ {
+ O_BOMB_TICK_5, TRUE,
+ EL_BDX_BOMB_TICKING_5, -1, -1
+ },
+ {
+ O_BOMB_TICK_5, FALSE,
+ EL_BDX_BOMB, ACTION_ACTIVE, -1
+ },
+ {
+ O_BOMB_TICK_6, TRUE,
+ EL_BDX_BOMB_TICKING_6, -1, -1
+ },
+ {
+ O_BOMB_TICK_6, FALSE,
+ EL_BDX_BOMB, ACTION_ACTIVE, -1
+ },
+ {
+ O_BOMB_TICK_7, TRUE,
+ EL_BDX_BOMB_TICKING_7, -1, -1
+ },
+ {
+ O_BOMB_TICK_7, FALSE,
+ EL_BDX_BOMB, ACTION_ACTIVE, -1
+ },
+ {
+ O_NITRO_PACK, TRUE,
+ EL_BDX_NITRO_PACK, -1, -1
+ },
+ {
+ O_NITRO_PACK_F, TRUE,
+ EL_BDX_NITRO_PACK_FALLING, -1, -1
+ },
+ {
+ O_NITRO_PACK_F, FALSE,
+ EL_BDX_NITRO_PACK, ACTION_FALLING, -1
+ },
+ {
+ O_PRE_CLOCK_1, TRUE,
+ EL_BDX_CLOCK_GROWING_1, -1, -1
+ },
+ {
+ O_PRE_CLOCK_1, FALSE,
+ EL_BDX_CLOCK, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_CLOCK_2, TRUE,
+ EL_BDX_CLOCK_GROWING_2, -1, -1
+ },
+ {
+ O_PRE_CLOCK_2, FALSE,
+ EL_BDX_CLOCK, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_CLOCK_3, TRUE,
+ EL_BDX_CLOCK_GROWING_3, -1, -1
+ },
+ {
+ O_PRE_CLOCK_3, FALSE,
+ EL_BDX_CLOCK, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_CLOCK_4, TRUE,
+ EL_BDX_CLOCK_GROWING_4, -1, -1
+ },
+ {
+ O_PRE_CLOCK_4, FALSE,
+ EL_BDX_CLOCK, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_DIA_1, TRUE,
+ EL_BDX_DIAMOND_GROWING_1, -1, -1
+ },
+ {
+ O_PRE_DIA_1, FALSE,
+ EL_BDX_DIAMOND, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_DIA_2, TRUE,
+ EL_BDX_DIAMOND_GROWING_2, -1, -1
+ },
+ {
+ O_PRE_DIA_2, FALSE,
+ EL_BDX_DIAMOND, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_DIA_3, TRUE,
+ EL_BDX_DIAMOND_GROWING_3, -1, -1
+ },
+ {
+ O_PRE_DIA_3, FALSE,
+ EL_BDX_DIAMOND, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_DIA_4, TRUE,
+ EL_BDX_DIAMOND_GROWING_4, -1, -1
+ },
+ {
+ O_PRE_DIA_4, FALSE,
+ EL_BDX_DIAMOND, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_DIA_5, TRUE,
+ EL_BDX_DIAMOND_GROWING_5, -1, -1
+ },
+ {
+ O_PRE_DIA_5, FALSE,
+ EL_BDX_DIAMOND, ACTION_GROWING, -1
+ },
+ {
+ O_EXPLODE_1, TRUE,
+ EL_BDX_EXPLODING_1, -1, -1
+ },
+ {
+ O_EXPLODE_1, FALSE,
+ EL_BDX_DEFAULT, ACTION_EXPLODING, -1
+ },
+ {
+ O_EXPLODE_2, TRUE,
+ EL_BDX_EXPLODING_2, -1, -1
+ },
+ {
+ O_EXPLODE_2, FALSE,
+ EL_BDX_DEFAULT, ACTION_EXPLODING, -1
+ },
+ {
+ O_EXPLODE_3, TRUE,
+ EL_BDX_EXPLODING_3, -1, -1
+ },
+ {
+ O_EXPLODE_3, FALSE,
+ EL_BDX_DEFAULT, ACTION_EXPLODING, -1
+ },
+ {
+ O_EXPLODE_4, TRUE,
+ EL_BDX_EXPLODING_4, -1, -1
+ },
+ {
+ O_EXPLODE_4, FALSE,
+ EL_BDX_DEFAULT, ACTION_EXPLODING, -1
+ },
+ {
+ O_EXPLODE_5, TRUE,
+ EL_BDX_EXPLODING_5, -1, -1
+ },
+ {
+ O_EXPLODE_5, FALSE,
+ EL_BDX_DEFAULT, ACTION_EXPLODING, -1
+ },
+ {
+ O_PRE_STONE_1, TRUE,
+ EL_BDX_ROCK_GROWING_1, -1, -1
+ },
+ {
+ O_PRE_STONE_1, FALSE,
+ EL_BDX_ROCK, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_STONE_2, TRUE,
+ EL_BDX_ROCK_GROWING_2, -1, -1
+ },
+ {
+ O_PRE_STONE_2, FALSE,
+ EL_BDX_ROCK, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_STONE_3, TRUE,
+ EL_BDX_ROCK_GROWING_3, -1, -1
+ },
+ {
+ O_PRE_STONE_3, FALSE,
+ EL_BDX_ROCK, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_STONE_4, TRUE,
+ EL_BDX_ROCK_GROWING_4, -1, -1
+ },
+ {
+ O_PRE_STONE_4, FALSE,
+ EL_BDX_ROCK, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_STEEL_1, TRUE,
+ EL_BDX_STEELWALL_GROWING_1, -1, -1
+ },
+ {
+ O_PRE_STEEL_1, FALSE,
+ EL_BDX_STEELWALL, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_STEEL_2, TRUE,
+ EL_BDX_STEELWALL_GROWING_2, -1, -1
+ },
+ {
+ O_PRE_STEEL_2, FALSE,
+ EL_BDX_STEELWALL, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_STEEL_3, TRUE,
+ EL_BDX_STEELWALL_GROWING_3, -1, -1
+ },
+ {
+ O_PRE_STEEL_3, FALSE,
+ EL_BDX_STEELWALL, ACTION_GROWING, -1
+ },
+ {
+ O_PRE_STEEL_4, TRUE,
+ EL_BDX_STEELWALL_GROWING_4, -1, -1
+ },
+ {
+ O_PRE_STEEL_4, FALSE,
+ EL_BDX_STEELWALL, ACTION_GROWING, -1
+ },
+ {
+ O_GHOST_EXPL_1, TRUE,
+ EL_BDX_GHOST_EXPLODING_1, -1, -1
+ },
+ {
+ O_GHOST_EXPL_1, FALSE,
+ EL_BDX_GHOST, ACTION_EXPLODING, -1
+ },
+ {
+ O_GHOST_EXPL_2, TRUE,
+ EL_BDX_GHOST_EXPLODING_2, -1, -1
+ },
+ {
+ O_GHOST_EXPL_2, FALSE,
+ EL_BDX_GHOST, ACTION_EXPLODING, -1
+ },
+ {
+ O_GHOST_EXPL_3, TRUE,
+ EL_BDX_GHOST_EXPLODING_3, -1, -1
+ },
+ {
+ O_GHOST_EXPL_3, FALSE,
+ EL_BDX_GHOST, ACTION_EXPLODING, -1
+ },
+ {
+ O_GHOST_EXPL_4, TRUE,
+ EL_BDX_GHOST_EXPLODING_4, -1, -1
+ },
+ {
+ O_GHOST_EXPL_4, FALSE,
+ EL_BDX_GHOST, ACTION_EXPLODING, -1
+ },
+ {
+ O_BOMB_EXPL_1, TRUE,
+ EL_BDX_BOMB_EXPLODING_1, -1, -1
+ },
+ {
+ O_BOMB_EXPL_1, FALSE,
+ EL_BDX_BOMB, ACTION_EXPLODING, -1
+ },
+ {
+ O_BOMB_EXPL_2, TRUE,
+ EL_BDX_BOMB_EXPLODING_2, -1, -1
+ },
+ {
+ O_BOMB_EXPL_2, FALSE,
+ EL_BDX_BOMB, ACTION_EXPLODING, -1
+ },
+ {
+ O_BOMB_EXPL_3, TRUE,
+ EL_BDX_BOMB_EXPLODING_3, -1, -1
+ },
+ {
+ O_BOMB_EXPL_3, FALSE,
+ EL_BDX_BOMB, ACTION_EXPLODING, -1
+ },
+ {
+ O_BOMB_EXPL_4, TRUE,
+ EL_BDX_BOMB_EXPLODING_4, -1, -1
+ },
+ {
+ O_BOMB_EXPL_4, FALSE,
+ EL_BDX_BOMB, ACTION_EXPLODING, -1
+ },
+ {
+ O_NITRO_EXPL_1, TRUE,
+ EL_BDX_NITRO_PACK_EXPLODING_1, -1, -1
+ },
+ {
+ O_NITRO_EXPL_1, FALSE,
+ EL_BDX_NITRO_PACK, ACTION_EXPLODING, -1
+ },
+ {
+ O_NITRO_EXPL_2, TRUE,
+ EL_BDX_NITRO_PACK_EXPLODING_2, -1, -1
+ },
+ {
+ O_NITRO_EXPL_2, FALSE,
+ EL_BDX_NITRO_PACK, ACTION_EXPLODING, -1
+ },
+ {
+ O_NITRO_EXPL_3, TRUE,
+ EL_BDX_NITRO_PACK_EXPLODING_3, -1, -1
+ },
+ {
+ O_NITRO_EXPL_3, FALSE,
+ EL_BDX_NITRO_PACK, ACTION_EXPLODING, -1
+ },
+ {
+ O_NITRO_EXPL_4, TRUE,
+ EL_BDX_NITRO_PACK_EXPLODING_4, -1, -1
+ },
+ {
+ O_NITRO_EXPL_4, FALSE,
+ EL_BDX_NITRO_PACK, ACTION_EXPLODING, -1
+ },
+ {
+ O_NITRO_PACK_EXPLODE, TRUE,
+ EL_BDX_NITRO_PACK_EXPLODING, -1, -1
+ },
+ {
+ O_NITRO_PACK_EXPLODE, FALSE,
+ EL_BDX_NITRO_PACK, ACTION_EXPLODING, -1
+ },
+ {
+ O_AMOEBA_2_EXPL_1, TRUE,
+ EL_BDX_AMOEBA_2_EXPLODING_1, -1, -1
+ },
+ {
+ O_AMOEBA_2_EXPL_1, FALSE,
+ EL_BDX_AMOEBA_2, ACTION_EXPLODING, -1
+ },
+ {
+ O_AMOEBA_2_EXPL_2, TRUE,
+ EL_BDX_AMOEBA_2_EXPLODING_2, -1, -1
+ },
+ {
+ O_AMOEBA_2_EXPL_2, FALSE,
+ EL_BDX_AMOEBA_2, ACTION_EXPLODING, -1
+ },
+ {
+ O_AMOEBA_2_EXPL_3, TRUE,
+ EL_BDX_AMOEBA_2_EXPLODING_3, -1, -1
+ },
+ {
+ O_AMOEBA_2_EXPL_3, FALSE,
+ EL_BDX_AMOEBA_2, ACTION_EXPLODING, -1
+ },
+ {
+ O_AMOEBA_2_EXPL_4, TRUE,
+ EL_BDX_AMOEBA_2_EXPLODING_4, -1, -1
+ },
+ {
+ O_AMOEBA_2_EXPL_4, FALSE,
+ EL_BDX_AMOEBA_2, ACTION_EXPLODING, -1
+ },
+ {
+ O_NUT_EXPL_1, TRUE,
+ EL_BDX_NUT_BREAKING_1, -1, -1
+ },
+ {
+ O_NUT_EXPL_1, FALSE,
+ EL_BDX_NUT, ACTION_BREAKING, -1
+ },
+ {
+ O_NUT_EXPL_2, TRUE,
+ EL_BDX_NUT_BREAKING_2, -1, -1
+ },
+ {
+ O_NUT_EXPL_2, FALSE,
+ EL_BDX_NUT, ACTION_BREAKING, -1
+ },
+ {
+ O_NUT_EXPL_3, TRUE,
+ EL_BDX_NUT_BREAKING_3, -1, -1
+ },
+ {
+ O_NUT_EXPL_3, FALSE,
+ EL_BDX_NUT, ACTION_BREAKING, -1
+ },
+ {
+ O_NUT_EXPL_4, TRUE,
+ EL_BDX_NUT_BREAKING_4, -1, -1
+ },
+ {
+ O_NUT_EXPL_4, FALSE,
+ EL_BDX_NUT, ACTION_BREAKING, -1
+ },
+ {
+ O_PLAYER_PNEUMATIC_LEFT, FALSE,
+ EL_BDX_PLAYER, ACTION_HITTING, MV_BIT_LEFT
+ },
+ {
+ O_PLAYER_PNEUMATIC_RIGHT, FALSE,
+ EL_BDX_PLAYER, ACTION_HITTING, MV_BIT_RIGHT
+ },
+ {
+ O_PNEUMATIC_ACTIVE_LEFT, FALSE,
+ EL_BDX_PNEUMATIC_HAMMER, ACTION_HITTING, MV_BIT_LEFT
+ },
+ {
+ O_PNEUMATIC_ACTIVE_RIGHT, FALSE,
+ EL_BDX_PNEUMATIC_HAMMER, ACTION_HITTING, MV_BIT_RIGHT
+ },
+
+ // helper (runtime) elements
+
+ {
+ O_FAKE_BONUS, FALSE,
+ EL_BDX_FAKE_BONUS, -1, -1
+ },
+ {
+ O_INBOX_CLOSED, FALSE,
+ EL_BDX_INBOX, -1, -1
+ },
+ {
+ O_INBOX_OPEN, FALSE,
+ EL_BDX_INBOX, ACTION_OPENING, -1
+ },
+ {
+ O_OUTBOX_CLOSED, FALSE,
+ EL_BDX_EXIT_CLOSED, -1, -1
+ },
+ {
+ O_OUTBOX_OPEN, FALSE,
+ EL_BDX_EXIT_OPEN, -1, -1
+ },
+ {
+ O_COVERED, FALSE,
+ EL_BDX_COVERED, -1, -1
+ },
+ {
+ O_PLAYER_LEFT, FALSE,
+ EL_BDX_PLAYER, ACTION_MOVING, MV_BIT_LEFT
+ },
+ {
+ O_PLAYER_RIGHT, FALSE,
+ EL_BDX_PLAYER, ACTION_MOVING, MV_BIT_RIGHT
+ },
+ {
+ O_PLAYER_UP, FALSE,
+ EL_BDX_PLAYER, ACTION_MOVING, MV_BIT_UP
+ },
+ {
+ O_PLAYER_DOWN, FALSE,
+ EL_BDX_PLAYER, ACTION_MOVING, MV_BIT_DOWN
+ },
+ {
+ O_PLAYER_BLINK, FALSE,
+ EL_BDX_PLAYER, ACTION_BORING_1, -1
+ },
+ {
+ O_PLAYER_TAP, FALSE,
+ EL_BDX_PLAYER, ACTION_BORING_2, -1
+ },
+ {
+ O_PLAYER_TAP_BLINK, FALSE,
+ EL_BDX_PLAYER, ACTION_BORING_3, -1
+ },
+ {
+ O_PLAYER_PUSH_LEFT, FALSE,
+ EL_BDX_PLAYER, ACTION_PUSHING, MV_BIT_LEFT
+ },
+ {
+ O_PLAYER_PUSH_RIGHT, FALSE,
+ EL_BDX_PLAYER, ACTION_PUSHING, MV_BIT_RIGHT
+ },
+ {
+ O_CREATURE_SWITCH_ON, FALSE,
+ EL_BDX_CREATURE_SWITCH_ACTIVE, -1, -1
+ },
+ {
+ O_EXPANDING_WALL_SWITCH_HORIZ, FALSE,
+ EL_BDX_EXPANDABLE_WALL_SWITCH, -1, -1
+ },
+ {
+ O_EXPANDING_WALL_SWITCH_VERT, FALSE,
+ EL_BDX_EXPANDABLE_WALL_SWITCH_ACTIVE, -1, -1
+ },
+ {
+ O_GRAVITY_SWITCH_ACTIVE, FALSE,
+ EL_BDX_GRAVITY_SWITCH_ACTIVE, -1, -1
+ },
+ {
+ O_REPLICATOR_SWITCH_OFF, FALSE,
+ EL_BDX_REPLICATOR_SWITCH, -1, -1
+ },
+ {
+ O_REPLICATOR_SWITCH_ON, FALSE,
+ EL_BDX_REPLICATOR_SWITCH_ACTIVE, -1, -1
+ },
+ {
+ O_CONVEYOR_DIR_NORMAL, FALSE,
+ EL_BDX_CONVEYOR_DIR_SWITCH, -1, -1
+ },
+ {
+ O_CONVEYOR_DIR_CHANGED, FALSE,
+ EL_BDX_CONVEYOR_DIR_SWITCH_ACTIVE, -1, -1
+ },
+ {
+ O_CONVEYOR_SWITCH_OFF, FALSE,
+ EL_BDX_CONVEYOR_SWITCH, -1, -1
+ },
+ {
+ O_CONVEYOR_SWITCH_ON, FALSE,
+ EL_BDX_CONVEYOR_SWITCH_ACTIVE, -1, -1
+ },
+ {
+ O_MAGIC_WALL_ACTIVE, FALSE,
+ EL_BDX_MAGIC_WALL_ACTIVE, -1, -1
+ },
+ {
+ O_REPLICATOR_ACTIVE, FALSE,
+ EL_BDX_REPLICATOR_ACTIVE, -1, -1
+ },
+ {
+ O_CONVEYOR_LEFT_ACTIVE, FALSE,
+ EL_BDX_CONVEYOR_LEFT_ACTIVE, -1, -1
+ },
+ {
+ O_CONVEYOR_RIGHT_ACTIVE, FALSE,
+ EL_BDX_CONVEYOR_RIGHT_ACTIVE, -1, -1
+ },
+ {
+ O_BITER_SWITCH_1, FALSE,
+ EL_BDX_BITER_SWITCH_1, -1, -1
+ },
+ {
+ O_BITER_SWITCH_2, FALSE,
+ EL_BDX_BITER_SWITCH_2, -1, -1
+ },
+ {
+ O_BITER_SWITCH_3, FALSE,
+ EL_BDX_BITER_SWITCH_3, -1, -1
+ },
+ {
+ O_BITER_SWITCH_4, FALSE,
+ EL_BDX_BITER_SWITCH_4, -1, -1
+ },
+
+ {
+ -1, FALSE,
+ -1, -1, -1
+ }
+};
+
+int map_element_RND_to_BD_cave(int element_rnd)
+{
+ static unsigned short mapping_RND_to_BD[NUM_FILE_ELEMENTS];
+ static boolean mapping_initialized = FALSE;
+
+ if (!mapping_initialized)
+ {
+ int i;
+
+ // return "O_UNKNOWN" for all undefined elements in mapping array
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ mapping_RND_to_BD[i] = O_UNKNOWN;
+
+ for (i = 0; bd_object_mapping_list[i].element_bd != -1; i++)
+ if (bd_object_mapping_list[i].is_rnd_to_bd_mapping)
+ mapping_RND_to_BD[bd_object_mapping_list[i].element_rnd] =
+ bd_object_mapping_list[i].element_bd;
+
+ mapping_initialized = TRUE;
+ }
+
+ if (element_rnd < 0 || element_rnd >= NUM_FILE_ELEMENTS)
+ {
+ Warn("invalid RND element %d", element_rnd);
+
+ return O_UNKNOWN;
}
-};
-void CreateToolButtons(void)
+ return mapping_RND_to_BD[element_rnd];
+}
+
+int map_element_RND_to_BD_effect(int element_rnd, int action)
{
- int i;
+ static unsigned short mapping_RND_to_BD[NUM_FILE_ELEMENTS][NUM_ACTIONS];
+ static boolean mapping_initialized = FALSE;
- for (i = 0; i < NUM_TOOL_BUTTONS; i++)
+ if (!mapping_initialized)
{
- int graphic = toolbutton_info[i].graphic;
- struct GraphicInfo *gfx = &graphic_info[graphic];
- struct TextPosInfo *pos = toolbutton_info[i].pos;
- struct GadgetInfo *gi;
- Bitmap *deco_bitmap = None;
- int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0;
- unsigned int event_mask = GD_EVENT_RELEASED;
- boolean is_touch_button = toolbutton_info[i].is_touch_button;
- int base_x = (is_touch_button ? 0 : DX);
- int base_y = (is_touch_button ? 0 : DY);
- int gd_x = gfx->src_x;
- int gd_y = gfx->src_y;
- int gd_xp = gfx->src_x + gfx->pressed_xoffset;
- int gd_yp = gfx->src_y + gfx->pressed_yoffset;
- int x = pos->x;
- int y = pos->y;
- int id = i;
+ int i, j;
- // do not use touch buttons if overlay touch buttons are disabled
- if (is_touch_button && !setup.touch.overlay_buttons)
- continue;
+ // return "O_UNKNOWN" for all undefined elements in mapping array
+ for (i = 0; i < NUM_FILE_ELEMENTS; i++)
+ for (j = 0; j < NUM_ACTIONS; j++)
+ mapping_RND_to_BD[i][j] = O_UNKNOWN;
- if (global.use_envelope_request && !is_touch_button)
+ for (i = 0; bd_object_mapping_list[i].element_bd != -1; i++)
{
- setRequestPosition(&base_x, &base_y, TRUE);
-
- // check if request buttons are outside of envelope and fix, if needed
- if (x < 0 || x + gfx->width > request.width ||
- y < 0 || y + gfx->height > request.height)
- {
- if (id == TOOL_CTRL_ID_YES)
- {
- x = 0;
- y = request.height - 2 * request.border_size - gfx->height;
- }
- else if (id == TOOL_CTRL_ID_NO)
- {
- x = request.width - 2 * request.border_size - gfx->width;
- y = request.height - 2 * request.border_size - gfx->height;
- }
- else if (id == TOOL_CTRL_ID_CONFIRM)
- {
- x = (request.width - 2 * request.border_size - gfx->width) / 2;
- y = request.height - 2 * request.border_size - gfx->height;
- }
- else if (id >= TOOL_CTRL_ID_PLAYER_1 && id <= TOOL_CTRL_ID_PLAYER_4)
- {
- int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
-
- x = (request.width - 2 * request.border_size - gfx->width) / 2;
- y = request.height - 2 * request.border_size - gfx->height * 2;
+ int element_rnd = bd_object_mapping_list[i].element_rnd;
+ int element_bd = bd_object_mapping_list[i].element_bd;
+ int action = bd_object_mapping_list[i].action;
- x += (player_nr == 3 ? -1 : player_nr == 1 ? +1 : 0) * gfx->width;
- y += (player_nr == 0 ? -1 : player_nr == 2 ? +1 : 0) * gfx->height;
- }
- }
+ if (action != -1)
+ mapping_RND_to_BD[element_rnd][action] = element_bd;
}
- if (id >= TOOL_CTRL_ID_PLAYER_1 && id <= TOOL_CTRL_ID_PLAYER_4 &&
- pos->draw_player)
- {
- int player_nr = id - TOOL_CTRL_ID_PLAYER_1;
+ mapping_initialized = TRUE;
+ }
- getSizedGraphicSource(PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0,
- pos->size, &deco_bitmap, &deco_x, &deco_y);
- deco_xpos = (gfx->width - pos->size) / 2;
- deco_ypos = (gfx->height - pos->size) / 2;
- }
+ if (element_rnd < 0 || element_rnd >= NUM_FILE_ELEMENTS)
+ {
+ Warn("invalid RND element %d", element_rnd);
- gi = CreateGadget(GDI_CUSTOM_ID, id,
- GDI_IMAGE_ID, graphic,
- GDI_INFO_TEXT, toolbutton_info[i].infotext,
- GDI_X, base_x + x,
- GDI_Y, base_y + y,
- GDI_WIDTH, gfx->width,
- GDI_HEIGHT, gfx->height,
- GDI_TYPE, GD_TYPE_NORMAL_BUTTON,
- GDI_STATE, GD_BUTTON_UNPRESSED,
- GDI_DESIGN_UNPRESSED, gfx->bitmap, gd_x, gd_y,
- GDI_DESIGN_PRESSED, gfx->bitmap, gd_xp, gd_yp,
- GDI_DECORATION_DESIGN, deco_bitmap, deco_x, deco_y,
- GDI_DECORATION_POSITION, deco_xpos, deco_ypos,
- GDI_DECORATION_SIZE, pos->size, pos->size,
- GDI_DECORATION_SHIFTING, 1, 1,
- GDI_DIRECT_DRAW, FALSE,
- GDI_OVERLAY_TOUCH_BUTTON, is_touch_button,
- GDI_EVENT_MASK, event_mask,
- GDI_CALLBACK_ACTION, HandleToolButtons,
- GDI_END);
+ return O_UNKNOWN;
+ }
- if (gi == NULL)
- Fail("cannot create gadget");
+ if (action < 0 || action >= NUM_ACTIONS)
+ {
+ Warn("invalid action %d", action);
- tool_gadget[id] = gi;
+ return O_UNKNOWN;
}
+
+ return mapping_RND_to_BD[element_rnd][action];
}
-void FreeToolButtons(void)
+int map_element_BD_to_RND_cave(int element_bd)
{
- int i;
+ static unsigned short mapping_BD_to_RND[O_MAX_ALL];
+ static boolean mapping_initialized = FALSE;
- for (i = 0; i < NUM_TOOL_BUTTONS; i++)
- FreeGadget(tool_gadget[i]);
-}
+ if (!mapping_initialized)
+ {
+ int i;
-static void UnmapToolButtons(void)
-{
- int i;
+ // return "EL_UNKNOWN" for all undefined elements in mapping array
+ for (i = 0; i < O_MAX_ALL; i++)
+ mapping_BD_to_RND[i] = EL_UNKNOWN;
- for (i = 0; i < NUM_TOOL_BUTTONS; i++)
- UnmapGadget(tool_gadget[i]);
+ for (i = 0; bd_object_mapping_list[i].element_bd != -1; i++)
+ if (bd_object_mapping_list[i].is_rnd_to_bd_mapping)
+ mapping_BD_to_RND[bd_object_mapping_list[i].element_bd] =
+ bd_object_mapping_list[i].element_rnd;
+
+ mapping_initialized = TRUE;
+ }
+
+ // always map (scanned) run-time elements to normal elements
+ element_bd &= O_MASK;
+
+ if (element_bd < 0 || element_bd >= O_MAX_ALL)
+ {
+ Warn("invalid BD element %d", element_bd);
+
+ return EL_UNKNOWN;
+ }
+
+ return mapping_BD_to_RND[element_bd];
}
-static void HandleToolButtons(struct GadgetInfo *gi)
+int map_element_BD_to_RND_game(int element_bd)
{
- request_gadget_id = gi->custom_id;
+ static unsigned short mapping_BD_to_RND[O_MAX_ALL];
+ static boolean mapping_initialized = FALSE;
+
+ if (!mapping_initialized)
+ {
+ int i;
+
+ // return "EL_UNKNOWN" for all undefined elements in mapping array
+ for (i = 0; i < O_MAX_ALL; i++)
+ mapping_BD_to_RND[i] = EL_UNKNOWN;
+
+ for (i = 0; bd_object_mapping_list[i].element_bd != -1; i++)
+ mapping_BD_to_RND[bd_object_mapping_list[i].element_bd] =
+ bd_object_mapping_list[i].element_rnd;
+
+ mapping_initialized = TRUE;
+ }
+
+ // always map (scanned) run-time elements to normal elements
+ element_bd &= O_MASK;
+
+ if (element_bd < 0 || element_bd >= O_MAX_ALL)
+ {
+ Warn("invalid BD element %d", element_bd);
+
+ return EL_UNKNOWN;
+ }
+
+ return mapping_BD_to_RND[element_bd];
}
static struct Mapping_EM_to_RND_object
element_rnd <= EL_MM_END_2 ?
EL_MM_START_2_NATIVE + element_rnd - EL_MM_START_2 :
+ element_rnd >= EL_MM_START_3 &&
+ element_rnd <= EL_MM_END_3 ?
+ EL_MM_START_3_NATIVE + element_rnd - EL_MM_START_3 :
+
element_rnd >= EL_CHAR_START &&
element_rnd <= EL_CHAR_END ?
EL_MM_CHAR_START_NATIVE + element_rnd - EL_CHAR_START :
element_mm <= EL_MM_END_2_NATIVE ?
EL_MM_START_2 + element_mm - EL_MM_START_2_NATIVE :
+ element_mm >= EL_MM_START_3_NATIVE &&
+ element_mm <= EL_MM_END_3_NATIVE ?
+ EL_MM_START_3 + element_mm - EL_MM_START_3_NATIVE :
+
element_mm >= EL_MM_CHAR_START_NATIVE &&
element_mm <= EL_MM_CHAR_END_NATIVE ?
EL_CHAR_START + element_mm - EL_MM_CHAR_START_NATIVE :
return element_info[element].special_graphic[GFX_SPECIAL_ARG_EDITOR];
}
+int el2edimg_with_frame(int element, int *graphic, int *frame)
+{
+ *graphic = el2edimg(element);
+ *frame = 0;
+
+ if (*graphic == IMG_UNKNOWN)
+ {
+ // no graphic defined -- if BD style, try to get runtime ("effect") element graphics
+ // (normal BD style elements have graphics, but runtime ("effects") elements do not)
+ int element_bd = map_element_RND_to_BD_cave(element);
+
+ if (element_bd != O_UNKNOWN)
+ {
+ struct GraphicInfo_BD *g_bd = &graphic_info_bd_object[element_bd][0];
+
+ *graphic = g_bd->graphic;
+ *frame = g_bd->frame;
+ }
+ }
+
+ return *graphic;
+}
+
int el2preimg(int element)
{
element = GFX_ELEMENT(element);
unsigned int InitRND(int seed)
{
- if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ if (level.game_engine_type == GAME_ENGINE_TYPE_BD)
+ return InitEngineRandom_BD(seed);
+ else if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
return InitEngineRandom_EM(seed);
else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
return InitEngineRandom_SP(seed);
return InitEngineRandom_RND(seed);
}
-static struct Mapping_EM_to_RND_object object_mapping[GAME_TILE_MAX];
-static struct Mapping_EM_to_RND_player player_mapping[MAX_PLAYERS][PLY_MAX];
+static struct Mapping_BD_to_RND_object bd_object_mapping[O_MAX_ALL];
+static struct Mapping_EM_to_RND_object em_object_mapping[GAME_TILE_MAX];
+static struct Mapping_EM_to_RND_player em_player_mapping[MAX_PLAYERS][PLY_MAX];
static int get_effective_element_EM(int tile, int frame_em)
{
- int element = object_mapping[tile].element_rnd;
- int action = object_mapping[tile].action;
- boolean is_backside = object_mapping[tile].is_backside;
+ int element = em_object_mapping[tile].element_rnd;
+ int action = em_object_mapping[tile].action;
+ boolean is_backside = em_object_mapping[tile].is_backside;
boolean action_removing = (action == ACTION_DIGGING ||
action == ACTION_SNAPPING ||
action == ACTION_COLLECTING);
void SetGfxAnimation_EM(struct GraphicInfo_EM *g_em,
int tile, int frame_em, int x, int y)
{
- int action = object_mapping[tile].action;
- int direction = object_mapping[tile].direction;
+ int action = em_object_mapping[tile].action;
+ int direction = em_object_mapping[tile].direction;
int effective_element = get_effective_element_EM(tile, frame_em);
int graphic = (direction == MV_NONE ?
el_act2img(effective_element, action) :
}
else if (action_moving)
{
- boolean is_backside = object_mapping[tile].is_backside;
+ boolean is_backside = em_object_mapping[tile].is_backside;
if (is_backside)
{
- int direction = object_mapping[tile].direction;
+ int direction = em_object_mapping[tile].direction;
int move_dir = (action_falling ? MV_DOWN : direction);
GfxFrame[x][y]++;
void getGraphicSourceObjectExt_EM(struct GraphicInfo_EM *g_em,
int tile, int frame_em, int x, int y)
{
- int action = object_mapping[tile].action;
- int direction = object_mapping[tile].direction;
- boolean is_backside = object_mapping[tile].is_backside;
+ int action = em_object_mapping[tile].action;
+ int direction = em_object_mapping[tile].direction;
+ boolean is_backside = em_object_mapping[tile].is_backside;
int effective_element = get_effective_element_EM(tile, frame_em);
int effective_action = action;
int graphic = (direction == MV_NONE ?
void getGraphicSourcePlayerExt_EM(struct GraphicInfo_EM *g_em,
int player_nr, int anim, int frame_em)
{
- int element = player_mapping[player_nr][anim].element_rnd;
- int action = player_mapping[player_nr][anim].action;
- int direction = player_mapping[player_nr][anim].direction;
+ int element = em_player_mapping[player_nr][anim].element_rnd;
+ int action = em_player_mapping[player_nr][anim].action;
+ int direction = em_player_mapping[player_nr][anim].direction;
int graphic = (direction == MV_NONE ?
el_act2img(element, action) :
el_act_dir2img(element, action, direction));
&g_em->src_x, &g_em->src_y, FALSE);
}
+#define BD_GFX_RANGE(a, n, i) ((i) >= (a) && (i) < (a) + (n))
+#define BD_GFX_FRAME(b, i) (((i) - (b)) * 8)
+
+void InitGraphicInfo_BD(void)
+{
+ int i, j;
+
+ if (graphic_info == NULL) // still at startup phase
+ return;
+
+ // always start with reliable default values
+ for (i = 0; i < O_MAX_ALL; i++)
+ {
+ bd_object_mapping[i].element_rnd = EL_UNKNOWN;
+ bd_object_mapping[i].action = ACTION_DEFAULT;
+ bd_object_mapping[i].direction = MV_NONE;
+ }
+
+ for (i = 0; bd_object_mapping_list[i].element_bd != -1; i++)
+ {
+ int e = bd_object_mapping_list[i].element_bd;
+
+ bd_object_mapping[e].element_rnd = bd_object_mapping_list[i].element_rnd;
+
+ if (bd_object_mapping_list[i].action != -1)
+ bd_object_mapping[e].action = bd_object_mapping_list[i].action;
+
+ if (bd_object_mapping_list[i].direction != -1)
+ bd_object_mapping[e].direction =
+ MV_DIR_FROM_BIT(bd_object_mapping_list[i].direction);
+ }
+
+ for (i = 0; i < O_MAX_ALL; i++)
+ {
+ int element = bd_object_mapping[i].element_rnd;
+ int action = bd_object_mapping[i].action;
+ int direction = bd_object_mapping[i].direction;
+
+ for (j = 0; j < 8; j++)
+ {
+ int effective_element = element;
+ int effective_action = action;
+ int graphic = (el_act_dir2img(effective_element, effective_action,
+ direction));
+ struct GraphicInfo *g = &graphic_info[graphic];
+ struct GraphicInfo_BD *g_bd = &graphic_info_bd_object[i][j];
+ Bitmap *src_bitmap;
+ int src_x, src_y;
+ int sync_frame = (BD_GFX_RANGE(O_PRE_PL_1, 3, i) ? BD_GFX_FRAME(O_PRE_PL_1, i) :
+ BD_GFX_RANGE(O_PRE_DIA_1, 5, i) ? BD_GFX_FRAME(O_PRE_DIA_1, i) :
+ BD_GFX_RANGE(O_PRE_STONE_1, 4, i) ? BD_GFX_FRAME(O_PRE_STONE_1, i) :
+ BD_GFX_RANGE(O_PRE_STEEL_1, 4, i) ? BD_GFX_FRAME(O_PRE_STEEL_1, i) :
+ BD_GFX_RANGE(O_BOMB_TICK_1, 7, i) ? BD_GFX_FRAME(O_BOMB_TICK_1, i) :
+ BD_GFX_RANGE(O_BOMB_EXPL_1, 4, i) ? BD_GFX_FRAME(O_BOMB_EXPL_1, i) :
+ BD_GFX_RANGE(O_NUT_EXPL_1, 4, i) ? BD_GFX_FRAME(O_NUT_EXPL_1, i) :
+ BD_GFX_RANGE(O_GHOST_EXPL_1, 4, i) ? BD_GFX_FRAME(O_GHOST_EXPL_1, i) :
+ BD_GFX_RANGE(O_EXPLODE_1, 5, i) ? BD_GFX_FRAME(O_EXPLODE_1, i) :
+ BD_GFX_RANGE(O_PRE_CLOCK_1, 4, i) ? BD_GFX_FRAME(O_PRE_CLOCK_1, i) :
+ BD_GFX_RANGE(O_NITRO_EXPL_1, 4, i) ? BD_GFX_FRAME(O_NITRO_EXPL_1, i) :
+ BD_GFX_RANGE(O_AMOEBA_2_EXPL_1, 4, i) ? BD_GFX_FRAME(O_AMOEBA_2_EXPL_1, i):
+ i == O_INBOX_OPEN || i == O_OUTBOX_OPEN ? j :
+ j * 2);
+ int frame = getAnimationFrame(g->anim_frames,
+ g->anim_delay,
+ g->anim_mode,
+ g->anim_start_frame,
+ sync_frame);
+
+ getGraphicSourceExt(graphic, frame, &src_bitmap, &src_x, &src_y, FALSE);
+
+ g_bd->bitmap = src_bitmap;
+ g_bd->src_x = src_x;
+ g_bd->src_y = src_y;
+ g_bd->width = TILEX;
+ g_bd->height = TILEY;
+
+ g_bd->graphic = graphic;
+ g_bd->frame = frame;
+ }
+ }
+
+ // game graphics template for level-specific colors for native BD levels
+ int graphic = IMG_BDX_GAME_GRAPHICS_COLOR_TEMPLATE;
+ struct GraphicInfo_BD *g_bd = &graphic_info_bd_color_template;
+ Bitmap *src_bitmap;
+ int src_x, src_y;
+
+ getGraphicSourceExt(graphic, 0, &src_bitmap, &src_x, &src_y, FALSE);
+
+ g_bd->bitmap = src_bitmap;
+ g_bd->src_x = src_x;
+ g_bd->src_y = src_y;
+ g_bd->width = TILEX;
+ g_bd->height = TILEY;
+
+ g_bd->graphic = graphic;
+ g_bd->frame = 0;
+}
+
void InitGraphicInfo_EM(void)
{
int i, j, p;
// always start with reliable default values
for (i = 0; i < GAME_TILE_MAX; i++)
{
- object_mapping[i].element_rnd = EL_UNKNOWN;
- object_mapping[i].is_backside = FALSE;
- object_mapping[i].action = ACTION_DEFAULT;
- object_mapping[i].direction = MV_NONE;
+ em_object_mapping[i].element_rnd = EL_UNKNOWN;
+ em_object_mapping[i].is_backside = FALSE;
+ em_object_mapping[i].action = ACTION_DEFAULT;
+ em_object_mapping[i].direction = MV_NONE;
}
// always start with reliable default values
{
for (i = 0; i < PLY_MAX; i++)
{
- player_mapping[p][i].element_rnd = EL_UNKNOWN;
- player_mapping[p][i].action = ACTION_DEFAULT;
- player_mapping[p][i].direction = MV_NONE;
+ em_player_mapping[p][i].element_rnd = EL_UNKNOWN;
+ em_player_mapping[p][i].action = ACTION_DEFAULT;
+ em_player_mapping[p][i].direction = MV_NONE;
}
}
{
int e = em_object_mapping_list[i].element_em;
- object_mapping[e].element_rnd = em_object_mapping_list[i].element_rnd;
- object_mapping[e].is_backside = em_object_mapping_list[i].is_backside;
+ em_object_mapping[e].element_rnd = em_object_mapping_list[i].element_rnd;
+ em_object_mapping[e].is_backside = em_object_mapping_list[i].is_backside;
if (em_object_mapping_list[i].action != -1)
- object_mapping[e].action = em_object_mapping_list[i].action;
+ em_object_mapping[e].action = em_object_mapping_list[i].action;
if (em_object_mapping_list[i].direction != -1)
- object_mapping[e].direction =
+ em_object_mapping[e].direction =
MV_DIR_FROM_BIT(em_object_mapping_list[i].direction);
}
int a = em_player_mapping_list[i].action_em;
int p = em_player_mapping_list[i].player_nr;
- player_mapping[p][a].element_rnd = em_player_mapping_list[i].element_rnd;
+ em_player_mapping[p][a].element_rnd = em_player_mapping_list[i].element_rnd;
if (em_player_mapping_list[i].action != -1)
- player_mapping[p][a].action = em_player_mapping_list[i].action;
+ em_player_mapping[p][a].action = em_player_mapping_list[i].action;
if (em_player_mapping_list[i].direction != -1)
- player_mapping[p][a].direction =
+ em_player_mapping[p][a].direction =
MV_DIR_FROM_BIT(em_player_mapping_list[i].direction);
}
for (i = 0; i < GAME_TILE_MAX; i++)
{
- int element = object_mapping[i].element_rnd;
- int action = object_mapping[i].action;
- int direction = object_mapping[i].direction;
- boolean is_backside = object_mapping[i].is_backside;
+ int element = em_object_mapping[i].element_rnd;
+ int action = em_object_mapping[i].action;
+ int direction = em_object_mapping[i].direction;
+ boolean is_backside = em_object_mapping[i].is_backside;
boolean action_exploding = ((action == ACTION_EXPLODING ||
action == ACTION_SMASHED_BY_ROCK ||
action == ACTION_SMASHED_BY_SPRING) &&
{
for (j = 0; j < 8; j++)
{
- int element = object_mapping[i].element_rnd;
- int action = object_mapping[i].action;
- int direction = object_mapping[i].direction;
- boolean is_backside = object_mapping[i].is_backside;
+ int element = em_object_mapping[i].element_rnd;
+ int action = em_object_mapping[i].action;
+ int direction = em_object_mapping[i].direction;
+ boolean is_backside = em_object_mapping[i].is_backside;
int graphic_action = el_act_dir2img(element, action, direction);
int graphic_default = el_act_dir2img(element, ACTION_DEFAULT, direction);
{
for (i = 0; i < PLY_MAX; i++)
{
- int element = player_mapping[p][i].element_rnd;
- int action = player_mapping[p][i].action;
- int direction = player_mapping[p][i].direction;
+ int element = em_player_mapping[p][i].element_rnd;
+ int action = em_player_mapping[p][i].action;
+ int direction = em_player_mapping[p][i].direction;
for (j = 0; j < 8; j++)
{
}
}
+static void CheckSaveEngineSnapshot_BD(boolean frame_max,
+ boolean player_moving,
+ boolean player_snapping)
+{
+ if (frame_max)
+ {
+ if (!local_player->was_waiting)
+ {
+ if (!CheckSaveEngineSnapshotToList())
+ return;
+
+ local_player->was_waiting = TRUE;
+ }
+ }
+ else if (player_moving || player_snapping)
+ {
+ local_player->was_waiting = FALSE;
+ }
+}
+
static void CheckSaveEngineSnapshot_EM(int frame,
boolean any_player_moving,
boolean any_player_snapping,
}
}
+boolean CheckSingleStepMode_BD(boolean frame_max,
+ boolean player_moving,
+ boolean player_snapping)
+{
+ if (tape.single_step && tape.recording && !tape.pausing)
+ if (frame_max && FrameCounter > 6)
+ TapeTogglePause(TAPE_TOGGLE_AUTOMATIC);
+
+ CheckSaveEngineSnapshot_BD(frame_max, player_moving, player_snapping);
+
+ return tape.pausing;
+}
+
boolean CheckSingleStepMode_EM(int frame,
boolean any_player_moving,
boolean any_player_snapping,
return graphic_info[graphic].anim_delay;
}
+boolean getGraphicInfo_NewFrame(int x, int y, int graphic)
+{
+ if (!IS_NEW_FRAME(GfxFrame[x][y], graphic))
+ return FALSE;
+
+ if (ANIM_MODE(graphic) & (ANIM_TILED | ANIM_RANDOM_STATIC))
+ return FALSE;
+
+ return TRUE;
+}
+
void PlayMenuSoundExt(int sound)
{
if (sound == SND_UNDEFINED)
#endif
}
+void ToggleAudioSampleRateIfNeeded(void)
+{
+ int setup_audio_sample_rate = (setup.audio_sample_rate_44100 ? 44100 : 22050);
+
+ // if setup and audio sample rate are already matching, nothing do do
+ if ((setup_audio_sample_rate == audio.sample_rate) ||
+ !audio.sound_available)
+ return;
+
+#if 1
+ // apparently changing the audio output sample rate does not work at runtime,
+ // so currently the program has to be restarted to apply the new sample rate
+ Request("Please restart the program to change audio sample rate!", REQ_CONFIRM);
+#else
+ SDLReopenAudio();
+
+ // set setup value according to successfully changed audio sample rate
+ setup.audio_sample_rate_44100 = (audio.sample_rate == 44100);
+#endif
+}
+
void ToggleFullscreenIfNeeded(void)
{
// if setup and video fullscreen state are already matching, nothing do do
boolean init_gfx_buffers = FALSE;
boolean init_video_buffer = FALSE;
boolean init_gadgets_and_anims = FALSE;
+ boolean init_bd_graphics = FALSE;
boolean init_em_graphics = FALSE;
if (new_win_xsize != WIN_XSIZE ||
// changing tile size invalidates scroll values of engine snapshots
FreeEngineSnapshotSingle();
- // changing tile size requires update of graphic mapping for EM engine
+ // changing tile size requires update of graphic mapping for BD/EM engine
+ init_bd_graphics = TRUE;
init_em_graphics = TRUE;
}
InitGlobalAnimations();
}
+ if (init_bd_graphics)
+ {
+ InitGraphicInfo_BD();
+ }
+
if (init_em_graphics)
{
InitGraphicInfo_EM();
static void TestGeneratingUUIDs_RunTest(int nr, int always_seed, int num_uuids)
{
- struct hashtable *hash_seeds =
- create_hashtable(16, 0.75, get_hash_from_key, hash_keys_are_equal);
- struct hashtable *hash_uuids =
- create_hashtable(16, 0.75, get_hash_from_key, hash_keys_are_equal);
+ HashTable *hash_seeds =
+ create_hashtable(get_hash_from_string, hash_key_strings_are_equal, free, NULL);
+ HashTable *hash_uuids =
+ create_hashtable(get_hash_from_string, hash_key_strings_are_equal, free, NULL);
static char message[100];
int i;
Request(message, REQ_CONFIRM);
- hashtable_destroy(hash_seeds, 0);
- hashtable_destroy(hash_uuids, 0);
+ hashtable_destroy(hash_seeds);
+ hashtable_destroy(hash_uuids);
}
void TestGeneratingUUIDs(void)