Apply clang-format to code base

This commit is contained in:
clang-format-bot 2022-09-22 21:26:05 +03:00 committed by ζeh Matt
parent f37d0be806
commit ddb0522bbf
No known key found for this signature in database
GPG key ID: 18CE582C71A225B0
2199 changed files with 118692 additions and 114392 deletions

View file

@ -34,28 +34,28 @@
namespace ESM4
{
#pragma pack(push, 1)
struct AIData // NPC_, CREA
struct AIData // NPC_, CREA
{
std::uint8_t aggression;
std::uint8_t confidence;
std::uint8_t energyLevel;
std::uint8_t responsibility;
std::uint8_t aggression;
std::uint8_t confidence;
std::uint8_t energyLevel;
std::uint8_t responsibility;
std::uint32_t aiFlags;
std::uint8_t trainSkill;
std::uint8_t trainLevel;
std::uint8_t trainSkill;
std::uint8_t trainLevel;
std::uint16_t unknown;
};
struct AttributeValues
{
std::uint8_t strength;
std::uint8_t intelligence;
std::uint8_t willpower;
std::uint8_t agility;
std::uint8_t speed;
std::uint8_t endurance;
std::uint8_t personality;
std::uint8_t luck;
std::uint8_t strength;
std::uint8_t intelligence;
std::uint8_t willpower;
std::uint8_t agility;
std::uint8_t speed;
std::uint8_t endurance;
std::uint8_t personality;
std::uint8_t luck;
};
struct ACBS_TES4
@ -64,7 +64,7 @@ namespace ESM4
std::uint16_t baseSpell;
std::uint16_t fatigue;
std::uint16_t barterGold;
std::int16_t levelOrOffset;
std::int16_t levelOrOffset;
std::uint16_t calcMin;
std::uint16_t calcMax;
std::uint32_t padding1;
@ -76,12 +76,12 @@ namespace ESM4
std::uint32_t flags;
std::uint16_t fatigue;
std::uint16_t barterGold;
std::int16_t levelOrMult;
std::int16_t levelOrMult;
std::uint16_t calcMinlevel;
std::uint16_t calcMaxlevel;
std::uint16_t speedMultiplier;
float karma;
std::int16_t dispositionBase;
float karma;
std::int16_t dispositionBase;
std::uint16_t templateFlags;
};
@ -90,7 +90,7 @@ namespace ESM4
std::uint32_t flags;
std::uint16_t magickaOffset;
std::uint16_t staminaOffset;
std::uint16_t levelOrMult; // TODO: check if int16_t
std::uint16_t levelOrMult; // TODO: check if int16_t
std::uint16_t calcMinlevel;
std::uint16_t calcMaxlevel;
std::uint16_t speedMultiplier;
@ -103,14 +103,14 @@ namespace ESM4
union ActorBaseConfig
{
ACBS_TES4 tes4;
ACBS_FO3 fo3;
ACBS_FO3 fo3;
ACBS_TES5 tes5;
};
struct ActorFaction
{
FormId faction;
std::int8_t rank;
FormId faction;
std::int8_t rank;
std::uint8_t unknown1;
std::uint8_t unknown2;
std::uint8_t unknown3;

View file

@ -26,8 +26,8 @@
*/
#include "common.hpp"
#include <sstream>
#include <algorithm>
#include <sstream>
#include <stdexcept>
#include <string>
@ -36,12 +36,9 @@
namespace ESM4
{
const char *sGroupType[] =
{
"Record Type", "World Child", "Interior Cell", "Interior Sub Cell", "Exterior Cell",
"Exterior Sub Cell", "Cell Child", "Topic Child", "Cell Persistent Child",
"Cell Temporary Child", "Cell Visible Dist Child", "Unknown"
};
const char* sGroupType[] = { "Record Type", "World Child", "Interior Cell", "Interior Sub Cell", "Exterior Cell",
"Exterior Sub Cell", "Cell Child", "Topic Child", "Cell Persistent Child", "Cell Temporary Child",
"Cell Visible Dist Child", "Unknown" };
std::string printLabel(const GroupLabel& label, const std::uint32_t type)
{
@ -58,9 +55,9 @@ namespace ESM4
case ESM4::Grp_ExteriorCell:
case ESM4::Grp_ExteriorSubCell:
{
//short x, y;
//y = label & 0xff;
//x = (label >> 16) & 0xff;
// short x, y;
// y = label & 0xff;
// x = (label >> 16) & 0xff;
ss << ": grid (x, y) " << std::dec << label.grid[1] << ", " << label.grid[0];
break;
@ -90,9 +87,9 @@ namespace ESM4
void gridToString(std::int16_t x, std::int16_t y, std::string& str)
{
char buf[6+6+2+1]; // longest signed 16 bit number is 6 characters (-32768)
int res = snprintf(buf, 6+6+2+1, "#%d %d", x, y);
if (res > 0 && res < 6+6+2+1)
char buf[6 + 6 + 2 + 1]; // longest signed 16 bit number is 6 characters (-32768)
int res = snprintf(buf, 6 + 6 + 2 + 1, "#%d %d", x, y);
if (res > 0 && res < 6 + 6 + 2 + 1)
str.assign(buf);
else
throw std::runtime_error("possible buffer overflow while converting grid");

View file

@ -34,10 +34,12 @@
namespace ESM
{
template<std::size_t len>
constexpr unsigned int fourCC(const char(&name)[len]) {
template <std::size_t len>
constexpr unsigned int fourCC(const char (&name)[len])
{
static_assert(len == 5, "Constant must be 4 characters long. (Plus null terminator)");
return static_cast<unsigned char>(name[0]) | (static_cast<unsigned char>(name[1]) << 8) | (static_cast<unsigned char>(name[2]) << 16) | (static_cast<unsigned char>(name[3]) << 24);
return static_cast<unsigned char>(name[0]) | (static_cast<unsigned char>(name[1]) << 8)
| (static_cast<unsigned char>(name[2]) << 16) | (static_cast<unsigned char>(name[3]) << 24);
}
}
@ -186,7 +188,7 @@ namespace ESM4
REC_CCRD = fourCC("CCRD"), // Caravan Card
REC_CMNY = fourCC("CMNY"), // Caravan Money
REC_ALOC = fourCC("ALOC"), // Audio Location Controller
REC_MSET = fourCC("MSET") // Media Set
REC_MSET = fourCC("MSET") // Media Set
};
enum SubRecordTypes
@ -808,100 +810,100 @@ namespace ESM4
EFI_SUDG = fourCC("SUDG"), // Sun Damage
EFI_VAMP = fourCC("VAMP"), // Vampirism
EFI_DARK = fourCC("DARK"), // Darkness
EFI_RSWD = fourCC("RSWD") // Resist Water Damage
EFI_RSWD = fourCC("RSWD") // Resist Water Damage
};
// Based on http://www.uesp.net/wiki/Tes5Mod:Mod_File_Format#Groups
enum GroupType
{
Grp_RecordType = 0,
Grp_WorldChild = 1,
Grp_InteriorCell = 2,
Grp_InteriorSubCell = 3,
Grp_ExteriorCell = 4,
Grp_ExteriorSubCell = 5,
Grp_CellChild = 6,
Grp_TopicChild = 7,
Grp_CellPersistentChild = 8,
Grp_CellTemporaryChild = 9,
Grp_RecordType = 0,
Grp_WorldChild = 1,
Grp_InteriorCell = 2,
Grp_InteriorSubCell = 3,
Grp_ExteriorCell = 4,
Grp_ExteriorSubCell = 5,
Grp_CellChild = 6,
Grp_TopicChild = 7,
Grp_CellPersistentChild = 8,
Grp_CellTemporaryChild = 9,
Grp_CellVisibleDistChild = 10
};
// Based on http://www.uesp.net/wiki/Tes5Mod:Mod_File_Format#Records
enum RecordFlag
{
Rec_ESM = 0x00000001, // (TES4 record only) Master (ESM) file.
Rec_Deleted = 0x00000020, // Deleted
Rec_Constant = 0x00000040, // Constant
Rec_ESM = 0x00000001, // (TES4 record only) Master (ESM) file.
Rec_Deleted = 0x00000020, // Deleted
Rec_Constant = 0x00000040, // Constant
Rec_HiddenLMap = 0x00000040, // (REFR) Hidden From Local Map (Needs Confirmation: Related to shields)
Rec_Localized = 0x00000080, // (TES4 record only) Is localized. This will make Skyrim load the
// .STRINGS, .DLSTRINGS, and .ILSTRINGS files associated with the mod.
// If this flag is not set, lstrings are treated as zstrings.
Rec_FireOff = 0x00000080, // (PHZD) Turn off fire
Rec_Localized = 0x00000080, // (TES4 record only) Is localized. This will make Skyrim load the
// .STRINGS, .DLSTRINGS, and .ILSTRINGS files associated with the mod.
// If this flag is not set, lstrings are treated as zstrings.
Rec_FireOff = 0x00000080, // (PHZD) Turn off fire
Rec_UpdateAnim = 0x00000100, // Must Update Anims
Rec_NoAccess = 0x00000100, // (REFR) Inaccessible
Rec_Hidden = 0x00000200, // (REFR) Hidden from local map
Rec_StartDead = 0x00000200, // (ACHR) Starts dead /(REFR) MotionBlurCastsShadows
Rec_NoAccess = 0x00000100, // (REFR) Inaccessible
Rec_Hidden = 0x00000200, // (REFR) Hidden from local map
Rec_StartDead = 0x00000200, // (ACHR) Starts dead /(REFR) MotionBlurCastsShadows
Rec_Persistent = 0x00000400, // Quest item / Persistent reference
Rec_DispMenu = 0x00000400, // (LSCR) Displays in Main Menu
Rec_Disabled = 0x00000800, // Initially disabled
Rec_Ignored = 0x00001000, // Ignored
Rec_DispMenu = 0x00000400, // (LSCR) Displays in Main Menu
Rec_Disabled = 0x00000800, // Initially disabled
Rec_Ignored = 0x00001000, // Ignored
Rec_VisDistant = 0x00008000, // Visible when distant
Rec_RandAnim = 0x00010000, // (ACTI) Random Animation Start
Rec_Danger = 0x00020000, // (ACTI) Dangerous / Off limits (Interior cell)
// Dangerous Can't be set withough Ignore Object Interaction
Rec_RandAnim = 0x00010000, // (ACTI) Random Animation Start
Rec_Danger = 0x00020000, // (ACTI) Dangerous / Off limits (Interior cell)
// Dangerous Can't be set withough Ignore Object Interaction
Rec_Compressed = 0x00040000, // Data is compressed
Rec_CanNotWait = 0x00080000, // Can't wait
Rec_IgnoreObj = 0x00100000, // (ACTI) Ignore Object Interaction
// Ignore Object Interaction Sets Dangerous Automatically
Rec_Marker = 0x00800000, // Is Marker
Rec_Obstacle = 0x02000000, // (ACTI) Obstacle / (REFR) No AI Acquire
Rec_IgnoreObj = 0x00100000, // (ACTI) Ignore Object Interaction
// Ignore Object Interaction Sets Dangerous Automatically
Rec_Marker = 0x00800000, // Is Marker
Rec_Obstacle = 0x02000000, // (ACTI) Obstacle / (REFR) No AI Acquire
Rec_NavMFilter = 0x04000000, // NavMesh Gen - Filter
Rec_NavMBBox = 0x08000000, // NavMesh Gen - Bounding Box
Rec_NavMBBox = 0x08000000, // NavMesh Gen - Bounding Box
Rec_ExitToTalk = 0x10000000, // (FURN) Must Exit to Talk
Rec_Refected = 0x10000000, // (REFR) Reflected By Auto Water
Rec_ChildUse = 0x20000000, // (FURN/IDLM) Child Can Use
Rec_NoHavok = 0x20000000, // (REFR) Don't Havok Settle
Rec_Refected = 0x10000000, // (REFR) Reflected By Auto Water
Rec_ChildUse = 0x20000000, // (FURN/IDLM) Child Can Use
Rec_NoHavok = 0x20000000, // (REFR) Don't Havok Settle
Rec_NavMGround = 0x40000000, // NavMesh Gen - Ground
Rec_NoRespawn = 0x40000000, // (REFR) NoRespawn
Rec_MultiBound = 0x80000000 // (REFR) MultiBound
Rec_NoRespawn = 0x40000000, // (REFR) NoRespawn
Rec_MultiBound = 0x80000000 // (REFR) MultiBound
};
#pragma pack(push, 1)
// NOTE: the label field of a group is not reliable (http://www.uesp.net/wiki/Tes4Mod:Mod_File_Format)
union GroupLabel
{
std::uint32_t value; // formId, blockNo or raw int representation of type
char recordType[4]; // record type in ascii
std::int16_t grid[2]; // grid y, x (note the reverse order)
std::uint32_t value; // formId, blockNo or raw int representation of type
char recordType[4]; // record type in ascii
std::int16_t grid[2]; // grid y, x (note the reverse order)
};
struct GroupTypeHeader
{
std::uint32_t typeId;
std::uint32_t groupSize; // includes the 24 bytes (20 for TES4) of header (i.e. this struct)
GroupLabel label; // format based on type
std::int32_t type;
std::uint16_t stamp; // & 0xff for day, & 0xff00 for months since Dec 2002 (i.e. 1 = Jan 2003)
GroupLabel label; // format based on type
std::int32_t type;
std::uint16_t stamp; // & 0xff for day, & 0xff00 for months since Dec 2002 (i.e. 1 = Jan 2003)
std::uint16_t unknown;
std::uint16_t version; // not in TES4
std::uint16_t unknown2; // not in TES4
std::uint16_t version; // not in TES4
std::uint16_t unknown2; // not in TES4
};
struct RecordTypeHeader
{
std::uint32_t typeId;
std::uint32_t dataSize; // does *not* include 24 bytes (20 for TES4) of header
std::uint32_t dataSize; // does *not* include 24 bytes (20 for TES4) of header
std::uint32_t flags;
FormId id;
FormId id;
std::uint32_t revision;
std::uint16_t version; // not in TES4
std::uint16_t unknown; // not in TES4
std::uint16_t version; // not in TES4
std::uint16_t unknown; // not in TES4
};
union RecordHeader
{
struct GroupTypeHeader group;
struct GroupTypeHeader group;
struct RecordTypeHeader record;
};
@ -922,7 +924,7 @@ namespace ESM4
union CellGrid
{
FormId cellId;
Grid grid;
Grid grid;
};
struct Vertex

View file

@ -31,15 +31,15 @@ namespace ESM4
{
enum DialType
{
DTYP_Topic = 0,
DTYP_Conversation = 1,
DTYP_Combat = 2,
DTYP_Persuation = 3,
DTYP_Detection = 4,
DTYP_Service = 5,
DTYP_Topic = 0,
DTYP_Conversation = 1,
DTYP_Combat = 2,
DTYP_Persuation = 3,
DTYP_Detection = 4,
DTYP_Service = 5,
DTYP_Miscellaneous = 6,
// below FO3/FONV
DTYP_Radio = 7
DTYP_Radio = 7
};
}

View file

@ -42,10 +42,10 @@ namespace ESM4
struct ScriptEffect
{
FormId formId; // Script effect (Magic effect must be SEFF)
std::int32_t school; // Magic school. See Magic schools for more information.
EFI_Label visualEffect; // Visual effect name or 0x00000000 if None
std::uint8_t flags; // 0x01 = Hostile
FormId formId; // Script effect (Magic effect must be SEFF)
std::int32_t school; // Magic school. See Magic schools for more information.
EFI_Label visualEffect; // Visual effect name or 0x00000000 if None
std::uint8_t flags; // 0x01 = Hostile
std::uint8_t unknown1;
std::uint8_t unknown2;
std::uint8_t unknown3;

View file

@ -22,11 +22,11 @@
*/
#include "formid.hpp"
#include <sstream>
#include <algorithm>
#include <stdexcept>
#include <cstdlib> // strtol
#include <climits> // LONG_MIN, LONG_MAX for gcc
#include <cstdlib> // strtol
#include <sstream>
#include <stdexcept>
#include <string>
@ -34,9 +34,9 @@ namespace ESM4
{
void formIdToString(FormId formId, std::string& str)
{
char buf[8+1];
int res = snprintf(buf, 8+1, "%08X", formId);
if (res > 0 && res < 8+1)
char buf[8 + 1];
int res = snprintf(buf, 8 + 1, "%08X", formId);
if (res > 0 && res < 8 + 1)
str.assign(buf);
else
throw std::runtime_error("Possible buffer overflow while converting formId");
@ -49,17 +49,17 @@ namespace ESM4
return str;
}
bool isFormId(const std::string& str, FormId *id)
bool isFormId(const std::string& str, FormId* id)
{
if (str.size() != 8)
return false;
char *tmp;
char* tmp;
errno = 0;
unsigned long val = strtol(str.c_str(), &tmp, 16);
if (tmp == str.c_str() || *tmp != '\0'
|| ((val == (unsigned long)LONG_MIN || val == (unsigned long)LONG_MAX) && errno == ERANGE))
|| ((val == (unsigned long)LONG_MIN || val == (unsigned long)LONG_MAX) && errno == ERANGE))
return false;
if (id != nullptr)

View file

@ -34,7 +34,7 @@ namespace ESM4
std::string formIdToString(FormId formId);
bool isFormId(const std::string& str, FormId *id = nullptr);
bool isFormId(const std::string& str, FormId* id = nullptr);
FormId stringToFormId(const std::string& str);
}

View file

@ -37,16 +37,16 @@ namespace ESM4
// LVLC, LVLI
struct LVLO
{
std::int16_t level;
std::uint16_t unknown; // sometimes missing
FormId item;
std::int16_t count;
std::int16_t level;
std::uint16_t unknown; // sometimes missing
FormId item;
std::int16_t count;
std::uint16_t unknown2; // sometimes missing
};
struct InventoryItem // NPC_, CREA, CONT
{
FormId item;
FormId item;
std::uint32_t count;
};
#pragma pack(pop)

View file

@ -35,17 +35,17 @@ namespace ESM4
#pragma pack(push, 1)
// guesses only for TES4
struct Lighting
{ // | Aichan Prison values
std::uint32_t ambient; // | 16 17 19 00 (RGBA)
{ // | Aichan Prison values
std::uint32_t ambient; // | 16 17 19 00 (RGBA)
std::uint32_t directional; // | 00 00 00 00 (RGBA)
std::uint32_t fogColor; // | 1D 1B 16 00 (RGBA)
float fogNear; // Fog Near | 00 00 00 00 = 0.f
float fogFar; // Fog Far | 00 80 3B 45 = 3000.f
std::int32_t rotationXY; // rotation xy | 00 00 00 00 = 0
std::int32_t rotationZ; // rotation z | 00 00 00 00 = 0
float fogDirFade; // Fog dir fade | 00 00 80 3F = 1.f
float fogClipDist; // Fog clip dist | 00 80 3B 45 = 3000.f
float fogPower = std::numeric_limits<float>::max();
std::uint32_t fogColor; // | 1D 1B 16 00 (RGBA)
float fogNear; // Fog Near | 00 00 00 00 = 0.f
float fogFar; // Fog Far | 00 80 3B 45 = 3000.f
std::int32_t rotationXY; // rotation xy | 00 00 00 00 = 0
std::int32_t rotationZ; // rotation z | 00 00 00 00 = 0
float fogDirFade; // Fog dir fade | 00 00 80 3F = 1.f
float fogClipDist; // Fog clip dist | 00 80 3B 45 = 3000.f
float fogPower = std::numeric_limits<float>::max();
};
struct Lighting_TES5
@ -53,13 +53,13 @@ namespace ESM4
std::uint32_t ambient;
std::uint32_t directional;
std::uint32_t fogColor;
float fogNear;
float fogFar;
std::int32_t rotationXY;
std::int32_t rotationZ;
float fogDirFade;
float fogClipDist;
float fogPower;
float fogNear;
float fogFar;
std::int32_t rotationXY;
std::int32_t rotationZ;
float fogDirFade;
float fogClipDist;
float fogPower;
std::uint32_t unknown1;
std::uint32_t unknown2;
std::uint32_t unknown3;
@ -69,9 +69,9 @@ namespace ESM4
std::uint32_t unknown7;
std::uint32_t unknown8;
std::uint32_t fogColorFar;
float fogMax;
float LightFadeStart;
float LightFadeEnd;
float fogMax;
float LightFadeStart;
float LightFadeEnd;
std::uint32_t padding;
};
#pragma pack(pop)

View file

@ -36,7 +36,7 @@ void ESM4::ActorCharacter::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
mParent = reader.currCell(); // NOTE: only for persistent achr? (aren't they all persistent?)
while (reader.getSubRecordHeader())
@ -44,12 +44,24 @@ void ESM4::ActorCharacter::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getZString(mFullName); break;
case ESM4::SUB_NAME: reader.getFormId(mBaseObj); break;
case ESM4::SUB_DATA: reader.get(mPlacement); break;
case ESM4::SUB_XSCL: reader.get(mScale); break;
case ESM4::SUB_XOWN: reader.get(mOwner); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getZString(mFullName);
break;
case ESM4::SUB_NAME:
reader.getFormId(mBaseObj);
break;
case ESM4::SUB_DATA:
reader.get(mPlacement);
break;
case ESM4::SUB_XSCL:
reader.get(mScale);
break;
case ESM4::SUB_XOWN:
reader.get(mOwner);
break;
case ESM4::SUB_XESP:
{
reader.get(mEsp);
@ -59,7 +71,7 @@ void ESM4::ActorCharacter::load(ESM4::Reader& reader)
case ESM4::SUB_XRGD: // ragdoll
case ESM4::SUB_XRGB: // ragdoll biped
{
//std::cout << "ACHR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "ACHR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -91,7 +103,7 @@ void ESM4::ActorCharacter::load(ESM4::Reader& reader)
case ESM4::SUB_TNAM: // FO3
case ESM4::SUB_XATO: // FONV
{
//std::cout << "ACHR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "ACHR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -101,10 +113,10 @@ void ESM4::ActorCharacter::load(ESM4::Reader& reader)
}
}
//void ESM4::ActorCharacter::save(ESM4::Writer& writer) const
// void ESM4::ActorCharacter::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::ActorCharacter::blank()
// void ESM4::ActorCharacter::blank()
//{
//}
// }

View file

@ -38,29 +38,29 @@ namespace ESM4
struct ActorCharacter
{
FormId mParent; // cell formId, from the loading sequence
// NOTE: for exterior cells it will be the dummy cell FormId
FormId mParent; // cell formId, from the loading sequence
// NOTE: for exterior cells it will be the dummy cell FormId
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
std::string mFullName;
FormId mBaseObj;
FormId mBaseObj;
Placement mPlacement;
float mScale = 1.0f;
FormId mOwner;
FormId mGlobal;
float mScale = 1.0f;
FormId mOwner;
FormId mGlobal;
bool mInitiallyDisabled; // TODO may need to check mFlags & 0x800 (initially disabled)
EnableParent mEsp;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -36,31 +36,45 @@ void ESM4::ActorCreature::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_NAME: reader.getFormId(mBaseObj); break;
case ESM4::SUB_DATA: reader.get(mPlacement); break;
case ESM4::SUB_XSCL: reader.get(mScale); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_NAME:
reader.getFormId(mBaseObj);
break;
case ESM4::SUB_DATA:
reader.get(mPlacement);
break;
case ESM4::SUB_XSCL:
reader.get(mScale);
break;
case ESM4::SUB_XESP:
{
reader.get(mEsp);
reader.adjustFormId(mEsp.parent);
break;
}
case ESM4::SUB_XOWN: reader.getFormId(mOwner); break;
case ESM4::SUB_XGLB: reader.get(mGlobal); break; // FIXME: formId?
case ESM4::SUB_XRNK: reader.get(mFactionRank); break;
case ESM4::SUB_XOWN:
reader.getFormId(mOwner);
break;
case ESM4::SUB_XGLB:
reader.get(mGlobal);
break; // FIXME: formId?
case ESM4::SUB_XRNK:
reader.get(mFactionRank);
break;
case ESM4::SUB_XRGD: // ragdoll
case ESM4::SUB_XRGB: // ragdoll biped
{
// seems to occur only for dead bodies, e.g. DeadMuffy, DeadDogVicious
//std::cout << "ACRE " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "ACRE " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -74,7 +88,7 @@ void ESM4::ActorCreature::load(ESM4::Reader& reader)
case ESM4::SUB_XPRD: // FO3
case ESM4::SUB_XATO: // FONV
{
//std::cout << "ACRE " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "ACRE " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -84,10 +98,10 @@ void ESM4::ActorCreature::load(ESM4::Reader& reader)
}
}
//void ESM4::ActorCreature::save(ESM4::Writer& writer) const
// void ESM4::ActorCreature::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::ActorCreature::blank()
// void ESM4::ActorCreature::blank()
//{
//}
// }

View file

@ -38,16 +38,16 @@ namespace ESM4
struct ActorCreature
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
FormId mBaseObj;
FormId mBaseObj;
Placement mPlacement;
float mScale = 1.0f;
FormId mOwner;
FormId mGlobal;
float mScale = 1.0f;
FormId mOwner;
FormId mGlobal;
std::uint32_t mFactionRank;
bool mInitiallyDisabled; // TODO may need to check mFlags & 0x800 (initially disabled)
@ -55,9 +55,9 @@ namespace ESM4
EnableParent mEsp;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,8 +26,8 @@
*/
#include "loadacti.hpp"
#include <stdexcept>
#include <iostream> // FIXME
#include <stdexcept>
#include "reader.hpp"
//#include "writer.hpp"
@ -36,23 +36,43 @@ void ESM4::Activator::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_SNAM: reader.getFormId(mLoopingSound); break;
case ESM4::SUB_VNAM: reader.getFormId(mActivationSound); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_INAM: reader.getFormId(mRadioTemplate); break; // FONV
case ESM4::SUB_RNAM: reader.getFormId(mRadioStation); break;
case ESM4::SUB_XATO: reader.getZString(mActivationPrompt); break; // FONV
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_SNAM:
reader.getFormId(mLoopingSound);
break;
case ESM4::SUB_VNAM:
reader.getFormId(mActivationSound);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_INAM:
reader.getFormId(mRadioTemplate);
break; // FONV
case ESM4::SUB_RNAM:
reader.getFormId(mRadioStation);
break;
case ESM4::SUB_XATO:
reader.getZString(mActivationPrompt);
break; // FONV
case ESM4::SUB_MODT:
case ESM4::SUB_MODS:
case ESM4::SUB_DEST:
@ -70,7 +90,7 @@ void ESM4::Activator::load(ESM4::Reader& reader)
case ESM4::SUB_VMAD:
case ESM4::SUB_WNAM:
{
//std::cout << "ACTI " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "ACTI " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -80,10 +100,10 @@ void ESM4::Activator::load(ESM4::Reader& reader)
}
}
//void ESM4::Activator::save(ESM4::Writer& writer) const
// void ESM4::Activator::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Activator::blank()
// void ESM4::Activator::blank()
//{
//}
// }

View file

@ -39,7 +39,7 @@ namespace ESM4
struct Activator
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -47,20 +47,20 @@ namespace ESM4
std::string mModel;
FormId mScriptId;
FormId mLoopingSound; // SOUN
FormId mLoopingSound; // SOUN
FormId mActivationSound; // SOUN
float mBoundRadius;
FormId mRadioTemplate; // SOUN
FormId mRadioStation; // TACT
FormId mRadioStation; // TACT
std::string mActivationPrompt;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,8 +26,8 @@
*/
#include "loadalch.hpp"
#include <stdexcept>
#include <cstring>
#include <stdexcept>
//#include <iostream> // FIXME
#include "reader.hpp"
@ -37,21 +37,37 @@ void ESM4::Potion::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_MICO: reader.getZString(mMiniIcon); break; // FO3
case ESM4::SUB_DATA: reader.get(mData); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_MICO:
reader.getZString(mMiniIcon);
break; // FO3
case ESM4::SUB_DATA:
reader.get(mData);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_SCIT:
{
reader.get(mEffect);
@ -73,8 +89,12 @@ void ESM4::Potion::load(ESM4::Reader& reader)
reader.adjustFormId(mItem.sound);
break;
}
case ESM4::SUB_YNAM: reader.getFormId(mPickUpSound); break;
case ESM4::SUB_ZNAM: reader.getFormId(mDropSound); break;
case ESM4::SUB_YNAM:
reader.getFormId(mPickUpSound);
break;
case ESM4::SUB_ZNAM:
reader.getFormId(mDropSound);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_EFID:
case ESM4::SUB_EFIT:
@ -85,7 +105,7 @@ void ESM4::Potion::load(ESM4::Reader& reader)
case ESM4::SUB_OBND:
case ESM4::SUB_ETYP: // FO3
{
//std::cout << "ALCH " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "ALCH " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -95,10 +115,10 @@ void ESM4::Potion::load(ESM4::Reader& reader)
}
}
//void ESM4::Potion::save(ESM4::Writer& writer) const
// void ESM4::Potion::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Potion::blank()
// void ESM4::Potion::blank()
//{
//}
// }

View file

@ -50,12 +50,12 @@ namespace ESM4
std::int32_t value;
std::uint32_t flags;
FormId withdrawl;
float chanceAddition;
float chanceAddition;
FormId sound;
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -76,9 +76,9 @@ namespace ESM4
EnchantedItem mItem;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,8 +26,8 @@
*/
#include "loadaloc.hpp"
#include <stdexcept>
#include <cstring>
#include <stdexcept>
//#include <iostream> // FIXME: for debugging only
//#include <iomanip> // FIXME: for debugging only
@ -42,15 +42,19 @@ void ESM4::MediaLocationController::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getZString(mFullName); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getZString(mFullName);
break;
case ESM4::SUB_GNAM:
{
FormId id;
@ -99,7 +103,9 @@ void ESM4::MediaLocationController::load(ESM4::Reader& reader)
break;
}
case ESM4::SUB_RNAM: reader.getFormId(mConditionalFaction); break;
case ESM4::SUB_RNAM:
reader.getFormId(mConditionalFaction);
break;
case ESM4::SUB_NAM1:
{
reader.get(mMediaFlags);
@ -108,10 +114,18 @@ void ESM4::MediaLocationController::load(ESM4::Reader& reader)
mMediaFlags.factionNotFound = flags & 0x0F; // WARN: overwriting data
break;
}
case ESM4::SUB_NAM4: reader.get(mLocationDelay); break;
case ESM4::SUB_NAM7: reader.get(mRetriggerDelay); break;
case ESM4::SUB_NAM5: reader.get(mDayStart); break;
case ESM4::SUB_NAM6: reader.get(mNightStart); break;
case ESM4::SUB_NAM4:
reader.get(mLocationDelay);
break;
case ESM4::SUB_NAM7:
reader.get(mRetriggerDelay);
break;
case ESM4::SUB_NAM5:
reader.get(mDayStart);
break;
case ESM4::SUB_NAM6:
reader.get(mNightStart);
break;
case ESM4::SUB_NAM2: // always 0? 4 bytes
case ESM4::SUB_NAM3: // always 0? 4 bytes
case ESM4::SUB_FNAM: // always 0? 4 bytes
@ -135,25 +149,25 @@ void ESM4::MediaLocationController::load(ESM4::Reader& reader)
}
std::cout << ss.str() << std::endl;
#else
//std::cout << "ALOC " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// std::cout << "ALOC " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
reader.skipSubRecordData();
#endif
break;
}
default:
//std::cout << "ALOC " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
//reader.skipSubRecordData();
// std::cout << "ALOC " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// reader.skipSubRecordData();
throw std::runtime_error("ESM4::ALOC::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
}
//void ESM4::MediaLocationController::save(ESM4::Writer& writer) const
// void ESM4::MediaLocationController::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::MediaLocationController::blank()
// void ESM4::MediaLocationController::blank()
//{
//}
// }

View file

@ -52,7 +52,7 @@ namespace ESM4
struct MediaLocationController
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -76,9 +76,9 @@ namespace ESM4
std::uint32_t mNightStart;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,7 +35,7 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
std::uint32_t esmVer = reader.esmVersion();
bool isFONV = esmVer == ESM::VER_132 || esmVer == ESM::VER_133 || esmVer == ESM::VER_134;
@ -44,11 +44,15 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_DATA:
{
//if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
// if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
if (subHdr.dataSize == 16) // FO3 has 13 bytes even though VER_094
{
FormId projectile;
@ -81,15 +85,33 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
}
break;
}
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_MICO: reader.getZString(mMiniIcon); break; // FO3
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_ANAM: reader.get(mEnchantmentPoints); break;
case ESM4::SUB_ENAM: reader.getFormId(mEnchantment); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_DESC: reader.getLocalizedString(mText); break;
case ESM4::SUB_YNAM: reader.getFormId(mPickUpSound); break;
case ESM4::SUB_ZNAM: reader.getFormId(mDropSound); break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_MICO:
reader.getZString(mMiniIcon);
break; // FO3
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_ANAM:
reader.get(mEnchantmentPoints);
break;
case ESM4::SUB_ENAM:
reader.getFormId(mEnchantment);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_DESC:
reader.getLocalizedString(mText);
break;
case ESM4::SUB_YNAM:
reader.getFormId(mPickUpSound);
break;
case ESM4::SUB_ZNAM:
reader.getFormId(mDropSound);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_OBND:
case ESM4::SUB_KSIZ:
@ -100,7 +122,7 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
case ESM4::SUB_RCIL: // FONV
case ESM4::SUB_SCRI: // FONV
{
//std::cout << "AMMO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "AMMO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -110,10 +132,10 @@ void ESM4::Ammunition::load(ESM4::Reader& reader)
}
}
//void ESM4::Ammunition::save(ESM4::Writer& writer) const
// void ESM4::Ammunition::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Ammunition::blank()
// void ESM4::Ammunition::blank()
//{
//}
// }

View file

@ -41,17 +41,25 @@ namespace ESM4
{
struct Data // FIXME: TES5 projectile, damage (float)
{
float speed;
float speed;
std::uint32_t flags;
std::uint32_t value; // gold
float weight;
std::uint32_t value; // gold
float weight;
std::uint16_t damage;
std::uint8_t clipRounds; // only in FO3/FONV
std::uint8_t clipRounds; // only in FO3/FONV
Data() : speed(0.f), flags(0), value(0), weight(0.f), damage(0), clipRounds(0) {}
Data()
: speed(0.f)
, flags(0)
, value(0)
, weight(0.f)
, damage(0)
, clipRounds(0)
{
}
};
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -72,9 +80,9 @@ namespace ESM4
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,22 +35,32 @@ void ESM4::AnimObject::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_BNAM: reader.getZString(mUnloadEvent); break;
case ESM4::SUB_DATA: reader.getFormId(mIdleAnim); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_BNAM:
reader.getZString(mUnloadEvent);
break;
case ESM4::SUB_DATA:
reader.getFormId(mIdleAnim);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_MODT: // TES5 only
case ESM4::SUB_MODS: // TES5 only
{
//std::cout << "ANIO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "ANIO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -60,10 +70,10 @@ void ESM4::AnimObject::load(ESM4::Reader& reader)
}
}
//void ESM4::AnimObject::save(ESM4::Writer& writer) const
// void ESM4::AnimObject::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::AnimObject::blank()
// void ESM4::AnimObject::blank()
//{
//}
// }

View file

@ -39,7 +39,7 @@ namespace ESM4
struct AnimObject
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -47,13 +47,13 @@ namespace ESM4
float mBoundRadius;
FormId mIdleAnim; // only in TES4
FormId mIdleAnim; // only in TES4
std::string mUnloadEvent; // only in TES5
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,15 +35,19 @@ void ESM4::Apparatus::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_DATA:
{
if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
@ -60,16 +64,26 @@ void ESM4::Apparatus::load(ESM4::Reader& reader)
}
break;
}
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_DESC: reader.getLocalizedString(mText); break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_DESC:
reader.getLocalizedString(mText);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_OBND:
case ESM4::SUB_QUAL:
{
//std::cout << "APPA " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "APPA " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -79,10 +93,10 @@ void ESM4::Apparatus::load(ESM4::Reader& reader)
}
}
//void ESM4::Apparatus::save(ESM4::Writer& writer) const
// void ESM4::Apparatus::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Apparatus::blank()
// void ESM4::Apparatus::blank()
//{
//}
// }

