diff --git a/AUTHORS.md b/AUTHORS.md index 158e16ee6..d119c9b1a 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -108,6 +108,7 @@ Programmers Narmo Nathan Jeffords (blunted2night) NeveHanter + Nialsy Nikolay Kasyanov (corristo) nobrakal Nolan Poe (nopoe) diff --git a/apps/openmw/mwgui/enchantingdialog.cpp b/apps/openmw/mwgui/enchantingdialog.cpp index 8d8440626..e44dc6fcc 100644 --- a/apps/openmw/mwgui/enchantingdialog.cpp +++ b/apps/openmw/mwgui/enchantingdialog.cpp @@ -181,7 +181,7 @@ namespace MWGui mBuyButton->setCaptionWithReplacing("#{sCreate}"); - bool enabled = Settings::Manager::getBool("show enchant chance","GUI"); + bool enabled = Settings::Manager::getBool("show enchant chance","Game"); mChanceLayout->setVisible(enabled); diff --git a/apps/openmw/mwmechanics/aicombataction.cpp b/apps/openmw/mwmechanics/aicombataction.cpp index d0464418b..37b67c9b2 100644 --- a/apps/openmw/mwmechanics/aicombataction.cpp +++ b/apps/openmw/mwmechanics/aicombataction.cpp @@ -61,7 +61,7 @@ float suggestCombatRange(int rangeTypes) } } -int numEffectsToCure (const MWWorld::Ptr& actor, int effectFilter=-1) +int numEffectsToDispel (const MWWorld::Ptr& actor, int effectFilter=-1, bool negative = true) { int toCure=0; const MWMechanics::ActiveSpells& activeSpells = actor.getClass().getCreatureStats(actor).getActiveSpells(); @@ -75,9 +75,14 @@ int numEffectsToCure (const MWWorld::Ptr& actor, int effectFilter=-1) if (effectFilter != -1 && effectId != effectFilter) continue; const ESM::MagicEffect* magicEffect = MWBase::Environment::get().getWorld()->getStore().get().find(effectId); - if (magicEffect->mData.mFlags & ESM::MagicEffect::Harmful - && effectIt->mDuration > 3 // Don't attempt to cure if effect runs out shortly anyway - ) + + if (effectIt->mDuration <= 3) // Don't attempt to dispel if effect runs out shortly anyway + continue; + + if (negative && magicEffect->mData.mFlags & ESM::MagicEffect::Harmful) + ++toCure; + + if (!negative && !(magicEffect->mData.mFlags & ESM::MagicEffect::Harmful)) ++toCure; } } @@ -400,14 +405,47 @@ namespace MWMechanics } break; - // Prefer Cure effects over Dispel, because Dispel also removes positive effects case ESM::MagicEffect::Dispel: - return 1000.f * numEffectsToCure(actor); - case ESM::MagicEffect::CureParalyzation: - return 1001.f * numEffectsToCure(actor, ESM::MagicEffect::Paralyze); - case ESM::MagicEffect::CurePoison: - return 1001.f * numEffectsToCure(actor, ESM::MagicEffect::Poison); + { + int numPositive = 0; + int numNegative = 0; + int diff = 0; + if (effect.mRange == ESM::RT_Self) + { + numPositive = numEffectsToDispel(actor, -1, false); + numNegative = numEffectsToDispel(actor); + + diff = numNegative - numPositive; + } + else + { + if (enemy.isEmpty()) + return 0.f; + + numPositive = numEffectsToDispel(enemy, -1, false); + numNegative = numEffectsToDispel(enemy); + + diff = numPositive - numNegative; + + // if rating < 0 here, the spell will be considered as negative later + rating *= -1; + } + + if (diff <= 0) + return 0.f; + + rating *= (diff) / 5.f; + + break; + } + + // Prefer Cure effects over Dispel, because Dispel also removes positive effects + case ESM::MagicEffect::CureParalyzation: + return 1001.f * numEffectsToDispel(actor, ESM::MagicEffect::Paralyze); + + case ESM::MagicEffect::CurePoison: + return 1001.f * numEffectsToDispel(actor, ESM::MagicEffect::Poison); case ESM::MagicEffect::DisintegrateArmor: { if (enemy.isEmpty()) @@ -555,6 +593,7 @@ namespace MWMechanics // Combat AI is egoistic, so doesn't consider applying positive effects to friendly actors. if (effect.mRange != ESM::RT_Self) rating *= -1.f; + return rating; } diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index 7a71d1cf8..17e58ced0 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -342,6 +342,7 @@ namespace MWWorld mDoorStates.clear(); + mGoToJail = false; mTeleportEnabled = true; mLevitationEnabled = true; diff --git a/docs/source/reference/modding/settings/GUI.rst b/docs/source/reference/modding/settings/GUI.rst index cdc3bd889..ad3514ffa 100644 --- a/docs/source/reference/modding/settings/GUI.rst +++ b/docs/source/reference/modding/settings/GUI.rst @@ -127,14 +127,3 @@ The default value is "1.0 0.15 0.15 1.0" which is a bright red color. This setting can only be configured by editing the settings configuration file. This setting has no effect if the crosshair setting in the HUD Settings Section is false. This setting has no effect if the show owned setting in the Game Settings Section is false. - -show enchant chance ----------------- - -:Type: boolean -:Range: True/False -:Default: False - -Whether or not the chance of success will be displayed in the enchanting menu. - -The default value is false. This setting can only be configured by editing the settings configuration file. diff --git a/docs/source/reference/modding/settings/game.rst b/docs/source/reference/modding/settings/game.rst index d5828ee12..62fe5a70e 100644 --- a/docs/source/reference/modding/settings/game.rst +++ b/docs/source/reference/modding/settings/game.rst @@ -40,6 +40,17 @@ If this setting is true, melee weapons reach and speed will be showed on item to The default value is false. This setting can only be configured by editing the settings configuration file. +show enchant chance +------------------- + +:Type: boolean +:Range: True/False +:Default: False + +Whether or not the chance of success will be displayed in the enchanting menu. + +The default value is false. This setting can only be configured by editing the settings configuration file. + best attack ----------- diff --git a/extern/oics/ICSInputControlSystem.cpp b/extern/oics/ICSInputControlSystem.cpp index a8aedfd2e..8bb9c4638 100644 --- a/extern/oics/ICSInputControlSystem.cpp +++ b/extern/oics/ICSInputControlSystem.cpp @@ -28,6 +28,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. namespace ICS { + const float ICS_MAX = std::numeric_limits::max(); + InputControlSystem::InputControlSystem(std::string file, bool active , DetectingBindingListener* detectingBindingListener , InputControlSystemLog* log, size_t channelCount) diff --git a/extern/oics/ICSInputControlSystem.h b/extern/oics/ICSInputControlSystem.h index a82a11d75..691a93725 100644 --- a/extern/oics/ICSInputControlSystem.h +++ b/extern/oics/ICSInputControlSystem.h @@ -236,7 +236,7 @@ namespace ICS }; - static const float ICS_MAX = std::numeric_limits::max(); + extern const float ICS_MAX; } diff --git a/files/settings-default.cfg b/files/settings-default.cfg index 0a1af81b1..9c3667a6e 100644 --- a/files/settings-default.cfg +++ b/files/settings-default.cfg @@ -141,9 +141,6 @@ werewolf overlay = true color background owned = 0.15 0.0 0.0 1.0 color crosshair owned = 1.0 0.15 0.15 1.0 -# Show success probability in self-enchant dialog -show enchant chance = false - [HUD] # Displays the crosshair or reticle when not in GUI mode. @@ -161,6 +158,9 @@ show projectile damage = false # Show additional melee weapon info: reach and attack speed show melee info = false +# Show success probability in self-enchant dialog +show enchant chance = false + # Always use the best mode of attack: e.g. chop, slash or thrust. best attack = false