#define DEBUG_INIT_PLAYER 1
#define DEBUG_PLAYER_ACTIONS 0
-// test element position in level set "test_gfxframe" / level "000"
-#define DEBUG_GFXFRAME_X 11
-#define DEBUG_GFXFRAME_Y 9
-
/* EXPERIMENTAL STUFF */
#define USE_NEW_AMOEBA_CODE FALSE
int initial_move_dir = MV_DOWN;
int i, j, x, y;
-#if 1
- printf("::: game.graphics_engine_version == %d\n",
- game.graphics_engine_version);
-#endif
-
// required here to update video display before fading (FIX THIS)
DrawMaskedBorder(REDRAW_DOOR_2);
GfxRedraw[x][y] = GFX_REDRAW_NONE;
}
-#if 1
- printf("::: INIT GAME");
-#endif
-
SCAN_PLAYFIELD(x, y)
{
if (emulate_bd && !IS_BD_ELEMENT(Feld[x][y]))
ResetGfxAnimation(x, y);
}
-#if 1
- printf(" -> %d\n", GfxFrame[DEBUG_GFXFRAME_X][DEBUG_GFXFRAME_Y]);
-#endif
-
InitBeltMovement();
for (i = 0; i < MAX_PLAYERS; i++)
if (!local_player->LevelSolved_SaveScore)
{
- FadeOut(REDRAW_FIELD);
-
game_status = GAME_MODE_MAIN;
DrawMainMenu();
}
else
{
- FadeOut(REDRAW_FIELD);
-
game_status = GAME_MODE_MAIN;
if (raise_level)
GfxFrame[x][y] = 0;
ResetGfxFrame(x, y, FALSE);
-
-#if 1
- if (x == DEBUG_GFXFRAME_X && y == DEBUG_GFXFRAME_Y)
- printf(" (RESET_GFX_ANIM)");
-#endif
}
static void ResetRandomAnimationValue(int x, int y)
boolean no_delay = (tape.warp_forward);
int frame_delay_value = (ffwd_delay ? FfwdFrameDelay : GameFrameDelay);
int wait_delay_value = (no_delay ? 0 : frame_delay_value);
+ int new_scroll_x, new_scroll_y;
if (level.lazy_relocation && IN_VIS_FIELD(SCREENX(x), SCREENY(y)))
{
- RedrawPlayfield();
- }
- else if (quick_relocation)
- {
- if (!IN_VIS_FIELD(SCREENX(x), SCREENY(y)) || center_screen)
- {
- if (!level.shifted_relocation || center_screen)
- {
- /* quick relocation (without scrolling), with centering of screen */
-
- scroll_x = (x < SBX_Left + MIDPOSX ? SBX_Left :
- x > SBX_Right + MIDPOSX ? SBX_Right :
- x - MIDPOSX);
-
- scroll_y = (y < SBY_Upper + MIDPOSY ? SBY_Upper :
- y > SBY_Lower + MIDPOSY ? SBY_Lower :
- y - MIDPOSY);
- }
- else
- {
- /* quick relocation (without scrolling), but do not center screen */
+ /* case 1: quick relocation inside visible screen (without scrolling) */
- int center_scroll_x = (old_x < SBX_Left + MIDPOSX ? SBX_Left :
- old_x > SBX_Right + MIDPOSX ? SBX_Right :
- old_x - MIDPOSX);
-
- int center_scroll_y = (old_y < SBY_Upper + MIDPOSY ? SBY_Upper :
- old_y > SBY_Lower + MIDPOSY ? SBY_Lower :
- old_y - MIDPOSY);
-
- int offset_x = x + (scroll_x - center_scroll_x);
- int offset_y = y + (scroll_y - center_scroll_y);
+ RedrawPlayfield();
- scroll_x = (offset_x < SBX_Left + MIDPOSX ? SBX_Left :
- offset_x > SBX_Right + MIDPOSX ? SBX_Right :
- offset_x - MIDPOSX);
+ return;
+ }
- scroll_y = (offset_y < SBY_Upper + MIDPOSY ? SBY_Upper :
- offset_y > SBY_Lower + MIDPOSY ? SBY_Lower :
- offset_y - MIDPOSY);
- }
- }
- else
- {
- if (!level.shifted_relocation || center_screen)
- {
- /* quick relocation (without scrolling), with centering of screen */
+ if (!level.shifted_relocation || center_screen)
+ {
+ /* relocation _with_ centering of screen */
- scroll_x = (x < SBX_Left + MIDPOSX ? SBX_Left :
+ new_scroll_x = (x < SBX_Left + MIDPOSX ? SBX_Left :
x > SBX_Right + MIDPOSX ? SBX_Right :
x - MIDPOSX);
- scroll_y = (y < SBY_Upper + MIDPOSY ? SBY_Upper :
+ new_scroll_y = (y < SBY_Upper + MIDPOSY ? SBY_Upper :
y > SBY_Lower + MIDPOSY ? SBY_Lower :
y - MIDPOSY);
- }
- else
- {
- /* quick relocation (without scrolling), but do not center screen */
+ }
+ else
+ {
+ /* relocation _without_ centering of screen */
- int center_scroll_x = (old_x < SBX_Left + MIDPOSX ? SBX_Left :
- old_x > SBX_Right + MIDPOSX ? SBX_Right :
- old_x - MIDPOSX);
+ int center_scroll_x = (old_x < SBX_Left + MIDPOSX ? SBX_Left :
+ old_x > SBX_Right + MIDPOSX ? SBX_Right :
+ old_x - MIDPOSX);
- int center_scroll_y = (old_y < SBY_Upper + MIDPOSY ? SBY_Upper :
- old_y > SBY_Lower + MIDPOSY ? SBY_Lower :
- old_y - MIDPOSY);
+ int center_scroll_y = (old_y < SBY_Upper + MIDPOSY ? SBY_Upper :
+ old_y > SBY_Lower + MIDPOSY ? SBY_Lower :
+ old_y - MIDPOSY);
- int offset_x = x + (scroll_x - center_scroll_x);
- int offset_y = y + (scroll_y - center_scroll_y);
+ int offset_x = x + (scroll_x - center_scroll_x);
+ int offset_y = y + (scroll_y - center_scroll_y);
- scroll_x = (offset_x < SBX_Left + MIDPOSX ? SBX_Left :
+ new_scroll_x = (offset_x < SBX_Left + MIDPOSX ? SBX_Left :
offset_x > SBX_Right + MIDPOSX ? SBX_Right :
offset_x - MIDPOSX);
- scroll_y = (offset_y < SBY_Upper + MIDPOSY ? SBY_Upper :
+ new_scroll_y = (offset_y < SBY_Upper + MIDPOSY ? SBY_Upper :
offset_y > SBY_Lower + MIDPOSY ? SBY_Lower :
offset_y - MIDPOSY);
- }
- }
-
- RedrawPlayfield();
}
- else
- {
- int scroll_xx, scroll_yy;
-
- if (!level.shifted_relocation || center_screen)
- {
- /* visible relocation (with scrolling), with centering of screen */
- scroll_xx = (x < SBX_Left + MIDPOSX ? SBX_Left :
- x > SBX_Right + MIDPOSX ? SBX_Right :
- x - MIDPOSX);
-
- scroll_yy = (y < SBY_Upper + MIDPOSY ? SBY_Upper :
- y > SBY_Lower + MIDPOSY ? SBY_Lower :
- y - MIDPOSY);
- }
- else
- {
- /* visible relocation (with scrolling), but do not center screen */
-
- int center_scroll_x = (old_x < SBX_Left + MIDPOSX ? SBX_Left :
- old_x > SBX_Right + MIDPOSX ? SBX_Right :
- old_x - MIDPOSX);
+ if (quick_relocation)
+ {
+ /* case 2: quick relocation (redraw without visible scrolling) */
- int center_scroll_y = (old_y < SBY_Upper + MIDPOSY ? SBY_Upper :
- old_y > SBY_Lower + MIDPOSY ? SBY_Lower :
- old_y - MIDPOSY);
+ scroll_x = new_scroll_x;
+ scroll_y = new_scroll_y;
- int offset_x = x + (scroll_x - center_scroll_x);
- int offset_y = y + (scroll_y - center_scroll_y);
+ RedrawPlayfield();
- scroll_xx = (offset_x < SBX_Left + MIDPOSX ? SBX_Left :
- offset_x > SBX_Right + MIDPOSX ? SBX_Right :
- offset_x - MIDPOSX);
+ return;
+ }
- scroll_yy = (offset_y < SBY_Upper + MIDPOSY ? SBY_Upper :
- offset_y > SBY_Lower + MIDPOSY ? SBY_Lower :
- offset_y - MIDPOSY);
- }
+ /* case 3: visible relocation (with scrolling to new position) */
- ScrollScreen(NULL, SCROLL_GO_ON); /* scroll last frame to full tile */
+ ScrollScreen(NULL, SCROLL_GO_ON); /* scroll last frame to full tile */
- while (scroll_x != scroll_xx || scroll_y != scroll_yy)
- {
- int dx = 0, dy = 0;
- int fx = FX, fy = FY;
+ while (scroll_x != new_scroll_x || scroll_y != new_scroll_y)
+ {
+ int dx = 0, dy = 0;
+ int fx = FX, fy = FY;
- dx = (scroll_xx < scroll_x ? +1 : scroll_xx > scroll_x ? -1 : 0);
- dy = (scroll_yy < scroll_y ? +1 : scroll_yy > scroll_y ? -1 : 0);
+ dx = (new_scroll_x < scroll_x ? +1 : new_scroll_x > scroll_x ? -1 : 0);
+ dy = (new_scroll_y < scroll_y ? +1 : new_scroll_y > scroll_y ? -1 : 0);
- if (dx == 0 && dy == 0) /* no scrolling needed at all */
- break;
+ if (dx == 0 && dy == 0) /* no scrolling needed at all */
+ break;
- scroll_x -= dx;
- scroll_y -= dy;
+ scroll_x -= dx;
+ scroll_y -= dy;
- fx += dx * TILEX / 2;
- fy += dy * TILEY / 2;
+ fx += dx * TILEX / 2;
+ fy += dy * TILEY / 2;
- ScrollLevel(dx, dy);
- DrawAllPlayers();
-
- /* scroll in two steps of half tile size to make things smoother */
- BlitBitmap(drawto_field, window, fx, fy, SXSIZE, SYSIZE, SX, SY);
- Delay(wait_delay_value);
+ ScrollLevel(dx, dy);
+ DrawAllPlayers();
- /* scroll second step to align at full tile size */
- BackToFront();
- Delay(wait_delay_value);
- }
+ /* scroll in two steps of half tile size to make things smoother */
+ BlitBitmap(drawto_field, window, fx, fy, SXSIZE, SYSIZE, SX, SY);
+ Delay(wait_delay_value);
- DrawAllPlayers();
+ /* scroll second step to align at full tile size */
BackToFront();
Delay(wait_delay_value);
}
+
+ DrawAllPlayers();
+ BackToFront();
+ Delay(wait_delay_value);
}
void RelocatePlayer(int jx, int jy, int el_player_raw)
ResetGfxAnimation(x, y);
ResetRandomAnimationValue(x, y);
-#if 0
- if (x == DEBUG_GFXFRAME_X && y == DEBUG_GFXFRAME_Y)
- printf(" (RESET X)");
-#endif
-
TEST_DrawLevelField(x, y);
if (GFX_CRUMBLED(new_element))
be drawn instead of the correct frames 0,1,2,3. This is caused by
"GfxFrame[][]" being reset *twice* (in two successive frames) after
an element change: First when the change delay ("ChangeDelay[][]")
- counter has reached zero after decrementing (see "RESET 1" below),
- then a second time in the next frame (after "GfxFrame[][]" was
- already incremented) when "ChangeDelay[][]" is reset to the initial
- delay value again (see "RESET 2" below).
+ counter has reached zero after decrementing, then a second time in
+ the next frame (after "GfxFrame[][]" was already incremented) when
+ "ChangeDelay[][]" is reset to the initial delay value again.
This causes frame 0 to be drawn twice, while the last frame won't
be drawn anymore, resulting in the wrong frame sequence 0,0,1,2.
{
ResetGfxAnimation(x, y);
ResetRandomAnimationValue(x, y);
-
-#if 1
- if (x == DEBUG_GFXFRAME_X && y == DEBUG_GFXFRAME_Y)
- printf(" (RESET 2)");
-#endif
-
}
if (change->pre_change_function)
if (change->post_change_function)
change->post_change_function(x, y);
}
-
-#if 1
- if (x == DEBUG_GFXFRAME_X && y == DEBUG_GFXFRAME_Y)
- printf(" (RESET 1)");
-#endif
-
}
if (change->has_action && !handle_action_before_change)
}
}
-#if 1
- printf("::: %d", GfxFrame[DEBUG_GFXFRAME_X][DEBUG_GFXFRAME_Y]);
-#endif
-
SCAN_PLAYFIELD(x, y)
{
ChangeCount[x][y] = 0;
#endif
}
-#if 1
- printf(" -> %d", GfxFrame[DEBUG_GFXFRAME_X][DEBUG_GFXFRAME_Y]);
-#endif
-
SCAN_PLAYFIELD(x, y)
{
element = Feld[x][y];
}
}
-#if 1
- printf(" -> %d\n", GfxFrame[DEBUG_GFXFRAME_X][DEBUG_GFXFRAME_Y]);
-#endif
-
#if USE_NEW_AMOEBA_CODE
/* new experimental amoeba growth stuff */
if (!(FrameCounter % 8))
SCAN_PLAYFIELD(xx, yy)
{
if (Feld[xx][yy] == EL_SP_DISK_YELLOW)
+ {
Bang(xx, yy);
+ }
else if (Feld[xx][yy] == EL_SP_TERMINAL)
+ {
Feld[xx][yy] = EL_SP_TERMINAL_ACTIVE;
+
+ ResetGfxAnimation(xx, yy);
+ TEST_DrawLevelField(xx, yy);
+ }
}
}
else if (IS_BELT_SWITCH(element))
#endif
{
if (quick_quit)
- {
FadeSkipNextFadeIn();
- game_status = GAME_MODE_MAIN;
+ game_status = GAME_MODE_MAIN;
- DrawMainMenu();
- }
- else
- {
- game_status = GAME_MODE_MAIN;
-
- DrawMainMenu();
- }
+ DrawMainMenu();
}
}
else /* continue playing the game */