View file

@ -41,13 +41,13 @@ namespace ESM4
{
struct Data
{
std::uint8_t type; // 0 = Mortar and Pestle, 1 = Alembic, 2 = Calcinator, 3 = Retort
std::uint8_t type; // 0 = Mortar and Pestle, 1 = Alembic, 2 = Calcinator, 3 = Retort
std::uint32_t value; // gold
float weight;
float quality;
float weight;
float quality;
};
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -63,9 +63,9 @@ namespace ESM4
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -36,7 +36,7 @@ void ESM4::ArmorAddon::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
std::uint32_t esmVer = reader.esmVersion();
@ -45,22 +45,34 @@ void ESM4::ArmorAddon::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_MOD2: reader.getZString(mModelMale); break;
case ESM4::SUB_MOD3: reader.getZString(mModelFemale); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_MOD2:
reader.getZString(mModelMale);
break;
case ESM4::SUB_MOD3:
reader.getZString(mModelFemale);
break;
case ESM4::SUB_MOD4:
case ESM4::SUB_MOD5:
{
std::string model;
reader.getZString(model);
//std::cout << mEditorId << " " << ESM::printName(subHdr.typeId) << " " << model << std::endl;
// std::cout << mEditorId << " " << ESM::printName(subHdr.typeId) << " " << model << std::endl;
break;
}
case ESM4::SUB_NAM0: reader.getFormId(mTextureMale); break;
case ESM4::SUB_NAM1: reader.getFormId(mTextureFemale); break;
case ESM4::SUB_RNAM: reader.getFormId(mRacePrimary); break;
case ESM4::SUB_NAM0:
reader.getFormId(mTextureMale);
break;
case ESM4::SUB_NAM1:
reader.getFormId(mTextureFemale);
break;
case ESM4::SUB_RNAM:
reader.getFormId(mRacePrimary);
break;
case ESM4::SUB_MODL:
{
if ((esmVer == ESM::VER_094 || esmVer == ESM::VER_170) && subHdr.dataSize == 4) // TES5
@ -119,7 +131,7 @@ void ESM4::ArmorAddon::load(ESM4::Reader& reader)
case ESM4::SUB_MODD: // FO3 // FIXME: should group with MODL
case ESM4::SUB_OBND: // FO3
{
//std::cout << "ARMA " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "ARMA " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -129,10 +141,10 @@ void ESM4::ArmorAddon::load(ESM4::Reader& reader)
}
}
//void ESM4::ArmorAddon::save(ESM4::Writer& writer) const
// void ESM4::ArmorAddon::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::ArmorAddon::blank()
// void ESM4::ArmorAddon::blank()
//{
//}
// }

View file

@ -31,8 +31,8 @@
#include <string>
#include <vector>
#include "formid.hpp"
#include "actor.hpp" // BodyTemplate
#include "formid.hpp"
namespace ESM4
{
@ -41,7 +41,7 @@ namespace ESM4
struct ArmorAddon
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -58,9 +58,9 @@ namespace ESM4
BodyTemplate mBodyTemplate; // TES5
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -36,7 +36,7 @@ void ESM4::Armor::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
std::uint32_t esmVer = reader.esmVersion();
mIsFONV = esmVer == ESM::VER_132 || esmVer == ESM::VER_133 || esmVer == ESM::VER_134;
@ -45,11 +45,15 @@ void ESM4::Armor::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_DATA:
{
//if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
// if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
if (subHdr.dataSize == 8) // FO3 has 12 bytes even though VER_094
{
reader.get(mData.value);
@ -72,7 +76,7 @@ void ESM4::Armor::load(ESM4::Reader& reader)
}
case ESM4::SUB_MODL: // seems only for Dawnguard/Dragonborn?
{
//if (esmVer == ESM::VER_094 || esmVer == ESM::VER_170 || isFONV)
// if (esmVer == ESM::VER_094 || esmVer == ESM::VER_170 || isFONV)
if (subHdr.dataSize == 4) // FO3 has zstring even though VER_094
{
FormId formId;
@ -83,18 +87,32 @@ void ESM4::Armor::load(ESM4::Reader& reader)
else
{
if (!reader.getZString(mModelMale))
throw std::runtime_error ("ARMO MODL data read error");
throw std::runtime_error("ARMO MODL data read error");
}
break;
}
case ESM4::SUB_MOD2: reader.getZString(mModelMaleWorld);break;
case ESM4::SUB_MOD3: reader.getZString(mModelFemale); break;
case ESM4::SUB_MOD4: reader.getZString(mModelFemaleWorld); break;
case ESM4::SUB_ICON: reader.getZString(mIconMale); break;
case ESM4::SUB_MICO: reader.getZString(mMiniIconMale); break;
case ESM4::SUB_ICO2: reader.getZString(mIconFemale); break;
case ESM4::SUB_MIC2: reader.getZString(mMiniIconFemale); break;
case ESM4::SUB_MOD2:
reader.getZString(mModelMaleWorld);
break;
case ESM4::SUB_MOD3:
reader.getZString(mModelFemale);
break;
case ESM4::SUB_MOD4:
reader.getZString(mModelFemaleWorld);
break;
case ESM4::SUB_ICON:
reader.getZString(mIconMale);
break;
case ESM4::SUB_MICO:
reader.getZString(mMiniIconMale);
break;
case ESM4::SUB_ICO2:
reader.getZString(mIconFemale);
break;
case ESM4::SUB_MIC2:
reader.getZString(mMiniIconFemale);
break;
case ESM4::SUB_BMDT:
{
if (subHdr.dataSize == 8) // FO3
@ -104,7 +122,7 @@ void ESM4::Armor::load(ESM4::Reader& reader)
mGeneralFlags &= 0x000000ff;
mGeneralFlags |= TYPE_FO3;
}
else // TES4
else // TES4
{
reader.get(mArmorFlags);
mGeneralFlags = (mArmorFlags & 0x00ff0000) >> 16;
@ -118,7 +136,7 @@ void ESM4::Armor::load(ESM4::Reader& reader)
uint32_t flags = 0;
if (subHdr.dataSize == 12)
reader.get(flags);
reader.get(mGeneralFlags); // skill
reader.get(mGeneralFlags); // skill
mGeneralFlags &= 0x0000000f; // 0 (light), 1 (heavy) or 2 (none)
if (subHdr.dataSize == 12)
mGeneralFlags |= (flags & 0x0000000f) << 3;
@ -133,13 +151,27 @@ void ESM4::Armor::load(ESM4::Reader& reader)
mGeneralFlags |= TYPE_TES5;
break;
}
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_ANAM: reader.get(mEnchantmentPoints); break;
case ESM4::SUB_ENAM: reader.getFormId(mEnchantment); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_DESC: reader.getLocalizedString(mText); break;
case ESM4::SUB_YNAM: reader.getFormId(mPickUpSound); break;
case ESM4::SUB_ZNAM: reader.getFormId(mDropSound); break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_ANAM:
reader.get(mEnchantmentPoints);
break;
case ESM4::SUB_ENAM:
reader.getFormId(mEnchantment);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_DESC:
reader.getLocalizedString(mText);
break;
case ESM4::SUB_YNAM:
reader.getFormId(mPickUpSound);
break;
case ESM4::SUB_ZNAM:
reader.getFormId(mDropSound);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_MO2B:
case ESM4::SUB_MO3B:
@ -171,7 +203,7 @@ void ESM4::Armor::load(ESM4::Reader& reader)
case ESM4::SUB_BNAM: // FONV
case ESM4::SUB_SNAM: // FONV
{
//std::cout << "ARMO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "ARMO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -179,14 +211,14 @@ void ESM4::Armor::load(ESM4::Reader& reader)
throw std::runtime_error("ESM4::ARMO::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
//if ((mArmorFlags&0xffff) == 0x02) // only hair
//std::cout << "only hair " << mEditorId << std::endl;
// if ((mArmorFlags&0xffff) == 0x02) // only hair
// std::cout << "only hair " << mEditorId << std::endl;
}
//void ESM4::Armor::save(ESM4::Writer& writer) const
// void ESM4::Armor::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Armor::blank()
// void ESM4::Armor::blank()
//{
//}
// }

View file

@ -43,67 +43,67 @@ namespace ESM4
// WARN: TES4 Armorflags still has the general flags high bits
enum ArmorFlags
{
TES4_Head = 0x00000001,
TES4_Hair = 0x00000002,
TES4_UpperBody = 0x00000004,
TES4_LowerBody = 0x00000008,
TES4_Hands = 0x00000010,
TES4_Feet = 0x00000020,
TES4_RightRing = 0x00000040,
TES4_LeftRing = 0x00000080,
TES4_Amulet = 0x00000100,
TES4_Weapon = 0x00000200,
TES4_BackWeapon = 0x00000400,
TES4_SideWeapon = 0x00000800,
TES4_Quiver = 0x00001000,
TES4_Shield = 0x00002000,
TES4_Torch = 0x00004000,
TES4_Tail = 0x00008000,
TES4_Head = 0x00000001,
TES4_Hair = 0x00000002,
TES4_UpperBody = 0x00000004,
TES4_LowerBody = 0x00000008,
TES4_Hands = 0x00000010,
TES4_Feet = 0x00000020,
TES4_RightRing = 0x00000040,
TES4_LeftRing = 0x00000080,
TES4_Amulet = 0x00000100,
TES4_Weapon = 0x00000200,
TES4_BackWeapon = 0x00000400,
TES4_SideWeapon = 0x00000800,
TES4_Quiver = 0x00001000,
TES4_Shield = 0x00002000,
TES4_Torch = 0x00004000,
TES4_Tail = 0x00008000,
//
FO3_Head = 0x00000001,
FO3_Hair = 0x00000002,
FO3_UpperBody = 0x00000004,
FO3_LeftHand = 0x00000008,
FO3_RightHand = 0x00000010,
FO3_Weapon = 0x00000020,
FO3_PipBoy = 0x00000040,
FO3_Backpack = 0x00000080,
FO3_Necklace = 0x00000100,
FO3_Headband = 0x00000200,
FO3_Hat = 0x00000400,
FO3_EyeGlasses = 0x00000800,
FO3_NoseRing = 0x00001000,
FO3_Earrings = 0x00002000,
FO3_Mask = 0x00004000,
FO3_Choker = 0x00008000,
FO3_MouthObject = 0x00010000,
FO3_BodyAddOn1 = 0x00020000,
FO3_BodyAddOn2 = 0x00040000,
FO3_BodyAddOn3 = 0x00080000,
FO3_Head = 0x00000001,
FO3_Hair = 0x00000002,
FO3_UpperBody = 0x00000004,
FO3_LeftHand = 0x00000008,
FO3_RightHand = 0x00000010,
FO3_Weapon = 0x00000020,
FO3_PipBoy = 0x00000040,
FO3_Backpack = 0x00000080,
FO3_Necklace = 0x00000100,
FO3_Headband = 0x00000200,
FO3_Hat = 0x00000400,
FO3_EyeGlasses = 0x00000800,
FO3_NoseRing = 0x00001000,
FO3_Earrings = 0x00002000,
FO3_Mask = 0x00004000,
FO3_Choker = 0x00008000,
FO3_MouthObject = 0x00010000,
FO3_BodyAddOn1 = 0x00020000,
FO3_BodyAddOn2 = 0x00040000,
FO3_BodyAddOn3 = 0x00080000,
//
TES5_Head = 0x00000001,
TES5_Hair = 0x00000002,
TES5_Body = 0x00000004,
TES5_Hands = 0x00000008,
TES5_Forearms = 0x00000010,
TES5_Amulet = 0x00000020,
TES5_Ring = 0x00000040,
TES5_Feet = 0x00000080,
TES5_Calves = 0x00000100,
TES5_Shield = 0x00000200,
TES5_Tail = 0x00000400,
TES5_LongHair = 0x00000800,
TES5_Circlet = 0x00001000,
TES5_Ears = 0x00002000,
TES5_BodyAddOn3 = 0x00004000,
TES5_BodyAddOn4 = 0x00008000,
TES5_BodyAddOn5 = 0x00010000,
TES5_BodyAddOn6 = 0x00020000,
TES5_BodyAddOn7 = 0x00040000,
TES5_BodyAddOn8 = 0x00080000,
TES5_DecapHead = 0x00100000,
TES5_Decapitate = 0x00200000,
TES5_BodyAddOn9 = 0x00400000,
TES5_Head = 0x00000001,
TES5_Hair = 0x00000002,
TES5_Body = 0x00000004,
TES5_Hands = 0x00000008,
TES5_Forearms = 0x00000010,
TES5_Amulet = 0x00000020,
TES5_Ring = 0x00000040,
TES5_Feet = 0x00000080,
TES5_Calves = 0x00000100,
TES5_Shield = 0x00000200,
TES5_Tail = 0x00000400,
TES5_LongHair = 0x00000800,
TES5_Circlet = 0x00001000,
TES5_Ears = 0x00002000,
TES5_BodyAddOn3 = 0x00004000,
TES5_BodyAddOn4 = 0x00008000,
TES5_BodyAddOn5 = 0x00010000,
TES5_BodyAddOn6 = 0x00020000,
TES5_BodyAddOn7 = 0x00040000,
TES5_BodyAddOn8 = 0x00080000,
TES5_DecapHead = 0x00100000,
TES5_Decapitate = 0x00200000,
TES5_BodyAddOn9 = 0x00400000,
TES5_BodyAddOn10 = 0x00800000,
TES5_BodyAddOn11 = 0x01000000,
TES5_BodyAddOn12 = 0x02000000,
@ -112,30 +112,30 @@ namespace ESM4
TES5_BodyAddOn15 = 0x10000000,
TES5_BodyAddOn16 = 0x20000000,
TES5_BodyAddOn17 = 0x40000000,
TES5_FX01 = 0x80000000
TES5_FX01 = 0x80000000
};
enum GeneralFlags
{
TYPE_TES4 = 0x1000,
TYPE_FO3 = 0x2000,
TYPE_TES5 = 0x3000,
TYPE_FONV = 0x4000,
TYPE_TES4 = 0x1000,
TYPE_FO3 = 0x2000,
TYPE_TES5 = 0x3000,
TYPE_FONV = 0x4000,
//
TES4_HideRings = 0x0001,
TES4_HideAmulet = 0x0002,
TES4_HideRings = 0x0001,
TES4_HideAmulet = 0x0002,
TES4_NonPlayable = 0x0040,
TES4_HeavyArmor = 0x0080,
TES4_HeavyArmor = 0x0080,
//
FO3_PowerArmor = 0x0020,
FO3_NonPlayable = 0x0040,
FO3_HeavyArmor = 0x0080,
FO3_PowerArmor = 0x0020,
FO3_NonPlayable = 0x0040,
FO3_HeavyArmor = 0x0080,
//
TES5_LightArmor = 0x0000,
TES5_HeavyArmor = 0x0001,
TES5_None = 0x0002,
TES5_ModVoice = 0x0004, // note bit shift
TES5_NonPlayable = 0x0040 // note bit shift
TES5_LightArmor = 0x0000,
TES5_HeavyArmor = 0x0001,
TES5_None = 0x0002,
TES5_ModVoice = 0x0004, // note bit shift
TES5_NonPlayable = 0x0040 // note bit shift
};
#pragma pack(push, 1)
@ -144,11 +144,11 @@ namespace ESM4
std::uint16_t armor; // only in TES4?
std::uint32_t value;
std::uint32_t health; // not in TES5?
float weight;
float weight;
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
bool mIsTES4; // TODO: check that these match the general flags
@ -176,17 +176,17 @@ namespace ESM4
std::uint32_t mArmorFlags;
std::uint32_t mGeneralFlags;
FormId mScriptId;
FormId mScriptId;
std::uint16_t mEnchantmentPoints;
FormId mEnchantment;
FormId mEnchantment;
std::vector<FormId> mAddOns; // TES5 ARMA
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -36,15 +36,19 @@ void ESM4::AcousticSpace::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_ANAM: reader.get(mEnvironmentType); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_ANAM:
reader.get(mEnvironmentType);
break;
case ESM4::SUB_SNAM:
{
FormId id;
@ -52,20 +56,24 @@ void ESM4::AcousticSpace::load(ESM4::Reader& reader)
mAmbientLoopSounds.push_back(id);
break;
}
case ESM4::SUB_RDAT: reader.getFormId(mSoundRegion); break;
case ESM4::SUB_INAM: reader.get(mIsInterior); break;
case ESM4::SUB_RDAT:
reader.getFormId(mSoundRegion);
break;
case ESM4::SUB_INAM:
reader.get(mIsInterior);
break;
case ESM4::SUB_WNAM: // usually 0 for FONV (maybe # of close Actors for Walla to trigger)
{
std::uint32_t dummy;
reader.get(dummy);
//std::cout << "WNAM " << mEditorId << " " << dummy << std::endl;
// std::cout << "WNAM " << mEditorId << " " << dummy << std::endl;
break;
}
case ESM4::SUB_BNAM: // TES5 reverb formid
case ESM4::SUB_OBND:
{
//std::cout << "ASPC " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// std::cout << "ASPC " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
reader.skipSubRecordData();
break;
}
@ -75,10 +83,10 @@ void ESM4::AcousticSpace::load(ESM4::Reader& reader)
}
}
//void ESM4::AcousticSpace::save(ESM4::Writer& writer) const
// void ESM4::AcousticSpace::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::AcousticSpace::blank()
// void ESM4::AcousticSpace::blank()
//{
//}
// }

View file

@ -40,7 +40,7 @@ namespace ESM4
struct AcousticSpace
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -54,9 +54,9 @@ namespace ESM4
std::uint32_t mIsInterior; // if true only use mAmbientLoopSounds[0]
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,21 +35,27 @@ void ESM4::Book::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
//std::uint32_t esmVer = reader.esmVersion(); // currently unused
mFlags = reader.hdr().record.flags;
// std::uint32_t esmVer = reader.esmVersion(); // currently unused
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_DESC: reader.getLocalizedString(mText); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_DESC:
reader.getLocalizedString(mText);
break;
case ESM4::SUB_DATA:
{
reader.get(mData.flags);
//if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
// if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
if (subHdr.dataSize == 16) // FO3 has 10 bytes even though VER_094
{
static std::uint8_t dummy;
@ -66,14 +72,30 @@ void ESM4::Book::load(ESM4::Reader& reader)
reader.get(mData.weight);
break;
}
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_ANAM: reader.get(mEnchantmentPoints); break;
case ESM4::SUB_ENAM: reader.getFormId(mEnchantment); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_YNAM: reader.getFormId(mPickUpSound); break;
case ESM4::SUB_ZNAM: reader.getFormId(mDropSound); break; // TODO: does this exist?
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_ANAM:
reader.get(mEnchantmentPoints);
break;
case ESM4::SUB_ENAM:
reader.getFormId(mEnchantment);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_YNAM:
reader.getFormId(mPickUpSound);
break;
case ESM4::SUB_ZNAM:
reader.getFormId(mDropSound);
break; // TODO: does this exist?
case ESM4::SUB_MODT:
case ESM4::SUB_OBND:
case ESM4::SUB_KSIZ:
@ -82,7 +104,7 @@ void ESM4::Book::load(ESM4::Reader& reader)
case ESM4::SUB_INAM:
case ESM4::SUB_VMAD:
{
//std::cout << "BOOK " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "BOOK " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -92,10 +114,10 @@ void ESM4::Book::load(ESM4::Reader& reader)
}
}
//void ESM4::Book::save(ESM4::Writer& writer) const
// void ESM4::Book::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Book::blank()
// void ESM4::Book::blank()
//{
//}
// }

View file

@ -47,41 +47,41 @@ namespace ESM4
enum BookSkill // for TES4 only
{
BookSkill_None = -1,
BookSkill_Armorer = 0,
BookSkill_Athletics = 1,
BookSkill_Blade = 2,
BookSkill_Block = 3,
BookSkill_Blunt = 4,
BookSkill_HandToHand = 5,
BookSkill_HeavyArmor = 6,
BookSkill_Alchemy = 7,
BookSkill_Alteration = 8,
BookSkill_Conjuration = 9,
BookSkill_None = -1,
BookSkill_Armorer = 0,
BookSkill_Athletics = 1,
BookSkill_Blade = 2,
BookSkill_Block = 3,
BookSkill_Blunt = 4,
BookSkill_HandToHand = 5,
BookSkill_HeavyArmor = 6,
BookSkill_Alchemy = 7,
BookSkill_Alteration = 8,
BookSkill_Conjuration = 9,
BookSkill_Destruction = 10,
BookSkill_Illusion = 11,
BookSkill_Mysticism = 12,
BookSkill_Illusion = 11,
BookSkill_Mysticism = 12,
BookSkill_Restoration = 13,
BookSkill_Acrobatics = 14,
BookSkill_LightArmor = 15,
BookSkill_Marksman = 16,
BookSkill_Mercantile = 17,
BookSkill_Security = 18,
BookSkill_Sneak = 19,
BookSkill_Acrobatics = 14,
BookSkill_LightArmor = 15,
BookSkill_Marksman = 16,
BookSkill_Mercantile = 17,
BookSkill_Security = 18,
BookSkill_Sneak = 19,
BookSkill_Speechcraft = 20
};
struct Data
{
std::uint8_t flags;
std::uint8_t type; // TES5 only
std::uint8_t flags;
std::uint8_t type; // TES5 only
std::uint32_t teaches; // TES5 only
std::int8_t bookSkill; // not in TES5
std::uint32_t value;
float weight;
float weight;
};
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -91,10 +91,10 @@ namespace ESM4
float mBoundRadius;
std::string mText;
FormId mScriptId;
FormId mScriptId;
std::string mIcon;
std::uint16_t mEnchantmentPoints;
FormId mEnchantment;
FormId mEnchantment;
Data mData;
@ -102,9 +102,9 @@ namespace ESM4
FormId mDropSound;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,9 +26,9 @@
*/
#include "loadbptd.hpp"
#include <stdexcept>
#include <iostream> // FIXME: testing only
#include <cstring>
#include <iostream> // FIXME: testing only
#include <stdexcept>
#include "reader.hpp"
//#include "writer.hpp"
@ -48,7 +48,7 @@ void ESM4::BodyPartData::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
BodyPart bodyPart;
bodyPart.clear();
@ -58,15 +58,33 @@ void ESM4::BodyPartData::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_BPTN: reader.getLocalizedString(bodyPart.mPartName); break;
case ESM4::SUB_BPNN: reader.getZString(bodyPart.mNodeName); break;
case ESM4::SUB_BPNT: reader.getZString(bodyPart.mVATSTarget); break;
case ESM4::SUB_BPNI: reader.getZString(bodyPart.mIKStartNode); break;
case ESM4::SUB_BPND: reader.get(bodyPart.mData); break;
case ESM4::SUB_NAM1: reader.getZString(bodyPart.mLimbReplacementModel); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_BPTN:
reader.getLocalizedString(bodyPart.mPartName);
break;
case ESM4::SUB_BPNN:
reader.getZString(bodyPart.mNodeName);
break;
case ESM4::SUB_BPNT:
reader.getZString(bodyPart.mVATSTarget);
break;
case ESM4::SUB_BPNI:
reader.getZString(bodyPart.mIKStartNode);
break;
case ESM4::SUB_BPND:
reader.get(bodyPart.mData);
break;
case ESM4::SUB_NAM1:
reader.getZString(bodyPart.mLimbReplacementModel);
break;
case ESM4::SUB_NAM4: // FIXME: assumed occurs last
{
reader.getZString(bodyPart.mGoreEffectsTarget); // target bone
@ -81,7 +99,7 @@ void ESM4::BodyPartData::load(ESM4::Reader& reader)
case ESM4::SUB_MODS:
case ESM4::SUB_MODT:
{
//std::cout << "BPTD " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "BPTD " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -90,14 +108,14 @@ void ESM4::BodyPartData::load(ESM4::Reader& reader)
}
}
//if (mEditorId == "DefaultBodyPartData")
//std::cout << "BPTD: " << mEditorId << std::endl; // FIXME: testing only
// if (mEditorId == "DefaultBodyPartData")
// std::cout << "BPTD: " << mEditorId << std::endl; // FIXME: testing only
}
//void ESM4::BodyPartData::save(ESM4::Writer& writer) const
// void ESM4::BodyPartData::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::BodyPartData::blank()
// void ESM4::BodyPartData::blank()
//{
//}
// }

View file

@ -61,7 +61,7 @@ namespace ESM4
std::uint8_t partType;
std::uint8_t healthPercent;
std::int8_t actorValue; //(Actor Values)
std::int8_t actorValue; //(Actor Values)
std::uint8_t toHitChance;
std::uint8_t explExplosionChance; // %
@ -76,7 +76,7 @@ namespace ESM4
FormId sevExplosion;
float sevDebrisScale;
//Struct - Gore Effects Positioning
// Struct - Gore Effects Positioning
float transX;
float transY;
float transZ;
@ -106,7 +106,7 @@ namespace ESM4
void clear();
};
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -116,9 +116,9 @@ namespace ESM4
std::vector<BodyPart> mBodyParts;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -31,8 +31,8 @@
#endif
#include <cassert>
#include <stdexcept>
#include <cfloat> // FLT_MAX for gcc
#include <stdexcept>
#include <iostream> // FIXME: debug only
@ -50,7 +50,7 @@ void ESM4::Cell::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
mParent = reader.currWorld();
reader.clearCellGrid(); // clear until XCLC FIXME: somehow do this automatically?
@ -59,13 +59,13 @@ void ESM4::Cell::load(ESM4::Reader& reader)
// To workaround this issue put a default value if group is "exterior sub cell" and its
// grid from label is "0 0". Note the reversed X/Y order (no matter since they're both 0
// anyway).
if (reader.grp().type == ESM4::Grp_ExteriorSubCell
&& reader.grp().label.grid[1] == 0 && reader.grp().label.grid[0] == 0)
if (reader.grp().type == ESM4::Grp_ExteriorSubCell && reader.grp().label.grid[1] == 0
&& reader.grp().label.grid[0] == 0)
{
ESM4::CellGrid currCellGrid;
currCellGrid.grid.x = 0;
currCellGrid.grid.y = 0;
reader.setCurrCellGrid(currCellGrid); // side effect: sets mCellGridValid true
reader.setCurrCellGrid(currCellGrid); // side effect: sets mCellGridValid true
}
// WARN: we need to call setCurrCell (and maybe setCurrCellGrid?) again before loading
@ -83,7 +83,7 @@ void ESM4::Cell::load(ESM4::Reader& reader)
case ESM4::SUB_EDID:
{
if (!reader.getZString(mEditorId))
throw std::runtime_error ("CELL EDID data read error");
throw std::runtime_error("CELL EDID data read error");
#if 0
std::string padding;
padding.insert(0, reader.stackSize()*2, ' ');
@ -94,7 +94,7 @@ void ESM4::Cell::load(ESM4::Reader& reader)
case ESM4::SUB_XCLC:
{
//(X, Y) grid location of the cell followed by flags. Always in
//exterior cells and never in interior cells.
// exterior cells and never in interior cells.
//
// int32 - X
// int32 - Y
@ -127,7 +127,9 @@ void ESM4::Cell::load(ESM4::Reader& reader)
break;
}
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_DATA:
{
if (esmVer == ESM::VER_094 || esmVer == ESM::VER_170 || isFONV)
@ -151,7 +153,7 @@ void ESM4::Cell::load(ESM4::Reader& reader)
}
case ESM4::SUB_XCLR: // for exterior cells
{
mRegions.resize(subHdr.dataSize/sizeof(FormId));
mRegions.resize(subHdr.dataSize / sizeof(FormId));
for (std::vector<FormId>::iterator it = mRegions.begin(); it != mRegions.end(); ++it)
{
reader.getFormId(*it);
@ -163,11 +165,21 @@ void ESM4::Cell::load(ESM4::Reader& reader)
}
break;
}
case ESM4::SUB_XOWN: reader.getFormId(mOwner); break;
case ESM4::SUB_XGLB: reader.getFormId(mGlobal); break; // Oblivion only?
case ESM4::SUB_XCCM: reader.getFormId(mClimate); break;
case ESM4::SUB_XCWT: reader.getFormId(mWater); break;
case ESM4::SUB_XCLW: reader.get(mWaterHeight); break;
case ESM4::SUB_XOWN:
reader.getFormId(mOwner);
break;
case ESM4::SUB_XGLB:
reader.getFormId(mGlobal);
break; // Oblivion only?
case ESM4::SUB_XCCM:
reader.getFormId(mClimate);
break;
case ESM4::SUB_XCWT:
reader.getFormId(mWater);
break;
case ESM4::SUB_XCLW:
reader.get(mWaterHeight);
break;
case ESM4::SUB_XCLL:
{
if (esmVer == ESM::VER_094 || esmVer == ESM::VER_170 || isFONV)
@ -187,11 +199,21 @@ void ESM4::Cell::load(ESM4::Reader& reader)
break;
}
case ESM4::SUB_XCMT: reader.get(mMusicType); break; // Oblivion only?
case ESM4::SUB_LTMP: reader.getFormId(mLightingTemplate); break;
case ESM4::SUB_LNAM: reader.get(mLightingTemplateFlags); break; // seems to always follow LTMP
case ESM4::SUB_XCMO: reader.getFormId(mMusic); break;
case ESM4::SUB_XCAS: reader.getFormId(mAcousticSpace); break;
case ESM4::SUB_XCMT:
reader.get(mMusicType);
break; // Oblivion only?
case ESM4::SUB_LTMP:
reader.getFormId(mLightingTemplate);
break;
case ESM4::SUB_LNAM:
reader.get(mLightingTemplateFlags);
break; // seems to always follow LTMP
case ESM4::SUB_XCMO:
reader.getFormId(mMusic);
break;
case ESM4::SUB_XCAS:
reader.getFormId(mAcousticSpace);
break;
case ESM4::SUB_TVDT:
case ESM4::SUB_MHDT:
case ESM4::SUB_XCGD:
@ -208,7 +230,7 @@ void ESM4::Cell::load(ESM4::Reader& reader)
case ESM4::SUB_XCET: // FO3
case ESM4::SUB_IMPF: // FO3 Zeta
{
//std::cout << "CELL " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "CELL " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -218,10 +240,8 @@ void ESM4::Cell::load(ESM4::Reader& reader)
}
}
//void ESM4::Cell::save(ESM4::Writer& writer) const
// void ESM4::Cell::save(ESM4::Writer& writer) const
//{
//}
// }
void ESM4::Cell::blank()
{
}
void ESM4::Cell::blank() {}

View file

@ -42,26 +42,26 @@ namespace ESM4
struct CellGroup;
typedef std::uint32_t FormId;
enum CellFlags // TES4 TES5
{ // ----------------------- ------------------------------------
CELL_Interior = 0x0001, // Can't travel from here Interior
CELL_HasWater = 0x0002, // Has water (Int) Has Water (Int)
CELL_NoTravel = 0x0004, // not Can't Travel From Here(Int only)
CELL_HideLand = 0x0008, // Force hide land (Ext) No LOD Water
// Oblivion interior (Int)
CELL_Public = 0x0020, // Public place Public Area
CELL_HandChgd = 0x0040, // Hand changed Hand Changed
CELL_QuasiExt = 0x0080, // Behave like exterior Show Sky
CELL_SkyLight = 0x0100 // Use Sky Lighting
enum CellFlags // TES4 TES5
{ // ----------------------- ------------------------------------
CELL_Interior = 0x0001, // Can't travel from here Interior
CELL_HasWater = 0x0002, // Has water (Int) Has Water (Int)
CELL_NoTravel = 0x0004, // not Can't Travel From Here(Int only)
CELL_HideLand = 0x0008, // Force hide land (Ext) No LOD Water
// Oblivion interior (Int)
CELL_Public = 0x0020, // Public place Public Area
CELL_HandChgd = 0x0040, // Hand changed Hand Changed
CELL_QuasiExt = 0x0080, // Behave like exterior Show Sky
CELL_SkyLight = 0x0100 // Use Sky Lighting
};
// Unlike TES3, multiple cells can have the same exterior co-ordinates.
// The cells need to be organised under world spaces.
struct Cell
{
FormId mParent; // world formId (for grouping cells), from the loading sequence
FormId mParent; // world formId (for grouping cells), from the loading sequence
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -75,24 +75,24 @@ namespace ESM4
FormId mGlobal;
FormId mClimate;
FormId mWater;
float mWaterHeight;
float mWaterHeight;
std::vector<FormId> mRegions;
Lighting mLighting;
FormId mLightingTemplate; // FO3/FONV
FormId mLightingTemplate; // FO3/FONV
std::uint32_t mLightingTemplateFlags; // FO3/FONV
FormId mMusic; // FO3/FONV
FormId mMusic; // FO3/FONV
FormId mAcousticSpace; // FO3/FONV
// TES4: 0 = default, 1 = public, 2 = dungeon
// FO3/FONV have more types (not sure how they are used, however)
std::uint8_t mMusicType;
CellGroup *mCellGroup;
CellGroup* mCellGroup;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
void blank();
};

View file

@ -38,22 +38,30 @@
void ESM4::Class::load(ESM4::Reader& reader)
{
//mFormId = reader.adjustFormId(reader.hdr().record.id); // FIXME: use master adjusted?
// mFormId = reader.adjustFormId(reader.hdr().record.id); // FIXME: use master adjusted?
mFormId = reader.hdr().record.id;
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_DESC: reader.getLocalizedString(mDesc); break;
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_DESC:
reader.getLocalizedString(mDesc);
break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_DATA:
{
//std::cout << "CLAS " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "CLAS " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -63,10 +71,10 @@ void ESM4::Class::load(ESM4::Reader& reader)
}
}
//void ESM4::Class::save(ESM4::Writer& writer) const
// void ESM4::Class::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Class::blank()
// void ESM4::Class::blank()
//{
//}
// }

View file

@ -44,7 +44,7 @@ namespace ESM4
std::uint32_t attr;
};
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -54,9 +54,9 @@ namespace ESM4
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& reader) const;
// void save(ESM4::Writer& reader) const;
//void blank();
// void blank();
};
}

