1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-03 09:39:40 +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;
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];
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];
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.mLevelProgress = pcdt.mPNAM.mLevelProgress;

View file

@ -470,7 +470,7 @@ void MWMechanics::NpcStats::writeState(ESM::NpcStats& state) const
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]);
state.mIsWerewolf = mIsWerewolf;
@ -489,10 +489,10 @@ void MWMechanics::NpcStats::writeState(ESM::NpcStats& state) const
state.mWerewolfKills = mWerewolfKills;
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];
for (int i = 0; i < 3; ++i)
for (size_t i = 0; i < state.mSpecIncreases.size(); ++i)
state.mSpecIncreases[i] = mSpecIncreases[i];
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;
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]);
mIsWerewolf = state.mIsWerewolf;
@ -534,10 +534,10 @@ void MWMechanics::NpcStats::readState(const ESM::NpcStats& state)
mWerewolfKills = state.mWerewolfKills;
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];
for (int i = 0; i < 3; ++i)
for (size_t i = 0; i < state.mSpecIncreases.size(); ++i)
mSpecIncreases[i] = state.mSpecIncreases[i];
for (auto iter(state.mUsedIds.begin()); iter != state.mUsedIds.end(); ++iter)

View file

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

View file

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