diff --git a/CHANGELOG.md b/CHANGELOG.md index 0b559c23f..6e0f007fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -207,6 +207,8 @@ Bug #5300: NPCs don't switch from torch to shield when starting combat Bug #5308: World map copying makes save loading much slower Bug #5313: Node properties of identical type are not applied in the correct order + Bug #5326: Formatting issues in the settings.cfg + Bug #5328: Skills aren't properly reset for dead actors Bug #5345: Dopey Necromancy does not work due to a missing quote Feature #1774: Handle AvoidNode Feature #2229: Improve pathfinding AI diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index bda78c0b5..8ee248ee5 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -1850,6 +1850,8 @@ namespace MWMechanics stats.getActiveSpells().visitEffectSources(soulTrap); } + // Magic effects will be reset later, and the magic effect that could kill the actor + // needs to be determined now calculateCreatureStatModifiers(iter->first, 0); if (cls.isEssential(iter->first)) @@ -1867,7 +1869,10 @@ namespace MWMechanics // Make sure spell effects are removed purgeSpellEffects(stats.getActorId()); + // Reset dynamic stats, attributes and skills calculateCreatureStatModifiers(iter->first, 0); + if (iter->first.getClass().isNpc()) + calculateNpcStatModifiers(iter->first, 0); if( iter->first == getPlayer()) { diff --git a/apps/openmw/mwrender/npcanimation.cpp b/apps/openmw/mwrender/npcanimation.cpp index 18ecd30fc..261723db5 100644 --- a/apps/openmw/mwrender/npcanimation.cpp +++ b/apps/openmw/mwrender/npcanimation.cpp @@ -269,6 +269,9 @@ void HeadAnimationTime::setBlinkStop(float value) NpcAnimation::NpcType NpcAnimation::getNpcType() { const MWWorld::Class &cls = mPtr.getClass(); + // Dead vampires should typically stay vampires. + if (mNpcType == Type_Vampire && cls.getNpcStats(mPtr).isDead() && !cls.getNpcStats(mPtr).isWerewolf()) + return mNpcType; NpcAnimation::NpcType curType = Type_Normal; if (cls.getCreatureStats(mPtr).getMagicEffects().get(ESM::MagicEffect::Vampirism).getMagnitude() > 0) curType = Type_Vampire; diff --git a/components/settings/parser.cpp b/components/settings/parser.cpp index e256da0d6..9693bf511 100644 --- a/components/settings/parser.cpp +++ b/components/settings/parser.cpp @@ -77,6 +77,9 @@ void Settings::SettingsFileParser::saveSettingsFile(const std::string& file, con // Were there any lines at all in the file? bool existing = false; + // Is an entirely blank line queued to be added? + bool emptyLineQueued = false; + // The category/section we're currently in. std::string currentCategory; @@ -100,12 +103,22 @@ void Settings::SettingsFileParser::saveSettingsFile(const std::string& file, con // The current character position in the line. size_t i = 0; - // Don't add additional newlines at the end of the file. + // An empty line was queued. + if (emptyLineQueued) + { + emptyLineQueued = false; + // We're still going through the current category, so we should copy it. + if (currentCategory.empty() || istream.eof() || line[i] != '[') + ostream << std::endl; + } + + // Don't add additional newlines at the end of the file otherwise. if (istream.eof()) continue; - // Copy entirely blank lines. - if (!skipWhiteSpace(i, line)) { - ostream << line << std::endl; + // Queue entirely blank lines to add them if desired. + if (!skipWhiteSpace(i, line)) + { + emptyLineQueued = true; continue; } @@ -128,15 +141,22 @@ void Settings::SettingsFileParser::saveSettingsFile(const std::string& file, con continue; } - // Ensure that all options in the current category have been written. - for (CategorySettingStatusMap::iterator mit = written.begin(); mit != written.end(); ++mit) { - if (mit->second == false && mit->first.first == currentCategory) { - Log(Debug::Verbose) << "Added new setting: [" << currentCategory << "] " - << mit->first.second << " = " << settings.at(mit->first); - ostream << mit->first.second << " = " << settings.at(mit->first) << std::endl; - mit->second = true; - changed = true; + if (!currentCategory.empty()) + { + // Ensure that all options in the current category have been written. + for (CategorySettingStatusMap::iterator mit = written.begin(); mit != written.end(); ++mit) + { + if (mit->second == false && mit->first.first == currentCategory) + { + Log(Debug::Verbose) << "Added new setting: [" << currentCategory << "] " + << mit->first.second << " = " << settings.at(mit->first); + ostream << mit->first.second << " = " << settings.at(mit->first) << std::endl; + mit->second = true; + changed = true; + } } + // Add an empty line after the last option in a category. + ostream << std::endl; } // Update the current category.