1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-03-27 12:40:25 +00:00

Use std::array in RADTstruct

This commit is contained in:
Evil Eye 2023-06-03 10:45:32 +02:00
parent 25bbaa2343
commit 8a474b9807
7 changed files with 31 additions and 44 deletions

View file

@ -1188,7 +1188,7 @@ namespace EsmTool
std::cout << (male ? " Male:" : " Female:") << std::endl; std::cout << (male ? " Male:" : " Female:") << std::endl;
for (int j = 0; j < 8; ++j) for (int j = 0; j < ESM::Attribute::Length; ++j)
std::cout << " " << sAttributeNames[j] << ": " << mData.mData.mAttributeValues[j].getValue(male) std::cout << " " << sAttributeNames[j] << ": " << mData.mData.mAttributeValues[j].getValue(male)
<< std::endl; << std::endl;
@ -1196,11 +1196,11 @@ namespace EsmTool
std::cout << " Weight: " << mData.mData.mWeight.getValue(male) << std::endl; std::cout << " Weight: " << mData.mData.mWeight.getValue(male) << std::endl;
} }
for (int i = 0; i != 7; i++) for (const auto& bonus : mData.mData.mBonus)
// Not all races have 7 skills. // Not all races have 7 skills.
if (mData.mData.mBonus[i].mSkill != -1) if (bonus.mSkill != -1)
std::cout << " Skill: " << skillLabel(mData.mData.mBonus[i].mSkill) << " (" std::cout << " Skill: " << skillLabel(bonus.mSkill) << " (" << bonus.mSkill << ") = " << bonus.mBonus
<< mData.mData.mBonus[i].mSkill << ") = " << mData.mData.mBonus[i].mBonus << std::endl; << std::endl;
for (const auto& power : mData.mPowers.mList) for (const auto& power : mData.mPowers.mList)
std::cout << " Power: " << power << std::endl; std::cout << " Power: " << power << std::endl;

View file

