mirror of
https://github.com/OpenMW/openmw.git
synced 2025-03-03 13:09:40 +00:00
Dropping a separate NPDTstruct12 object and instead use NPDTstruct52
NPDTstruct12 is now only used when loading and saving. Turning auto calc on and off now no longer switches between to different set of values
This commit is contained in:
parent
9b971caddc
commit
feeee50a88
9 changed files with 170 additions and 149 deletions
|
@ -1040,45 +1040,47 @@ void Record<ESM::NPC>::print()
|
||||||
|
|
||||||
if (mData.mNpdtType == ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS)
|
if (mData.mNpdtType == ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS)
|
||||||
{
|
{
|
||||||
std::cout << " Level: " << mData.mNpdt12.mLevel << std::endl;
|
std::cout << " Level: " << mData.mNpdt.mLevel << std::endl;
|
||||||
std::cout << " Reputation: " << (int)mData.mNpdt12.mReputation << std::endl;
|
std::cout << " Reputation: " << (int)mData.mNpdt.mReputation << std::endl;
|
||||||
std::cout << " Disposition: " << (int)mData.mNpdt12.mDisposition << std::endl;
|
std::cout << " Disposition: " << (int)mData.mNpdt.mDisposition << std::endl;
|
||||||
std::cout << " Rank: " << (int)mData.mNpdt12.mRank << std::endl;
|
std::cout << " Rank: " << (int)mData.mNpdt.mRank << std::endl;
|
||||||
std::cout << " Unknown1: "
|
//Why do we want to print these fields? They are padding in the struct and contain
|
||||||
<< (unsigned int)((unsigned char)mData.mNpdt12.mUnknown1) << std::endl;
|
// nothing of real value. Now we don't deal with NPDTstruct12 in runtime either...
|
||||||
std::cout << " Unknown2: "
|
//std::cout << " Unknown1: "
|
||||||
<< (unsigned int)((unsigned char)mData.mNpdt12.mUnknown2) << std::endl;
|
// << (unsigned int)((unsigned char)mData.mNpdt12.mUnknown1) << std::endl;
|
||||||
std::cout << " Unknown3: "
|
//std::cout << " Unknown2: "
|
||||||
<< (unsigned int)((unsigned char)mData.mNpdt12.mUnknown3) << std::endl;
|
// << (unsigned int)((unsigned char)mData.mNpdt12.mUnknown2) << std::endl;
|
||||||
std::cout << " Gold: " << mData.mNpdt12.mGold << std::endl;
|
//std::cout << " Unknown3: "
|
||||||
|
// << (unsigned int)((unsigned char)mData.mNpdt12.mUnknown3) << std::endl;
|
||||||
|
std::cout << " Gold: " << mData.mNpdt.mGold << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::cout << " Level: " << mData.mNpdt52.mLevel << std::endl;
|
std::cout << " Level: " << mData.mNpdt.mLevel << std::endl;
|
||||||
std::cout << " Reputation: " << (int)mData.mNpdt52.mReputation << std::endl;
|
std::cout << " Reputation: " << (int)mData.mNpdt.mReputation << std::endl;
|
||||||
std::cout << " Disposition: " << (int)mData.mNpdt52.mDisposition << std::endl;
|
std::cout << " Disposition: " << (int)mData.mNpdt.mDisposition << std::endl;
|
||||||
std::cout << " Rank: " << (int)mData.mNpdt52.mRank << std::endl;
|
std::cout << " Rank: " << (int)mData.mNpdt.mRank << std::endl;
|
||||||
std::cout << " FactionID: " << (int)mData.mNpdt52.mFactionID << std::endl;
|
std::cout << " FactionID: " << (int)mData.mNpdt.mFactionID << std::endl;
|
||||||
|
|
||||||
std::cout << " Attributes:" << std::endl;
|
std::cout << " Attributes:" << std::endl;
|
||||||
std::cout << " Strength: " << (int)mData.mNpdt52.mStrength << std::endl;
|
std::cout << " Strength: " << (int)mData.mNpdt.mStrength << std::endl;
|
||||||
std::cout << " Intelligence: " << (int)mData.mNpdt52.mIntelligence << std::endl;
|
std::cout << " Intelligence: " << (int)mData.mNpdt.mIntelligence << std::endl;
|
||||||
std::cout << " Willpower: " << (int)mData.mNpdt52.mWillpower << std::endl;
|
std::cout << " Willpower: " << (int)mData.mNpdt.mWillpower << std::endl;
|
||||||
std::cout << " Agility: " << (int)mData.mNpdt52.mAgility << std::endl;
|
std::cout << " Agility: " << (int)mData.mNpdt.mAgility << std::endl;
|
||||||
std::cout << " Speed: " << (int)mData.mNpdt52.mSpeed << std::endl;
|
std::cout << " Speed: " << (int)mData.mNpdt.mSpeed << std::endl;
|
||||||
std::cout << " Endurance: " << (int)mData.mNpdt52.mEndurance << std::endl;
|
std::cout << " Endurance: " << (int)mData.mNpdt.mEndurance << std::endl;
|
||||||
std::cout << " Personality: " << (int)mData.mNpdt52.mPersonality << std::endl;
|
std::cout << " Personality: " << (int)mData.mNpdt.mPersonality << std::endl;
|
||||||
std::cout << " Luck: " << (int)mData.mNpdt52.mLuck << std::endl;
|
std::cout << " Luck: " << (int)mData.mNpdt.mLuck << std::endl;
|
||||||
|
|
||||||
std::cout << " Skills:" << std::endl;
|
std::cout << " Skills:" << std::endl;
|
||||||
for (int i = 0; i != ESM::Skill::Length; i++)
|
for (int i = 0; i != ESM::Skill::Length; i++)
|
||||||
std::cout << " " << skillLabel(i) << ": "
|
std::cout << " " << skillLabel(i) << ": "
|
||||||
<< (int)(mData.mNpdt52.mSkills[i]) << std::endl;
|
<< (int)(mData.mNpdt.mSkills[i]) << std::endl;
|
||||||
|
|
||||||
std::cout << " Health: " << mData.mNpdt52.mHealth << std::endl;
|
std::cout << " Health: " << mData.mNpdt.mHealth << std::endl;
|
||||||
std::cout << " Magicka: " << mData.mNpdt52.mMana << std::endl;
|
std::cout << " Magicka: " << mData.mNpdt.mMana << std::endl;
|
||||||
std::cout << " Fatigue: " << mData.mNpdt52.mFatigue << std::endl;
|
std::cout << " Fatigue: " << mData.mNpdt.mFatigue << std::endl;
|
||||||
std::cout << " Unknown: " << (int)mData.mNpdt52.mUnknown << std::endl;
|
std::cout << " Unknown: " << (int)mData.mNpdt.mUnknown << std::endl;
|
||||||
std::cout << " Gold: " << mData.mNpdt52.mGold << std::endl;
|
std::cout << " Gold: " << mData.mNpdt.mGold << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<ESM::ContItem>::iterator cit;
|
std::vector<ESM::ContItem>::iterator cit;
|
||||||
|
|
|
@ -122,7 +122,7 @@ public:
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mContext->mPlayer.mObject.mCreatureStats.mLevel = npc.mNpdt52.mLevel;
|
mContext->mPlayer.mObject.mCreatureStats.mLevel = npc.mNpdt.mLevel;
|
||||||
mContext->mPlayerBase = npc;
|
mContext->mPlayerBase = npc;
|
||||||
ESM::SpellState::SpellParams empty;
|
ESM::SpellState::SpellParams empty;
|
||||||
// FIXME: player start spells and birthsign spells aren't listed here,
|
// FIXME: player start spells and birthsign spells aren't listed here,
|
||||||
|
|
|
@ -377,7 +377,7 @@ namespace ESSImport
|
||||||
profile.mPlayerClassName = context.mCustomPlayerClassName;
|
profile.mPlayerClassName = context.mCustomPlayerClassName;
|
||||||
else
|
else
|
||||||
profile.mPlayerClassId = context.mPlayerBase.mClass;
|
profile.mPlayerClassId = context.mPlayerBase.mClass;
|
||||||
profile.mPlayerLevel = context.mPlayerBase.mNpdt52.mLevel;
|
profile.mPlayerLevel = context.mPlayerBase.mNpdt.mLevel;
|
||||||
profile.mPlayerName = header.mGameData.mPlayerName.toString();
|
profile.mPlayerName = header.mGameData.mPlayerName.toString();
|
||||||
|
|
||||||
writeScreenshot(header, profile);
|
writeScreenshot(header, profile);
|
||||||
|
|
|
@ -619,12 +619,12 @@ void CSMTools::ReferenceableCheckStage::npcCheck (
|
||||||
const ESM::NPC& npc = (dynamic_cast<const CSMWorld::Record<ESM::NPC>& >(baseRecord)).get();
|
const ESM::NPC& npc = (dynamic_cast<const CSMWorld::Record<ESM::NPC>& >(baseRecord)).get();
|
||||||
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Npc, npc.mId);
|
CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Npc, npc.mId);
|
||||||
|
|
||||||
short level(npc.mNpdt52.mLevel);
|
short level(npc.mNpdt.mLevel);
|
||||||
char disposition(npc.mNpdt52.mDisposition);
|
char disposition(npc.mNpdt.mDisposition);
|
||||||
char reputation(npc.mNpdt52.mReputation);
|
char reputation(npc.mNpdt.mReputation);
|
||||||
char rank(npc.mNpdt52.mRank);
|
char rank(npc.mNpdt.mRank);
|
||||||
//Don't know what unknown is for
|
//Don't know what unknown is for
|
||||||
int gold(npc.mNpdt52.mGold);
|
int gold(npc.mNpdt.mGold);
|
||||||
|
|
||||||
//Detect if player is present
|
//Detect if player is present
|
||||||
if (Misc::StringUtils::ciEqual(npc.mId, "player")) //Happy now, scrawl?
|
if (Misc::StringUtils::ciEqual(npc.mId, "player")) //Happy now, scrawl?
|
||||||
|
@ -638,36 +638,36 @@ void CSMTools::ReferenceableCheckStage::npcCheck (
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
level = npc.mNpdt12.mLevel;
|
level = npc.mNpdt.mLevel;
|
||||||
disposition = npc.mNpdt12.mDisposition;
|
disposition = npc.mNpdt.mDisposition;
|
||||||
reputation = npc.mNpdt12.mReputation;
|
reputation = npc.mNpdt.mReputation;
|
||||||
rank = npc.mNpdt12.mRank;
|
rank = npc.mNpdt.mRank;
|
||||||
gold = npc.mNpdt12.mGold;
|
gold = npc.mNpdt.mGold;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (npc.mNpdt52.mAgility == 0)
|
if (npc.mNpdt.mAgility == 0)
|
||||||
messages.push_back (std::make_pair (id, npc.mId + " agility has zero value"));
|
messages.push_back (std::make_pair (id, npc.mId + " agility has zero value"));
|
||||||
|
|
||||||
if (npc.mNpdt52.mEndurance == 0)
|
if (npc.mNpdt.mEndurance == 0)
|
||||||
messages.push_back (std::make_pair (id, npc.mId + " endurance has zero value"));
|
messages.push_back (std::make_pair (id, npc.mId + " endurance has zero value"));
|
||||||
|
|
||||||
if (npc.mNpdt52.mIntelligence == 0)
|
if (npc.mNpdt.mIntelligence == 0)
|
||||||
messages.push_back (std::make_pair (id, npc.mId + " intelligence has zero value"));
|
messages.push_back (std::make_pair (id, npc.mId + " intelligence has zero value"));
|
||||||
|
|
||||||
if (npc.mNpdt52.mLuck == 0)
|
if (npc.mNpdt.mLuck == 0)
|
||||||
messages.push_back (std::make_pair (id, npc.mId + " luck has zero value"));
|
messages.push_back (std::make_pair (id, npc.mId + " luck has zero value"));
|
||||||
|
|
||||||
if (npc.mNpdt52.mPersonality == 0)
|
if (npc.mNpdt.mPersonality == 0)
|
||||||
messages.push_back (std::make_pair (id, npc.mId + " personality has zero value"));
|
messages.push_back (std::make_pair (id, npc.mId + " personality has zero value"));
|
||||||
|
|
||||||
if (npc.mNpdt52.mStrength == 0)
|
if (npc.mNpdt.mStrength == 0)
|
||||||
messages.push_back (std::make_pair (id, npc.mId + " strength has zero value"));
|
messages.push_back (std::make_pair (id, npc.mId + " strength has zero value"));
|
||||||
|
|
||||||
if (npc.mNpdt52.mSpeed == 0)
|
if (npc.mNpdt.mSpeed == 0)
|
||||||
messages.push_back (std::make_pair (id, npc.mId + " speed has zero value"));
|
messages.push_back (std::make_pair (id, npc.mId + " speed has zero value"));
|
||||||
|
|
||||||
if (npc.mNpdt52.mWillpower == 0)
|
if (npc.mNpdt.mWillpower == 0)
|
||||||
messages.push_back (std::make_pair (id, npc.mId + " willpower has zero value"));
|
messages.push_back (std::make_pair (id, npc.mId + " willpower has zero value"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -914,7 +914,7 @@ void CSMWorld::NpcAttributesRefIdAdapter::setNestedTable (const RefIdColumn* col
|
||||||
ESM::NPC npc = record.get();
|
ESM::NPC npc = record.get();
|
||||||
|
|
||||||
// store the whole struct
|
// store the whole struct
|
||||||
npc.mNpdt52 =
|
npc.mNpdt =
|
||||||
static_cast<const NestedTableWrapper<std::vector<ESM::NPC::NPDTstruct52> > &>(nestedTable).mNestedTable.at(0);
|
static_cast<const NestedTableWrapper<std::vector<ESM::NPC::NPDTstruct52> > &>(nestedTable).mNestedTable.at(0);
|
||||||
|
|
||||||
record.setModified (npc);
|
record.setModified (npc);
|
||||||
|
@ -928,7 +928,7 @@ CSMWorld::NestedTableWrapperBase* CSMWorld::NpcAttributesRefIdAdapter::nestedTab
|
||||||
|
|
||||||
// return the whole struct
|
// return the whole struct
|
||||||
std::vector<ESM::NPC::NPDTstruct52> wrap;
|
std::vector<ESM::NPC::NPDTstruct52> wrap;
|
||||||
wrap.push_back(record.get().mNpdt52);
|
wrap.push_back(record.get().mNpdt);
|
||||||
// deleted by dtor of NestedTableStoring
|
// deleted by dtor of NestedTableStoring
|
||||||
return new NestedTableWrapper<std::vector<ESM::NPC::NPDTstruct52> >(wrap);
|
return new NestedTableWrapper<std::vector<ESM::NPC::NPDTstruct52> >(wrap);
|
||||||
}
|
}
|
||||||
|
@ -939,7 +939,7 @@ QVariant CSMWorld::NpcAttributesRefIdAdapter::getNestedData (const RefIdColumn *
|
||||||
const Record<ESM::NPC>& record =
|
const Record<ESM::NPC>& record =
|
||||||
static_cast<const Record<ESM::NPC>&> (data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Npc)));
|
static_cast<const Record<ESM::NPC>&> (data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Npc)));
|
||||||
|
|
||||||
const ESM::NPC::NPDTstruct52& npcStruct = record.get().mNpdt52;
|
const ESM::NPC::NPDTstruct52& npcStruct = record.get().mNpdt;
|
||||||
|
|
||||||
if (subColIndex == 0)
|
if (subColIndex == 0)
|
||||||
return subRowIndex;
|
return subRowIndex;
|
||||||
|
@ -966,7 +966,7 @@ void CSMWorld::NpcAttributesRefIdAdapter::setNestedData (const RefIdColumn *colu
|
||||||
Record<ESM::NPC>& record =
|
Record<ESM::NPC>& record =
|
||||||
static_cast<Record<ESM::NPC>&> (data.getRecord (RefIdData::LocalIndex (row, UniversalId::Type_Npc)));
|
static_cast<Record<ESM::NPC>&> (data.getRecord (RefIdData::LocalIndex (row, UniversalId::Type_Npc)));
|
||||||
ESM::NPC npc = record.get();
|
ESM::NPC npc = record.get();
|
||||||
ESM::NPC::NPDTstruct52& npcStruct = npc.mNpdt52;
|
ESM::NPC::NPDTstruct52& npcStruct = npc.mNpdt;
|
||||||
|
|
||||||
if (subColIndex == 1)
|
if (subColIndex == 1)
|
||||||
switch(subRowIndex)
|
switch(subRowIndex)
|
||||||
|
@ -1021,7 +1021,7 @@ void CSMWorld::NpcSkillsRefIdAdapter::setNestedTable (const RefIdColumn* column,
|
||||||
ESM::NPC npc = record.get();
|
ESM::NPC npc = record.get();
|
||||||
|
|
||||||
// store the whole struct
|
// store the whole struct
|
||||||
npc.mNpdt52 =
|
npc.mNpdt =
|
||||||
static_cast<const NestedTableWrapper<std::vector<ESM::NPC::NPDTstruct52> > &>(nestedTable).mNestedTable.at(0);
|
static_cast<const NestedTableWrapper<std::vector<ESM::NPC::NPDTstruct52> > &>(nestedTable).mNestedTable.at(0);
|
||||||
|
|
||||||
record.setModified (npc);
|
record.setModified (npc);
|
||||||
|
@ -1035,7 +1035,7 @@ CSMWorld::NestedTableWrapperBase* CSMWorld::NpcSkillsRefIdAdapter::nestedTable (
|
||||||
|
|
||||||
// return the whole struct
|
// return the whole struct
|
||||||
std::vector<ESM::NPC::NPDTstruct52> wrap;
|
std::vector<ESM::NPC::NPDTstruct52> wrap;
|
||||||
wrap.push_back(record.get().mNpdt52);
|
wrap.push_back(record.get().mNpdt);
|
||||||
// deleted by dtor of NestedTableStoring
|
// deleted by dtor of NestedTableStoring
|
||||||
return new NestedTableWrapper<std::vector<ESM::NPC::NPDTstruct52> >(wrap);
|
return new NestedTableWrapper<std::vector<ESM::NPC::NPDTstruct52> >(wrap);
|
||||||
}
|
}
|
||||||
|
@ -1046,7 +1046,7 @@ QVariant CSMWorld::NpcSkillsRefIdAdapter::getNestedData (const RefIdColumn *colu
|
||||||
const Record<ESM::NPC>& record =
|
const Record<ESM::NPC>& record =
|
||||||
static_cast<const Record<ESM::NPC>&> (data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Npc)));
|
static_cast<const Record<ESM::NPC>&> (data.getRecord (RefIdData::LocalIndex (index, UniversalId::Type_Npc)));
|
||||||
|
|
||||||
const ESM::NPC::NPDTstruct52& npcStruct = record.get().mNpdt52;
|
const ESM::NPC::NPDTstruct52& npcStruct = record.get().mNpdt;
|
||||||
|
|
||||||
if (subRowIndex < 0 || subRowIndex >= ESM::Skill::Length)
|
if (subRowIndex < 0 || subRowIndex >= ESM::Skill::Length)
|
||||||
throw std::runtime_error ("index out of range");
|
throw std::runtime_error ("index out of range");
|
||||||
|
@ -1065,7 +1065,7 @@ void CSMWorld::NpcSkillsRefIdAdapter::setNestedData (const RefIdColumn *column,
|
||||||
Record<ESM::NPC>& record =
|
Record<ESM::NPC>& record =
|
||||||
static_cast<Record<ESM::NPC>&> (data.getRecord (RefIdData::LocalIndex (row, UniversalId::Type_Npc)));
|
static_cast<Record<ESM::NPC>&> (data.getRecord (RefIdData::LocalIndex (row, UniversalId::Type_Npc)));
|
||||||
ESM::NPC npc = record.get();
|
ESM::NPC npc = record.get();
|
||||||
ESM::NPC::NPDTstruct52& npcStruct = npc.mNpdt52;
|
ESM::NPC::NPDTstruct52& npcStruct = npc.mNpdt;
|
||||||
|
|
||||||
if (subRowIndex < 0 || subRowIndex >= ESM::Skill::Length)
|
if (subRowIndex < 0 || subRowIndex >= ESM::Skill::Length)
|
||||||
throw std::runtime_error ("index out of range");
|
throw std::runtime_error ("index out of range");
|
||||||
|
@ -1130,30 +1130,30 @@ QVariant CSMWorld::NpcMiscRefIdAdapter::getNestedData (const RefIdColumn *column
|
||||||
if (autoCalc)
|
if (autoCalc)
|
||||||
switch (subColIndex)
|
switch (subColIndex)
|
||||||
{
|
{
|
||||||
case 0: return static_cast<int>(record.get().mNpdt12.mLevel);
|
case 0: return static_cast<int>(record.get().mNpdt.mLevel);
|
||||||
case 1: return QVariant(QVariant::UserType);
|
case 1: return QVariant(QVariant::UserType);
|
||||||
case 2: return QVariant(QVariant::UserType);
|
case 2: return QVariant(QVariant::UserType);
|
||||||
case 3: return QVariant(QVariant::UserType);
|
case 3: return QVariant(QVariant::UserType);
|
||||||
case 4: return QVariant(QVariant::UserType);
|
case 4: return QVariant(QVariant::UserType);
|
||||||
case 5: return static_cast<int>(record.get().mNpdt12.mDisposition);
|
case 5: return static_cast<int>(record.get().mNpdt.mDisposition);
|
||||||
case 6: return static_cast<int>(record.get().mNpdt12.mReputation);
|
case 6: return static_cast<int>(record.get().mNpdt.mReputation);
|
||||||
case 7: return static_cast<int>(record.get().mNpdt12.mRank);
|
case 7: return static_cast<int>(record.get().mNpdt.mRank);
|
||||||
case 8: return record.get().mNpdt12.mGold;
|
case 8: return record.get().mNpdt.mGold;
|
||||||
case 9: return record.get().mPersistent == true;
|
case 9: return record.get().mPersistent == true;
|
||||||
default: return QVariant(); // throw an exception here?
|
default: return QVariant(); // throw an exception here?
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
switch (subColIndex)
|
switch (subColIndex)
|
||||||
{
|
{
|
||||||
case 0: return static_cast<int>(record.get().mNpdt52.mLevel);
|
case 0: return static_cast<int>(record.get().mNpdt.mLevel);
|
||||||
case 1: return static_cast<int>(record.get().mNpdt52.mFactionID);
|
case 1: return static_cast<int>(record.get().mNpdt.mFactionID);
|
||||||
case 2: return static_cast<int>(record.get().mNpdt52.mHealth);
|
case 2: return static_cast<int>(record.get().mNpdt.mHealth);
|
||||||
case 3: return static_cast<int>(record.get().mNpdt52.mMana);
|
case 3: return static_cast<int>(record.get().mNpdt.mMana);
|
||||||
case 4: return static_cast<int>(record.get().mNpdt52.mFatigue);
|
case 4: return static_cast<int>(record.get().mNpdt.mFatigue);
|
||||||
case 5: return static_cast<int>(record.get().mNpdt52.mDisposition);
|
case 5: return static_cast<int>(record.get().mNpdt.mDisposition);
|
||||||
case 6: return static_cast<int>(record.get().mNpdt52.mReputation);
|
case 6: return static_cast<int>(record.get().mNpdt.mReputation);
|
||||||
case 7: return static_cast<int>(record.get().mNpdt52.mRank);
|
case 7: return static_cast<int>(record.get().mNpdt.mRank);
|
||||||
case 8: return record.get().mNpdt52.mGold;
|
case 8: return record.get().mNpdt.mGold;
|
||||||
case 9: return record.get().mPersistent == true;
|
case 9: return record.get().mPersistent == true;
|
||||||
default: return QVariant(); // throw an exception here?
|
default: return QVariant(); // throw an exception here?
|
||||||
}
|
}
|
||||||
|
@ -1171,30 +1171,30 @@ void CSMWorld::NpcMiscRefIdAdapter::setNestedData (const RefIdColumn *column,
|
||||||
if (autoCalc)
|
if (autoCalc)
|
||||||
switch(subColIndex)
|
switch(subColIndex)
|
||||||
{
|
{
|
||||||
case 0: npc.mNpdt12.mLevel = static_cast<short>(value.toInt()); break;
|
case 0: npc.mNpdt.mLevel = static_cast<short>(value.toInt()); break;
|
||||||
case 1: return;
|
case 1: return;
|
||||||
case 2: return;
|
case 2: return;
|
||||||
case 3: return;
|
case 3: return;
|
||||||
case 4: return;
|
case 4: return;
|
||||||
case 5: npc.mNpdt12.mDisposition = static_cast<signed char>(value.toInt()); break;
|
case 5: npc.mNpdt.mDisposition = static_cast<signed char>(value.toInt()); break;
|
||||||
case 6: npc.mNpdt12.mReputation = static_cast<signed char>(value.toInt()); break;
|
case 6: npc.mNpdt.mReputation = static_cast<signed char>(value.toInt()); break;
|
||||||
case 7: npc.mNpdt12.mRank = static_cast<signed char>(value.toInt()); break;
|
case 7: npc.mNpdt.mRank = static_cast<signed char>(value.toInt()); break;
|
||||||
case 8: npc.mNpdt12.mGold = value.toInt(); break;
|
case 8: npc.mNpdt.mGold = value.toInt(); break;
|
||||||
case 9: npc.mPersistent = value.toBool(); break;
|
case 9: npc.mPersistent = value.toBool(); break;
|
||||||
default: return; // throw an exception here?
|
default: return; // throw an exception here?
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
switch(subColIndex)
|
switch(subColIndex)
|
||||||
{
|
{
|
||||||
case 0: npc.mNpdt52.mLevel = static_cast<short>(value.toInt()); break;
|
case 0: npc.mNpdt.mLevel = static_cast<short>(value.toInt()); break;
|
||||||
case 1: npc.mNpdt52.mFactionID = static_cast<char>(value.toInt()); break;
|
case 1: npc.mNpdt.mFactionID = static_cast<char>(value.toInt()); break;
|
||||||
case 2: npc.mNpdt52.mHealth = static_cast<unsigned short>(value.toInt()); break;
|
case 2: npc.mNpdt.mHealth = static_cast<unsigned short>(value.toInt()); break;
|
||||||
case 3: npc.mNpdt52.mMana = static_cast<unsigned short>(value.toInt()); break;
|
case 3: npc.mNpdt.mMana = static_cast<unsigned short>(value.toInt()); break;
|
||||||
case 4: npc.mNpdt52.mFatigue = static_cast<unsigned short>(value.toInt()); break;
|
case 4: npc.mNpdt.mFatigue = static_cast<unsigned short>(value.toInt()); break;
|
||||||
case 5: npc.mNpdt52.mDisposition = static_cast<signed char>(value.toInt()); break;
|
case 5: npc.mNpdt.mDisposition = static_cast<signed char>(value.toInt()); break;
|
||||||
case 6: npc.mNpdt52.mReputation = static_cast<signed char>(value.toInt()); break;
|
case 6: npc.mNpdt.mReputation = static_cast<signed char>(value.toInt()); break;
|
||||||
case 7: npc.mNpdt52.mRank = static_cast<signed char>(value.toInt()); break;
|
case 7: npc.mNpdt.mRank = static_cast<signed char>(value.toInt()); break;
|
||||||
case 8: npc.mNpdt52.mGold = value.toInt(); break;
|
case 8: npc.mNpdt.mGold = value.toInt(); break;
|
||||||
case 9: npc.mPersistent = value.toBool(); break;
|
case 9: npc.mPersistent = value.toBool(); break;
|
||||||
default: return; // throw an exception here?
|
default: return; // throw an exception here?
|
||||||
}
|
}
|
||||||
|
|
|
@ -312,40 +312,40 @@ namespace MWClass
|
||||||
int gold=0;
|
int gold=0;
|
||||||
if(ref->mBase->mNpdtType != ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS)
|
if(ref->mBase->mNpdtType != ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS)
|
||||||
{
|
{
|
||||||
gold = ref->mBase->mNpdt52.mGold;
|
gold = ref->mBase->mNpdt.mGold;
|
||||||
|
|
||||||
for (unsigned int i=0; i< ESM::Skill::Length; ++i)
|
for (unsigned int i=0; i< ESM::Skill::Length; ++i)
|
||||||
data->mNpcStats.getSkill (i).setBase (ref->mBase->mNpdt52.mSkills[i]);
|
data->mNpcStats.getSkill (i).setBase (ref->mBase->mNpdt.mSkills[i]);
|
||||||
|
|
||||||
data->mNpcStats.setAttribute(ESM::Attribute::Strength, ref->mBase->mNpdt52.mStrength);
|
data->mNpcStats.setAttribute(ESM::Attribute::Strength, ref->mBase->mNpdt.mStrength);
|
||||||
data->mNpcStats.setAttribute(ESM::Attribute::Intelligence, ref->mBase->mNpdt52.mIntelligence);
|
data->mNpcStats.setAttribute(ESM::Attribute::Intelligence, ref->mBase->mNpdt.mIntelligence);
|
||||||
data->mNpcStats.setAttribute(ESM::Attribute::Willpower, ref->mBase->mNpdt52.mWillpower);
|
data->mNpcStats.setAttribute(ESM::Attribute::Willpower, ref->mBase->mNpdt.mWillpower);
|
||||||
data->mNpcStats.setAttribute(ESM::Attribute::Agility, ref->mBase->mNpdt52.mAgility);
|
data->mNpcStats.setAttribute(ESM::Attribute::Agility, ref->mBase->mNpdt.mAgility);
|
||||||
data->mNpcStats.setAttribute(ESM::Attribute::Speed, ref->mBase->mNpdt52.mSpeed);
|
data->mNpcStats.setAttribute(ESM::Attribute::Speed, ref->mBase->mNpdt.mSpeed);
|
||||||
data->mNpcStats.setAttribute(ESM::Attribute::Endurance, ref->mBase->mNpdt52.mEndurance);
|
data->mNpcStats.setAttribute(ESM::Attribute::Endurance, ref->mBase->mNpdt.mEndurance);
|
||||||
data->mNpcStats.setAttribute(ESM::Attribute::Personality, ref->mBase->mNpdt52.mPersonality);
|
data->mNpcStats.setAttribute(ESM::Attribute::Personality, ref->mBase->mNpdt.mPersonality);
|
||||||
data->mNpcStats.setAttribute(ESM::Attribute::Luck, ref->mBase->mNpdt52.mLuck);
|
data->mNpcStats.setAttribute(ESM::Attribute::Luck, ref->mBase->mNpdt.mLuck);
|
||||||
|
|
||||||
data->mNpcStats.setHealth (ref->mBase->mNpdt52.mHealth);
|
data->mNpcStats.setHealth (ref->mBase->mNpdt.mHealth);
|
||||||
data->mNpcStats.setMagicka (ref->mBase->mNpdt52.mMana);
|
data->mNpcStats.setMagicka (ref->mBase->mNpdt.mMana);
|
||||||
data->mNpcStats.setFatigue (ref->mBase->mNpdt52.mFatigue);
|
data->mNpcStats.setFatigue (ref->mBase->mNpdt.mFatigue);
|
||||||
|
|
||||||
data->mNpcStats.setLevel(ref->mBase->mNpdt52.mLevel);
|
data->mNpcStats.setLevel(ref->mBase->mNpdt.mLevel);
|
||||||
data->mNpcStats.setBaseDisposition(ref->mBase->mNpdt52.mDisposition);
|
data->mNpcStats.setBaseDisposition(ref->mBase->mNpdt.mDisposition);
|
||||||
data->mNpcStats.setReputation(ref->mBase->mNpdt52.mReputation);
|
data->mNpcStats.setReputation(ref->mBase->mNpdt.mReputation);
|
||||||
|
|
||||||
data->mNpcStats.setNeedRecalcDynamicStats(false);
|
data->mNpcStats.setNeedRecalcDynamicStats(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gold = ref->mBase->mNpdt12.mGold;
|
gold = ref->mBase->mNpdt.mGold;
|
||||||
|
|
||||||
for (int i=0; i<3; ++i)
|
for (int i=0; i<3; ++i)
|
||||||
data->mNpcStats.setDynamic (i, 10);
|
data->mNpcStats.setDynamic (i, 10);
|
||||||
|
|
||||||
data->mNpcStats.setLevel(ref->mBase->mNpdt12.mLevel);
|
data->mNpcStats.setLevel(ref->mBase->mNpdt.mLevel);
|
||||||
data->mNpcStats.setBaseDisposition(ref->mBase->mNpdt12.mDisposition);
|
data->mNpcStats.setBaseDisposition(ref->mBase->mNpdt.mDisposition);
|
||||||
data->mNpcStats.setReputation(ref->mBase->mNpdt12.mReputation);
|
data->mNpcStats.setReputation(ref->mBase->mNpdt.mReputation);
|
||||||
|
|
||||||
autoCalculateAttributes(ref->mBase, data->mNpcStats);
|
autoCalculateAttributes(ref->mBase, data->mNpcStats);
|
||||||
autoCalculateSkills(ref->mBase, data->mNpcStats, ptr);
|
autoCalculateSkills(ref->mBase, data->mNpcStats, ptr);
|
||||||
|
@ -1327,10 +1327,7 @@ namespace MWClass
|
||||||
int Npc::getBaseGold(const MWWorld::ConstPtr& ptr) const
|
int Npc::getBaseGold(const MWWorld::ConstPtr& ptr) const
|
||||||
{
|
{
|
||||||
const MWWorld::LiveCellRef<ESM::NPC> *ref = ptr.get<ESM::NPC>();
|
const MWWorld::LiveCellRef<ESM::NPC> *ref = ptr.get<ESM::NPC>();
|
||||||
if(ref->mBase->mNpdtType != ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS)
|
return ref->mBase->mNpdt.mGold;
|
||||||
return ref->mBase->mNpdt52.mGold;
|
|
||||||
else
|
|
||||||
return ref->mBase->mNpdt12.mGold;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Npc::isClass(const MWWorld::ConstPtr& ptr, const std::string &className) const
|
bool Npc::isClass(const MWWorld::ConstPtr& ptr, const std::string &className) const
|
||||||
|
|
|
@ -79,21 +79,21 @@ namespace MWMechanics
|
||||||
const ESM::NPC *player = ptr.get<ESM::NPC>()->mBase;
|
const ESM::NPC *player = ptr.get<ESM::NPC>()->mBase;
|
||||||
|
|
||||||
// reset
|
// reset
|
||||||
creatureStats.setLevel(player->mNpdt52.mLevel);
|
creatureStats.setLevel(player->mNpdt.mLevel);
|
||||||
creatureStats.getSpells().clear();
|
creatureStats.getSpells().clear();
|
||||||
creatureStats.modifyMagicEffects(MagicEffects());
|
creatureStats.modifyMagicEffects(MagicEffects());
|
||||||
|
|
||||||
for (int i=0; i<27; ++i)
|
for (int i=0; i<27; ++i)
|
||||||
npcStats.getSkill (i).setBase (player->mNpdt52.mSkills[i]);
|
npcStats.getSkill (i).setBase (player->mNpdt.mSkills[i]);
|
||||||
|
|
||||||
creatureStats.setAttribute(ESM::Attribute::Strength, player->mNpdt52.mStrength);
|
creatureStats.setAttribute(ESM::Attribute::Strength, player->mNpdt.mStrength);
|
||||||
creatureStats.setAttribute(ESM::Attribute::Intelligence, player->mNpdt52.mIntelligence);
|
creatureStats.setAttribute(ESM::Attribute::Intelligence, player->mNpdt.mIntelligence);
|
||||||
creatureStats.setAttribute(ESM::Attribute::Willpower, player->mNpdt52.mWillpower);
|
creatureStats.setAttribute(ESM::Attribute::Willpower, player->mNpdt.mWillpower);
|
||||||
creatureStats.setAttribute(ESM::Attribute::Agility, player->mNpdt52.mAgility);
|
creatureStats.setAttribute(ESM::Attribute::Agility, player->mNpdt.mAgility);
|
||||||
creatureStats.setAttribute(ESM::Attribute::Speed, player->mNpdt52.mSpeed);
|
creatureStats.setAttribute(ESM::Attribute::Speed, player->mNpdt.mSpeed);
|
||||||
creatureStats.setAttribute(ESM::Attribute::Endurance, player->mNpdt52.mEndurance);
|
creatureStats.setAttribute(ESM::Attribute::Endurance, player->mNpdt.mEndurance);
|
||||||
creatureStats.setAttribute(ESM::Attribute::Personality, player->mNpdt52.mPersonality);
|
creatureStats.setAttribute(ESM::Attribute::Personality, player->mNpdt.mPersonality);
|
||||||
creatureStats.setAttribute(ESM::Attribute::Luck, player->mNpdt52.mLuck);
|
creatureStats.setAttribute(ESM::Attribute::Luck, player->mNpdt.mLuck);
|
||||||
const MWWorld::ESMStore &esmStore =
|
const MWWorld::ESMStore &esmStore =
|
||||||
MWBase::Environment::get().getWorld()->getStore();
|
MWBase::Environment::get().getWorld()->getStore();
|
||||||
|
|
||||||
|
|
|
@ -62,12 +62,23 @@ namespace ESM
|
||||||
if (esm.getSubSize() == 52)
|
if (esm.getSubSize() == 52)
|
||||||
{
|
{
|
||||||
mNpdtType = NPC_DEFAULT;
|
mNpdtType = NPC_DEFAULT;
|
||||||
esm.getExact(&mNpdt52, 52);
|
esm.getExact(&mNpdt, 52);
|
||||||
}
|
}
|
||||||
else if (esm.getSubSize() == 12)
|
else if (esm.getSubSize() == 12)
|
||||||
{
|
{
|
||||||
|
//Reading into temporary NPDTstruct12 object
|
||||||
|
NPDTstruct12 npdt12;
|
||||||
mNpdtType = NPC_WITH_AUTOCALCULATED_STATS;
|
mNpdtType = NPC_WITH_AUTOCALCULATED_STATS;
|
||||||
esm.getExact(&mNpdt12, 12);
|
esm.getExact(&npdt12, 12);
|
||||||
|
|
||||||
|
//Clearing the mNdpt struct to initialize all values
|
||||||
|
blankNpdt();
|
||||||
|
//Swiching to an internal representation
|
||||||
|
mNpdt.mLevel = npdt12.mLevel;
|
||||||
|
mNpdt.mDisposition = npdt12.mDisposition;
|
||||||
|
mNpdt.mReputation = npdt12.mReputation;
|
||||||
|
mNpdt.mRank = npdt12.mRank;
|
||||||
|
mNpdt.mGold = npdt12.mGold;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
esm.fail("NPC_NPDT must be 12 or 52 bytes long");
|
esm.fail("NPC_NPDT must be 12 or 52 bytes long");
|
||||||
|
@ -135,9 +146,19 @@ namespace ESM
|
||||||
esm.writeHNOCString("SCRI", mScript);
|
esm.writeHNOCString("SCRI", mScript);
|
||||||
|
|
||||||
if (mNpdtType == NPC_DEFAULT)
|
if (mNpdtType == NPC_DEFAULT)
|
||||||
esm.writeHNT("NPDT", mNpdt52, 52);
|
{
|
||||||
|
esm.writeHNT("NPDT", mNpdt, 52);
|
||||||
|
}
|
||||||
else if (mNpdtType == NPC_WITH_AUTOCALCULATED_STATS)
|
else if (mNpdtType == NPC_WITH_AUTOCALCULATED_STATS)
|
||||||
esm.writeHNT("NPDT", mNpdt12, 12);
|
{
|
||||||
|
NPDTstruct12 npdt12;
|
||||||
|
npdt12.mLevel = mNpdt.mLevel;
|
||||||
|
npdt12.mDisposition = mNpdt.mDisposition;
|
||||||
|
npdt12.mReputation = mNpdt.mReputation;
|
||||||
|
npdt12.mRank = mNpdt.mRank;
|
||||||
|
npdt12.mGold = mNpdt.mGold;
|
||||||
|
esm.writeHNT("NPDT", npdt12, 12);
|
||||||
|
}
|
||||||
|
|
||||||
esm.writeHNT("FLAG", mFlags);
|
esm.writeHNT("FLAG", mFlags);
|
||||||
|
|
||||||
|
@ -171,25 +192,7 @@ namespace ESM
|
||||||
void NPC::blank()
|
void NPC::blank()
|
||||||
{
|
{
|
||||||
mNpdtType = NPC_DEFAULT;
|
mNpdtType = NPC_DEFAULT;
|
||||||
mNpdt52.mLevel = 0;
|
blankNpdt();
|
||||||
mNpdt52.mStrength = mNpdt52.mIntelligence = mNpdt52.mWillpower = mNpdt52.mAgility =
|
|
||||||
mNpdt52.mSpeed = mNpdt52.mEndurance = mNpdt52.mPersonality = mNpdt52.mLuck = 0;
|
|
||||||
for (int i=0; i< Skill::Length; ++i) mNpdt52.mSkills[i] = 0;
|
|
||||||
mNpdt52.mReputation = 0;
|
|
||||||
mNpdt52.mHealth = mNpdt52.mMana = mNpdt52.mFatigue = 0;
|
|
||||||
mNpdt52.mDisposition = 0;
|
|
||||||
mNpdt52.mFactionID = 0;
|
|
||||||
mNpdt52.mRank = 0;
|
|
||||||
mNpdt52.mUnknown = 0;
|
|
||||||
mNpdt52.mGold = 0;
|
|
||||||
mNpdt12.mLevel = 0;
|
|
||||||
mNpdt12.mDisposition = 0;
|
|
||||||
mNpdt12.mReputation = 0;
|
|
||||||
mNpdt12.mRank = 0;
|
|
||||||
mNpdt12.mUnknown1 = 0;
|
|
||||||
mNpdt12.mUnknown2 = 0;
|
|
||||||
mNpdt12.mUnknown3 = 0;
|
|
||||||
mNpdt12.mGold = 0;
|
|
||||||
mFlags = 0;
|
mFlags = 0;
|
||||||
mInventory.mList.clear();
|
mInventory.mList.clear();
|
||||||
mSpells.mList.clear();
|
mSpells.mList.clear();
|
||||||
|
@ -207,14 +210,27 @@ namespace ESM
|
||||||
mHead.clear();
|
mHead.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NPC::blankNpdt()
|
||||||
|
{
|
||||||
|
mNpdt.mLevel = 0;
|
||||||
|
mNpdt.mStrength = mNpdt.mIntelligence = mNpdt.mWillpower = mNpdt.mAgility =
|
||||||
|
mNpdt.mSpeed = mNpdt.mEndurance = mNpdt.mPersonality = mNpdt.mLuck = 0;
|
||||||
|
for (int i=0; i< Skill::Length; ++i) mNpdt.mSkills[i] = 0;
|
||||||
|
mNpdt.mReputation = 0;
|
||||||
|
mNpdt.mHealth = mNpdt.mMana = mNpdt.mFatigue = 0;
|
||||||
|
mNpdt.mDisposition = 0;
|
||||||
|
mNpdt.mFactionID = 0;
|
||||||
|
mNpdt.mRank = 0;
|
||||||
|
mNpdt.mUnknown = 0;
|
||||||
|
mNpdt.mGold = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int NPC::getFactionRank() const
|
int NPC::getFactionRank() const
|
||||||
{
|
{
|
||||||
if (mFaction.empty())
|
if (mFaction.empty())
|
||||||
return -1;
|
return -1;
|
||||||
else if (mNpdtType == ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS)
|
else
|
||||||
return mNpdt12.mRank;
|
return mNpdt.mRank;
|
||||||
else // NPC_DEFAULT
|
|
||||||
return mNpdt52.mRank;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<Transport::Dest>& NPC::getTransport() const
|
const std::vector<Transport::Dest>& NPC::getTransport() const
|
||||||
|
|
|
@ -95,6 +95,8 @@ struct NPC
|
||||||
int mGold;
|
int mGold;
|
||||||
}; // 52 bytes
|
}; // 52 bytes
|
||||||
|
|
||||||
|
//Structure for autocalculated characters.
|
||||||
|
// This is only used for load and save operations.
|
||||||
struct NPDTstruct12
|
struct NPDTstruct12
|
||||||
{
|
{
|
||||||
short mLevel;
|
short mLevel;
|
||||||
|
@ -106,8 +108,9 @@ struct NPC
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
unsigned char mNpdtType;
|
unsigned char mNpdtType;
|
||||||
NPDTstruct52 mNpdt52;
|
//Worth noting when saving the struct:
|
||||||
NPDTstruct12 mNpdt12; //for autocalculated characters
|
// Although we might read a NPDTstruct12 in, we use NPDTstruct52 internally
|
||||||
|
NPDTstruct52 mNpdt;
|
||||||
|
|
||||||
int getFactionRank() const; /// wrapper for mNpdt*, -1 = no rank
|
int getFactionRank() const; /// wrapper for mNpdt*, -1 = no rank
|
||||||
|
|
||||||
|
@ -141,6 +144,9 @@ struct NPC
|
||||||
|
|
||||||
void blank();
|
void blank();
|
||||||
///< Set record to default state (does not touch the ID).
|
///< Set record to default state (does not touch the ID).
|
||||||
|
|
||||||
|
/// Resets the mNpdt object
|
||||||
|
void blankNpdt();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue