From 2eeef3bdc08a8035fc313f9c24fe4a7f0faba96a Mon Sep 17 00:00:00 2001 From: Sebastian Zych Date: Tue, 4 Aug 2020 20:51:47 +1000 Subject: [PATCH] Added option to smoothly transition health bar display. --- TR5Main/Game/control.cpp | 2 +- TR5Main/Game/health.cpp | 70 ++++++++++++++++++++++------- TR5Main/Game/health.h | 8 +++- TR5Main/Renderer/Renderer11Draw.cpp | 2 +- 4 files changed, 61 insertions(+), 21 deletions(-) diff --git a/TR5Main/Game/control.cpp b/TR5Main/Game/control.cpp index 8258a4b8d..31ba1c6a1 100644 --- a/TR5Main/Game/control.cpp +++ b/TR5Main/Game/control.cpp @@ -532,7 +532,7 @@ GAME_STATUS ControlPhase(int numFrames, int demoMode) //SoundEffects(); - HealtBarTimer--; + HealthBarTimer--; GameTimer++; } diff --git a/TR5Main/Game/health.cpp b/TR5Main/Game/health.cpp index 59bdd3852..5b4f7ee5a 100644 --- a/TR5Main/Game/health.cpp +++ b/TR5Main/Game/health.cpp @@ -6,6 +6,7 @@ #include "camera.h" #include "level.h" #include "control.h" + using namespace T5M::Renderer; short PickupX; short PickupY; @@ -13,7 +14,9 @@ short CurrentPickup; DISPLAY_PICKUP Pickups[MAX_COLLECTED_PICKUPS]; short PickupVel; int OldHitPoints = 1000; -int HealtBarTimer = 40; +int HealthBarTimer = 40; +float HealthBar = OldHitPoints; +float MutateAmount = 0; int FlashState = 0; int FlashCount = 0; int PoisonFlag = 0; @@ -22,6 +25,8 @@ extern RendererHUDBar* g_HealthBar; extern RendererHUDBar* g_DashBar; extern RendererHUDBar* g_AirBar; +bool EnableSmoothHealthBar = true; + void DrawHealthBarOverlay(int value) { if (CurrentLevel) @@ -44,11 +49,11 @@ void DrawHealthBar(float value) // color2 = 0xA0A000; //else // color2 = 0xA00000; - g_Renderer.DrawBar(value,::g_HealthBar); + g_Renderer.DrawBar(value, ::g_HealthBar); } } -void UpdateHealtBar(int flash) +void UpdateHealthBar(int flash) { int hitPoints = LaraItem->hitPoints; @@ -57,44 +62,75 @@ void UpdateHealtBar(int flash) else if (hitPoints > 1000) hitPoints = 1000; - if (OldHitPoints != hitPoints) + // OPT: smoothly transition health bar display. + if (EnableSmoothHealthBar) { - OldHitPoints = hitPoints; - HealtBarTimer = 40; + if (OldHitPoints != hitPoints) + { + MutateAmount += OldHitPoints - hitPoints; + OldHitPoints = hitPoints; + HealthBarTimer = 40; + } + + if (HealthBar - MutateAmount < 0) + MutateAmount = HealthBar; + else if (HealthBar - MutateAmount > 1000) + MutateAmount = HealthBar - 1000; + + HealthBar -= MutateAmount / 3; + MutateAmount -= MutateAmount / 3; + + if (MutateAmount > -0.5f && MutateAmount < 0.5f) + { + MutateAmount = 0; + HealthBar = hitPoints; + } } - if (HealtBarTimer < 0) - HealtBarTimer = 0; + // OG: discretely transition health bar display. + else + { + if (OldHitPoints != hitPoints) + { + OldHitPoints = hitPoints; + HealthBar = hitPoints; + HealthBarTimer = 40; + } + } - if (hitPoints <= 1000 / 4) + if (HealthBarTimer < 0) + HealthBarTimer = 0; + + // Flash when at 1/4 capacity AND HP bar is not transitioning. + if (HealthBar <= 1000 / 4 && MutateAmount == 0) { if (!BinocularRange) { if (flash) - DrawHealthBar(hitPoints / 1000.0f); + DrawHealthBar(HealthBar / 1000.0f); else DrawHealthBar(0); } - else + else { if (flash) - DrawHealthBarOverlay(hitPoints / 1000.0f); + DrawHealthBarOverlay(HealthBar / 1000.0f); else DrawHealthBarOverlay(0); } } - else if ((HealtBarTimer > 0) - || (hitPoints <= 0) + else if ((HealthBarTimer > 0) + || (HealthBar <= 0) || (Lara.gunStatus == LG_READY && Lara.gunType != WEAPON_TORCH) || (Lara.poisoned >= 256)) { if (!BinocularRange && !SniperOverlay) { - DrawHealthBar(hitPoints / 1000.0f); + DrawHealthBar(HealthBar / 1000.0f); } else { - DrawHealthBarOverlay(hitPoints / 1000.0f); + DrawHealthBarOverlay(HealthBar / 1000.0f); } } @@ -133,7 +169,7 @@ void UpdateAirBar(int flash) if (air <= 450) { if (flash) - DrawAirBar(air/ 1800.0f); + DrawAirBar(air / 1800.0f); else DrawAirBar(0); } diff --git a/TR5Main/Game/health.h b/TR5Main/Game/health.h index 87f49aa6d..ec0f66f03 100644 --- a/TR5Main/Game/health.h +++ b/TR5Main/Game/health.h @@ -9,7 +9,7 @@ typedef struct DISPLAY_PICKUP void DrawHealthBarOverlay(int value); void DrawHealthBar(float value); -void UpdateHealtBar(int flash); +void UpdateHealthBar(int flash); void DrawAirBar(float value); void UpdateAirBar(int flash); void DrawDashBar(int value); @@ -24,7 +24,11 @@ extern short CurrentPickup; extern DISPLAY_PICKUP Pickups[MAX_COLLECTED_PICKUPS]; extern short PickupVel; extern int OldHitPoints; -extern int HealtBarTimer; +extern int HealthBarTimer; +extern float HealthBar; +extern float MutateAmount; extern int FlashState; extern int PoisonFlag; extern int DashTimer; + +extern bool EnableSmoothHealthBar; diff --git a/TR5Main/Renderer/Renderer11Draw.cpp b/TR5Main/Renderer/Renderer11Draw.cpp index 35d2fca9e..88d9b6154 100644 --- a/TR5Main/Renderer/Renderer11Draw.cpp +++ b/TR5Main/Renderer/Renderer11Draw.cpp @@ -2044,7 +2044,7 @@ namespace T5M::Renderer int flash = FlashIt(); if (DashTimer < 120) DrawBar(DashTimer / 120.0f, g_DashBar); - UpdateHealtBar(flash); + UpdateHealthBar(flash); UpdateAirBar(flash); DrawAllPickups();