View file

@ -26,8 +26,8 @@
*/
#include "loadclfm.hpp"
#include <stdexcept>
#include <iostream> // FIXME: for debugging only
#include <stdexcept>
#include "reader.hpp"
//#include "writer.hpp"
@ -36,15 +36,19 @@ void ESM4::Colour::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_CNAM:
{
reader.get(mColour.red);
@ -61,18 +65,18 @@ void ESM4::Colour::load(ESM4::Reader& reader)
break;
}
default:
//std::cout << "CLFM " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
//reader.skipSubRecordData();
// std::cout << "CLFM " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// reader.skipSubRecordData();
throw std::runtime_error("ESM4::CLFM::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
}
//void ESM4::Colour::save(ESM4::Writer& writer) const
// void ESM4::Colour::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Colour::blank()
// void ESM4::Colour::blank()
//{
//}
// }

View file

@ -48,7 +48,7 @@ namespace ESM4
struct Colour
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -58,9 +58,9 @@ namespace ESM4
std::uint32_t mPlayable;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -36,27 +36,55 @@ void ESM4::Clothing::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getZString(mFullName); break;
case ESM4::SUB_DATA: reader.get(mData); break;
case ESM4::SUB_BMDT: reader.get(mClothingFlags); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_ENAM: reader.getFormId(mEnchantment); break;
case ESM4::SUB_ANAM: reader.get(mEnchantmentPoints); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_MODL: reader.getZString(mModelMale); break;
case ESM4::SUB_MOD2: reader.getZString(mModelMaleWorld); break;
case ESM4::SUB_MOD3: reader.getZString(mModelFemale); break;
case ESM4::SUB_MOD4: reader.getZString(mModelFemaleWorld); break;
case ESM4::SUB_ICON: reader.getZString(mIconMale); break;
case ESM4::SUB_ICO2: reader.getZString(mIconFemale); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getZString(mFullName);
break;
case ESM4::SUB_DATA:
reader.get(mData);
break;
case ESM4::SUB_BMDT:
reader.get(mClothingFlags);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_ENAM:
reader.getFormId(mEnchantment);
break;
case ESM4::SUB_ANAM:
reader.get(mEnchantmentPoints);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_MODL:
reader.getZString(mModelMale);
break;
case ESM4::SUB_MOD2:
reader.getZString(mModelMaleWorld);
break;
case ESM4::SUB_MOD3:
reader.getZString(mModelFemale);
break;
case ESM4::SUB_MOD4:
reader.getZString(mModelFemaleWorld);
break;
case ESM4::SUB_ICON:
reader.getZString(mIconMale);
break;
case ESM4::SUB_ICO2:
reader.getZString(mIconFemale);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_MO2B:
case ESM4::SUB_MO3B:
@ -65,7 +93,7 @@ void ESM4::Clothing::load(ESM4::Reader& reader)
case ESM4::SUB_MO3T:
case ESM4::SUB_MO4T:
{
//std::cout << "CLOT " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "CLOT " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -73,14 +101,14 @@ void ESM4::Clothing::load(ESM4::Reader& reader)
throw std::runtime_error("ESM4::CLOT::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
//if ((mClothingFlags&0xffff) == 0x02) // only hair
//std::cout << "only hair " << mEditorId << std::endl;
// if ((mClothingFlags&0xffff) == 0x02) // only hair
// std::cout << "only hair " << mEditorId << std::endl;
}
//void ESM4::Clothing::save(ESM4::Writer& writer) const
// void ESM4::Clothing::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Clothing::blank()
// void ESM4::Clothing::blank()
//{
//}
// }

View file

@ -42,12 +42,12 @@ namespace ESM4
#pragma pack(push, 1)
struct Data
{
std::uint32_t value; // gold
float weight;
std::uint32_t value; // gold
float weight;
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -56,7 +56,7 @@ namespace ESM4
std::string mModelMaleWorld;
std::string mModelFemale;
std::string mModelFemaleWorld;
std::string mIconMale; // texture
std::string mIconMale; // texture
std::string mIconFemale; // texture
std::string mModel; // FIXME: for OpenCS
@ -64,16 +64,16 @@ namespace ESM4
float mBoundRadius;
std::uint32_t mClothingFlags; // see Armor::ArmorFlags for the values
FormId mScriptId;
FormId mScriptId;
std::uint16_t mEnchantmentPoints;
FormId mEnchantment;
FormId mEnchantment;
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,15 +35,19 @@ void ESM4::Container::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_DATA:
{
reader.get(mDataFlags);
@ -58,11 +62,21 @@ void ESM4::Container::load(ESM4::Reader& reader)
mInventory.push_back(inv);
break;
}
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_SNAM: reader.getFormId(mOpenSound); break;
case ESM4::SUB_QNAM: reader.getFormId(mCloseSound); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_SNAM:
reader.getFormId(mOpenSound);
break;
case ESM4::SUB_QNAM:
reader.getFormId(mCloseSound);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_MODS: // TES5 only
case ESM4::SUB_VMAD: // TES5 only
@ -76,7 +90,7 @@ void ESM4::Container::load(ESM4::Reader& reader)
case ESM4::SUB_DMDT: // FONV
case ESM4::SUB_RNAM: // FONV
{
//std::cout << "CONT " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "CONT " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -86,10 +100,10 @@ void ESM4::Container::load(ESM4::Reader& reader)
}
}
//void ESM4::Container::save(ESM4::Writer& writer) const
// void ESM4::Container::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Container::blank()
// void ESM4::Container::blank()
//{
//}
// }

View file

@ -41,7 +41,7 @@ namespace ESM4
struct Container
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -59,9 +59,9 @@ namespace ESM4
std::vector<InventoryItem> mInventory;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -31,11 +31,11 @@
#endif
#include <cassert>
#include <stdexcept>
#include <cstring>
#include <string>
#include <sstream>
#include <iostream> // FIXME
#include <sstream>
#include <stdexcept>
#include <string>
#include "reader.hpp"
//#include "writer.hpp"
@ -44,16 +44,22 @@ void ESM4::Creature::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getZString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getZString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_CNTO:
{
static InventoryItem inv; // FIXME: use unique_ptr here?
@ -82,8 +88,12 @@ void ESM4::Creature::load(ESM4::Reader& reader)
reader.adjustFormId(mFaction.faction);
break;
}
case ESM4::SUB_INAM: reader.getFormId(mDeathItem); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_INAM:
reader.getFormId(mDeathItem);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_AIDT:
{
if (subHdr.dataSize == 20) // FO3
@ -94,7 +104,7 @@ void ESM4::Creature::load(ESM4::Reader& reader)
}
case ESM4::SUB_ACBS:
{
//if (esmVer == ESM::VER_094 || esmVer == ESM::VER_170 || mIsFONV)
// if (esmVer == ESM::VER_094 || esmVer == ESM::VER_170 || mIsFONV)
if (subHdr.dataSize == 24)
reader.get(mBaseConfig);
else
@ -109,20 +119,40 @@ void ESM4::Creature::load(ESM4::Reader& reader)
reader.get(mData);
break;
}
case ESM4::SUB_ZNAM: reader.getFormId(mCombatStyle); break;
case ESM4::SUB_CSCR: reader.getFormId(mSoundBase); break;
case ESM4::SUB_CSDI: reader.getFormId(mSound); break;
case ESM4::SUB_CSDC: reader.get(mSoundChance); break;
case ESM4::SUB_BNAM: reader.get(mBaseScale); break;
case ESM4::SUB_TNAM: reader.get(mTurningSpeed); break;
case ESM4::SUB_WNAM: reader.get(mFootWeight); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_NAM0: reader.getZString(mBloodSpray); break;
case ESM4::SUB_NAM1: reader.getZString(mBloodDecal); break;
case ESM4::SUB_ZNAM:
reader.getFormId(mCombatStyle);
break;
case ESM4::SUB_CSCR:
reader.getFormId(mSoundBase);
break;
case ESM4::SUB_CSDI:
reader.getFormId(mSound);
break;
case ESM4::SUB_CSDC:
reader.get(mSoundChance);
break;
case ESM4::SUB_BNAM:
reader.get(mBaseScale);
break;
case ESM4::SUB_TNAM:
reader.get(mTurningSpeed);
break;
case ESM4::SUB_WNAM:
reader.get(mFootWeight);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_NAM0:
reader.getZString(mBloodSpray);
break;
case ESM4::SUB_NAM1:
reader.getZString(mBloodDecal);
break;
case ESM4::SUB_NIFZ:
{
if (!reader.getZeroTerminatedStringArray(mNif))
throw std::runtime_error ("CREA NIFZ data read error");
throw std::runtime_error("CREA NIFZ data read error");
break;
}
case ESM4::SUB_NIFT:
@ -143,10 +173,12 @@ void ESM4::Creature::load(ESM4::Reader& reader)
case ESM4::SUB_KFFZ:
{
if (!reader.getZeroTerminatedStringArray(mKf))
throw std::runtime_error ("CREA KFFZ data read error");
throw std::runtime_error("CREA KFFZ data read error");
break;
}
case ESM4::SUB_TPLT: reader.get(mBaseTemplate); break; // FO3
case ESM4::SUB_TPLT:
reader.get(mBaseTemplate);
break; // FO3
case ESM4::SUB_PNAM: // FO3/FONV/TES5
{
FormId bodyPart;
@ -173,7 +205,7 @@ void ESM4::Creature::load(ESM4::Reader& reader)
case ESM4::SUB_DMDT: // FO3
case ESM4::SUB_COED: // FO3
{
//std::cout << "CREA " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "CREA " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -183,10 +215,10 @@ void ESM4::Creature::load(ESM4::Reader& reader)
}
}
//void ESM4::Creature::save(ESM4::Writer& writer) const
// void ESM4::Creature::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Creature::blank()
// void ESM4::Creature::blank()
//{
//}
// }

View file

@ -43,58 +43,58 @@ namespace ESM4
{
enum ACBS_TES4
{
TES4_Essential = 0x000002,
TES4_WeapAndShield = 0x000004,
TES4_Respawn = 0x000008,
TES4_PCLevelOffset = 0x000080,
TES4_Essential = 0x000002,
TES4_WeapAndShield = 0x000004,
TES4_Respawn = 0x000008,
TES4_PCLevelOffset = 0x000080,
TES4_NoLowLevelProc = 0x000200,
TES4_NoHead = 0x008000, // different meaning to npc_
TES4_NoRightArm = 0x010000,
TES4_NoLeftArm = 0x020000,
TES4_NoCombatWater = 0x040000,
TES4_NoShadow = 0x080000,
TES4_NoCorpseCheck = 0x100000 // opposite of npc_
TES4_NoHead = 0x008000, // different meaning to npc_
TES4_NoRightArm = 0x010000,
TES4_NoLeftArm = 0x020000,
TES4_NoCombatWater = 0x040000,
TES4_NoShadow = 0x080000,
TES4_NoCorpseCheck = 0x100000 // opposite of npc_
};
enum ACBS_FO3
{
FO3_Biped = 0x00000001,
FO3_Essential = 0x00000002,
FO3_Weap_Shield = 0x00000004,
FO3_Respawn = 0x00000008,
FO3_CanSwim = 0x00000010,
FO3_CanFly = 0x00000020,
FO3_CanWalk = 0x00000040,
FO3_PCLevelMult = 0x00000080,
FO3_Biped = 0x00000001,
FO3_Essential = 0x00000002,
FO3_Weap_Shield = 0x00000004,
FO3_Respawn = 0x00000008,
FO3_CanSwim = 0x00000010,
FO3_CanFly = 0x00000020,
FO3_CanWalk = 0x00000040,
FO3_PCLevelMult = 0x00000080,
FO3_NoLowLevelProc = 0x00000200,
FO3_NoBloodSpray = 0x00000800,
FO3_NoBloodDecal = 0x00001000,
FO3_NoHead = 0x00008000,
FO3_NoRightArm = 0x00010000,
FO3_NoLeftArm = 0x00020000,
FO3_NoWaterCombat = 0x00040000,
FO3_NoShadow = 0x00080000,
FO3_NoVATSMelee = 0x00100000,
FO3_AllowPCDialog = 0x00200000,
FO3_NoOpenDoors = 0x00400000,
FO3_Immobile = 0x00800000,
FO3_TiltFrontBack = 0x01000000,
FO3_TiltLeftRight = 0x02000000,
FO3_NoKnockdown = 0x04000000,
FO3_NotPushable = 0x08000000,
FO3_NoBloodSpray = 0x00000800,
FO3_NoBloodDecal = 0x00001000,
FO3_NoHead = 0x00008000,
FO3_NoRightArm = 0x00010000,
FO3_NoLeftArm = 0x00020000,
FO3_NoWaterCombat = 0x00040000,
FO3_NoShadow = 0x00080000,
FO3_NoVATSMelee = 0x00100000,
FO3_AllowPCDialog = 0x00200000,
FO3_NoOpenDoors = 0x00400000,
FO3_Immobile = 0x00800000,
FO3_TiltFrontBack = 0x01000000,
FO3_TiltLeftRight = 0x02000000,
FO3_NoKnockdown = 0x04000000,
FO3_NotPushable = 0x08000000,
FO3_AllowPickpoket = 0x10000000,
FO3_IsGhost = 0x20000000,
FO3_NoRotateHead = 0x40000000,
FO3_Invulnerable = 0x80000000
FO3_IsGhost = 0x20000000,
FO3_NoRotateHead = 0x40000000,
FO3_Invulnerable = 0x80000000
};
#pragma pack(push, 1)
struct Data
{
std::uint8_t unknown;
std::uint8_t combat;
std::uint8_t magic;
std::uint8_t stealth;
std::uint8_t unknown;
std::uint8_t combat;
std::uint8_t magic;
std::uint8_t stealth;
std::uint16_t soul;
std::uint16_t health;
std::uint16_t unknown2;
@ -103,7 +103,7 @@ namespace ESM4
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -118,7 +118,7 @@ namespace ESM4
std::vector<FormId> mAIPackages;
ActorBaseConfig mBaseConfig;
ActorFaction mFaction;
Data mData;
Data mData;
FormId mCombatStyle;
FormId mSoundBase;
FormId mSound;
@ -135,13 +135,13 @@ namespace ESM4
std::vector<InventoryItem> mInventory;
FormId mBaseTemplate; // FO3/FONV
FormId mBaseTemplate; // FO3/FONV
std::vector<FormId> mBodyParts; // FO3/FONV
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,9 +26,9 @@
*/
#include "loaddial.hpp"
#include <stdexcept>
#include <cstring>
#include <iostream> // FIXME: for debugging only
#include <stdexcept>
#include "reader.hpp"
//#include "writer.hpp"
@ -37,15 +37,19 @@ void ESM4::Dialogue::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getZString(mTopicName); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getZString(mTopicName);
break;
case ESM4::SUB_QSTI:
{
FormId questId;
@ -82,8 +86,12 @@ void ESM4::Dialogue::load(ESM4::Reader& reader)
break;
}
case ESM4::SUB_PNAM: reader.get(mPriority); break; // FO3/FONV
case ESM4::SUB_TDUM: reader.getZString(mTextDumb); break; // FONV
case ESM4::SUB_PNAM:
reader.get(mPriority);
break; // FO3/FONV
case ESM4::SUB_TDUM:
reader.getZString(mTextDumb);
break; // FONV
case ESM4::SUB_SCRI:
case ESM4::SUB_INFC: // FONV info connection
case ESM4::SUB_INFX: // FONV info index
@ -92,8 +100,8 @@ void ESM4::Dialogue::load(ESM4::Reader& reader)
case ESM4::SUB_SNAM: // TES5
case ESM4::SUB_TIFC: // TES5
{
//std::cout << "DIAL " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// std::cout << "DIAL " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
reader.skipSubRecordData();
break;
}
@ -103,10 +111,10 @@ void ESM4::Dialogue::load(ESM4::Reader& reader)
}
}
//void ESM4::Dialogue::save(ESM4::Writer& writer) const
// void ESM4::Dialogue::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Dialogue::blank()
// void ESM4::Dialogue::blank()
//{
//}
// }

View file

@ -31,8 +31,8 @@
#include <string>
#include <vector>
#include "formid.hpp"
#include "dialogue.hpp" // DialType
#include "formid.hpp"
namespace ESM4
{
@ -41,7 +41,7 @@ namespace ESM4
struct Dialogue
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -52,15 +52,15 @@ namespace ESM4
std::string mTextDumb; // FIXME: temp name
bool mDoAllBeforeRepeat; // TES5 only
std::uint8_t mDialType; // DialType
std::uint8_t mDialType; // DialType
std::uint8_t mDialFlags; // FO3/FONV: 0x1 rumours, 0x2 top-level
float mPriority;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -28,8 +28,8 @@
*/
#include "loaddobj.hpp"
#include <stdexcept>
#include <cstring>
#include <stdexcept>
//#include <iostream> // FIXME: for debugging only
//#include "formid.hpp"
@ -41,14 +41,16 @@ void ESM4::DefaultObj::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break; // "DefaultObjectManager"
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break; // "DefaultObjectManager"
case ESM4::SUB_DATA:
{
reader.getFormId(mData.stimpack);
@ -94,24 +96,24 @@ void ESM4::DefaultObj::load(ESM4::Reader& reader)
}
case ESM4::SUB_DNAM:
{
//std::cout << "DOBJ " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// std::cout << "DOBJ " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
reader.skipSubRecordData();
break;
}
default:
//std::cout << "DOBJ " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
//reader.skipSubRecordData();
// std::cout << "DOBJ " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// reader.skipSubRecordData();
throw std::runtime_error("ESM4::DOBJ::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
}
//void ESM4::DefaultObj::save(ESM4::Writer& writer) const
// void ESM4::DefaultObj::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::DefaultObj::blank()
// void ESM4::DefaultObj::blank()
//{
//}
// }

View file

@ -80,7 +80,7 @@ namespace ESM4
struct DefaultObj
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -88,9 +88,9 @@ namespace ESM4
Defaults mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,23 +35,43 @@ void ESM4::Door::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_SNAM: reader.getFormId(mOpenSound); break;
case ESM4::SUB_ANAM: reader.getFormId(mCloseSound); break;
case ESM4::SUB_BNAM: reader.getFormId(mLoopSound); break;
case ESM4::SUB_FNAM: reader.get(mDoorFlags); break;
case ESM4::SUB_TNAM: reader.getFormId(mRandomTeleport); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_SNAM:
reader.getFormId(mOpenSound);
break;
case ESM4::SUB_ANAM:
reader.getFormId(mCloseSound);
break;
case ESM4::SUB_BNAM:
reader.getFormId(mLoopSound);
break;
case ESM4::SUB_FNAM:
reader.get(mDoorFlags);
break;
case ESM4::SUB_TNAM:
reader.getFormId(mRandomTeleport);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_MODS:
case ESM4::SUB_OBND:
@ -62,7 +82,7 @@ void ESM4::Door::load(ESM4::Reader& reader)
case ESM4::SUB_DMDL: // FO3
case ESM4::SUB_DMDT: // FO3
{
//std::cout << "DOOR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "DOOR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -72,10 +92,10 @@ void ESM4::Door::load(ESM4::Reader& reader)
}
}
//void ESM4::Door::save(ESM4::Writer& writer) const
// void ESM4::Door::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Door::blank()
// void ESM4::Door::blank()
//{
//}
// }

View file

@ -41,13 +41,13 @@ namespace ESM4
{
enum Flags
{
Flag_OblivionGate = 0x01,
Flag_OblivionGate = 0x01,
Flag_AutomaticDoor = 0x02,
Flag_Hidden = 0x04,
Flag_MinimalUse = 0x08
Flag_Hidden = 0x04,
Flag_MinimalUse = 0x08
};
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -58,15 +58,15 @@ namespace ESM4
std::uint8_t mDoorFlags;
FormId mScriptId;
FormId mOpenSound; // SNDR for TES5, SOUN for others
FormId mOpenSound; // SNDR for TES5, SOUN for others
FormId mCloseSound; // SNDR for TES5, SOUN for others
FormId mLoopSound;
FormId mRandomTeleport;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,27 +35,35 @@ void ESM4::Eyes::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_DATA: reader.get(mData); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_DATA:
reader.get(mData);
break;
default:
throw std::runtime_error("ESM4::EYES::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
}
//void ESM4::Eyes::save(ESM4::Writer& writer) const
// void ESM4::Eyes::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Eyes::blank()
// void ESM4::Eyes::blank()
//{
//}
// }

View file

@ -46,19 +46,19 @@ namespace ESM4
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
std::string mFullName;
std::string mIcon; // texture
std::string mIcon; // texture
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,21 +35,37 @@ void ESM4::Flora::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_PFIG: reader.getFormId(mIngredient); break;
case ESM4::SUB_PFPC: reader.get(mPercentHarvest); break;
case ESM4::SUB_SNAM: reader.getFormId(mSound); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_PFIG:
reader.getFormId(mIngredient);
break;
case ESM4::SUB_PFPC:
reader.get(mPercentHarvest);
break;
case ESM4::SUB_SNAM:
reader.getFormId(mSound);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_MODS:
case ESM4::SUB_FNAM:
@ -58,7 +74,7 @@ void ESM4::Flora::load(ESM4::Reader& reader)
case ESM4::SUB_RNAM:
case ESM4::SUB_VMAD:
{
//std::cout << "FLOR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "FLOR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -68,10 +84,10 @@ void ESM4::Flora::load(ESM4::Reader& reader)
}
}
//void ESM4::Flora::save(ESM4::Writer& writer) const
// void ESM4::Flora::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Flora::blank()
// void ESM4::Flora::blank()
//{
//}
// }

View file

@ -47,11 +47,17 @@ namespace ESM4
std::uint8_t autumn;
std::uint8_t winter;
Production() : spring(0), summer(0), autumn(0), winter(0) {}
Production()
: spring(0)
, summer(0)
, autumn(0)
, winter(0)
{
}
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -66,9 +72,9 @@ namespace ESM4
Production mPercentHarvest;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -36,14 +36,16 @@ void ESM4::FormIdList::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_LNAM:
{
FormId formId;
@ -54,19 +56,19 @@ void ESM4::FormIdList::load(ESM4::Reader& reader)
break;
}
default:
//std::cout << "FLST " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
//reader.skipSubRecordData();
// std::cout << "FLST " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// reader.skipSubRecordData();
throw std::runtime_error("ESM4::FLST::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
//std::cout << "flst " << mEditorId << " " << mObjects.size() << std::endl; // FIXME
// std::cout << "flst " << mEditorId << " " << mObjects.size() << std::endl; // FIXME
}
//void ESM4::FormIdList::save(ESM4::Writer& writer) const
// void ESM4::FormIdList::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::FormIdList::blank()
// void ESM4::FormIdList::blank()
//{
//}
// }

View file

@ -40,7 +40,7 @@ namespace ESM4
struct FormIdList
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -48,9 +48,9 @@ namespace ESM4
std::vector<FormId> mObjects;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,19 +35,31 @@ void ESM4::Furniture::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_MNAM: reader.get(mActiveMarkerFlags); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_MNAM:
reader.get(mActiveMarkerFlags);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_DEST:
case ESM4::SUB_DSTD:
@ -67,7 +79,7 @@ void ESM4::Furniture::load(ESM4::Reader& reader)
case ESM4::SUB_WBDT:
case ESM4::SUB_XMRK:
{
//std::cout << "FURN " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "FURN " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -77,10 +89,10 @@ void ESM4::Furniture::load(ESM4::Reader& reader)
}
}
//void ESM4::Furniture::save(ESM4::Writer& writer) const
// void ESM4::Furniture::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Furniture::blank()
// void ESM4::Furniture::blank()
//{
//}
// }

