mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-06 22:45:38 +00:00
Merge branch 'esm4_common' into 'master'
Split components/esm4/common.hpp header See merge request OpenMW/openmw!2893
This commit is contained in:
commit
c25ec3c573
15 changed files with 485 additions and 341 deletions
|
@ -116,12 +116,14 @@ add_component_dir (esm3terrain
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (esm4
|
add_component_dir (esm4
|
||||||
acti
|
|
||||||
actor
|
actor
|
||||||
|
cellgrid
|
||||||
common
|
common
|
||||||
dialogue
|
dialogue
|
||||||
effect
|
effect
|
||||||
formid
|
formid
|
||||||
|
grid
|
||||||
|
grouptype
|
||||||
inventory
|
inventory
|
||||||
lighting
|
lighting
|
||||||
loadachr
|
loadachr
|
||||||
|
@ -203,11 +205,13 @@ add_component_dir (esm4
|
||||||
loadtxst
|
loadtxst
|
||||||
loadweap
|
loadweap
|
||||||
loadwrld
|
loadwrld
|
||||||
|
magiceffectid
|
||||||
reader
|
reader
|
||||||
|
readerutils
|
||||||
reference
|
reference
|
||||||
script
|
script
|
||||||
readerutils
|
|
||||||
typetraits
|
typetraits
|
||||||
|
vertex
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (misc
|
add_component_dir (misc
|
||||||
|
|
44
components/esm4/cellgrid.hpp
Normal file
44
components/esm4/cellgrid.hpp
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2015-2020 cc9cii
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
cc9cii cc9c@iinet.net.au
|
||||||
|
|
||||||
|
Much of the information on the data structures are based on the information
|
||||||
|
from Tes4Mod:Mod_File_Format and Tes5Mod:File_Formats but also refined by
|
||||||
|
trial & error. See http://en.uesp.net/wiki for details.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef OPENMW_COMPONENTS_ESM4_CELLGRID_H
|
||||||
|
#define OPENMW_COMPONENTS_ESM4_CELLGRID_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "formid.hpp"
|
||||||
|
#include "grid.hpp"
|
||||||
|
|
||||||
|
namespace ESM4
|
||||||
|
{
|
||||||
|
union CellGrid
|
||||||
|
{
|
||||||
|
FormId cellId;
|
||||||
|
Grid grid;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // OPENMW_COMPONENTS_ESM4_CELLGRID_H
|
|
@ -1,97 +0,0 @@
|
||||||
/*
|
|
||||||
Copyright (C) 2015-2016, 2018, 2021 cc9cii
|
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
|
||||||
warranty. In no event will the authors be held liable for any damages
|
|
||||||
arising from the use of this software.
|
|
||||||
|
|
||||||
Permission is granted to anyone to use this software for any purpose,
|
|
||||||
including commercial applications, and to alter it and redistribute it
|
|
||||||
freely, subject to the following restrictions:
|
|
||||||
|
|
||||||
1. The origin of this software must not be misrepresented; you must not
|
|
||||||
claim that you wrote the original software. If you use this software
|
|
||||||
in a product, an acknowledgment in the product documentation would be
|
|
||||||
appreciated but is not required.
|
|
||||||
2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
misrepresented as being the original software.
|
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
|
||||||
|
|
||||||
cc9cii cc9c@iinet.net.au
|
|
||||||
|
|
||||||
Much of the information on the data structures are based on the information
|
|
||||||
from Tes4Mod:Mod_File_Format and Tes5Mod:File_Formats but also refined by
|
|
||||||
trial & error. See http://en.uesp.net/wiki for details.
|
|
||||||
|
|
||||||
*/
|
|
||||||
#include "common.hpp"
|
|
||||||
|
|
||||||
#include <algorithm>
|
|
||||||
#include <sstream>
|
|
||||||
#include <stdexcept>
|
|
||||||
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "formid.hpp"
|
|
||||||
|
|
||||||
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" };
|
|
||||||
|
|
||||||
std::string printLabel(const GroupLabel& label, const std::uint32_t type)
|
|
||||||
{
|
|
||||||
std::ostringstream ss;
|
|
||||||
ss << std::string(sGroupType[std::min(type, (uint32_t)11)]); // avoid out of range
|
|
||||||
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case ESM4::Grp_RecordType:
|
|
||||||
{
|
|
||||||
ss << ": " << std::string((char*)label.recordType, 4);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ESM4::Grp_ExteriorCell:
|
|
||||||
case ESM4::Grp_ExteriorSubCell:
|
|
||||||
{
|
|
||||||
// short x, y;
|
|
||||||
// y = label & 0xff;
|
|
||||||
// x = (label >> 16) & 0xff;
|
|
||||||
ss << ": grid (x, y) " << std::dec << label.grid[1] << ", " << label.grid[0];
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ESM4::Grp_InteriorCell:
|
|
||||||
case ESM4::Grp_InteriorSubCell:
|
|
||||||
{
|
|
||||||
ss << ": block 0x" << std::hex << label.value;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ESM4::Grp_WorldChild:
|
|
||||||
case ESM4::Grp_CellChild:
|
|
||||||
case ESM4::Grp_TopicChild:
|
|
||||||
case ESM4::Grp_CellPersistentChild:
|
|
||||||
case ESM4::Grp_CellTemporaryChild:
|
|
||||||
case ESM4::Grp_CellVisibleDistChild:
|
|
||||||
{
|
|
||||||
ss << ": FormId 0x" << formIdToString(label.value);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
|
||||||
str.assign(buf);
|
|
||||||
else
|
|
||||||
throw std::runtime_error("possible buffer overflow while converting grid");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -27,13 +27,8 @@
|
||||||
#ifndef ESM4_COMMON_H
|
#ifndef ESM4_COMMON_H
|
||||||
#define ESM4_COMMON_H
|
#define ESM4_COMMON_H
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#include "components/esm/fourcc.hpp"
|
#include "components/esm/fourcc.hpp"
|
||||||
|
|
||||||
#include "formid.hpp"
|
|
||||||
|
|
||||||
namespace ESM4
|
namespace ESM4
|
||||||
{
|
{
|
||||||
using ESM::fourCC;
|
using ESM::fourCC;
|
||||||
|
@ -662,164 +657,6 @@ namespace ESM4
|
||||||
SUB_EFSD = fourCC("EFSD"), // FONV DeadMoney
|
SUB_EFSD = fourCC("EFSD"), // FONV DeadMoney
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MagicEffectID
|
|
||||||
{
|
|
||||||
// Alteration
|
|
||||||
EFI_BRDN = fourCC("BRDN"),
|
|
||||||
EFI_FTHR = fourCC("FTHR"),
|
|
||||||
EFI_FISH = fourCC("FISH"),
|
|
||||||
EFI_FRSH = fourCC("FRSH"),
|
|
||||||
EFI_OPEN = fourCC("OPNN"),
|
|
||||||
EFI_SHLD = fourCC("SHLD"),
|
|
||||||
EFI_LISH = fourCC("LISH"),
|
|
||||||
EFI_WABR = fourCC("WABR"),
|
|
||||||
EFI_WAWA = fourCC("WAWA"),
|
|
||||||
|
|
||||||
// Conjuration
|
|
||||||
EFI_BABO = fourCC("BABO"), // Bound Boots
|
|
||||||
EFI_BACU = fourCC("BACU"), // Bound Cuirass
|
|
||||||
EFI_BAGA = fourCC("BAGA"), // Bound Gauntlets
|
|
||||||
EFI_BAGR = fourCC("BAGR"), // Bound Greaves
|
|
||||||
EFI_BAHE = fourCC("BAHE"), // Bound Helmet
|
|
||||||
EFI_BASH = fourCC("BASH"), // Bound Shield
|
|
||||||
EFI_BWAX = fourCC("BWAX"), // Bound Axe
|
|
||||||
EFI_BWBO = fourCC("BWBO"), // Bound Bow
|
|
||||||
EFI_BWDA = fourCC("BWDA"), // Bound Dagger
|
|
||||||
EFI_BWMA = fourCC("BWMA"), // Bound Mace
|
|
||||||
EFI_BWSW = fourCC("BWSW"), // Bound Sword
|
|
||||||
EFI_Z001 = fourCC("Z001"), // Summon Rufio's Ghost
|
|
||||||
EFI_Z002 = fourCC("Z002"), // Summon Ancestor Guardian
|
|
||||||
EFI_Z003 = fourCC("Z003"), // Summon Spiderling
|
|
||||||
EFI_Z005 = fourCC("Z005"), // Summon Bear
|
|
||||||
EFI_ZCLA = fourCC("ZCLA"), // Summon Clannfear
|
|
||||||
EFI_ZDAE = fourCC("ZDAE"), // Summon Daedroth
|
|
||||||
EFI_ZDRE = fourCC("ZDRE"), // Summon Dremora
|
|
||||||
EFI_ZDRL = fourCC("ZDRL"), // Summon Dremora Lord
|
|
||||||
EFI_ZFIA = fourCC("ZFIA"), // Summon Flame Atronach
|
|
||||||
EFI_ZFRA = fourCC("ZFRA"), // Summon Frost Atronach
|
|
||||||
EFI_ZGHO = fourCC("ZGHO"), // Summon Ghost
|
|
||||||
EFI_ZHDZ = fourCC("ZHDZ"), // Summon Headless Zombie
|
|
||||||
EFI_ZLIC = fourCC("ZLIC"), // Summon Lich
|
|
||||||
EFI_ZSCA = fourCC("ZSCA"), // Summon Scamp
|
|
||||||
EFI_ZSKE = fourCC("ZSKE"), // Summon Skeleton
|
|
||||||
EFI_ZSKA = fourCC("ZSKA"), // Summon Skeleton Guardian
|
|
||||||
EFI_ZSKH = fourCC("ZSKH"), // Summon Skeleton Hero
|
|
||||||
EFI_ZSKC = fourCC("ZSKC"), // Summon Skeleton Champion
|
|
||||||
EFI_ZSPD = fourCC("ZSPD"), // Summon Spider Daedra
|
|
||||||
EFI_ZSTA = fourCC("ZSTA"), // Summon Storm Atronach
|
|
||||||
EFI_ZWRA = fourCC("ZWRA"), // Summon Faded Wraith
|
|
||||||
EFI_ZWRL = fourCC("ZWRL"), // Summon Gloom Wraith
|
|
||||||
EFI_ZXIV = fourCC("ZXIV"), // Summon Xivilai
|
|
||||||
EFI_ZZOM = fourCC("ZZOM"), // Summon Zombie
|
|
||||||
EFI_TURN = fourCC("TURN"), // Turn Undead
|
|
||||||
|
|
||||||
// Destruction
|
|
||||||
EFI_DGAT = fourCC("DGAT"), // Damage Attribute
|
|
||||||
EFI_DGFA = fourCC("DGFA"), // Damage Fatigue
|
|
||||||
EFI_DGHE = fourCC("DGHE"), // Damage Health
|
|
||||||
EFI_DGSP = fourCC("DGSP"), // Damage Magicka
|
|
||||||
EFI_DIAR = fourCC("DIAR"), // Disintegrate Armor
|
|
||||||
EFI_DIWE = fourCC("DIWE"), // Disintegrate Weapon
|
|
||||||
EFI_DRAT = fourCC("DRAT"), // Drain Attribute
|
|
||||||
EFI_DRFA = fourCC("DRFA"), // Drain Fatigue
|
|
||||||
EFI_DRHE = fourCC("DRHE"), // Drain Health
|
|
||||||
EFI_DRSP = fourCC("DRSP"), // Drain Magicka
|
|
||||||
EFI_DRSK = fourCC("DRSK"), // Drain Skill
|
|
||||||
EFI_FIDG = fourCC("FIDG"), // Fire Damage
|
|
||||||
EFI_FRDG = fourCC("FRDG"), // Frost Damage
|
|
||||||
EFI_SHDG = fourCC("SHDG"), // Shock Damage
|
|
||||||
EFI_WKDI = fourCC("WKDI"), // Weakness to Disease
|
|
||||||
EFI_WKFI = fourCC("WKFI"), // Weakness to Fire
|
|
||||||
EFI_WKFR = fourCC("WKFR"), // Weakness to Frost
|
|
||||||
EFI_WKMA = fourCC("WKMA"), // Weakness to Magic
|
|
||||||
EFI_WKNW = fourCC("WKNW"), // Weakness to Normal Weapons
|
|
||||||
EFI_WKPO = fourCC("WKPO"), // Weakness to Poison
|
|
||||||
EFI_WKSH = fourCC("WKSH"), // Weakness to Shock
|
|
||||||
|
|
||||||
// Illusion
|
|
||||||
EFI_CALM = fourCC("CALM"), // Calm
|
|
||||||
EFI_CHML = fourCC("CHML"), // Chameleon
|
|
||||||
EFI_CHRM = fourCC("CHRM"), // Charm
|
|
||||||
EFI_COCR = fourCC("COCR"), // Command Creature
|
|
||||||
EFI_COHU = fourCC("COHU"), // Command Humanoid
|
|
||||||
EFI_DEMO = fourCC("DEMO"), // Demoralize
|
|
||||||
EFI_FRNZ = fourCC("FRNZ"), // Frenzy
|
|
||||||
EFI_INVI = fourCC("INVI"), // Invisibility
|
|
||||||
EFI_LGHT = fourCC("LGHT"), // Light
|
|
||||||
EFI_NEYE = fourCC("NEYE"), // Night-Eye
|
|
||||||
EFI_PARA = fourCC("PARA"), // Paralyze
|
|
||||||
EFI_RALY = fourCC("RALY"), // Rally
|
|
||||||
EFI_SLNC = fourCC("SLNC"), // Silence
|
|
||||||
|
|
||||||
// Mysticism
|
|
||||||
EFI_DTCT = fourCC("DTCT"), // Detect Life
|
|
||||||
EFI_DSPL = fourCC("DSPL"), // Dispel
|
|
||||||
EFI_REDG = fourCC("REDG"), // Reflect Damage
|
|
||||||
EFI_RFLC = fourCC("RFLC"), // Reflect Spell
|
|
||||||
EFI_STRP = fourCC("STRP"), // Soul Trap
|
|
||||||
EFI_SABS = fourCC("SABS"), // Spell Absorption
|
|
||||||
EFI_TELE = fourCC("TELE"), // Telekinesis
|
|
||||||
|
|
||||||
// Restoration
|
|
||||||
EFI_ABAT = fourCC("ABAT"), // Absorb Attribute
|
|
||||||
EFI_ABFA = fourCC("ABFA"), // Absorb Fatigue
|
|
||||||
EFI_ABHe = fourCC("ABHe"), // Absorb Health
|
|
||||||
EFI_ABSP = fourCC("ABSP"), // Absorb Magicka
|
|
||||||
EFI_ABSK = fourCC("ABSK"), // Absorb Skill
|
|
||||||
EFI_1400 = fourCC("1400"), // Cure Disease
|
|
||||||
EFI_CUPA = fourCC("CUPA"), // Cure Paralysis
|
|
||||||
EFI_CUPO = fourCC("CUPO"), // Cure Poison
|
|
||||||
EFI_FOAT = fourCC("FOAT"), // Fortify Attribute
|
|
||||||
EFI_FOFA = fourCC("FOFA"), // Fortify Fatigue
|
|
||||||
EFI_FOHE = fourCC("FOHE"), // Fortify Health
|
|
||||||
EFI_FOSP = fourCC("FOSP"), // Fortify Magicka
|
|
||||||
EFI_FOSK = fourCC("FOSK"), // Fortify Skill
|
|
||||||
EFI_RSDI = fourCC("RSDI"), // Resist Disease
|
|
||||||
EFI_RSFI = fourCC("RSFI"), // Resist Fire
|
|
||||||
EFI_RSFR = fourCC("RSFR"), // Resist Frost
|
|
||||||
EFI_RSMA = fourCC("RSMA"), // Resist Magic
|
|
||||||
EFI_RSNW = fourCC("RSNW"), // Resist Normal Weapons
|
|
||||||
EFI_RSPA = fourCC("RSPA"), // Resist Paralysis
|
|
||||||
EFI_RSPO = fourCC("RSPO"), // Resist Poison
|
|
||||||
EFI_RSSH = fourCC("RSSH"), // Resist Shock
|
|
||||||
EFI_REAT = fourCC("REAT"), // Restore Attribute
|
|
||||||
EFI_REFA = fourCC("REFA"), // Restore Fatigue
|
|
||||||
EFI_REHE = fourCC("REHE"), // Restore Health
|
|
||||||
EFI_RESP = fourCC("RESP"), // Restore Magicka
|
|
||||||
|
|
||||||
// Effects
|
|
||||||
EFI_LOCK = fourCC("LOCK"), // Lock Lock
|
|
||||||
EFI_SEFF = fourCC("SEFF"), // Script Effect
|
|
||||||
EFI_Z020 = fourCC("Z020"), // Summon 20 Extra
|
|
||||||
EFI_MYHL = fourCC("MYHL"), // Summon Mythic Dawn Helmet
|
|
||||||
EFI_MYTH = fourCC("MYTH"), // Summon Mythic Dawn Armor
|
|
||||||
EFI_REAN = fourCC("REAN"), // Reanimate
|
|
||||||
EFI_DISE = fourCC("DISE"), // Disease Info
|
|
||||||
EFI_POSN = fourCC("POSN"), // Poison Info
|
|
||||||
EFI_DUMY = fourCC("DUMY"), // Mehrunes Dagon Custom Effect
|
|
||||||
EFI_STMA = fourCC("STMA"), // Stunted Magicka
|
|
||||||
EFI_SUDG = fourCC("SUDG"), // Sun Damage
|
|
||||||
EFI_VAMP = fourCC("VAMP"), // Vampirism
|
|
||||||
EFI_DARK = fourCC("DARK"), // Darkness
|
|
||||||
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_CellVisibleDistChild = 10
|
|
||||||
};
|
|
||||||
|
|
||||||
// Based on http://www.uesp.net/wiki/Tes5Mod:Mod_File_Format#Records
|
// Based on http://www.uesp.net/wiki/Tes5Mod:Mod_File_Format#Records
|
||||||
enum RecordFlag
|
enum RecordFlag
|
||||||
{
|
{
|
||||||
|
@ -859,77 +696,6 @@ namespace ESM4
|
||||||
Rec_NoRespawn = 0x40000000, // (REFR) NoRespawn
|
Rec_NoRespawn = 0x40000000, // (REFR) NoRespawn
|
||||||
Rec_MultiBound = 0x80000000 // (REFR) MultiBound
|
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)
|
|
||||||
};
|
|
||||||
|
|
||||||
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)
|
|
||||||
std::uint16_t unknown;
|
|
||||||
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 flags;
|
|
||||||
FormId id;
|
|
||||||
std::uint32_t revision;
|
|
||||||
std::uint16_t version; // not in TES4
|
|
||||||
std::uint16_t unknown; // not in TES4
|
|
||||||
};
|
|
||||||
|
|
||||||
union RecordHeader
|
|
||||||
{
|
|
||||||
struct GroupTypeHeader group;
|
|
||||||
struct RecordTypeHeader record;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SubRecordHeader
|
|
||||||
{
|
|
||||||
std::uint32_t typeId;
|
|
||||||
std::uint16_t dataSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Grid, CellGrid and Vertex are shared by NVMI(NAVI) and NVNM(NAVM)
|
|
||||||
|
|
||||||
struct Grid
|
|
||||||
{
|
|
||||||
std::int16_t x;
|
|
||||||
std::int16_t y;
|
|
||||||
};
|
|
||||||
|
|
||||||
union CellGrid
|
|
||||||
{
|
|
||||||
FormId cellId;
|
|
||||||
Grid grid;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Vertex
|
|
||||||
{
|
|
||||||
float x;
|
|
||||||
float y;
|
|
||||||
float z;
|
|
||||||
};
|
|
||||||
#pragma pack(pop)
|
|
||||||
|
|
||||||
// For pretty printing GroupHeader labels
|
|
||||||
std::string printLabel(const GroupLabel& label, const std::uint32_t type);
|
|
||||||
|
|
||||||
void gridToString(std::int16_t x, std::int16_t y, std::string& str);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // ESM4_COMMON_H
|
#endif // ESM4_COMMON_H
|
||||||
|
|
41
components/esm4/grid.hpp
Normal file
41
components/esm4/grid.hpp
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2015-2020 cc9cii
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
cc9cii cc9c@iinet.net.au
|
||||||
|
|
||||||
|
Much of the information on the data structures are based on the information
|
||||||
|
from Tes4Mod:Mod_File_Format and Tes5Mod:File_Formats but also refined by
|
||||||
|
trial & error. See http://en.uesp.net/wiki for details.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef OPENMW_COMPONENTS_ESM4_GRID_H
|
||||||
|
#define OPENMW_COMPONENTS_ESM4_GRID_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace ESM4
|
||||||
|
{
|
||||||
|
struct Grid
|
||||||
|
{
|
||||||
|
std::int16_t x;
|
||||||
|
std::int16_t y;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // OPENMW_COMPONENTS_ESM4_GRID_H
|
49
components/esm4/grouptype.hpp
Normal file
49
components/esm4/grouptype.hpp
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2015-2020 cc9cii
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
cc9cii cc9c@iinet.net.au
|
||||||
|
|
||||||
|
Much of the information on the data structures are based on the information
|
||||||
|
from Tes4Mod:Mod_File_Format and Tes5Mod:File_Formats but also refined by
|
||||||
|
trial & error. See http://en.uesp.net/wiki for details.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef OPENMW_COMPONENTS_ESM4_GROUPTYPE_H
|
||||||
|
#define OPENMW_COMPONENTS_ESM4_GROUPTYPE_H
|
||||||
|
|
||||||
|
namespace ESM4
|
||||||
|
{
|
||||||
|
// 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_CellVisibleDistChild = 10
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // OPENMW_COMPONENTS_ESM4_GROUPTYPE_H
|
|
@ -35,6 +35,7 @@
|
||||||
#include <iostream> // FIXME: debug only
|
#include <iostream> // FIXME: debug only
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
|
#include "grouptype.hpp"
|
||||||
#include "reader.hpp"
|
#include "reader.hpp"
|
||||||
// #include "writer.hpp"
|
// #include "writer.hpp"
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,8 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "common.hpp" // CellGrid, Vertex
|
#include "cellgrid.hpp"
|
||||||
|
#include "vertex.hpp"
|
||||||
|
|
||||||
namespace ESM4
|
namespace ESM4
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,7 +30,8 @@
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "common.hpp" // CellGrid, Vertex
|
#include "cellgrid.hpp"
|
||||||
|
#include "vertex.hpp"
|
||||||
|
|
||||||
namespace ESM4
|
namespace ESM4
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,7 +31,8 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "common.hpp"
|
#include "formid.hpp"
|
||||||
|
#include "grid.hpp"
|
||||||
|
|
||||||
namespace ESM4
|
namespace ESM4
|
||||||
{
|
{
|
||||||
|
|
179
components/esm4/magiceffectid.hpp
Normal file
179
components/esm4/magiceffectid.hpp
Normal file
|
@ -0,0 +1,179 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2015-2020 cc9cii
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
cc9cii cc9c@iinet.net.au
|
||||||
|
|
||||||
|
Much of the information on the data structures are based on the information
|
||||||
|
from Tes4Mod:Mod_File_Format and Tes5Mod:File_Formats but also refined by
|
||||||
|
trial & error. See http://en.uesp.net/wiki for details.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef OPENMW_COMPONENTS_ESM4_MAGICEFFECTID_H
|
||||||
|
#define OPENMW_COMPONENTS_ESM4_MAGICEFFECTID_H
|
||||||
|
|
||||||
|
#include "components/esm/fourcc.hpp"
|
||||||
|
|
||||||
|
namespace ESM4
|
||||||
|
{
|
||||||
|
using ESM::fourCC;
|
||||||
|
|
||||||
|
enum MagicEffectID
|
||||||
|
{
|
||||||
|
// Alteration
|
||||||
|
EFI_BRDN = fourCC("BRDN"),
|
||||||
|
EFI_FTHR = fourCC("FTHR"),
|
||||||
|
EFI_FISH = fourCC("FISH"),
|
||||||
|
EFI_FRSH = fourCC("FRSH"),
|
||||||
|
EFI_OPEN = fourCC("OPNN"),
|
||||||
|
EFI_SHLD = fourCC("SHLD"),
|
||||||
|
EFI_LISH = fourCC("LISH"),
|
||||||
|
EFI_WABR = fourCC("WABR"),
|
||||||
|
EFI_WAWA = fourCC("WAWA"),
|
||||||
|
|
||||||
|
// Conjuration
|
||||||
|
EFI_BABO = fourCC("BABO"), // Bound Boots
|
||||||
|
EFI_BACU = fourCC("BACU"), // Bound Cuirass
|
||||||
|
EFI_BAGA = fourCC("BAGA"), // Bound Gauntlets
|
||||||
|
EFI_BAGR = fourCC("BAGR"), // Bound Greaves
|
||||||
|
EFI_BAHE = fourCC("BAHE"), // Bound Helmet
|
||||||
|
EFI_BASH = fourCC("BASH"), // Bound Shield
|
||||||
|
EFI_BWAX = fourCC("BWAX"), // Bound Axe
|
||||||
|
EFI_BWBO = fourCC("BWBO"), // Bound Bow
|
||||||
|
EFI_BWDA = fourCC("BWDA"), // Bound Dagger
|
||||||
|
EFI_BWMA = fourCC("BWMA"), // Bound Mace
|
||||||
|
EFI_BWSW = fourCC("BWSW"), // Bound Sword
|
||||||
|
EFI_Z001 = fourCC("Z001"), // Summon Rufio's Ghost
|
||||||
|
EFI_Z002 = fourCC("Z002"), // Summon Ancestor Guardian
|
||||||
|
EFI_Z003 = fourCC("Z003"), // Summon Spiderling
|
||||||
|
EFI_Z005 = fourCC("Z005"), // Summon Bear
|
||||||
|
EFI_ZCLA = fourCC("ZCLA"), // Summon Clannfear
|
||||||
|
EFI_ZDAE = fourCC("ZDAE"), // Summon Daedroth
|
||||||
|
EFI_ZDRE = fourCC("ZDRE"), // Summon Dremora
|
||||||
|
EFI_ZDRL = fourCC("ZDRL"), // Summon Dremora Lord
|
||||||
|
EFI_ZFIA = fourCC("ZFIA"), // Summon Flame Atronach
|
||||||
|
EFI_ZFRA = fourCC("ZFRA"), // Summon Frost Atronach
|
||||||
|
EFI_ZGHO = fourCC("ZGHO"), // Summon Ghost
|
||||||
|
EFI_ZHDZ = fourCC("ZHDZ"), // Summon Headless Zombie
|
||||||
|
EFI_ZLIC = fourCC("ZLIC"), // Summon Lich
|
||||||
|
EFI_ZSCA = fourCC("ZSCA"), // Summon Scamp
|
||||||
|
EFI_ZSKE = fourCC("ZSKE"), // Summon Skeleton
|
||||||
|
EFI_ZSKA = fourCC("ZSKA"), // Summon Skeleton Guardian
|
||||||
|
EFI_ZSKH = fourCC("ZSKH"), // Summon Skeleton Hero
|
||||||
|
EFI_ZSKC = fourCC("ZSKC"), // Summon Skeleton Champion
|
||||||
|
EFI_ZSPD = fourCC("ZSPD"), // Summon Spider Daedra
|
||||||
|
EFI_ZSTA = fourCC("ZSTA"), // Summon Storm Atronach
|
||||||
|
EFI_ZWRA = fourCC("ZWRA"), // Summon Faded Wraith
|
||||||
|
EFI_ZWRL = fourCC("ZWRL"), // Summon Gloom Wraith
|
||||||
|
EFI_ZXIV = fourCC("ZXIV"), // Summon Xivilai
|
||||||
|
EFI_ZZOM = fourCC("ZZOM"), // Summon Zombie
|
||||||
|
EFI_TURN = fourCC("TURN"), // Turn Undead
|
||||||
|
|
||||||
|
// Destruction
|
||||||
|
EFI_DGAT = fourCC("DGAT"), // Damage Attribute
|
||||||
|
EFI_DGFA = fourCC("DGFA"), // Damage Fatigue
|
||||||
|
EFI_DGHE = fourCC("DGHE"), // Damage Health
|
||||||
|
EFI_DGSP = fourCC("DGSP"), // Damage Magicka
|
||||||
|
EFI_DIAR = fourCC("DIAR"), // Disintegrate Armor
|
||||||
|
EFI_DIWE = fourCC("DIWE"), // Disintegrate Weapon
|
||||||
|
EFI_DRAT = fourCC("DRAT"), // Drain Attribute
|
||||||
|
EFI_DRFA = fourCC("DRFA"), // Drain Fatigue
|
||||||
|
EFI_DRHE = fourCC("DRHE"), // Drain Health
|
||||||
|
EFI_DRSP = fourCC("DRSP"), // Drain Magicka
|
||||||
|
EFI_DRSK = fourCC("DRSK"), // Drain Skill
|
||||||
|
EFI_FIDG = fourCC("FIDG"), // Fire Damage
|
||||||
|
EFI_FRDG = fourCC("FRDG"), // Frost Damage
|
||||||
|
EFI_SHDG = fourCC("SHDG"), // Shock Damage
|
||||||
|
EFI_WKDI = fourCC("WKDI"), // Weakness to Disease
|
||||||
|
EFI_WKFI = fourCC("WKFI"), // Weakness to Fire
|
||||||
|
EFI_WKFR = fourCC("WKFR"), // Weakness to Frost
|
||||||
|
EFI_WKMA = fourCC("WKMA"), // Weakness to Magic
|
||||||
|
EFI_WKNW = fourCC("WKNW"), // Weakness to Normal Weapons
|
||||||
|
EFI_WKPO = fourCC("WKPO"), // Weakness to Poison
|
||||||
|
EFI_WKSH = fourCC("WKSH"), // Weakness to Shock
|
||||||
|
|
||||||
|
// Illusion
|
||||||
|
EFI_CALM = fourCC("CALM"), // Calm
|
||||||
|
EFI_CHML = fourCC("CHML"), // Chameleon
|
||||||
|
EFI_CHRM = fourCC("CHRM"), // Charm
|
||||||
|
EFI_COCR = fourCC("COCR"), // Command Creature
|
||||||
|
EFI_COHU = fourCC("COHU"), // Command Humanoid
|
||||||
|
EFI_DEMO = fourCC("DEMO"), // Demoralize
|
||||||
|
EFI_FRNZ = fourCC("FRNZ"), // Frenzy
|
||||||
|
EFI_INVI = fourCC("INVI"), // Invisibility
|
||||||
|
EFI_LGHT = fourCC("LGHT"), // Light
|
||||||
|
EFI_NEYE = fourCC("NEYE"), // Night-Eye
|
||||||
|
EFI_PARA = fourCC("PARA"), // Paralyze
|
||||||
|
EFI_RALY = fourCC("RALY"), // Rally
|
||||||
|
EFI_SLNC = fourCC("SLNC"), // Silence
|
||||||
|
|
||||||
|
// Mysticism
|
||||||
|
EFI_DTCT = fourCC("DTCT"), // Detect Life
|
||||||
|
EFI_DSPL = fourCC("DSPL"), // Dispel
|
||||||
|
EFI_REDG = fourCC("REDG"), // Reflect Damage
|
||||||
|
EFI_RFLC = fourCC("RFLC"), // Reflect Spell
|
||||||
|
EFI_STRP = fourCC("STRP"), // Soul Trap
|
||||||
|
EFI_SABS = fourCC("SABS"), // Spell Absorption
|
||||||
|
EFI_TELE = fourCC("TELE"), // Telekinesis
|
||||||
|
|
||||||
|
// Restoration
|
||||||
|
EFI_ABAT = fourCC("ABAT"), // Absorb Attribute
|
||||||
|
EFI_ABFA = fourCC("ABFA"), // Absorb Fatigue
|
||||||
|
EFI_ABHe = fourCC("ABHe"), // Absorb Health
|
||||||
|
EFI_ABSP = fourCC("ABSP"), // Absorb Magicka
|
||||||
|
EFI_ABSK = fourCC("ABSK"), // Absorb Skill
|
||||||
|
EFI_1400 = fourCC("1400"), // Cure Disease
|
||||||
|
EFI_CUPA = fourCC("CUPA"), // Cure Paralysis
|
||||||
|
EFI_CUPO = fourCC("CUPO"), // Cure Poison
|
||||||
|
EFI_FOAT = fourCC("FOAT"), // Fortify Attribute
|
||||||
|
EFI_FOFA = fourCC("FOFA"), // Fortify Fatigue
|
||||||
|
EFI_FOHE = fourCC("FOHE"), // Fortify Health
|
||||||
|
EFI_FOSP = fourCC("FOSP"), // Fortify Magicka
|
||||||
|
EFI_FOSK = fourCC("FOSK"), // Fortify Skill
|
||||||
|
EFI_RSDI = fourCC("RSDI"), // Resist Disease
|
||||||
|
EFI_RSFI = fourCC("RSFI"), // Resist Fire
|
||||||
|
EFI_RSFR = fourCC("RSFR"), // Resist Frost
|
||||||
|
EFI_RSMA = fourCC("RSMA"), // Resist Magic
|
||||||
|
EFI_RSNW = fourCC("RSNW"), // Resist Normal Weapons
|
||||||
|
EFI_RSPA = fourCC("RSPA"), // Resist Paralysis
|
||||||
|
EFI_RSPO = fourCC("RSPO"), // Resist Poison
|
||||||
|
EFI_RSSH = fourCC("RSSH"), // Resist Shock
|
||||||
|
EFI_REAT = fourCC("REAT"), // Restore Attribute
|
||||||
|
EFI_REFA = fourCC("REFA"), // Restore Fatigue
|
||||||
|
EFI_REHE = fourCC("REHE"), // Restore Health
|
||||||
|
EFI_RESP = fourCC("RESP"), // Restore Magicka
|
||||||
|
|
||||||
|
// Effects
|
||||||
|
EFI_LOCK = fourCC("LOCK"), // Lock Lock
|
||||||
|
EFI_SEFF = fourCC("SEFF"), // Script Effect
|
||||||
|
EFI_Z020 = fourCC("Z020"), // Summon 20 Extra
|
||||||
|
EFI_MYHL = fourCC("MYHL"), // Summon Mythic Dawn Helmet
|
||||||
|
EFI_MYTH = fourCC("MYTH"), // Summon Mythic Dawn Armor
|
||||||
|
EFI_REAN = fourCC("REAN"), // Reanimate
|
||||||
|
EFI_DISE = fourCC("DISE"), // Disease Info
|
||||||
|
EFI_POSN = fourCC("POSN"), // Poison Info
|
||||||
|
EFI_DUMY = fourCC("DUMY"), // Mehrunes Dagon Custom Effect
|
||||||
|
EFI_STMA = fourCC("STMA"), // Stunted Magicka
|
||||||
|
EFI_SUDG = fourCC("SUDG"), // Sun Damage
|
||||||
|
EFI_VAMP = fourCC("VAMP"), // Vampirism
|
||||||
|
EFI_DARK = fourCC("DARK"), // Darkness
|
||||||
|
EFI_RSWD = fourCC("RSWD") // Resist Water Damage
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // OPENMW_COMPONENTS_ESM4_MAGICEFFECTID_H
|
|
@ -53,6 +53,7 @@
|
||||||
#include <components/to_utf8/to_utf8.hpp>
|
#include <components/to_utf8/to_utf8.hpp>
|
||||||
|
|
||||||
#include "formid.hpp"
|
#include "formid.hpp"
|
||||||
|
#include "grouptype.hpp"
|
||||||
|
|
||||||
namespace ESM4
|
namespace ESM4
|
||||||
{
|
{
|
||||||
|
@ -380,7 +381,7 @@ namespace ESM4
|
||||||
boost::iostreams::copy(inputStreamBuf, sr);
|
boost::iostreams::copy(inputStreamBuf, sr);
|
||||||
|
|
||||||
// For debugging only
|
// For debugging only
|
||||||
//#if 0
|
// #if 0
|
||||||
if (dump)
|
if (dump)
|
||||||
{
|
{
|
||||||
std::ostringstream ss;
|
std::ostringstream ss;
|
||||||
|
@ -398,7 +399,7 @@ namespace ESM4
|
||||||
}
|
}
|
||||||
std::cout << ss.str() << std::endl;
|
std::cout << ss.str() << std::endl;
|
||||||
}
|
}
|
||||||
//#endif
|
// #endif
|
||||||
mStream = std::make_unique<Files::StreamWithBuffer<Bsa::MemoryInputStream>>(std::move(memoryStreamPtr));
|
mStream = std::make_unique<Files::StreamWithBuffer<Bsa::MemoryInputStream>>(std::move(memoryStreamPtr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -516,11 +517,11 @@ namespace ESM4
|
||||||
lastGroupSize = mCtx.groupStack.back().first.groupSize;
|
lastGroupSize = mCtx.groupStack.back().first.groupSize;
|
||||||
|
|
||||||
assert(lastGroupSize >= mCtx.groupStack.back().second && "Read more records than available");
|
assert(lastGroupSize >= mCtx.groupStack.back().second && "Read more records than available");
|
||||||
//#if 0
|
// #if 0
|
||||||
if (mCtx.groupStack.back().second > lastGroupSize) // FIXME: debugging only
|
if (mCtx.groupStack.back().second > lastGroupSize) // FIXME: debugging only
|
||||||
std::cerr << printLabel(mCtx.groupStack.back().first.label, mCtx.groupStack.back().first.type)
|
std::cerr << printLabel(mCtx.groupStack.back().first.label, mCtx.groupStack.back().first.type)
|
||||||
<< " read more records than available" << std::endl;
|
<< " read more records than available" << std::endl;
|
||||||
//#endif
|
// #endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -742,4 +743,66 @@ namespace ESM4
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
constexpr std::string_view 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)
|
||||||
|
{
|
||||||
|
std::ostringstream ss;
|
||||||
|
ss << sGroupType[std::min<std::size_t>(type, std::size(sGroupType))]; // avoid out of range
|
||||||
|
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case ESM4::Grp_RecordType:
|
||||||
|
{
|
||||||
|
ss << ": " << std::string((char*)label.recordType, 4);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ESM4::Grp_ExteriorCell:
|
||||||
|
case ESM4::Grp_ExteriorSubCell:
|
||||||
|
{
|
||||||
|
// short x, y;
|
||||||
|
// y = label & 0xff;
|
||||||
|
// x = (label >> 16) & 0xff;
|
||||||
|
ss << ": grid (x, y) " << std::dec << label.grid[1] << ", " << label.grid[0];
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ESM4::Grp_InteriorCell:
|
||||||
|
case ESM4::Grp_InteriorSubCell:
|
||||||
|
{
|
||||||
|
ss << ": block 0x" << std::hex << label.value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ESM4::Grp_WorldChild:
|
||||||
|
case ESM4::Grp_CellChild:
|
||||||
|
case ESM4::Grp_TopicChild:
|
||||||
|
case ESM4::Grp_CellPersistentChild:
|
||||||
|
case ESM4::Grp_CellTemporaryChild:
|
||||||
|
case ESM4::Grp_CellVisibleDistChild:
|
||||||
|
{
|
||||||
|
ss << ": FormId 0x" << formIdToString(label.value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#include "cellgrid.hpp"
|
||||||
#include "common.hpp"
|
#include "common.hpp"
|
||||||
#include "loadtes4.hpp"
|
#include "loadtes4.hpp"
|
||||||
|
|
||||||
|
@ -42,6 +43,51 @@ namespace ToUTF8
|
||||||
|
|
||||||
namespace ESM4
|
namespace ESM4
|
||||||
{
|
{
|
||||||
|
#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)
|
||||||
|
};
|
||||||
|
|
||||||
|
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)
|
||||||
|
std::uint16_t unknown;
|
||||||
|
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 flags;
|
||||||
|
FormId id;
|
||||||
|
std::uint32_t revision;
|
||||||
|
std::uint16_t version; // not in TES4
|
||||||
|
std::uint16_t unknown; // not in TES4
|
||||||
|
};
|
||||||
|
|
||||||
|
union RecordHeader
|
||||||
|
{
|
||||||
|
GroupTypeHeader group;
|
||||||
|
RecordTypeHeader record;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SubRecordHeader
|
||||||
|
{
|
||||||
|
std::uint32_t typeId;
|
||||||
|
std::uint16_t dataSize;
|
||||||
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
// bytes read from group, updated by
|
// bytes read from group, updated by
|
||||||
// getRecordHeader() in advance
|
// getRecordHeader() in advance
|
||||||
// |
|
// |
|
||||||
|
@ -316,6 +362,9 @@ namespace ESM4
|
||||||
|
|
||||||
std::vector<Reader*>* getGlobalReaderList() { return mGlobalReaderList; }
|
std::vector<Reader*>* getGlobalReaderList() { return mGlobalReaderList; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// For pretty printing GroupHeader labels
|
||||||
|
std::string printLabel(const GroupLabel& label, const std::uint32_t type);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // ESM4_READER_H
|
#endif // ESM4_READER_H
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
#ifndef OPENMW_COMPONENTS_ESM4_READERUTILS
|
#ifndef OPENMW_COMPONENTS_ESM4_READERUTILS
|
||||||
#define OPENMW_COMPONENTS_ESM4_READERUTILS
|
#define OPENMW_COMPONENTS_ESM4_READERUTILS
|
||||||
|
|
||||||
#include <components/esm4/reader.hpp>
|
#include "grouptype.hpp"
|
||||||
|
#include "reader.hpp"
|
||||||
|
|
||||||
namespace ESM4
|
namespace ESM4
|
||||||
{
|
{
|
||||||
struct ReaderUtils
|
struct ReaderUtils
|
||||||
|
|
40
components/esm4/vertex.hpp
Normal file
40
components/esm4/vertex.hpp
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
Copyright (C) 2015-2020 cc9cii
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
cc9cii cc9c@iinet.net.au
|
||||||
|
|
||||||
|
Much of the information on the data structures are based on the information
|
||||||
|
from Tes4Mod:Mod_File_Format and Tes5Mod:File_Formats but also refined by
|
||||||
|
trial & error. See http://en.uesp.net/wiki for details.
|
||||||
|
|
||||||
|
*/
|
||||||
|
#ifndef OPENMW_COMPONENTS_ESM4_VERTEX_H
|
||||||
|
#define OPENMW_COMPONENTS_ESM4_VERTEX_H
|
||||||
|
|
||||||
|
namespace ESM4
|
||||||
|
{
|
||||||
|
struct Vertex
|
||||||
|
{
|
||||||
|
float x;
|
||||||
|
float y;
|
||||||
|
float z;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // OPENMW_COMPONENTS_ESM4_VERTEX_H
|
Loading…
Reference in a new issue