1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-03 17:39:42 +00:00

Use std::array in NpcStats

This commit is contained in:
Evil Eye 2023-06-03 14:26:37 +02:00
parent a5bb6c7d8d
commit e01a3076dd
4 changed files with 31 additions and 31 deletions

View file

@ -25,11 +25,11 @@ namespace ESSImport
faction.mReputation = essFaction.mReputation; faction.mReputation = essFaction.mReputation;
out.mObject.mNpcStats.mFactions[ESM::RefId::stringRefId(essFaction.mFactionName.toString())] = faction; out.mObject.mNpcStats.mFactions[ESM::RefId::stringRefId(essFaction.mFactionName.toString())] = faction;
} }
for (int i = 0; i < 3; ++i) for (size_t i = 0; i < out.mObject.mNpcStats.mSpecIncreases.size(); ++i)
out.mObject.mNpcStats.mSpecIncreases[i] = pcdt.mPNAM.mSpecIncreases[i]; out.mObject.mNpcStats.mSpecIncreases[i] = pcdt.mPNAM.mSpecIncreases[i];
for (int i = 0; i < 8; ++i) for (size_t i = 0; i < out.mObject.mNpcStats.mSkillIncrease.size(); ++i)
out.mObject.mNpcStats.mSkillIncrease[i] = pcdt.mPNAM.mSkillIncreases[i]; out.mObject.mNpcStats.mSkillIncrease[i] = pcdt.mPNAM.mSkillIncreases[i];
for (int i = 0; i < 27; ++i) for (size_t i = 0; i < out.mObject.mNpcStats.mSkills.size(); ++i)
out.mObject.mNpcStats.mSkills[i].mProgress = pcdt.mPNAM.mSkillProgress[i]; out.mObject.mNpcStats.mSkills[i].mProgress = pcdt.mPNAM.mSkillProgress[i];
out.mObject.mNpcStats.mLevelProgress = pcdt.mPNAM.mLevelProgress; out.mObject.mNpcStats.mLevelProgress = pcdt.mPNAM.mLevelProgress;

View file

@ -470,7 +470,7 @@ void MWMechanics::NpcStats::writeState(ESM::NpcStats& state) const
state.mDisposition = mDisposition; state.mDisposition = mDisposition;
for (int i = 0; i < ESM::Skill::Length; ++i) for (size_t i = 0; i < state.mSkills.size(); ++i)
mSkill[i].writeState(state.mSkills[i]); mSkill[i].writeState(state.mSkills[i]);
state.mIsWerewolf = mIsWerewolf; state.mIsWerewolf = mIsWerewolf;
@ -489,10 +489,10 @@ void MWMechanics::NpcStats::writeState(ESM::NpcStats& state) const
state.mWerewolfKills = mWerewolfKills; state.mWerewolfKills = mWerewolfKills;
state.mLevelProgress = mLevelProgress; state.mLevelProgress = mLevelProgress;
for (int i = 0; i < ESM::Attribute::Length; ++i) for (size_t i = 0; i < state.mSkillIncrease.size(); ++i)
state.mSkillIncrease[i] = mSkillIncreases[i]; state.mSkillIncrease[i] = mSkillIncreases[i];
for (int i = 0; i < 3; ++i) for (size_t i = 0; i < state.mSpecIncreases.size(); ++i)
state.mSpecIncreases[i] = mSpecIncreases[i]; state.mSpecIncreases[i] = mSpecIncreases[i];
std::copy(mUsedIds.begin(), mUsedIds.end(), std::back_inserter(state.mUsedIds)); std::copy(mUsedIds.begin(), mUsedIds.end(), std::back_inserter(state.mUsedIds));
@ -523,7 +523,7 @@ void MWMechanics::NpcStats::readState(const ESM::NpcStats& state)
mDisposition = state.mDisposition; mDisposition = state.mDisposition;
for (int i = 0; i < ESM::Skill::Length; ++i) for (size_t i = 0; i < state.mSkills.size(); ++i)
mSkill[i].readState(state.mSkills[i]); mSkill[i].readState(state.mSkills[i]);
mIsWerewolf = state.mIsWerewolf; mIsWerewolf = state.mIsWerewolf;
@ -534,10 +534,10 @@ void MWMechanics::NpcStats::readState(const ESM::NpcStats& state)
mWerewolfKills = state.mWerewolfKills; mWerewolfKills = state.mWerewolfKills;
mLevelProgress = state.mLevelProgress; mLevelProgress = state.mLevelProgress;
for (int i = 0; i < ESM::Attribute::Length; ++i) for (size_t i = 0; i < state.mSkillIncrease.size(); ++i)
mSkillIncreases[i] = state.mSkillIncrease[i]; mSkillIncreases[i] = state.mSkillIncrease[i];
for (int i = 0; i < 3; ++i) for (size_t i = 0; i < state.mSpecIncreases.size(); ++i)
mSpecIncreases[i] = state.mSpecIncreases[i]; mSpecIncreases[i] = state.mSpecIncreases[i];
for (auto iter(state.mUsedIds.begin()); iter != state.mUsedIds.end(); ++iter) for (auto iter(state.mUsedIds.begin()); iter != state.mUsedIds.end(); ++iter)