View file

@ -39,7 +39,7 @@ namespace ESM4
struct Furniture
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -52,9 +52,9 @@ namespace ESM4
std::uint32_t mActiveMarkerFlags;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,8 +26,8 @@
*/
#include "loadglob.hpp"
#include <stdexcept>
#include <iostream> // FIXME
#include <stdexcept>
#include "reader.hpp"
//#include "writer.hpp"
@ -36,16 +36,22 @@ void ESM4::GlobalVariable::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FNAM: reader.get(mType); break;
case ESM4::SUB_FLTV: reader.get(mValue); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FNAM:
reader.get(mType);
break;
case ESM4::SUB_FLTV:
reader.get(mValue);
break;
case ESM4::SUB_FULL:
case ESM4::SUB_MODL:
case ESM4::SUB_MODB:
@ -54,7 +60,7 @@ void ESM4::GlobalVariable::load(ESM4::Reader& reader)
case ESM4::SUB_OBND: // TES5
case ESM4::SUB_VMAD: // TES5
{
//std::cout << "GLOB " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "GLOB " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -64,10 +70,10 @@ void ESM4::GlobalVariable::load(ESM4::Reader& reader)
}
}
//void ESM4::GlobalVariable::save(ESM4::Writer& writer) const
// void ESM4::GlobalVariable::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::GlobalVariable::blank()
// void ESM4::GlobalVariable::blank()
//{
//}
// }