@ -825,8 +825,7 @@ namespace CSMWorld
{ {
ESM::Race race = record.get(); ESM::Race race = record.get();
if (subRowIndex < 0 if (subRowIndex < 0 || static_cast<size_t>(subRowIndex) >= race.mData.mBonus.size())
|| subRowIndex >= static_cast<int>(sizeof(race.mData.mBonus) / sizeof(race.mData.mBonus[0])))
throw std::runtime_error("index out of range"); throw std::runtime_error("index out of range");
switch (subColIndex) switch (subColIndex)
@ -845,8 +844,7 @@ namespace CSMWorld
{ {
ESM::Race race = record.get(); ESM::Race race = record.get();
if (subRowIndex < 0 if (subRowIndex < 0 || static_cast<size_t>(subRowIndex) >= race.mData.mBonus.size())
|| subRowIndex >= static_cast<int>(sizeof(race.mData.mBonus) / sizeof(race.mData.mBonus[0])))
throw std::runtime_error("index out of range"); throw std::runtime_error("index out of range");
switch (subColIndex) switch (subColIndex)
@ -871,8 +869,7 @@ namespace CSMWorld
int RaceSkillsBonusAdapter::getRowsCount(const Record<ESM::Race>& record) const int RaceSkillsBonusAdapter::getRowsCount(const Record<ESM::Race>& record) const
{ {
// there are 7 skill bonuses return record.get().mData.mBonus.size();
return static_cast<int>(sizeof(record.get().mData.mBonus) / sizeof(record.get().mData.mBonus[0]));
} }
void CellListAdapter::addRow(Record<CSMWorld::Cell>& record, int position) const void CellListAdapter::addRow(Record<CSMWorld::Cell>& record, int position) const

View file

@ -201,14 +201,10 @@ namespace
int raceBonus = 0; int raceBonus = 0;
int specBonus = 0; int specBonus = 0;
for (int raceSkillIndex = 0; raceSkillIndex < 7; ++raceSkillIndex) auto bonusIt = std::find_if(race->mData.mBonus.begin(), race->mData.mBonus.end(),
{ [skillIndex](const auto& bonus) { return bonus.mSkill == skillIndex; });
if (race->mData.mBonus[raceSkillIndex].mSkill == skillIndex) if (bonusIt != race->mData.mBonus.end())
{ raceBonus = bonusIt->mBonus;
raceBonus = race->mData.mBonus[raceSkillIndex].mBonus;
break;
}
}
for (int k = 0; k < 5; ++k) for (int k = 0; k < 5; ++k)
{ {

View file

@ -412,20 +412,15 @@ namespace MWGui
const MWWorld::ESMStore& store = *MWBase::Environment::get().getESMStore(); const MWWorld::ESMStore& store = *MWBase::Environment::get().getESMStore();
const ESM::Race* race = store.get<ESM::Race>().find(mCurrentRaceId); const ESM::Race* race = store.get<ESM::Race>().find(mCurrentRaceId);
int count = sizeof(race->mData.mBonus) for (const auto& bonus : race->mData.mBonus)
/ sizeof(race->mData.mBonus[0]); // TODO: Find a portable macro for this ARRAYSIZE?
for (int i = 0; i < count; ++i)
{ {
int skillId = race->mData.mBonus[i].mSkill; if (bonus.mSkill < 0 || bonus.mSkill >= ESM::Skill::Length) // Skip unknown skill indexes
if (skillId < 0 || skillId > ESM::Skill::Length) // Skip unknown skill indexes
continue; continue;
skillWidget = mSkillList->createWidget<Widgets::MWSkill>( skillWidget = mSkillList->createWidget<Widgets::MWSkill>("MW_StatNameValue", coord1, MyGUI::Align::Default);
"MW_StatNameValue", coord1, MyGUI::Align::Default, std::string("Skill") + MyGUI::utility::toString(i)); skillWidget->setSkillId(ESM::Skill::SkillEnum(bonus.mSkill));
skillWidget->setSkillNumber(skillId); skillWidget->setSkillValue(Widgets::MWSkill::SkillValue(static_cast<float>(bonus.mBonus), 0.f));
skillWidget->setSkillValue( ToolTips::createSkillToolTip(skillWidget, bonus.mSkill);
Widgets::MWSkill::SkillValue(static_cast<float>(race->mData.mBonus[i].mBonus), 0.f));
ToolTips::createSkillToolTip(skillWidget, skillId);
mSkillItems.push_back(skillWidget); mSkillItems.push_back(skillWidget);

View file

@ -148,7 +148,7 @@ namespace MWMechanics
bool male = (player->mFlags & ESM::NPC::Female) == 0; bool male = (player->mFlags & ESM::NPC::Female) == 0;
for (int i = 0; i < 8; ++i) for (int i = 0; i < ESM::Attribute::Length; ++i)
{ {
const ESM::Race::MaleFemale& attribute = race->mData.mAttributeValues[i]; const ESM::Race::MaleFemale& attribute = race->mData.mAttributeValues[i];
@ -159,12 +159,10 @@ namespace MWMechanics
{ {
int bonus = 0; int bonus = 0;
for (int i2 = 0; i2 < 7; ++i2) auto bonusIt = std::find_if(race->mData.mBonus.begin(), race->mData.mBonus.end(),
if (race->mData.mBonus[i2].mSkill == i) [i](const auto& bonus) { return bonus.mSkill == i; });
{ if (bonusIt != race->mData.mBonus.end())
bonus = race->mData.mBonus[i2].mBonus; bonus = bonusIt->mBonus;
break;
}
npcStats.getSkill(i).setBase(5 + bonus); npcStats.getSkill(i).setBase(5 + bonus);
} }

View file

@ -84,14 +84,14 @@ namespace ESM
mPowers.mList.clear(); mPowers.mList.clear();
for (int i = 0; i < 7; ++i) for (auto& bonus : mData.mBonus)
{ {
mData.mBonus[i].mSkill = -1; bonus.mSkill = -1;
mData.mBonus[i].mBonus = 0; bonus.mBonus = 0;
} }
for (int i = 0; i < 8; ++i) for (auto& attribute : mData.mAttributeValues)
mData.mAttributeValues[i].mMale = mData.mAttributeValues[i].mFemale = 1; attribute.mMale = attribute.mFemale = 1;
mData.mHeight.mMale = mData.mHeight.mFemale = 1; mData.mHeight.mMale = mData.mHeight.mFemale = 1;
mData.mWeight.mMale = mData.mWeight.mFemale = 1; mData.mWeight.mMale = mData.mWeight.mFemale = 1;

View file

@ -1,6 +1,7 @@
#ifndef OPENMW_ESM_RACE_H #ifndef OPENMW_ESM_RACE_H
#define OPENMW_ESM_RACE_H #define OPENMW_ESM_RACE_H
#include <array>
#include <string> #include <string>
#include "components/esm/defs.hpp" #include "components/esm/defs.hpp"
@ -53,10 +54,10 @@ namespace ESM
struct RADTstruct struct RADTstruct
{ {
// List of skills that get a bonus // List of skills that get a bonus
SkillBonus mBonus[7]; std::array<SkillBonus, 7> mBonus;
// Attribute values for male/female // Attribute values for male/female
MaleFemale mAttributeValues[8]; std::array<MaleFemale, 8> mAttributeValues;
// The actual eye level height (in game units) is (probably) given // The actual eye level height (in game units) is (probably) given
// as 'height' times 128. This has not been tested yet. // as 'height' times 128. This has not been tested yet.