# ifndef OPENMW_ESM_DEFS_H
# define OPENMW_ESM_DEFS_H
# include <stdint.h>
# include <tuple>
# include <osg/Vec3f>
# 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 ;
Finished ALCH, APPA, BOOK, CLOT, CREC, ENCH, GLOB, INGR, LIGH, MISC, RACE, SKIL, SNDG, SSCR and STAT. Phew!
15 years ago
enum Specialization
{
SPC_Combat = 0 ,
SPC_Magic = 1 ,
SPC_Stealth = 2
} ;
Finished ALCH, APPA, BOOK, CLOT, CREC, ENCH, GLOB, INGR, LIGH, MISC, RACE, SKIL, SNDG, SSCR and STAT. Phew!
15 years ago
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 esm4RecnameFlag = 0x00800000 ;
constexpr unsigned int esm3Recname ( const char ( & name ) [ 5 ] ) {
return ( fourCC ( name ) & esm4RecnameFlag ) = = 0 ? fourCC ( name ) : 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 ) {
return ( recType & esm4RecnameFlag ) = = 0 ? ( recType | esm4RecnameFlag ) : 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 ( " \xa4 UOR " ) , // "\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
} ;
/// Common subrecords
enum SubRecNameInts
{
SREC_DELE = ESM : : fourCC ( " DELE " ) ,
SREC_NAME = ESM : : fourCC ( " NAME " )
} ;
}
# endif