View file

@ -39,7 +39,7 @@ namespace ESM4
struct GlobalVariable
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -48,9 +48,9 @@ namespace ESM4
float mValue;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,21 +35,29 @@ void ESM4::Grass::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_DATA: reader.get(mData); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_DATA:
reader.get(mData);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_OBND:
{
//std::cout << "GRAS " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "GRAS " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -59,10 +67,10 @@ void ESM4::Grass::load(ESM4::Reader& reader)
}
}
//void ESM4::Grass::save(ESM4::Writer& writer) const
// void ESM4::Grass::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Grass::blank()
// void ESM4::Grass::blank()
//{
//}
// }

View file

@ -43,10 +43,10 @@ namespace ESM4
// unused fields are probably packing
struct Data
{
std::uint8_t density;
std::uint8_t minSlope;
std::uint8_t maxSlope;
std::uint8_t unused;
std::uint8_t density;
std::uint8_t minSlope;
std::uint8_t maxSlope;
std::uint8_t unused;
std::uint16_t distanceFromWater;
std::uint16_t unused2;
/*
@ -69,13 +69,13 @@ namespace ESM4
0x02 Uniform Scaling
0x04 Fit to Slope
*/
std::uint8_t flags;
std::uint8_t unused3;
std::uint8_t flags;
std::uint8_t unused3;
std::uint16_t unused4;
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -86,9 +86,9 @@ namespace ESM4
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -101,7 +101,7 @@ namespace ESM4
// NOTE: There may be many CELL records in one subblock
struct CellGroup
{
FormId mCell; // CELL record for this cell group
FormId mCell; // CELL record for this cell group
int mCellModIndex; // from which file to get the CELL record (e.g. may have been updated)
// For retrieving parent group size (for lazy loading or skipping) and sub-block number / grid
@ -131,7 +131,7 @@ namespace ESM4
// cache (modindex adjusted) formId's of children
// FIXME: also need file index + file context of all those that has type 8 GRUP
GroupTypeHeader mHdrPersist;
std::vector<FormId> mPersistent; // REFR, ACHR, ACRE
std::vector<FormId> mPersistent; // REFR, ACHR, ACRE
std::vector<FormId> mdelPersistent;
// FIXME: also need file index + file context of all those that has type 10 GRUP
@ -143,7 +143,7 @@ namespace ESM4
GroupTypeHeader mHdrTemp;
FormId mLand; // if present, assume only one LAND per exterior CELL
FormId mPgrd; // if present, seems to be the first record after LAND in Temp Cell Child GRUP
std::vector<FormId> mTemporary; // REFR, ACHR, ACRE
std::vector<FormId> mTemporary; // REFR, ACHR, ACRE
std::vector<FormId> mdelTemporary;
// need to keep modindex and context for lazy loading (of all the files that contribute

View file

@ -36,22 +36,34 @@ void ESM4::Hair::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getZString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_DATA: reader.get(mData); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getZString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_DATA:
reader.get(mData);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_MODT:
{
//std::cout << "HAIR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "HAIR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -61,10 +73,10 @@ void ESM4::Hair::load(ESM4::Reader& reader)
}
}
//void ESM4::Hair::save(ESM4::Writer& writer) const
// void ESM4::Hair::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Hair::blank()
// void ESM4::Hair::blank()
//{
//}
// }

View file

@ -46,22 +46,22 @@ namespace ESM4
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
std::string mFullName;
std::string mModel; // mesh
std::string mIcon; // texture
std::string mModel; // mesh
std::string mIcon; // texture
float mBoundRadius;
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,8 +26,8 @@
*/
#include "loadhdpt.hpp"
#include <stdexcept>
#include <optional>
#include <stdexcept>
//#include <iostream> // FIXME: testing only
#include "reader.hpp"
@ -37,7 +37,7 @@ void ESM4::HeadPart::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
std::optional<std::uint32_t> type;
@ -46,11 +46,21 @@ void ESM4::HeadPart::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_DATA: reader.get(mData); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_HNAM: reader.getFormId(mAdditionalPart); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_DATA:
reader.get(mData);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_HNAM:
reader.getFormId(mAdditionalPart);
break;
case ESM4::SUB_NAM0: // TES5
{
std::uint32_t value;
@ -65,22 +75,27 @@ void ESM4::HeadPart::load(ESM4::Reader& reader)
reader.getZString(file);
if (!type.has_value())
throw std::runtime_error("Failed to read ESM4 HDPT record: subrecord NAM0 does not precede subrecord NAM1: file type is unknown");
throw std::runtime_error(
"Failed to read ESM4 HDPT record: subrecord NAM0 does not precede subrecord NAM1: file type is "
"unknown");
if (*type >= mTriFile.size())
throw std::runtime_error("Failed to read ESM4 HDPT record: invalid file type: " + std::to_string(*type));
throw std::runtime_error(
"Failed to read ESM4 HDPT record: invalid file type: " + std::to_string(*type));
mTriFile[*type] = std::move(file);
break;
}
case ESM4::SUB_TNAM: reader.getFormId(mBaseTexture); break;
case ESM4::SUB_TNAM:
reader.getFormId(mBaseTexture);
break;
case ESM4::SUB_PNAM:
case ESM4::SUB_MODS:
case ESM4::SUB_MODT:
case ESM4::SUB_RNAM:
{
//std::cout << "HDPT " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "HDPT " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -90,10 +105,10 @@ void ESM4::HeadPart::load(ESM4::Reader& reader)
}
}
//void ESM4::HeadPart::save(ESM4::Writer& writer) const
// void ESM4::HeadPart::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::HeadPart::blank()
// void ESM4::HeadPart::blank()
//{
//}
// }

View file

@ -27,8 +27,8 @@
#ifndef ESM4_HDPT_H
#define ESM4_HDPT_H
#include <cstdint>
#include <array>
#include <cstdint>
#include "formid.hpp"
@ -39,7 +39,7 @@ namespace ESM4
struct HeadPart
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -54,9 +54,9 @@ namespace ESM4
FormId mBaseTexture;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,16 +35,22 @@ void ESM4::IdleAnimation::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_DNAM: reader.getZString(mCollision); break;
case ESM4::SUB_ENAM: reader.getZString(mEvent); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_DNAM:
reader.getZString(mCollision);
break;
case ESM4::SUB_ENAM:
reader.getZString(mEvent);
break;
case ESM4::SUB_ANAM:
{
reader.get(mParent);
@ -54,7 +60,7 @@ void ESM4::IdleAnimation::load(ESM4::Reader& reader)
case ESM4::SUB_CTDA: // formId
case ESM4::SUB_DATA: // formId
{
//std::cout << "IDLE " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "IDLE " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -64,10 +70,10 @@ void ESM4::IdleAnimation::load(ESM4::Reader& reader)
}
}
//void ESM4::IdleAnimation::save(ESM4::Writer& writer) const
// void ESM4::IdleAnimation::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::IdleAnimation::blank()
// void ESM4::IdleAnimation::blank()
//{
//}
// }

View file

@ -39,20 +39,20 @@ namespace ESM4
struct IdleAnimation
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
std::string mCollision;
std::string mEvent;
FormId mParent; // IDLE or AACT
FormId mPrevious;
FormId mParent; // IDLE or AACT
FormId mPrevious;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -36,7 +36,7 @@ void ESM4::IdleMarker::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
std::uint32_t esmVer = reader.esmVersion();
@ -45,8 +45,12 @@ void ESM4::IdleMarker::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_IDLF: reader.get(mIdleFlags); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_IDLF:
reader.get(mIdleFlags);
break;
case ESM4::SUB_IDLC:
{
if (subHdr.dataSize != 1) // FO3 can have 4?
@ -58,7 +62,9 @@ void ESM4::IdleMarker::load(ESM4::Reader& reader)
reader.get(mIdleCount);
break;
}
case ESM4::SUB_IDLT: reader.get(mIdleTimer); break;
case ESM4::SUB_IDLT:
reader.get(mIdleTimer);
break;
case ESM4::SUB_IDLA:
{
bool isFONV = esmVer == ESM::VER_132 || esmVer == ESM::VER_133 || esmVer == ESM::VER_134;
@ -75,7 +81,7 @@ void ESM4::IdleMarker::load(ESM4::Reader& reader)
}
case ESM4::SUB_OBND: // object bounds
{
//std::cout << "IDLM " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "IDLM " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -85,10 +91,10 @@ void ESM4::IdleMarker::load(ESM4::Reader& reader)
}
}
//void ESM4::IdleMarker::save(ESM4::Writer& writer) const
// void ESM4::IdleMarker::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::IdleMarker::blank()
// void ESM4::IdleMarker::blank()
//{
//}
// }

View file

@ -39,7 +39,7 @@ namespace ESM4
struct IdleMarker
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -51,9 +51,9 @@ namespace ESM4
std::vector<FormId> mIdleAnim;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -28,8 +28,8 @@
*/
#include "loadimod.hpp"
#include <stdexcept>
#include <iostream> // FIXME: for debugging only
#include <stdexcept>
#include "reader.hpp"
//#include "writer.hpp"
@ -38,14 +38,16 @@ void ESM4::ItemMod::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_OBND:
case ESM4::SUB_FULL:
case ESM4::SUB_MODL:
@ -57,24 +59,23 @@ void ESM4::ItemMod::load(ESM4::Reader& reader)
case ESM4::SUB_ZNAM:
case ESM4::SUB_DATA:
{
//std::cout << "IMOD " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// std::cout << "IMOD " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
reader.skipSubRecordData();
break;
}
default:
std::cout << "IMOD " << ESM::printName(subHdr.typeId) << " skipping..."
<< subHdr.dataSize << std::endl;
std::cout << "IMOD " << ESM::printName(subHdr.typeId) << " skipping..." << subHdr.dataSize << std::endl;
reader.skipSubRecordData();
//throw std::runtime_error("ESM4::IMOD::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
// throw std::runtime_error("ESM4::IMOD::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
}
//void ESM4::ItemMod::save(ESM4::Writer& writer) const
// void ESM4::ItemMod::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::ItemMod::blank()
// void ESM4::ItemMod::blank()
//{
//}
// }

