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