1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-04-02 00:36:40 +00:00

Use std::array in CLDTstruct

This commit is contained in:
Evil Eye 2023-06-03 11:58:09 +02:00
parent 8a474b9807
commit 7be005c9a5
10 changed files with 67 additions and 72 deletions

View file

@ -622,18 +622,15 @@ namespace EsmTool
std::cout << " Description: " << mData.mDescription << std::endl; std::cout << " Description: " << mData.mDescription << std::endl;
std::cout << " Playable: " << mData.mData.mIsPlayable << std::endl; std::cout << " Playable: " << mData.mData.mIsPlayable << std::endl;
std::cout << " AI Services: " << Misc::StringUtils::format("0x%08X", mData.mData.mServices) << std::endl; std::cout << " AI Services: " << Misc::StringUtils::format("0x%08X", mData.mData.mServices) << std::endl;
std::cout << " Attribute1: " << attributeLabel(mData.mData.mAttribute[0]) << " (" << mData.mData.mAttribute[0] for (size_t i = 0; i < mData.mData.mAttribute.size(); ++i)
<< ")" << std::endl; std::cout << " Attribute" << (i + 1) << ": " << attributeLabel(mData.mData.mAttribute[i]) << " ("
std::cout << " Attribute2: " << attributeLabel(mData.mData.mAttribute[1]) << " (" << mData.mData.mAttribute[1] << mData.mData.mAttribute[i] << ")" << std::endl;
<< ")" << std::endl;
std::cout << " Specialization: " << specializationLabel(mData.mData.mSpecialization) << " (" std::cout << " Specialization: " << specializationLabel(mData.mData.mSpecialization) << " ("
<< mData.mData.mSpecialization << ")" << std::endl; << mData.mData.mSpecialization << ")" << std::endl;
for (int i = 0; i != 5; i++) for (const auto& skills : mData.mData.mSkills)
std::cout << " Minor Skill: " << skillLabel(mData.mData.mSkills[i][0]) << " (" << mData.mData.mSkills[i][0] std::cout << " Minor Skill: " << skillLabel(skills[0]) << " (" << skills[0] << ")" << std::endl;
<< ")" << std::endl; for (const auto& skills : mData.mData.mSkills)
for (int i = 0; i != 5; i++) std::cout << " Major Skill: " << skillLabel(skills[1]) << " (" << skills[1] << ")" << std::endl;
std::cout << " Major Skill: " << skillLabel(mData.mData.mSkills[i][1]) << " (" << mData.mData.mSkills[i][1]
<< ")" << std::endl;
std::cout << " Deleted: " << mIsDeleted << std::endl; std::cout << " Deleted: " << mIsDeleted << std::endl;
} }

View file

@ -50,23 +50,32 @@ void CSMTools::ClassCheckStage::perform(int stage, CSMDoc::Messages& messages)
messages.add(id, "Description of a playable class is missing", "", CSMDoc::Message::Severity_Warning); messages.add(id, "Description of a playable class is missing", "", CSMDoc::Message::Severity_Warning);
// test for invalid attributes // test for invalid attributes
for (int i = 0; i < 2; ++i) std::map<int, int> attributeCount;
if (class_.mData.mAttribute[i] == -1) for (size_t i = 0; i < class_.mData.mAttribute.size(); ++i)
{
messages.add(id, "Attribute #" + std::to_string(i) + " is not set", "", CSMDoc::Message::Severity_Error);
}
if (class_.mData.mAttribute[0] == class_.mData.mAttribute[1] && class_.mData.mAttribute[0] != -1)
{ {
messages.add(id, "Same attribute is listed twice", "", CSMDoc::Message::Severity_Error); int attribute = class_.mData.mAttribute[i];
if (attribute == -1)
messages.add(id, "Attribute #" + std::to_string(i) + " is not set", {}, CSMDoc::Message::Severity_Error);
else
{
auto it = attributeCount.find(attribute);
if (it == attributeCount.end())
attributeCount.emplace(attribute, 1);
else
{
if (it->second == 1)
messages.add(id, "Same attribute is listed twice", {}, CSMDoc::Message::Severity_Error);
++it->second;
}
}
} }
// test for non-unique skill // test for non-unique skill
std::map<int, int> skills; // ID, number of occurrences std::map<int, int> skills; // ID, number of occurrences
for (int i = 0; i < 5; ++i) for (const auto& s : class_.mData.mSkills)
for (int i2 = 0; i2 < 2; ++i2) for (int skill : s)
++skills[class_.mData.mSkills[i][i2]]; ++skills[skill];
for (auto& skill : skills) for (auto& skill : skills)
if (skill.second > 1) if (skill.second > 1)

View file

@ -98,10 +98,9 @@ namespace
// class bonus // class bonus
const ESM::Class* class_ = MWBase::Environment::get().getESMStore()->get<ESM::Class>().find(npc->mClass); const ESM::Class* class_ = MWBase::Environment::get().getESMStore()->get<ESM::Class>().find(npc->mClass);
for (int i = 0; i < 2; ++i) for (int attribute : class_->mData.mAttribute)
{ {
int attribute = class_->mData.mAttribute[i]; if (attribute >= 0 && attribute < ESM::Attribute::Length)
if (attribute >= 0 && attribute < 8)
{ {
creatureStats.setAttribute(attribute, creatureStats.getAttribute(attribute).getBase() + 10); creatureStats.setAttribute(attribute, creatureStats.getAttribute(attribute).getBase() + 10);
} }
@ -121,14 +120,11 @@ namespace
// is this a minor or major skill? // is this a minor or major skill?
float add = 0.2f; float add = 0.2f;
for (int k = 0; k < 5; ++k) for (const auto& skills : class_->mData.mSkills)
{ {
if (class_->mData.mSkills[k][0] == j) if (skills[0] == j)
add = 0.5; add = 0.5;
} if (skills[1] == j)
for (int k = 0; k < 5; ++k)
{
if (class_->mData.mSkills[k][1] == j)
add = 1.0; add = 1.0;
} }
modifierSum += add; modifierSum += add;
@ -149,8 +145,8 @@ namespace
else if (class_->mData.mSpecialization == ESM::Class::Stealth) else if (class_->mData.mSpecialization == ESM::Class::Stealth)
multiplier += 1; multiplier += 1;
if (class_->mData.mAttribute[0] == ESM::Attribute::Endurance if (std::find(class_->mData.mAttribute.begin(), class_->mData.mAttribute.end(), ESM::Attribute::Endurance)
|| class_->mData.mAttribute[1] == ESM::Attribute::Endurance) != class_->mData.mAttribute.end())
multiplier += 1; multiplier += 1;
creatureStats.setHealth(floor(0.5f * (strength + endurance)) + multiplier * (creatureStats.getLevel() - 1)); creatureStats.setHealth(floor(0.5f * (strength + endurance)) + multiplier * (creatureStats.getLevel() - 1));
@ -183,9 +179,9 @@ namespace
{ {
int bonus = (i == 0) ? 10 : 25; int bonus = (i == 0) ? 10 : 25;
for (int i2 = 0; i2 < 5; ++i2) for (const auto& skills : class_->mData.mSkills)
{ {
int index = class_->mData.mSkills[i2][i]; int index = skills[i];
if (index >= 0 && index < ESM::Skill::Length) if (index >= 0 && index < ESM::Skill::Length)
{ {
npcStats.getSkill(index).setBase(npcStats.getSkill(index).getBase() + bonus); npcStats.getSkill(index).setBase(npcStats.getSkill(index).getBase() + bonus);
@ -206,10 +202,10 @@ namespace
if (bonusIt != race->mData.mBonus.end()) if (bonusIt != race->mData.mBonus.end())
raceBonus = bonusIt->mBonus; raceBonus = bonusIt->mBonus;
for (int k = 0; k < 5; ++k) for (const auto& skills : class_->mData.mSkills)
{ {
// is this a minor or major skill? // is this a minor or major skill?
if ((class_->mData.mSkills[k][0] == skillIndex) || (class_->mData.mSkills[k][1] == skillIndex)) if (std::find(skills.begin(), skills.end(), skillIndex) != skills.end())
{ {
majorMultiplier = 1.0f; majorMultiplier = 1.0f;
break; break;

View file

@ -473,15 +473,14 @@ namespace MWGui
klass.mRecordFlags = 0; klass.mRecordFlags = 0;
std::vector<int> attributes = mCreateClassDialog->getFavoriteAttributes(); std::vector<int> attributes = mCreateClassDialog->getFavoriteAttributes();
assert(attributes.size() == 2); assert(attributes.size() == klass.mData.mAttribute.size());
klass.mData.mAttribute[0] = attributes[0]; std::copy(attributes.begin(), attributes.end(), klass.mData.mAttribute.begin());
klass.mData.mAttribute[1] = attributes[1];
std::vector<ESM::Skill::SkillEnum> majorSkills = mCreateClassDialog->getMajorSkills(); std::vector<ESM::Skill::SkillEnum> majorSkills = mCreateClassDialog->getMajorSkills();
std::vector<ESM::Skill::SkillEnum> minorSkills = mCreateClassDialog->getMinorSkills(); std::vector<ESM::Skill::SkillEnum> minorSkills = mCreateClassDialog->getMinorSkills();
assert(majorSkills.size() >= sizeof(klass.mData.mSkills) / sizeof(klass.mData.mSkills[0])); assert(majorSkills.size() >= klass.mData.mSkills.size());
assert(minorSkills.size() >= sizeof(klass.mData.mSkills) / sizeof(klass.mData.mSkills[0])); assert(minorSkills.size() >= klass.mData.mSkills.size());
for (size_t i = 0; i < sizeof(klass.mData.mSkills) / sizeof(klass.mData.mSkills[0]); ++i) for (size_t i = 0; i < klass.mData.mSkills.size(); ++i)
{ {
klass.mData.mSkills[i][1] = majorSkills[i]; klass.mData.mSkills[i][1] = majorSkills[i];
klass.mData.mSkills[i][0] = minorSkills[i]; klass.mData.mSkills[i][0] = minorSkills[i];

View file

@ -264,7 +264,7 @@ namespace MWGui
ToolTips::createAttributeToolTip(mFavoriteAttribute[0], mFavoriteAttribute[0]->getAttributeId()); ToolTips::createAttributeToolTip(mFavoriteAttribute[0], mFavoriteAttribute[0]->getAttributeId());
ToolTips::createAttributeToolTip(mFavoriteAttribute[1], mFavoriteAttribute[1]->getAttributeId()); ToolTips::createAttributeToolTip(mFavoriteAttribute[1], mFavoriteAttribute[1]->getAttributeId());
for (int i = 0; i < 5; ++i) for (size_t i = 0; i < klass->mData.mSkills.size(); ++i)
{ {
mMinorSkill[i]->setSkillNumber(klass->mData.mSkills[i][0]); mMinorSkill[i]->setSkillNumber(klass->mData.mSkills[i][0]);
mMajorSkill[i]->setSkillNumber(klass->mData.mSkills[i][1]); mMajorSkill[i]->setSkillNumber(klass->mData.mSkills[i][1]);

View file

@ -124,10 +124,11 @@ namespace MWGui
= MWBase::Environment::get().getESMStore()->get<ESM::Class>().find(watchedRecord->mClass); = MWBase::Environment::get().getESMStore()->get<ESM::Class>().find(watchedRecord->mClass);
setValue("class", cls->mName); setValue("class", cls->mName);
MWBase::WindowManager::SkillList majorSkills(5); size_t size = cls->mData.mSkills.size();
MWBase::WindowManager::SkillList minorSkills(5); MWBase::WindowManager::SkillList majorSkills(size);
MWBase::WindowManager::SkillList minorSkills(size);
for (int i = 0; i < 5; ++i) for (size_t i = 0; i < size; ++i)
{ {
minorSkills[i] = cls->mData.mSkills[i][0]; minorSkills[i] = cls->mData.mSkills[i][0];
majorSkills[i] = cls->mData.mSkills[i][1]; majorSkills[i] = cls->mData.mSkills[i][1];

View file

@ -191,10 +191,9 @@ namespace MWMechanics
{ {
const ESM::Class* class_ = esmStore.get<ESM::Class>().find(player->mClass); const ESM::Class* class_ = esmStore.get<ESM::Class>().find(player->mClass);
for (int i = 0; i < 2; ++i) for (int attribute : class_->mData.mAttribute)
{ {
int attribute = class_->mData.mAttribute[i]; if (attribute >= 0 && attribute < ESM::Attribute::Length)
if (attribute >= 0 && attribute < 8)
{ {
creatureStats.setAttribute(attribute, creatureStats.getAttribute(attribute).getBase() + 10); creatureStats.setAttribute(attribute, creatureStats.getAttribute(attribute).getBase() + 10);
} }
@ -204,11 +203,11 @@ namespace MWMechanics
{ {
int bonus = i == 0 ? 10 : 25; int bonus = i == 0 ? 10 : 25;
for (int i2 = 0; i2 < 5; ++i2) for (const auto& skills : class_->mData.mSkills)
{ {
int index = class_->mData.mSkills[i2][i]; int index = skills[i];
if (index >= 0 && index < 27) if (index >= 0 && index < ESM::Skill::Length)
{ {
npcStats.getSkill(index).setBase(npcStats.getSkill(index).getBase() + bonus); npcStats.getSkill(index).setBase(npcStats.getSkill(index).getBase() + bonus);
} }

View file

@ -162,14 +162,14 @@ float MWMechanics::NpcStats::getSkillProgressRequirement(int skillIndex, const E
float typeFactor = gmst.find("fMiscSkillBonus")->mValue.getFloat(); float typeFactor = gmst.find("fMiscSkillBonus")->mValue.getFloat();
for (int i = 0; i < 5; ++i) for (const auto& skills : class_.mData.mSkills)
{ {
if (class_.mData.mSkills[i][0] == skillIndex) if (skills[0] == skillIndex)
{ {
typeFactor = gmst.find("fMinorSkillBonus")->mValue.getFloat(); typeFactor = gmst.find("fMinorSkillBonus")->mValue.getFloat();
break; break;
} }
else if (class_.mData.mSkills[i][1] == skillIndex) else if (skills[1] == skillIndex)
{ {
typeFactor = gmst.find("fMajorSkillBonus")->mValue.getFloat(); typeFactor = gmst.find("fMajorSkillBonus")->mValue.getFloat();
break; break;
@ -235,15 +235,15 @@ void MWMechanics::NpcStats::increaseSkill(
// is this a minor or major skill? // is this a minor or major skill?
int increase = gmst.find("iLevelupMiscMultAttriubte")->mValue.getInteger(); // Note: GMST has a typo int increase = gmst.find("iLevelupMiscMultAttriubte")->mValue.getInteger(); // Note: GMST has a typo
for (int k = 0; k < 5; ++k) for (const auto& skills : class_.mData.mSkills)
{ {
if (class_.mData.mSkills[k][0] == skillIndex) if (skills[0] == skillIndex)
{ {
mLevelProgress += gmst.find("iLevelUpMinorMult")->mValue.getInteger(); mLevelProgress += gmst.find("iLevelUpMinorMult")->mValue.getInteger();
increase = gmst.find("iLevelUpMinorMultAttribute")->mValue.getInteger(); increase = gmst.find("iLevelUpMinorMultAttribute")->mValue.getInteger();
break; break;
} }
else if (class_.mData.mSkills[k][1] == skillIndex) else if (skills[1] == skillIndex)
{ {
mLevelProgress += gmst.find("iLevelUpMajorMult")->mValue.getInteger(); mLevelProgress += gmst.find("iLevelUpMajorMult")->mValue.getInteger();
increase = gmst.find("iLevelUpMajorMultAttribute")->mValue.getInteger(); increase = gmst.find("iLevelUpMajorMultAttribute")->mValue.getInteger();

View file

@ -13,18 +13,12 @@ namespace ESM
int& Class::CLDTstruct::getSkill(int index, bool major) int& Class::CLDTstruct::getSkill(int index, bool major)
{ {
if (index < 0 || index >= 5) return mSkills.at(index)[major ? 1 : 0];
throw std::logic_error("skill index out of range");
return mSkills[index][major ? 1 : 0];
} }
int Class::CLDTstruct::getSkill(int index, bool major) const int Class::CLDTstruct::getSkill(int index, bool major) const
{ {
if (index < 0 || index >= 5) return mSkills.at(index)[major ? 1 : 0];
throw std::logic_error("skill index out of range");
return mSkills[index][major ? 1 : 0];
} }
void Class::load(ESMReader& esm, bool& isDeleted) void Class::load(ESMReader& esm, bool& isDeleted)
@ -91,13 +85,12 @@ namespace ESM
mName.clear(); mName.clear();
mDescription.clear(); mDescription.clear();
mData.mAttribute[0] = mData.mAttribute[1] = 0; mData.mAttribute.fill(0);
mData.mSpecialization = 0; mData.mSpecialization = 0;
mData.mIsPlayable = 0; mData.mIsPlayable = 0;
mData.mServices = 0; mData.mServices = 0;
for (int i = 0; i < 5; ++i) for (auto& skills : mData.mSkills)
for (int i2 = 0; i2 < 2; ++i2) skills.fill(0);
mData.mSkills[i][i2] = 0;
} }
} }

View file

@ -1,6 +1,7 @@
#ifndef OPENMW_ESM_CLAS_H #ifndef OPENMW_ESM_CLAS_H
#define OPENMW_ESM_CLAS_H #define OPENMW_ESM_CLAS_H
#include <array>
#include <string> #include <string>
#include "components/esm/defs.hpp" #include "components/esm/defs.hpp"
@ -33,9 +34,9 @@ namespace ESM
struct CLDTstruct struct CLDTstruct
{ {
int mAttribute[2]; // Attributes that get class bonus std::array<int, 2> mAttribute; // Attributes that get class bonus
int mSpecialization; // 0 = Combat, 1 = Magic, 2 = Stealth int mSpecialization; // 0 = Combat, 1 = Magic, 2 = Stealth
int mSkills[5][2]; // Minor and major skills. std::array<std::array<int, 2>, 5> mSkills; // Minor and major skills.
int mIsPlayable; // 0x0001 - Playable class int mIsPlayable; // 0x0001 - Playable class
int mServices; int mServices;