View file

@ -41,15 +41,15 @@ namespace ESM4
struct ItemMod
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,9 +26,9 @@
*/
#include "loadinfo.hpp"
#include <stdexcept>
#include <cstring>
#include <iostream> // FIXME: for debugging only
#include <stdexcept>
#include "reader.hpp"
//#include "writer.hpp"
@ -37,7 +37,7 @@ void ESM4::DialogInfo::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
mEditorId = formIdToString(mFormId); // FIXME: quick workaround to use existing code
@ -49,8 +49,12 @@ void ESM4::DialogInfo::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_QSTI: reader.getFormId(mQuest); break; // FormId quest id
case ESM4::SUB_SNDD: reader.getFormId(mSound); break; // FO3 (not used in FONV?)
case ESM4::SUB_QSTI:
reader.getFormId(mQuest);
break; // FormId quest id
case ESM4::SUB_SNDD:
reader.getFormId(mSound);
break; // FO3 (not used in FONV?)
case ESM4::SUB_TRDT:
{
if (subHdr.dataSize == 16) // TES4
@ -66,9 +70,15 @@ void ESM4::DialogInfo::load(ESM4::Reader& reader)
break;
}
case ESM4::SUB_NAM1: reader.getZString(mResponse); break; // response text
case ESM4::SUB_NAM2: reader.getZString(mNotes); break; // actor notes
case ESM4::SUB_NAM3: reader.getZString(mEdits); break; // not in TES4
case ESM4::SUB_NAM1:
reader.getZString(mResponse);
break; // response text
case ESM4::SUB_NAM2:
reader.getZString(mNotes);
break; // actor notes
case ESM4::SUB_NAM3:
reader.getZString(mEdits);
break; // not in TES4
case ESM4::SUB_CTDA: // FIXME: how to detect if 1st/2nd param is a formid?
{
if (subHdr.dataSize == 24) // TES4
@ -104,9 +114,15 @@ void ESM4::DialogInfo::load(ESM4::Reader& reader)
break;
}
case ESM4::SUB_SCDA: reader.skipSubRecordData(); break; // compiled script data
case ESM4::SUB_SCTX: reader.getString(mScript.scriptSource); break;
case ESM4::SUB_SCRO: reader.getFormId(mScript.globReference); break;
case ESM4::SUB_SCDA:
reader.skipSubRecordData();
break; // compiled script data
case ESM4::SUB_SCTX:
reader.getString(mScript.scriptSource);
break;
case ESM4::SUB_SCRO:
reader.getFormId(mScript.globReference);
break;
case ESM4::SUB_SLSD:
{
localVar.clear();
@ -180,24 +196,23 @@ void ESM4::DialogInfo::load(ESM4::Reader& reader)
case ESM4::SUB_QNAM: // TES5 for mScript
case ESM4::SUB_RNAM: // TES5
{
//std::cout << "INFO " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// std::cout << "INFO " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
reader.skipSubRecordData();
break;
}
default:
std::cout << "INFO " << ESM::printName(subHdr.typeId) << " skipping..."
<< subHdr.dataSize << std::endl;
std::cout << "INFO " << ESM::printName(subHdr.typeId) << " skipping..." << subHdr.dataSize << std::endl;
reader.skipSubRecordData();
//throw std::runtime_error("ESM4::INFO::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
// throw std::runtime_error("ESM4::INFO::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
}
//void ESM4::DialogInfo::save(ESM4::Writer& writer) const
// void ESM4::DialogInfo::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::DialogInfo::blank()
// void ESM4::DialogInfo::blank()
//{
//}
// }

View file

@ -30,9 +30,9 @@
#include <cstdint>
#include <string>
#include "dialogue.hpp" // DialType
#include "formid.hpp"
#include "script.hpp" // TargetCondition
#include "dialogue.hpp" // DialType
namespace ESM4
{
@ -41,21 +41,21 @@ namespace ESM4
enum InfoFlag
{
INFO_Goodbye = 0x0001,
INFO_Random = 0x0002,
INFO_SayOnce = 0x0004,
INFO_RunImmediately = 0x0008,
INFO_InfoRefusal = 0x0010,
INFO_RandomEnd = 0x0020,
INFO_RunForRumors = 0x0040,
INFO_Goodbye = 0x0001,
INFO_Random = 0x0002,
INFO_SayOnce = 0x0004,
INFO_RunImmediately = 0x0008,
INFO_InfoRefusal = 0x0010,
INFO_RandomEnd = 0x0020,
INFO_RunForRumors = 0x0040,
INFO_SpeechChallenge = 0x0080,
INFO_SayOnceADay = 0x0100,
INFO_AlwaysDarken = 0x0200
INFO_SayOnceADay = 0x0100,
INFO_AlwaysDarken = 0x0200
};
struct DialogInfo
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId; // FIXME: no such record for INFO, but keep here to avoid extra work for now
@ -68,8 +68,8 @@ namespace ESM4
std::string mNotes;
std::string mEdits;
std::uint8_t mDialType; // DialType
std::uint8_t mNextSpeaker;
std::uint8_t mDialType; // DialType
std::uint8_t mNextSpeaker;
std::uint16_t mInfoFlags; // see above enum
TargetCondition mTargetCondition;
@ -78,9 +78,9 @@ namespace ESM4
ScriptDefinition mScript; // FIXME: ignoring the second one after the NEXT sub-record
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,8 +26,8 @@
*/
#include "loadingr.hpp"
#include <stdexcept>
#include <cstring>
#include <stdexcept>
#include "reader.hpp"
//#include "writer.hpp"
@ -36,26 +36,29 @@ void ESM4::Ingredient::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
{
if (mFullName.empty())
{
reader.getLocalizedString(mFullName); break;
reader.getLocalizedString(mFullName);
break;
}
else // in TES4 subsequent FULL records are script effect names
{
// FIXME: should be part of a struct?
std::string scriptEffectName;
if (!reader.getZString(scriptEffectName))
throw std::runtime_error ("INGR FULL data read error");
throw std::runtime_error("INGR FULL data read error");
mScriptEffect.push_back(scriptEffectName);
@ -64,7 +67,7 @@ void ESM4::Ingredient::load(ESM4::Reader& reader)
}
case ESM4::SUB_DATA:
{
//if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
// if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
if (subHdr.dataSize == 8) // FO3 is size 4 even though VER_094
reader.get(mData);
else
@ -72,11 +75,21 @@ void ESM4::Ingredient::load(ESM4::Reader& reader)
break;
}
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_ENIT: reader.get(mEnchantment); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_ENIT:
reader.get(mEnchantment);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_SCIT:
{
reader.get(mEffect);
@ -95,7 +108,7 @@ void ESM4::Ingredient::load(ESM4::Reader& reader)
case ESM4::SUB_ZNAM:
case ESM4::SUB_ETYP: // FO3
{
//std::cout << "INGR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "INGR " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -105,10 +118,10 @@ void ESM4::Ingredient::load(ESM4::Reader& reader)
}
}
//void ESM4::Ingredient::save(ESM4::Writer& writer) const
// void ESM4::Ingredient::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Ingredient::blank()
// void ESM4::Ingredient::blank()
//{
//}
// }

View file

@ -43,7 +43,7 @@ namespace ESM4
struct Data
{
std::uint32_t value;
float weight;
float weight;
};
struct ENIT
@ -53,7 +53,7 @@ namespace ESM4
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -66,14 +66,14 @@ namespace ESM4
std::vector<std::string> mScriptEffect; // FIXME: prob. should be in a struct
FormId mScriptId;
ScriptEffect mEffect;
ENIT mEnchantment;
ENIT mEnchantment;
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,30 +35,50 @@ void ESM4::Key::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_MICO: reader.getZString(mMiniIcon); break; // FO3
case ESM4::SUB_DATA: reader.get(mData); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_YNAM: reader.getFormId(mPickUpSound); break;
case ESM4::SUB_ZNAM: reader.getFormId(mDropSound); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_MICO:
reader.getZString(mMiniIcon);
break; // FO3
case ESM4::SUB_DATA:
reader.get(mData);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_YNAM:
reader.getFormId(mPickUpSound);
break;
case ESM4::SUB_ZNAM:
reader.getFormId(mDropSound);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_KSIZ:
case ESM4::SUB_KWDA:
case ESM4::SUB_OBND:
case ESM4::SUB_VMAD:
{
//std::cout << "KEYM " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "KEYM " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -68,10 +88,10 @@ void ESM4::Key::load(ESM4::Reader& reader)
}
}
//void ESM4::Key::save(ESM4::Writer& writer) const
// void ESM4::Key::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Key::blank()
// void ESM4::Key::blank()
//{
//}
// }

View file

@ -43,11 +43,11 @@ namespace ESM4
struct Data
{
std::uint32_t value; // gold
float weight;
float weight;
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -65,9 +65,9 @@ namespace ESM4
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -57,13 +57,13 @@ void ESM4::Land::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
mDataTypes = 0;
TxtLayer layer;
std::int8_t currentAddQuad = -1; // for VTXT following ATXT
//std::map<FormId, int> uniqueTextures; // FIXME: for temp testing only
// std::map<FormId, int> uniqueTextures; // FIXME: for temp testing only
while (reader.getSubRecordHeader())
{
@ -153,37 +153,36 @@ void ESM4::Land::load(ESM4::Reader& reader)
int count = (int)reader.subRecordHeader().dataSize / sizeof(ESM4::Land::VTXT);
assert((reader.subRecordHeader().dataSize % sizeof(ESM4::Land::VTXT)) == 0
&& "ESM4::LAND VTXT data size error");
&& "ESM4::LAND VTXT data size error");
if (count)
{
layer.data.resize(count);
std::vector<ESM4::Land::VTXT>::iterator it = layer.data.begin();
for (;it != layer.data.end(); ++it)
for (; it != layer.data.end(); ++it)
{
reader.get(*it);
// FIXME: debug only
//std::cout << "pos: " << std::dec << (int)(*it).position << std::endl;
// std::cout << "pos: " << std::dec << (int)(*it).position << std::endl;
}
}
mTextures[currentAddQuad].layers.push_back(layer);
// Assumed that the layers are added in the correct sequence
// FIXME: Knights.esp doesn't seem to observe this - investigate more
//assert(layer.texture.layerIndex == mTextures[currentAddQuad].layers.size()-1
//&& "additional texture layer index error");
// assert(layer.texture.layerIndex == mTextures[currentAddQuad].layers.size()-1
//&& "additional texture layer index error");
currentAddQuad = -1;
layer.data.clear();
// FIXME: debug only
//std::cout << "VTXT: count " << std::dec << count << std::endl;
// std::cout << "VTXT: count " << std::dec << count << std::endl;
break;
}
case ESM4::SUB_VTEX: // only in Oblivion?
{
int count = (int)reader.subRecordHeader().dataSize / sizeof(FormId);
assert((reader.subRecordHeader().dataSize % sizeof(FormId)) == 0
&& "ESM4::LAND VTEX data size error");
assert((reader.subRecordHeader().dataSize % sizeof(FormId)) == 0 && "ESM4::LAND VTEX data size error");
if (count)
{
@ -192,7 +191,7 @@ void ESM4::Land::load(ESM4::Reader& reader)
{
reader.getFormId(*it);
// FIXME: debug only
//std::cout << "VTEX: " << std::hex << *it << std::endl;
// std::cout << "VTEX: " << std::hex << *it << std::endl;
}
}
break;
@ -205,7 +204,8 @@ void ESM4::Land::load(ESM4::Reader& reader)
if (currentAddQuad != -1)
{
// FIXME: not sure if it happens here as well
std::cout << "ESM4::Land VTXT empty layer " << (int)layer.texture.layerIndex << " quad " << (int)layer.texture.quadrant << std::endl;
std::cout << "ESM4::Land VTXT empty layer " << (int)layer.texture.layerIndex << " quad "
<< (int)layer.texture.quadrant << std::endl;
mTextures[currentAddQuad].layers.push_back(layer);
}
@ -214,27 +214,27 @@ void ESM4::Land::load(ESM4::Reader& reader)
{
if (mTextures[i].base.formId == 0)
{
//std::cout << "ESM4::LAND " << ESM4::formIdToString(mFormId) << " missing base, quad " << i << std::endl;
//std::cout << "layers " << mTextures[i].layers.size() << std::endl;
// NOTE: can't set the default here since FO3/FONV may have different defaults
//mTextures[i].base.formId = 0x000008C0; // TerrainHDDirt01.dds
// std::cout << "ESM4::LAND " << ESM4::formIdToString(mFormId) << " missing base, quad " << i << std::endl;
// std::cout << "layers " << mTextures[i].layers.size() << std::endl;
// NOTE: can't set the default here since FO3/FONV may have different defaults
// mTextures[i].base.formId = 0x000008C0; // TerrainHDDirt01.dds
missing = true;
}
//else
// else
//{
// std::cout << "ESM4::LAND " << ESM4::formIdToString(mFormId) << " base, quad " << i << std::endl;
// std::cout << "layers " << mTextures[i].layers.size() << std::endl;
//}
// std::cout << "ESM4::LAND " << ESM4::formIdToString(mFormId) << " base, quad " << i << std::endl;
// std::cout << "layers " << mTextures[i].layers.size() << std::endl;
// }
}
// at least one of the quadrants do not have a base texture, return without setting the flag
if (!missing)
mDataTypes |= LAND_VTEX;
}
//void ESM4::Land::save(ESM4::Writer& writer) const
// void ESM4::Land::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Land::blank()
// void ESM4::Land::blank()
//{
//}
// }

View file

@ -63,53 +63,53 @@ namespace ESM4
// (for TES4 - based on vanilla observations)
static const int QUAD_TEXTURE_PER_SIDE = 6;
#pragma pack(push,1)
#pragma pack(push, 1)
struct VHGT
{
float heightOffset;
std::int8_t gradientData[VERTS_PER_SIDE * VERTS_PER_SIDE];
float heightOffset;
std::int8_t gradientData[VERTS_PER_SIDE * VERTS_PER_SIDE];
std::uint16_t unknown1;
unsigned char unknown2;
};
struct BTXT
{
FormId formId;
std::uint8_t quadrant; // 0 = bottom left, 1 = bottom right, 2 = top left, 3 = top right
std::uint8_t unknown1;
FormId formId;
std::uint8_t quadrant; // 0 = bottom left, 1 = bottom right, 2 = top left, 3 = top right
std::uint8_t unknown1;
std::uint16_t unknown2;
};
struct ATXT
{
FormId formId;
std::uint8_t quadrant; // 0 = bottom left, 1 = bottom right, 2 = top left, 3 = top right
std::uint8_t unknown;
FormId formId;
std::uint8_t quadrant; // 0 = bottom left, 1 = bottom right, 2 = top left, 3 = top right
std::uint8_t unknown;
std::uint16_t layerIndex; // texture layer, 0..7
};
struct VTXT
{
std::uint16_t position; // 0..288 (17x17 grid)
std::uint8_t unknown1;
std::uint8_t unknown2;
float opacity;
std::uint8_t unknown1;
std::uint8_t unknown2;
float opacity;
};
#pragma pack(pop)
struct TxtLayer
{
ATXT texture;
ATXT texture;
std::vector<VTXT> data; // alpha data
};
struct Texture
{
BTXT base;
BTXT base;
std::vector<TxtLayer> layers;
};
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::uint32_t mLandFlags; // from DATA subrecord
@ -117,16 +117,16 @@ namespace ESM4
// FIXME: lazy loading not yet implemented
int mDataTypes; // which data types are loaded
signed char mVertNorm[VERTS_PER_SIDE * VERTS_PER_SIDE * 3]; // from VNML subrecord
signed char mVertColr[VERTS_PER_SIDE * VERTS_PER_SIDE * 3]; // from VCLR subrecord
VHGT mHeightMap;
Texture mTextures[4]; // 0 = bottom left, 1 = bottom right, 2 = top left, 3 = top right
std::vector<FormId> mIds; // land texture (LTEX) formids
signed char mVertNorm[VERTS_PER_SIDE * VERTS_PER_SIDE * 3]; // from VNML subrecord
signed char mVertColr[VERTS_PER_SIDE * VERTS_PER_SIDE * 3]; // from VCLR subrecord
VHGT mHeightMap;
Texture mTextures[4]; // 0 = bottom left, 1 = bottom right, 2 = top left, 3 = top right
std::vector<FormId> mIds; // land texture (LTEX) formids
virtual void load(Reader& reader);
//virtual void save(Writer& writer) const;
// virtual void save(Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -28,8 +28,8 @@
*/
#include "loadlgtm.hpp"
#include <stdexcept>
#include <cfloat> // FLT_MAX for gcc
#include <stdexcept>
//#include <iostream> // FIXME: for debugging only
#include "reader.hpp"
@ -39,14 +39,16 @@ void ESM4::LightingTemplate::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_DATA:
{
if (subHdr.dataSize == 36) // TES4
@ -65,8 +67,8 @@ void ESM4::LightingTemplate::load(ESM4::Reader& reader)
}
case ESM4::SUB_DALC: // TES5
{
//std::cout << "LGTM " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
// std::cout << "LGTM " << ESM::printName(subHdr.typeId) << " skipping..."
//<< subHdr.dataSize << std::endl;
reader.skipSubRecordData();
break;
}
@ -76,10 +78,10 @@ void ESM4::LightingTemplate::load(ESM4::Reader& reader)
}
}
//void ESM4::LightingTemplate::save(ESM4::Writer& writer) const
// void ESM4::LightingTemplate::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::LightingTemplate::blank()
// void ESM4::LightingTemplate::blank()
//{
//}
// }

