mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-05-08 11:38:19 +03:00
Can now save strings with proper encoding, byte-perfect clones up until land records
This commit is contained in:
parent
f16a9ce5ed
commit
a74aeace73
35 changed files with 570 additions and 134 deletions
|
@ -51,7 +51,7 @@ struct SpellList
|
|||
void save(ESMWriter &esm)
|
||||
{
|
||||
for (std::vector<std::string>::iterator it = list.begin(); it != list.end(); ++it)
|
||||
esm.writeHNString("NPCS", *it);
|
||||
esm.writeHNString("NPCS", *it, 32);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -83,6 +83,139 @@ struct ENAMstruct
|
|||
|
||||
// Struct size should be 24 bytes
|
||||
};
|
||||
|
||||
struct AIDTstruct
|
||||
{
|
||||
// These are probabilities
|
||||
char hello, u1, fight, flee, alarm, u2, u3, u4;
|
||||
// The last u's might be the skills that this NPC can train you
|
||||
// in?
|
||||
int services; // See the Services enum
|
||||
}; // 12 bytes
|
||||
|
||||
struct DODTstruct
|
||||
{
|
||||
float pos[3];
|
||||
float rot[3];
|
||||
};
|
||||
|
||||
struct AI_Package
|
||||
{
|
||||
void load(ESMReader& esm)
|
||||
{
|
||||
getData(esm);
|
||||
cndt = esm.getHNOString("CNDT");
|
||||
}
|
||||
|
||||
void save(ESMWriter& esm)
|
||||
{
|
||||
esm.startSubRecord(getName());
|
||||
saveData(esm);
|
||||
esm.endRecord(getName());
|
||||
|
||||
esm.writeHNOCString("CNDT", cndt);
|
||||
}
|
||||
|
||||
std::string cndt;
|
||||
|
||||
virtual void getData(ESMReader&) = 0;
|
||||
virtual void saveData(ESMWriter&) = 0;
|
||||
|
||||
virtual std::string getName() const = 0;
|
||||
virtual int size() const = 0;
|
||||
};
|
||||
|
||||
struct AI_Wstruct : AI_Package
|
||||
{
|
||||
struct Data
|
||||
{
|
||||
short distance, duration;
|
||||
char timeofday;
|
||||
char idle[8];
|
||||
char unknown;
|
||||
};
|
||||
|
||||
Data data;
|
||||
|
||||
void getData(ESMReader& esm) { esm.getHExact(&data, sizeof(data)); }
|
||||
void saveData(ESMWriter& esm) { esm.writeT(data); }
|
||||
|
||||
std::string getName() const { return "AI_W"; }
|
||||
int size() const { return sizeof(AI_Wstruct); }
|
||||
};
|
||||
|
||||
struct AI_Tstruct : AI_Package
|
||||
{
|
||||
struct Data
|
||||
{
|
||||
float pos[3];
|
||||
int unknown;
|
||||
};
|
||||
|
||||
Data data;
|
||||
|
||||
void getData(ESMReader& esm) { esm.getHExact(&data, sizeof(data)); }
|
||||
void saveData(ESMWriter& esm) { esm.writeT(data); }
|
||||
|
||||
std::string getName() const { return "AI_T"; }
|
||||
int size() const { return sizeof(AI_Tstruct); }
|
||||
};
|
||||
|
||||
struct AI_Fstruct : AI_Package
|
||||
{
|
||||
struct Data
|
||||
{
|
||||
float pos[3];
|
||||
short duration;
|
||||
NAME32 id;
|
||||
short unknown;
|
||||
};
|
||||
|
||||
Data data;
|
||||
|
||||
void getData(ESMReader& esm) { esm.getHExact(&data, sizeof(data)); }
|
||||
void saveData(ESMWriter& esm) { esm.writeT(data); }
|
||||
|
||||
std::string getName() const { return "AI_F"; }
|
||||
int size() const { return sizeof(AI_Fstruct); }
|
||||
};
|
||||
|
||||
struct AI_Estruct : AI_Package
|
||||
{
|
||||
struct Data
|
||||
{
|
||||
float pos[3];
|
||||
short duration;
|
||||
NAME32 id;
|
||||
short unknown;
|
||||
};
|
||||
|
||||
Data data;
|
||||
|
||||
void getData(ESMReader& esm) { esm.getHExact(&data, sizeof(data)); }
|
||||
void saveData(ESMWriter& esm) { esm.writeT(data); }
|
||||
|
||||
std::string getName() const { return "AI_E"; }
|
||||
int size() const { return sizeof(AI_Estruct); }
|
||||
};
|
||||
|
||||
struct AI_Astruct : AI_Package
|
||||
{
|
||||
struct Data
|
||||
{
|
||||
NAME32 name;
|
||||
char unknown;
|
||||
};
|
||||
|
||||
Data data;
|
||||
|
||||
void getData(ESMReader& esm) { esm.getHExact(&data, sizeof(data)); }
|
||||
void saveData(ESMWriter& esm) { esm.writeT(data); }
|
||||
|
||||
std::string getName() const { return "AI_A"; }
|
||||
int size() const { return sizeof(AI_Astruct); }
|
||||
};
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
struct EffectList
|
||||
|
@ -107,5 +240,86 @@ struct EffectList
|
|||
}
|
||||
};
|
||||
|
||||
struct AIData
|
||||
{
|
||||
struct Travelstruct
|
||||
{
|
||||
DODTstruct dodt;
|
||||
std::string dnam;
|
||||
};
|
||||
|
||||
AIDTstruct aidt;
|
||||
bool hasAI;
|
||||
std::vector<AI_Package*> packages;
|
||||
std::vector<Travelstruct> travel;
|
||||
|
||||
void load(ESMReader &esm)
|
||||
{
|
||||
if (esm.isNextSub("AIDT"))
|
||||
{
|
||||
esm.getHExact(&aidt, sizeof(aidt));
|
||||
hasAI = true;
|
||||
}
|
||||
else
|
||||
hasAI = false;
|
||||
|
||||
#define LOAD_IF_FOUND(x) \
|
||||
if (esm.isNextSub(#x)) \
|
||||
{ \
|
||||
found = true; \
|
||||
x##struct *t = new x##struct(); \
|
||||
t->load(esm); \
|
||||
packages.push_back(t); \
|
||||
}
|
||||
|
||||
bool found = true;
|
||||
while (esm.hasMoreSubs() && found)
|
||||
{
|
||||
found = false;
|
||||
|
||||
if (esm.isNextSub("DODT"))
|
||||
{
|
||||
found = true;
|
||||
Travelstruct t;
|
||||
esm.getHExact(&t.dodt, sizeof(t.dodt));
|
||||
t.dnam = esm.getHNOString("DNAM");
|
||||
travel.push_back(t);
|
||||
}
|
||||
|
||||
LOAD_IF_FOUND(AI_W);
|
||||
LOAD_IF_FOUND(AI_T);
|
||||
LOAD_IF_FOUND(AI_F);
|
||||
LOAD_IF_FOUND(AI_E);
|
||||
LOAD_IF_FOUND(AI_A);
|
||||
}
|
||||
}
|
||||
|
||||
void save(ESMWriter &esm)
|
||||
{
|
||||
if (hasAI)
|
||||
esm.writeHNT("AIDT", aidt);
|
||||
|
||||
for (std::vector<Travelstruct>::iterator it = travel.begin(); it != travel.end(); ++it)
|
||||
{
|
||||
esm.writeHNT("DODT", it->dodt);
|
||||
esm.writeHNOCString("DNAM", it->dnam);
|
||||
}
|
||||
|
||||
for (std::vector<AI_Package*>::iterator it = packages.begin(); it != packages.end(); ++it)
|
||||
{
|
||||
(*it)->save(esm);
|
||||
}
|
||||
}
|
||||
|
||||
~AIData()
|
||||
{
|
||||
for (std::vector<AI_Package*>::iterator it = packages.begin(); it != packages.end();)
|
||||
{
|
||||
delete *it;
|
||||
packages.erase(it++);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -136,7 +136,7 @@ void ESMWriter::writeHNString(const std::string& name, const std::string& data)
|
|||
endRecord(name);
|
||||
}
|
||||
|
||||
void ESMWriter::writeHNString(const std::string& name, const std::string& data, int size)
|
||||
void ESMWriter::writeHNString(const std::string& name, const std::string& data, int size)
|
||||
{
|
||||
assert(data.size() <= size);
|
||||
startSubRecord(name);
|
||||
|
@ -156,7 +156,23 @@ void ESMWriter::writeHString(const std::string& data)
|
|||
if (data.size() == 0)
|
||||
write("\0", 1);
|
||||
else
|
||||
write(data.c_str(), data.size());
|
||||
{
|
||||
char *ptr = ToUTF8::getBuffer(data.size()+1);
|
||||
strncpy(ptr, &data[0], data.size());
|
||||
ptr[data.size()] = '\0';
|
||||
|
||||
// Convert to UTF8 and return
|
||||
std::string ascii = ToUTF8::getASCII(m_encoding);
|
||||
|
||||
write(ascii.c_str(), ascii.size());
|
||||
}
|
||||
}
|
||||
|
||||
void ESMWriter::writeHCString(const std::string& data)
|
||||
{
|
||||
writeHString(data);
|
||||
if (data.size() > 0 && data[data.size()-1] != '\0')
|
||||
write("\0", 1);
|
||||
}
|
||||
|
||||
void ESMWriter::writeName(const std::string& name)
|
||||
|
@ -176,4 +192,21 @@ void ESMWriter::write(const char* data, int size)
|
|||
m_stream->write(data, size);
|
||||
}
|
||||
|
||||
void ESMWriter::setEncoding(const std::string& encoding)
|
||||
{
|
||||
if (encoding == "win1250")
|
||||
{
|
||||
m_encoding = ToUTF8::WINDOWS_1250;
|
||||
}
|
||||
else if (encoding == "win1251")
|
||||
{
|
||||
m_encoding = ToUTF8::WINDOWS_1251;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Default Latin encoding
|
||||
m_encoding = ToUTF8::WINDOWS_1252;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include <assert.h>
|
||||
|
||||
#include "esm_common.hpp"
|
||||
#include "../to_utf8/to_utf8.hpp"
|
||||
|
||||
namespace ESM {
|
||||
|
||||
|
@ -23,7 +24,7 @@ public:
|
|||
void setVersion(int ver);
|
||||
int getType();
|
||||
void setType(int type);
|
||||
// void setEncoding(const std::string& encoding); // Write strings as UTF-8?
|
||||
void setEncoding(const std::string& encoding); // Write strings as UTF-8?
|
||||
void setAuthor(const std::string& author);
|
||||
void setDescription(const std::string& desc);
|
||||
|
||||
|
@ -38,9 +39,7 @@ public:
|
|||
void writeHNCString(const std::string& name, const std::string& data)
|
||||
{
|
||||
startSubRecord(name);
|
||||
writeHString(data);
|
||||
if (data.size() > 0 && data[data.size()-1] != '\0')
|
||||
write("\0", 1);
|
||||
writeHCString(data);
|
||||
endRecord(name);
|
||||
}
|
||||
void writeHNOString(const std::string& name, const std::string& data)
|
||||
|
@ -48,6 +47,11 @@ public:
|
|||
if (!data.empty())
|
||||
writeHNString(name, data);
|
||||
}
|
||||
void writeHNOCString(const std::string& name, const std::string& data)
|
||||
{
|
||||
if (!data.empty())
|
||||
writeHNCString(name, data);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void writeHNT(const std::string& name, const T& data)
|
||||
|
@ -81,6 +85,7 @@ public:
|
|||
void startSubRecord(const std::string& name);
|
||||
void endRecord(const std::string& name);
|
||||
void writeHString(const std::string& data);
|
||||
void writeHCString(const std::string& data);
|
||||
void writeName(const std::string& data);
|
||||
void write(const char* data, int size);
|
||||
|
||||
|
@ -89,6 +94,7 @@ private:
|
|||
std::list<RecordData> m_records;
|
||||
std::ostream* m_stream;
|
||||
std::streampos m_headerPos;
|
||||
ToUTF8::FromType m_encoding;
|
||||
int m_recordCount;
|
||||
|
||||
HEDRstruct m_header;
|
||||
|
|
|
@ -10,8 +10,8 @@ void Activator::load(ESMReader &esm)
|
|||
}
|
||||
void Activator::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNString("FNAM", name);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNCString("FNAM", name);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,10 +13,10 @@ void Potion::load(ESMReader &esm)
|
|||
}
|
||||
void Potion::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNOString("TEXT", icon);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNOCString("TEXT", icon);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNT("ALDT", data, 12);
|
||||
effects.save(esm);
|
||||
}
|
||||
|
|
|
@ -12,10 +12,10 @@ void Apparatus::load(ESMReader &esm)
|
|||
}
|
||||
void Apparatus::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNCString("FNAM", name);
|
||||
esm.writeHNT("AADT", data, 16);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNString("ITEX", icon);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNCString("ITEX", icon);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,13 +38,13 @@ void Armor::load(ESMReader &esm)
|
|||
|
||||
void Armor::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNString("FNAM", name);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNCString("FNAM", name);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNT("AODT", data, 24);
|
||||
esm.writeHNOString("ITEX", icon);
|
||||
esm.writeHNOCString("ITEX", icon);
|
||||
parts.save(esm);
|
||||
esm.writeHNOString("ENAM", enchant);
|
||||
esm.writeHNOCString("ENAM", enchant);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -11,8 +11,8 @@ void BodyPart::load(ESMReader &esm)
|
|||
}
|
||||
void BodyPart::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNCString("FNAM", name);
|
||||
esm.writeHNT("BYDT", data, 4);
|
||||
}
|
||||
|
||||
|
|
|
@ -15,13 +15,13 @@ void Book::load(ESMReader &esm)
|
|||
}
|
||||
void Book::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNT("BKDT", data, 20);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOString("ITEX", icon);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNOCString("ITEX", icon);
|
||||
esm.writeHNOString("TEXT", text);
|
||||
esm.writeHNOString("ENAM", enchant);
|
||||
esm.writeHNOCString("ENAM", enchant);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,9 +13,9 @@ void BirthSign::load(ESMReader &esm)
|
|||
}
|
||||
void BirthSign::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("FNAM", name);
|
||||
esm.writeHNOString("TNAM", texture);
|
||||
esm.writeHNOString("DESC", description);
|
||||
esm.writeHNCString("FNAM", name);
|
||||
esm.writeHNOCString("TNAM", texture);
|
||||
esm.writeHNOCString("DESC", description);
|
||||
|
||||
powers.save(esm);
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ void Cell::save(ESMWriter &esm)
|
|||
}
|
||||
else
|
||||
{
|
||||
esm.writeHNOString("RGNN", region);
|
||||
esm.writeHNOCString("RGNN", region);
|
||||
if (mapColor != 0)
|
||||
esm.writeHNT("NAM5", mapColor);
|
||||
}
|
||||
|
|
|
@ -18,16 +18,16 @@ void Clothing::load(ESMReader &esm)
|
|||
}
|
||||
void Clothing::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNT("CTDT", data, 12);
|
||||
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOString("ITEX", icon);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNOCString("ITEX", icon);
|
||||
|
||||
parts.save(esm);
|
||||
|
||||
esm.writeHNOString("ENAM", enchant);
|
||||
esm.writeHNOCString("ENAM", enchant);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -40,12 +40,12 @@ void Container::load(ESMReader &esm)
|
|||
|
||||
void Container::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNT("CNDT", weight, 4);
|
||||
esm.writeHNT("FLAG", flags, 4);
|
||||
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
|
||||
inventory.save(esm);
|
||||
}
|
||||
|
|
|
@ -16,6 +16,8 @@ void Creature::load(ESMReader &esm)
|
|||
esm.getHNOT(scale, "XSCL");
|
||||
|
||||
inventory.load(esm);
|
||||
spells.load(esm);
|
||||
aiData.load(esm);
|
||||
|
||||
// More subrecords:
|
||||
|
||||
|
@ -37,15 +39,18 @@ void Creature::load(ESMReader &esm)
|
|||
|
||||
void Creature::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNOString("CNAM", original);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNOCString("CNAM", original);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNT("NPDT", data, 96);
|
||||
esm.writeHNT("FLAG", flags);
|
||||
if (scale != 1.0)
|
||||
esm.writeHNT("XSCL", scale);
|
||||
|
||||
inventory.save(esm);
|
||||
spells.save(esm);
|
||||
aiData.save(esm);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "esm_reader.hpp"
|
||||
#include "esm_writer.hpp"
|
||||
#include "loadcont.hpp"
|
||||
#include "defs.hpp"
|
||||
|
||||
namespace ESM
|
||||
{
|
||||
|
@ -54,6 +55,7 @@ struct Creature : public Record
|
|||
}; // 96 bytes
|
||||
|
||||
NPDTstruct data;
|
||||
AIData aiData;
|
||||
|
||||
int flags;
|
||||
float scale;
|
||||
|
@ -62,6 +64,7 @@ struct Creature : public Record
|
|||
|
||||
// Defined in loadcont.hpp
|
||||
InventoryList inventory;
|
||||
SpellList spells;
|
||||
|
||||
void load(ESMReader &esm);
|
||||
void save(ESMWriter &esm);
|
||||
|
|
|
@ -13,11 +13,11 @@ void Door::load(ESMReader &esm)
|
|||
}
|
||||
void Door::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOString("SNAM", openSound);
|
||||
esm.writeHNOString("ANAM", closeSound);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNOCString("SNAM", openSound);
|
||||
esm.writeHNOCString("ANAM", closeSound);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,11 +13,11 @@ void Ingredient::load(ESMReader &esm)
|
|||
}
|
||||
void Ingredient::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNCString("FNAM", name);
|
||||
esm.writeHNT("IRDT", data, 56);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOString("ITEX", script);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNOCString("ITEX", icon);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ void LeveledListBase::save(ESMWriter &esm)
|
|||
|
||||
for (std::vector<LevelItem>::iterator it = list.begin(); it != list.end(); ++it)
|
||||
{
|
||||
esm.writeHNString(recName, it->id);
|
||||
esm.writeHNCString(recName, it->id);
|
||||
esm.writeHNT("INTV", it->level);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,12 +15,12 @@ void Light::load(ESMReader &esm)
|
|||
}
|
||||
void Light::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNOString("ITEX", icon);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNOCString("ITEX", icon);
|
||||
esm.writeHNT("LHDT", data, 24);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOString("SNAM", sound);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNOCString("SNAM", sound);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -33,8 +33,8 @@ void Tool::load(ESMReader &esm)
|
|||
}
|
||||
void Tool::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNCString("FNAM", name);
|
||||
|
||||
std::string typeName;
|
||||
switch(type)
|
||||
|
@ -44,9 +44,17 @@ void Tool::save(ESMWriter &esm)
|
|||
case Type_Probe: typeName = "PBDT"; break;
|
||||
}
|
||||
|
||||
esm.writeHNT(typeName, data, 16);
|
||||
Data write = data;
|
||||
if (type == Type_Repair)
|
||||
{
|
||||
float tmp = *((float*) &write.uses);
|
||||
write.uses = *((int*) &write.quality);
|
||||
write.quality = tmp;
|
||||
}
|
||||
|
||||
esm.writeHNT(typeName, write, 16);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOString("ITEX", icon);
|
||||
esm.writeHNOCString("ITEX", icon);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ void LandTexture::load(ESMReader &esm)
|
|||
void LandTexture::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNT("INTV", index);
|
||||
esm.writeHNString("DATA", texture);
|
||||
esm.writeHNCString("DATA", texture);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -28,17 +28,17 @@ void MagicEffect::save(ESMWriter &esm)
|
|||
esm.writeHNT("INDX", index);
|
||||
esm.writeHNT("MEDT", data, 36);
|
||||
|
||||
esm.writeHNOString("ITEX", icon);
|
||||
esm.writeHNOString("PTEX", particle);
|
||||
esm.writeHNOString("BSND", boltSound);
|
||||
esm.writeHNOString("CSND", castSound);
|
||||
esm.writeHNOString("HSND", hitSound);
|
||||
esm.writeHNOString("ASND", areaSound);
|
||||
esm.writeHNOCString("ITEX", icon);
|
||||
esm.writeHNOCString("PTEX", particle);
|
||||
esm.writeHNOCString("BSND", boltSound);
|
||||
esm.writeHNOCString("CSND", castSound);
|
||||
esm.writeHNOCString("HSND", hitSound);
|
||||
esm.writeHNOCString("ASND", areaSound);
|
||||
|
||||
esm.writeHNOString("CVFX", casting);
|
||||
esm.writeHNOString("BVFX", bolt);
|
||||
esm.writeHNOString("HVFX", hit);
|
||||
esm.writeHNOString("AVFX", area);
|
||||
esm.writeHNOCString("CVFX", casting);
|
||||
esm.writeHNOCString("BVFX", bolt);
|
||||
esm.writeHNOCString("HVFX", hit);
|
||||
esm.writeHNOCString("AVFX", area);
|
||||
|
||||
esm.writeHNOString("DESC", description);
|
||||
}
|
||||
|
|
|
@ -13,11 +13,11 @@ void Miscellaneous::load(ESMReader &esm)
|
|||
}
|
||||
void Miscellaneous::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNT("MCDT", data, 12);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOString("ITEX", icon);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNOCString("ITEX", icon);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -37,27 +37,20 @@ void NPC::load(ESMReader &esm)
|
|||
|
||||
inventory.load(esm);
|
||||
spells.load(esm);
|
||||
|
||||
if (esm.isNextSub("AIDT"))
|
||||
{
|
||||
esm.getHExact(&AI, sizeof(AI));
|
||||
hasAI = true;
|
||||
}
|
||||
else
|
||||
hasAI = false;
|
||||
aiData.load(esm);
|
||||
|
||||
esm.skipRecord();
|
||||
}
|
||||
void NPC::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNOString("MODL", model);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNString("RNAM", race);
|
||||
esm.writeHNString("CNAM", cls);
|
||||
esm.writeHNString("ANAM", faction);
|
||||
esm.writeHNString("BNAM", head);
|
||||
esm.writeHNString("KNAM", hair);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOCString("MODL", model);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNCString("RNAM", race);
|
||||
esm.writeHNCString("CNAM", cls);
|
||||
esm.writeHNCString("ANAM", faction);
|
||||
esm.writeHNCString("BNAM", head);
|
||||
esm.writeHNCString("KNAM", hair);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
|
||||
if (npdtType == 52)
|
||||
esm.writeHNT("NPDT", npdt52, 52);
|
||||
|
@ -68,9 +61,7 @@ void NPC::save(ESMWriter &esm)
|
|||
|
||||
inventory.save(esm);
|
||||
spells.save(esm);
|
||||
|
||||
if (hasAI)
|
||||
esm.writeHNT("AIDT", AI);
|
||||
aiData.save(esm);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -74,15 +74,6 @@ struct NPC : public Record
|
|||
int gold; // ?? not certain
|
||||
}; // 12 bytes
|
||||
|
||||
struct AIDTstruct
|
||||
{
|
||||
// These are probabilities
|
||||
char hello, u1, fight, flee, alarm, u2, u3, u4;
|
||||
// The last u's might be the skills that this NPC can train you
|
||||
// in?
|
||||
int services; // See the Services enum
|
||||
}; // 12 bytes
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
char npdtType;
|
||||
|
@ -93,12 +84,10 @@ struct NPC : public Record
|
|||
|
||||
InventoryList inventory;
|
||||
SpellList spells;
|
||||
|
||||
AIDTstruct AI;
|
||||
bool hasAI;
|
||||
AIData aiData;
|
||||
|
||||
std::string name, model, race, cls, faction, script,
|
||||
hair, head; // body parts
|
||||
hair, head; // body parts
|
||||
|
||||
//std::string mId;
|
||||
|
||||
|
|
|
@ -27,14 +27,14 @@ void Region::load(ESMReader &esm)
|
|||
}
|
||||
void Region::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("FNAM", name);
|
||||
esm.writeHNCString("FNAM", name);
|
||||
|
||||
if (esm.getVersion() == VER_12)
|
||||
esm.writeHNT("WEAT", data, sizeof(data) - 2);
|
||||
else
|
||||
esm.writeHNT("WEAT", data);
|
||||
|
||||
esm.writeHNOString("BNAM", sleepList);
|
||||
esm.writeHNOCString("BNAM", sleepList);
|
||||
|
||||
esm.writeHNT("CNAM", mapColor);
|
||||
for (std::vector<SoundRef>::iterator it = soundList.begin(); it != soundList.end(); ++it)
|
||||
|
|
|
@ -42,21 +42,25 @@ void Script::save(ESMWriter &esm)
|
|||
{
|
||||
std::string varNameString;
|
||||
if (!varNames.empty())
|
||||
{
|
||||
for (std::vector<std::string>::iterator it = varNames.begin(); it != varNames.end(); ++it)
|
||||
{
|
||||
varNameString.append(*it);
|
||||
//varNameString.append("\0");
|
||||
}
|
||||
|
||||
data.stringTableSize = varNameString.size();
|
||||
}
|
||||
|
||||
esm.writeHNT("SCHD", data, 52);
|
||||
|
||||
esm.writeHNOString("SCVR", varNameString);
|
||||
if (!varNames.empty())
|
||||
{
|
||||
esm.startSubRecord("SCVR");
|
||||
for (std::vector<std::string>::iterator it = varNames.begin(); it != varNames.end(); ++it)
|
||||
{
|
||||
esm.writeHCString(*it);
|
||||
}
|
||||
esm.endRecord("SCVR");
|
||||
}
|
||||
|
||||
esm.startSubRecord("SCDT");
|
||||
esm.write(&scriptData[0], data.scriptDataSize);
|
||||
esm.endRecord("SCDT");
|
||||
|
||||
esm.writeHNString("SCDT", std::string(&scriptData[0], scriptData.size()));
|
||||
esm.writeHNOString("SCTX", scriptText);
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ void Sound::load(ESMReader &esm)
|
|||
}
|
||||
void Sound::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("FNAM", sound);
|
||||
esm.writeHNCString("FNAM", sound);
|
||||
esm.writeHNT("DATA", data, 3);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ void Spell::load(ESMReader &esm)
|
|||
}
|
||||
void Spell::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNT("SPDT", data, 12);
|
||||
effects.save(esm);
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ void Static::load(ESMReader &esm)
|
|||
}
|
||||
void Static::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNCString("MODL", model);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -14,12 +14,12 @@ void Weapon::load(ESMReader &esm)
|
|||
}
|
||||
void Weapon::save(ESMWriter &esm)
|
||||
{
|
||||
esm.writeHNString("MODL", model);
|
||||
esm.writeHNOString("FNAM", name);
|
||||
esm.writeHNCString("MODL", model);
|
||||
esm.writeHNOCString("FNAM", name);
|
||||
esm.writeHNT("WPDT", data, 32);
|
||||
esm.writeHNOString("SCRI", script);
|
||||
esm.writeHNOString("ITEX", icon);
|
||||
esm.writeHNOString("ENAM", enchant);
|
||||
esm.writeHNOCString("SCRI", script);
|
||||
esm.writeHNOCString("ITEX", icon);
|
||||
esm.writeHNOCString("ENAM", enchant);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -67,10 +67,14 @@ public:
|
|||
std::string getId() const { return m_id; }
|
||||
void setId(const std::string& in) { m_id = in; }
|
||||
|
||||
int getFlags() const { return (m_flags & 0x1 ? 0x00002000 : 0) | (m_flags & 0x2 ? 0x00000400 : 0); }
|
||||
void setFlags(int in) { m_flags = (in & 0x00002000 ? 0x1 : 0) | (in & 0x00000400 ? 0x2 : 0); }
|
||||
|
||||
virtual int getName() = 0;
|
||||
|
||||
protected:
|
||||
std::string m_id;
|
||||
char m_flags;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue