mirror of
https://github.com/OpenMW/openmw.git
synced 2025-04-18 17:06:45 +00:00
ESSImport: convert other references (non-creature/npc/container)
This commit is contained in:
parent
9014dc48ee
commit
40c29abe20
5 changed files with 95 additions and 57 deletions
|
@ -26,6 +26,17 @@ namespace
|
||||||
objstate.mPosition = cellref.mPos;
|
objstate.mPosition = cellref.mPos;
|
||||||
objstate.mRef.mRefNum = cellref.mRefNum;
|
objstate.mRef.mRefNum = cellref.mRefNum;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isIndexedRefId(const std::string& indexedRefId)
|
||||||
|
{
|
||||||
|
if (indexedRefId.size() <= 8)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
std::string index = indexedRefId.substr(indexedRefId.size()-8);
|
||||||
|
if(index.find_first_not_of("0123456789ABCDEF") == std::string::npos )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace ESSImport
|
namespace ESSImport
|
||||||
|
@ -191,65 +202,87 @@ namespace ESSImport
|
||||||
ESM::CellRef out;
|
ESM::CellRef out;
|
||||||
out.blank();
|
out.blank();
|
||||||
|
|
||||||
if (cellref.mIndexedRefId.size() < 8)
|
if (!isIndexedRefId(cellref.mIndexedRefId))
|
||||||
{
|
{
|
||||||
std::cerr << "CellRef with no index?" << std::endl;
|
// non-indexed RefNum, i.e. no CREC/NPCC/CNTC record associated with it
|
||||||
continue;
|
// this could be any type of object really (even creatures/npcs too)
|
||||||
}
|
out.mRefID = cellref.mIndexedRefId;
|
||||||
std::stringstream stream;
|
std::string idLower = Misc::StringUtils::lowerCase(out.mRefID);
|
||||||
stream << cellref.mIndexedRefId.substr(cellref.mIndexedRefId.size()-8,8);
|
|
||||||
int refIndex;
|
|
||||||
stream >> refIndex;
|
|
||||||
|
|
||||||
out.mRefID = cellref.mIndexedRefId.substr(0,cellref.mIndexedRefId.size()-8);
|
ESM::ObjectState objstate;
|
||||||
|
|
||||||
std::map<std::pair<int, std::string>, CREC>::const_iterator crecIt = mContext->mCreatureChanges.find(
|
|
||||||
std::make_pair(refIndex, out.mRefID));
|
|
||||||
if (crecIt != mContext->mCreatureChanges.end())
|
|
||||||
{
|
|
||||||
ESM::CreatureState objstate;
|
|
||||||
objstate.blank();
|
objstate.blank();
|
||||||
objstate.mRef = out;
|
objstate.mRef = out;
|
||||||
convertACDT(cellref.mActorData.mACDT, objstate.mCreatureStats);
|
objstate.mRef.mRefID = idLower;
|
||||||
convertCREC(crecIt->second, objstate);
|
objstate.mHasCustomState = false;
|
||||||
convertCellRef(cellref, objstate);
|
convertCellRef(cellref, objstate);
|
||||||
// FIXME: change save format to not require object type, instead look up it up using the RefId
|
esm.writeHNT ("OBJE", 0);
|
||||||
esm.writeHNT ("OBJE", ESM::REC_CREA);
|
|
||||||
objstate.save(esm);
|
objstate.save(esm);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
std::map<std::pair<int, std::string>, NPCC>::const_iterator npccIt = mContext->mNpcChanges.find(
|
|
||||||
std::make_pair(refIndex, out.mRefID));
|
|
||||||
if (npccIt != mContext->mNpcChanges.end())
|
|
||||||
{
|
{
|
||||||
ESM::NpcState objstate;
|
std::stringstream stream;
|
||||||
objstate.blank();
|
stream << std::hex << cellref.mIndexedRefId.substr(cellref.mIndexedRefId.size()-8,8);
|
||||||
objstate.mRef = out;
|
int refIndex;
|
||||||
convertACDT(cellref.mActorData.mACDT, objstate.mCreatureStats);
|
stream >> refIndex;
|
||||||
convertNpcData(cellref.mActorData, objstate.mNpcStats);
|
|
||||||
convertNPCC(npccIt->second, objstate);
|
|
||||||
convertCellRef(cellref, objstate);
|
|
||||||
esm.writeHNT ("OBJE", ESM::REC_NPC_);
|
|
||||||
objstate.save(esm);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::map<std::pair<int, std::string>, CNTC>::const_iterator cntcIt = mContext->mContainerChanges.find(
|
out.mRefID = cellref.mIndexedRefId.substr(0,cellref.mIndexedRefId.size()-8);
|
||||||
std::make_pair(refIndex, out.mRefID));
|
std::string idLower = Misc::StringUtils::lowerCase(out.mRefID);
|
||||||
if (cntcIt != mContext->mContainerChanges.end())
|
|
||||||
{
|
|
||||||
ESM::ContainerState objstate;
|
|
||||||
objstate.blank();
|
|
||||||
objstate.mRef = out;
|
|
||||||
convertCNTC(cntcIt->second, objstate);
|
|
||||||
convertCellRef(cellref, objstate);
|
|
||||||
esm.writeHNT ("OBJE", ESM::REC_CONT);
|
|
||||||
objstate.save(esm);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::cerr << "Can't find type for " << refIndex << " " << out.mRefID << std::endl;
|
std::map<std::pair<int, std::string>, NPCC>::const_iterator npccIt = mContext->mNpcChanges.find(
|
||||||
|
std::make_pair(refIndex, out.mRefID));
|
||||||
|
if (npccIt != mContext->mNpcChanges.end())
|
||||||
|
{
|
||||||
|
ESM::NpcState objstate;
|
||||||
|
objstate.blank();
|
||||||
|
objstate.mRef = out;
|
||||||
|
objstate.mRef.mRefID = idLower;
|
||||||
|
// probably need more micromanagement here so we don't overwrite values
|
||||||
|
// from the ESM with default values
|
||||||
|
convertACDT(cellref.mActorData.mACDT, objstate.mCreatureStats);
|
||||||
|
convertNpcData(cellref.mActorData, objstate.mNpcStats);
|
||||||
|
convertNPCC(npccIt->second, objstate);
|
||||||
|
convertCellRef(cellref, objstate);
|
||||||
|
esm.writeHNT ("OBJE", ESM::REC_NPC_);
|
||||||
|
objstate.save(esm);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<std::pair<int, std::string>, CNTC>::const_iterator cntcIt = mContext->mContainerChanges.find(
|
||||||
|
std::make_pair(refIndex, out.mRefID));
|
||||||
|
if (cntcIt != mContext->mContainerChanges.end())
|
||||||
|
{
|
||||||
|
ESM::ContainerState objstate;
|
||||||
|
objstate.blank();
|
||||||
|
objstate.mRef = out;
|
||||||
|
objstate.mRef.mRefID = idLower;
|
||||||
|
convertCNTC(cntcIt->second, objstate);
|
||||||
|
convertCellRef(cellref, objstate);
|
||||||
|
esm.writeHNT ("OBJE", ESM::REC_CONT);
|
||||||
|
objstate.save(esm);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<std::pair<int, std::string>, CREC>::const_iterator crecIt = mContext->mCreatureChanges.find(
|
||||||
|
std::make_pair(refIndex, out.mRefID));
|
||||||
|
if (crecIt != mContext->mCreatureChanges.end())
|
||||||
|
{
|
||||||
|
ESM::CreatureState objstate;
|
||||||
|
objstate.blank();
|
||||||
|
objstate.mRef = out;
|
||||||
|
objstate.mRef.mRefID = idLower;
|
||||||
|
convertACDT(cellref.mActorData.mACDT, objstate.mCreatureStats);
|
||||||
|
// probably need more micromanagement here so we don't overwrite values
|
||||||
|
// from the ESM with default values
|
||||||
|
convertCREC(crecIt->second, objstate);
|
||||||
|
convertCellRef(cellref, objstate);
|
||||||
|
esm.writeHNT ("OBJE", ESM::REC_CREA);
|
||||||
|
objstate.save(esm);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cerr << "Can't find type for " << cellref.mIndexedRefId << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
esm.endRecord(ESM::REC_CSTA);
|
esm.endRecord(ESM::REC_CSTA);
|
||||||
|
|
|
@ -167,8 +167,14 @@ public:
|
||||||
convertNPCC(npcc, mContext->mPlayer.mObject);
|
convertNPCC(npcc, mContext->mPlayer.mObject);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
mContext->mNpcChanges.insert(std::make_pair(std::make_pair(npcc.mIndex,id), npcc));
|
{
|
||||||
|
int index = mIndexCounter[id]++;
|
||||||
|
mContext->mNpcChanges.insert(std::make_pair(std::make_pair(index,id), npcc)).second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::map<std::string, int> mIndexCounter;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConvertREFR : public Converter
|
class ConvertREFR : public Converter
|
||||||
|
@ -230,7 +236,6 @@ public:
|
||||||
std::string id = esm.getHNString("NAME");
|
std::string id = esm.getHNString("NAME");
|
||||||
CREC crec;
|
CREC crec;
|
||||||
crec.load(esm);
|
crec.load(esm);
|
||||||
|
|
||||||
mContext->mCreatureChanges.insert(std::make_pair(std::make_pair(crec.mIndex,id), crec));
|
mContext->mCreatureChanges.insert(std::make_pair(std::make_pair(crec.mIndex,id), crec));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,8 +18,13 @@ namespace ESSImport
|
||||||
mIndexedRefId = esm.getHNString("NAME");
|
mIndexedRefId = esm.getHNString("NAME");
|
||||||
|
|
||||||
if (esm.isNextSub("LVCR"))
|
if (esm.isNextSub("LVCR"))
|
||||||
esm.skipHSub();
|
{
|
||||||
|
// occurs on leveled creature spawner references
|
||||||
|
// probably some identifier for the the creature that has been spawned?
|
||||||
|
unsigned char lvcr;
|
||||||
|
esm.getHT(lvcr);
|
||||||
|
//std::cout << "LVCR: " << (int)lvcr << std::endl;
|
||||||
|
}
|
||||||
mActorData.load(esm);
|
mActorData.load(esm);
|
||||||
|
|
||||||
mEnabled = true;
|
mEnabled = true;
|
||||||
|
|
|
@ -7,9 +7,6 @@ namespace ESSImport
|
||||||
|
|
||||||
void NPCC::load(ESM::ESMReader &esm)
|
void NPCC::load(ESM::ESMReader &esm)
|
||||||
{
|
{
|
||||||
mIndex = 0;
|
|
||||||
esm.getHNOT(mIndex, "INDX");
|
|
||||||
|
|
||||||
esm.getHNT(mNPDT, "NPDT");
|
esm.getHNT(mNPDT, "NPDT");
|
||||||
|
|
||||||
if (esm.isNextSub("AI_E"))
|
if (esm.isNextSub("AI_E"))
|
||||||
|
|
|
@ -26,8 +26,6 @@ namespace ESSImport
|
||||||
|
|
||||||
Inventory mInventory;
|
Inventory mInventory;
|
||||||
|
|
||||||
int mIndex;
|
|
||||||
|
|
||||||
void load(ESM::ESMReader &esm);
|
void load(ESM::ESMReader &esm);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue