From fda74a47b4ba53b63d7bd6cfbb35cbd8e53681b5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 1 Sep 2020 20:14:15 +0200 Subject: [PATCH] - use gFrameClock plus interpolation for third person view and tick the flash counter for the CTF HUD in the ticker, not the drawer. This removes a lot of mess. --- source/blood/src/blood.cpp | 8 ++++++++ source/blood/src/sbar.cpp | 36 +++++++++++++----------------------- source/blood/src/view.cpp | 36 ++++++++++++++---------------------- source/blood/src/view.h | 5 +---- 4 files changed, 36 insertions(+), 49 deletions(-) diff --git a/source/blood/src/blood.cpp b/source/blood/src/blood.cpp index 2d9121676..b03cf0ada 100644 --- a/source/blood/src/blood.cpp +++ b/source/blood/src/blood.cpp @@ -335,6 +335,14 @@ void ProcessFrame(void) gLevelTime++; gFrameCount++; gFrameClock += 4; + + for(int i=0;i<8;i++) + { + dword_21EFD0[i] = dword_21EFD0[i] -= 4; + if (dword_21EFD0[i] < 0) + dword_21EFD0[i] = 0; + } + if ((gGameOptions.uGameFlags&1) != 0 && !gStartNewGame) { seqKillAll(); diff --git a/source/blood/src/sbar.cpp b/source/blood/src/sbar.cpp index b9643c9bf..a9a3fb470 100644 --- a/source/blood/src/sbar.cpp +++ b/source/blood/src/sbar.cpp @@ -473,16 +473,13 @@ private: // //--------------------------------------------------------------------------- - void viewDrawCtfHudVanilla(int arg) + void viewDrawCtfHudVanilla() { FString gTempStr; int x = 1, y = 1; if (dword_21EFD0[0] == 0 || (gFrameClock & 8)) { SBar_DrawString(this, &smallf, GStrings("TXT_COLOR_BLUE"), x, y, 0, CR_LIGHTBLUE, 1., -1, -1, 1, 1); - dword_21EFD0[0] = dword_21EFD0[0] - arg; - if (dword_21EFD0[0] < 0) - dword_21EFD0[0] = 0; gTempStr.Format("%-3d", dword_21EFB0[0]); SBar_DrawString(this, &smallf, gTempStr, x, y + 10, 0, CR_LIGHTBLUE, 1., -1, -1, 1, 1); } @@ -490,9 +487,6 @@ private: if (dword_21EFD0[1] == 0 || (gFrameClock & 8)) { SBar_DrawString(this, &smallf, GStrings("TXT_COLOR_RED"), x, y, DI_TEXT_ALIGN_RIGHT, CR_BRICK, 1., -1, -1, 1, 1); - dword_21EFD0[1] = dword_21EFD0[1] - arg; - if (dword_21EFD0[1] < 0) - dword_21EFD0[1] = 0; gTempStr.Format("%3d", dword_21EFB0[1]); SBar_DrawString(this, &smallf, gTempStr, x, y + 10, DI_TEXT_ALIGN_RIGHT, CR_BRICK, 1., -1, -1, 1, 1); } @@ -504,17 +498,13 @@ private: // //--------------------------------------------------------------------------- - void flashTeamScore(int arg, int team, bool show) + void flashTeamScore(int team, bool show) { dassert(0 == team || 1 == team); // 0: blue, 1: red if (dword_21EFD0[team] == 0 || (gFrameClock & 8)) { - dword_21EFD0[team] = dword_21EFD0[team] - arg; - if (dword_21EFD0[team] < 0) - dword_21EFD0[team] = 0; - - if (show) + if (show) DrawStatNumber("%d", dword_21EFB0[team], kSBarNumberInv, -30, team ? 25 : -10, 0, team ? 2 : 10, 512, 65536 * 0.75, DI_SCREEN_RIGHT_CENTER); } } @@ -525,12 +515,12 @@ private: // //--------------------------------------------------------------------------- - void viewDrawCtfHud(int arg) + void viewDrawCtfHud() { if (hud_size == Hud_Nothing) { - flashTeamScore(arg, 0, false); - flashTeamScore(arg, 1, false); + flashTeamScore(0, false); + flashTeamScore(1, false); return; } @@ -558,7 +548,7 @@ private: DrawStatMaskedSprite(2332, 305-320, 83 - 100, 0, 10, 512, 65536, DI_SCREEN_RIGHT_CENTER); else if (blueFlagTaken) DrawStatMaskedSprite(4097, 307-320, 77 - 100, 0, blueFlagCarrierColor ? 2 : 10, 512, 65536, DI_SCREEN_RIGHT_CENTER); - flashTeamScore(arg, 0, true); + flashTeamScore(0, true); bool meHaveRedFlag = gMe->hasFlag & 2; DrawStatMaskedSprite(meHaveRedFlag ? 3558 : 3559, 0, 10, 0, 2, 512, 65536 * 0.35, DI_SCREEN_RIGHT_CENTER); @@ -566,7 +556,7 @@ private: DrawStatMaskedSprite(2332, 305-320, 17, 0, 2, 512, 65536, DI_SCREEN_RIGHT_CENTER); else if (redFlagTaken) DrawStatMaskedSprite(4097, 307-320, 11, 0, redFlagCarrierColor ? 2 : 10, 512, 65536, DI_SCREEN_RIGHT_CENTER); - flashTeamScore(arg, 1, true); + flashTeamScore(1, true); } //--------------------------------------------------------------------------- @@ -784,7 +774,7 @@ private: // //--------------------------------------------------------------------------- public: - void UpdateStatusBar(int arg) + void UpdateStatusBar() { PLAYER* pPlayer = gView; XSPRITE* pXSprite = pPlayer->pXSprite; @@ -830,11 +820,11 @@ private: { if (VanillaMode()) { - viewDrawCtfHudVanilla(arg); + viewDrawCtfHudVanilla(); } else { - viewDrawCtfHud(arg); + viewDrawCtfHud(); viewDrawPlayerFlags(); } } @@ -862,7 +852,7 @@ static void UpdateFrame(void) twod->AddFlatFill(windowxy1.x - 3, windowxy2.y + 1, windowxy2.x + 1, windowxy2.y + 4, tex, 0, 1, 0xff2a2a2a); } -void UpdateStatusBar(int arg) +void UpdateStatusBar() { DBloodStatusBar sbar; @@ -871,7 +861,7 @@ void UpdateStatusBar(int arg) UpdateFrame(); } - sbar.UpdateStatusBar(arg); + sbar.UpdateStatusBar(); } diff --git a/source/blood/src/view.cpp b/source/blood/src/view.cpp index 1f8e820fe..db902fd59 100644 --- a/source/blood/src/view.cpp +++ b/source/blood/src/view.cpp @@ -302,16 +302,11 @@ void viewInit(void) gViewMap.sub_25C38(0, 0, gZoom, 0); } -void viewDrawInterface(int arg) -{ - UpdateStatusBar(arg); -} - int othercameradist = 1280; int cameradist = -1; int othercameraclock, cameraclock; -void CalcOtherPosition(spritetype *pSprite, int *pX, int *pY, int *pZ, int *vsectnum, int nAng, fixed_t zm) +void CalcOtherPosition(spritetype *pSprite, int *pX, int *pY, int *pZ, int *vsectnum, int nAng, fixed_t zm, int smoothratio) { int vX = mulscale30(-Cos(nAng), 1280); int vY = mulscale30(-Sin(nAng), 1280); @@ -349,14 +344,15 @@ void CalcOtherPosition(spritetype *pSprite, int *pX, int *pY, int *pZ, int *vsec *pX += mulscale16(vX, othercameradist); *pY += mulscale16(vY, othercameradist); *pZ += mulscale16(vZ, othercameradist); - othercameradist = ClipHigh(othercameradist+((gameclock-othercameraclock)<<10), 65536); - othercameraclock = gameclock; + int myclock = gFrameClock + mulscale16(4, smoothratio); + othercameradist = ClipHigh(othercameradist+((myclock-othercameraclock)<<10), 65536); + othercameraclock = myclock; dassert(*vsectnum >= 0 && *vsectnum < kMaxSectors); FindSector(*pX, *pY, *pZ, vsectnum); pSprite->cstat = bakCstat; } -void CalcPosition(spritetype *pSprite, int *pX, int *pY, int *pZ, int *vsectnum, int nAng, fixed_t zm) +void CalcPosition(spritetype *pSprite, int *pX, int *pY, int *pZ, int *vsectnum, int nAng, fixed_t zm, int smoothratio) { int vX = mulscale30(-Cos(nAng), 1280); int vY = mulscale30(-Sin(nAng), 1280); @@ -395,8 +391,9 @@ void CalcPosition(spritetype *pSprite, int *pX, int *pY, int *pZ, int *vsectnum, *pX += mulscale16(vX, cameradist); *pY += mulscale16(vY, cameradist); *pZ += mulscale16(vZ, cameradist); - cameradist = ClipHigh(cameradist+((gameclock-cameraclock)<<10), 65536); - cameraclock = gameclock; + int myclock = gFrameClock + mulscale16(4, smoothratio); + cameradist = ClipHigh(cameradist+((myclock-cameraclock)<<10), 65536); + cameraclock = myclock; dassert(*vsectnum >= 0 && *vsectnum < kMaxSectors); FindSector(*pX, *pY, *pZ, vsectnum); pSprite->cstat = bakCstat; @@ -603,16 +600,11 @@ int32_t g_frameRate; void viewDrawScreen(bool sceneonly) { int nPalette = 0; - static int lastUpdate; int defaultHoriz = r_horizcenter ? 100 : 90; #ifdef USE_OPENGL polymostcenterhoriz = defaultHoriz; #endif - int delta = gameclock - lastUpdate; - if (delta < 0) - delta = 0; - lastUpdate = gameclock; if (!paused && (!M_Active() || gGameOptions.nGameType != 0)) { gInterpolate = I_GetTimeFrac() * MaxSmoothRatio; @@ -734,11 +726,11 @@ void viewDrawScreen(bool sceneonly) } cZ += FixedToInt(q16horiz * 10); cameradist = -1; - cameraclock = gameclock; + cameraclock = gFrameClock +mulscale16(4, (int)gInterpolate); } else { - CalcPosition(gView->pSprite, (int*)&cX, (int*)&cY, (int*)&cZ, &nSectnum, FixedToInt(cA), q16horiz); + CalcPosition(gView->pSprite, (int*)&cX, (int*)&cY, (int*)&cZ, &nSectnum, FixedToInt(cA), q16horiz, (int)gInterpolate); } CheckLink((int*)&cX, (int*)&cY, (int*)&cZ, &nSectnum); int v78 = interpolateang(gScreenTiltO, gScreenTilt, gInterpolate); @@ -758,7 +750,7 @@ void viewDrawScreen(bool sceneonly) else if (v4 && gNetPlayers > 1) { #if 0 // needs to be redone for pure hardware rendering. - int tmp = (gameclock / 240) % (gNetPlayers - 1); + int tmp = (gFrameClock / 240) % (gNetPlayers - 1); int i = connecthead; while (1) { @@ -801,7 +793,7 @@ void viewDrawScreen(bool sceneonly) vd4 += QRandom2(nValue >> 4); vd0 += QRandom2(nValue); } - CalcOtherPosition(pOther->pSprite, &vd8, &vd4, &vd0, &vcc, v50, 0); + CalcOtherPosition(pOther->pSprite, &vd8, &vd4, &vd0, &vcc, v50, 0, (int)gInterpolate); CheckLink(&vd8, &vd4, &vd0, &vcc); if (IsUnderwaterSector(vcc)) { @@ -847,7 +839,7 @@ void viewDrawScreen(bool sceneonly) } else { - othercameraclock = gameclock; + othercameraclock = gFrameClock + mulscale16(4, (int)gInterpolate); } if (!bDelirium) @@ -988,7 +980,7 @@ void viewDrawScreen(bool sceneonly) { gViewMap.sub_25DB0(gView->pSprite); } - viewDrawInterface(delta); + UpdateStatusBar(); int zn = ((gView->zWeapon-gView->zView-(12<<8))>>7)+220; PLAYER *pPSprite = &gPlayer[gMe->pSprite->type-kDudePlayer1]; if (IsPlayerSprite(gMe->pSprite) && pPSprite->hand == 1) diff --git a/source/blood/src/view.h b/source/blood/src/view.h index c179b714a..b6e042c13 100644 --- a/source/blood/src/view.h +++ b/source/blood/src/view.h @@ -154,12 +154,9 @@ void CalcInterpolations(void); void RestoreInterpolations(void); void viewDrawText(int nFont, const char *pString, int x, int y, int nShade, int nPalette, int position, char shadow, unsigned int nStat = 0, uint8_t alpha = 255); void InitStatusBar(void); -void UpdateStatusBar(int arg); +void UpdateStatusBar(); void viewInit(void); -void viewDrawInterface(int arg); void viewProcessSprites(int32_t cX, int32_t cY, int32_t cZ, int32_t cA, int32_t smooth); -void CalcOtherPosition(spritetype *pSprite, int *pX, int *pY, int *pZ, int *vsectnum, int nAng, int zm); -void CalcPosition(spritetype *pSprite, int *pX, int *pY, int *pZ, int *vsectnum, int nAng, int zm); void viewSetMessage(const char *pMessage, const int pal = 0, const MESSAGE_PRIORITY priority = MESSAGE_PRIORITY_NORMAL);