mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-27 03:35:27 +00:00
c721a6cafa
Some data is actually loaded and store in ESM Store Any new ESM4 will go through the same code path and be automatically sent to the right store
350 lines
16 KiB
C++
350 lines
16 KiB
C++
#ifndef OPENMW_ESM_DEFS_H
|
|
#define OPENMW_ESM_DEFS_H
|
|
|
|
#include <stdexcept>
|
|
#include <stdint.h>
|
|
|
|
#include <tuple>
|
|
|
|
#include <osg/Vec3f>
|
|
|
|
#include "components/esm/fourcc.hpp"
|
|
#include <components/esm4/common.hpp>
|
|
|
|
namespace ESM
|
|
{
|
|
|
|
struct TimeStamp
|
|
{
|
|
float mHour;
|
|
int mDay;
|
|
};
|
|
|
|
struct EpochTimeStamp
|
|
{
|
|
float mGameHour;
|
|
int mDay;
|
|
int mMonth;
|
|
int mYear;
|
|
};
|
|
|
|
// Pixel color value. Standard four-byte rr,gg,bb,aa format.
|
|
typedef uint32_t Color;
|
|
|
|
enum Specialization
|
|
{
|
|
SPC_Combat = 0,
|
|
SPC_Magic = 1,
|
|
SPC_Stealth = 2
|
|
};
|
|
|
|
enum RangeType
|
|
{
|
|
RT_Self = 0,
|
|
RT_Touch = 1,
|
|
RT_Target = 2
|
|
};
|
|
|
|
// Position and rotation
|
|
struct Position
|
|
{
|
|
float pos[3];
|
|
|
|
// In radians
|
|
float rot[3];
|
|
|
|
osg::Vec3f asVec3() const { return osg::Vec3f(pos[0], pos[1], pos[2]); }
|
|
|
|
osg::Vec3f asRotationVec3() const { return osg::Vec3f(rot[0], rot[1], rot[2]); }
|
|
|
|
friend inline bool operator<(const Position& l, const Position& r)
|
|
{
|
|
const auto tuple = [](const Position& v) { return std::tuple(v.asVec3(), v.asRotationVec3()); };
|
|
return tuple(l) < tuple(r);
|
|
}
|
|
};
|
|
|
|
bool inline operator==(const Position& left, const Position& right) noexcept
|
|
{
|
|
return left.pos[0] == right.pos[0] && left.pos[1] == right.pos[1] && left.pos[2] == right.pos[2]
|
|
&& left.rot[0] == right.rot[0] && left.rot[1] == right.rot[1] && left.rot[2] == right.rot[2];
|
|
}
|
|
|
|
bool inline operator!=(const Position& left, const Position& right) noexcept
|
|
{
|
|
return left.pos[0] != right.pos[0] || left.pos[1] != right.pos[1] || left.pos[2] != right.pos[2]
|
|
|| left.rot[0] != right.rot[0] || left.rot[1] != right.rot[1] || left.rot[2] != right.rot[2];
|
|
}
|
|
|
|
constexpr unsigned int sEsm4RecnameFlag = 0x00800000;
|
|
|
|
constexpr unsigned int esm3Recname(const char (&name)[5])
|
|
{
|
|
if ((fourCC(name) & sEsm4RecnameFlag) == 0)
|
|
return fourCC(name);
|
|
else
|
|
throw std::logic_error(
|
|
"there must be no collision between esm3 records and esm4 records"); // The throw errors ensures at
|
|
// compile time that no collision
|
|
// between ESM4 and ESM3 is
|
|
// possible
|
|
}
|
|
|
|
constexpr unsigned int esm4Recname(const ESM4::RecordTypes recType)
|
|
{
|
|
if ((recType & sEsm4RecnameFlag) == 0)
|
|
return (recType | sEsm4RecnameFlag);
|
|
else
|
|
throw std::logic_error(
|
|
"there must be no collision between esm3 records and esm4 records"); // The throw errors ensures at
|
|
// compile time that no collision
|
|
// between ESM4 and ESM3 is
|
|
// possible
|
|
}
|
|
|
|
enum RecNameInts : unsigned int
|
|
{
|
|
// Special values. Can not be used in any ESM.
|
|
// Added to this enum to guarantee that the values don't collide with any records.
|
|
REC_INTERNAL_PLAYER = 0,
|
|
REC_INTERNAL_MARKER = 1,
|
|
|
|
// format 0 / legacy
|
|
REC_ACTI = esm3Recname("ACTI"),
|
|
REC_ALCH = esm3Recname("ALCH"),
|
|
REC_APPA = esm3Recname("APPA"),
|
|
REC_ARMO = esm3Recname("ARMO"),
|
|
REC_BODY = esm3Recname("BODY"),
|
|
REC_BOOK = esm3Recname("BOOK"),
|
|
REC_BSGN = esm3Recname("BSGN"),
|
|
REC_CELL = esm3Recname("CELL"),
|
|
REC_CLAS = esm3Recname("CLAS"),
|
|
REC_CLOT = esm3Recname("CLOT"),
|
|
REC_CNTC = esm3Recname("CNTC"),
|
|
REC_CONT = esm3Recname("CONT"),
|
|
REC_CREA = esm3Recname("CREA"),
|
|
REC_CREC = esm3Recname("CREC"),
|
|
REC_DIAL = esm3Recname("DIAL"),
|
|
REC_DOOR = esm3Recname("DOOR"),
|
|
REC_ENCH = esm3Recname("ENCH"),
|
|
REC_FACT = esm3Recname("FACT"),
|
|
REC_GLOB = esm3Recname("GLOB"),
|
|
REC_GMST = esm3Recname("GMST"),
|
|
REC_INFO = esm3Recname("INFO"),
|
|
REC_INGR = esm3Recname("INGR"),
|
|
REC_LAND = esm3Recname("LAND"),
|
|
REC_LEVC = esm3Recname("LEVC"),
|
|
REC_LEVI = esm3Recname("LEVI"),
|
|
REC_LIGH = esm3Recname("LIGH"),
|
|
REC_LOCK = esm3Recname("LOCK"),
|
|
REC_LTEX = esm3Recname("LTEX"),
|
|
REC_MGEF = esm3Recname("MGEF"),
|
|
REC_MISC = esm3Recname("MISC"),
|
|
REC_NPC_ = esm3Recname("NPC_"),
|
|
REC_NPCC = esm3Recname("NPCC"),
|
|
REC_PGRD = esm3Recname("PGRD"),
|
|
REC_PROB = esm3Recname("PROB"),
|
|
REC_RACE = esm3Recname("RACE"),
|
|
REC_REGN = esm3Recname("REGN"),
|
|
REC_REPA = esm3Recname("REPA"),
|
|
REC_SCPT = esm3Recname("SCPT"),
|
|
REC_SKIL = esm3Recname("SKIL"),
|
|
REC_SNDG = esm3Recname("SNDG"),
|
|
REC_SOUN = esm3Recname("SOUN"),
|
|
REC_SPEL = esm3Recname("SPEL"),
|
|
REC_SSCR = esm3Recname("SSCR"),
|
|
REC_STAT = esm3Recname("STAT"),
|
|
REC_WEAP = esm3Recname("WEAP"),
|
|
|
|
// format 0 - saved games
|
|
REC_SAVE = esm3Recname("SAVE"),
|
|
REC_JOUR_LEGACY = esm3Recname("\xa4UOR"), // "\xa4UOR", rather than "JOUR", little oversight when magic numbers
|
|
// were calculated by hand, needs to be supported for older files now
|
|
REC_JOUR = esm3Recname("JOUR"),
|
|
REC_QUES = esm3Recname("QUES"),
|
|
REC_GSCR = esm3Recname("GSCR"),
|
|
REC_PLAY = esm3Recname("PLAY"),
|
|
REC_CSTA = esm3Recname("CSTA"),
|
|
REC_GMAP = esm3Recname("GMAP"),
|
|
REC_DIAS = esm3Recname("DIAS"),
|
|
REC_WTHR = esm3Recname("WTHR"),
|
|
REC_KEYS = esm3Recname("KEYS"),
|
|
REC_DYNA = esm3Recname("DYNA"),
|
|
REC_ASPL = esm3Recname("ASPL"),
|
|
REC_ACTC = esm3Recname("ACTC"),
|
|
REC_MPRJ = esm3Recname("MPRJ"),
|
|
REC_PROJ = esm3Recname("PROJ"),
|
|
REC_DCOU = esm3Recname("DCOU"),
|
|
REC_MARK = esm3Recname("MARK"),
|
|
REC_ENAB = esm3Recname("ENAB"),
|
|
REC_CAM_ = esm3Recname("CAM_"),
|
|
REC_STLN = esm3Recname("STLN"),
|
|
REC_INPU = esm3Recname("INPU"),
|
|
|
|
// format 1
|
|
REC_FILT = esm3Recname("FILT"),
|
|
REC_DBGP = esm3Recname("DBGP"), ///< only used in project files
|
|
REC_LUAL = esm3Recname("LUAL"), // LuaScriptsCfg (only in omwgame or omwaddon)
|
|
|
|
// format 16 - Lua scripts in saved games
|
|
REC_LUAM = esm3Recname("LUAM"), // LuaManager data
|
|
|
|
// format 21 - Random state in saved games.
|
|
REC_RAND = esm3Recname("RAND"), // Random state.
|
|
|
|
REC_AACT4 = esm4Recname(ESM4::REC_AACT), // Action
|
|
REC_ACHR4 = esm4Recname(ESM4::REC_ACHR), // Actor Reference
|
|
REC_ACTI4 = esm4Recname(ESM4::REC_ACTI), // Activator
|
|
REC_ADDN4 = esm4Recname(ESM4::REC_ADDN), // Addon Node
|
|
REC_ALCH4 = esm4Recname(ESM4::REC_ALCH), // Potion
|
|
REC_AMMO4 = esm4Recname(ESM4::REC_AMMO), // Ammo
|
|
REC_ANIO4 = esm4Recname(ESM4::REC_ANIO), // Animated Object
|
|
REC_APPA4 = esm4Recname(ESM4::REC_APPA), // Apparatus (probably unused)
|
|
REC_ARMA4 = esm4Recname(ESM4::REC_ARMA), // Armature (Model)
|
|
REC_ARMO4 = esm4Recname(ESM4::REC_ARMO), // Armor
|
|
REC_ARTO4 = esm4Recname(ESM4::REC_ARTO), // Art Object
|
|
REC_ASPC4 = esm4Recname(ESM4::REC_ASPC), // Acoustic Space
|
|
REC_ASTP4 = esm4Recname(ESM4::REC_ASTP), // Association Type
|
|
REC_AVIF4 = esm4Recname(ESM4::REC_AVIF), // Actor Values/Perk Tree Graphics
|
|
REC_BOOK4 = esm4Recname(ESM4::REC_BOOK), // Book
|
|
REC_BPTD4 = esm4Recname(ESM4::REC_BPTD), // Body Part Data
|
|
REC_CAMS4 = esm4Recname(ESM4::REC_CAMS), // Camera Shot
|
|
REC_CELL4 = esm4Recname(ESM4::REC_CELL), // Cell
|
|
REC_CLAS4 = esm4Recname(ESM4::REC_CLAS), // Class
|
|
REC_CLFM4 = esm4Recname(ESM4::REC_CLFM), // Color
|
|
REC_CLMT4 = esm4Recname(ESM4::REC_CLMT), // Climate
|
|
REC_CLOT4 = esm4Recname(ESM4::REC_CLOT), // Clothing
|
|
REC_COBJ4 = esm4Recname(ESM4::REC_COBJ), // Constructible Object (recipes)
|
|
REC_COLL4 = esm4Recname(ESM4::REC_COLL), // Collision Layer
|
|
REC_CONT4 = esm4Recname(ESM4::REC_CONT), // Container
|
|
REC_CPTH4 = esm4Recname(ESM4::REC_CPTH), // Camera Path
|
|
REC_CREA4 = esm4Recname(ESM4::REC_CREA), // Creature
|
|
REC_CSTY4 = esm4Recname(ESM4::REC_CSTY), // Combat Style
|
|
REC_DEBR4 = esm4Recname(ESM4::REC_DEBR), // Debris
|
|
REC_DIAL4 = esm4Recname(ESM4::REC_DIAL), // Dialog Topic
|
|
REC_DLBR4 = esm4Recname(ESM4::REC_DLBR), // Dialog Branch
|
|
REC_DLVW4 = esm4Recname(ESM4::REC_DLVW), // Dialog View
|
|
REC_DOBJ4 = esm4Recname(ESM4::REC_DOBJ), // Default Object Manager
|
|
REC_DOOR4 = esm4Recname(ESM4::REC_DOOR), // Door
|
|
REC_DUAL4 = esm4Recname(ESM4::REC_DUAL), // Dual Cast Data (possibly unused)
|
|
REC_ECZN4 = esm4Recname(ESM4::REC_ECZN), // Encounter Zone
|
|
REC_EFSH4 = esm4Recname(ESM4::REC_EFSH), // Effect Shader
|
|
REC_ENCH4 = esm4Recname(ESM4::REC_ENCH), // Enchantment
|
|
REC_EQUP4 = esm4Recname(ESM4::REC_EQUP), // Equip Slot (flag-type values)
|
|
REC_EXPL4 = esm4Recname(ESM4::REC_EXPL), // Explosion
|
|
REC_EYES4 = esm4Recname(ESM4::REC_EYES), // Eyes
|
|
REC_FACT4 = esm4Recname(ESM4::REC_FACT), // Faction
|
|
REC_FLOR4 = esm4Recname(ESM4::REC_FLOR), // Flora
|
|
REC_FLST4 = esm4Recname(ESM4::REC_FLST), // Form List (non-levelled list)
|
|
REC_FSTP4 = esm4Recname(ESM4::REC_FSTP), // Footstep
|
|
REC_FSTS4 = esm4Recname(ESM4::REC_FSTS), // Footstep Set
|
|
REC_FURN4 = esm4Recname(ESM4::REC_FURN), // Furniture
|
|
REC_GLOB4 = esm4Recname(ESM4::REC_GLOB), // Global Variable
|
|
REC_GMST4 = esm4Recname(ESM4::REC_GMST), // Game Setting
|
|
REC_GRAS4 = esm4Recname(ESM4::REC_GRAS), // Grass
|
|
REC_GRUP4 = esm4Recname(ESM4::REC_GRUP), // Form Group
|
|
REC_HAIR4 = esm4Recname(ESM4::REC_HAIR), // Hair
|
|
REC_HAZD4 = esm4Recname(ESM4::REC_HAZD), // Hazard
|
|
REC_HDPT4 = esm4Recname(ESM4::REC_HDPT), // Head Part
|
|
REC_IDLE4 = esm4Recname(ESM4::REC_IDLE), // Idle Animation
|
|
REC_IDLM4 = esm4Recname(ESM4::REC_IDLM), // Idle Marker
|
|
REC_IMAD4 = esm4Recname(ESM4::REC_IMAD), // Image Space Modifier
|
|
REC_IMGS4 = esm4Recname(ESM4::REC_IMGS), // Image Space
|
|
REC_INFO4 = esm4Recname(ESM4::REC_INFO), // Dialog Topic Info
|
|
REC_INGR4 = esm4Recname(ESM4::REC_INGR), // Ingredient
|
|
REC_IPCT4 = esm4Recname(ESM4::REC_IPCT), // Impact Data
|
|
REC_IPDS4 = esm4Recname(ESM4::REC_IPDS), // Impact Data Set
|
|
REC_KEYM4 = esm4Recname(ESM4::REC_KEYM), // Key
|
|
REC_KYWD4 = esm4Recname(ESM4::REC_KYWD), // Keyword
|
|
REC_LAND4 = esm4Recname(ESM4::REC_LAND), // Land
|
|
REC_LCRT4 = esm4Recname(ESM4::REC_LCRT), // Location Reference Type
|
|
REC_LCTN4 = esm4Recname(ESM4::REC_LCTN), // Location
|
|
REC_LGTM4 = esm4Recname(ESM4::REC_LGTM), // Lighting Template
|
|
REC_LIGH4 = esm4Recname(ESM4::REC_LIGH), // Light
|
|
REC_LSCR4 = esm4Recname(ESM4::REC_LSCR), // Load Screen
|
|
REC_LTEX4 = esm4Recname(ESM4::REC_LTEX), // Land Texture
|
|
REC_LVLC4 = esm4Recname(ESM4::REC_LVLC), // Leveled Creature
|
|
REC_LVLI4 = esm4Recname(ESM4::REC_LVLI), // Leveled Item
|
|
REC_LVLN4 = esm4Recname(ESM4::REC_LVLN), // Leveled Actor
|
|
REC_LVSP4 = esm4Recname(ESM4::REC_LVSP), // Leveled Spell
|
|
REC_MATO4 = esm4Recname(ESM4::REC_MATO), // Material Object
|
|
REC_MATT4 = esm4Recname(ESM4::REC_MATT), // Material Type
|
|
REC_MESG4 = esm4Recname(ESM4::REC_MESG), // Message
|
|
REC_MGEF4 = esm4Recname(ESM4::REC_MGEF), // Magic Effect
|
|
REC_MISC4 = esm4Recname(ESM4::REC_MISC), // Misc. Object
|
|
REC_MOVT4 = esm4Recname(ESM4::REC_MOVT), // Movement Type
|
|
REC_MSTT4 = esm4Recname(ESM4::REC_MSTT), // Movable Static
|
|
REC_MUSC4 = esm4Recname(ESM4::REC_MUSC), // Music Type
|
|
REC_MUST4 = esm4Recname(ESM4::REC_MUST), // Music Track
|
|
REC_NAVI4 = esm4Recname(ESM4::REC_NAVI), // Navigation (master data)
|
|
REC_NAVM4 = esm4Recname(ESM4::REC_NAVM), // Nav Mesh
|
|
REC_NOTE4 = esm4Recname(ESM4::REC_NOTE), // Note
|
|
REC_NPC_4 = esm4Recname(ESM4::REC_NPC_), // Actor (NPC, Creature)
|
|
REC_OTFT4 = esm4Recname(ESM4::REC_OTFT), // Outfit
|
|
REC_PACK4 = esm4Recname(ESM4::REC_PACK), // AI Package
|
|
REC_PERK4 = esm4Recname(ESM4::REC_PERK), // Perk
|
|
REC_PGRE4 = esm4Recname(ESM4::REC_PGRE), // Placed grenade
|
|
REC_PHZD4 = esm4Recname(ESM4::REC_PHZD), // Placed hazard
|
|
REC_PROJ4 = esm4Recname(ESM4::REC_PROJ), // Projectile
|
|
REC_QUST4 = esm4Recname(ESM4::REC_QUST), // Quest
|
|
REC_RACE4 = esm4Recname(ESM4::REC_RACE), // Race / Creature type
|
|
REC_REFR4 = esm4Recname(ESM4::REC_REFR), // Object Reference
|
|
REC_REGN4 = esm4Recname(ESM4::REC_REGN), // Region (Audio/Weather)
|
|
REC_RELA4 = esm4Recname(ESM4::REC_RELA), // Relationship
|
|
REC_REVB4 = esm4Recname(ESM4::REC_REVB), // Reverb Parameters
|
|
REC_RFCT4 = esm4Recname(ESM4::REC_RFCT), // Visual Effect
|
|
REC_SBSP4 = esm4Recname(ESM4::REC_SBSP), // Subspace (TES4 only?)
|
|
REC_SCEN4 = esm4Recname(ESM4::REC_SCEN), // Scene
|
|
REC_SCPT4 = esm4Recname(ESM4::REC_SCPT), // Script
|
|
REC_SCRL4 = esm4Recname(ESM4::REC_SCRL), // Scroll
|
|
REC_SGST4 = esm4Recname(ESM4::REC_SGST), // Sigil Stone
|
|
REC_SHOU4 = esm4Recname(ESM4::REC_SHOU), // Shout
|
|
REC_SLGM4 = esm4Recname(ESM4::REC_SLGM), // Soul Gem
|
|
REC_SMBN4 = esm4Recname(ESM4::REC_SMBN), // Story Manager Branch Node
|
|
REC_SMEN4 = esm4Recname(ESM4::REC_SMEN), // Story Manager Event Node
|
|
REC_SMQN4 = esm4Recname(ESM4::REC_SMQN), // Story Manager Quest Node
|
|
REC_SNCT4 = esm4Recname(ESM4::REC_SNCT), // Sound Category
|
|
REC_SNDR4 = esm4Recname(ESM4::REC_SNDR), // Sound Reference
|
|
REC_SOPM4 = esm4Recname(ESM4::REC_SOPM), // Sound Output Model
|
|
REC_SOUN4 = esm4Recname(ESM4::REC_SOUN), // Sound
|
|
REC_SPEL4 = esm4Recname(ESM4::REC_SPEL), // Spell
|
|
REC_SPGD4 = esm4Recname(ESM4::REC_SPGD), // Shader Particle Geometry
|
|
REC_STAT4 = esm4Recname(ESM4::REC_STAT), // Static
|
|
REC_TACT4 = esm4Recname(ESM4::REC_TACT), // Talking Activator
|
|
REC_TERM4 = esm4Recname(ESM4::REC_TERM), // Terminal
|
|
REC_TES44 = esm4Recname(ESM4::REC_TES4), // Plugin info
|
|
REC_TREE4 = esm4Recname(ESM4::REC_TREE), // Tree
|
|
REC_TXST4 = esm4Recname(ESM4::REC_TXST), // Texture Set
|
|
REC_VTYP4 = esm4Recname(ESM4::REC_VTYP), // Voice Type
|
|
REC_WATR4 = esm4Recname(ESM4::REC_WATR), // Water Type
|
|
REC_WEAP4 = esm4Recname(ESM4::REC_WEAP), // Weapon
|
|
REC_WOOP4 = esm4Recname(ESM4::REC_WOOP), // Word Of Power
|
|
REC_WRLD4 = esm4Recname(ESM4::REC_WRLD), // World Space
|
|
REC_WTHR4 = esm4Recname(ESM4::REC_WTHR), // Weather
|
|
REC_ACRE4 = esm4Recname(ESM4::REC_ACRE), // Placed Creature (TES4 only?)
|
|
REC_PGRD4 = esm4Recname(ESM4::REC_PGRD), // Pathgrid (TES4 only?)
|
|
REC_ROAD4 = esm4Recname(ESM4::REC_ROAD), // Road (TES4 only?)
|
|
REC_IMOD4 = esm4Recname(ESM4::REC_IMOD), // Item Mod
|
|
REC_PWAT4 = esm4Recname(ESM4::REC_PWAT), // Placeable Water
|
|
REC_SCOL4 = esm4Recname(ESM4::REC_SCOL), // Static Collection
|
|
REC_CCRD4 = esm4Recname(ESM4::REC_CCRD), // Caravan Card
|
|
REC_CMNY4 = esm4Recname(ESM4::REC_CMNY), // Caravan Money
|
|
REC_ALOC4 = esm4Recname(ESM4::REC_ALOC), // Audio Location Controller
|
|
REC_MSET4 = esm4Recname(ESM4::REC_MSET) // Media Set
|
|
};
|
|
|
|
constexpr bool isESM4Rec(RecNameInts RecName)
|
|
{
|
|
return RecName & sEsm4RecnameFlag;
|
|
}
|
|
|
|
/// Common subrecords
|
|
enum SubRecNameInts
|
|
{
|
|
SREC_DELE = ESM::fourCC("DELE"),
|
|
SREC_NAME = ESM::fourCC("NAME")
|
|
};
|
|
|
|
}
|
|
#endif
|