forked from teamnwah/openmw-tes3coop
almost perfect byte copies, has redundant data
This commit is contained in:
parent
597b88e95a
commit
e69880f77e
13 changed files with 140 additions and 64 deletions
|
@ -714,6 +714,15 @@ int load(Arguments& info)
|
||||||
<< " Value: " << w.mData.mValue << endl;
|
<< " Value: " << w.mData.mValue << endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case REC_SSCR:
|
||||||
|
{
|
||||||
|
rec = new StartScript();
|
||||||
|
StartScript &sscr = *(StartScript *) rec;
|
||||||
|
sscr.load(esm);
|
||||||
|
if (quiet) break;
|
||||||
|
cout << "Start script: " << sscr.mScript << endl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
if (find(skipped.begin(), skipped.end(), n.val) == skipped.end())
|
if (find(skipped.begin(), skipped.end(), n.val) == skipped.end())
|
||||||
{
|
{
|
||||||
|
@ -832,16 +841,15 @@ int clone(Arguments& info)
|
||||||
esm.startRecord(n.toString(), rec->getFlags());
|
esm.startRecord(n.toString(), rec->getFlags());
|
||||||
string id = rec->getId();
|
string id = rec->getId();
|
||||||
|
|
||||||
|
// TODO wrap this with std::set
|
||||||
if (n.val == REC_GLOB || n.val == REC_CLAS || n.val == REC_FACT || n.val == REC_RACE || n.val == REC_SOUN
|
if (n.val == REC_GLOB || n.val == REC_CLAS || n.val == REC_FACT || n.val == REC_RACE || n.val == REC_SOUN
|
||||||
|| n.val == REC_REGN || n.val == REC_BSGN || n.val == REC_LTEX || n.val == REC_STAT || n.val == REC_DOOR
|
|| n.val == REC_REGN || n.val == REC_BSGN || n.val == REC_LTEX || n.val == REC_STAT || n.val == REC_DOOR
|
||||||
|| n.val == REC_MISC || n.val == REC_WEAP || n.val == REC_CONT || n.val == REC_SPEL || n.val == REC_CREA
|
|| n.val == REC_MISC || n.val == REC_WEAP || n.val == REC_CONT || n.val == REC_SPEL || n.val == REC_CREA
|
||||||
|| n.val == REC_BODY || n.val == REC_LIGH || n.val == REC_ENCH || n.val == REC_NPC_ || n.val == REC_ARMO
|
|| n.val == REC_BODY || n.val == REC_LIGH || n.val == REC_ENCH || n.val == REC_NPC_ || n.val == REC_ARMO
|
||||||
|| n.val == REC_CLOT || n.val == REC_REPA || n.val == REC_ACTI || n.val == REC_APPA || n.val == REC_LOCK
|
|| n.val == REC_CLOT || n.val == REC_REPA || n.val == REC_ACTI || n.val == REC_APPA || n.val == REC_LOCK
|
||||||
|| n.val == REC_PROB || n.val == REC_INGR || n.val == REC_BOOK || n.val == REC_ALCH || n.val == REC_LEVI
|
|| n.val == REC_PROB || n.val == REC_INGR || n.val == REC_BOOK || n.val == REC_ALCH || n.val == REC_LEVI
|
||||||
|| n.val == REC_LEVC)
|
|| n.val == REC_LEVC || n.val == REC_SNDG || n.val == REC_CELL || n.val == REC_DIAL)
|
||||||
esm.writeHNCString("NAME", id);
|
esm.writeHNCString("NAME", id);
|
||||||
else if (n.val == REC_CELL)
|
|
||||||
esm.writeHNString("NAME", id);
|
|
||||||
else
|
else
|
||||||
esm.writeHNOString("NAME", id);
|
esm.writeHNOString("NAME", id);
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,7 @@ void ESMWriter::save(std::ostream& file)
|
||||||
|
|
||||||
for (std::list<MasterData>::iterator it = m_masters.begin(); it != m_masters.end(); ++it)
|
for (std::list<MasterData>::iterator it = m_masters.begin(); it != m_masters.end(); ++it)
|
||||||
{
|
{
|
||||||
writeHNString("MAST", it->name);
|
writeHNCString("MAST", it->name);
|
||||||
writeHNT("DATA", it->size);
|
writeHNT("DATA", it->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,12 +18,12 @@ void CellRef::save(ESMWriter &esm)
|
||||||
esm.writeHNT("XSCL", mScale);
|
esm.writeHNT("XSCL", mScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
esm.writeHNOString("ANAM", mOwner);
|
esm.writeHNOCString("ANAM", mOwner);
|
||||||
esm.writeHNOString("BNAM", mGlob);
|
esm.writeHNOCString("BNAM", mGlob);
|
||||||
esm.writeHNOString("XSOL", mSoul);
|
esm.writeHNOCString("XSOL", mSoul);
|
||||||
|
|
||||||
esm.writeHNOString("CNAM", mFaction);
|
esm.writeHNOCString("CNAM", mFaction);
|
||||||
if (mFactIndex != -1) {
|
if (mFactIndex != -2) {
|
||||||
esm.writeHNT("INDX", mFactIndex);
|
esm.writeHNT("INDX", mFactIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ void CellRef::save(ESMWriter &esm)
|
||||||
esm.writeHNT("XCHG", mCharge);
|
esm.writeHNT("XCHG", mCharge);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mIntv != 0) {
|
if (mIntv != -1) {
|
||||||
esm.writeHNT("INTV", mIntv);
|
esm.writeHNT("INTV", mIntv);
|
||||||
}
|
}
|
||||||
if (mNam9 != 0) {
|
if (mNam9 != 0) {
|
||||||
|
@ -44,13 +44,13 @@ void CellRef::save(ESMWriter &esm)
|
||||||
esm.writeHNOCString("DNAM", mDestCell);
|
esm.writeHNOCString("DNAM", mDestCell);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mLockLevel != 0) {
|
if (mLockLevel != -1) {
|
||||||
esm.writeHNT("FLTV", mLockLevel);
|
esm.writeHNT("FLTV", mLockLevel);
|
||||||
}
|
}
|
||||||
esm.writeHNOString("KNAM", mKey);
|
esm.writeHNOCString("KNAM", mKey);
|
||||||
esm.writeHNOString("TNAM", mTrap);
|
esm.writeHNOCString("TNAM", mTrap);
|
||||||
|
|
||||||
if (mUnam != 0) {
|
if (mUnam != -1) {
|
||||||
esm.writeHNT("UNAM", mUnam);
|
esm.writeHNT("UNAM", mUnam);
|
||||||
}
|
}
|
||||||
if (mFltv != 0) {
|
if (mFltv != 0) {
|
||||||
|
@ -58,6 +58,9 @@ void CellRef::save(ESMWriter &esm)
|
||||||
}
|
}
|
||||||
|
|
||||||
esm.writeHNT("DATA", mPos, 24);
|
esm.writeHNT("DATA", mPos, 24);
|
||||||
|
if (mNam0 != 0) {
|
||||||
|
esm.writeHNT("NAM0", mNam0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Cell::load(ESMReader &esm)
|
void Cell::load(ESMReader &esm)
|
||||||
|
@ -71,7 +74,7 @@ void Cell::load(ESMReader &esm)
|
||||||
esm.getHNT(mData, "DATA", 12);
|
esm.getHNT(mData, "DATA", 12);
|
||||||
|
|
||||||
// Water level
|
// Water level
|
||||||
mWater = 0;
|
mWater = -1;
|
||||||
mNAM0 = 0;
|
mNAM0 = 0;
|
||||||
|
|
||||||
if (mData.mFlags & Interior)
|
if (mData.mFlags & Interior)
|
||||||
|
@ -82,6 +85,7 @@ void Cell::load(ESMReader &esm)
|
||||||
int waterl;
|
int waterl;
|
||||||
esm.getHT(waterl);
|
esm.getHT(waterl);
|
||||||
mWater = (float) waterl;
|
mWater = (float) waterl;
|
||||||
|
mWaterInt = true;
|
||||||
}
|
}
|
||||||
else if (esm.isNextSub("WHGT"))
|
else if (esm.isNextSub("WHGT"))
|
||||||
esm.getHT(mWater);
|
esm.getHT(mWater);
|
||||||
|
@ -114,11 +118,18 @@ void Cell::save(ESMWriter &esm)
|
||||||
esm.writeHNT("DATA", mData, 12);
|
esm.writeHNT("DATA", mData, 12);
|
||||||
if (mData.mFlags & Interior)
|
if (mData.mFlags & Interior)
|
||||||
{
|
{
|
||||||
if (mWater != 0)
|
if (mWater != -1) {
|
||||||
|
if (mWaterInt) {
|
||||||
|
int water =
|
||||||
|
(mWater >= 0) ? (int) (mWater + 0.5) : (int) (mWater - 0.5);
|
||||||
|
esm.writeHNT("INTV", water);
|
||||||
|
} else {
|
||||||
esm.writeHNT("WHGT", mWater);
|
esm.writeHNT("WHGT", mWater);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (mData.mFlags & QuasiEx)
|
if (mData.mFlags & QuasiEx)
|
||||||
esm.writeHNOString("RGNN", mRegion);
|
esm.writeHNOCString("RGNN", mRegion);
|
||||||
else
|
else
|
||||||
esm.writeHNT("AMBI", mAmbi, 16);
|
esm.writeHNT("AMBI", mAmbi, 16);
|
||||||
}
|
}
|
||||||
|
@ -157,15 +168,6 @@ bool Cell::getNextRef(ESMReader &esm, CellRef &ref)
|
||||||
if (!esm.hasMoreSubs())
|
if (!esm.hasMoreSubs())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Number of references in the cell? Maximum once in each cell,
|
|
||||||
// but not always at the beginning, and not always right. In other
|
|
||||||
// words, completely useless.
|
|
||||||
if (esm.isNextSub("NAM0"))
|
|
||||||
{
|
|
||||||
esm.skipHSubSize(4);
|
|
||||||
//esm.getHNOT(NAM0, "NAM0");
|
|
||||||
}
|
|
||||||
|
|
||||||
esm.getHNT(ref.mRefnum, "FRMR");
|
esm.getHNT(ref.mRefnum, "FRMR");
|
||||||
ref.mRefID = esm.getHNString("NAME");
|
ref.mRefID = esm.getHNString("NAME");
|
||||||
|
|
||||||
|
@ -179,13 +181,13 @@ bool Cell::getNextRef(ESMReader &esm, CellRef &ref)
|
||||||
ref.mSoul = esm.getHNOString("XSOL");
|
ref.mSoul = esm.getHNOString("XSOL");
|
||||||
|
|
||||||
ref.mFaction = esm.getHNOString("CNAM");
|
ref.mFaction = esm.getHNOString("CNAM");
|
||||||
ref.mFactIndex = -1;
|
ref.mFactIndex = -2;
|
||||||
esm.getHNOT(ref.mFactIndex, "INDX");
|
esm.getHNOT(ref.mFactIndex, "INDX");
|
||||||
|
|
||||||
ref.mCharge = -1.0;
|
ref.mCharge = -1.0;
|
||||||
esm.getHNOT(ref.mCharge, "XCHG");
|
esm.getHNOT(ref.mCharge, "XCHG");
|
||||||
|
|
||||||
ref.mIntv = 0;
|
ref.mIntv = -1;
|
||||||
ref.mNam9 = 0;
|
ref.mNam9 = 0;
|
||||||
esm.getHNOT(ref.mIntv, "INTV");
|
esm.getHNOT(ref.mIntv, "INTV");
|
||||||
esm.getHNOT(ref.mNam9, "NAM9");
|
esm.getHNOT(ref.mNam9, "NAM9");
|
||||||
|
@ -201,18 +203,28 @@ bool Cell::getNextRef(ESMReader &esm, CellRef &ref)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Integer, despite the name suggesting otherwise
|
// Integer, despite the name suggesting otherwise
|
||||||
ref.mLockLevel = 0;
|
ref.mLockLevel = -1;
|
||||||
esm.getHNOT(ref.mLockLevel, "FLTV");
|
esm.getHNOT(ref.mLockLevel, "FLTV");
|
||||||
ref.mKey = esm.getHNOString("KNAM");
|
ref.mKey = esm.getHNOString("KNAM");
|
||||||
ref.mTrap = esm.getHNOString("TNAM");
|
ref.mTrap = esm.getHNOString("TNAM");
|
||||||
|
|
||||||
ref.mUnam = 0;
|
ref.mUnam = -1;
|
||||||
ref.mFltv = 0;
|
ref.mFltv = 0;
|
||||||
esm.getHNOT(ref.mUnam, "UNAM");
|
esm.getHNOT(ref.mUnam, "UNAM");
|
||||||
esm.getHNOT(ref.mFltv, "FLTV");
|
esm.getHNOT(ref.mFltv, "FLTV");
|
||||||
|
|
||||||
esm.getHNT(ref.mPos, "DATA", 24);
|
esm.getHNT(ref.mPos, "DATA", 24);
|
||||||
|
|
||||||
|
// Number of references in the cell? Maximum once in each cell,
|
||||||
|
// but not always at the beginning, and not always right. In other
|
||||||
|
// words, completely useless.
|
||||||
|
ref.mNam0 = 0;
|
||||||
|
if (esm.isNextSub("NAM0"))
|
||||||
|
{
|
||||||
|
esm.getHT(ref.mNam0);
|
||||||
|
//esm.getHNOT(NAM0, "NAM0");
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,7 @@ public:
|
||||||
// Brindisi Dorom", where it has the value 100. Also only for
|
// Brindisi Dorom", where it has the value 100. Also only for
|
||||||
// activators.
|
// activators.
|
||||||
int mFltv;
|
int mFltv;
|
||||||
|
int mNam0;
|
||||||
|
|
||||||
// Position and rotation of this object within the cell
|
// Position and rotation of this object within the cell
|
||||||
Position mPos;
|
Position mPos;
|
||||||
|
@ -120,6 +121,7 @@ struct Cell : public Record
|
||||||
DATAstruct mData;
|
DATAstruct mData;
|
||||||
AMBIstruct mAmbi;
|
AMBIstruct mAmbi;
|
||||||
float mWater; // Water level
|
float mWater; // Water level
|
||||||
|
bool mWaterInt;
|
||||||
int mMapColor;
|
int mMapColor;
|
||||||
int mNAM0;
|
int mNAM0;
|
||||||
|
|
||||||
|
|
|
@ -136,17 +136,17 @@ void DialInfo::load(ESMReader &esm)
|
||||||
|
|
||||||
void DialInfo::save(ESMWriter &esm)
|
void DialInfo::save(ESMWriter &esm)
|
||||||
{
|
{
|
||||||
esm.writeHNString("INAM", mSelfId);
|
esm.writeHNCString("INAM", mSelfId);
|
||||||
esm.writeHNString("PNAM", mPrev);
|
esm.writeHNCString("PNAM", mPrev);
|
||||||
esm.writeHNString("NNAM", mNext);
|
esm.writeHNCString("NNAM", mNext);
|
||||||
esm.writeHNT("DATA", mData, 12);
|
esm.writeHNT("DATA", mData, 12);
|
||||||
esm.writeHNOString("ONAM", mActor);
|
esm.writeHNOCString("ONAM", mActor);
|
||||||
esm.writeHNOString("RNAM", mRace);
|
esm.writeHNOCString("RNAM", mRace);
|
||||||
esm.writeHNOString("CNAM", mClass);
|
esm.writeHNOCString("CNAM", mClass);
|
||||||
esm.writeHNOString("FNAM", mNpcFaction);
|
esm.writeHNOCString("FNAM", mNpcFaction);
|
||||||
esm.writeHNOString("ANAM", mCell);
|
esm.writeHNOCString("ANAM", mCell);
|
||||||
esm.writeHNOString("DNAM", mPcFaction);
|
esm.writeHNOCString("DNAM", mPcFaction);
|
||||||
esm.writeHNOString("SNAM", mSound);
|
esm.writeHNOCString("SNAM", mSound);
|
||||||
esm.writeHNOString("NAME", mResponse);
|
esm.writeHNOString("NAME", mResponse);
|
||||||
|
|
||||||
for (std::vector<SelectStruct>::iterator it = mSelects.begin(); it != mSelects.end(); ++it)
|
for (std::vector<SelectStruct>::iterator it = mSelects.begin(); it != mSelects.end(); ++it)
|
||||||
|
|
|
@ -13,7 +13,7 @@ void Ingredient::load(ESMReader &esm)
|
||||||
esm.getHNT(mData, "IRDT", 56);
|
esm.getHNT(mData, "IRDT", 56);
|
||||||
mScript = esm.getHNOString("SCRI");
|
mScript = esm.getHNOString("SCRI");
|
||||||
mIcon = esm.getHNOString("ITEX");
|
mIcon = esm.getHNOString("ITEX");
|
||||||
|
/*
|
||||||
// horrible hack to fix broken data in records
|
// horrible hack to fix broken data in records
|
||||||
for (int i=0; i<4; ++i)
|
for (int i=0; i<4; ++i)
|
||||||
{
|
{
|
||||||
|
@ -36,6 +36,7 @@ void Ingredient::load(ESMReader &esm)
|
||||||
mData.mSkills[i] = -1;
|
mData.mSkills[i] = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void Ingredient::save(ESMWriter &esm)
|
void Ingredient::save(ESMWriter &esm)
|
||||||
|
|
|
@ -10,18 +10,61 @@ void Land::LandData::save(ESMWriter &esm)
|
||||||
{
|
{
|
||||||
// TODO: Make this actually work.
|
// TODO: Make this actually work.
|
||||||
|
|
||||||
|
if (mDataTypes & Land::DATA_VNML) {
|
||||||
esm.writeHNT("VNML", mNormals, sizeof(VNML));
|
esm.writeHNT("VNML", mNormals, sizeof(VNML));
|
||||||
esm.writeHNT("VHGT", mHeights, sizeof(VHGT));
|
}
|
||||||
|
|
||||||
|
if (mDataTypes & Land::DATA_VHGT) {
|
||||||
|
VHGT offsets;
|
||||||
|
offsets.mHeightOffset = mHeights[0] / HEIGHT_SCALE;
|
||||||
|
offsets.mUnknown1 = mUnk1;
|
||||||
|
offsets.mUnknown2 = mUnk2;
|
||||||
|
|
||||||
|
float prevY = mHeights[0], prevX;
|
||||||
|
int number = 0; // avoid multiplication
|
||||||
|
for (int i = 0; i < LAND_SIZE; ++i) {
|
||||||
|
float diff = (mHeights[number] - prevY) / HEIGHT_SCALE;
|
||||||
|
offsets.mHeightData[number] =
|
||||||
|
(diff >= 0) ? (int8_t) (diff + 0.5) : (int8_t) (diff - 0.5);
|
||||||
|
|
||||||
|
prevX = prevY = mHeights[number];
|
||||||
|
++number;
|
||||||
|
|
||||||
|
for (int j = 1; j < LAND_SIZE; ++j) {
|
||||||
|
diff = (mHeights[number] - prevX) / HEIGHT_SCALE;
|
||||||
|
offsets.mHeightData[number] =
|
||||||
|
(diff >= 0) ? (int8_t) (diff + 0.5) : (int8_t) (diff - 0.5);
|
||||||
|
|
||||||
|
prevX = mHeights[number];
|
||||||
|
++number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
esm.writeHNT("VHGT", offsets, sizeof(VHGT));
|
||||||
|
}
|
||||||
//esm.writeHNT("WNAM", 0, 81);
|
//esm.writeHNT("WNAM", 0, 81);
|
||||||
esm.startSubRecord("WNAM");
|
/* esm.startSubRecord("WNAM");
|
||||||
for (int i = 0; i < 81; i++)
|
for (int i = 0; i < 81; i++)
|
||||||
esm.writeT((char)0x80, 1);
|
esm.writeT((char)0x80, 1);
|
||||||
esm.endRecord("WNAM");
|
esm.endRecord("WNAM");
|
||||||
|
*/
|
||||||
|
if (mDataTypes & Land::DATA_WNAM) {
|
||||||
|
esm.writeHNT("WNAM", mWnam, 81);
|
||||||
|
}
|
||||||
|
|
||||||
if (mDataTypes & Land::DATA_VCLR)
|
if (mDataTypes & Land::DATA_VCLR)
|
||||||
esm.writeHNT("VCLR", mColours, 3*LAND_NUM_VERTS);
|
esm.writeHNT("VCLR", mColours, 3*LAND_NUM_VERTS);
|
||||||
if (mDataTypes & Land::DATA_VTEX)
|
if (mDataTypes & Land::DATA_VTEX) {
|
||||||
esm.writeHNT("VTEX", mTextures, 512);
|
uint16_t vtex[256];
|
||||||
|
|
||||||
|
int readPos = 0; //bit ugly, but it works
|
||||||
|
for ( int y1 = 0; y1 < 4; y1++ )
|
||||||
|
for ( int x1 = 0; x1 < 4; x1++ )
|
||||||
|
for ( int y2 = 0; y2 < 4; y2++)
|
||||||
|
for ( int x2 = 0; x2 < 4; x2++ )
|
||||||
|
vtex[(y1*4+y2)*16+(x1*4+x2)] = mTextures[readPos++];
|
||||||
|
|
||||||
|
esm.writeHNT("VTEX", vtex, 512);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Land::Land()
|
Land::Land()
|
||||||
|
@ -87,7 +130,7 @@ void Land::load(ESMReader &esm)
|
||||||
|
|
||||||
// We need all three of VNML, VHGT and VTEX in order to use the
|
// We need all three of VNML, VHGT and VTEX in order to use the
|
||||||
// landscape. (Though Morrowind seems to accept terrain without VTEX/VCLR entries)
|
// landscape. (Though Morrowind seems to accept terrain without VTEX/VCLR entries)
|
||||||
mHasData = mDataTypes & (DATA_VNML|DATA_VHGT|DATA_WNAM);
|
mHasData = mDataTypes & (DATA_VNML|DATA_VHGT|DATA_WNAM|DATA_VTEX|DATA_VCLR);
|
||||||
|
|
||||||
mDataLoaded = false;
|
mDataLoaded = false;
|
||||||
mLandData = NULL;
|
mLandData = NULL;
|
||||||
|
@ -130,32 +173,38 @@ void Land::loadData()
|
||||||
|
|
||||||
memset(mLandData->mNormals, 0, LAND_NUM_VERTS * 3);
|
memset(mLandData->mNormals, 0, LAND_NUM_VERTS * 3);
|
||||||
|
|
||||||
//esm.getHNExact(landData->normals, sizeof(VNML), "VNML");
|
if (mEsm->isNextSub("VNML")) {
|
||||||
|
mEsm->getHExact(mLandData->mNormals, sizeof(VNML));
|
||||||
|
}/*
|
||||||
if (mEsm->isNextSub("VNML"))
|
if (mEsm->isNextSub("VNML"))
|
||||||
{
|
{
|
||||||
mEsm->skipHSubSize(12675);
|
mEsm->skipHSubSize(12675);
|
||||||
}
|
} */
|
||||||
|
|
||||||
|
if (mEsm->isNextSub("VHGT")) {
|
||||||
VHGT rawHeights;
|
VHGT rawHeights;
|
||||||
|
|
||||||
mEsm->getHNExact(&rawHeights, sizeof(VHGT), "VHGT");
|
mEsm->getHExact(&rawHeights, sizeof(VHGT));
|
||||||
int currentHeightOffset = rawHeights.mHeightOffset;
|
float currentHeightOffset = rawHeights.mHeightOffset;
|
||||||
for (int y = 0; y < LAND_SIZE; y++)
|
for (int y = 0; y < LAND_SIZE; y++)
|
||||||
{
|
{
|
||||||
currentHeightOffset += rawHeights.mHeightData[y * LAND_SIZE];
|
currentHeightOffset += rawHeights.mHeightData[y * LAND_SIZE];
|
||||||
mLandData->mHeights[y * LAND_SIZE] = currentHeightOffset * HEIGHT_SCALE;
|
mLandData->mHeights[y * LAND_SIZE] = currentHeightOffset * HEIGHT_SCALE;
|
||||||
|
|
||||||
int tempOffset = currentHeightOffset;
|
float tempOffset = currentHeightOffset;
|
||||||
for (int x = 1; x < LAND_SIZE; x++)
|
for (int x = 1; x < LAND_SIZE; x++)
|
||||||
{
|
{
|
||||||
tempOffset += rawHeights.mHeightData[y * LAND_SIZE + x];
|
tempOffset += rawHeights.mHeightData[y * LAND_SIZE + x];
|
||||||
mLandData->mHeights[x + y * LAND_SIZE] = tempOffset * HEIGHT_SCALE;
|
mLandData->mHeights[x + y * LAND_SIZE] = tempOffset * HEIGHT_SCALE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mLandData->mUnk1 = rawHeights.mUnknown1;
|
||||||
|
mLandData->mUnk2 = rawHeights.mUnknown2;
|
||||||
|
}
|
||||||
|
|
||||||
if (mEsm->isNextSub("WNAM"))
|
if (mEsm->isNextSub("WNAM"))
|
||||||
{
|
{
|
||||||
mEsm->skipHSubSize(81);
|
mEsm->getHExact(mLandData->mWnam, 81);
|
||||||
}
|
}
|
||||||
if (mEsm->isNextSub("VCLR"))
|
if (mEsm->isNextSub("VCLR"))
|
||||||
{
|
{
|
||||||
|
@ -167,7 +216,7 @@ void Land::loadData()
|
||||||
if (mEsm->isNextSub("VTEX"))
|
if (mEsm->isNextSub("VTEX"))
|
||||||
{
|
{
|
||||||
//TODO fix magic numbers
|
//TODO fix magic numbers
|
||||||
uint16_t vtex[512];
|
uint16_t vtex[256];
|
||||||
mEsm->getHExact(&vtex, 512);
|
mEsm->getHExact(&vtex, 512);
|
||||||
|
|
||||||
int readPos = 0; //bit ugly, but it works
|
int readPos = 0; //bit ugly, but it works
|
||||||
|
@ -181,7 +230,7 @@ void Land::loadData()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mLandData->mUsingColours = false;
|
mLandData->mUsingColours = false;
|
||||||
memset(&mLandData->mTextures, 0, 512 * sizeof(uint16_t));
|
memset(mLandData->mTextures, 0, sizeof(mLandData->mTextures));
|
||||||
for (int i = 0; i < LAND_NUM_VERTS; i++)
|
for (int i = 0; i < LAND_NUM_VERTS; i++)
|
||||||
{
|
{
|
||||||
mLandData->mHeights[i] = -256.0f * HEIGHT_SCALE;
|
mLandData->mHeights[i] = -256.0f * HEIGHT_SCALE;
|
||||||
|
|
|
@ -79,6 +79,10 @@ struct Land : public Record
|
||||||
char mColours[3 * LAND_NUM_VERTS];
|
char mColours[3 * LAND_NUM_VERTS];
|
||||||
int mDataTypes;
|
int mDataTypes;
|
||||||
|
|
||||||
|
uint8_t mWnam[81];
|
||||||
|
short mUnk1;
|
||||||
|
uint8_t mUnk2;
|
||||||
|
|
||||||
void save(ESMWriter &esm);
|
void save(ESMWriter &esm);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -36,10 +36,10 @@ void MagicEffect::load(ESMReader &esm)
|
||||||
esm.getHNT(mIndex, "INDX");
|
esm.getHNT(mIndex, "INDX");
|
||||||
|
|
||||||
esm.getHNT(mData, "MEDT", 36);
|
esm.getHNT(mData, "MEDT", 36);
|
||||||
|
/*
|
||||||
if (mIndex>=0 && mIndex<NumberOfHardcodedFlags)
|
if (mIndex>=0 && mIndex<NumberOfHardcodedFlags)
|
||||||
mData.mFlags |= HardcodedFlags[mIndex];
|
mData.mFlags |= HardcodedFlags[mIndex];
|
||||||
|
*/
|
||||||
mIcon = esm.getHNOString("ITEX");
|
mIcon = esm.getHNOString("ITEX");
|
||||||
mParticle = esm.getHNOString("PTEX");
|
mParticle = esm.getHNOString("PTEX");
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ void Pathgrid::load(ESMReader &esm)
|
||||||
void Pathgrid::save(ESMWriter &esm)
|
void Pathgrid::save(ESMWriter &esm)
|
||||||
{
|
{
|
||||||
esm.writeHNT("DATA", mData, 12);
|
esm.writeHNT("DATA", mData, 12);
|
||||||
esm.writeHNString("NAME", mCell);
|
esm.writeHNCString("NAME", mCell);
|
||||||
|
|
||||||
if (!mPoints.empty())
|
if (!mPoints.empty())
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,8 +16,8 @@ void SoundGenerator::load(ESMReader &esm)
|
||||||
void SoundGenerator::save(ESMWriter &esm)
|
void SoundGenerator::save(ESMWriter &esm)
|
||||||
{
|
{
|
||||||
esm.writeHNT("DATA", mType, 4);
|
esm.writeHNT("DATA", mType, 4);
|
||||||
esm.writeHNOString("CNAM", mCreature);
|
esm.writeHNOCString("CNAM", mCreature);
|
||||||
esm.writeHNOString("SNAM", mSound);
|
esm.writeHNOCString("SNAM", mSound);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,13 +8,12 @@ namespace ESM
|
||||||
|
|
||||||
void StartScript::load(ESMReader &esm)
|
void StartScript::load(ESMReader &esm)
|
||||||
{
|
{
|
||||||
esm.getSubNameIs("DATA");
|
mData = esm.getHNString("DATA");
|
||||||
esm.skipHSub();
|
|
||||||
mScript = esm.getHNString("NAME");
|
mScript = esm.getHNString("NAME");
|
||||||
}
|
}
|
||||||
void StartScript::save(ESMWriter &esm)
|
void StartScript::save(ESMWriter &esm)
|
||||||
{
|
{
|
||||||
esm.writeHNString("DATA", "NIET");
|
esm.writeHNString("DATA", mData);
|
||||||
esm.writeHNString("NAME", mScript);
|
esm.writeHNString("NAME", mScript);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ namespace ESM
|
||||||
|
|
||||||
struct StartScript : public Record
|
struct StartScript : public Record
|
||||||
{
|
{
|
||||||
|
std::string mData;
|
||||||
std::string mScript;
|
std::string mScript;
|
||||||
|
|
||||||
// Load a record and add it to the list
|
// Load a record and add it to the list
|
||||||
|
|
Loading…
Reference in a new issue