#include "network.h"
#include "tape.h"
+
+/* select level set with EMC X11 graphics before activating EM GFX debugging */
+#define DEBUG_EM_GFX 0
+
/* tool button identifiers */
#define TOOL_CTRL_ID_YES 0
#define TOOL_CTRL_ID_NO 1
int sx = SCREENX(x);
int sy = SCREENY(y);
+ if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ {
+ x--;
+ y--;
+ }
+
printf_line("-", 79);
printf("Field Info: SCREEN(%d, %d), LEVEL(%d, %d)\n", sx, sy, x, y);
printf_line("-", 79);
if (game_status == GAME_MODE_PLAYING &&
level.game_engine_type == GAME_ENGINE_TYPE_EM)
{
-#if 1
- RedrawPlayfield_EM(force_redraw);
-#else
- BlitScreenToBitmap_EM(backbuffer);
-#endif
+ /* currently there is no partial redraw -- always redraw whole playfield */
+
+ RedrawPlayfield_EM(TRUE);
}
else if (game_status == GAME_MODE_PLAYING && !game.envelope_active)
{
DrawLevelElementExt(x, y, 0, 0, Feld[x][y], NO_CUTTING, USE_MASKING);
}
-#define TILE_GFX_ELEMENT(x, y) \
- (GfxElement[x][y] != EL_UNDEFINED && Feld[x][y] != EL_EXPLOSION ? \
- GfxElement[x][y] : Feld[x][y])
-
static void DrawLevelFieldCrumbledSandExt(int x, int y, int graphic, int frame)
{
Bitmap *src_bitmap;
return;
#if 1
+ /* !!! CHECK THIS !!! */
+
+ /*
+ if (Feld[x][y] == EL_ELEMENT_SNAPPING &&
+ GFX_CRUMBLED(GfxElement[x][y]))
+ */
+
if (Feld[x][y] == EL_ELEMENT_SNAPPING &&
+ GfxElement[x][y] != EL_UNDEFINED &&
GFX_CRUMBLED(GfxElement[x][y]))
{
DrawLevelFieldCrumbledSandDigging(x, y, GfxDir[x][y], GfxFrame[x][y]);
+
return;
}
#endif
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];
player->is_dropping ? ACTION_DROPPING :
player->is_waiting ? player->action_waiting : ACTION_DEFAULT);
+#if 1
+ if (player->is_waiting)
+ move_dir = player->dir_waiting;
+#endif
+
InitPlayerGfxAnimation(player, action, move_dir);
/* ----------------------------------------------------------------------- */
{
if (player_is_moving && GfxElement[jx][jy] != EL_UNDEFINED)
{
- if (GFX_CRUMBLED(GfxElement[jx][jy]))
+ int old_element = GfxElement[jx][jy];
+ int old_graphic = el_act_dir2img(old_element, action, move_dir);
+ int frame = getGraphicAnimationFrame(old_graphic, player->StepFrame);
+
+ if (GFX_CRUMBLED(old_element))
DrawLevelFieldCrumbledSandDigging(jx, jy, move_dir, player->StepFrame);
else
- {
- int old_element = GfxElement[jx][jy];
- int old_graphic = el_act_dir2img(old_element, action, move_dir);
- int frame = getGraphicAnimationFrame(old_graphic, player->StepFrame);
-
DrawGraphic(sx, sy, old_graphic, frame);
- }
+
+ if (graphic_info[old_graphic].anim_mode & ANIM_OPAQUE_PLAYER)
+ player_is_opaque = TRUE;
}
else
{
if (!setup.soft_scrolling && ScreenMovPos)
sxx = syy = 0;
- 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))
{
if (player_is_moving && last_element == EL_EXPLOSION)
{
- int graphic = el_act2img(GfxElement[last_jx][last_jy], ACTION_EXPLODING);
+ 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);
},
{
Xeater_n, TRUE, FALSE,
- EL_YAMYAM, -1, -1
+ EL_YAMYAM_UP, -1, -1
},
{
- Xeater_e, FALSE, FALSE,
- EL_YAMYAM, -1, -1
+ Xeater_e, TRUE, FALSE,
+ EL_YAMYAM_RIGHT, -1, -1
},
{
- Xeater_w, FALSE, FALSE,
- EL_YAMYAM, -1, -1
+ Xeater_w, TRUE, FALSE,
+ EL_YAMYAM_LEFT, -1, -1
},
{
- Xeater_s, FALSE, FALSE,
- EL_YAMYAM, -1, -1
+ Xeater_s, TRUE, FALSE,
+ EL_YAMYAM_DOWN, -1, -1
},
{
Yeater_n, FALSE, FALSE,
EL_QUICKSAND_FULL, -1, -1
},
{
- Xsand_stonein_1, FALSE, FALSE,
+ Xsand_stonein_1, FALSE, TRUE,
EL_ROCK, ACTION_FILLING, -1
},
{
- Xsand_stonein_2, FALSE, FALSE,
+ Xsand_stonein_2, FALSE, TRUE,
EL_ROCK, ACTION_FILLING, -1
},
{
- Xsand_stonein_3, FALSE, FALSE,
+ Xsand_stonein_3, FALSE, TRUE,
EL_ROCK, ACTION_FILLING, -1
},
{
- Xsand_stonein_4, FALSE, FALSE,
+ Xsand_stonein_4, FALSE, TRUE,
EL_ROCK, ACTION_FILLING, -1
},
{
Xalpha_copyr, TRUE, FALSE,
EL_CHAR('©'), -1, -1
},
- {
- Xalpha_copyr, TRUE, FALSE,
- EL_CHAR('©'), -1, -1
- },
{
Xboom_bug, FALSE, FALSE,
return font_info[font_nr].special_graphic[GFX_SPECIAL_ARG_DEFAULT];
}
-int getGameFrameDelay_EM(int native_em_game_frame_delay)
+#if 0
+void setCenteredPlayerNr_EM(int centered_player_nr)
{
- int game_frame_delay_value;
-
- game_frame_delay_value =
- (tape.playing && tape.fast_forward ? FfwdFrameDelay :
- GameFrameDelay == GAME_FRAME_DELAY ? native_em_game_frame_delay :
- GameFrameDelay);
-
- if (tape.playing && tape.warp_forward && !tape.pausing)
- game_frame_delay_value = 0;
-
- return game_frame_delay_value;
+ game.centered_player_nr = game.centered_player_nr_next = centered_player_nr;
}
int getCenteredPlayerNr_EM()
{
+#if 0
if (game.centered_player_nr_next >= 0 &&
!native_em_level.ply[game.centered_player_nr_next]->alive)
game.centered_player_nr_next = game.centered_player_nr;
+#endif
if (game.centered_player_nr != game.centered_player_nr_next)
game.centered_player_nr = game.centered_player_nr_next;
return game.centered_player_nr;
}
-int getActivePlayers_EM()
+void setSetCenteredPlayer_EM(boolean set_centered_player)
+{
+ game.set_centered_player = set_centered_player;
+}
+
+boolean getSetCenteredPlayer_EM()
+{
+ return game.set_centered_player;
+}
+#endif
+
+int getNumActivePlayers_EM()
{
int num_players = 0;
int i;
return num_players;
}
+#if 1
+int getGameFrameDelay_EM(int native_em_game_frame_delay)
+{
+ int game_frame_delay_value;
+
+ game_frame_delay_value =
+ (tape.playing && tape.fast_forward ? FfwdFrameDelay :
+ GameFrameDelay == GAME_FRAME_DELAY ? native_em_game_frame_delay :
+ GameFrameDelay);
+
+ if (tape.playing && tape.warp_forward && !tape.pausing)
+ game_frame_delay_value = 0;
+
+ return game_frame_delay_value;
+}
+#endif
+
unsigned int InitRND(long seed)
{
if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
return InitEngineRND(seed);
}
-#define DEBUG_EM_GFX 0
-
void InitGraphicInfo_EM(void)
{
struct Mapping_EM_to_RND_object object_mapping[TILE_MAX];
int i, j, p;
#if DEBUG_EM_GFX
+ int num_em_gfx_errors = 0;
+
if (graphic_info_em_object[0][0].bitmap == NULL)
{
/* EM graphics not yet initialized in em_open_all() */
return;
}
+
+ printf("::: [4 errors can be ignored (1 x 'bomb', 3 x 'em_dynamite']\n");
#endif
/* always start with reliable default values */
i == Ymagnify_eat ? element :
i == Ygrass_eat ? element :
i == Ydirt_eat ? element :
- i == Yspring_kill_e ? EL_SPRING :
- i == Yspring_kill_w ? EL_SPRING :
i == Yemerald_stone ? EL_EMERALD :
i == Ydiamond_stone ? EL_ROCK :
- i == Xsand_stonein_4 ? EL_EMPTY :
- i == Xsand_stoneout_2 ? EL_ROCK :
+ i == Xsand_stonein_1 ? element :
+ i == Xsand_stonein_2 ? element :
+ i == Xsand_stonein_3 ? element :
+ i == Xsand_stonein_4 ? element :
is_backside ? EL_EMPTY :
action_removing ? EL_EMPTY :
element);
direction));
int base_graphic = el_act2img(effective_element, ACTION_DEFAULT);
int base_crumbled = el_act2crm(effective_element, ACTION_DEFAULT);
+ boolean has_action_graphics = (graphic != base_graphic);
boolean has_crumbled_graphics = (base_crumbled != base_graphic);
struct GraphicInfo *g = &graphic_info[graphic];
struct GraphicInfo_EM *g_em = &graphic_info_em_object[i][7 - j];
g_em->crumbled_border_size = graphic_info[crumbled].border_size;
}
- if (!g->double_movement && (effective_action == ACTION_FALLING ||
- effective_action == ACTION_MOVING ||
- effective_action == ACTION_PUSHING ||
- effective_action == ACTION_EATING))
+#if 0
+ if (element == EL_ROCK &&
+ effective_action == ACTION_FILLING)
+ printf("::: has_action_graphics == %d\n", has_action_graphics);
+#endif
+
+ if ((!g->double_movement && (effective_action == ACTION_FALLING ||
+ effective_action == ACTION_MOVING ||
+ effective_action == ACTION_PUSHING ||
+ effective_action == ACTION_EATING)) ||
+ (!has_action_graphics && (effective_action == ACTION_FILLING ||
+ effective_action == ACTION_EMPTYING)))
{
int move_dir =
- (effective_action == ACTION_FALLING ? MV_DOWN : direction);
+ (effective_action == ACTION_FALLING ||
+ effective_action == ACTION_FILLING ||
+ 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 ||
- i == Ydrip_s1B ||
- i == Ydrip_s2 ||
- i == Ydrip_s2B ? 16 : 8);
+ int num_steps = (i == Ydrip_s1 ? 16 :
+ i == Ydrip_s1B ? 16 :
+ i == Ydrip_s2 ? 16 :
+ i == Ydrip_s2B ? 16 :
+ i == Xsand_stonein_1 ? 32 :
+ i == Xsand_stonein_2 ? 32 :
+ i == Xsand_stonein_3 ? 32 :
+ i == Xsand_stonein_4 ? 32 :
+ i == Xsand_stoneout_1 ? 16 :
+ 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 ||
- i == Ydrip_s2B ? j + 8 : j) + 1;
+ int step_frame = (i == Ydrip_s2 ? j + 8 :
+ i == Ydrip_s2B ? j + 8 :
+ i == Xsand_stonein_2 ? j + 8 :
+ i == Xsand_stonein_3 ? j + 16 :
+ i == Xsand_stonein_4 ? j + 24 :
+ i == Xsand_stoneout_2 ? j + 8 : j) + 1;
int step = (is_backside ? step_frame : num_steps - step_frame);
if (is_backside) /* tile where movement starts */
printf(" %d (%d): size %d,%d should be %d,%d\n",
j, is_backside,
g_em->width, g_em->height, TILEX, TILEY);
+
+ num_em_gfx_errors++;
}
#endif
g_em->src_x / 32, g_em->src_y / 32,
debug_src_x, debug_src_y,
debug_src_x / 32, debug_src_y / 32);
+
+ num_em_gfx_errors++;
}
#endif
}
#if DEBUG_EM_GFX
+ printf("\n");
+ printf("::: [%d errors found]\n", num_em_gfx_errors);
+
exit(0);
#endif
}