View file

@ -43,7 +43,7 @@ namespace ESM4
struct LightingTemplate
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -51,9 +51,9 @@ namespace ESM4
Lighting mLighting;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,7 +35,7 @@ void ESM4::Light::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
std::uint32_t esmVer = reader.esmVersion();
bool isFONV = esmVer == ESM::VER_132 || esmVer == ESM::VER_133 || esmVer == ESM::VER_134;
@ -44,14 +44,18 @@ void ESM4::Light::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_DATA:
{
// FIXME: TES4 might be uint32 as well, need to check
if (isFONV || (esmVer == ESM::VER_094 && subHdr.dataSize == 32)/*FO3*/)
if (isFONV || (esmVer == ESM::VER_094 && subHdr.dataSize == 32) /*FO3*/)
{
reader.get(mData.time); // uint32
reader.get(mData.time); // uint32
}
else
reader.get(mData.duration); // float
@ -59,7 +63,7 @@ void ESM4::Light::load(ESM4::Reader& reader)
reader.get(mData.radius);
reader.get(mData.colour);
reader.get(mData.flags);
//if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
// if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
if (subHdr.dataSize == 48)
{
reader.get(mData.falloff);
@ -78,17 +82,29 @@ void ESM4::Light::load(ESM4::Reader& reader)
reader.get(mData.weight);
break;
}
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_SNAM: reader.getFormId(mSound); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_FNAM: reader.get(mFade); break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_SNAM:
reader.getFormId(mSound);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_FNAM:
reader.get(mFade);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_OBND:
case ESM4::SUB_VMAD: // Dragonborn only?
{
//std::cout << "LIGH " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "LIGH " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -98,10 +114,10 @@ void ESM4::Light::load(ESM4::Reader& reader)
}
}
//void ESM4::Light::save(ESM4::Writer& writer) const
// void ESM4::Light::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Light::blank()
// void ESM4::Light::blank()
//{
//}
// }

View file

@ -41,8 +41,8 @@ namespace ESM4
{
struct Data
{
std::uint32_t time; // FO/FONV only
float duration = -1;
std::uint32_t time; // FO/FONV only
float duration = -1;
std::uint32_t radius;
std::uint32_t colour; // RGBA
// flags:
@ -56,18 +56,18 @@ namespace ESM4
// 0x00000100 = Pulse Slow
// 0x00000200 = Spot Light
// 0x00000400 = Spot Shadow
std::int32_t flags;
float falloff = 1.f;
float FOV = 90; // FIXME: FOV in degrees or radians?
float nearClip; // TES5 only
float frequency; // TES5 only
float intensityAmplitude; // TES5 only
float movementAmplitude; // TES5 only
std::uint32_t value; // gold
float weight;
std::int32_t flags;
float falloff = 1.f;
float FOV = 90; // FIXME: FOV in degrees or radians?
float nearClip; // TES5 only
float frequency; // TES5 only
float intensityAmplitude; // TES5 only
float movementAmplitude; // TES5 only
std::uint32_t value; // gold
float weight;
};
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -85,9 +85,9 @@ namespace ESM4
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -41,7 +41,7 @@ void ESM4::LandTexture::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
std::uint32_t esmVer = reader.esmVersion();
bool isFONV = esmVer == ESM::VER_132 || esmVer == ESM::VER_133 || esmVer == ESM::VER_134;
@ -50,7 +50,9 @@ void ESM4::LandTexture::load(ESM4::Reader& reader)
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_HNAM:
{
if (isFONV)
@ -62,7 +64,7 @@ void ESM4::LandTexture::load(ESM4::Reader& reader)
if ((reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170)
&& subHdr.dataSize == 2) // FO3 is VER_094 but dataSize 3
{
//assert(subHdr.dataSize == 2 && "LTEX unexpected HNAM size");
// assert(subHdr.dataSize == 2 && "LTEX unexpected HNAM size");
reader.get(mHavokFriction);
reader.get(mHavokRestitution);
}
@ -75,21 +77,31 @@ void ESM4::LandTexture::load(ESM4::Reader& reader)
}
break;
}
case ESM4::SUB_ICON: reader.getZString(mTextureFile); break; // Oblivion only?
case ESM4::SUB_SNAM: reader.get(mTextureSpecular); break;
case ESM4::SUB_GNAM: reader.getFormId(mGrass); break;
case ESM4::SUB_TNAM: reader.getFormId(mTexture); break; // TES5 only
case ESM4::SUB_MNAM: reader.getFormId(mMaterial); break; // TES5 only
case ESM4::SUB_ICON:
reader.getZString(mTextureFile);
break; // Oblivion only?
case ESM4::SUB_SNAM:
reader.get(mTextureSpecular);
break;
case ESM4::SUB_GNAM:
reader.getFormId(mGrass);
break;
case ESM4::SUB_TNAM:
reader.getFormId(mTexture);
break; // TES5 only
case ESM4::SUB_MNAM:
reader.getFormId(mMaterial);
break; // TES5 only
default:
throw std::runtime_error("ESM4::LTEX::load - Unknown subrecord " + ESM::printName(subHdr.typeId));
}
}
}
//void ESM4::LandTexture::save(ESM4::Writer& writer) const
// void ESM4::LandTexture::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::LandTexture::blank()
// void ESM4::LandTexture::blank()
//{
//}
// }

View file

@ -39,7 +39,7 @@ namespace ESM4
struct LandTexture
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -63,9 +63,9 @@ namespace ESM4
// ----------------------
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -36,18 +36,28 @@ void ESM4::LevelledCreature::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_TNAM: reader.getFormId(mTemplate); break;
case ESM4::SUB_LVLD: reader.get(mChanceNone); break;
case ESM4::SUB_LVLF: reader.get(mLvlCreaFlags); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_TNAM:
reader.getFormId(mTemplate);
break;
case ESM4::SUB_LVLD:
reader.get(mChanceNone);
break;
case ESM4::SUB_LVLF:
reader.get(mLvlCreaFlags);
break;
case ESM4::SUB_LVLO:
{
static LVLO lvlo;
@ -58,8 +68,8 @@ void ESM4::LevelledCreature::load(ESM4::Reader& reader)
reader.get(lvlo.level);
reader.get(lvlo.item);
reader.get(lvlo.count);
//std::cout << "LVLC " << mEditorId << " LVLO lev " << lvlo.level << ", item " << lvlo.item
//<< ", count " << lvlo.count << std::endl;
// std::cout << "LVLC " << mEditorId << " LVLO lev " << lvlo.level << ", item " << lvlo.item
//<< ", count " << lvlo.count << std::endl;
// FIXME: seems to happen only once, don't add to mLvlObject
// LVLC TesKvatchCreature LVLO lev 1, item 1393819648, count 2
// 0x0001, 0x5314 0000, 0x0002
@ -77,7 +87,7 @@ void ESM4::LevelledCreature::load(ESM4::Reader& reader)
}
case ESM4::SUB_OBND: // FO3
{
//std::cout << "LVLC " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "LVLC " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -111,10 +121,10 @@ std::int8_t ESM4::LevelledCreature::chanceNone() const
return (mChanceNone & 0x7f); // FIXME: 0x80 is just a guess
}
//void ESM4::LevelledCreature::save(ESM4::Writer& writer) const
// void ESM4::LevelledCreature::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::LevelledCreature::blank()
// void ESM4::LevelledCreature::blank()
//{
//}
// }

View file

@ -40,7 +40,7 @@ namespace ESM4
struct LevelledCreature
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -59,9 +59,9 @@ namespace ESM4
std::int8_t chanceNone() const;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -26,8 +26,8 @@
*/
#include "loadlvli.hpp"
#include <stdexcept>
#include <iostream> // FIXME: for debugging
#include <stdexcept>
#include "reader.hpp"
//#include "writer.hpp"
@ -36,17 +36,26 @@ void ESM4::LevelledItem::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_LVLD: reader.get(mChanceNone); break;
case ESM4::SUB_LVLF: reader.get(mLvlItemFlags); mHasLvlItemFlags = true; break;
case ESM4::SUB_DATA: reader.get(mData); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_LVLD:
reader.get(mChanceNone);
break;
case ESM4::SUB_LVLF:
reader.get(mLvlItemFlags);
mHasLvlItemFlags = true;
break;
case ESM4::SUB_DATA:
reader.get(mData);
break;
case ESM4::SUB_LVLO:
{
static LVLO lvlo;
@ -57,8 +66,9 @@ void ESM4::LevelledItem::load(ESM4::Reader& reader)
reader.get(lvlo.level);
reader.get(lvlo.item);
reader.get(lvlo.count);
// std::cout << "LVLI " << mEditorId << " LVLO lev " << lvlo.level << ", item " << lvlo.item
// << ", count " << lvlo.count << std::endl;
// std::cout << "LVLI " << mEditorId << " LVLO lev " << lvlo.level << ",
// item " << lvlo.item
// << ", count " << lvlo.count << std::endl;
break;
}
else
@ -77,7 +87,8 @@ void ESM4::LevelledItem::load(ESM4::Reader& reader)
case ESM4::SUB_LVLG: // FO3/FONV
{
//std::cout << "LVLI " << ESM::printName(subHdr.typeId) << " skipping..." << subHdr.dataSize << std::endl;
// std::cout << "LVLI " << ESM::printName(subHdr.typeId) << " skipping..." << subHdr.dataSize <<
// std::endl;
reader.skipSubRecordData();
break;
}
@ -87,8 +98,8 @@ void ESM4::LevelledItem::load(ESM4::Reader& reader)
}
// FIXME: testing
//if (mHasLvlItemFlags && mChanceNone >= 90)
//std::cout << "LVLI " << mEditorId << " chance none " << int(mChanceNone) << std::endl;
// if (mHasLvlItemFlags && mChanceNone >= 90)
// std::cout << "LVLI " << mEditorId << " chance none " << int(mChanceNone) << std::endl;
}
bool ESM4::LevelledItem::calcAllLvlLessThanPlayer() const
@ -123,10 +134,10 @@ bool ESM4::LevelledItem::useAll() const
return false;
}
//void ESM4::LevelledItem::save(ESM4::Writer& writer) const
// void ESM4::LevelledItem::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::LevelledItem::blank()
// void ESM4::LevelledItem::blank()
//{
//}
// }

View file

@ -40,7 +40,7 @@ namespace ESM4
struct LevelledItem
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -60,9 +60,9 @@ namespace ESM4
std::int8_t chanceNone() const;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -36,19 +36,29 @@ void ESM4::LevelledNpc::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
//std::uint32_t esmVer = reader.esmVersion(); // currently unused
mFlags = reader.hdr().record.flags;
// std::uint32_t esmVer = reader.esmVersion(); // currently unused
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_LLCT: reader.get(mListCount); break;
case ESM4::SUB_LVLD: reader.get(mChanceNone); break;
case ESM4::SUB_LVLF: reader.get(mLvlActorFlags); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_LLCT:
reader.get(mListCount);
break;
case ESM4::SUB_LVLD:
reader.get(mChanceNone);
break;
case ESM4::SUB_LVLF:
reader.get(mLvlActorFlags);
break;
case ESM4::SUB_LVLO:
{
static LVLO lvlo;
@ -64,16 +74,16 @@ void ESM4::LevelledNpc::load(ESM4::Reader& reader)
else
throw std::runtime_error("ESM4::LVLN::load - " + mEditorId + " LVLO size error");
}
// else if (esmVer == ESM::VER_094 || esmVer == ESM::VER_170 || isFONV)
// {
// std::uint32_t level;
// reader.get(level);
// lvlo.level = static_cast<std::uint16_t>(level);
// reader.get(lvlo.item);
// std::uint32_t count;
// reader.get(count);
// lvlo.count = static_cast<std::uint16_t>(count);
// }
// else if (esmVer == ESM::VER_094 || esmVer == ESM::VER_170 || isFONV)
// {
// std::uint32_t level;
// reader.get(level);
// lvlo.level = static_cast<std::uint16_t>(level);
// reader.get(lvlo.item);
// std::uint32_t count;
// reader.get(count);
// lvlo.count = static_cast<std::uint16_t>(count);
// }
else
reader.get(lvlo);
@ -85,7 +95,7 @@ void ESM4::LevelledNpc::load(ESM4::Reader& reader)
case ESM4::SUB_OBND: // object bounds
case ESM4::SUB_MODT: // model texture data
{
//std::cout << "LVLN " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "LVLN " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -95,10 +105,10 @@ void ESM4::LevelledNpc::load(ESM4::Reader& reader)
}
}
//void ESM4::LevelledNpc::save(ESM4::Writer& writer) const
// void ESM4::LevelledNpc::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::LevelledNpc::blank()
// void ESM4::LevelledNpc::blank()
//{
//}
// }

View file

@ -40,7 +40,7 @@ namespace ESM4
struct LevelledNpc
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -57,9 +57,9 @@ namespace ESM4
inline std::int8_t chanceNone() const { return mChanceNone; }
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -33,21 +33,25 @@
void ESM4::Material::load(ESM4::Reader& reader)
{
//mFormId = reader.adjustFormId(reader.hdr().record.id); // FIXME: use master adjusted?
// mFormId = reader.adjustFormId(reader.hdr().record.id); // FIXME: use master adjusted?
mFormId = reader.hdr().record.id;
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_DNAM:
case ESM4::SUB_DATA:
{
//std::cout << "MATO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "MATO " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -57,10 +61,10 @@ void ESM4::Material::load(ESM4::Reader& reader)
}
}
//void ESM4::Material::save(ESM4::Writer& writer) const
// void ESM4::Material::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::Material::blank()
// void ESM4::Material::blank()
//{
//}
// }

View file

@ -39,16 +39,16 @@ namespace ESM4
struct Material
{
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
std::string mModel;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

View file

@ -35,23 +35,43 @@ void ESM4::MiscItem::load(ESM4::Reader& reader)
{
mFormId = reader.hdr().record.id;
reader.adjustFormId(mFormId);
mFlags = reader.hdr().record.flags;
mFlags = reader.hdr().record.flags;
while (reader.getSubRecordHeader())
{
const ESM4::SubRecordHeader& subHdr = reader.subRecordHeader();
switch (subHdr.typeId)
{
case ESM4::SUB_EDID: reader.getZString(mEditorId); break;
case ESM4::SUB_FULL: reader.getLocalizedString(mFullName); break;
case ESM4::SUB_MODL: reader.getZString(mModel); break;
case ESM4::SUB_ICON: reader.getZString(mIcon); break;
case ESM4::SUB_MICO: reader.getZString(mMiniIcon); break; // FO3
case ESM4::SUB_SCRI: reader.getFormId(mScriptId); break;
case ESM4::SUB_DATA: reader.get(mData); break;
case ESM4::SUB_MODB: reader.get(mBoundRadius); break;
case ESM4::SUB_YNAM: reader.getFormId(mPickUpSound); break;
case ESM4::SUB_ZNAM: reader.getFormId(mDropSound); break;
case ESM4::SUB_EDID:
reader.getZString(mEditorId);
break;
case ESM4::SUB_FULL:
reader.getLocalizedString(mFullName);
break;
case ESM4::SUB_MODL:
reader.getZString(mModel);
break;
case ESM4::SUB_ICON:
reader.getZString(mIcon);
break;
case ESM4::SUB_MICO:
reader.getZString(mMiniIcon);
break; // FO3
case ESM4::SUB_SCRI:
reader.getFormId(mScriptId);
break;
case ESM4::SUB_DATA:
reader.get(mData);
break;
case ESM4::SUB_MODB:
reader.get(mBoundRadius);
break;
case ESM4::SUB_YNAM:
reader.getFormId(mPickUpSound);
break;
case ESM4::SUB_ZNAM:
reader.getFormId(mDropSound);
break;
case ESM4::SUB_MODT:
case ESM4::SUB_KSIZ:
case ESM4::SUB_KWDA:
@ -60,7 +80,7 @@ void ESM4::MiscItem::load(ESM4::Reader& reader)
case ESM4::SUB_VMAD:
case ESM4::SUB_RNAM: // FONV
{
//std::cout << "MISC " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
// std::cout << "MISC " << ESM::printName(subHdr.typeId) << " skipping..." << std::endl;
reader.skipSubRecordData();
break;
}
@ -70,10 +90,10 @@ void ESM4::MiscItem::load(ESM4::Reader& reader)
}
}
//void ESM4::MiscItem::save(ESM4::Writer& writer) const
// void ESM4::MiscItem::save(ESM4::Writer& writer) const
//{
//}
// }
//void ESM4::MiscItem::blank()
// void ESM4::MiscItem::blank()
//{
//}
// }

View file

@ -42,12 +42,12 @@ namespace ESM4
#pragma pack(push, 1)
struct Data
{
std::uint32_t value; // gold
float weight;
std::uint32_t value; // gold
float weight;
};
#pragma pack(pop)
FormId mFormId; // from the header
FormId mFormId; // from the header
std::uint32_t mFlags; // from the header, see enum type RecordFlag for details
std::string mEditorId;
@ -65,9 +65,9 @@ namespace ESM4
Data mData;
void load(ESM4::Reader& reader);
//void save(ESM4::Writer& writer) const;
// void save(ESM4::Writer& writer) const;
//void blank();
// void blank();
};
}

Some files were not shown because too many files have changed in this diff Show more