View file

@ -31,15 +31,15 @@ namespace ESM
esm.getHNOT(faction.mReputation, "FARE"); esm.getHNOT(faction.mReputation, "FARE");
mFactions.insert(std::make_pair(id, faction)); mFactions.emplace(id, faction);
} }
mDisposition = 0; mDisposition = 0;
esm.getHNOT(mDisposition, "DISP"); esm.getHNOT(mDisposition, "DISP");
const bool intFallback = esm.getFormatVersion() <= MaxIntFallbackFormatVersion; const bool intFallback = esm.getFormatVersion() <= MaxIntFallbackFormatVersion;
for (int i = 0; i < 27; ++i) for (auto& skill : mSkills)
mSkills[i].load(esm, intFallback); skill.load(esm, intFallback);
mWerewolfDeprecatedData = false; mWerewolfDeprecatedData = false;
if (esm.getFormatVersion() <= MaxWerewolfDeprecatedDataFormatVersion && esm.peekNextSub("STBA")) if (esm.getFormatVersion() <= MaxWerewolfDeprecatedDataFormatVersion && esm.peekNextSub("STBA"))
@ -47,9 +47,9 @@ namespace ESM
// we have deprecated werewolf skills, stored interleaved // we have deprecated werewolf skills, stored interleaved
// Load into one big vector, then remove every 2nd value // Load into one big vector, then remove every 2nd value
mWerewolfDeprecatedData = true; mWerewolfDeprecatedData = true;
std::vector<StatState<float>> skills(mSkills, mSkills + sizeof(mSkills) / sizeof(mSkills[0])); std::vector<StatState<float>> skills(mSkills.begin(), mSkills.end());
for (int i = 0; i < 27; ++i) for (int i = 0; i < ESM::Skill::Length; ++i)
{ {
StatState<float> skill; StatState<float> skill;
skill.load(esm, intFallback); skill.load(esm, intFallback);
@ -67,7 +67,7 @@ namespace ESM
if (skills.size() != std::size(mSkills)) if (skills.size() != std::size(mSkills))
throw std::runtime_error( throw std::runtime_error(
"Invalid number of skill for werewolf deprecated data: " + std::to_string(skills.size())); "Invalid number of skill for werewolf deprecated data: " + std::to_string(skills.size()));
std::copy(skills.begin(), skills.end(), mSkills); std::copy(skills.begin(), skills.end(), mSkills.begin());
} }
// No longer used // No longer used
@ -76,7 +76,7 @@ namespace ESM
if (hasWerewolfAttributes) if (hasWerewolfAttributes)
{ {
StatState<int> dummy; StatState<int> dummy;
for (int i = 0; i < 8; ++i) for (int i = 0; i < ESM::Attribute::Length; ++i)
dummy.load(esm, intFallback); dummy.load(esm, intFallback);
mWerewolfDeprecatedData = true; mWerewolfDeprecatedData = true;
} }
@ -104,12 +104,10 @@ namespace ESM
mLevelProgress = 0; mLevelProgress = 0;
esm.getHNOT(mLevelProgress, "LPRO"); esm.getHNOT(mLevelProgress, "LPRO");
for (int i = 0; i < 8; ++i) mSkillIncrease.fill(0);
mSkillIncrease[i] = 0;
esm.getHNOT(mSkillIncrease, "INCR"); esm.getHNOT(mSkillIncrease, "INCR");
for (int i = 0; i < 3; ++i) mSpecIncreases.fill(0);
mSpecIncreases[i] = 0;
esm.getHNOT(mSpecIncreases, "SPEC"); esm.getHNOT(mSpecIncreases, "SPEC");
while (esm.isNextSub("USED")) while (esm.isNextSub("USED"))
@ -152,8 +150,8 @@ namespace ESM
if (mDisposition) if (mDisposition)
esm.writeHNT("DISP", mDisposition); esm.writeHNT("DISP", mDisposition);
for (int i = 0; i < 27; ++i) for (const auto& skill : mSkills)
mSkills[i].save(esm); skill.save(esm);
if (mIsWerewolf) if (mIsWerewolf)
esm.writeHNT("WOLF", mIsWerewolf); esm.writeHNT("WOLF", mIsWerewolf);
@ -171,9 +169,9 @@ namespace ESM
esm.writeHNT("LPRO", mLevelProgress); esm.writeHNT("LPRO", mLevelProgress);
bool saveSkillIncreases = false; bool saveSkillIncreases = false;
for (int i = 0; i < 8; ++i) for (int increase : mSkillIncrease)
{ {
if (mSkillIncrease[i] != 0) if (increase != 0)
{ {
saveSkillIncreases = true; saveSkillIncreases = true;
break; break;
@ -204,10 +202,8 @@ namespace ESM
mReputation = 0; mReputation = 0;
mWerewolfKills = 0; mWerewolfKills = 0;
mLevelProgress = 0; mLevelProgress = 0;
for (int i = 0; i < 8; ++i) mSkillIncrease.fill(0);
mSkillIncrease[i] = 0; mSpecIncreases.fill(0);
for (int i = 0; i < 3; ++i)
mSpecIncreases[i] = 0;
mTimeToStartDrowning = 20; mTimeToStartDrowning = 20;
mCrimeId = -1; mCrimeId = -1;
} }

View file

@ -1,8 +1,12 @@
#ifndef OPENMW_ESM_NPCSTATS_H #ifndef OPENMW_ESM_NPCSTATS_H
#define OPENMW_ESM_NPCSTATS_H #define OPENMW_ESM_NPCSTATS_H
#include "loadskil.hpp"
#include "statstate.hpp" #include "statstate.hpp"
#include <components/esm/attr.hpp>
#include <components/esm/refid.hpp> #include <components/esm/refid.hpp>
#include <array>
#include <map> #include <map>
#include <string> #include <string>
#include <vector> #include <vector>
@ -31,13 +35,13 @@ namespace ESM
std::map<ESM::RefId, Faction> mFactions; // lower case IDs std::map<ESM::RefId, Faction> mFactions; // lower case IDs
int mDisposition; int mDisposition;
StatState<float> mSkills[27]; std::array<StatState<float>, ESM::Skill::Length> mSkills;
int mBounty; int mBounty;
int mReputation; int mReputation;
int mWerewolfKills; int mWerewolfKills;
int mLevelProgress; int mLevelProgress;
int mSkillIncrease[8]; std::array<int, ESM::Attribute::Length> mSkillIncrease;
int mSpecIncreases[3]; std::array<int, 3> mSpecIncreases;
std::vector<ESM::RefId> mUsedIds; // lower case IDs std::vector<ESM::RefId> mUsedIds; // lower case IDs
float mTimeToStartDrowning; float mTimeToStartDrowning;
int mCrimeId; int mCrimeId;