void InitGame()
{
+ int full_lev_fieldx = lev_fieldx + (BorderElement != EL_EMPTY ? 2 : 0);
+ int full_lev_fieldy = lev_fieldy + (BorderElement != EL_EMPTY ? 2 : 0);
+
boolean emulate_bd = TRUE; /* unless non-BOULDERDASH elements found */
boolean emulate_sb = TRUE; /* unless non-SOKOBAN elements found */
boolean emulate_sp = TRUE; /* unless non-SUPAPLEX elements found */
#if NEW_TILESIZE
+ // printf("::: START-0: %d, %d\n", lev_fieldx, SCR_FIELDX);
+ // printf("::: START-1: %d, %d\n", SBX_Left, SBX_Right);
+
+#if 1
+ if (full_lev_fieldx <= SCR_FIELDX)
+ SBX_Left = SBX_Right = -1 * (SCR_FIELDX - lev_fieldx) / 2;
+
+ if (full_lev_fieldy <= SCR_FIELDY)
+ SBY_Upper = SBY_Lower = -1 * (SCR_FIELDY - lev_fieldy) / 2;
+#else
if (lev_fieldx + (SBX_Left < 0 ? 2 : 0) <= SCR_FIELDX)
SBX_Left = SBX_Right = -1 * (SCR_FIELDX - lev_fieldx) / 2;
if (lev_fieldy + (SBY_Upper < 0 ? 2 : 0) <= SCR_FIELDY)
SBY_Upper = SBY_Lower = -1 * (SCR_FIELDY - lev_fieldy) / 2;
+#endif
+
+ /*
+ printf("::: START-2: %d, %d (%d)\n", SBX_Left, SBX_Right,
+ SBX_Right - SBX_Left + 1);
+ */
+#if 1
+ if (EVEN(SCR_FIELDX) && full_lev_fieldx > SCR_FIELDX)
+ SBX_Left--;
+ if (EVEN(SCR_FIELDY) && full_lev_fieldy > SCR_FIELDY)
+ SBY_Upper--;
+#else
if (EVEN(SCR_FIELDX))
SBX_Left--;
if (EVEN(SCR_FIELDY))
SBY_Upper--;
+#endif
+
+#if 0
+ printf("::: START-3: %d, %d\n", SBX_Left, SBX_Right);
+ printf("\n");
+#endif
#else
{
InitGameEngine_EM();
+#if 0
/* blit playfield from scroll buffer to normal back buffer for fading in */
BlitScreenToBitmap_EM(backbuffer);
+#endif
}
else if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
{
InitGameEngine_SP();
+#if 0
/* blit playfield from scroll buffer to normal back buffer for fading in */
BlitScreenToBitmap_SP(backbuffer);
+#endif
}
else
{
if (game.timegate_time_left == 0)
CloseAllOpenTimegates();
+#if 0
+ /* blit playfield from scroll buffer to normal back buffer for fading in */
#if NEW_TILESIZE
BlitScreenToBitmap(backbuffer);
#else
- /* blit playfield from scroll buffer to normal back buffer for fading in */
if (setup.soft_scrolling)
BlitBitmap(fieldbuffer, backbuffer, FX, FY, SXSIZE, SYSIZE, SX, SY);
#endif
+#endif
+#if 0
redraw_mask |= REDRAW_FROM_BACKBUFFER;
+#endif
}
+#if 1
+ /* blit playfield from scroll buffer to normal back buffer for fading in */
+ BlitScreenToBitmap(backbuffer);
+
+ redraw_mask |= REDRAW_FROM_BACKBUFFER;
+#endif
/* !!! FIX THIS (END) !!! */
#if 1
}
}
+void FreeEngineSnapshot()
+{
+ FreeEngineSnapshotBuffers();
+
+ setString(&snapshot_level_identifier, NULL);
+ snapshot_level_nr = -1;
+}
+
void SaveEngineSnapshot()
{
/* do not save snapshots from editor */
/* free previous snapshot buffers, if needed */
FreeEngineSnapshotBuffers();
+#if 1
+ /* copy some special values to a structure better suited for the snapshot */
+
+ if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
+ SaveEngineSnapshotValues_RND();
+ if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ SaveEngineSnapshotValues_EM();
+ if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+ SaveEngineSnapshotValues_SP();
+
+ /* save values stored in special snapshot structure */
+
+ if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
+ SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(engine_snapshot_rnd));
+ if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(engine_snapshot_em));
+ if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+ SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(engine_snapshot_sp));
+#else
/* copy some special values to a structure better suited for the snapshot */
SaveEngineSnapshotValues_RND();
SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(engine_snapshot_rnd));
SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(engine_snapshot_em));
SaveEngineSnapshotBuffer(ARGS_ADDRESS_AND_SIZEOF(engine_snapshot_sp));
+#endif
/* save further RND engine values */
/* restore special values from snapshot structure */
+#if 1
+ if (level.game_engine_type == GAME_ENGINE_TYPE_RND)
+ LoadEngineSnapshotValues_RND();
+ if (level.game_engine_type == GAME_ENGINE_TYPE_EM)
+ LoadEngineSnapshotValues_EM();
+ if (level.game_engine_type == GAME_ENGINE_TYPE_SP)
+ LoadEngineSnapshotValues_SP();
+#else
LoadEngineSnapshotValues_RND();
LoadEngineSnapshotValues_EM();
LoadEngineSnapshotValues_SP();
+#endif
+
+#if 0
+ printf("::: %d, %d (LoadEngineSnapshot / 1)\n", scroll_x, scroll_y);
+#endif
+
+#if 0
+ // needed if tile size was different when saving and loading engine snapshot
+ if (local_player->present)
+ {
+ scroll_x = (local_player->jx < SBX_Left + MIDPOSX ? SBX_Left :
+ local_player->jx > SBX_Right + MIDPOSX ? SBX_Right :
+ local_player->jx - MIDPOSX);
+
+ scroll_y = (local_player->jy < SBY_Upper + MIDPOSY ? SBY_Upper :
+ local_player->jy > SBY_Lower + MIDPOSY ? SBY_Lower :
+ local_player->jy - MIDPOSY);
+ }
+#endif
+
+#if 0
+ printf("::: %d, %d (LoadEngineSnapshot / 1)\n", scroll_x, scroll_y);
+#endif
}
boolean CheckEngineSnapshot()