From 054d8babc48cfe30e344ca65df85c411a0569569 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Thu, 10 Feb 2022 22:10:46 +0100 Subject: [PATCH] Add getRatio method --- apps/openmw/mwdialogue/filter.cpp | 12 ++---------- apps/openmw/mwgui/hud.cpp | 3 +-- apps/openmw/mwmechanics/aicombataction.cpp | 3 +-- apps/openmw/mwmechanics/stat.cpp | 13 +++++++++++++ apps/openmw/mwmechanics/stat.hpp | 1 + apps/openmw/mwscript/statsextensions.cpp | 12 ++---------- 6 files changed, 20 insertions(+), 24 deletions(-) diff --git a/apps/openmw/mwdialogue/filter.cpp b/apps/openmw/mwdialogue/filter.cpp index 7ae9f14a7a..e90ba79481 100644 --- a/apps/openmw/mwdialogue/filter.cpp +++ b/apps/openmw/mwdialogue/filter.cpp @@ -257,11 +257,7 @@ bool MWDialogue::Filter::testSelectStructNumeric (const SelectWrapper& select) c case SelectWrapper::Function_PcHealthPercent: { MWWorld::Ptr player = MWMechanics::getPlayer(); - float ratio = player.getClass().getCreatureStats(player).getHealth().getModified(); - if(ratio > 0) - ratio = player.getClass().getCreatureStats(player).getHealth().getCurrent() / ratio; - - return select.selectCompare (static_cast(ratio*100)); + return select.selectCompare(static_cast(player.getClass().getCreatureStats(player).getHealth().getRatio() * 100)); } case SelectWrapper::Function_PcDynamicStat: @@ -276,11 +272,7 @@ bool MWDialogue::Filter::testSelectStructNumeric (const SelectWrapper& select) c case SelectWrapper::Function_HealthPercent: { - float ratio = mActor.getClass().getCreatureStats(mActor).getHealth().getModified(); - if(ratio > 0) - ratio = mActor.getClass().getCreatureStats(mActor).getHealth().getCurrent() / ratio; - - return select.selectCompare (static_cast(ratio*100)); + return select.selectCompare(static_cast(mActor.getClass().getCreatureStats(mActor).getHealth().getRatio() * 100)); } default: diff --git a/apps/openmw/mwgui/hud.cpp b/apps/openmw/mwgui/hud.cpp index 5af85b34ae..e591163731 100644 --- a/apps/openmw/mwgui/hud.cpp +++ b/apps/openmw/mwgui/hud.cpp @@ -608,8 +608,7 @@ namespace MWGui mEnemyHealth->setProgressRange(100); // Health is usually cast to int before displaying. Actors die whenever they are < 1 health. // Therefore any value < 1 should show as an empty health bar. We do the same in statswindow :) - float health = stats.getHealth().getModified(); - mEnemyHealth->setProgressPosition(health == 0.f ? 0 : static_cast(stats.getHealth().getCurrent() / health * 100)); + mEnemyHealth->setProgressPosition(static_cast(stats.getHealth().getRatio() * 100)); static const float fNPCHealthBarFade = MWBase::Environment::get().getWorld()->getStore().get().find("fNPCHealthBarFade")->mValue.getFloat(); if (fNPCHealthBarFade > 0.f) diff --git a/apps/openmw/mwmechanics/aicombataction.cpp b/apps/openmw/mwmechanics/aicombataction.cpp index 3be68f8394..43b43eb9f9 100644 --- a/apps/openmw/mwmechanics/aicombataction.cpp +++ b/apps/openmw/mwmechanics/aicombataction.cpp @@ -476,8 +476,7 @@ namespace MWMechanics static const float fAIFleeHealthMult = gmst.find("fAIFleeHealthMult")->mValue.getFloat(); static const float fAIFleeFleeMult = gmst.find("fAIFleeFleeMult")->mValue.getFloat(); - float healthPercentage = (stats.getHealth().getModified() == 0.0f) - ? 1.0f : stats.getHealth().getCurrent() / stats.getHealth().getModified(); + float healthPercentage = stats.getHealth().getRatio(false); float rating = (1.0f - healthPercentage) * fAIFleeHealthMult + flee * fAIFleeFleeMult; static const int iWereWolfLevelToAttack = gmst.find("iWereWolfLevelToAttack")->mValue.getInteger(); diff --git a/apps/openmw/mwmechanics/stat.cpp b/apps/openmw/mwmechanics/stat.cpp index 9d62eb7873..eacfca98ae 100644 --- a/apps/openmw/mwmechanics/stat.cpp +++ b/apps/openmw/mwmechanics/stat.cpp @@ -65,6 +65,19 @@ namespace MWMechanics } } + template + T DynamicStat::getRatio(bool nanIsZero) const + { + T modified = getModified(); + if(modified == T{}) + { + if(nanIsZero) + return modified; + return {1}; + } + return getCurrent() / modified; + } + template void DynamicStat::writeState (ESM::StatState& state) const { diff --git a/apps/openmw/mwmechanics/stat.hpp b/apps/openmw/mwmechanics/stat.hpp index e08d0af71e..1e9bb100d0 100644 --- a/apps/openmw/mwmechanics/stat.hpp +++ b/apps/openmw/mwmechanics/stat.hpp @@ -67,6 +67,7 @@ namespace MWMechanics const T& getBase() const { return mStatic.getBase(); }; T getModified(bool capped = true) const { return mStatic.getModified(capped); }; const T& getCurrent() const { return mCurrent; }; + T getRatio(bool nanIsZero = true) const; /// Set base and adjust current accordingly. void setBase(const T& value) { mStatic.setBase(value); }; diff --git a/apps/openmw/mwscript/statsextensions.cpp b/apps/openmw/mwscript/statsextensions.cpp index f2de338fb3..a62d40065d 100644 --- a/apps/openmw/mwscript/statsextensions.cpp +++ b/apps/openmw/mwscript/statsextensions.cpp @@ -324,17 +324,9 @@ namespace MWScript void execute (Interpreter::Runtime& runtime) override { MWWorld::Ptr ptr = R()(runtime); + const MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats(ptr); - MWMechanics::CreatureStats& stats = ptr.getClass().getCreatureStats (ptr); - - Interpreter::Type_Float value = 0; - - Interpreter::Type_Float max = stats.getDynamic(mIndex).getModified(); - - if (max>0) - value = stats.getDynamic(mIndex).getCurrent() / max; - - runtime.push (value); + runtime.push(stats.getDynamic(mIndex).getRatio()); } };