mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-05-09 03:57:51 +03:00
Apply clang-format to code base
This commit is contained in:
parent
f37d0be806
commit
ddb0522bbf
2199 changed files with 118692 additions and 114392 deletions
|
@ -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;
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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() {}
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -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()
|
||||
//{
|
||||
//}
|
||||
// }
|
||||
|
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue