X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame.c;h=9e6ecbd9ef590fd16e8cd8eda37802a8a1bd645c;hb=12a8eb6ca28aa97f422e7cf9317f01eb0dfc9a11;hp=1a201dc120978a4f2f6d4fc32558b6b672731a10;hpb=d41504f21368105b5818ccee3b33d5acd739aa6c;p=rocksndiamonds.git diff --git a/src/game.c b/src/game.c index 1a201dc1..9e6ecbd9 100644 --- a/src/game.c +++ b/src/game.c @@ -3520,6 +3520,9 @@ int get_num_special_action(int element, int action_first, int action_last) 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 */ @@ -3533,7 +3536,46 @@ void InitGame() #endif int i, j, x, y; +#if 1 game_status = GAME_MODE_PLAYING; +#endif + +#if 1 + + StopAnimation(); + + if (!game.restart_level) + CloseDoor(DOOR_CLOSE_1); + +#if 1 + if (level_editor_test_game) + FadeSkipNextFadeIn(); + else + FadeSetEnterScreen(); +#else + if (level_editor_test_game) + fading = fading_none; + else + fading = menu.destination; +#endif + +#if 1 + FadeOut(REDRAW_FIELD); +#else + if (do_fading) + FadeOut(REDRAW_FIELD); +#endif + +#endif + +#if 0 + printf("::: FADING OUT: DONE\n"); + Delay(1000); +#endif + +#if 0 + game_status = GAME_MODE_PLAYING; +#endif #if 1 /* needed if different viewport properties defined for playing */ @@ -4262,16 +4304,44 @@ void InitGame() #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 @@ -4400,6 +4470,8 @@ void InitGame() game_status = GAME_MODE_MAIN; #endif +#if 0 + StopAnimation(); if (!game.restart_level) @@ -4424,6 +4496,8 @@ void InitGame() FadeOut(REDRAW_FIELD); #endif +#endif + #if 0 game_status = GAME_MODE_PLAYING; #endif @@ -4433,15 +4507,19 @@ void InitGame() { 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 { @@ -4452,16 +4530,26 @@ void InitGame() 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 @@ -16445,6 +16533,12 @@ void RequestQuitGameExt(boolean skip_request, boolean quick_quit, char *message) { if (skip_request || Request(message, REQ_ASK | REQ_STAY_CLOSED)) { +#if 1 + /* closing door required in case of envelope style request dialogs */ + if (!skip_request) + CloseDoor(DOOR_CLOSE_1); +#endif + #if defined(NETWORK_AVALIABLE) if (options.network) SendToServer_StopPlaying(NETWORK_STOP_BY_PLAYER); @@ -16648,6 +16742,14 @@ static void LoadEngineSnapshotValues_RND() } } +void FreeEngineSnapshot() +{ + FreeEngineSnapshotBuffers(); + + setString(&snapshot_level_identifier, NULL); + snapshot_level_nr = -1; +} + void SaveEngineSnapshot() { /* do not save snapshots from editor */ @@ -16657,6 +16759,25 @@ void SaveEngineSnapshot() /* 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(); @@ -16668,6 +16789,7 @@ void SaveEngineSnapshot() 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 */ @@ -16763,9 +16885,40 @@ void LoadEngineSnapshot() /* 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() @@ -16946,6 +17099,7 @@ static void HandleGameButtonsExt(int id) TapeStop(); else RequestQuitGame(TRUE); + break; case GAME_CTRL_ID_PAUSE: