mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-04-28 21:07:59 +03:00
move most of the files from esm to esm3, keep common code in esm; this is make space for a future with esm4
esm typo esm typo
This commit is contained in:
parent
c263bbf0f6
commit
d1fb854521
448 changed files with 686 additions and 683 deletions
137
components/esm3/loadfact.cpp
Normal file
137
components/esm3/loadfact.cpp
Normal file
|
@ -0,0 +1,137 @@
|
|||
#include "loadfact.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
#include "esmreader.hpp"
|
||||
#include "esmwriter.hpp"
|
||||
#include "components/esm/defs.hpp"
|
||||
|
||||
namespace ESM
|
||||
{
|
||||
unsigned int Faction::sRecordId = REC_FACT;
|
||||
|
||||
int& Faction::FADTstruct::getSkill (int index, bool ignored)
|
||||
{
|
||||
if (index<0 || index>=7)
|
||||
throw std::logic_error ("skill index out of range");
|
||||
|
||||
return mSkills[index];
|
||||
}
|
||||
|
||||
int Faction::FADTstruct::getSkill (int index, bool ignored) const
|
||||
{
|
||||
if (index<0 || index>=7)
|
||||
throw std::logic_error ("skill index out of range");
|
||||
|
||||
return mSkills[index];
|
||||
}
|
||||
|
||||
void Faction::load(ESMReader &esm, bool &isDeleted)
|
||||
{
|
||||
isDeleted = false;
|
||||
mRecordFlags = esm.getRecordFlags();
|
||||
|
||||
mReactions.clear();
|
||||
for (int i=0;i<10;++i)
|
||||
mRanks[i].clear();
|
||||
|
||||
int rankCounter = 0;
|
||||
bool hasName = false;
|
||||
bool hasData = false;
|
||||
while (esm.hasMoreSubs())
|
||||
{
|
||||
esm.getSubName();
|
||||
switch (esm.retSubName().toInt())
|
||||
{
|
||||
case ESM::SREC_NAME:
|
||||
mId = esm.getHString();
|
||||
hasName = true;
|
||||
break;
|
||||
case ESM::FourCC<'F','N','A','M'>::value:
|
||||
mName = esm.getHString();
|
||||
break;
|
||||
case ESM::FourCC<'R','N','A','M'>::value:
|
||||
if (rankCounter >= 10)
|
||||
esm.fail("Rank out of range");
|
||||
mRanks[rankCounter++] = esm.getHString();
|
||||
break;
|
||||
case ESM::FourCC<'F','A','D','T'>::value:
|
||||
esm.getHT(mData, 240);
|
||||
if (mData.mIsHidden > 1)
|
||||
esm.fail("Unknown flag!");
|
||||
hasData = true;
|
||||
break;
|
||||
case ESM::FourCC<'A','N','A','M'>::value:
|
||||
{
|
||||
std::string faction = esm.getHString();
|
||||
int reaction;
|
||||
esm.getHNT(reaction, "INTV");
|
||||
mReactions[faction] = reaction;
|
||||
break;
|
||||
}
|
||||
case ESM::SREC_DELE:
|
||||
esm.skipHSub();
|
||||
isDeleted = true;
|
||||
break;
|
||||
default:
|
||||
esm.fail("Unknown subrecord");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!hasName)
|
||||
esm.fail("Missing NAME subrecord");
|
||||
if (!hasData && !isDeleted)
|
||||
esm.fail("Missing FADT subrecord");
|
||||
}
|
||||
|
||||
void Faction::save(ESMWriter &esm, bool isDeleted) const
|
||||
{
|
||||
esm.writeHNCString("NAME", mId);
|
||||
|
||||
if (isDeleted)
|
||||
{
|
||||
esm.writeHNString("DELE", "", 3);
|
||||
return;
|
||||
}
|
||||
|
||||
esm.writeHNOCString("FNAM", mName);
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
if (mRanks[i].empty())
|
||||
break;
|
||||
|
||||
esm.writeHNString("RNAM", mRanks[i], 32);
|
||||
}
|
||||
|
||||
esm.writeHNT("FADT", mData, 240);
|
||||
|
||||
for (std::map<std::string, int>::const_iterator it = mReactions.begin(); it != mReactions.end(); ++it)
|
||||
{
|
||||
esm.writeHNString("ANAM", it->first);
|
||||
esm.writeHNT("INTV", it->second);
|
||||
}
|
||||
}
|
||||
|
||||
void Faction::blank()
|
||||
{
|
||||
mName.clear();
|
||||
mData.mAttribute[0] = mData.mAttribute[1] = 0;
|
||||
mData.mIsHidden = 0;
|
||||
|
||||
for (int i=0; i<10; ++i)
|
||||
{
|
||||
mData.mRankData[i].mAttribute1 = mData.mRankData[i].mAttribute2 = 0;
|
||||
mData.mRankData[i].mPrimarySkill = mData.mRankData[i].mFavouredSkill = 0;
|
||||
mData.mRankData[i].mFactReaction = 0;
|
||||
|
||||
mRanks[i].clear();
|
||||
}
|
||||
|
||||
for (int i=0; i<7; ++i)
|
||||
mData.mSkills[i] = 0;
|
||||
|
||||
mReactions.clear();
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue