mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 18:56:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			939 lines
		
	
	
	
		
			42 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			939 lines
		
	
	
	
		
			42 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|   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.
 | |
| 
 | |
|   MKTAG macro was adapated from ScummVM.
 | |
| 
 | |
| */
 | |
| #ifndef ESM4_COMMON_H
 | |
| #define ESM4_COMMON_H
 | |
| 
 | |
| #include <cstdint>
 | |
| #include <string>
 | |
| 
 | |
| #include "formid.hpp"
 | |
| 
 | |
| // From ScummVM's endianness.h but for little endian
 | |
| #ifndef MKTAG
 | |
| #define MKTAG(a0,a1,a2,a3) ((std::uint32_t)((a0) | ((a1) << 8) | ((a2) << 16) | ((a3) << 24)))
 | |
| #endif
 | |
| 
 | |
| namespace ESM4
 | |
| {
 | |
| 
 | |
|     // Based on http://www.uesp.net/wiki/Tes5Mod:Mod_File_Format
 | |
|     enum RecordTypes
 | |
|     {
 | |
|         REC_AACT = MKTAG('A','A','C','T'), // Action
 | |
|         REC_ACHR = MKTAG('A','C','H','R'), // Actor Reference
 | |
|         REC_ACTI = MKTAG('A','C','T','I'), // Activator
 | |
|         REC_ADDN = MKTAG('A','D','D','N'), // Addon Node
 | |
|         REC_ALCH = MKTAG('A','L','C','H'), // Potion
 | |
|         REC_AMMO = MKTAG('A','M','M','O'), // Ammo
 | |
|         REC_ANIO = MKTAG('A','N','I','O'), // Animated Object
 | |
|         REC_APPA = MKTAG('A','P','P','A'), // Apparatus (probably unused)
 | |
|         REC_ARMA = MKTAG('A','R','M','A'), // Armature (Model)
 | |
|         REC_ARMO = MKTAG('A','R','M','O'), // Armor
 | |
|         REC_ARTO = MKTAG('A','R','T','O'), // Art Object
 | |
|         REC_ASPC = MKTAG('A','S','P','C'), // Acoustic Space
 | |
|         REC_ASTP = MKTAG('A','S','T','P'), // Association Type
 | |
|         REC_AVIF = MKTAG('A','V','I','F'), // Actor Values/Perk Tree Graphics
 | |
|         REC_BOOK = MKTAG('B','O','O','K'), // Book
 | |
|         REC_BPTD = MKTAG('B','P','T','D'), // Body Part Data
 | |
|         REC_CAMS = MKTAG('C','A','M','S'), // Camera Shot
 | |
|         REC_CELL = MKTAG('C','E','L','L'), // Cell
 | |
|         REC_CLAS = MKTAG('C','L','A','S'), // Class
 | |
|         REC_CLFM = MKTAG('C','L','F','M'), // Color
 | |
|         REC_CLMT = MKTAG('C','L','M','T'), // Climate
 | |
|         REC_CLOT = MKTAG('C','L','O','T'), // Clothing
 | |
|         REC_COBJ = MKTAG('C','O','B','J'), // Constructible Object (recipes)
 | |
|         REC_COLL = MKTAG('C','O','L','L'), // Collision Layer
 | |
|         REC_CONT = MKTAG('C','O','N','T'), // Container
 | |
|         REC_CPTH = MKTAG('C','P','T','H'), // Camera Path
 | |
|         REC_CREA = MKTAG('C','R','E','A'), // Creature
 | |
|         REC_CSTY = MKTAG('C','S','T','Y'), // Combat Style
 | |
|         REC_DEBR = MKTAG('D','E','B','R'), // Debris
 | |
|         REC_DIAL = MKTAG('D','I','A','L'), // Dialog Topic
 | |
|         REC_DLBR = MKTAG('D','L','B','R'), // Dialog Branch
 | |
|         REC_DLVW = MKTAG('D','L','V','W'), // Dialog View
 | |
|         REC_DOBJ = MKTAG('D','O','B','J'), // Default Object Manager
 | |
|         REC_DOOR = MKTAG('D','O','O','R'), // Door
 | |
|         REC_DUAL = MKTAG('D','U','A','L'), // Dual Cast Data (possibly unused)
 | |
|       //REC_ECZN = MKTAG('E','C','Z','N'), // Encounter Zone
 | |
|         REC_EFSH = MKTAG('E','F','S','H'), // Effect Shader
 | |
|         REC_ENCH = MKTAG('E','N','C','H'), // Enchantment
 | |
|         REC_EQUP = MKTAG('E','Q','U','P'), // Equip Slot (flag-type values)
 | |
|         REC_EXPL = MKTAG('E','X','P','L'), // Explosion
 | |
|         REC_EYES = MKTAG('E','Y','E','S'), // Eyes
 | |
|         REC_FACT = MKTAG('F','A','C','T'), // Faction
 | |
|         REC_FLOR = MKTAG('F','L','O','R'), // Flora
 | |
|         REC_FLST = MKTAG('F','L','S','T'), // Form List (non-levelled list)
 | |
|         REC_FSTP = MKTAG('F','S','T','P'), // Footstep
 | |
|         REC_FSTS = MKTAG('F','S','T','S'), // Footstep Set
 | |
|         REC_FURN = MKTAG('F','U','R','N'), // Furniture
 | |
|         REC_GLOB = MKTAG('G','L','O','B'), // Global Variable
 | |
|         REC_GMST = MKTAG('G','M','S','T'), // Game Setting
 | |
|         REC_GRAS = MKTAG('G','R','A','S'), // Grass
 | |
|         REC_GRUP = MKTAG('G','R','U','P'), // Form Group
 | |
|         REC_HAIR = MKTAG('H','A','I','R'), // Hair
 | |
|       //REC_HAZD = MKTAG('H','A','Z','D'), // Hazard
 | |
|         REC_HDPT = MKTAG('H','D','P','T'), // Head Part
 | |
|         REC_IDLE = MKTAG('I','D','L','E'), // Idle Animation
 | |
|         REC_IDLM = MKTAG('I','D','L','M'), // Idle Marker
 | |
|         REC_IMAD = MKTAG('I','M','A','D'), // Image Space Modifier
 | |
|         REC_IMGS = MKTAG('I','M','G','S'), // Image Space
 | |
|         REC_INFO = MKTAG('I','N','F','O'), // Dialog Topic Info
 | |
|         REC_INGR = MKTAG('I','N','G','R'), // Ingredient
 | |
|         REC_IPCT = MKTAG('I','P','C','T'), // Impact Data
 | |
|         REC_IPDS = MKTAG('I','P','D','S'), // Impact Data Set
 | |
|         REC_KEYM = MKTAG('K','E','Y','M'), // Key
 | |
|         REC_KYWD = MKTAG('K','Y','W','D'), // Keyword
 | |
|         REC_LAND = MKTAG('L','A','N','D'), // Land
 | |
|         REC_LCRT = MKTAG('L','C','R','T'), // Location Reference Type
 | |
|         REC_LCTN = MKTAG('L','C','T','N'), // Location
 | |
|         REC_LGTM = MKTAG('L','G','T','M'), // Lighting Template
 | |
|         REC_LIGH = MKTAG('L','I','G','H'), // Light
 | |
|         REC_LSCR = MKTAG('L','S','C','R'), // Load Screen
 | |
|         REC_LTEX = MKTAG('L','T','E','X'), // Land Texture
 | |
|         REC_LVLC = MKTAG('L','V','L','C'), // Leveled Creature
 | |
|         REC_LVLI = MKTAG('L','V','L','I'), // Leveled Item
 | |
|         REC_LVLN = MKTAG('L','V','L','N'), // Leveled Actor
 | |
|         REC_LVSP = MKTAG('L','V','S','P'), // Leveled Spell
 | |
|         REC_MATO = MKTAG('M','A','T','O'), // Material Object
 | |
|         REC_MATT = MKTAG('M','A','T','T'), // Material Type
 | |
|         REC_MESG = MKTAG('M','E','S','G'), // Message
 | |
|         REC_MGEF = MKTAG('M','G','E','F'), // Magic Effect
 | |
|         REC_MISC = MKTAG('M','I','S','C'), // Misc. Object
 | |
|         REC_MOVT = MKTAG('M','O','V','T'), // Movement Type
 | |
|         REC_MSTT = MKTAG('M','S','T','T'), // Movable Static
 | |
|         REC_MUSC = MKTAG('M','U','S','C'), // Music Type
 | |
|         REC_MUST = MKTAG('M','U','S','T'), // Music Track
 | |
|         REC_NAVI = MKTAG('N','A','V','I'), // Navigation (master data)
 | |
|         REC_NAVM = MKTAG('N','A','V','M'), // Nav Mesh
 | |
|         REC_NOTE = MKTAG('N','O','T','E'), // Note
 | |
|         REC_NPC_ = MKTAG('N','P','C','_'), // Actor (NPC, Creature)
 | |
|         REC_OTFT = MKTAG('O','T','F','T'), // Outfit
 | |
|         REC_PACK = MKTAG('P','A','C','K'), // AI Package
 | |
|         REC_PERK = MKTAG('P','E','R','K'), // Perk
 | |
|         REC_PGRE = MKTAG('P','G','R','E'), // Placed grenade
 | |
|         REC_PHZD = MKTAG('P','H','Z','D'), // Placed hazard
 | |
|         REC_PROJ = MKTAG('P','R','O','J'), // Projectile
 | |
|         REC_QUST = MKTAG('Q','U','S','T'), // Quest
 | |
|         REC_RACE = MKTAG('R','A','C','E'), // Race / Creature type
 | |
|         REC_REFR = MKTAG('R','E','F','R'), // Object Reference
 | |
|         REC_REGN = MKTAG('R','E','G','N'), // Region (Audio/Weather)
 | |
|         REC_RELA = MKTAG('R','E','L','A'), // Relationship
 | |
|         REC_REVB = MKTAG('R','E','V','B'), // Reverb Parameters
 | |
|         REC_RFCT = MKTAG('R','F','C','T'), // Visual Effect
 | |
|         REC_SBSP = MKTAG('S','B','S','P'), // Subspace (TES4 only?)
 | |
|         REC_SCEN = MKTAG('S','C','E','N'), // Scene
 | |
|         REC_SCPT = MKTAG('S','C','P','T'), // Script
 | |
|         REC_SCRL = MKTAG('S','C','R','L'), // Scroll
 | |
|         REC_SGST = MKTAG('S','G','S','T'), // Sigil Stone
 | |
|         REC_SHOU = MKTAG('S','H','O','U'), // Shout
 | |
|         REC_SLGM = MKTAG('S','L','G','M'), // Soul Gem
 | |
|         REC_SMBN = MKTAG('S','M','B','N'), // Story Manager Branch Node
 | |
|         REC_SMEN = MKTAG('S','M','E','N'), // Story Manager Event Node
 | |
|         REC_SMQN = MKTAG('S','M','Q','N'), // Story Manager Quest Node
 | |
|         REC_SNCT = MKTAG('S','N','C','T'), // Sound Category
 | |
|         REC_SNDR = MKTAG('S','N','D','R'), // Sound Reference
 | |
|         REC_SOPM = MKTAG('S','O','P','M'), // Sound Output Model
 | |
|         REC_SOUN = MKTAG('S','O','U','N'), // Sound
 | |
|         REC_SPEL = MKTAG('S','P','E','L'), // Spell
 | |
|         REC_SPGD = MKTAG('S','P','G','D'), // Shader Particle Geometry
 | |
|         REC_STAT = MKTAG('S','T','A','T'), // Static
 | |
|         REC_TACT = MKTAG('T','A','C','T'), // Talking Activator
 | |
|         REC_TERM = MKTAG('T','E','R','M'), // Terminal
 | |
|         REC_TES4 = MKTAG('T','E','S','4'), // Plugin info
 | |
|         REC_TREE = MKTAG('T','R','E','E'), // Tree
 | |
|         REC_TXST = MKTAG('T','X','S','T'), // Texture Set
 | |
|         REC_VTYP = MKTAG('V','T','Y','P'), // Voice Type
 | |
|         REC_WATR = MKTAG('W','A','T','R'), // Water Type
 | |
|         REC_WEAP = MKTAG('W','E','A','P'), // Weapon
 | |
|         REC_WOOP = MKTAG('W','O','O','P'), // Word Of Power
 | |
|         REC_WRLD = MKTAG('W','R','L','D'), // World Space
 | |
|         REC_WTHR = MKTAG('W','T','H','R'), // Weather
 | |
|         REC_ACRE = MKTAG('A','C','R','E'), // Placed Creature (TES4 only?)
 | |
|         REC_PGRD = MKTAG('P','G','R','D'), // Pathgrid (TES4 only?)
 | |
|         REC_ROAD = MKTAG('R','O','A','D'), // Road (TES4 only?)
 | |
|         REC_IMOD = MKTAG('I','M','O','D'), // Item Mod
 | |
|         REC_PWAT = MKTAG('P','W','A','T'), // Placeable Water
 | |
|         REC_SCOL = MKTAG('S','C','O','L'), // Static Collection
 | |
|         REC_CCRD = MKTAG('C','C','R','D'), // Caravan Card
 | |
|         REC_CMNY = MKTAG('C','M','N','Y'), // Caravan Money
 | |
|         REC_ALOC = MKTAG('A','L','O','C'), // Audio Location Controller
 | |
|         REC_MSET = MKTAG('M','S','E','T')  // Media Set
 | |
|     };
 | |
| 
 | |
|     enum SubRecordTypes
 | |
|     {
 | |
|         SUB_HEDR = MKTAG('H','E','D','R'),
 | |
|         SUB_CNAM = MKTAG('C','N','A','M'),
 | |
|         SUB_SNAM = MKTAG('S','N','A','M'), // TES4 only?
 | |
|         SUB_MAST = MKTAG('M','A','S','T'),
 | |
|         SUB_DATA = MKTAG('D','A','T','A'),
 | |
|         SUB_ONAM = MKTAG('O','N','A','M'),
 | |
|         SUB_INTV = MKTAG('I','N','T','V'),
 | |
|         SUB_INCC = MKTAG('I','N','C','C'),
 | |
|         SUB_OFST = MKTAG('O','F','S','T'), // TES4 only?
 | |
|         SUB_DELE = MKTAG('D','E','L','E'), // TES4 only?
 | |
| 
 | |
|         SUB_DNAM = MKTAG('D','N','A','M'),
 | |
|         SUB_EDID = MKTAG('E','D','I','D'),
 | |
|         SUB_FULL = MKTAG('F','U','L','L'),
 | |
|         SUB_LTMP = MKTAG('L','T','M','P'),
 | |
|         SUB_MHDT = MKTAG('M','H','D','T'),
 | |
|         SUB_MNAM = MKTAG('M','N','A','M'),
 | |
|         SUB_MODL = MKTAG('M','O','D','L'),
 | |
|         SUB_NAM0 = MKTAG('N','A','M','0'),
 | |
|         SUB_NAM2 = MKTAG('N','A','M','2'),
 | |
|         SUB_NAM3 = MKTAG('N','A','M','3'),
 | |
|         SUB_NAM4 = MKTAG('N','A','M','4'),
 | |
|         SUB_NAM9 = MKTAG('N','A','M','9'),
 | |
|         SUB_NAMA = MKTAG('N','A','M','A'),
 | |
|         SUB_PNAM = MKTAG('P','N','A','M'),
 | |
|         SUB_RNAM = MKTAG('R','N','A','M'),
 | |
|         SUB_TNAM = MKTAG('T','N','A','M'),
 | |
|         SUB_UNAM = MKTAG('U','N','A','M'),
 | |
|         SUB_WCTR = MKTAG('W','C','T','R'),
 | |
|         SUB_WNAM = MKTAG('W','N','A','M'),
 | |
|         SUB_XEZN = MKTAG('X','E','Z','N'),
 | |
|         SUB_XLCN = MKTAG('X','L','C','N'),
 | |
|         SUB_XXXX = MKTAG('X','X','X','X'),
 | |
|         SUB_ZNAM = MKTAG('Z','N','A','M'),
 | |
|         SUB_MODT = MKTAG('M','O','D','T'),
 | |
|         SUB_ICON = MKTAG('I','C','O','N'), // TES4 only?
 | |
| 
 | |
|         SUB_NVER = MKTAG('N','V','E','R'),
 | |
|         SUB_NVMI = MKTAG('N','V','M','I'),
 | |
|         SUB_NVPP = MKTAG('N','V','P','P'),
 | |
|         SUB_NVSI = MKTAG('N','V','S','I'),
 | |
| 
 | |
|         SUB_NVNM = MKTAG('N','V','N','M'),
 | |
|         SUB_NNAM = MKTAG('N','N','A','M'),
 | |
| 
 | |
|         SUB_XCLC = MKTAG('X','C','L','C'),
 | |
|         SUB_XCLL = MKTAG('X','C','L','L'),
 | |
|         SUB_TVDT = MKTAG('T','V','D','T'),
 | |
|         SUB_XCGD = MKTAG('X','C','G','D'),
 | |
|         SUB_LNAM = MKTAG('L','N','A','M'),
 | |
|         SUB_XCLW = MKTAG('X','C','L','W'),
 | |
|         SUB_XNAM = MKTAG('X','N','A','M'),
 | |
|         SUB_XCLR = MKTAG('X','C','L','R'),
 | |
|         SUB_XWCS = MKTAG('X','W','C','S'),
 | |
|         SUB_XWCN = MKTAG('X','W','C','N'),
 | |
|         SUB_XWCU = MKTAG('X','W','C','U'),
 | |
|         SUB_XCWT = MKTAG('X','C','W','T'),
 | |
|         SUB_XOWN = MKTAG('X','O','W','N'),
 | |
|         SUB_XILL = MKTAG('X','I','L','L'),
 | |
|         SUB_XWEM = MKTAG('X','W','E','M'),
 | |
|         SUB_XCCM = MKTAG('X','C','C','M'),
 | |
|         SUB_XCAS = MKTAG('X','C','A','S'),
 | |
|         SUB_XCMO = MKTAG('X','C','M','O'),
 | |
|         SUB_XCIM = MKTAG('X','C','I','M'),
 | |
|         SUB_XCMT = MKTAG('X','C','M','T'), // TES4 only?
 | |
|         SUB_XRNK = MKTAG('X','R','N','K'), // TES4 only?
 | |
|         SUB_XGLB = MKTAG('X','G','L','B'), // TES4 only?
 | |
| 
 | |
|         SUB_VNML = MKTAG('V','N','M','L'),
 | |
|         SUB_VHGT = MKTAG('V','H','G','T'),
 | |
|         SUB_VCLR = MKTAG('V','C','L','R'),
 | |
|         SUA_BTXT = MKTAG('B','T','X','T'),
 | |
|         SUB_ATXT = MKTAG('A','T','X','T'),
 | |
|         SUB_VTXT = MKTAG('V','T','X','T'),
 | |
|         SUB_VTEX = MKTAG('V','T','E','X'),
 | |
| 
 | |
|         SUB_HNAM = MKTAG('H','N','A','M'),
 | |
|         SUB_GNAM = MKTAG('G','N','A','M'),
 | |
| 
 | |
|         SUB_RCLR = MKTAG('R','C','L','R'),
 | |
|         SUB_RPLI = MKTAG('R','P','L','I'),
 | |
|         SUB_RPLD = MKTAG('R','P','L','D'),
 | |
|         SUB_RDAT = MKTAG('R','D','A','T'),
 | |
|         SUB_RDMD = MKTAG('R','D','M','D'), // TES4 only?
 | |
|         SUB_RDSD = MKTAG('R','D','S','D'), // TES4 only?
 | |
|         SUB_RDGS = MKTAG('R','D','G','S'), // TES4 only?
 | |
|         SUB_RDMO = MKTAG('R','D','M','O'),
 | |
|         SUB_RDSA = MKTAG('R','D','S','A'),
 | |
|         SUB_RDWT = MKTAG('R','D','W','T'),
 | |
|         SUB_RDOT = MKTAG('R','D','O','T'),
 | |
|         SUB_RDMP = MKTAG('R','D','M','P'),
 | |
| 
 | |
|         SUB_MODB = MKTAG('M','O','D','B'),
 | |
|         SUB_OBND = MKTAG('O','B','N','D'),
 | |
|         SUB_MODS = MKTAG('M','O','D','S'),
 | |
| 
 | |
|         SUB_NAME = MKTAG('N','A','M','E'),
 | |
|         SUB_XMRK = MKTAG('X','M','R','K'),
 | |
|         SUB_FNAM = MKTAG('F','N','A','M'),
 | |
|         SUB_XSCL = MKTAG('X','S','C','L'),
 | |
|         SUB_XTEL = MKTAG('X','T','E','L'),
 | |
|         SUB_XTRG = MKTAG('X','T','R','G'),
 | |
|         SUB_XSED = MKTAG('X','S','E','D'),
 | |
|         SUB_XLOD = MKTAG('X','L','O','D'),
 | |
|         SUB_XPCI = MKTAG('X','P','C','I'),
 | |
|         SUB_XLOC = MKTAG('X','L','O','C'),
 | |
|         SUB_XESP = MKTAG('X','E','S','P'),
 | |
|         SUB_XLCM = MKTAG('X','L','C','M'),
 | |
|         SUB_XRTM = MKTAG('X','R','T','M'),
 | |
|         SUB_XACT = MKTAG('X','A','C','T'),
 | |
|         SUB_XCNT = MKTAG('X','C','N','T'),
 | |
|         SUB_VMAD = MKTAG('V','M','A','D'),
 | |
|         SUB_XPRM = MKTAG('X','P','R','M'),
 | |
|         SUB_XMBO = MKTAG('X','M','B','O'),
 | |
|         SUB_XPOD = MKTAG('X','P','O','D'),
 | |
|         SUB_XRMR = MKTAG('X','R','M','R'),
 | |
|         SUB_INAM = MKTAG('I','N','A','M'),
 | |
|         SUB_SCHR = MKTAG('S','C','H','R'),
 | |
|         SUB_XLRM = MKTAG('X','L','R','M'),
 | |
|         SUB_XRGD = MKTAG('X','R','G','D'),
 | |
|         SUB_XRDS = MKTAG('X','R','D','S'),
 | |
|         SUB_XEMI = MKTAG('X','E','M','I'),
 | |
|         SUB_XLIG = MKTAG('X','L','I','G'),
 | |
|         SUB_XALP = MKTAG('X','A','L','P'),
 | |
|         SUB_XNDP = MKTAG('X','N','D','P'),
 | |
|         SUB_XAPD = MKTAG('X','A','P','D'),
 | |
|         SUB_XAPR = MKTAG('X','A','P','R'),
 | |
|         SUB_XLIB = MKTAG('X','L','I','B'),
 | |
|         SUB_XLKR = MKTAG('X','L','K','R'),
 | |
|         SUB_XLRT = MKTAG('X','L','R','T'),
 | |
|         SUB_XCVL = MKTAG('X','C','V','L'),
 | |
|         SUB_XCVR = MKTAG('X','C','V','R'),
 | |
|         SUB_XCZA = MKTAG('X','C','Z','A'),
 | |
|         SUB_XCZC = MKTAG('X','C','Z','C'),
 | |
|         SUB_XFVC = MKTAG('X','F','V','C'),
 | |
|         SUB_XHTW = MKTAG('X','H','T','W'),
 | |
|         SUB_XIS2 = MKTAG('X','I','S','2'),
 | |
|         SUB_XMBR = MKTAG('X','M','B','R'),
 | |
|         SUB_XCCP = MKTAG('X','C','C','P'),
 | |
|         SUB_XPWR = MKTAG('X','P','W','R'),
 | |
|         SUB_XTRI = MKTAG('X','T','R','I'),
 | |
|         SUB_XATR = MKTAG('X','A','T','R'),
 | |
|         SUB_XPRD = MKTAG('X','P','R','D'),
 | |
|         SUB_XPPA = MKTAG('X','P','P','A'),
 | |
|         SUB_PDTO = MKTAG('P','D','T','O'),
 | |
|         SUB_XLRL = MKTAG('X','L','R','L'),
 | |
| 
 | |
|         SUB_QNAM = MKTAG('Q','N','A','M'),
 | |
|         SUB_COCT = MKTAG('C','O','C','T'),
 | |
|         SUB_COED = MKTAG('C','O','E','D'),
 | |
|         SUB_CNTO = MKTAG('C','N','T','O'),
 | |
|         SUB_SCRI = MKTAG('S','C','R','I'),
 | |
| 
 | |
|         SUB_BNAM = MKTAG('B','N','A','M'),
 | |
| 
 | |
|         SUB_BMDT = MKTAG('B','M','D','T'),
 | |
|         SUB_MOD2 = MKTAG('M','O','D','2'),
 | |
|         SUB_MOD3 = MKTAG('M','O','D','3'),
 | |
|         SUB_MOD4 = MKTAG('M','O','D','4'),
 | |
|         SUB_MO2B = MKTAG('M','O','2','B'),
 | |
|         SUB_MO3B = MKTAG('M','O','3','B'),
 | |
|         SUB_MO4B = MKTAG('M','O','4','B'),
 | |
|         SUB_MO2T = MKTAG('M','O','2','T'),
 | |
|         SUB_MO3T = MKTAG('M','O','3','T'),
 | |
|         SUB_MO4T = MKTAG('M','O','4','T'),
 | |
|         SUB_ANAM = MKTAG('A','N','A','M'),
 | |
|         SUB_ENAM = MKTAG('E','N','A','M'),
 | |
|         SUB_ICO2 = MKTAG('I','C','O','2'),
 | |
| 
 | |
|         SUB_ACBS = MKTAG('A','C','B','S'),
 | |
|         SUB_SPLO = MKTAG('S','P','L','O'),
 | |
|         SUB_AIDT = MKTAG('A','I','D','T'),
 | |
|         SUB_PKID = MKTAG('P','K','I','D'),
 | |
|         SUB_HCLR = MKTAG('H','C','L','R'),
 | |
|         SUB_FGGS = MKTAG('F','G','G','S'),
 | |
|         SUB_FGGA = MKTAG('F','G','G','A'),
 | |
|         SUB_FGTS = MKTAG('F','G','T','S'),
 | |
|         SUB_KFFZ = MKTAG('K','F','F','Z'),
 | |
| 
 | |
|         SUB_PFIG = MKTAG('P','F','I','G'),
 | |
|         SUB_PFPC = MKTAG('P','F','P','C'),
 | |
| 
 | |
|         SUB_XHRS = MKTAG('X','H','R','S'),
 | |
|         SUB_XMRC = MKTAG('X','M','R','C'),
 | |
| 
 | |
|         SUB_SNDD = MKTAG('S','N','D','D'),
 | |
|         SUB_SNDX = MKTAG('S','N','D','X'),
 | |
| 
 | |
|         SUB_DESC = MKTAG('D','E','S','C'),
 | |
| 
 | |
|         SUB_ENIT = MKTAG('E','N','I','T'),
 | |
|         SUB_EFID = MKTAG('E','F','I','D'),
 | |
|         SUB_EFIT = MKTAG('E','F','I','T'),
 | |
|         SUB_SCIT = MKTAG('S','C','I','T'),
 | |
| 
 | |
|         SUB_SOUL = MKTAG('S','O','U','L'),
 | |
|         SUB_SLCP = MKTAG('S','L','C','P'),
 | |
| 
 | |
|         SUB_CSCR = MKTAG('C','S','C','R'),
 | |
|         SUB_CSDI = MKTAG('C','S','D','I'),
 | |
|         SUB_CSDC = MKTAG('C','S','D','C'),
 | |
|         SUB_NIFZ = MKTAG('N','I','F','Z'),
 | |
|         SUB_CSDT = MKTAG('C','S','D','T'),
 | |
|         SUB_NAM1 = MKTAG('N','A','M','1'),
 | |
|         SUB_NIFT = MKTAG('N','I','F','T'),
 | |
| 
 | |
|         SUB_LVLD = MKTAG('L','V','L','D'),
 | |
|         SUB_LVLF = MKTAG('L','V','L','F'),
 | |
|         SUB_LVLO = MKTAG('L','V','L','O'),
 | |
| 
 | |
|         SUB_BODT = MKTAG('B','O','D','T'),
 | |
|         SUB_YNAM = MKTAG('Y','N','A','M'),
 | |
|         SUB_DEST = MKTAG('D','E','S','T'),
 | |
|         SUB_DMDL = MKTAG('D','M','D','L'),
 | |
|         SUB_DMDS = MKTAG('D','M','D','S'),
 | |
|         SUB_DMDT = MKTAG('D','M','D','T'),
 | |
|         SUB_DSTD = MKTAG('D','S','T','D'),
 | |
|         SUB_DSTF = MKTAG('D','S','T','F'),
 | |
|         SUB_KNAM = MKTAG('K','N','A','M'),
 | |
|         SUB_KSIZ = MKTAG('K','S','I','Z'),
 | |
|         SUB_KWDA = MKTAG('K','W','D','A'),
 | |
|         SUB_VNAM = MKTAG('V','N','A','M'),
 | |
|         SUB_SDSC = MKTAG('S','D','S','C'),
 | |
|         SUB_MO2S = MKTAG('M','O','2','S'),
 | |
|         SUB_MO4S = MKTAG('M','O','4','S'),
 | |
|         SUB_BOD2 = MKTAG('B','O','D','2'),
 | |
|         SUB_BAMT = MKTAG('B','A','M','T'),
 | |
|         SUB_BIDS = MKTAG('B','I','D','S'),
 | |
|         SUB_ETYP = MKTAG('E','T','Y','P'),
 | |
|         SUB_BMCT = MKTAG('B','M','C','T'),
 | |
|         SUB_MICO = MKTAG('M','I','C','O'),
 | |
|         SUB_MIC2 = MKTAG('M','I','C','2'),
 | |
|         SUB_EAMT = MKTAG('E','A','M','T'),
 | |
|         SUB_EITM = MKTAG('E','I','T','M'),
 | |
| 
 | |
|         SUB_SCTX = MKTAG('S','C','T','X'),
 | |
|         SUB_XLTW = MKTAG('X','L','T','W'),
 | |
|         SUB_XMBP = MKTAG('X','M','B','P'),
 | |
|         SUB_XOCP = MKTAG('X','O','C','P'),
 | |
|         SUB_XRGB = MKTAG('X','R','G','B'),
 | |
|         SUB_XSPC = MKTAG('X','S','P','C'),
 | |
|         SUB_XTNM = MKTAG('X','T','N','M'),
 | |
|         SUB_ATKR = MKTAG('A','T','K','R'),
 | |
|         SUB_CRIF = MKTAG('C','R','I','F'),
 | |
|         SUB_DOFT = MKTAG('D','O','F','T'),
 | |
|         SUB_DPLT = MKTAG('D','P','L','T'),
 | |
|         SUB_ECOR = MKTAG('E','C','O','R'),
 | |
|         SUB_ATKD = MKTAG('A','T','K','D'),
 | |
|         SUB_ATKE = MKTAG('A','T','K','E'),
 | |
|         SUB_FTST = MKTAG('F','T','S','T'),
 | |
|         SUB_HCLF = MKTAG('H','C','L','F'),
 | |
|         SUB_NAM5 = MKTAG('N','A','M','5'),
 | |
|         SUB_NAM6 = MKTAG('N','A','M','6'),
 | |
|         SUB_NAM7 = MKTAG('N','A','M','7'),
 | |
|         SUB_NAM8 = MKTAG('N','A','M','8'),
 | |
|         SUB_PRKR = MKTAG('P','R','K','R'),
 | |
|         SUB_PRKZ = MKTAG('P','R','K','Z'),
 | |
|         SUB_SOFT = MKTAG('S','O','F','T'),
 | |
|         SUB_SPCT = MKTAG('S','P','C','T'),
 | |
|         SUB_TINC = MKTAG('T','I','N','C'),
 | |
|         SUB_TIAS = MKTAG('T','I','A','S'),
 | |
|         SUB_TINI = MKTAG('T','I','N','I'),
 | |
|         SUB_TINV = MKTAG('T','I','N','V'),
 | |
|         SUB_TPLT = MKTAG('T','P','L','T'),
 | |
|         SUB_VTCK = MKTAG('V','T','C','K'),
 | |
|         SUB_SHRT = MKTAG('S','H','R','T'),
 | |
|         SUB_SPOR = MKTAG('S','P','O','R'),
 | |
|         SUB_XHOR = MKTAG('X','H','O','R'),
 | |
|         SUB_CTDA = MKTAG('C','T','D','A'),
 | |
|         SUB_CRDT = MKTAG('C','R','D','T'),
 | |
|         SUB_FNMK = MKTAG('F','N','M','K'),
 | |
|         SUB_FNPR = MKTAG('F','N','P','R'),
 | |
|         SUB_WBDT = MKTAG('W','B','D','T'),
 | |
|         SUB_QUAL = MKTAG('Q','U','A','L'),
 | |
|         SUB_INDX = MKTAG('I','N','D','X'),
 | |
|         SUB_ATTR = MKTAG('A','T','T','R'),
 | |
|         SUB_MTNM = MKTAG('M','T','N','M'),
 | |
|         SUB_UNES = MKTAG('U','N','E','S'),
 | |
|         SUB_TIND = MKTAG('T','I','N','D'),
 | |
|         SUB_TINL = MKTAG('T','I','N','L'),
 | |
|         SUB_TINP = MKTAG('T','I','N','P'),
 | |
|         SUB_TINT = MKTAG('T','I','N','T'),
 | |
|         SUB_TIRS = MKTAG('T','I','R','S'),
 | |
|         SUB_PHWT = MKTAG('P','H','W','T'),
 | |
|         SUB_AHCF = MKTAG('A','H','C','F'),
 | |
|         SUB_AHCM = MKTAG('A','H','C','M'),
 | |
|         SUB_HEAD = MKTAG('H','E','A','D'),
 | |
|         SUB_MPAI = MKTAG('M','P','A','I'),
 | |
|         SUB_MPAV = MKTAG('M','P','A','V'),
 | |
|         SUB_DFTF = MKTAG('D','F','T','F'),
 | |
|         SUB_DFTM = MKTAG('D','F','T','M'),
 | |
|         SUB_FLMV = MKTAG('F','L','M','V'),
 | |
|         SUB_FTSF = MKTAG('F','T','S','F'),
 | |
|         SUB_FTSM = MKTAG('F','T','S','M'),
 | |
|         SUB_MTYP = MKTAG('M','T','Y','P'),
 | |
|         SUB_PHTN = MKTAG('P','H','T','N'),
 | |
|         SUB_RNMV = MKTAG('R','N','M','V'),
 | |
|         SUB_RPRF = MKTAG('R','P','R','F'),
 | |
|         SUB_RPRM = MKTAG('R','P','R','M'),
 | |
|         SUB_SNMV = MKTAG('S','N','M','V'),
 | |
|         SUB_SPED = MKTAG('S','P','E','D'),
 | |
|         SUB_SWMV = MKTAG('S','W','M','V'),
 | |
|         SUB_WKMV = MKTAG('W','K','M','V'),
 | |
|         SUB_LLCT = MKTAG('L','L','C','T'),
 | |
|         SUB_IDLF = MKTAG('I','D','L','F'),
 | |
|         SUB_IDLA = MKTAG('I','D','L','A'),
 | |
|         SUB_IDLC = MKTAG('I','D','L','C'),
 | |
|         SUB_IDLT = MKTAG('I','D','L','T'),
 | |
|         SUB_DODT = MKTAG('D','O','D','T'),
 | |
|         SUB_TX00 = MKTAG('T','X','0','0'),
 | |
|         SUB_TX01 = MKTAG('T','X','0','1'),
 | |
|         SUB_TX02 = MKTAG('T','X','0','2'),
 | |
|         SUB_TX03 = MKTAG('T','X','0','3'),
 | |
|         SUB_TX04 = MKTAG('T','X','0','4'),
 | |
|         SUB_TX05 = MKTAG('T','X','0','5'),
 | |
|         SUB_TX06 = MKTAG('T','X','0','6'),
 | |
|         SUB_TX07 = MKTAG('T','X','0','7'),
 | |
|         SUB_BPND = MKTAG('B','P','N','D'),
 | |
|         SUB_BPTN = MKTAG('B','P','T','N'),
 | |
|         SUB_BPNN = MKTAG('B','P','N','N'),
 | |
|         SUB_BPNT = MKTAG('B','P','N','T'),
 | |
|         SUB_BPNI = MKTAG('B','P','N','I'),
 | |
|         SUB_RAGA = MKTAG('R','A','G','A'),
 | |
| 
 | |
|         SUB_QSTI = MKTAG('Q','S','T','I'),
 | |
|         SUB_QSTR = MKTAG('Q','S','T','R'),
 | |
|         SUB_QSDT = MKTAG('Q','S','D','T'),
 | |
|         SUB_SCDA = MKTAG('S','C','D','A'),
 | |
|         SUB_SCRO = MKTAG('S','C','R','O'),
 | |
|         SUB_QSTA = MKTAG('Q','S','T','A'),
 | |
|         SUB_CTDT = MKTAG('C','T','D','T'),
 | |
|         SUB_SCHD = MKTAG('S','C','H','D'),
 | |
|         SUB_TCLF = MKTAG('T','C','L','F'),
 | |
|         SUB_TCLT = MKTAG('T','C','L','T'),
 | |
|         SUB_TRDT = MKTAG('T','R','D','T'),
 | |
|         SUB_TPIC = MKTAG('T','P','I','C'),
 | |
| 
 | |
|         SUB_PKDT = MKTAG('P','K','D','T'),
 | |
|         SUB_PSDT = MKTAG('P','S','D','T'),
 | |
|         SUB_PLDT = MKTAG('P','L','D','T'),
 | |
|         SUB_PTDT = MKTAG('P','T','D','T'),
 | |
|         SUB_PGRP = MKTAG('P','G','R','P'),
 | |
|         SUB_PGRR = MKTAG('P','G','R','R'),
 | |
|         SUB_PGRI = MKTAG('P','G','R','I'),
 | |
|         SUB_PGRL = MKTAG('P','G','R','L'),
 | |
|         SUB_PGAG = MKTAG('P','G','A','G'),
 | |
|         SUB_FLTV = MKTAG('F','L','T','V'),
 | |
| 
 | |
|         SUB_XHLT = MKTAG('X','H','L','T'), // Unofficial Oblivion Patch
 | |
|         SUB_XCHG = MKTAG('X','C','H','G'), // thievery.exp
 | |
| 
 | |
|         SUB_ITXT = MKTAG('I','T','X','T'),
 | |
|         SUB_MO5T = MKTAG('M','O','5','T'),
 | |
|         SUB_MOD5 = MKTAG('M','O','D','5'),
 | |
|         SUB_MDOB = MKTAG('M','D','O','B'),
 | |
|         SUB_SPIT = MKTAG('S','P','I','T'),
 | |
|         SUB_PTDA = MKTAG('P','T','D','A'), // TES5
 | |
|         SUB_PFOR = MKTAG('P','F','O','R'), // TES5
 | |
|         SUB_PFO2 = MKTAG('P','F','O','2'), // TES5
 | |
|         SUB_PRCB = MKTAG('P','R','C','B'), // TES5
 | |
|         SUB_PKCU = MKTAG('P','K','C','U'), // TES5
 | |
|         SUB_PKC2 = MKTAG('P','K','C','2'), // TES5
 | |
|         SUB_CITC = MKTAG('C','I','T','C'), // TES5
 | |
|         SUB_CIS1 = MKTAG('C','I','S','1'), // TES5
 | |
|         SUB_CIS2 = MKTAG('C','I','S','2'), // TES5
 | |
|         SUB_TIFC = MKTAG('T','I','F','C'), // TES5
 | |
|         SUB_ALCA = MKTAG('A','L','C','A'), // TES5
 | |
|         SUB_ALCL = MKTAG('A','L','C','L'), // TES5
 | |
|         SUB_ALCO = MKTAG('A','L','C','O'), // TES5
 | |
|         SUB_ALDN = MKTAG('A','L','D','N'), // TES5
 | |
|         SUB_ALEA = MKTAG('A','L','E','A'), // TES5
 | |
|         SUB_ALED = MKTAG('A','L','E','D'), // TES5
 | |
|         SUB_ALEQ = MKTAG('A','L','E','Q'), // TES5
 | |
|         SUB_ALFA = MKTAG('A','L','F','A'), // TES5
 | |
|         SUB_ALFC = MKTAG('A','L','F','C'), // TES5
 | |
|         SUB_ALFD = MKTAG('A','L','F','D'), // TES5
 | |
|         SUB_ALFE = MKTAG('A','L','F','E'), // TES5
 | |
|         SUB_ALFI = MKTAG('A','L','F','I'), // TES5
 | |
|         SUB_ALFL = MKTAG('A','L','F','L'), // TES5
 | |
|         SUB_ALFR = MKTAG('A','L','F','R'), // TES5
 | |
|         SUB_ALID = MKTAG('A','L','I','D'), // TES5
 | |
|         SUB_ALLS = MKTAG('A','L','L','S'), // TES5
 | |
|         SUB_ALNA = MKTAG('A','L','N','A'), // TES5
 | |
|         SUB_ALNT = MKTAG('A','L','N','T'), // TES5
 | |
|         SUB_ALPC = MKTAG('A','L','P','C'), // TES5
 | |
|         SUB_ALRT = MKTAG('A','L','R','T'), // TES5
 | |
|         SUB_ALSP = MKTAG('A','L','S','P'), // TES5
 | |
|         SUB_ALST = MKTAG('A','L','S','T'), // TES5
 | |
|         SUB_ALUA = MKTAG('A','L','U','A'), // TES5
 | |
|         SUB_FLTR = MKTAG('F','L','T','R'), // TES5
 | |
|         SUB_QTGL = MKTAG('Q','T','G','L'), // TES5
 | |
|         SUB_TWAT = MKTAG('T','W','A','T'), // TES5
 | |
|         SUB_XIBS = MKTAG('X','I','B','S'), // FO3
 | |
|         SUB_REPL = MKTAG('R','E','P','L'), // FO3
 | |
|         SUB_BIPL = MKTAG('B','I','P','L'), // FO3
 | |
|         SUB_MODD = MKTAG('M','O','D','D'), // FO3
 | |
|         SUB_MOSD = MKTAG('M','O','S','D'), // FO3
 | |
|         SUB_MO3S = MKTAG('M','O','3','S'), // FO3
 | |
|         SUB_XCET = MKTAG('X','C','E','T'), // FO3
 | |
|         SUB_LVLG = MKTAG('L','V','L','G'), // FO3
 | |
|         SUB_NVCI = MKTAG('N','V','C','I'), // FO3
 | |
|         SUB_NVVX = MKTAG('N','V','V','X'), // FO3
 | |
|         SUB_NVTR = MKTAG('N','V','T','R'), // FO3
 | |
|         SUB_NVCA = MKTAG('N','V','C','A'), // FO3
 | |
|         SUB_NVDP = MKTAG('N','V','D','P'), // FO3
 | |
|         SUB_NVGD = MKTAG('N','V','G','D'), // FO3
 | |
|         SUB_NVEX = MKTAG('N','V','E','X'), // FO3
 | |
|         SUB_XHLP = MKTAG('X','H','L','P'), // FO3
 | |
|         SUB_XRDO = MKTAG('X','R','D','O'), // FO3
 | |
|         SUB_XAMT = MKTAG('X','A','M','T'), // FO3
 | |
|         SUB_XAMC = MKTAG('X','A','M','C'), // FO3
 | |
|         SUB_XRAD = MKTAG('X','R','A','D'), // FO3
 | |
|         SUB_XORD = MKTAG('X','O','R','D'), // FO3
 | |
|         SUB_XCLP = MKTAG('X','C','L','P'), // FO3
 | |
|         SUB_NEXT = MKTAG('N','E','X','T'), // FO3
 | |
|         SUB_QOBJ = MKTAG('Q','O','B','J'), // FO3
 | |
|         SUB_POBA = MKTAG('P','O','B','A'), // FO3
 | |
|         SUB_POCA = MKTAG('P','O','C','A'), // FO3
 | |
|         SUB_POEA = MKTAG('P','O','E','A'), // FO3
 | |
|         SUB_PKDD = MKTAG('P','K','D','D'), // FO3
 | |
|         SUB_PKD2 = MKTAG('P','K','D','2'), // FO3
 | |
|         SUB_PKPT = MKTAG('P','K','P','T'), // FO3
 | |
|         SUB_PKED = MKTAG('P','K','E','D'), // FO3
 | |
|         SUB_PKE2 = MKTAG('P','K','E','2'), // FO3
 | |
|         SUB_PKAM = MKTAG('P','K','A','M'), // FO3
 | |
|         SUB_PUID = MKTAG('P','U','I','D'), // FO3
 | |
|         SUB_PKW3 = MKTAG('P','K','W','3'), // FO3
 | |
|         SUB_PTD2 = MKTAG('P','T','D','2'), // FO3
 | |
|         SUB_PLD2 = MKTAG('P','L','D','2'), // FO3
 | |
|         SUB_PKFD = MKTAG('P','K','F','D'), // FO3
 | |
|         SUB_IDLB = MKTAG('I','D','L','B'), // FO3
 | |
|         SUB_XDCR = MKTAG('X','D','C','R'), // FO3
 | |
|         SUB_DALC = MKTAG('D','A','L','C'), // FO3
 | |
|         SUB_IMPS = MKTAG('I','M','P','S'), // FO3 Anchorage
 | |
|         SUB_IMPF = MKTAG('I','M','P','F'), // FO3 Anchorage
 | |
| 
 | |
|         SUB_XATO = MKTAG('X','A','T','O'), // FONV
 | |
|         SUB_INFC = MKTAG('I','N','F','C'), // FONV
 | |
|         SUB_INFX = MKTAG('I','N','F','X'), // FONV
 | |
|         SUB_TDUM = MKTAG('T','D','U','M'), // FONV
 | |
|         SUB_TCFU = MKTAG('T','C','F','U'), // FONV
 | |
|         SUB_DAT2 = MKTAG('D','A','T','2'), // FONV
 | |
|         SUB_RCIL = MKTAG('R','C','I','L'), // FONV
 | |
|         SUB_MMRK = MKTAG('M','M','R','K'), // FONV
 | |
|         SUB_SCRV = MKTAG('S','C','R','V'), // FONV
 | |
|         SUB_SCVR = MKTAG('S','C','V','R'), // FONV
 | |
|         SUB_SLSD = MKTAG('S','L','S','D'), // FONV
 | |
|         SUB_XSRF = MKTAG('X','S','R','F'), // FONV
 | |
|         SUB_XSRD = MKTAG('X','S','R','D'), // FONV
 | |
|         SUB_WMI1 = MKTAG('W','M','I','1'), // FONV
 | |
|         SUB_RDID = MKTAG('R','D','I','D'), // FONV
 | |
|         SUB_RDSB = MKTAG('R','D','S','B'), // FONV
 | |
|         SUB_RDSI = MKTAG('R','D','S','I'), // FONV
 | |
|         SUB_BRUS = MKTAG('B','R','U','S'), // FONV
 | |
|         SUB_VATS = MKTAG('V','A','T','S'), // FONV
 | |
|         SUB_VANM = MKTAG('V','A','N','M'), // FONV
 | |
|         SUB_MWD1 = MKTAG('M','W','D','1'), // FONV
 | |
|         SUB_MWD2 = MKTAG('M','W','D','2'), // FONV
 | |
|         SUB_MWD3 = MKTAG('M','W','D','3'), // FONV
 | |
|         SUB_MWD4 = MKTAG('M','W','D','4'), // FONV
 | |
|         SUB_MWD5 = MKTAG('M','W','D','5'), // FONV
 | |
|         SUB_MWD6 = MKTAG('M','W','D','6'), // FONV
 | |
|         SUB_MWD7 = MKTAG('M','W','D','7'), // FONV
 | |
|         SUB_WMI2 = MKTAG('W','M','I','2'), // FONV
 | |
|         SUB_WMI3 = MKTAG('W','M','I','3'), // FONV
 | |
|         SUB_WMS1 = MKTAG('W','M','S','1'), // FONV
 | |
|         SUB_WMS2 = MKTAG('W','M','S','2'), // FONV
 | |
|         SUB_WNM1 = MKTAG('W','N','M','1'), // FONV
 | |
|         SUB_WNM2 = MKTAG('W','N','M','2'), // FONV
 | |
|         SUB_WNM3 = MKTAG('W','N','M','3'), // FONV
 | |
|         SUB_WNM4 = MKTAG('W','N','M','4'), // FONV
 | |
|         SUB_WNM5 = MKTAG('W','N','M','5'), // FONV
 | |
|         SUB_WNM6 = MKTAG('W','N','M','6'), // FONV
 | |
|         SUB_WNM7 = MKTAG('W','N','M','7'), // FONV
 | |
|         SUB_JNAM = MKTAG('J','N','A','M'), // FONV
 | |
|         SUB_EFSD = MKTAG('E','F','S','D'), // FONV DeadMoney
 | |
|     };
 | |
| 
 | |
|     enum MagicEffectID
 | |
|     {
 | |
|         // Alteration
 | |
|         EFI_BRDN = MKTAG('B','R','D','N'),
 | |
|         EFI_FTHR = MKTAG('F','T','H','R'),
 | |
|         EFI_FISH = MKTAG('F','I','S','H'),
 | |
|         EFI_FRSH = MKTAG('F','R','S','H'),
 | |
|         EFI_OPEN = MKTAG('O','P','N','N'),
 | |
|         EFI_SHLD = MKTAG('S','H','L','D'),
 | |
|         EFI_LISH = MKTAG('L','I','S','H'),
 | |
|         EFI_WABR = MKTAG('W','A','B','R'),
 | |
|         EFI_WAWA = MKTAG('W','A','W','A'),
 | |
| 
 | |
|         // Conjuration
 | |
|         EFI_BABO = MKTAG('B','A','B','O'), // Bound Boots
 | |
|         EFI_BACU = MKTAG('B','A','C','U'), // Bound Cuirass
 | |
|         EFI_BAGA = MKTAG('B','A','G','A'), // Bound Gauntlets
 | |
|         EFI_BAGR = MKTAG('B','A','G','R'), // Bound Greaves
 | |
|         EFI_BAHE = MKTAG('B','A','H','E'), // Bound Helmet
 | |
|         EFI_BASH = MKTAG('B','A','S','H'), // Bound Shield
 | |
|         EFI_BWAX = MKTAG('B','W','A','X'), // Bound Axe
 | |
|         EFI_BWBO = MKTAG('B','W','B','O'), // Bound Bow
 | |
|         EFI_BWDA = MKTAG('B','W','D','A'), // Bound Dagger
 | |
|         EFI_BWMA = MKTAG('B','W','M','A'), // Bound Mace
 | |
|         EFI_BWSW = MKTAG('B','W','S','W'), // Bound Sword
 | |
|         EFI_Z001 = MKTAG('Z','0','0','1'), // Summon Rufio's Ghost
 | |
|         EFI_Z002 = MKTAG('Z','0','0','2'), // Summon Ancestor Guardian
 | |
|         EFI_Z003 = MKTAG('Z','0','0','3'), // Summon Spiderling
 | |
|         EFI_Z005 = MKTAG('Z','0','0','5'), // Summon Bear
 | |
|         EFI_ZCLA = MKTAG('Z','C','L','A'), // Summon Clannfear
 | |
|         EFI_ZDAE = MKTAG('Z','D','A','E'), // Summon Daedroth
 | |
|         EFI_ZDRE = MKTAG('Z','D','R','E'), // Summon Dremora
 | |
|         EFI_ZDRL = MKTAG('Z','D','R','L'), // Summon Dremora Lord
 | |
|         EFI_ZFIA = MKTAG('Z','F','I','A'), // Summon Flame Atronach
 | |
|         EFI_ZFRA = MKTAG('Z','F','R','A'), // Summon Frost Atronach
 | |
|         EFI_ZGHO = MKTAG('Z','G','H','O'), // Summon Ghost
 | |
|         EFI_ZHDZ = MKTAG('Z','H','D','Z'), // Summon Headless Zombie
 | |
|         EFI_ZLIC = MKTAG('Z','L','I','C'), // Summon Lich
 | |
|         EFI_ZSCA = MKTAG('Z','S','C','A'), // Summon Scamp
 | |
|         EFI_ZSKE = MKTAG('Z','S','K','E'), // Summon Skeleton
 | |
|         EFI_ZSKA = MKTAG('Z','S','K','A'), // Summon Skeleton Guardian
 | |
|         EFI_ZSKH = MKTAG('Z','S','K','H'), // Summon Skeleton Hero
 | |
|         EFI_ZSKC = MKTAG('Z','S','K','C'), // Summon Skeleton Champion
 | |
|         EFI_ZSPD = MKTAG('Z','S','P','D'), // Summon Spider Daedra
 | |
|         EFI_ZSTA = MKTAG('Z','S','T','A'), // Summon Storm Atronach
 | |
|         EFI_ZWRA = MKTAG('Z','W','R','A'), // Summon Faded Wraith
 | |
|         EFI_ZWRL = MKTAG('Z','W','R','L'), // Summon Gloom Wraith
 | |
|         EFI_ZXIV = MKTAG('Z','X','I','V'), // Summon Xivilai
 | |
|         EFI_ZZOM = MKTAG('Z','Z','O','M'), // Summon Zombie
 | |
|         EFI_TURN = MKTAG('T','U','R','N'), // Turn Undead
 | |
| 
 | |
|         // Destruction
 | |
|         EFI_DGAT = MKTAG('D','G','A','T'), // Damage Attribute
 | |
|         EFI_DGFA = MKTAG('D','G','F','A'), // Damage Fatigue
 | |
|         EFI_DGHE = MKTAG('D','G','H','E'), // Damage Health
 | |
|         EFI_DGSP = MKTAG('D','G','S','P'), // Damage Magicka
 | |
|         EFI_DIAR = MKTAG('D','I','A','R'), // Disintegrate Armor
 | |
|         EFI_DIWE = MKTAG('D','I','W','E'), // Disintegrate Weapon
 | |
|         EFI_DRAT = MKTAG('D','R','A','T'), // Drain Attribute
 | |
|         EFI_DRFA = MKTAG('D','R','F','A'), // Drain Fatigue
 | |
|         EFI_DRHE = MKTAG('D','R','H','E'), // Drain Health
 | |
|         EFI_DRSP = MKTAG('D','R','S','P'), // Drain Magicka
 | |
|         EFI_DRSK = MKTAG('D','R','S','K'), // Drain Skill
 | |
|         EFI_FIDG = MKTAG('F','I','D','G'), // Fire Damage
 | |
|         EFI_FRDG = MKTAG('F','R','D','G'), // Frost Damage
 | |
|         EFI_SHDG = MKTAG('S','H','D','G'), // Shock Damage
 | |
|         EFI_WKDI = MKTAG('W','K','D','I'), // Weakness to Disease
 | |
|         EFI_WKFI = MKTAG('W','K','F','I'), // Weakness to Fire
 | |
|         EFI_WKFR = MKTAG('W','K','F','R'), // Weakness to Frost
 | |
|         EFI_WKMA = MKTAG('W','K','M','A'), // Weakness to Magic
 | |
|         EFI_WKNW = MKTAG('W','K','N','W'), // Weakness to Normal Weapons
 | |
|         EFI_WKPO = MKTAG('W','K','P','O'), // Weakness to Poison
 | |
|         EFI_WKSH = MKTAG('W','K','S','H'), // Weakness to Shock
 | |
| 
 | |
|         // Illusion
 | |
|         EFI_CALM = MKTAG('C','A','L','M'), // Calm
 | |
|         EFI_CHML = MKTAG('C','H','M','L'), // Chameleon
 | |
|         EFI_CHRM = MKTAG('C','H','R','M'), // Charm
 | |
|         EFI_COCR = MKTAG('C','O','C','R'), // Command Creature
 | |
|         EFI_COHU = MKTAG('C','O','H','U'), // Command Humanoid
 | |
|         EFI_DEMO = MKTAG('D','E','M','O'), // Demoralize
 | |
|         EFI_FRNZ = MKTAG('F','R','N','Z'), // Frenzy
 | |
|         EFI_INVI = MKTAG('I','N','V','I'), // Invisibility
 | |
|         EFI_LGHT = MKTAG('L','G','H','T'), // Light
 | |
|         EFI_NEYE = MKTAG('N','E','Y','E'), // Night-Eye
 | |
|         EFI_PARA = MKTAG('P','A','R','A'), // Paralyze
 | |
|         EFI_RALY = MKTAG('R','A','L','Y'), // Rally
 | |
|         EFI_SLNC = MKTAG('S','L','N','C'), // Silence
 | |
| 
 | |
|         // Mysticism
 | |
|         EFI_DTCT = MKTAG('D','T','C','T'), // Detect Life
 | |
|         EFI_DSPL = MKTAG('D','S','P','L'), // Dispel
 | |
|         EFI_REDG = MKTAG('R','E','D','G'), // Reflect Damage
 | |
|         EFI_RFLC = MKTAG('R','F','L','C'), // Reflect Spell
 | |
|         EFI_STRP = MKTAG('S','T','R','P'), // Soul Trap
 | |
|         EFI_SABS = MKTAG('S','A','B','S'), // Spell Absorption
 | |
|         EFI_TELE = MKTAG('T','E','L','E'), // Telekinesis
 | |
| 
 | |
|         // Restoration
 | |
|         EFI_ABAT = MKTAG('A','B','A','T'), // Absorb Attribute
 | |
|         EFI_ABFA = MKTAG('A','B','F','A'), // Absorb Fatigue
 | |
|         EFI_ABHe = MKTAG('A','B','H','e'), // Absorb Health
 | |
|         EFI_ABSP = MKTAG('A','B','S','P'), // Absorb Magicka
 | |
|         EFI_ABSK = MKTAG('A','B','S','K'), // Absorb Skill
 | |
|         EFI_1400 = MKTAG('1','4','0','0'), // Cure Disease
 | |
|         EFI_CUPA = MKTAG('C','U','P','A'), // Cure Paralysis
 | |
|         EFI_CUPO = MKTAG('C','U','P','O'), // Cure Poison
 | |
|         EFI_FOAT = MKTAG('F','O','A','T'), // Fortify Attribute
 | |
|         EFI_FOFA = MKTAG('F','O','F','A'), // Fortify Fatigue
 | |
|         EFI_FOHE = MKTAG('F','O','H','E'), // Fortify Health
 | |
|         EFI_FOSP = MKTAG('F','O','S','P'), // Fortify Magicka
 | |
|         EFI_FOSK = MKTAG('F','O','S','K'), // Fortify Skill
 | |
|         EFI_RSDI = MKTAG('R','S','D','I'), // Resist Disease
 | |
|         EFI_RSFI = MKTAG('R','S','F','I'), // Resist Fire
 | |
|         EFI_RSFR = MKTAG('R','S','F','R'), // Resist Frost
 | |
|         EFI_RSMA = MKTAG('R','S','M','A'), // Resist Magic
 | |
|         EFI_RSNW = MKTAG('R','S','N','W'), // Resist Normal Weapons
 | |
|         EFI_RSPA = MKTAG('R','S','P','A'), // Resist Paralysis
 | |
|         EFI_RSPO = MKTAG('R','S','P','O'), // Resist Poison
 | |
|         EFI_RSSH = MKTAG('R','S','S','H'), // Resist Shock
 | |
|         EFI_REAT = MKTAG('R','E','A','T'), // Restore Attribute
 | |
|         EFI_REFA = MKTAG('R','E','F','A'), // Restore Fatigue
 | |
|         EFI_REHE = MKTAG('R','E','H','E'), // Restore Health
 | |
|         EFI_RESP = MKTAG('R','E','S','P'), // Restore Magicka
 | |
| 
 | |
|         // Effects
 | |
|         EFI_LOCK = MKTAG('L','O','C','K'), // Lock Lock
 | |
|         EFI_SEFF = MKTAG('S','E','F','F'), // Script Effect
 | |
|         EFI_Z020 = MKTAG('Z','0','2','0'), // Summon 20 Extra
 | |
|         EFI_MYHL = MKTAG('M','Y','H','L'), // Summon Mythic Dawn Helmet
 | |
|         EFI_MYTH = MKTAG('M','Y','T','H'), // Summon Mythic Dawn Armor
 | |
|         EFI_REAN = MKTAG('R','E','A','N'), // Reanimate
 | |
|         EFI_DISE = MKTAG('D','I','S','E'), // Disease Info
 | |
|         EFI_POSN = MKTAG('P','O','S','N'), // Poison Info
 | |
|         EFI_DUMY = MKTAG('D','U','M','Y'), // Mehrunes Dagon Custom Effect
 | |
|         EFI_STMA = MKTAG('S','T','M','A'), // Stunted Magicka
 | |
|         EFI_SUDG = MKTAG('S','U','D','G'), // Sun Damage
 | |
|         EFI_VAMP = MKTAG('V','A','M','P'), // Vampirism
 | |
|         EFI_DARK = MKTAG('D','A','R','K'), // Darkness
 | |
|         EFI_RSWD = MKTAG('R','S','W','D')  // 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
 | |
|     enum RecordFlag
 | |
|     {
 | |
|         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_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_Persistent = 0x00000400, // Quest item / Persistent reference
 | |
|         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_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_NavMFilter = 0x04000000, // NavMesh Gen - Filter
 | |
|         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_NavMGround = 0x40000000, // NavMesh Gen - Ground
 | |
|         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)
 | |
|     };
 | |
| 
 | |
|     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
 |