X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Ftools.c;h=0d4f45d868086ccbcfc26e8c2ba7a15d5695960c;hb=1f5b7dda7fe53b3b0ec085a8e9c99d5ca82c8161;hp=cdf55ac3368dc4be36c79aa47fe4b73158306cbd;hpb=98d421667c21a07ab69dd881f1435c2f595ddd4c;p=rocksndiamonds.git diff --git a/src/tools.c b/src/tools.c index cdf55ac3..0d4f45d8 100644 --- a/src/tools.c +++ b/src/tools.c @@ -35,8 +35,11 @@ #define TOOL_CTRL_ID_PLAYER_2 4 #define TOOL_CTRL_ID_PLAYER_3 5 #define TOOL_CTRL_ID_PLAYER_4 6 +#define TOOL_CTRL_ID_TOUCH_YES 7 +#define TOOL_CTRL_ID_TOUCH_NO 8 +#define TOOL_CTRL_ID_TOUCH_CONFIRM 9 -#define NUM_TOOL_BUTTONS 7 +#define NUM_TOOL_BUTTONS 10 // constants for number of doors and door parts #define NUM_DOORS 2 @@ -208,18 +211,19 @@ int correctLevelPosY_EM(int ly) return ly; } -static int getFieldbufferOffsetX_RND(void) +int getFieldbufferOffsetX_RND(int dir, int pos) { int full_lev_fieldx = lev_fieldx + (BorderElement != EL_EMPTY ? 2 : 0); - int dx = (ScreenMovDir & (MV_LEFT | MV_RIGHT) ? ScreenGfxPos : 0); + int dx = (dir & MV_HORIZONTAL ? pos : 0); int dx_var = dx * TILESIZE_VAR / TILESIZE; int fx = FX; if (EVEN(SCR_FIELDX)) { - int ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx_var; + int sbx_right = SBX_Right + (BorderElement != EL_EMPTY ? 1 : 0); + int ffx = (scroll_x - SBX_Left) * TILEX_VAR + dx_var; - if (ffx < SBX_Right * TILEX_VAR + TILEX_VAR / 2 + TILEX_VAR) + if (ffx < sbx_right * TILEX_VAR + TILEX_VAR / 2) fx += dx_var - MIN(ffx, TILEX_VAR / 2) + TILEX_VAR; else fx += (dx_var > 0 ? TILEX_VAR : 0); @@ -240,18 +244,19 @@ static int getFieldbufferOffsetX_RND(void) return fx; } -static int getFieldbufferOffsetY_RND(void) +int getFieldbufferOffsetY_RND(int dir, int pos) { int full_lev_fieldy = lev_fieldy + (BorderElement != EL_EMPTY ? 2 : 0); - int dy = (ScreenMovDir & (MV_UP | MV_DOWN) ? ScreenGfxPos : 0); + int dy = (dir & MV_VERTICAL ? pos : 0); int dy_var = dy * TILESIZE_VAR / TILESIZE; int fy = FY; if (EVEN(SCR_FIELDY)) { + int sby_lower = SBY_Lower + (BorderElement != EL_EMPTY ? 1 : 0); int ffy = (scroll_y - SBY_Upper) * TILEY_VAR + dy_var; - if (ffy < SBY_Lower * TILEY_VAR + TILEY_VAR / 2 + TILEY_VAR) + if (ffy < sby_lower * TILEY_VAR + TILEY_VAR / 2) fy += dy_var - MIN(ffy, TILEY_VAR / 2) + TILEY_VAR; else fy += (dy_var > 0 ? TILEY_VAR : 0); @@ -274,7 +279,7 @@ static int getFieldbufferOffsetY_RND(void) static int getLevelFromScreenX_RND(int sx) { - int fx = getFieldbufferOffsetX_RND(); + int fx = getFieldbufferOffsetX_RND(ScreenMovDir, ScreenGfxPos); int dx = fx - FX; int px = sx - SX; int lx = LEVELX((px + dx) / TILESIZE_VAR); @@ -284,7 +289,7 @@ static int getLevelFromScreenX_RND(int sx) static int getLevelFromScreenY_RND(int sy) { - int fy = getFieldbufferOffsetY_RND(); + int fy = getFieldbufferOffsetY_RND(ScreenMovDir, ScreenGfxPos); int dy = fy - FY; int py = sy - SY; int ly = LEVELY((py + dy) / TILESIZE_VAR); @@ -689,12 +694,17 @@ void DrawTileCursor(int draw_target) dst_x, dst_y); } +void BlitScreenToBitmapExt_RND(Bitmap *target_bitmap, int fx, int fy) +{ + BlitBitmap(drawto_field, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY); +} + void BlitScreenToBitmap_RND(Bitmap *target_bitmap) { - int fx = getFieldbufferOffsetX_RND(); - int fy = getFieldbufferOffsetY_RND(); + int fx = getFieldbufferOffsetX_RND(ScreenMovDir, ScreenGfxPos); + int fy = getFieldbufferOffsetY_RND(ScreenMovDir, ScreenGfxPos); - BlitBitmap(drawto_field, target_bitmap, fx, fy, SXSIZE, SYSIZE, SX, SY); + BlitScreenToBitmapExt_RND(target_bitmap, fx, fy); } void BlitScreenToBitmap(Bitmap *target_bitmap) @@ -1057,7 +1067,8 @@ void FadeIn(int fade_mask) void FadeOut(int fade_mask) { // update screen if areas covered by "fade_mask" and "redraw_mask" differ - if (!equalRedrawMasks(fade_mask, redraw_mask)) + if (!equalRedrawMasks(fade_mask, redraw_mask) && + fade_type_skip != FADE_MODE_SKIP_FADE_OUT) BackToFront(); SetScreenStates_BeforeFadingOut(); @@ -1150,10 +1161,12 @@ void FadeSkipNextFadeOut(void) static Bitmap *getBitmapFromGraphicOrDefault(int graphic, int default_graphic) { + if (graphic == IMG_UNDEFINED) + return NULL; + boolean redefined = getImageListEntryFromImageID(graphic)->redefined; - return (graphic == IMG_UNDEFINED ? NULL : - graphic_info[graphic].bitmap != NULL || redefined ? + return (graphic_info[graphic].bitmap != NULL || redefined ? graphic_info[graphic].bitmap : graphic_info[default_graphic].bitmap); } @@ -2274,7 +2287,9 @@ static void DrawLevelFieldCrumbledExt(int x, int y, int graphic, int frame) !IN_SCR_FIELD(sxx, syy)) continue; - if (Feld[xx][yy] == EL_ELEMENT_SNAPPING) + // do not crumble fields that are being digged or snapped + if (Feld[xx][yy] == EL_EMPTY || + Feld[xx][yy] == EL_ELEMENT_SNAPPING) continue; element = TILE_GFX_ELEMENT(xx, yy); @@ -2834,7 +2849,7 @@ void ShowEnvelope(int envelope_nr) AnimateEnvelope(envelope_nr, main_anim_mode, ACTION_OPENING); if (tape.playing) - Delay(wait_delay_value); + Delay_WithScreenUpdates(wait_delay_value); else WaitForEventToContinue(); @@ -3121,10 +3136,13 @@ static void ShowEnvelopeRequest(char *text, unsigned int req_state, int action) { 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) { @@ -3514,12 +3532,13 @@ static void DrawPreviewLevelExt(boolean restart) } } -static void DrawPreviewPlayers(void) +void DrawPreviewPlayers(void) { if (game_status != GAME_MODE_MAIN) return; - if (!network.enabled && !setup.team_mode) + // do not draw preview players if level preview redefined, but players aren't + if (preview.redefined && !menu.main.preview_players.redefined) return; boolean player_found[MAX_PLAYERS]; @@ -3570,6 +3589,9 @@ static void DrawPreviewPlayers(void) ClearRectangleOnBackground(drawto, max_xpos, max_ypos, max_players_width, max_players_height); + if (!network.enabled && !setup.team_mode) + return; + // only draw players if level is suited for team mode if (num_players < 2) return; @@ -3624,6 +3646,10 @@ static void DrawNetworkPlayersExt(boolean force) if (!network.connected && !force) return; + // do not draw network players if level preview redefined, but players aren't + if (preview.redefined && !menu.main.network_players.redefined) + return; + int num_players = 0; int i; @@ -3830,87 +3856,122 @@ static boolean equalGraphics(int graphic1, int graphic2) g1->anim_mode == g2->anim_mode); } -void DrawAllPlayers(void) +#define DRAW_PLAYER_OVER_PUSHED_ELEMENT 1 + +enum { - int i; + DRAW_PLAYER_STAGE_INIT = 0, + DRAW_PLAYER_STAGE_LAST_FIELD, + DRAW_PLAYER_STAGE_FIELD_UNDER_PLAYER, +#if DRAW_PLAYER_OVER_PUSHED_ELEMENT + DRAW_PLAYER_STAGE_ELEMENT_PUSHED, + DRAW_PLAYER_STAGE_PLAYER, +#else + DRAW_PLAYER_STAGE_PLAYER, + DRAW_PLAYER_STAGE_ELEMENT_PUSHED, +#endif + DRAW_PLAYER_STAGE_ELEMENT_OVER_PLAYER, + DRAW_PLAYER_STAGE_FIELD_OVER_PLAYER, - for (i = 0; i < MAX_PLAYERS; i++) - if (stored_player[i].active) - DrawPlayer(&stored_player[i]); -} + NUM_DRAW_PLAYER_STAGES +}; -void DrawPlayerField(int x, int y) +static void DrawPlayerExt(struct PlayerInfo *player, int drawing_stage) { - if (!IS_PLAYER(x, y)) + static int static_last_player_graphic[MAX_PLAYERS]; + static int static_last_player_frame[MAX_PLAYERS]; + static boolean static_player_is_opaque[MAX_PLAYERS]; + static boolean draw_player[MAX_PLAYERS]; + int pnr = player->index_nr; + + if (drawing_stage == DRAW_PLAYER_STAGE_INIT) + { + static_last_player_graphic[pnr] = getPlayerGraphic(player, player->MovDir); + static_last_player_frame[pnr] = player->Frame; + static_player_is_opaque[pnr] = FALSE; + + draw_player[pnr] = TRUE; + } + + if (!draw_player[pnr]) return; - DrawPlayer(PLAYERINFO(x, y)); -} +#if DEBUG + if (!IN_LEV_FIELD(player->jx, player->jy)) + { + printf("DrawPlayerField(): x = %d, y = %d\n", player->jx, player->jy); + printf("DrawPlayerField(): This should never happen!\n"); -#define DRAW_PLAYER_OVER_PUSHED_ELEMENT 1 + draw_player[pnr] = FALSE; + + return; + } +#endif + + int last_player_graphic = static_last_player_graphic[pnr]; + int last_player_frame = static_last_player_frame[pnr]; + boolean player_is_opaque = static_player_is_opaque[pnr]; -void DrawPlayer(struct PlayerInfo *player) -{ int jx = player->jx; int jy = player->jy; - int move_dir = player->MovDir; + int move_dir = (player->is_waiting ? player->dir_waiting : player->MovDir); int dx = (move_dir == MV_LEFT ? -1 : move_dir == MV_RIGHT ? +1 : 0); int dy = (move_dir == MV_UP ? -1 : move_dir == MV_DOWN ? +1 : 0); int last_jx = (player->is_moving ? jx - dx : jx); int last_jy = (player->is_moving ? jy - dy : jy); int next_jx = jx + dx; int next_jy = jy + dy; - boolean player_is_moving = (player->MovPos ? TRUE : FALSE); - boolean player_is_opaque = FALSE; - int sx = SCREENX(jx), sy = SCREENY(jy); - int sxx = 0, syy = 0; - int element = Feld[jx][jy], last_element = Feld[last_jx][last_jy]; - int graphic; - int action = ACTION_DEFAULT; - int last_player_graphic = getPlayerGraphic(player, move_dir); - int last_player_frame = player->Frame; - int frame = 0; + boolean player_is_moving = (player->MovPos != 0 ? TRUE : FALSE); + int sx = SCREENX(jx); + int sy = SCREENY(jy); + int sxx = (move_dir == MV_LEFT || move_dir == MV_RIGHT ? player->GfxPos : 0); + int syy = (move_dir == MV_UP || move_dir == MV_DOWN ? player->GfxPos : 0); + int element = Feld[jx][jy]; + int last_element = Feld[last_jx][last_jy]; + int action = (player->is_pushing ? ACTION_PUSHING : + player->is_digging ? ACTION_DIGGING : + player->is_collecting ? ACTION_COLLECTING : + player->is_moving ? ACTION_MOVING : + player->is_snapping ? ACTION_SNAPPING : + player->is_dropping ? ACTION_DROPPING : + player->is_waiting ? player->action_waiting : + ACTION_DEFAULT); + + if (drawing_stage == DRAW_PLAYER_STAGE_INIT) + { + // ------------------------------------------------------------------------ + // initialize drawing the player + // ------------------------------------------------------------------------ - // GfxElement[][] is set to the element the player is digging or collecting; - // remove also for off-screen player if the player is not moving anymore - if (IN_LEV_FIELD(jx, jy) && !player_is_moving) - GfxElement[jx][jy] = EL_UNDEFINED; + draw_player[pnr] = FALSE; - if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy))) - return; + // GfxElement[][] is set to the element the player is digging or collecting; + // remove also for off-screen player if the player is not moving anymore + if (IN_LEV_FIELD(jx, jy) && !player_is_moving) + GfxElement[jx][jy] = EL_UNDEFINED; -#if DEBUG - if (!IN_LEV_FIELD(jx, jy)) - { - printf("DrawPlayerField(): x = %d, y = %d\n",jx,jy); - printf("DrawPlayerField(): sx = %d, sy = %d\n",sx,sy); - printf("DrawPlayerField(): This should never happen!\n"); - return; - } -#endif + if (!player->active || !IN_SCR_FIELD(SCREENX(last_jx), SCREENY(last_jy))) + return; - if (element == EL_EXPLOSION) - return; + if (element == EL_EXPLOSION) + return; - action = (player->is_pushing ? ACTION_PUSHING : - player->is_digging ? ACTION_DIGGING : - player->is_collecting ? ACTION_COLLECTING : - player->is_moving ? ACTION_MOVING : - player->is_snapping ? ACTION_SNAPPING : - player->is_dropping ? ACTION_DROPPING : - player->is_waiting ? player->action_waiting : ACTION_DEFAULT); + InitPlayerGfxAnimation(player, action, move_dir); - if (player->is_waiting) - move_dir = player->dir_waiting; + draw_player[pnr] = TRUE; + } + else if (drawing_stage == DRAW_PLAYER_STAGE_LAST_FIELD) + { + // ------------------------------------------------------------------------ + // draw things in the field the player is leaving, if needed + // ------------------------------------------------------------------------ - InitPlayerGfxAnimation(player, action, move_dir); + if (!IN_SCR_FIELD(sx, sy)) + draw_player[pnr] = FALSE; - // -------------------------------------------------------------------------- - // draw things in the field the player is leaving, if needed - // -------------------------------------------------------------------------- + if (!player->is_moving) + return; - if (player->is_moving) - { if (Back[last_jx][last_jy] && IS_DRAWABLE(last_element)) { DrawLevelElement(last_jx, last_jy, Back[last_jx][last_jy]); @@ -3926,35 +3987,32 @@ void DrawPlayer(struct PlayerInfo *player) last_element == EL_EM_DYNAMITE_ACTIVE || last_element == EL_SP_DISK_RED_ACTIVE) DrawDynamite(last_jx, last_jy); -#if 0 - /* !!! this is not enough to prevent flickering of players which are - moving next to each others without a free tile between them -- this - can only be solved by drawing all players layer by layer (first the - background, then the foreground etc.) !!! => TODO */ - else if (!IS_PLAYER(last_jx, last_jy)) - DrawLevelField(last_jx, last_jy); -#else else DrawLevelField(last_jx, last_jy); -#endif if (player->is_pushing && IN_SCR_FIELD(SCREENX(next_jx), SCREENY(next_jy))) DrawLevelElement(next_jx, next_jy, EL_EMPTY); } + else if (drawing_stage == DRAW_PLAYER_STAGE_FIELD_UNDER_PLAYER) + { + // ------------------------------------------------------------------------ + // draw things behind the player, if needed + // ------------------------------------------------------------------------ - if (!IN_SCR_FIELD(sx, sy)) - return; + if (Back[jx][jy]) + { + DrawLevelElement(jx, jy, Back[jx][jy]); - // -------------------------------------------------------------------------- - // draw things behind the player, if needed - // -------------------------------------------------------------------------- + return; + } + + if (IS_ACTIVE_BOMB(element)) + { + DrawLevelElement(jx, jy, EL_EMPTY); + + return; + } - if (Back[jx][jy]) - DrawLevelElement(jx, jy, Back[jx][jy]); - else if (IS_ACTIVE_BOMB(element)) - DrawLevelElement(jx, jy, EL_EMPTY); - else - { if (player_is_moving && GfxElement[jx][jy] != EL_UNDEFINED) { int old_element = GfxElement[jx][jy]; @@ -3967,14 +4025,14 @@ void DrawPlayer(struct PlayerInfo *player) DrawGraphic(sx, sy, old_graphic, frame); if (graphic_info[old_graphic].anim_mode & ANIM_OPAQUE_PLAYER) - player_is_opaque = TRUE; + static_player_is_opaque[pnr] = TRUE; } else { GfxElement[jx][jy] = EL_UNDEFINED; // make sure that pushed elements are drawn with correct frame rate - graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir); + int graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir); if (player->is_pushing && player->is_moving && !IS_ANIM_MODE_CE(graphic)) GfxFrame[jx][jy] = player->StepFrame; @@ -3982,79 +4040,26 @@ void DrawPlayer(struct PlayerInfo *player) DrawLevelField(jx, jy); } } - -#if !DRAW_PLAYER_OVER_PUSHED_ELEMENT - // ----------------------------------------------------------------------- - // draw player himself - // ----------------------------------------------------------------------- - - graphic = getPlayerGraphic(player, move_dir); - - // in the case of changed player action or direction, prevent the current - // animation frame from being restarted for identical animations - if (player->Frame == 0 && equalGraphics(graphic, last_player_graphic)) - player->Frame = last_player_frame; - - frame = getGraphicAnimationFrame(graphic, player->Frame); - - if (player->GfxPos) - { - if (move_dir == MV_LEFT || move_dir == MV_RIGHT) - sxx = player->GfxPos; - else - syy = player->GfxPos; - } - - if (player_is_opaque) - DrawGraphicShifted(sx, sy, sxx, syy, graphic, frame,NO_CUTTING,NO_MASKING); - else - DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING); - - if (SHIELD_ON(player)) - { - int graphic = (player->shield_deadly_time_left ? IMG_SHIELD_DEADLY_ACTIVE : - IMG_SHIELD_NORMAL_ACTIVE); - int frame = getGraphicAnimationFrame(graphic, -1); - - DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING); - } -#endif - -#if DRAW_PLAYER_OVER_PUSHED_ELEMENT - if (player->GfxPos) + else if (drawing_stage == DRAW_PLAYER_STAGE_ELEMENT_PUSHED) { - if (move_dir == MV_LEFT || move_dir == MV_RIGHT) - sxx = player->GfxPos; - else - syy = player->GfxPos; - } -#endif + // ------------------------------------------------------------------------ + // draw things the player is pushing, if needed + // ------------------------------------------------------------------------ - // -------------------------------------------------------------------------- - // draw things the player is pushing, if needed - // -------------------------------------------------------------------------- + if (!player->is_pushing || !player->is_moving) + return; - if (player->is_pushing && player->is_moving) - { - int px = SCREENX(jx), py = SCREENY(jy); - int pxx = (TILEX - ABS(sxx)) * dx; - int pyy = (TILEY - ABS(syy)) * dy; int gfx_frame = GfxFrame[jx][jy]; - int graphic; - int sync_frame; - int frame; - if (!IS_MOVING(jx, jy)) // push movement already finished { element = Feld[next_jx][next_jy]; gfx_frame = GfxFrame[next_jx][next_jy]; } - graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir); - - sync_frame = (IS_ANIM_MODE_CE(graphic) ? gfx_frame : player->StepFrame); - frame = getGraphicAnimationFrame(graphic, sync_frame); + int graphic = el_act_dir2img(element, ACTION_PUSHING, move_dir); + int sync_frame = (IS_ANIM_MODE_CE(graphic) ? gfx_frame : player->StepFrame); + int frame = getGraphicAnimationFrame(graphic, sync_frame); // draw background element under pushed element (like the Sokoban field) if (game.use_masked_pushing && IS_MOVING(jx, jy)) @@ -4074,6 +4079,10 @@ void DrawPlayer(struct PlayerInfo *player) else if (Back[next_jx][next_jy]) DrawLevelElement(next_jx, next_jy, Back[next_jx][next_jy]); + int px = SCREENX(jx), py = SCREENY(jy); + int pxx = (TILEX - ABS(sxx)) * dx; + int pyy = (TILEY - ABS(syy)) * dy; + #if 1 // do not draw (EM style) pushing animation when pushing is finished // (two-tile animations usually do not contain start and end frame) @@ -4087,96 +4096,118 @@ void DrawPlayer(struct PlayerInfo *player) DrawGraphicShiftedThruMask(px, py, pxx, pyy, graphic, frame, NO_CUTTING); #endif } + else if (drawing_stage == DRAW_PLAYER_STAGE_PLAYER) + { + // ------------------------------------------------------------------------ + // draw player himself + // ------------------------------------------------------------------------ -#if DRAW_PLAYER_OVER_PUSHED_ELEMENT - // ----------------------------------------------------------------------- - // draw player himself - // ----------------------------------------------------------------------- - - graphic = getPlayerGraphic(player, move_dir); + int graphic = getPlayerGraphic(player, move_dir); - // in the case of changed player action or direction, prevent the current - // animation frame from being restarted for identical animations - if (player->Frame == 0 && equalGraphics(graphic, last_player_graphic)) - player->Frame = last_player_frame; + // in the case of changed player action or direction, prevent the current + // animation frame from being restarted for identical animations + if (player->Frame == 0 && equalGraphics(graphic, last_player_graphic)) + player->Frame = last_player_frame; - frame = getGraphicAnimationFrame(graphic, player->Frame); + int frame = getGraphicAnimationFrame(graphic, player->Frame); - if (player->GfxPos) - { - if (move_dir == MV_LEFT || move_dir == MV_RIGHT) - sxx = player->GfxPos; + if (player_is_opaque) + DrawGraphicShifted(sx,sy, sxx,syy, graphic, frame, NO_CUTTING,NO_MASKING); else - syy = player->GfxPos; - } + DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING); - if (player_is_opaque) - DrawGraphicShifted(sx, sy, sxx, syy, graphic, frame,NO_CUTTING,NO_MASKING); - else - DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING); + if (SHIELD_ON(player)) + { + graphic = (player->shield_deadly_time_left ? IMG_SHIELD_DEADLY_ACTIVE : + IMG_SHIELD_NORMAL_ACTIVE); + frame = getGraphicAnimationFrame(graphic, -1); - if (SHIELD_ON(player)) + DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING); + } + } + else if (drawing_stage == DRAW_PLAYER_STAGE_ELEMENT_OVER_PLAYER) { - int graphic = (player->shield_deadly_time_left ? IMG_SHIELD_DEADLY_ACTIVE : - IMG_SHIELD_NORMAL_ACTIVE); - int frame = getGraphicAnimationFrame(graphic, -1); + // ------------------------------------------------------------------------ + // draw things in front of player (active dynamite or dynabombs) + // ------------------------------------------------------------------------ - DrawGraphicShiftedThruMask(sx, sy, sxx, syy, graphic, frame, NO_CUTTING); - } -#endif + if (IS_ACTIVE_BOMB(element)) + { + int graphic = el2img(element); + int frame = getGraphicAnimationFrame(graphic, GfxFrame[jx][jy]); - // -------------------------------------------------------------------------- - // draw things in front of player (active dynamite or dynabombs) - // -------------------------------------------------------------------------- + if (game.emulation == EMU_SUPAPLEX) + DrawGraphic(sx, sy, IMG_SP_DISK_RED, frame); + else + DrawGraphicThruMask(sx, sy, graphic, frame); + } - if (IS_ACTIVE_BOMB(element)) + if (player_is_moving && last_element == EL_EXPLOSION) + { + int element = (GfxElement[last_jx][last_jy] != EL_UNDEFINED ? + GfxElement[last_jx][last_jy] : EL_EMPTY); + int graphic = el_act2img(element, ACTION_EXPLODING); + int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2); + int phase = ExplodePhase[last_jx][last_jy] - 1; + int frame = getGraphicAnimationFrame(graphic, phase - delay); + + if (phase >= delay) + DrawGraphicThruMask(SCREENX(last_jx), SCREENY(last_jy), graphic, frame); + } + } + else if (drawing_stage == DRAW_PLAYER_STAGE_FIELD_OVER_PLAYER) { - graphic = el2img(element); - frame = getGraphicAnimationFrame(graphic, GfxFrame[jx][jy]); + // ------------------------------------------------------------------------ + // draw elements the player is just walking/passing through/under + // ------------------------------------------------------------------------ - if (game.emulation == EMU_SUPAPLEX) - DrawGraphic(sx, sy, IMG_SP_DISK_RED, frame); - else - DrawGraphicThruMask(sx, sy, graphic, frame); - } + if (player_is_moving) + { + // handle the field the player is leaving ... + if (IS_ACCESSIBLE_INSIDE(last_element)) + DrawLevelField(last_jx, last_jy); + else if (IS_ACCESSIBLE_UNDER(last_element)) + DrawLevelFieldThruMask(last_jx, last_jy); + } - if (player_is_moving && last_element == EL_EXPLOSION) - { - int element = (GfxElement[last_jx][last_jy] != EL_UNDEFINED ? - GfxElement[last_jx][last_jy] : EL_EMPTY); - int graphic = el_act2img(element, ACTION_EXPLODING); - int delay = (game.emulation == EMU_SUPAPLEX ? 3 : 2); - int phase = ExplodePhase[last_jx][last_jy] - 1; - int frame = getGraphicAnimationFrame(graphic, phase - delay); + // do not redraw accessible elements if the player is just pushing them + if (!player_is_moving || !player->is_pushing) + { + // ... and the field the player is entering + if (IS_ACCESSIBLE_INSIDE(element)) + DrawLevelField(jx, jy); + else if (IS_ACCESSIBLE_UNDER(element)) + DrawLevelFieldThruMask(jx, jy); + } - if (phase >= delay) - DrawGraphicThruMask(SCREENX(last_jx), SCREENY(last_jy), graphic, frame); + MarkTileDirty(sx, sy); } +} - // -------------------------------------------------------------------------- - // draw elements the player is just walking/passing through/under - // -------------------------------------------------------------------------- +void DrawPlayer(struct PlayerInfo *player) +{ + int i; - if (player_is_moving) - { - // handle the field the player is leaving ... - if (IS_ACCESSIBLE_INSIDE(last_element)) - DrawLevelField(last_jx, last_jy); - else if (IS_ACCESSIBLE_UNDER(last_element)) - DrawLevelFieldThruMask(last_jx, last_jy); - } + for (i = 0; i < NUM_DRAW_PLAYER_STAGES; i++) + DrawPlayerExt(player, i); +} - // do not redraw accessible elements if the player is just pushing them - if (!player_is_moving || !player->is_pushing) - { - // ... and the field the player is entering - if (IS_ACCESSIBLE_INSIDE(element)) - DrawLevelField(jx, jy); - else if (IS_ACCESSIBLE_UNDER(element)) - DrawLevelFieldThruMask(jx, jy); - } +void DrawAllPlayers(void) +{ + int i, j; + + for (i = 0; i < NUM_DRAW_PLAYER_STAGES; i++) + for (j = 0; j < MAX_PLAYERS; j++) + if (stored_player[j].active) + DrawPlayerExt(&stored_player[j], i); +} + +void DrawPlayerField(int x, int y) +{ + if (!IS_PLAYER(x, y)) + return; - MarkTileDirty(sx, sy); + DrawPlayer(PLAYERINFO(x, y)); } // ---------------------------------------------------------------------------- @@ -4314,12 +4345,15 @@ static int RequestHandleEvents(unsigned int req_state) switch (request_gadget_id) { case TOOL_CTRL_ID_YES: + case TOOL_CTRL_ID_TOUCH_YES: result = TRUE; break; case TOOL_CTRL_ID_NO: + case TOOL_CTRL_ID_TOUCH_NO: result = FALSE; break; case TOOL_CTRL_ID_CONFIRM: + case TOOL_CTRL_ID_TOUCH_CONFIRM: result = TRUE | FALSE; break; @@ -4337,6 +4371,8 @@ static int RequestHandleEvents(unsigned int req_state) break; default: + // only check clickable animations if no request gadget clicked + HandleGlobalAnimClicks(mx, my, button_status, FALSE); break; } @@ -4649,10 +4685,13 @@ static boolean RequestDoor(char *text, unsigned int req_state) { 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) { @@ -4811,17 +4850,17 @@ static boolean RequestEnvelope(char *text, unsigned int req_state) boolean Request(char *text, unsigned int req_state) { - boolean overlay_active = GetOverlayActive(); + boolean overlay_enabled = GetOverlayEnabled(); boolean result; - SetOverlayActive(FALSE); + SetOverlayEnabled(FALSE); if (global.use_envelope_request) result = RequestEnvelope(text, req_state); else result = RequestDoor(text, req_state); - SetOverlayActive(overlay_active); + SetOverlayEnabled(overlay_enabled); return result; } @@ -5524,36 +5563,49 @@ static struct int graphic; struct TextPosInfo *pos; int gadget_id; + boolean is_touch_button; char *infotext; } toolbutton_info[NUM_TOOL_BUTTONS] = { { IMG_GFX_REQUEST_BUTTON_YES, &request.button.yes, - TOOL_CTRL_ID_YES, "yes" + TOOL_CTRL_ID_YES, FALSE, "yes" }, { IMG_GFX_REQUEST_BUTTON_NO, &request.button.no, - TOOL_CTRL_ID_NO, "no" + TOOL_CTRL_ID_NO, FALSE, "no" }, { IMG_GFX_REQUEST_BUTTON_CONFIRM, &request.button.confirm, - TOOL_CTRL_ID_CONFIRM, "confirm" + TOOL_CTRL_ID_CONFIRM, FALSE, "confirm" }, { IMG_GFX_REQUEST_BUTTON_PLAYER_1, &request.button.player_1, - TOOL_CTRL_ID_PLAYER_1, "player 1" + TOOL_CTRL_ID_PLAYER_1, FALSE, "player 1" }, { IMG_GFX_REQUEST_BUTTON_PLAYER_2, &request.button.player_2, - TOOL_CTRL_ID_PLAYER_2, "player 2" + TOOL_CTRL_ID_PLAYER_2, FALSE, "player 2" }, { IMG_GFX_REQUEST_BUTTON_PLAYER_3, &request.button.player_3, - TOOL_CTRL_ID_PLAYER_3, "player 3" + TOOL_CTRL_ID_PLAYER_3, FALSE, "player 3" }, { IMG_GFX_REQUEST_BUTTON_PLAYER_4, &request.button.player_4, - TOOL_CTRL_ID_PLAYER_4, "player 4" + TOOL_CTRL_ID_PLAYER_4, FALSE, "player 4" + }, + { + IMG_GFX_REQUEST_BUTTON_TOUCH_YES, &request.button.touch_yes, + TOOL_CTRL_ID_TOUCH_YES, TRUE, "yes" + }, + { + IMG_GFX_REQUEST_BUTTON_TOUCH_NO, &request.button.touch_no, + TOOL_CTRL_ID_TOUCH_NO, TRUE, "no" + }, + { + IMG_GFX_REQUEST_BUTTON_TOUCH_CONFIRM, &request.button.touch_confirm, + TOOL_CTRL_ID_TOUCH_CONFIRM, TRUE, "confirm" } }; @@ -5570,8 +5622,9 @@ void CreateToolButtons(void) Bitmap *deco_bitmap = None; int deco_x = 0, deco_y = 0, deco_xpos = 0, deco_ypos = 0; unsigned int event_mask = GD_EVENT_RELEASED; - int dx = DX; - int dy = DY; + 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; @@ -5580,9 +5633,9 @@ void CreateToolButtons(void) int y = pos->y; int id = i; - if (global.use_envelope_request) + if (global.use_envelope_request && !is_touch_button) { - setRequestPosition(&dx, &dy, TRUE); + 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 || @@ -5629,8 +5682,8 @@ void CreateToolButtons(void) gi = CreateGadget(GDI_CUSTOM_ID, id, GDI_IMAGE_ID, graphic, GDI_INFO_TEXT, toolbutton_info[i].infotext, - GDI_X, dx + x, - GDI_Y, dy + y, + GDI_X, base_x + x, + GDI_Y, base_y + y, GDI_WIDTH, gfx->width, GDI_HEIGHT, gfx->height, GDI_TYPE, GD_TYPE_NORMAL_BUTTON, @@ -5642,6 +5695,7 @@ void CreateToolButtons(void) 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); @@ -5690,168 +5744,370 @@ em_object_mapping_list[] = Xblank, TRUE, FALSE, EL_EMPTY, -1, -1 }, + { - Yacid_splash_eB, FALSE, FALSE, + Xacid_splash_e, FALSE, FALSE, EL_ACID_SPLASH_RIGHT, -1, -1 }, { - Yacid_splash_wB, FALSE, FALSE, + Xacid_splash_w, FALSE, FALSE, EL_ACID_SPLASH_LEFT, -1, -1 }, -#ifdef EM_ENGINE_BAD_ROLL { - Xstone_force_e, FALSE, FALSE, - EL_ROCK, -1, MV_BIT_RIGHT + Xplant, TRUE, FALSE, + EL_EMC_PLANT, -1, -1 }, { - Xstone_force_w, FALSE, FALSE, - EL_ROCK, -1, MV_BIT_LEFT + Yplant, FALSE, FALSE, + EL_EMC_PLANT, -1, -1 }, + { - Xnut_force_e, FALSE, FALSE, - EL_NUT, -1, MV_BIT_RIGHT + Xacid_1, TRUE, FALSE, + EL_ACID, -1, -1 }, { - Xnut_force_w, FALSE, FALSE, - EL_NUT, -1, MV_BIT_LEFT + Xacid_2, FALSE, FALSE, + EL_ACID, -1, -1 }, { - Xspring_force_e, FALSE, FALSE, - EL_SPRING, -1, MV_BIT_RIGHT + Xacid_3, FALSE, FALSE, + EL_ACID, -1, -1 }, { - Xspring_force_w, FALSE, FALSE, - EL_SPRING, -1, MV_BIT_LEFT + Xacid_4, FALSE, FALSE, + EL_ACID, -1, -1 }, { - Xemerald_force_e, FALSE, FALSE, - EL_EMERALD, -1, MV_BIT_RIGHT + Xacid_5, FALSE, FALSE, + EL_ACID, -1, -1 }, { - Xemerald_force_w, FALSE, FALSE, - EL_EMERALD, -1, MV_BIT_LEFT + Xacid_6, FALSE, FALSE, + EL_ACID, -1, -1 }, { - Xdiamond_force_e, FALSE, FALSE, - EL_DIAMOND, -1, MV_BIT_RIGHT + Xacid_7, FALSE, FALSE, + EL_ACID, -1, -1 }, { - Xdiamond_force_w, FALSE, FALSE, - EL_DIAMOND, -1, MV_BIT_LEFT + Xacid_8, FALSE, FALSE, + EL_ACID, -1, -1 }, + { - Xbomb_force_e, FALSE, FALSE, - EL_BOMB, -1, MV_BIT_RIGHT + Xfake_acid_1, TRUE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 }, { - Xbomb_force_w, FALSE, FALSE, - EL_BOMB, -1, MV_BIT_LEFT + Xfake_acid_2, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 }, -#endif // EM_ENGINE_BAD_ROLL - { - Xstone, TRUE, FALSE, - EL_ROCK, -1, -1 + Xfake_acid_3, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 }, { - Xstone_pause, FALSE, FALSE, - EL_ROCK, -1, -1 + Xfake_acid_4, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 }, { - Xstone_fall, FALSE, FALSE, - EL_ROCK, -1, -1 + Xfake_acid_5, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 }, { - Ystone_s, FALSE, FALSE, - EL_ROCK, ACTION_FALLING, -1 + Xfake_acid_6, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 }, { - Ystone_sB, FALSE, TRUE, - EL_ROCK, ACTION_FALLING, -1 + Xfake_acid_7, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 }, { - Ystone_e, FALSE, FALSE, - EL_ROCK, ACTION_MOVING, MV_BIT_RIGHT + Xfake_acid_8, FALSE, FALSE, + EL_EMC_FAKE_ACID, -1, -1 }, + { - Ystone_eB, FALSE, TRUE, - EL_ROCK, ACTION_MOVING, MV_BIT_RIGHT + Xgrass, TRUE, FALSE, + EL_EMC_GRASS, -1, -1 }, { - Ystone_w, FALSE, FALSE, - EL_ROCK, ACTION_MOVING, MV_BIT_LEFT + Ygrass_nB, FALSE, FALSE, + EL_EMC_GRASS, ACTION_DIGGING, MV_BIT_UP }, { - Ystone_wB, FALSE, TRUE, - EL_ROCK, ACTION_MOVING, MV_BIT_LEFT + Ygrass_eB, FALSE, FALSE, + EL_EMC_GRASS, ACTION_DIGGING, MV_BIT_RIGHT }, { - Xnut, TRUE, FALSE, - EL_NUT, -1, -1 + Ygrass_sB, FALSE, FALSE, + EL_EMC_GRASS, ACTION_DIGGING, MV_BIT_DOWN }, { - Xnut_pause, FALSE, FALSE, - EL_NUT, -1, -1 + Ygrass_wB, FALSE, FALSE, + EL_EMC_GRASS, ACTION_DIGGING, MV_BIT_LEFT }, + { - Xnut_fall, FALSE, FALSE, - EL_NUT, -1, -1 + Xdirt, TRUE, FALSE, + EL_SAND, -1, -1 }, { - Ynut_s, FALSE, FALSE, - EL_NUT, ACTION_FALLING, -1 + Ydirt_nB, FALSE, FALSE, + EL_SAND, ACTION_DIGGING, MV_BIT_UP }, { - Ynut_sB, FALSE, TRUE, - EL_NUT, ACTION_FALLING, -1 + Ydirt_eB, FALSE, FALSE, + EL_SAND, ACTION_DIGGING, MV_BIT_RIGHT }, { - Ynut_e, FALSE, FALSE, - EL_NUT, ACTION_MOVING, MV_BIT_RIGHT + Ydirt_sB, FALSE, FALSE, + EL_SAND, ACTION_DIGGING, MV_BIT_DOWN }, { - Ynut_eB, FALSE, TRUE, - EL_NUT, ACTION_MOVING, MV_BIT_RIGHT + Ydirt_wB, FALSE, FALSE, + EL_SAND, ACTION_DIGGING, MV_BIT_LEFT }, + { - Ynut_w, FALSE, FALSE, - EL_NUT, ACTION_MOVING, MV_BIT_LEFT + Xandroid, TRUE, FALSE, + EL_EMC_ANDROID, ACTION_ACTIVE, -1 }, { - Ynut_wB, FALSE, TRUE, - EL_NUT, ACTION_MOVING, MV_BIT_LEFT + Xandroid_1_n, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_UP + }, + { + Xandroid_2_n, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_UP + }, + { + Xandroid_1_e, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_RIGHT + }, + { + Xandroid_2_e, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_RIGHT + }, + { + Xandroid_1_w, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_LEFT + }, + { + Xandroid_2_w, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_LEFT + }, + { + Xandroid_1_s, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_DOWN + }, + { + Xandroid_2_s, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_DOWN + }, + { + Yandroid_n, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_UP + }, + { + Yandroid_nB, FALSE, TRUE, + EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_UP + }, + { + Yandroid_ne, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_UPRIGHT + }, + { + Yandroid_neB, FALSE, TRUE, + EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_UPRIGHT + }, + { + Yandroid_e, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_RIGHT + }, + { + Yandroid_eB, FALSE, TRUE, + EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_RIGHT + }, + { + Yandroid_se, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_DOWNRIGHT + }, + { + Yandroid_seB, FALSE, TRUE, + EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_DOWNRIGHT + }, + { + Yandroid_s, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_DOWN + }, + { + Yandroid_sB, FALSE, TRUE, + EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_DOWN + }, + { + Yandroid_sw, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_DOWNLEFT + }, + { + Yandroid_swB, FALSE, TRUE, + EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_DOWNLEFT + }, + { + Yandroid_w, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_LEFT + }, + { + Yandroid_wB, FALSE, TRUE, + EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_LEFT + }, + { + Yandroid_nw, FALSE, FALSE, + EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_UPLEFT + }, + { + Yandroid_nwB, FALSE, TRUE, + EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_UPLEFT + }, + + { + Xeater_n, TRUE, FALSE, + EL_YAMYAM_UP, -1, -1 + }, + { + Xeater_e, TRUE, FALSE, + EL_YAMYAM_RIGHT, -1, -1 + }, + { + Xeater_w, TRUE, FALSE, + EL_YAMYAM_LEFT, -1, -1 + }, + { + Xeater_s, TRUE, FALSE, + EL_YAMYAM_DOWN, -1, -1 + }, + { + Yeater_n, FALSE, FALSE, + EL_YAMYAM, ACTION_MOVING, MV_BIT_UP + }, + { + Yeater_nB, FALSE, TRUE, + EL_YAMYAM, ACTION_MOVING, MV_BIT_UP + }, + { + Yeater_e, FALSE, FALSE, + EL_YAMYAM, ACTION_MOVING, MV_BIT_RIGHT + }, + { + Yeater_eB, FALSE, TRUE, + EL_YAMYAM, ACTION_MOVING, MV_BIT_RIGHT + }, + { + Yeater_s, FALSE, FALSE, + EL_YAMYAM, ACTION_MOVING, MV_BIT_DOWN + }, + { + Yeater_sB, FALSE, TRUE, + EL_YAMYAM, ACTION_MOVING, MV_BIT_DOWN + }, + { + Yeater_w, FALSE, FALSE, + EL_YAMYAM, ACTION_MOVING, MV_BIT_LEFT + }, + { + Yeater_wB, FALSE, TRUE, + EL_YAMYAM, ACTION_MOVING, MV_BIT_LEFT + }, + { + Yeater_stone, FALSE, FALSE, + EL_YAMYAM, ACTION_SMASHED_BY_ROCK, -1 + }, + { + Yeater_spring, FALSE, FALSE, + EL_YAMYAM, ACTION_SMASHED_BY_SPRING, -1 + }, + + { + Xalien, TRUE, FALSE, + EL_ROBOT, -1, -1 + }, + { + Xalien_pause, FALSE, FALSE, + EL_ROBOT, -1, -1 + }, + { + Yalien_n, FALSE, FALSE, + EL_ROBOT, ACTION_MOVING, MV_BIT_UP + }, + { + Yalien_nB, FALSE, TRUE, + EL_ROBOT, ACTION_MOVING, MV_BIT_UP + }, + { + Yalien_e, FALSE, FALSE, + EL_ROBOT, ACTION_MOVING, MV_BIT_RIGHT + }, + { + Yalien_eB, FALSE, TRUE, + EL_ROBOT, ACTION_MOVING, MV_BIT_RIGHT + }, + { + Yalien_s, FALSE, FALSE, + EL_ROBOT, ACTION_MOVING, MV_BIT_DOWN + }, + { + Yalien_sB, FALSE, TRUE, + EL_ROBOT, ACTION_MOVING, MV_BIT_DOWN + }, + { + Yalien_w, FALSE, FALSE, + EL_ROBOT, ACTION_MOVING, MV_BIT_LEFT + }, + { + Yalien_wB, FALSE, TRUE, + EL_ROBOT, ACTION_MOVING, MV_BIT_LEFT + }, + { + Yalien_stone, FALSE, FALSE, + EL_ROBOT, ACTION_SMASHED_BY_ROCK, -1 + }, + { + Yalien_spring, FALSE, FALSE, + EL_ROBOT, ACTION_SMASHED_BY_SPRING, -1 }, + { - Xbug_n, TRUE, FALSE, + Xbug_1_n, TRUE, FALSE, EL_BUG_UP, -1, -1 }, { - Xbug_e, TRUE, FALSE, + Xbug_1_e, TRUE, FALSE, EL_BUG_RIGHT, -1, -1 }, { - Xbug_s, TRUE, FALSE, + Xbug_1_s, TRUE, FALSE, EL_BUG_DOWN, -1, -1 }, { - Xbug_w, TRUE, FALSE, + Xbug_1_w, TRUE, FALSE, EL_BUG_LEFT, -1, -1 }, { - Xbug_gon, FALSE, FALSE, + Xbug_2_n, FALSE, FALSE, EL_BUG_UP, -1, -1 }, { - Xbug_goe, FALSE, FALSE, + Xbug_2_e, FALSE, FALSE, EL_BUG_RIGHT, -1, -1 }, { - Xbug_gos, FALSE, FALSE, + Xbug_2_s, FALSE, FALSE, EL_BUG_DOWN, -1, -1 }, { - Xbug_gow, FALSE, FALSE, + Xbug_2_w, FALSE, FALSE, EL_BUG_LEFT, -1, -1 }, { @@ -5926,36 +6182,37 @@ em_object_mapping_list[] = Ybug_spring, FALSE, FALSE, EL_BUG, ACTION_SMASHED_BY_SPRING, -1 }, + { - Xtank_n, TRUE, FALSE, + Xtank_1_n, TRUE, FALSE, EL_SPACESHIP_UP, -1, -1 }, { - Xtank_e, TRUE, FALSE, + Xtank_1_e, TRUE, FALSE, EL_SPACESHIP_RIGHT, -1, -1 }, { - Xtank_s, TRUE, FALSE, + Xtank_1_s, TRUE, FALSE, EL_SPACESHIP_DOWN, -1, -1 }, { - Xtank_w, TRUE, FALSE, + Xtank_1_w, TRUE, FALSE, EL_SPACESHIP_LEFT, -1, -1 }, { - Xtank_gon, FALSE, FALSE, + Xtank_2_n, FALSE, FALSE, EL_SPACESHIP_UP, -1, -1 }, { - Xtank_goe, FALSE, FALSE, + Xtank_2_e, FALSE, FALSE, EL_SPACESHIP_RIGHT, -1, -1 }, { - Xtank_gos, FALSE, FALSE, + Xtank_2_s, FALSE, FALSE, EL_SPACESHIP_DOWN, -1, -1 }, { - Xtank_gow, FALSE, FALSE, + Xtank_2_w, FALSE, FALSE, EL_SPACESHIP_LEFT, -1, -1 }, { @@ -6030,281 +6287,18 @@ em_object_mapping_list[] = Ytank_spring, FALSE, FALSE, EL_SPACESHIP, ACTION_SMASHED_BY_SPRING, -1 }, + { - Xandroid, TRUE, FALSE, - EL_EMC_ANDROID, ACTION_ACTIVE, -1 + Xemerald, TRUE, FALSE, + EL_EMERALD, -1, -1 }, { - Xandroid_1_n, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_UP + Xemerald_pause, FALSE, FALSE, + EL_EMERALD, -1, -1 }, { - Xandroid_2_n, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_UP - }, - { - Xandroid_1_e, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_RIGHT - }, - { - Xandroid_2_e, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_RIGHT - }, - { - Xandroid_1_w, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_LEFT - }, - { - Xandroid_2_w, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_LEFT - }, - { - Xandroid_1_s, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_DOWN - }, - { - Xandroid_2_s, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_ACTIVE, MV_BIT_DOWN - }, - { - Yandroid_n, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_UP - }, - { - Yandroid_nB, FALSE, TRUE, - EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_UP - }, - { - Yandroid_ne, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_UPRIGHT - }, - { - Yandroid_neB, FALSE, TRUE, - EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_UPRIGHT - }, - { - Yandroid_e, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_RIGHT - }, - { - Yandroid_eB, FALSE, TRUE, - EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_RIGHT - }, - { - Yandroid_se, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_DOWNRIGHT - }, - { - Yandroid_seB, FALSE, TRUE, - EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_DOWNRIGHT - }, - { - Yandroid_s, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_DOWN - }, - { - Yandroid_sB, FALSE, TRUE, - EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_DOWN - }, - { - Yandroid_sw, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_DOWNLEFT - }, - { - Yandroid_swB, FALSE, TRUE, - EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_DOWNLEFT - }, - { - Yandroid_w, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_LEFT - }, - { - Yandroid_wB, FALSE, TRUE, - EL_EMC_ANDROID, ACTION_MOVING, MV_BIT_LEFT - }, - { - Yandroid_nw, FALSE, FALSE, - EL_EMC_ANDROID, ACTION_GROWING, MV_BIT_UPLEFT - }, - { - Yandroid_nwB, FALSE, TRUE, - EL_EMC_ANDROID, ACTION_SHRINKING, MV_BIT_UPLEFT - }, - { - Xspring, TRUE, FALSE, - EL_SPRING, -1, -1 - }, - { - Xspring_pause, FALSE, FALSE, - EL_SPRING, -1, -1 - }, - { - Xspring_e, FALSE, FALSE, - EL_SPRING, -1, -1 - }, - { - Xspring_w, FALSE, FALSE, - EL_SPRING, -1, -1 - }, - { - Xspring_fall, FALSE, FALSE, - EL_SPRING, -1, -1 - }, - { - Yspring_s, FALSE, FALSE, - EL_SPRING, ACTION_FALLING, -1 - }, - { - Yspring_sB, FALSE, TRUE, - EL_SPRING, ACTION_FALLING, -1 - }, - { - Yspring_e, FALSE, FALSE, - EL_SPRING, ACTION_MOVING, MV_BIT_RIGHT - }, - { - Yspring_eB, FALSE, TRUE, - EL_SPRING, ACTION_MOVING, MV_BIT_RIGHT - }, - { - Yspring_w, FALSE, FALSE, - EL_SPRING, ACTION_MOVING, MV_BIT_LEFT - }, - { - Yspring_wB, FALSE, TRUE, - EL_SPRING, ACTION_MOVING, MV_BIT_LEFT - }, - { - Yspring_kill_e, FALSE, FALSE, - EL_SPRING, ACTION_EATING, MV_BIT_RIGHT - }, - { - Yspring_kill_eB, FALSE, TRUE, - EL_SPRING, ACTION_EATING, MV_BIT_RIGHT - }, - { - Yspring_kill_w, FALSE, FALSE, - EL_SPRING, ACTION_EATING, MV_BIT_LEFT - }, - { - Yspring_kill_wB, FALSE, TRUE, - EL_SPRING, ACTION_EATING, MV_BIT_LEFT - }, - { - Xeater_n, TRUE, FALSE, - EL_YAMYAM_UP, -1, -1 - }, - { - Xeater_e, TRUE, FALSE, - EL_YAMYAM_RIGHT, -1, -1 - }, - { - Xeater_w, TRUE, FALSE, - EL_YAMYAM_LEFT, -1, -1 - }, - { - Xeater_s, TRUE, FALSE, - EL_YAMYAM_DOWN, -1, -1 - }, - { - Yeater_n, FALSE, FALSE, - EL_YAMYAM, ACTION_MOVING, MV_BIT_UP - }, - { - Yeater_nB, FALSE, TRUE, - EL_YAMYAM, ACTION_MOVING, MV_BIT_UP - }, - { - Yeater_e, FALSE, FALSE, - EL_YAMYAM, ACTION_MOVING, MV_BIT_RIGHT - }, - { - Yeater_eB, FALSE, TRUE, - EL_YAMYAM, ACTION_MOVING, MV_BIT_RIGHT - }, - { - Yeater_s, FALSE, FALSE, - EL_YAMYAM, ACTION_MOVING, MV_BIT_DOWN - }, - { - Yeater_sB, FALSE, TRUE, - EL_YAMYAM, ACTION_MOVING, MV_BIT_DOWN - }, - { - Yeater_w, FALSE, FALSE, - EL_YAMYAM, ACTION_MOVING, MV_BIT_LEFT - }, - { - Yeater_wB, FALSE, TRUE, - EL_YAMYAM, ACTION_MOVING, MV_BIT_LEFT - }, - { - Yeater_stone, FALSE, FALSE, - EL_YAMYAM, ACTION_SMASHED_BY_ROCK, -1 - }, - { - Yeater_spring, FALSE, FALSE, - EL_YAMYAM, ACTION_SMASHED_BY_SPRING, -1 - }, - { - Xalien, TRUE, FALSE, - EL_ROBOT, -1, -1 - }, - { - Xalien_pause, FALSE, FALSE, - EL_ROBOT, -1, -1 - }, - { - Yalien_n, FALSE, FALSE, - EL_ROBOT, ACTION_MOVING, MV_BIT_UP - }, - { - Yalien_nB, FALSE, TRUE, - EL_ROBOT, ACTION_MOVING, MV_BIT_UP - }, - { - Yalien_e, FALSE, FALSE, - EL_ROBOT, ACTION_MOVING, MV_BIT_RIGHT - }, - { - Yalien_eB, FALSE, TRUE, - EL_ROBOT, ACTION_MOVING, MV_BIT_RIGHT - }, - { - Yalien_s, FALSE, FALSE, - EL_ROBOT, ACTION_MOVING, MV_BIT_DOWN - }, - { - Yalien_sB, FALSE, TRUE, - EL_ROBOT, ACTION_MOVING, MV_BIT_DOWN - }, - { - Yalien_w, FALSE, FALSE, - EL_ROBOT, ACTION_MOVING, MV_BIT_LEFT - }, - { - Yalien_wB, FALSE, TRUE, - EL_ROBOT, ACTION_MOVING, MV_BIT_LEFT - }, - { - Yalien_stone, FALSE, FALSE, - EL_ROBOT, ACTION_SMASHED_BY_ROCK, -1 - }, - { - Yalien_spring, FALSE, FALSE, - EL_ROBOT, ACTION_SMASHED_BY_SPRING, -1 - }, - { - Xemerald, TRUE, FALSE, - EL_EMERALD, -1, -1 - }, - { - Xemerald_pause, FALSE, FALSE, - EL_EMERALD, -1, -1 - }, - { - Xemerald_fall, FALSE, FALSE, - EL_EMERALD, -1, -1 + Xemerald_fall, FALSE, FALSE, + EL_EMERALD, -1, -1 }, { Xemerald_shine, FALSE, FALSE, @@ -6335,13 +6329,10 @@ em_object_mapping_list[] = EL_EMERALD, ACTION_MOVING, MV_BIT_LEFT }, { - Yemerald_eat, FALSE, FALSE, + Yemerald_blank, FALSE, FALSE, EL_EMERALD, ACTION_COLLECTING, -1 }, - { - Yemerald_stone, FALSE, FALSE, - EL_NUT, ACTION_BREAKING, -1 - }, + { Xdiamond, TRUE, FALSE, EL_DIAMOND, -1, -1 @@ -6383,45 +6374,51 @@ em_object_mapping_list[] = EL_DIAMOND, ACTION_MOVING, MV_BIT_LEFT }, { - Ydiamond_eat, FALSE, FALSE, + Ydiamond_blank, FALSE, FALSE, EL_DIAMOND, ACTION_COLLECTING, -1 }, { Ydiamond_stone, FALSE, FALSE, EL_DIAMOND, ACTION_SMASHED_BY_ROCK, -1 }, + { - Xdrip_fall, TRUE, FALSE, - EL_AMOEBA_DROP, -1, -1 + Xstone, TRUE, FALSE, + EL_ROCK, -1, -1 }, { - Xdrip_stretch, FALSE, FALSE, - EL_AMOEBA_DROP, ACTION_FALLING, -1 + Xstone_pause, FALSE, FALSE, + EL_ROCK, -1, -1 }, { - Xdrip_stretchB, FALSE, TRUE, - EL_AMOEBA_DROP, ACTION_FALLING, -1 + Xstone_fall, FALSE, FALSE, + EL_ROCK, -1, -1 }, { - Xdrip_eat, FALSE, FALSE, - EL_AMOEBA_DROP, ACTION_GROWING, -1 + Ystone_s, FALSE, FALSE, + EL_ROCK, ACTION_FALLING, -1 }, { - Ydrip_s1, FALSE, FALSE, - EL_AMOEBA_DROP, ACTION_FALLING, -1 + Ystone_sB, FALSE, TRUE, + EL_ROCK, ACTION_FALLING, -1 }, { - Ydrip_s1B, FALSE, TRUE, - EL_AMOEBA_DROP, ACTION_FALLING, -1 + Ystone_e, FALSE, FALSE, + EL_ROCK, ACTION_MOVING, MV_BIT_RIGHT }, { - Ydrip_s2, FALSE, FALSE, - EL_AMOEBA_DROP, ACTION_FALLING, -1 + Ystone_eB, FALSE, TRUE, + EL_ROCK, ACTION_MOVING, MV_BIT_RIGHT }, { - Ydrip_s2B, FALSE, TRUE, - EL_AMOEBA_DROP, ACTION_FALLING, -1 + Ystone_w, FALSE, FALSE, + EL_ROCK, ACTION_MOVING, MV_BIT_LEFT }, + { + Ystone_wB, FALSE, TRUE, + EL_ROCK, ACTION_MOVING, MV_BIT_LEFT + }, + { Xbomb, TRUE, FALSE, EL_BOMB, -1, -1 @@ -6459,229 +6456,343 @@ em_object_mapping_list[] = EL_BOMB, ACTION_MOVING, MV_BIT_LEFT }, { - Ybomb_eat, FALSE, FALSE, + Ybomb_blank, FALSE, FALSE, EL_BOMB, ACTION_ACTIVATING, -1 }, + { - Xballoon, TRUE, FALSE, - EL_BALLOON, -1, -1 + Xnut, TRUE, FALSE, + EL_NUT, -1, -1 }, { - Yballoon_n, FALSE, FALSE, - EL_BALLOON, ACTION_MOVING, MV_BIT_UP + Xnut_pause, FALSE, FALSE, + EL_NUT, -1, -1 }, { - Yballoon_nB, FALSE, TRUE, - EL_BALLOON, ACTION_MOVING, MV_BIT_UP + Xnut_fall, FALSE, FALSE, + EL_NUT, -1, -1 }, { - Yballoon_e, FALSE, FALSE, - EL_BALLOON, ACTION_MOVING, MV_BIT_RIGHT + Ynut_s, FALSE, FALSE, + EL_NUT, ACTION_FALLING, -1 }, { - Yballoon_eB, FALSE, TRUE, - EL_BALLOON, ACTION_MOVING, MV_BIT_RIGHT + Ynut_sB, FALSE, TRUE, + EL_NUT, ACTION_FALLING, -1 }, { - Yballoon_s, FALSE, FALSE, - EL_BALLOON, ACTION_MOVING, MV_BIT_DOWN + Ynut_e, FALSE, FALSE, + EL_NUT, ACTION_MOVING, MV_BIT_RIGHT }, { - Yballoon_sB, FALSE, TRUE, - EL_BALLOON, ACTION_MOVING, MV_BIT_DOWN + Ynut_eB, FALSE, TRUE, + EL_NUT, ACTION_MOVING, MV_BIT_RIGHT }, { - Yballoon_w, FALSE, FALSE, - EL_BALLOON, ACTION_MOVING, MV_BIT_LEFT + Ynut_w, FALSE, FALSE, + EL_NUT, ACTION_MOVING, MV_BIT_LEFT }, { - Yballoon_wB, FALSE, TRUE, - EL_BALLOON, ACTION_MOVING, MV_BIT_LEFT + Ynut_wB, FALSE, TRUE, + EL_NUT, ACTION_MOVING, MV_BIT_LEFT }, { - Xgrass, TRUE, FALSE, - EL_EMC_GRASS, -1, -1 + Ynut_stone, FALSE, FALSE, + EL_NUT, ACTION_BREAKING, -1 }, + { - Ygrass_nB, FALSE, FALSE, - EL_EMC_GRASS, ACTION_DIGGING, MV_BIT_UP + Xspring, TRUE, FALSE, + EL_SPRING, -1, -1 }, { - Ygrass_eB, FALSE, FALSE, - EL_EMC_GRASS, ACTION_DIGGING, MV_BIT_RIGHT + Xspring_pause, FALSE, FALSE, + EL_SPRING, -1, -1 }, { - Ygrass_sB, FALSE, FALSE, - EL_EMC_GRASS, ACTION_DIGGING, MV_BIT_DOWN + Xspring_e, FALSE, FALSE, + EL_SPRING, -1, -1 }, { - Ygrass_wB, FALSE, FALSE, - EL_EMC_GRASS, ACTION_DIGGING, MV_BIT_LEFT + Xspring_w, FALSE, FALSE, + EL_SPRING, -1, -1 }, { - Xdirt, TRUE, FALSE, - EL_SAND, -1, -1 + Xspring_fall, FALSE, FALSE, + EL_SPRING, -1, -1 }, { - Ydirt_nB, FALSE, FALSE, - EL_SAND, ACTION_DIGGING, MV_BIT_UP + Yspring_s, FALSE, FALSE, + EL_SPRING, ACTION_FALLING, -1 }, { - Ydirt_eB, FALSE, FALSE, - EL_SAND, ACTION_DIGGING, MV_BIT_RIGHT + Yspring_sB, FALSE, TRUE, + EL_SPRING, ACTION_FALLING, -1 + }, + { + Yspring_e, FALSE, FALSE, + EL_SPRING, ACTION_MOVING, MV_BIT_RIGHT + }, + { + Yspring_eB, FALSE, TRUE, + EL_SPRING, ACTION_MOVING, MV_BIT_RIGHT + }, + { + Yspring_w, FALSE, FALSE, + EL_SPRING, ACTION_MOVING, MV_BIT_LEFT + }, + { + Yspring_wB, FALSE, TRUE, + EL_SPRING, ACTION_MOVING, MV_BIT_LEFT + }, + { + Yspring_alien_e, FALSE, FALSE, + EL_SPRING, ACTION_EATING, MV_BIT_RIGHT + }, + { + Yspring_alien_eB, FALSE, TRUE, + EL_SPRING, ACTION_EATING, MV_BIT_RIGHT + }, + { + Yspring_alien_w, FALSE, FALSE, + EL_SPRING, ACTION_EATING, MV_BIT_LEFT + }, + { + Yspring_alien_wB, FALSE, TRUE, + EL_SPRING, ACTION_EATING, MV_BIT_LEFT + }, + + { + Xpush_emerald_e, FALSE, FALSE, + EL_EMERALD, -1, MV_BIT_RIGHT + }, + { + Xpush_emerald_w, FALSE, FALSE, + EL_EMERALD, -1, MV_BIT_LEFT + }, + { + Xpush_diamond_e, FALSE, FALSE, + EL_DIAMOND, -1, MV_BIT_RIGHT + }, + { + Xpush_diamond_w, FALSE, FALSE, + EL_DIAMOND, -1, MV_BIT_LEFT + }, + { + Xpush_stone_e, FALSE, FALSE, + EL_ROCK, -1, MV_BIT_RIGHT + }, + { + Xpush_stone_w, FALSE, FALSE, + EL_ROCK, -1, MV_BIT_LEFT + }, + { + Xpush_bomb_e, FALSE, FALSE, + EL_BOMB, -1, MV_BIT_RIGHT + }, + { + Xpush_bomb_w, FALSE, FALSE, + EL_BOMB, -1, MV_BIT_LEFT + }, + { + Xpush_nut_e, FALSE, FALSE, + EL_NUT, -1, MV_BIT_RIGHT + }, + { + Xpush_nut_w, FALSE, FALSE, + EL_NUT, -1, MV_BIT_LEFT + }, + { + Xpush_spring_e, FALSE, FALSE, + EL_SPRING, -1, MV_BIT_RIGHT + }, + { + Xpush_spring_w, FALSE, FALSE, + EL_SPRING, -1, MV_BIT_LEFT + }, + + { + Xdynamite, TRUE, FALSE, + EL_EM_DYNAMITE, -1, -1 + }, + { + Ydynamite_blank, FALSE, FALSE, + EL_EM_DYNAMITE, ACTION_COLLECTING, -1 + }, + { + Xdynamite_1, TRUE, FALSE, + EL_EM_DYNAMITE_ACTIVE, -1, -1 + }, + { + Xdynamite_2, FALSE, FALSE, + EL_EM_DYNAMITE_ACTIVE, -1, -1 + }, + { + Xdynamite_3, FALSE, FALSE, + EL_EM_DYNAMITE_ACTIVE, -1, -1 + }, + { + Xdynamite_4, FALSE, FALSE, + EL_EM_DYNAMITE_ACTIVE, -1, -1 }, + { - Ydirt_sB, FALSE, FALSE, - EL_SAND, ACTION_DIGGING, MV_BIT_DOWN + Xkey_1, TRUE, FALSE, + EL_EM_KEY_1, -1, -1 }, { - Ydirt_wB, FALSE, FALSE, - EL_SAND, ACTION_DIGGING, MV_BIT_LEFT + Xkey_2, TRUE, FALSE, + EL_EM_KEY_2, -1, -1 }, { - Xacid_ne, TRUE, FALSE, - EL_ACID_POOL_TOPRIGHT, -1, -1 + Xkey_3, TRUE, FALSE, + EL_EM_KEY_3, -1, -1 }, { - Xacid_se, TRUE, FALSE, - EL_ACID_POOL_BOTTOMRIGHT, -1, -1 + Xkey_4, TRUE, FALSE, + EL_EM_KEY_4, -1, -1 }, { - Xacid_s, TRUE, FALSE, - EL_ACID_POOL_BOTTOM, -1, -1 + Xkey_5, TRUE, FALSE, + EL_EMC_KEY_5, -1, -1 }, { - Xacid_sw, TRUE, FALSE, - EL_ACID_POOL_BOTTOMLEFT, -1, -1 + Xkey_6, TRUE, FALSE, + EL_EMC_KEY_6, -1, -1 }, { - Xacid_nw, TRUE, FALSE, - EL_ACID_POOL_TOPLEFT, -1, -1 + Xkey_7, TRUE, FALSE, + EL_EMC_KEY_7, -1, -1 }, { - Xacid_1, TRUE, FALSE, - EL_ACID, -1, -1 + Xkey_8, TRUE, FALSE, + EL_EMC_KEY_8, -1, -1 }, + { - Xacid_2, FALSE, FALSE, - EL_ACID, -1, -1 + Xdoor_1, TRUE, FALSE, + EL_EM_GATE_1, -1, -1 }, { - Xacid_3, FALSE, FALSE, - EL_ACID, -1, -1 + Xdoor_2, TRUE, FALSE, + EL_EM_GATE_2, -1, -1 }, { - Xacid_4, FALSE, FALSE, - EL_ACID, -1, -1 + Xdoor_3, TRUE, FALSE, + EL_EM_GATE_3, -1, -1 }, { - Xacid_5, FALSE, FALSE, - EL_ACID, -1, -1 + Xdoor_4, TRUE, FALSE, + EL_EM_GATE_4, -1, -1 }, { - Xacid_6, FALSE, FALSE, - EL_ACID, -1, -1 + Xdoor_5, TRUE, FALSE, + EL_EMC_GATE_5, -1, -1 }, { - Xacid_7, FALSE, FALSE, - EL_ACID, -1, -1 + Xdoor_6, TRUE, FALSE, + EL_EMC_GATE_6, -1, -1 }, { - Xacid_8, FALSE, FALSE, - EL_ACID, -1, -1 + Xdoor_7, TRUE, FALSE, + EL_EMC_GATE_7, -1, -1 }, { - Xball_1, TRUE, FALSE, - EL_EMC_MAGIC_BALL, -1, -1 + Xdoor_8, TRUE, FALSE, + EL_EMC_GATE_8, -1, -1 }, + { - Xball_1B, FALSE, FALSE, - EL_EMC_MAGIC_BALL, ACTION_ACTIVE, -1 + Xfake_door_1, TRUE, FALSE, + EL_EM_GATE_1_GRAY, -1, -1 }, { - Xball_2, FALSE, FALSE, - EL_EMC_MAGIC_BALL, ACTION_ACTIVE, -1 + Xfake_door_2, TRUE, FALSE, + EL_EM_GATE_2_GRAY, -1, -1 }, { - Xball_2B, FALSE, FALSE, - EL_EMC_MAGIC_BALL, ACTION_ACTIVE, -1 + Xfake_door_3, TRUE, FALSE, + EL_EM_GATE_3_GRAY, -1, -1 }, { - Yball_eat, FALSE, FALSE, - EL_EMC_MAGIC_BALL, ACTION_DROPPING, -1 + Xfake_door_4, TRUE, FALSE, + EL_EM_GATE_4_GRAY, -1, -1 }, { - Ykey_1_eat, FALSE, FALSE, - EL_EM_KEY_1, ACTION_COLLECTING, -1 + Xfake_door_5, TRUE, FALSE, + EL_EMC_GATE_5_GRAY, -1, -1 }, { - Ykey_2_eat, FALSE, FALSE, - EL_EM_KEY_2, ACTION_COLLECTING, -1 + Xfake_door_6, TRUE, FALSE, + EL_EMC_GATE_6_GRAY, -1, -1 }, { - Ykey_3_eat, FALSE, FALSE, - EL_EM_KEY_3, ACTION_COLLECTING, -1 + Xfake_door_7, TRUE, FALSE, + EL_EMC_GATE_7_GRAY, -1, -1 }, { - Ykey_4_eat, FALSE, FALSE, - EL_EM_KEY_4, ACTION_COLLECTING, -1 + Xfake_door_8, TRUE, FALSE, + EL_EMC_GATE_8_GRAY, -1, -1 }, + { - Ykey_5_eat, FALSE, FALSE, - EL_EMC_KEY_5, ACTION_COLLECTING, -1 + Xballoon, TRUE, FALSE, + EL_BALLOON, -1, -1 }, { - Ykey_6_eat, FALSE, FALSE, - EL_EMC_KEY_6, ACTION_COLLECTING, -1 + Yballoon_n, FALSE, FALSE, + EL_BALLOON, ACTION_MOVING, MV_BIT_UP }, { - Ykey_7_eat, FALSE, FALSE, - EL_EMC_KEY_7, ACTION_COLLECTING, -1 + Yballoon_nB, FALSE, TRUE, + EL_BALLOON, ACTION_MOVING, MV_BIT_UP }, { - Ykey_8_eat, FALSE, FALSE, - EL_EMC_KEY_8, ACTION_COLLECTING, -1 + Yballoon_e, FALSE, FALSE, + EL_BALLOON, ACTION_MOVING, MV_BIT_RIGHT }, { - Ylenses_eat, FALSE, FALSE, - EL_EMC_LENSES, ACTION_COLLECTING, -1 + Yballoon_eB, FALSE, TRUE, + EL_BALLOON, ACTION_MOVING, MV_BIT_RIGHT }, { - Ymagnify_eat, FALSE, FALSE, - EL_EMC_MAGNIFIER, ACTION_COLLECTING, -1 + Yballoon_s, FALSE, FALSE, + EL_BALLOON, ACTION_MOVING, MV_BIT_DOWN }, { - Ygrass_eat, FALSE, FALSE, - EL_EMC_GRASS, ACTION_SNAPPING, -1 + Yballoon_sB, FALSE, TRUE, + EL_BALLOON, ACTION_MOVING, MV_BIT_DOWN }, { - Ydirt_eat, FALSE, FALSE, - EL_SAND, ACTION_SNAPPING, -1 + Yballoon_w, FALSE, FALSE, + EL_BALLOON, ACTION_MOVING, MV_BIT_LEFT }, { - Xgrow_ns, TRUE, FALSE, - EL_EXPANDABLE_WALL_VERTICAL, -1, -1 + Yballoon_wB, FALSE, TRUE, + EL_BALLOON, ACTION_MOVING, MV_BIT_LEFT }, + { - Ygrow_ns_eat, FALSE, FALSE, - EL_EXPANDABLE_WALL_VERTICAL, ACTION_GROWING, -1 + Xball_1, TRUE, FALSE, + EL_EMC_MAGIC_BALL, -1, -1 }, { - Xgrow_ew, TRUE, FALSE, - EL_EXPANDABLE_WALL_HORIZONTAL, -1, -1 + Yball_1, FALSE, FALSE, + EL_EMC_MAGIC_BALL, ACTION_ACTIVE, -1 }, { - Ygrow_ew_eat, FALSE, FALSE, - EL_EXPANDABLE_WALL_HORIZONTAL, ACTION_GROWING, -1 + Xball_2, FALSE, FALSE, + EL_EMC_MAGIC_BALL, ACTION_ACTIVE, -1 }, { - Xwonderwall, TRUE, FALSE, - EL_MAGIC_WALL, -1, -1 + Yball_2, FALSE, FALSE, + EL_EMC_MAGIC_BALL, ACTION_ACTIVE, -1 }, { - XwonderwallB, FALSE, FALSE, - EL_MAGIC_WALL, ACTION_ACTIVE, -1 + Yball_blank, FALSE, FALSE, + EL_EMC_MAGIC_BALL, ACTION_DROPPING, -1 }, + { Xamoeba_1, TRUE, FALSE, EL_AMOEBA_DRY, ACTION_OTHER, -1 @@ -6714,158 +6825,134 @@ em_object_mapping_list[] = Xamoeba_8, FALSE, FALSE, EL_AMOEBA_WET, ACTION_OTHER, -1 }, + { - Xdoor_1, TRUE, FALSE, - EL_EM_GATE_1, -1, -1 - }, - { - Xdoor_2, TRUE, FALSE, - EL_EM_GATE_2, -1, -1 - }, - { - Xdoor_3, TRUE, FALSE, - EL_EM_GATE_3, -1, -1 - }, - { - Xdoor_4, TRUE, FALSE, - EL_EM_GATE_4, -1, -1 - }, - { - Xdoor_5, TRUE, FALSE, - EL_EMC_GATE_5, -1, -1 - }, - { - Xdoor_6, TRUE, FALSE, - EL_EMC_GATE_6, -1, -1 - }, - { - Xdoor_7, TRUE, FALSE, - EL_EMC_GATE_7, -1, -1 - }, - { - Xdoor_8, TRUE, FALSE, - EL_EMC_GATE_8, -1, -1 - }, - { - Xkey_1, TRUE, FALSE, - EL_EM_KEY_1, -1, -1 - }, - { - Xkey_2, TRUE, FALSE, - EL_EM_KEY_2, -1, -1 + Xdrip, FALSE, FALSE, + EL_AMOEBA_DROP, ACTION_GROWING, -1 }, { - Xkey_3, TRUE, FALSE, - EL_EM_KEY_3, -1, -1 + Xdrip_fall, TRUE, FALSE, + EL_AMOEBA_DROP, -1, -1 }, { - Xkey_4, TRUE, FALSE, - EL_EM_KEY_4, -1, -1 + Xdrip_stretch, FALSE, FALSE, + EL_AMOEBA_DROP, ACTION_FALLING, -1 }, { - Xkey_5, TRUE, FALSE, - EL_EMC_KEY_5, -1, -1 + Xdrip_stretchB, FALSE, TRUE, + EL_AMOEBA_DROP, ACTION_FALLING, -1 }, { - Xkey_6, TRUE, FALSE, - EL_EMC_KEY_6, -1, -1 + Ydrip_1_s, FALSE, FALSE, + EL_AMOEBA_DROP, ACTION_FALLING, -1 }, { - Xkey_7, TRUE, FALSE, - EL_EMC_KEY_7, -1, -1 + Ydrip_1_sB, FALSE, TRUE, + EL_AMOEBA_DROP, ACTION_FALLING, -1 }, { - Xkey_8, TRUE, FALSE, - EL_EMC_KEY_8, -1, -1 + Ydrip_2_s, FALSE, FALSE, + EL_AMOEBA_DROP, ACTION_FALLING, -1 }, { - Xwind_n, TRUE, FALSE, - EL_BALLOON_SWITCH_UP, -1, -1 + Ydrip_2_sB, FALSE, TRUE, + EL_AMOEBA_DROP, ACTION_FALLING, -1 }, + { - Xwind_e, TRUE, FALSE, - EL_BALLOON_SWITCH_RIGHT, -1, -1 + Xwonderwall, TRUE, FALSE, + EL_MAGIC_WALL, -1, -1 }, { - Xwind_s, TRUE, FALSE, - EL_BALLOON_SWITCH_DOWN, -1, -1 + XwonderwallB, FALSE, FALSE, + EL_MAGIC_WALL, ACTION_ACTIVE, -1 }, + { - Xwind_w, TRUE, FALSE, - EL_BALLOON_SWITCH_LEFT, -1, -1 + Xwheel, TRUE, FALSE, + EL_ROBOT_WHEEL, -1, -1 }, { - Xwind_nesw, TRUE, FALSE, - EL_BALLOON_SWITCH_ANY, -1, -1 + XwheelB, FALSE, FALSE, + EL_ROBOT_WHEEL, ACTION_ACTIVE, -1 }, + { - Xwind_stop, TRUE, FALSE, - EL_BALLOON_SWITCH_NONE, -1, -1 + Xswitch, TRUE, FALSE, + EL_EMC_MAGIC_BALL_SWITCH, -1, -1 }, { - Xexit, TRUE, FALSE, - EL_EM_EXIT_CLOSED, -1, -1 + XswitchB, FALSE, FALSE, + EL_EMC_MAGIC_BALL_SWITCH, ACTION_ACTIVE, -1 }, + { - Xexit_1, TRUE, FALSE, - EL_EM_EXIT_OPEN, -1, -1 + Xbumper, TRUE, FALSE, + EL_EMC_SPRING_BUMPER, -1, -1 }, { - Xexit_2, FALSE, FALSE, - EL_EM_EXIT_OPEN, -1, -1 + XbumperB, FALSE, FALSE, + EL_EMC_SPRING_BUMPER, ACTION_ACTIVE, -1 }, + { - Xexit_3, FALSE, FALSE, - EL_EM_EXIT_OPEN, -1, -1 + Xacid_nw, TRUE, FALSE, + EL_ACID_POOL_TOPLEFT, -1, -1 }, { - Xdynamite, TRUE, FALSE, - EL_EM_DYNAMITE, -1, -1 + Xacid_ne, TRUE, FALSE, + EL_ACID_POOL_TOPRIGHT, -1, -1 }, { - Ydynamite_eat, FALSE, FALSE, - EL_EM_DYNAMITE, ACTION_COLLECTING, -1 + Xacid_sw, TRUE, FALSE, + EL_ACID_POOL_BOTTOMLEFT, -1, -1 }, { - Xdynamite_1, TRUE, FALSE, - EL_EM_DYNAMITE_ACTIVE, -1, -1 + Xacid_s, TRUE, FALSE, + EL_ACID_POOL_BOTTOM, -1, -1 }, { - Xdynamite_2, FALSE, FALSE, - EL_EM_DYNAMITE_ACTIVE, -1, -1 + Xacid_se, TRUE, FALSE, + EL_ACID_POOL_BOTTOMRIGHT, -1, -1 }, + { - Xdynamite_3, FALSE, FALSE, - EL_EM_DYNAMITE_ACTIVE, -1, -1 + Xfake_blank, TRUE, FALSE, + EL_INVISIBLE_WALL, -1, -1 }, { - Xdynamite_4, FALSE, FALSE, - EL_EM_DYNAMITE_ACTIVE, -1, -1 + Xfake_blankB, FALSE, FALSE, + EL_INVISIBLE_WALL, ACTION_ACTIVE, -1 }, + { - Xbumper, TRUE, FALSE, - EL_EMC_SPRING_BUMPER, -1, -1 + Xfake_grass, TRUE, FALSE, + EL_EMC_FAKE_GRASS, -1, -1 }, { - XbumperB, FALSE, FALSE, - EL_EMC_SPRING_BUMPER, ACTION_ACTIVE, -1 + Xfake_grassB, FALSE, FALSE, + EL_EMC_FAKE_GRASS, ACTION_ACTIVE, -1 }, + { - Xwheel, TRUE, FALSE, - EL_ROBOT_WHEEL, -1, -1 + Xfake_amoeba, TRUE, FALSE, + EL_EMC_DRIPPER, -1, -1 }, { - XwheelB, FALSE, FALSE, - EL_ROBOT_WHEEL, ACTION_ACTIVE, -1 + Xfake_amoebaB, FALSE, FALSE, + EL_EMC_DRIPPER, ACTION_ACTIVE, -1 }, + { - Xswitch, TRUE, FALSE, - EL_EMC_MAGIC_BALL_SWITCH, -1, -1 + Xlenses, TRUE, FALSE, + EL_EMC_LENSES, -1, -1 }, + { - XswitchB, FALSE, FALSE, - EL_EMC_MAGIC_BALL_SWITCH, ACTION_ACTIVE, -1 + Xmagnify, TRUE, FALSE, + EL_EMC_MAGNIFIER, -1, -1 }, + { Xsand, TRUE, FALSE, EL_QUICKSAND_EMPTY, -1, -1 @@ -6890,38 +6977,6 @@ em_object_mapping_list[] = Xsand_stonein_4, FALSE, TRUE, EL_ROCK, ACTION_FILLING, -1 }, - { - Xsand_stonesand_1, FALSE, FALSE, - EL_QUICKSAND_EMPTYING, -1, -1 - }, - { - Xsand_stonesand_2, FALSE, FALSE, - EL_QUICKSAND_EMPTYING, -1, -1 - }, - { - Xsand_stonesand_3, FALSE, FALSE, - EL_QUICKSAND_EMPTYING, -1, -1 - }, - { - Xsand_stonesand_4, FALSE, FALSE, - EL_QUICKSAND_EMPTYING, -1, -1 - }, - { - Xsand_stonesand_quickout_1, FALSE, FALSE, - EL_QUICKSAND_EMPTYING, -1, -1 - }, - { - Xsand_stonesand_quickout_2, FALSE, FALSE, - EL_QUICKSAND_EMPTYING, -1, -1 - }, - { - Xsand_stoneout_1, FALSE, FALSE, - EL_ROCK, ACTION_EMPTYING, -1 - }, - { - Xsand_stoneout_2, FALSE, FALSE, - EL_ROCK, ACTION_EMPTYING, -1 - }, { Xsand_sandstone_1, FALSE, FALSE, EL_QUICKSAND_FILLING, -1, -1 @@ -6939,125 +6994,97 @@ em_object_mapping_list[] = EL_QUICKSAND_FILLING, -1, -1 }, { - Xplant, TRUE, FALSE, - EL_EMC_PLANT, -1, -1 - }, - { - Yplant, FALSE, FALSE, - EL_EMC_PLANT, -1, -1 - }, - { - Xlenses, TRUE, FALSE, - EL_EMC_LENSES, -1, -1 - }, - { - Xmagnify, TRUE, FALSE, - EL_EMC_MAGNIFIER, -1, -1 - }, - { - Xdripper, TRUE, FALSE, - EL_EMC_DRIPPER, -1, -1 - }, - { - XdripperB, FALSE, FALSE, - EL_EMC_DRIPPER, ACTION_ACTIVE, -1 - }, - { - Xfake_blank, TRUE, FALSE, - EL_INVISIBLE_WALL, -1, -1 - }, - { - Xfake_blankB, FALSE, FALSE, - EL_INVISIBLE_WALL, ACTION_ACTIVE, -1 - }, - { - Xfake_grass, TRUE, FALSE, - EL_EMC_FAKE_GRASS, -1, -1 + Xsand_stonesand_1, FALSE, FALSE, + EL_QUICKSAND_EMPTYING, -1, -1 }, { - Xfake_grassB, FALSE, FALSE, - EL_EMC_FAKE_GRASS, ACTION_ACTIVE, -1 + Xsand_stonesand_2, FALSE, FALSE, + EL_QUICKSAND_EMPTYING, -1, -1 }, { - Xfake_door_1, TRUE, FALSE, - EL_EM_GATE_1_GRAY, -1, -1 + Xsand_stonesand_3, FALSE, FALSE, + EL_QUICKSAND_EMPTYING, -1, -1 }, { - Xfake_door_2, TRUE, FALSE, - EL_EM_GATE_2_GRAY, -1, -1 + Xsand_stonesand_4, FALSE, FALSE, + EL_QUICKSAND_EMPTYING, -1, -1 }, { - Xfake_door_3, TRUE, FALSE, - EL_EM_GATE_3_GRAY, -1, -1 + Xsand_stoneout_1, FALSE, FALSE, + EL_ROCK, ACTION_EMPTYING, -1 }, { - Xfake_door_4, TRUE, FALSE, - EL_EM_GATE_4_GRAY, -1, -1 + Xsand_stoneout_2, FALSE, FALSE, + EL_ROCK, ACTION_EMPTYING, -1 }, { - Xfake_door_5, TRUE, FALSE, - EL_EMC_GATE_5_GRAY, -1, -1 + Xsand_stonesand_quickout_1, FALSE, FALSE, + EL_QUICKSAND_EMPTYING, -1, -1 }, { - Xfake_door_6, TRUE, FALSE, - EL_EMC_GATE_6_GRAY, -1, -1 + Xsand_stonesand_quickout_2, FALSE, FALSE, + EL_QUICKSAND_EMPTYING, -1, -1 }, + { - Xfake_door_7, TRUE, FALSE, - EL_EMC_GATE_7_GRAY, -1, -1 + Xslidewall_ns, TRUE, FALSE, + EL_EXPANDABLE_WALL_VERTICAL, -1, -1 }, { - Xfake_door_8, TRUE, FALSE, - EL_EMC_GATE_8_GRAY, -1, -1 + Yslidewall_ns_blank, FALSE, FALSE, + EL_EXPANDABLE_WALL_VERTICAL, ACTION_GROWING, -1 }, { - Xfake_acid_1, TRUE, FALSE, - EL_EMC_FAKE_ACID, -1, -1 + Xslidewall_ew, TRUE, FALSE, + EL_EXPANDABLE_WALL_HORIZONTAL, -1, -1 }, { - Xfake_acid_2, FALSE, FALSE, - EL_EMC_FAKE_ACID, -1, -1 + Yslidewall_ew_blank, FALSE, FALSE, + EL_EXPANDABLE_WALL_HORIZONTAL, ACTION_GROWING, -1 }, + { - Xfake_acid_3, FALSE, FALSE, - EL_EMC_FAKE_ACID, -1, -1 + Xwind_n, TRUE, FALSE, + EL_BALLOON_SWITCH_UP, -1, -1 }, { - Xfake_acid_4, FALSE, FALSE, - EL_EMC_FAKE_ACID, -1, -1 + Xwind_e, TRUE, FALSE, + EL_BALLOON_SWITCH_RIGHT, -1, -1 }, { - Xfake_acid_5, FALSE, FALSE, - EL_EMC_FAKE_ACID, -1, -1 + Xwind_s, TRUE, FALSE, + EL_BALLOON_SWITCH_DOWN, -1, -1 }, { - Xfake_acid_6, FALSE, FALSE, - EL_EMC_FAKE_ACID, -1, -1 + Xwind_w, TRUE, FALSE, + EL_BALLOON_SWITCH_LEFT, -1, -1 }, { - Xfake_acid_7, FALSE, FALSE, - EL_EMC_FAKE_ACID, -1, -1 + Xwind_any, TRUE, FALSE, + EL_BALLOON_SWITCH_ANY, -1, -1 }, { - Xfake_acid_8, FALSE, FALSE, - EL_EMC_FAKE_ACID, -1, -1 + Xwind_stop, TRUE, FALSE, + EL_BALLOON_SWITCH_NONE, -1, -1 }, + { - Xsteel_1, TRUE, FALSE, - EL_STEELWALL, -1, -1 + Xexit, TRUE, FALSE, + EL_EM_EXIT_CLOSED, -1, -1 }, { - Xsteel_2, TRUE, FALSE, - EL_EMC_STEELWALL_2, -1, -1 + Xexit_1, TRUE, FALSE, + EL_EM_EXIT_OPEN, -1, -1 }, { - Xsteel_3, TRUE, FALSE, - EL_EMC_STEELWALL_3, -1, -1 + Xexit_2, FALSE, FALSE, + EL_EM_EXIT_OPEN, -1, -1 }, { - Xsteel_4, TRUE, FALSE, - EL_EMC_STEELWALL_4, -1, -1 + Xexit_3, FALSE, FALSE, + EL_EM_EXIT_OPEN, -1, -1 }, + { Xwall_1, TRUE, FALSE, EL_WALL, -1, -1 @@ -7074,22 +7101,41 @@ em_object_mapping_list[] = Xwall_4, TRUE, FALSE, EL_EMC_WALL_16, -1, -1 }, + { - Xround_wall_1, TRUE, FALSE, + Xroundwall_1, TRUE, FALSE, EL_WALL_SLIPPERY, -1, -1 }, { - Xround_wall_2, TRUE, FALSE, + Xroundwall_2, TRUE, FALSE, EL_EMC_WALL_SLIPPERY_2, -1, -1 }, { - Xround_wall_3, TRUE, FALSE, + Xroundwall_3, TRUE, FALSE, EL_EMC_WALL_SLIPPERY_3, -1, -1 }, { - Xround_wall_4, TRUE, FALSE, + Xroundwall_4, TRUE, FALSE, EL_EMC_WALL_SLIPPERY_4, -1, -1 }, + + { + Xsteel_1, TRUE, FALSE, + EL_STEELWALL, -1, -1 + }, + { + Xsteel_2, TRUE, FALSE, + EL_EMC_STEELWALL_2, -1, -1 + }, + { + Xsteel_3, TRUE, FALSE, + EL_EMC_STEELWALL_3, -1, -1 + }, + { + Xsteel_4, TRUE, FALSE, + EL_EMC_STEELWALL_4, -1, -1 + }, + { Xdecor_1, TRUE, FALSE, EL_EMC_WALL_8, -1, -1 @@ -7138,6 +7184,7 @@ em_object_mapping_list[] = Xdecor_12, TRUE, FALSE, EL_EMC_WALL_12, -1, -1 }, + { Xalpha_0, TRUE, FALSE, EL_CHAR('0'), -1, -1 @@ -7323,6 +7370,55 @@ em_object_mapping_list[] = EL_CHAR(CHAR_BYTE_COPYRIGHT), -1, -1 }, + { + Ykey_1_blank, FALSE, FALSE, + EL_EM_KEY_1, ACTION_COLLECTING, -1 + }, + { + Ykey_2_blank, FALSE, FALSE, + EL_EM_KEY_2, ACTION_COLLECTING, -1 + }, + { + Ykey_3_blank, FALSE, FALSE, + EL_EM_KEY_3, ACTION_COLLECTING, -1 + }, + { + Ykey_4_blank, FALSE, FALSE, + EL_EM_KEY_4, ACTION_COLLECTING, -1 + }, + { + Ykey_5_blank, FALSE, FALSE, + EL_EMC_KEY_5, ACTION_COLLECTING, -1 + }, + { + Ykey_6_blank, FALSE, FALSE, + EL_EMC_KEY_6, ACTION_COLLECTING, -1 + }, + { + Ykey_7_blank, FALSE, FALSE, + EL_EMC_KEY_7, ACTION_COLLECTING, -1 + }, + { + Ykey_8_blank, FALSE, FALSE, + EL_EMC_KEY_8, ACTION_COLLECTING, -1 + }, + { + Ylenses_blank, FALSE, FALSE, + EL_EMC_LENSES, ACTION_COLLECTING, -1 + }, + { + Ymagnify_blank, FALSE, FALSE, + EL_EMC_MAGNIFIER, ACTION_COLLECTING, -1 + }, + { + Ygrass_blank, FALSE, FALSE, + EL_EMC_GRASS, ACTION_SNAPPING, -1 + }, + { + Ydirt_blank, FALSE, FALSE, + EL_SAND, ACTION_SNAPPING, -1 + }, + { Xboom_bug, FALSE, FALSE, EL_BUG, ACTION_EXPLODING, -1 @@ -7356,7 +7452,7 @@ em_object_mapping_list[] = EL_EMPTY, -1, -1 }, { - ZBORDER, FALSE, FALSE, + Zborder, FALSE, FALSE, EL_EMPTY, -1, -1 }, @@ -7378,211 +7474,211 @@ static struct Mapping_EM_to_RND_player em_player_mapping_list[] = { { - SPR_walk + 0, 0, + PLY_walk_n, 0, EL_PLAYER_1, ACTION_MOVING, MV_BIT_UP, }, { - SPR_walk + 1, 0, + PLY_walk_e, 0, EL_PLAYER_1, ACTION_MOVING, MV_BIT_RIGHT, }, { - SPR_walk + 2, 0, + PLY_walk_s, 0, EL_PLAYER_1, ACTION_MOVING, MV_BIT_DOWN, }, { - SPR_walk + 3, 0, + PLY_walk_w, 0, EL_PLAYER_1, ACTION_MOVING, MV_BIT_LEFT, }, { - SPR_push + 0, 0, + PLY_push_n, 0, EL_PLAYER_1, ACTION_PUSHING, MV_BIT_UP, }, { - SPR_push + 1, 0, + PLY_push_e, 0, EL_PLAYER_1, ACTION_PUSHING, MV_BIT_RIGHT, }, { - SPR_push + 2, 0, + PLY_push_s, 0, EL_PLAYER_1, ACTION_PUSHING, MV_BIT_DOWN, }, { - SPR_push + 3, 0, + PLY_push_w, 0, EL_PLAYER_1, ACTION_PUSHING, MV_BIT_LEFT, }, { - SPR_spray + 0, 0, + PLY_shoot_n, 0, EL_PLAYER_1, ACTION_SNAPPING, MV_BIT_UP, }, { - SPR_spray + 1, 0, + PLY_shoot_e, 0, EL_PLAYER_1, ACTION_SNAPPING, MV_BIT_RIGHT, }, { - SPR_spray + 2, 0, + PLY_shoot_s, 0, EL_PLAYER_1, ACTION_SNAPPING, MV_BIT_DOWN, }, { - SPR_spray + 3, 0, + PLY_shoot_w, 0, EL_PLAYER_1, ACTION_SNAPPING, MV_BIT_LEFT, }, { - SPR_walk + 0, 1, + PLY_walk_n, 1, EL_PLAYER_2, ACTION_MOVING, MV_BIT_UP, }, { - SPR_walk + 1, 1, + PLY_walk_e, 1, EL_PLAYER_2, ACTION_MOVING, MV_BIT_RIGHT, }, { - SPR_walk + 2, 1, + PLY_walk_s, 1, EL_PLAYER_2, ACTION_MOVING, MV_BIT_DOWN, }, { - SPR_walk + 3, 1, + PLY_walk_w, 1, EL_PLAYER_2, ACTION_MOVING, MV_BIT_LEFT, }, { - SPR_push + 0, 1, + PLY_push_n, 1, EL_PLAYER_2, ACTION_PUSHING, MV_BIT_UP, }, { - SPR_push + 1, 1, + PLY_push_e, 1, EL_PLAYER_2, ACTION_PUSHING, MV_BIT_RIGHT, }, { - SPR_push + 2, 1, + PLY_push_s, 1, EL_PLAYER_2, ACTION_PUSHING, MV_BIT_DOWN, }, { - SPR_push + 3, 1, + PLY_push_w, 1, EL_PLAYER_2, ACTION_PUSHING, MV_BIT_LEFT, }, { - SPR_spray + 0, 1, + PLY_shoot_n, 1, EL_PLAYER_2, ACTION_SNAPPING, MV_BIT_UP, }, { - SPR_spray + 1, 1, + PLY_shoot_e, 1, EL_PLAYER_2, ACTION_SNAPPING, MV_BIT_RIGHT, }, { - SPR_spray + 2, 1, + PLY_shoot_s, 1, EL_PLAYER_2, ACTION_SNAPPING, MV_BIT_DOWN, }, { - SPR_spray + 3, 1, + PLY_shoot_w, 1, EL_PLAYER_2, ACTION_SNAPPING, MV_BIT_LEFT, }, { - SPR_still, 0, + PLY_still, 0, EL_PLAYER_1, ACTION_DEFAULT, -1, }, { - SPR_still, 1, + PLY_still, 1, EL_PLAYER_2, ACTION_DEFAULT, -1, }, { - SPR_walk + 0, 2, + PLY_walk_n, 2, EL_PLAYER_3, ACTION_MOVING, MV_BIT_UP, }, { - SPR_walk + 1, 2, + PLY_walk_e, 2, EL_PLAYER_3, ACTION_MOVING, MV_BIT_RIGHT, }, { - SPR_walk + 2, 2, + PLY_walk_s, 2, EL_PLAYER_3, ACTION_MOVING, MV_BIT_DOWN, }, { - SPR_walk + 3, 2, + PLY_walk_w, 2, EL_PLAYER_3, ACTION_MOVING, MV_BIT_LEFT, }, { - SPR_push + 0, 2, + PLY_push_n, 2, EL_PLAYER_3, ACTION_PUSHING, MV_BIT_UP, }, { - SPR_push + 1, 2, + PLY_push_e, 2, EL_PLAYER_3, ACTION_PUSHING, MV_BIT_RIGHT, }, { - SPR_push + 2, 2, + PLY_push_s, 2, EL_PLAYER_3, ACTION_PUSHING, MV_BIT_DOWN, }, { - SPR_push + 3, 2, + PLY_push_w, 2, EL_PLAYER_3, ACTION_PUSHING, MV_BIT_LEFT, }, { - SPR_spray + 0, 2, + PLY_shoot_n, 2, EL_PLAYER_3, ACTION_SNAPPING, MV_BIT_UP, }, { - SPR_spray + 1, 2, + PLY_shoot_e, 2, EL_PLAYER_3, ACTION_SNAPPING, MV_BIT_RIGHT, }, { - SPR_spray + 2, 2, + PLY_shoot_s, 2, EL_PLAYER_3, ACTION_SNAPPING, MV_BIT_DOWN, }, { - SPR_spray + 3, 2, + PLY_shoot_w, 2, EL_PLAYER_3, ACTION_SNAPPING, MV_BIT_LEFT, }, { - SPR_walk + 0, 3, + PLY_walk_n, 3, EL_PLAYER_4, ACTION_MOVING, MV_BIT_UP, }, { - SPR_walk + 1, 3, + PLY_walk_e, 3, EL_PLAYER_4, ACTION_MOVING, MV_BIT_RIGHT, }, { - SPR_walk + 2, 3, + PLY_walk_s, 3, EL_PLAYER_4, ACTION_MOVING, MV_BIT_DOWN, }, { - SPR_walk + 3, 3, + PLY_walk_w, 3, EL_PLAYER_4, ACTION_MOVING, MV_BIT_LEFT, }, { - SPR_push + 0, 3, + PLY_push_n, 3, EL_PLAYER_4, ACTION_PUSHING, MV_BIT_UP, }, { - SPR_push + 1, 3, + PLY_push_e, 3, EL_PLAYER_4, ACTION_PUSHING, MV_BIT_RIGHT, }, { - SPR_push + 2, 3, + PLY_push_s, 3, EL_PLAYER_4, ACTION_PUSHING, MV_BIT_DOWN, }, { - SPR_push + 3, 3, + PLY_push_w, 3, EL_PLAYER_4, ACTION_PUSHING, MV_BIT_LEFT, }, { - SPR_spray + 0, 3, + PLY_shoot_n, 3, EL_PLAYER_4, ACTION_SNAPPING, MV_BIT_UP, }, { - SPR_spray + 1, 3, + PLY_shoot_e, 3, EL_PLAYER_4, ACTION_SNAPPING, MV_BIT_RIGHT, }, { - SPR_spray + 2, 3, + PLY_shoot_s, 3, EL_PLAYER_4, ACTION_SNAPPING, MV_BIT_DOWN, }, { - SPR_spray + 3, 3, + PLY_shoot_w, 3, EL_PLAYER_4, ACTION_SNAPPING, MV_BIT_LEFT, }, { - SPR_still, 2, + PLY_still, 2, EL_PLAYER_3, ACTION_DEFAULT, -1, }, { - SPR_still, 3, + PLY_still, 3, EL_PLAYER_4, ACTION_DEFAULT, -1, }, @@ -8148,7 +8244,7 @@ unsigned int InitRND(int seed) } static struct Mapping_EM_to_RND_object object_mapping[TILE_MAX]; -static struct Mapping_EM_to_RND_player player_mapping[MAX_PLAYERS][SPR_MAX]; +static struct Mapping_EM_to_RND_player player_mapping[MAX_PLAYERS][PLY_MAX]; static int get_effective_element_EM(int tile, int frame_em) { @@ -8163,8 +8259,8 @@ static int get_effective_element_EM(int tile, int frame_em) { switch (tile) { - case Yacid_splash_eB: - case Yacid_splash_wB: + case Xacid_splash_e: + case Xacid_splash_w: return (frame_em > 5 ? EL_EMPTY : element); default: @@ -8175,11 +8271,11 @@ static int get_effective_element_EM(int tile, int frame_em) { switch (tile) { - case Yacid_splash_eB: - case Yacid_splash_wB: + case Xacid_splash_e: + case Xacid_splash_w: return EL_EMPTY; - case Yemerald_stone: + case Ynut_stone: return EL_EMERALD; case Ydiamond_stone: @@ -8187,24 +8283,24 @@ static int get_effective_element_EM(int tile, int frame_em) case Xdrip_stretch: case Xdrip_stretchB: - case Ydrip_s1: - case Ydrip_s1B: - case Xball_1B: + case Ydrip_1_s: + case Ydrip_1_sB: + case Yball_1: case Xball_2: - case Xball_2B: - case Yball_eat: - case Ykey_1_eat: - case Ykey_2_eat: - case Ykey_3_eat: - case Ykey_4_eat: - case Ykey_5_eat: - case Ykey_6_eat: - case Ykey_7_eat: - case Ykey_8_eat: - case Ylenses_eat: - case Ymagnify_eat: - case Ygrass_eat: - case Ydirt_eat: + case Yball_2: + case Yball_blank: + case Ykey_1_blank: + case Ykey_2_blank: + case Ykey_3_blank: + case Ykey_4_blank: + case Ykey_5_blank: + case Ykey_6_blank: + case Ykey_7_blank: + case Ykey_8_blank: + case Ylenses_blank: + case Ymagnify_blank: + case Ygrass_blank: + case Ydirt_blank: case Xsand_stonein_1: case Xsand_stonein_2: case Xsand_stonein_3: @@ -8244,9 +8340,9 @@ static boolean check_linear_animation_EM(int tile) case Ytank_s_e: case Ytank_w_s: case Ytank_n_w: - case Yacid_splash_eB: - case Yacid_splash_wB: - case Yemerald_stone: + case Xacid_splash_e: + case Xacid_splash_w: + case Ynut_stone: return TRUE; } @@ -8517,7 +8613,7 @@ void InitGraphicInfo_EM(void) // always start with reliable default values for (p = 0; p < MAX_PLAYERS; p++) { - for (i = 0; i < SPR_MAX; i++) + for (i = 0; i < PLY_MAX; i++) { player_mapping[p][i].element_rnd = EL_UNKNOWN; player_mapping[p][i].action = ACTION_DEFAULT; @@ -8574,24 +8670,24 @@ void InitGraphicInfo_EM(void) int effective_action = (j < 7 ? action : i == Xdrip_stretch ? action : i == Xdrip_stretchB ? action : - i == Ydrip_s1 ? action : - i == Ydrip_s1B ? action : - i == Xball_1B ? action : + i == Ydrip_1_s ? action : + i == Ydrip_1_sB ? action : + i == Yball_1 ? action : i == Xball_2 ? action : - i == Xball_2B ? action : - i == Yball_eat ? action : - i == Ykey_1_eat ? action : - i == Ykey_2_eat ? action : - i == Ykey_3_eat ? action : - i == Ykey_4_eat ? action : - i == Ykey_5_eat ? action : - i == Ykey_6_eat ? action : - i == Ykey_7_eat ? action : - i == Ykey_8_eat ? action : - i == Ylenses_eat ? action : - i == Ymagnify_eat ? action : - i == Ygrass_eat ? action : - i == Ydirt_eat ? action : + i == Yball_2 ? action : + i == Yball_blank ? action : + i == Ykey_1_blank ? action : + i == Ykey_2_blank ? action : + i == Ykey_3_blank ? action : + i == Ykey_4_blank ? action : + i == Ykey_5_blank ? action : + i == Ykey_6_blank ? action : + i == Ykey_7_blank ? action : + i == Ykey_8_blank ? action : + i == Ylenses_blank ? action : + i == Ymagnify_blank ? action : + i == Ygrass_blank ? action : + i == Ydirt_blank ? action : i == Xsand_stonein_1 ? action : i == Xsand_stonein_2 ? action : i == Xsand_stonein_3 ? action : @@ -8622,8 +8718,8 @@ void InitGraphicInfo_EM(void) g->anim_mode & ANIM_LINEAR); int sync_frame = (i == Xdrip_stretch ? 7 : i == Xdrip_stretchB ? 7 : - i == Ydrip_s2 ? j + 8 : - i == Ydrip_s2B ? j + 8 : + i == Ydrip_2_s ? j + 8 : + i == Ydrip_2_sB ? j + 8 : i == Xacid_1 ? 0 : i == Xacid_2 ? 10 : i == Xacid_3 ? 20 : @@ -8641,20 +8737,20 @@ void InitGraphicInfo_EM(void) i == Xfake_acid_7 ? 60 : i == Xfake_acid_8 ? 70 : i == Xball_2 ? 7 : - i == Xball_2B ? j + 8 : - i == Yball_eat ? j + 1 : - i == Ykey_1_eat ? j + 1 : - i == Ykey_2_eat ? j + 1 : - i == Ykey_3_eat ? j + 1 : - i == Ykey_4_eat ? j + 1 : - i == Ykey_5_eat ? j + 1 : - i == Ykey_6_eat ? j + 1 : - i == Ykey_7_eat ? j + 1 : - i == Ykey_8_eat ? j + 1 : - i == Ylenses_eat ? j + 1 : - i == Ymagnify_eat ? j + 1 : - i == Ygrass_eat ? j + 1 : - i == Ydirt_eat ? j + 1 : + i == Yball_2 ? j + 8 : + i == Yball_blank ? j + 1 : + i == Ykey_1_blank ? j + 1 : + i == Ykey_2_blank ? j + 1 : + i == Ykey_3_blank ? j + 1 : + i == Ykey_4_blank ? j + 1 : + i == Ykey_5_blank ? j + 1 : + i == Ykey_6_blank ? j + 1 : + i == Ykey_7_blank ? j + 1 : + i == Ykey_8_blank ? j + 1 : + i == Ylenses_blank ? j + 1 : + i == Ymagnify_blank ? j + 1 : + i == Ygrass_blank ? j + 1 : + i == Ydirt_blank ? j + 1 : i == Xamoeba_1 ? 0 : i == Xamoeba_2 ? 1 : i == Xamoeba_3 ? 2 : @@ -8766,10 +8862,10 @@ void InitGraphicInfo_EM(void) effective_action == ACTION_EMPTYING ? MV_DOWN : direction); int dx = (move_dir == MV_LEFT ? -1 : move_dir == MV_RIGHT ? 1 : 0); int dy = (move_dir == MV_UP ? -1 : move_dir == MV_DOWN ? 1 : 0); - int num_steps = (i == Ydrip_s1 ? 16 : - i == Ydrip_s1B ? 16 : - i == Ydrip_s2 ? 16 : - i == Ydrip_s2B ? 16 : + int num_steps = (i == Ydrip_1_s ? 16 : + i == Ydrip_1_sB ? 16 : + i == Ydrip_2_s ? 16 : + i == Ydrip_2_sB ? 16 : i == Xsand_stonein_1 ? 32 : i == Xsand_stonein_2 ? 32 : i == Xsand_stonein_3 ? 32 : @@ -8778,8 +8874,8 @@ void InitGraphicInfo_EM(void) i == Xsand_stoneout_2 ? 16 : 8); int cx = ABS(dx) * (TILEX / num_steps); int cy = ABS(dy) * (TILEY / num_steps); - int step_frame = (i == Ydrip_s2 ? j + 8 : - i == Ydrip_s2B ? j + 8 : + int step_frame = (i == Ydrip_2_s ? j + 8 : + i == Ydrip_2_sB ? j + 8 : i == Xsand_stonein_2 ? j + 8 : i == Xsand_stonein_3 ? j + 16 : i == Xsand_stonein_4 ? j + 24 : @@ -8940,7 +9036,7 @@ void InitGraphicInfo_EM(void) for (p = 0; p < MAX_PLAYERS; p++) { - for (i = 0; i < SPR_MAX; i++) + for (i = 0; i < PLY_MAX; i++) { int element = player_mapping[p][i].element_rnd; int action = player_mapping[p][i].action; @@ -9403,29 +9499,58 @@ void SetLevelSetInfo(char *identifier, int level_nr) levelset.level_nr = level_nr; } -boolean CheckIfPlayfieldViewportHasChanged(void) +boolean CheckIfAllViewportsHaveChanged(void) { - // if game status has not changed, playfield viewport has not changed either + // if game status has not changed, viewports have not changed either if (game_status == game_status_last) return FALSE; - // check if playfield viewport has changed with current game status + // check if all viewports have changed with current game status + struct RectWithBorder *vp_playfield = &viewport.playfield[game_status]; + struct RectWithBorder *vp_door_1 = &viewport.door_1[game_status]; + struct RectWithBorder *vp_door_2 = &viewport.door_2[game_status]; int new_real_sx = vp_playfield->x; int new_real_sy = vp_playfield->y; int new_full_sxsize = vp_playfield->width; int new_full_sysize = vp_playfield->height; + int new_dx = vp_door_1->x; + int new_dy = vp_door_1->y; + int new_dxsize = vp_door_1->width; + int new_dysize = vp_door_1->height; + int new_vx = vp_door_2->x; + int new_vy = vp_door_2->y; + int new_vxsize = vp_door_2->width; + int new_vysize = vp_door_2->height; - return (new_real_sx != REAL_SX || - new_real_sy != REAL_SY || - new_full_sxsize != FULL_SXSIZE || - new_full_sysize != FULL_SYSIZE); + boolean playfield_viewport_has_changed = + (new_real_sx != REAL_SX || + new_real_sy != REAL_SY || + new_full_sxsize != FULL_SXSIZE || + new_full_sysize != FULL_SYSIZE); + + boolean door_1_viewport_has_changed = + (new_dx != DX || + new_dy != DY || + new_dxsize != DXSIZE || + new_dysize != DYSIZE); + + boolean door_2_viewport_has_changed = + (new_vx != VX || + new_vy != VY || + new_vxsize != VXSIZE || + new_vysize != VYSIZE || + game_status_last == GAME_MODE_EDITOR); + + return (playfield_viewport_has_changed && + door_1_viewport_has_changed && + door_2_viewport_has_changed); } -boolean CheckIfGlobalBorderOrPlayfieldViewportHasChanged(void) +boolean CheckFadeAll(void) { return (CheckIfGlobalBorderHasChanged() || - CheckIfPlayfieldViewportHasChanged()); + CheckIfAllViewportsHaveChanged()); } void ChangeViewportPropertiesIfNeeded(void) @@ -9627,6 +9752,8 @@ void ChangeViewportPropertiesIfNeeded(void) { // printf("::: init_video_buffer\n"); + FreeAllImageTextures(); // needs old renderer to free the textures + InitVideoBuffer(WIN_XSIZE, WIN_YSIZE, DEFAULT_DEPTH, setup.fullscreen); InitImageTextures(); }