X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fgame_sp%2FMainGameLoop.c;h=6a5e0eafcbde6474bf604a910ee3de4b656531ec;hb=1e83803d7c99eb5232eab7d48a4194de3cf6f77f;hp=9aa59aacf86a89ad72d1bd8b88031d5d14130494;hpb=5ba7f2d9a3f07f342afdf215a3307d5487cb6d43;p=rocksndiamonds.git diff --git a/src/game_sp/MainGameLoop.c b/src/game_sp/MainGameLoop.c index 9aa59aac..6a5e0eaf 100644 --- a/src/game_sp/MainGameLoop.c +++ b/src/game_sp/MainGameLoop.c @@ -4,7 +4,8 @@ #include "MainGameLoop.h" -static char *VB_Name = "modMainGameLoop"; +// static char *VB_Name = "modMainGameLoop"; + // --- Option Explicit int GameLoopRunning; @@ -25,18 +26,25 @@ int subMainGameLoop() { int subMainGameLoop; - int al, bx; + // int al, bx; + int bx; +#if 0 TickCountObject Clock; currency LastFrame; +#endif if (DemoFlag != 0) { + printf("::: playing demo ...\n"); + // EP set level success byte: demo, not game WasDemoFlag = 1; EP_GameDemoVar0DAA = 0; // demo } else // loc_g_1836: { + printf("::: playing game ...\n"); + // EP set level success byte: game, not demo WasDemoFlag = 0; EP_GameDemoVar0DAA = 1; // game @@ -61,10 +69,12 @@ int subMainGameLoop() // This was a bug in the original Supaplex: sometimes red disks could not // be released. This happened If Murphy was killed DURING a red disk release // and the next try started. + RedDiskReleasePhase = 0; // (re-)enable red disk release UpdatedFlag = 0; GameLoopRunning = 1; LevelStatus = 0; + // ---------------------------------------------------------------------------- // --------------------- START OF GAME-BUSY LOOP ------------------------------ // ---------------------------------------------------------------------------- @@ -82,10 +92,16 @@ locRepeatMainGameLoop: // start repeating game loop { DoEvents(); // user may klick on menus or move the window here ... } +#if 1 + while (0); +#else while (Clock.TickDiffUS(LastFrame) < DeltaT); // wait till its time for the next frame +#endif // never any additional code between here! - LastFrame = Clock.TickNow; // store the frame time +#if 0 + LastFrame = Clock.TickNow(); // store the frame time +#endif // never any additional code between here! if (! NoDisplayFlag) // copy the BackBuffer(=Stage) to visible screen Stage.Blt(); @@ -112,8 +128,10 @@ locRepeatMainGameLoop: // start repeating game loop // Call subConvertToEasySymbols ' Convert to easy symbols // End If -loc_g_186F: + // loc_g_186F: + subProcessKeyboardInput(); // Check keyboard, act on keys + // 'HACK: // TimerVar = TimerVar + 1 // DoEvents @@ -123,18 +141,27 @@ loc_g_186F: // ---------------------------------------------------------------------------- // + + printf("::: MainGameLoop.c: subDoGameStuff() START\n"); + subDoGameStuff(); // do all game stuff + + printf("::: MainGameLoop.c: subDoGameStuff() END\n"); + // // ---------------------------------------------------------------------------- // Call subDisplayPlayingTime ' playing time on screen + subCheckRestoreRedDiskCountDisplay(); // Restore panel: red-disk hole subRedDiskReleaseExplosion(); // Red Disk release and explode subFollowUpExplosions(); // every explosion may cause up to 8 following explosions bx = subCalculateScreenScrollPos(); // calculate screen start addrs + ScreenPosition = bx; + // Now new X and new Y are calculated, and bx = screen position = ScreenPosition data_h_Ytmp = ScreenScrollYPos; // copy Y for next soft scroll data_h_Xtmp = ScreenScrollXPos; // copy X for next soft scroll @@ -178,7 +205,11 @@ locExitMainGameLoop: { DoEvents(); // user may klick on menus or move the window here ... } +#if 1 + while (0); +#else while (Clock.TickDiffUS(LastFrame) < DeltaT); // wait till its time for the next frame +#endif Stage.Blt(); // blit the last frame GameLoopRunning = 0; @@ -225,9 +256,21 @@ int subCalculateScreenScrollPos() ax = MainForm.picPane.Width / 2; Ay = MainForm.picPane.Height / 2; } + +#if 1 + ScreenScrollXPos = Stretch * (MurphyScreenXPos + 16) - ax; + ScreenScrollYPos = Stretch * (MurphyScreenYPos + 16) - Ay; +#else ScreenScrollXPos = Stretch * (MurphyScreenXPos + 8) - ax; ScreenScrollYPos = Stretch * (MurphyScreenYPos + 8) - Ay; +#endif + +#if 0 + printf("::: MainGameLoop.c: subCalculateScreenScrollPos(): %d, %d [%d, %d] -> %d, %d\n", + MainForm.picPane.Width, MainForm.picPane.Height, + MurphyScreenXPos, MurphyScreenYPos, + ScreenScrollXPos, ScreenScrollYPos); +#endif return subCalculateScreenScrollPos; } -