4
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

3484 lines
80 KiB

#pragma once
#include "skse64/GameTypes.h"
#include "skse64/GameFormComponents.h"
//#include "skse/GamePathing.h"
//#include "skse/NiInterpolators.h"
#include "skse64/NiObjects.h"
#include "skse64/NiTypes.h"
class TESForm;
class TESObjectSTAT;
class TESFile;
class TESObjectLIGH;
class TESEffectShader;
class BGSProjectile;
class BGSArtObject;
class BGSImpactDataSet;
class TESSound;
class TESObjectREFR;
class BGSListForm;
class TESQuest;
class BGSExplosion;
class BGSDualCastData;
class TESImageSpaceModifier;
class TESWordOfPower;
class BGSHazard;
class TESNPC;
class TESWorldSpace;
class BSExtraData;
struct ModInfo;
typedef TESForm* (*_LookupFormByID)(UInt32 id);
extern RelocAddr <_LookupFormByID> LookupFormByID;
class FormMatcher
{
public:
virtual bool Matches(TESForm* pForm) const = 0;
};
// TESObject and derivatives are in GameObjects.h
// TESObjectREFR and derivatives are in GameReferences.h
// everything else deriving from TESForm goes here
/**** form types ***************************************************************
*
* TESHair and BGSCloudClusterForm were removed in 1.2
*
* 1.1 1.2 se1.4.2
* id id id code name
*
* 00 00 ?? NONE
* 01 01 ?? TES4
* 02 02 ?? GRUP
* 03 03 ?? GMST <nonstandard loader?>
* 04 04 04 KYWD BGSKeyword
* 05 05 05 LCRT BGSLocationRefType
* 06 06 06 AACT BGSAction
* 07 07 07 TXST BGSTextureSet
* 08 08 08 MICN BGSMenuIcon
* 09 09 09 GLOB TESGlobal
* 0A 0A 0A CLAS TESClass
* 0B 0B 0B FACT TESFaction
* 0C 0C 0C HDPT BGSHeadPart
* 0D xx xx HAIR TESHair
* 0E 0D 0D EYES TESEyes
* 0F 0E 0E RACE TESRace
* 10 0F 0F SOUN TESSound
* 11 10 10 ASPC BGSAcousticSpace
* 12 11 ?? SKIL <missing>
* 13 12 12 MGEF EffectSetting
* 14 13 13 SCPT Script
* 15 14 14 LTEX TESLandTexture
* 16 15 15 ENCH EnchantmentItem
* 17 16 16 SPEL SpellItem
* 18 17 17 SCRL ScrollItem
* 19 18 18 ACTI TESObjectACTI
* 1A 19 19 TACT BGSTalkingActivator
* 1B 1A 1A ARMO TESObjectARMO
* 1C 1B 1B BOOK TESObjectBOOK
* 1D 1C 1C CONT TESObjectCONT
* 1E 1D 1D DOOR TESObjectDOOR
* 1F 1E 1E INGR IngredientItem
* 20 1F 1F LIGH TESObjectLIGH
* 21 20 20 MISC TESObjectMISC
* 22 21 21 APPA BGSApparatus
* 23 22 22 STAT TESObjectSTAT
* 24 23 23 SCOL BGSStaticCollection
* 25 24 24 MSTT BGSMovableStatic
* 26 25 25 GRAS TESGrass
* 27 26 26 TREE TESObjectTREE
* 28 xx xx CLDC BGSCloudClusterForm
* 29 27 27 FLOR TESFlora
* 2A 28 28 FURN TESFurniture
* 2B 29 29 WEAP TESObjectWEAP
* 2C 2A 2A AMMO TESAmmo
* 2D 2B 2B NPC_ TESNPC
* 2E 2C 2C LVLN TESLevCharacter
* 2F 2D 2D KEYM TESKey
* 30 2E 2E ALCH AlchemyItem
* 31 2F 2F IDLM BGSIdleMarker / BGSDefaultObjectManager? strange
* 32 30 30 NOTE BGSNote
* 33 31 31 COBJ BGSConstructibleObject
* 34 32 32 PROJ BGSProjectile
* 35 33 33 HAZD BGSHazard
* 36 34 34 SLGM TESSoulGem
* 37 35 35 LVLI TESLevItem
* 38 36 36 WTHR TESWeather
* 39 37 37 CLMT TESClimate
* 3A 38 38 SPGD BGSShaderParticleGeometryData
* 3B 39 39 RFCT BGSReferenceEffect
* 3C 3A 3A REGN TESRegion
* 3D 3B ?? NAVI NavMeshInfoMap
* 3E 3C 3C CELL TESObjectCELL
* 3F 3D 3D REFR TESObjectREFR / Actor
* 40 3E 3E ACHR Character / PlayerCharacter
* 41 3F 3F PMIS MissileProjectile
* 42 40 40 PARW ArrowProjectile
* 43 41 41 PGRE GrenadeProjectile
* 44 42 42 PBEA BeamProjectile
* 45 43 43 PFLA FlameProjectile
* 46 44 44 PCON ConeProjectile
* 47 45 45 PBAR BarrierProjectile
* 48 46 46 PHZD Hazard
* 49 47 47 WRLD TESWorldSpace
* 4A 48 48 LAND TESObjectLAND
* 4B 49 49 NAVM NavMesh
* 4C 4A 4A TLOD ?
* 4D 4B 4B DIAL TESTopic
* 4E 4C 4C INFO TESTopicInfo
* 4F 4D 4D QUST TESQuest
* 50 4E 4E IDLE TESIdleForm
* 51 4F 4F PACK TESPackage
* 52 50 50 CSTY TESCombatStyle
* 53 51 51 LSCR TESLoadScreen
* 54 52 52 LVSP TESLevSpell
* 55 53 53 ANIO TESObjectANIO
* 56 54 54 WATR TESWaterForm
* 57 55 55 EFSH TESEffectShader
* 58 56 56 TOFT ?
* 59 57 57 EXPL BGSExplosion
* 5A 58 58 DEBR BGSDebris
* 5B 59 59 IMGS TESImageSpace
* 5C 5A 5A IMAD TESImageSpaceModifier
* 5D 5B 5B FLST BGSListForm
* 5E 5C 5C PERK BGSPerk
* 5F 5D 5D BPTD BGSBodyPartData
* 60 5E 5E ADDN BGSAddonNode
* 61 5F 5F AVIF ActorValueInfo
* 62 60 60 CAMS BGSCameraShot
* 63 61 61 CPTH BGSCameraPath
* 64 62 62 VTYP BGSVoiceType
* 65 63 63 MATT BGSMaterialType
* 66 64 64 IPCT BGSImpactData
* 67 65 65 IPDS BGSImpactDataSet
* 68 66 66 ARMA TESObjectARMA
* 69 67 67 ECZN BGSEncounterZone
* 6A 68 68 LCTN BGSLocation
* 6B 69 69 MESH BGSMessage
* 6C 6A 6A RGDL BGSRagdoll
* 6D 6B 6B DOBJ ?
* 6E 6C 6C LGTM BGSLightingTemplate
* 6F 6D 6D MUSC BGSMusicType
* 70 6E 6E FSTP BGSFootstep
* 71 6F 6F FSTS BGSFootstepSet
* 72 70 70 SMBN BGSStoryManagerBranchNode
* 73 71 71 SMQN BGSStoryManagerQuestNode
* 74 72 72 SMEN BGSStoryManagerEventNode
* 75 73 73 DLBR BGSDialogueBranch
* 76 74 74 MUST BGSMusicTrackFormWrapper
* 77 75 ?? DLVW ?
* 78 76 76 WOOP TESWordOfPower
* 79 77 77 SHOU TESShout
* 7A 78 78 EQUP BGSEquipSlot
* 7B 79 79 RELA BGSRelationship
* 7C 7A 7A SCEN BGSScene
* 7D 7B 7B ASTP BGSAssociationType
* 7E 7C 7C OTFT BGSOutfit
* 7F 7D 7D ARTO BGSArtObject
* 80 7E 7E MATO BGSMaterialObject
* 81 7F 7F MOVT BGSMovementType
* 82 80 80 SNDR BGSSoundDescriptorForm
* 83 81 81 DUAL BGSDualCastData
* 84 82 82 SNCT BGSSoundCategory
* 85 83 83 SOPM BGSSoundOutput
* 86 84 84 COLL BGSCollisionLayer
* 87 85 85 CLFM BGSColorForm
* 88 86 86 REVB BGSReverbParameters
* 87 87 LENS Unknown87 / BGSLensFlare
* 88 ?? LSPR Unknown88
* 89 89 VOLI Unknown89 / BGSVolumetricLighting
* 8A Unknown8A
* 8B Alias
* 8C ReferenceAlias
* 8D LocAlias
* 8E ActiveMagicEffect
*/
enum FormType {
kFormType_None = 0, // NONE
kFormType_TES4, // TES4
kFormType_Group, // GRUP
kFormType_GMST, // GMST
kFormType_Keyword, // KYWD BGSKeyword
kFormType_LocationRef, // LCRT BGSLocationRefType
kFormType_Action, // AACT BGSAction
kFormType_TextureSet, // TXST BGSTextureSet
kFormType_MenuIcon, // MICN BGSMenuIcon
kFormType_Global, // GLOB TESGlobal
kFormType_Class, // CLAS TESClass
kFormType_Faction, // FACT TESFaction
kFormType_HeadPart, // HDPT BGSHeadPart
kFormType_Eyes, // EYES TESEyes
kFormType_Race, // RACE TESRace
kFormType_Sound, // SOUN TESSound
kFormType_AcousticSpace, // ASPC BGSAcousticSpace
kFormType_Skill, // SKIL <missing>
kFormType_EffectSetting, // MGEF EffectSetting
kFormType_Script, // SCPT Script
kFormType_LandTexture, // LTEX TESLandTexture
kFormType_Enchantment, // ENCH EnchantmentItem
kFormType_Spell, // SPEL SpellItem
kFormType_ScrollItem, // SCRL ScrollItem
kFormType_Activator, // ACTI TESObjectACTI
kFormType_TalkingActivator, // TACT BGSTalkingActivator
kFormType_Armor, // ARMO TESObjectARMO
kFormType_Book, // BOOK TESObjectBOOK
kFormType_Container, // CONT TESObjectCONT
kFormType_Door, // DOOR TESObjectDOOR
kFormType_Ingredient, // INGR IngredientItem
kFormType_Light, // LIGH TESObjectLIGH
kFormType_Misc, // MISC TESObjectMISC
kFormType_Apparatus, // APPA BGSApparatus
kFormType_Static, // STAT TESObjectSTAT
kFormType_StaticCollection, // SCOL BGSStaticCollection
kFormType_MovableStatic, // MSTT BGSMovableStatic
kFormType_Grass, // GRAS TESGrass
kFormType_Tree, // TREE TESObjectTREE
kFormType_Flora, // FLOR TESFlora
kFormType_Furniture, // FURN TESFurniture
kFormType_Weapon, // WEAP TESObjectWEAP
kFormType_Ammo, // AMMO TESAmmo
kFormType_NPC, // NPC_ TESNPC
kFormType_LeveledCharacter, // LVLN TESLevCharacter
kFormType_Key, // KEYM TESKey
kFormType_Potion, // ALCH AlchemyItem
kFormType_IdleMarker, // IDLM BGSIdleMarker / BGSDefaultObjectManager? strange
kFormType_Note, // NOTE BGSNote
kFormType_ConstructibleObject, // COBJ BGSConstructibleObject
kFormType_Projectile, // PROJ BGSProjectile
kFormType_Hazard, // HAZD BGSHazard
kFormType_SoulGem, // SLGM TESSoulGem
kFormType_LeveledItem, // LVLI TESLevItem
kFormType_Weather, // WTHR TESWeather
kFormType_Climate, // CLMT TESClimate
kFormType_SPGD, // SPGD BGSShaderParticleGeometryData
kFormType_ReferenceEffect, // RFCT BGSReferenceEffect
kFormType_Region, // REGN TESRegion
kFormType_NAVI, // NAVI NavMeshInfoMap
kFormType_Cell, // CELL TESObjectCELL
kFormType_Reference, // REFR TESObjectREFR / Actor
kFormType_Character, // ACHR Character / PlayerCharacter
kFormType_Missile, // PMIS MissileProjectile
kFormType_Arrow, // PARW ArrowProjectile
kFormType_Grenade, // PGRE GrenadeProjectile
kFormType_BeamProj, // PBEA BeamProjectile
kFormType_FlameProj, // PFLA FlameProjectile
kFormType_ConeProj, // PCON ConeProjectile
kFormType_BarrierProj, // PBAR BarrierProjectile
kFormType_PHZD, // PHZD Hazard
kFormType_WorldSpace, // WRLD TESWorldSpace
kFormType_Land, // LAND TESObjectLAND
kFormType_NAVM, // NAVM NavMesh
kFormType_TLOD, // TLOD ?
kFormType_Topic, // DIAL TESTopic
kFormType_TopicInfo, // INFO TESTopicInfo
kFormType_Quest, // QUST TESQuest
kFormType_Idle, // IDLE TESIdleForm
kFormType_Package, // PACK TESPackage
kFormType_CombatStyle, // CSTY TESCombatStyle
kFormType_LoadScreen, // LSCR TESLoadScreen
kFormType_LeveledSpell, // LVSP TESLevSpell
kFormType_ANIO, // ANIO TESObjectANIO
kFormType_Water, // WATR TESWaterForm
kFormType_EffectShader, // EFSH TESEffectShader
kFormType_TOFT, // TOFT ?
kFormType_Explosion, // EXPL BGSExplosion
kFormType_Debris, // DEBR BGSDebris
kFormType_ImageSpace, // IMGS TESImageSpace
kFormType_ImageSpaceMod, // IMAD TESImageSpaceModifier
kFormType_List, // FLST BGSListForm
kFormType_Perk, // PERK BGSPerk
kFormType_BodyPartData, // BPTD BGSBodyPartData
kFormType_AddonNode, // ADDN BGSAddonNode
kFormType_ActorValueInfo, // AVIF ActorValueInfo
kFormType_CameraShot, // CAMS BGSCameraShot
kFormType_CameraPath, // CPTH BGSCameraPath
kFormType_VoiceType, // VTYP BGSVoiceType
kFormType_MaterialType, // MATT BGSMaterialType
kFormType_ImpactData, // IPCT BGSImpactData
kFormType_ImpactDataSet, // IPDS BGSImpactDataSet
kFormType_ARMA, // ARMA TESObjectARMA
kFormType_EncounterZone, // ECZN BGSEncounterZone
kFormType_Location, // LCTN BGSLocation
kFormType_Message, // MESH BGSMessage
kFormType_Ragdoll, // RGDL BGSRagdoll
kFormType_DOBJ, // DOBJ ? (used for default objects, custom loader)
kFormType_LightingTemplate, // LGTM BGSLightingTemplate
kFormType_MusicType, // MUSC BGSMusicType
kFormType_Footstep, // FSTP BGSFootstep
kFormType_FootstepSet, // FSTS BGSFootstepSet
kFormType_StoryBranchNode, // SMBN BGSStoryManagerBranchNode
kFormType_StoryQuestNode, // SMQN BGSStoryManagerQuestNode
kFormType_StoryEventNode, // SMEN BGSStoryManagerEventNode
kFormType_DialogueBranch, // DLBR BGSDialogueBranch
kFormType_MusicTrack, // MUST BGSMusicTrackFormWrapper
kFormType_DLVW, // DLVW ?
kFormType_WordOfPower, // WOOP TESWordOfPower
kFormType_Shout, // SHOU TESShout
kFormType_EquipSlot, // EQUP BGSEquipSlot
kFormType_Relationship, // RELA BGSRelationship
kFormType_Scene, // SCEN BGSScene
kFormType_AssociationType, // ASTP BGSAssociationType
kFormType_Outfit, // OTFT BGSOutfit
kFormType_Art, // ARTO BGSArtObject
kFormType_Material, // MATO BGSMaterialObject
kFormType_MovementType, // MOVT BGSMovementType
kFormType_SoundDescriptor, // SNDR BGSSoundDescriptorForm
kFormType_DualCastData, // DUAL BGSDualCastData
kFormType_SoundCategory, // SNCT BGSSoundCategory
kFormType_SoundOutput, // SOPM BGSSoundOutput
kFormType_CollisionLayer, // COLL BGSCollisionLayer
kFormType_ColorForm, // CLFM BGSColorForm
kFormType_ReverbParam, // REVB BGSReverbParameters
kFormType_LensFlare, //
kFormType_Unk88,
kFormType_VolumetricLighting, //
kFormType_Unk8A,
kFormType_Alias, // BGSBaseAlias
kFormType_ReferenceAlias, // BGSRefAlias
kFormType_LocationAlias, // BGSLocAlias
kFormType_ActiveMagicEffect, // ActiveMagicEffect
kFormType_Max = kFormType_VolumetricLighting // max of standard types
};
STATIC_ASSERT(kFormType_Weapon == 0x29);
STATIC_ASSERT(kFormType_WordOfPower == 0x76);
// 20
class TESForm : public BaseFormComponent
{
public:
enum { kTypeID = 0 }; // special-case
enum {
kFlagIsDeleted = 0x20,
kFlagPlayerKnows = 0x40,
kFlagUnk_0x800 = 0x800,
};
virtual void Unk_04(void); // reset/init? would leak pointers if called on a live object
virtual void Unk_05(void); // release pointers?
virtual bool LoadForm(UInt32 arg);
virtual bool Unk_07(UInt32 arg);
virtual bool Unk_08(UInt32 arg); // calls LoadForm
virtual TESForm * Unk_09(UInt32 arg1, void * arg2);
virtual bool MarkChanged(UInt32 changed);
virtual void ClearChanged(UInt32 changed);
virtual bool Unk_0C(UInt32 arg);
virtual void Unk_0D(UInt32 arg);
virtual void Unk_0E(UInt32 arg);
virtual void Unk_0F(void * arg);
virtual void Unk_10(UInt32 arg);
virtual void Unk_11(UInt32 arg);
virtual void Unk_12(UInt32 arg);
virtual void InitItem(void); // called once all dependent forms are loaded
virtual ModInfo* GetFinalSourceFile();
virtual UInt32 GetFormType(void);
virtual void GetFormDesc(char * buf, UInt32 bufLen);
virtual bool GetFlag00000040(void);
virtual bool GetFlag00010000(void);
virtual bool IsPlayable(void);
virtual bool GetFlag00080000(void);
virtual bool GetFlag02000000(void);
virtual bool Unk_1B(void);
virtual bool GetFlag00000200(void);
virtual bool GetFlag00000100(void);
virtual void SetFlag00000200(bool set);
virtual bool Unk_20(void);
virtual void SetFlag00000020(bool set);
virtual void SetFlag00000002(bool set);
virtual void Unk_23(void);
virtual void Unk_24(UInt32 arg);
virtual bool Unk_25(void);
virtual bool Unk_26(void);
virtual bool Has3D(void);
virtual bool Unk_28(void);
virtual UInt32 Unk_29(void);
virtual UInt32 Unk_2A(void);
virtual UInt32 Unk_2B(void);
virtual const char * GetFullName(void);
virtual void CopyFrom(TESForm * srcForm);
virtual bool Compare(TESForm * rhs);
virtual void Unk_2F(void * dst, UInt32 unk);
virtual const char * GetName(void);
virtual bool SetName(const char * str);
virtual bool Unk_32(void);
virtual bool Unk_33(void);
virtual bool Unk_34(UInt32 arg);
virtual bool Unk_35(UInt32 arg0, UInt32 arg1, UInt32 arg2, UInt32 arg3, UInt32 arg4);
virtual void SetFormID(UInt32 id, UInt32 generateID);
virtual const char * Unk_37(void);
virtual bool Unk_38(void);
bool IsWeapon() { return formType == kFormType_Weapon; }
bool IsAmmo() { return formType == kFormType_Ammo; }
bool IsArmor() { return formType == kFormType_Armor; }
// bethesda removed most of the functionality from their code, this reimplements it for simple classes
void CopyFromEx(TESForm * rhs);
void * unk08; // 08
UInt32 flags; // 10
UInt32 formID; // 14
UInt16 unk18; // 18
UInt8 formType; // 1A
UInt8 pad1B; // 1B
UInt32 pad; // 1C
};
typedef float (* _GetFormWeight)(TESForm* form);
float GetFormWeight(TESForm *form);
// 128
class ActorValueInfo : public TESForm
{
public:
enum { kTypeID = kFormType_ActorValueInfo };
// parents
TESFullName fullName; // 020
TESDescription description; // 030
TESIcon icon; // 040
enum {
kSkillUseMult = 0,
kSkillOffsetMult,
kSkillImproveMult,
kSkillImproveOffset
};
// members
const char * name; // 050 - second ctor argument
StringCache::Ref unk58; // 058
UInt32 unk60; // 060
UInt32 unk64; // 064
UInt64 unk68; // 068
UInt32 unk70; // 070
UInt32 unk74[0x0F]; // 074 - init'd to 0xA4
UInt32 numSubTypes; // 0B0
const char * subTypes[0x0A]; // 0B8 - init'd to 0
float * skillUsages; // 108
UInt32 unk110; // 110 - init to FFFFFFFF
UInt32 unk118; // 114 - init to FFFFFFFF
BGSSkillPerkTreeNode * perkTree; // 118 - BGSSkillPerkTreeNode
UInt8 pad120[8]; // 120 - ? not initialized
};
// 48
class BGSAssociationType : public TESForm
{
public:
enum { kTypeID = kFormType_AssociationType };
BSFixedString unk20[4]; // 20
UInt32 unk40; // 40
};
// 88
class BGSBodyPartData : public TESForm
{
public:
enum { kTypeID = kFormType_BodyPartData };
// parents
TESModel model; // 20
BGSPreloadable preloadable; // 48
// members
struct Data
{
BSFixedString unk00; // 00
BSFixedString unk08; // 08
BSFixedString unk10; // 10
BSFixedString unk18; // 18
BSFixedString unk20; // 20
TESModel model; // 28
TESModelRDT modelRDT; // 50
};
Data * part[5]; // 50 - init'd to 0
UInt64 unk78; // 78 - init'd to 0
UInt64 unk80; // 80 - init'd to 0
};
// 58
class BGSCameraPath : public TESForm
{
public:
enum { kTypeID = kFormType_CameraPath };
void *unk20; // 20
UInt64 unk28; // 28
UInt64 unk30; // 30
UInt8 unk38; // 38
UInt8 pad39[7]; // 39
UInt64 unk40; // 40
UInt64 unk48; // 48
UInt64 unk50; // 50
};
// C0
class BGSCameraShot : public TESForm
{
public:
enum { kTypeID = kFormType_CameraShot };
// parents
TESModel model; // 20
TESImageSpaceModifiableForm imageSpaceMod; // 48
// members
UInt32 unk58; // 58 - init to 2
UInt32 unk5C; // 5C - init to 2
UInt32 unk60; // 60
UInt32 unk64; // 64 - init to 3
UInt32 unk68; // 68
UInt32 unk6C; // 6C
float globalTimeMultiplier; // 70 - init to 1.0f
UInt32 unk74; // 74
UInt32 unk78; // 78
UInt32 unk7C; // 7C
UInt32 unk80; // 80
UInt64 unk88; // 88
UInt64 unk90; // 90
UInt64 unk98; // 98
UInt64 unkA0; // A0
UInt64 unkA8; // A8
UInt16 unkB0; // B0 - init to FF
UInt8 padB2[6]; // B2
UInt64 unkB8; // B8
};
// 60
class BGSCollisionLayer : public TESForm
{
public:
enum { kTypeID = kFormType_CollisionLayer };
enum {
kCollisionLayer_Unidentified = 0x00,
kCollisionLayer_Static,
kCollisionLayer_AnimStatic,
kCollisionLayer_Transparent,
kCollisionLayer_Clutter,
kCollisionLayer_Weapon,
kCollisionLayer_Projectile,
kCollisionLayer_Spell,
kCollisionLayer_Biped,
kCollisionLayer_Trees,
kCollisionLayer_Props,
kCollisionLayer_Water,
kCollisionLayer_Trigger,
kCollisionLayer_Terrain,
kCollisionLayer_Trap,
kCollisionLayer_NonCollidable,
kCollisionLayer_CloudTrap,
kCollisionLayer_Ground,
kCollisionLayer_Portal,
kCollisionLayer_DebrisSmall,
kCollisionLayer_DebrisLarge,
kCollisionLayer_AcousticSpace,
kCollisionLayer_ActorZone,
kCollisionLayer_ProjectileZone,
kCollisionLayer_GasTrap,
kCollisionLayer_Shellcasing,
kCollisionLayer_TransparentSmall,
kCollisionLayer_InvisibleWall,
kCollisionLayer_TransparentSmallAnim,
kCollisionLayer_Ward,
kCollisionLayer_CharController,
kCollisionLayer_StairHelper,
kCollisionLayer_DeadBip,
kCollisionLayer_BipedNoCC,
kCollisionLayer_AvoidBox,
kCollisionLayer_CollisionBox,
kCollisionLayer_CameraSphere,
kCollisionLayer_DoorDetection,
kCollisionLayer_ConeProjectile,
kCollisionLayer_Camera,
kCollisionLayer_ItemPicker,
kCollisionLayer_Los,
kCollisionLayer_PathingPick,
kCollisionLayer_CustomPick1,
kCollisionLayer_CustomPick2,
kCollisionLayer_SpellExplosion,
kCollisionLayer_DroppingPick,
kCollisionLayer_DeadActorZone,
kCollisionLayer_TriggerFallingTrap,
kCollisionLayer_Navcut,
kCollisionLayer_Critter,
kCollisionLayer_SpellTrigger,
kCollisionLayer_LivingAndDeadActors,
kCollisionLayer_Detection,
kCollisionLayer_TrapTrigger
};
// parents
TESDescription description; // 20
// members
UInt32 layerId; // 30 - init to FFFFFFFF
UInt32 flags; // 34
UInt32 unk38; // 38
BSFixedString name; // 40
tArray<BGSCollisionLayer*> interactables; // 48 - really?
};
// 38
class BGSColorForm : public TESForm
{
public:
enum { kTypeID = kFormType_ColorForm };
// parents
TESFullName fullName; // 20
union {
struct Color {
UInt8 red, green, blue, alpha; // The alpha isn't actually used here so its usually zero
} color;
UInt32 abgr; // 30
};
UInt32 unk34; // 34
};
// 58
class BGSConstructibleObject : public TESForm
{
public:
enum { kTypeID = kFormType_ConstructibleObject };
// members
TESContainer container; // 20 - not inherited
void* unk20; // 38 - linked list
TESForm* createdObject; // 40
BGSKeyword* wbKeyword; // 48
UInt16 quantity; // 50
UInt8 pad52[6]; // 52
};
// 38
class BGSDebris : public TESForm
{
public:
enum { kTypeID = kFormType_Debris };
struct Data
{
UInt64 unk0;
UInt64 unk8;
};
// parents
BGSPreloadable preloadable; // 20
// members
Data unk28; // 28 - linked list
};
// ?? - singleton, ID 00000031
class BGSDefaultObjectManager : public TESForm
{
public:
enum { kTypeID = kFormType_DOBJ };
// cleared to 0 in ctor
TESForm * objects[0x15B]; // 20
UInt8 pad[0x15B]; // just pad out the rest of the space
static BGSDefaultObjectManager * GetSingleton(void);
};
// 40
class BGSDialogueBranch : public TESForm
{
public:
enum { kTypeID = kFormType_DialogueBranch };
UInt32 unk20; // 20 - init'd to 1
TESForm * unk28; // 28 - init'd to 0, TESQuest
TESForm * unk30; // 30 - init'd to 0, starting topic (type 4D)
UInt32 unk38; // 38 - init'd to 0
};
class BGSLocation;
// 48
class BGSEncounterZone : public TESForm
{
public:
enum { kTypeID = kFormType_EncounterZone };
TESForm *owner; // 20
BGSLocation *location; // 28
UInt8 rank; // 30
UInt8 minLevel; // 31
UInt8 encounterFlags; // 32
UInt8 maxLevel; // 33
UInt64 unk38; // 38
UInt64 unk40; // 40
};
// 40
class BGSEquipSlot : public TESForm
{
public:
enum { kTypeID = kFormType_EquipSlot };
tArray<BGSEquipSlot*> parentSlots; // 20
UInt32 unk38; // 38
};
// 30
class BGSFootstep : public TESForm
{
public:
enum { kTypeID = kFormType_Footstep };
BSFixedString unk20; // 20
UInt64 unk28; // 28
};
// 98
class BGSFootstepSet : public TESForm
{
public:
enum { kTypeID = kFormType_FootstepSet };
UnkArray unk14[5]; // 20
};
// 120
class BGSHeadPart : public TESForm
{
public:
enum { kTypeID = kFormType_HeadPart };
// parents
TESFullName fullName; // 020
TESModelTextureSwap model; // 030
// members
UInt8 partFlags; // 068 // Flag Inconsistencies (Is Extra Part?) (Use Solid Tint?)
UInt8 pad69[3]; //069
enum {
kTypeMisc = 0,
kTypeFace,
kTypeEyes,
kTypeHair,
kTypeFacialHair,
kTypeScar,
kTypeBrows,
kNumTypes
};
enum
{
kFlagPlayable = 1 << 0,
kFlagMale = 1 << 1,
kFlagFemale = 1 << 2,
kFlagExtraPart = 1 << 3,
kFlagSolidTint = 1 << 4
};
UInt32 type; // 06C
tArray <BGSHeadPart *> extraParts; // 070
BGSTextureSet * textureSet; // 088
TESModelTri raceMorph; // 090 - This and next two are part of a fixed array of 3, according to ctor
TESModelTri morph; // 0B8
TESModelTri chargenMorph; // 0E0
UInt32 unk128; // 108
BGSListForm * validRaces; // 110
BSFixedString partName; // 118
bool IsExtraPart() { return (partFlags & kFlagExtraPart) == kFlagExtraPart; }
};
// B0
class BGSImpactData : public TESForm
{
public:
enum { kTypeID = kFormType_ImpactData };
// 24
struct DecalData
{
float minw; // 00 - init'd to 8
float maxw; // 04 - init'd to 32
float minh; // 08 - init'd to 8
float maxh; // 0C - init'd to 32
float depth; // 10 - init'd to 32
float shininess; // 14 - init'd to 4
float parallaxScale; // 18 - init'd to 1
UInt8 parallaxPasses; // 1C - init'd to 4
enum
{
kDecalFlag_Parallax = (1 << 0),
kDecalFlag_AlphaBlending = (1 << 1),
kDecalFlag_AlphaTesting = (1 << 2),
kDecalFlag_NoSubtextures = (1 << 3)
};
UInt8 flags; // 1D - init'd to 0
UInt8 pad1E[2]; // 1E
UInt32 unk20; // 20 - New in SE . init'd to FFFFFFFF
};
// parents
TESModel model; // 20
// members
float duration; // 48 - init'd to .25
enum
{
kOrientation_SurfaceNormal = 0,
kOrientation_ProjectileNormal = 1,
kOrientation_ProjtectileReflection = 2
};
UInt32 orientation; // 4C - init'd to 2
float angleThreshold; // 50 - init'd to 15
float placementRadius; // 54 - init'd to 16
UInt32 soundLevel; // 58 - init'd to 1
enum
{
kFlags_NoDecalData = 1
};
UInt8 flags; // 5C
UInt8 impactResult; // 5D
UInt8 pad5E[2]; // 5E
BGSTextureSet * textures[2]; // 60 - texture set
BGSSoundDescriptorForm * sounds[2]; // 70 - sound
BGSHazard * hazard; // 80 - hazard
DecalData unk88; // 88
UInt32 padAC; // AC
};
// 58
class BGSImpactDataSet : public TESForm
{
public:
enum { kTypeID = kFormType_ImpactDataSet };
BGSPreloadable preloadable; // 20
UInt32 unk28; // 28
UInt32 unk30; // 30
UInt32 unk34; // 34
UInt32 unk38; // 38
UInt32 unk3C; // 3C
void* unk40; // 40
UInt32 unk48; // 48
void* unk50; // 50
};
STATIC_ASSERT(sizeof(BGSImpactDataSet) == 0x58);
// 28
class BGSKeyword : public TESForm
{
public:
enum { kTypeID = kFormType_Keyword };
BSFixedString keyword; // 20
};
// 30
class BGSAction : public BGSKeyword
{
public:
enum { kTypeID = kFormType_Action };
UInt32 idx; // 28 - ctor sets to a unique value
};
// 28
class BGSLocationRefType : public BGSKeyword
{
public:
enum { kTypeID = kFormType_LocationRef };
};
// A0
class BGSLightingTemplate : public TESForm
{
public:
enum { kTypeID = kFormType_LightingTemplate };
// 5C
struct Data
{
// 20 - used elsewhere
struct Color
{
UInt32 x[2]; // 00 - init'd to 00FFFFFF
UInt32 y[2];
UInt32 z[2];
UInt32 specular; // 18 - init'd to 0
float fresnelPower; // 1C - init'd to 1
};
UInt32 unk00; // 00 - init'd to 0
UInt32 unk04; // 04 - init'd to 0
UInt32 unk08; // 08 - init'd to 0
UInt32 unk0C; // 0C - init'd to 0
UInt32 unk10; // 10 - init'd to 0
UInt32 unk14; // 14 - init'd to 0
UInt32 unk18; // 18 - init'd to 0
float unk1C; // 1C - init'd to 1
UInt32 unk20; // 20 - init'd to 0
float unk24; // 24 - init'd to 1
Color unk28; // 28
UInt32 unk48; // 48 - init'd to 0
float unk4C; // 4C - init'd to 1
float lodStartFade; // 50 - fLightLODStartFade
float lodStopFade; // 54 - fLightLODStartFade + fLightLODRange
UInt32 unk58; // 58 - init'd to 0000079F
};
Data unk20; // 20
UInt32 pad7C; // 7C
Data::Color unk80; // 80
};
STATIC_ASSERT(sizeof(BGSLightingTemplate) == 0xA0);
// 48
class BGSListForm : public TESForm
{
public:
enum { kTypeID = kFormType_List };
tArray<TESForm*> forms; // 20
tArray<UInt32> * addedForms; // 38
UInt32 unk40; // 40
MEMBER_FN_PREFIX(BGSListForm);
DEFINE_MEMBER_FN(AddFormToList, void, 0x002D81C0, TESForm * form);
DEFINE_MEMBER_FN(RemoveFormFromList, void, 0x002D8390, TESForm * form);
DEFINE_MEMBER_FN(RevertList, void, 0x002D80E0);
class Visitor
{
public:
virtual bool Accept(TESForm * form) = 0;
};
bool Visit(BGSListForm::Visitor & visitor);
UInt32 GetSize();
};
// F0
class BGSLocation : public TESForm
{
public:
enum { kTypeID = kFormType_Location };
struct UnloadedRefData
{
public:
union CellKey
{
struct XY
{
UInt16 x;
UInt16 y;
} xy;
UInt32 raw;
};
STATIC_ASSERT(sizeof(CellKey) == 0x4);
// members
UInt32 refID; // 0
UInt32 parentSpaceID; // 4
CellKey cellKey; // 8
};
STATIC_ASSERT(sizeof(UnloadedRefData) == 0xC);
struct SpecialRefData // LCSR
{
public:
// members
BGSLocationRefType* type; // 00
UnloadedRefData refData; // 08
UInt32 pad14; // 14
};
STATIC_ASSERT(sizeof(SpecialRefData) == 0x18);
struct UniqueNPCData // LCUN
{
public:
// members
Actor* actor; // 00
UInt32 refID; // 08
UInt32 pad0C; // 0C
BGSLocation* editorLoc; // 10
};
STATIC_ASSERT(sizeof(UniqueNPCData) == 0x18);
struct OverrideData
{
public:
// members
tArray<UnloadedRefData> addedData; // 00 - ACPR
tHashSet<UInt32> removedData; // 18 - RCPR
};
STATIC_ASSERT(sizeof(OverrideData) == 0x48);
struct ChangeFlags
{
enum ChangeFlag : UInt32
{
kKeywordData = 1 << 30,
kCleared = (UInt32)1 << 31
};
};
struct RecordFlags
{
enum RecordFlag : UInt32
{
kDeleted = 1 << 5,
kIgnored = 1 << 12,
kCleared = (UInt32)1 << 31
};
};
struct KEYWORD_DATA
{
public:
// members
BGSKeyword* keyword; // 00
float data; // 08
UInt32 pad0C; // 0C
};
STATIC_ASSERT(sizeof(KEYWORD_DATA) == 0x10);
// parents
TESFullName fullName; // 20
BGSKeywordForm keyword; // 30
BGSLocation* parentLoc; // 48 - PNAM
TESFaction* unreportedCrimeFaction; // 50 - FNAM
BGSMusicType* musicType; // 58 - NAM1
UInt32 worldLocMarker; // 60 - MNAM
float worldLocRadius; // 64 - RNAM
UInt32 horseLocMarker; // 68 - NAM0
UInt32 pad6C; // 6C
tArray<SpecialRefData> specialRefs; // 70 - LCSR
tArray<UniqueNPCData> uniqueNPCs; // 88 - LCUN
OverrideData* overrideData; // A0
NiPointer<NiObject> promoteRefsTask; // A8
tArray<UInt32> promotedRefs; // B0
SInt32 loadedCount; // C8
UInt32 fileOffset; // CC
tArray<KEYWORD_DATA> keywordData; // D0
UInt32 lastChecked; // E8
bool cleared; // EC
bool everCleared; // ED
UInt16 padEE; // EE
};
STATIC_ASSERT(sizeof(BGSLocation) == 0xF0);
// B8
class BGSMaterialObject : public TESForm
{
public:
enum { kTypeID = kFormType_Material };
// parents
TESModel model; // 20
BSMaterialObject materialObject; // 48
// members
UnkArray unkA0; // A0
};
// 50
class BGSMaterialType : public TESForm
{
public:
enum { kTypeID = kFormType_MaterialType };
// C
struct Data20
{
float unk0;
float unk4;
float unk8;
};
TESForm * parentType; // 20 - init'd to 0
BSFixedString unk28; // 28 - init'd to 0
UInt32 unk30; // 30 - init'd to 0
Data20 unk34; // 34
float unk40; // 40 - init'd to 1
UInt32 unk44; // 44 - init'd to 0
TESForm * impactDataSet; // 48 - init'd to 0
};
// 30
class BGSMenuIcon : public TESForm
{
public:
enum { kTypeID = kFormType_MenuIcon };
// parents
TESIcon icon; // 20
};
// 68
class BGSMessage : public TESForm
{
public:
enum { kTypeID = kFormType_Message };
// parents
TESFullName fullName; // 20
TESDescription description; // 30
// members
TESForm * icon; // 40 - init'd to 0
TESQuest * quest; // 48 - init'd to 0
tList<BSFixedString> buttons; // 50
UInt32 unk60; // 60 - init'd to 1
UInt32 unk64; // 64 - init'd to 2
std::string GetDescription()
{
BSString str;
CALL_MEMBER_FN(&description, Get)(&str, this, 'DESC');
return str.Get();
};
};
// 60
class BGSMovementType : public TESForm
{
public:
enum { kTypeID = kFormType_MovementType };
enum {
kType_Walk = 0,
kType_Run,
kType_Max
};
enum
{
kDefaultData_Left = 0,
kDefaultData_Right,
kDefaultData_Forward,
kDefaultData_Back,
kDefaultData_RotateInPlace,
kDefaultData_Max
};
enum
{
kAnimChangeThresholds_Direction = 0,
kAnimChangeThresholds_MovementSpeed,
kAnimChangeThresholds_RotationSpeed,
kAnimChangeThresholds_Max
};
BSFixedString typeId; // 20
float data[kDefaultData_Max][kType_Max]; // 28
float rotateWhileMoving; // 50
float thresholds[kAnimChangeThresholds_Max]; // 54 - read from INAM chunk - init'd to 7F7FFFFF, max float
};
// 38
class BGSMusicTrackFormWrapper : public TESForm
{
public:
enum { kTypeID = kFormType_MusicTrack };
// parents
BSIMusicTrack track; // 20
// members
UInt64 unk30; // 30
};
// 78
class BGSMusicType : public TESForm
{
public:
enum { kTypeID = kFormType_MusicType };
// parents
BSIMusicType type; // 20
// members
BSFixedString unk70; // 70
};
// 38
class BGSOutfit : public TESForm
{
public:
enum { kTypeID = kFormType_Outfit };
tArray<TESForm*> armorOrLeveledItemArray; // 20
};
class BGSPerkEntry;
// 80
class BGSPerk : public TESForm
{
public:
enum { kTypeID = kFormType_Perk };
// parents
TESFullName fullName; // 20
TESDescription description; // 30
TESIcon icon; // 40
class PerkRankVisitor
{
public:
virtual ~PerkRankVisitor();
};
// members
UInt8 unk30; // 50
UInt8 unk31; // 51
UInt8 unk32; // 52 - init'd to 1
UInt8 unk33; // 53 - init'd to 1
UInt8 unk34; // 54
UInt8 pad55[3]; // 55
Condition * conditions; // 58
tArray<BGSPerkEntry*> perkEntries; // 60
BGSPerk * nextPerk; // 78
};
// 1B8
class BGSRagdoll : public TESForm
{
public:
enum { kTypeID = kFormType_Ragdoll };
// parents
TESModel model; // 20
// members
// 58
struct Data58
{
// 3C
struct Data
{
float unk00; // 00 - init'd to .9
float unk04; // 04 - init'd to .8
float unk08; // 08 - init'd to .4
float unk0C; // 0C - init'd to .2
float unk10; // 10 - init'd to .1
float unk14; // 14 - init'd to .3
float unk18; // 18 - init'd to 0
float unk1C; // 1C - init'd to 50
float unk20; // 20 - init'd to 50
float unk24; // 24 - init'd to 25
float unk28; // 28 - init'd to 25
float unk2C; // 2C - init'd to 50
float unk30; // 30 - init'd to 50
UInt32 unk34; // 34 - init'd to 10000
UInt32 unk38; // 38 - init'd to 30000
};
UInt8 unk00; // 00
UInt8 pad01[3]; // 01
Data unk04; // 04
UnkArray unk40; // 40
};
// 50
struct DataB0
{
// 1C
struct Data
{
UInt32 unk00; // 00
UInt32 unk04; // 04
UInt32 unk08; // 08
UInt32 unk0C; // 0C
UInt32 unk10; // 10
UInt32 unk14; // 14
UInt32 unk18; // 18
};
UInt8 unk00; // 00
UInt8 pad01[3]; // 01
Data unk04; // 04
UnkArray unk20; // 20
UnkArray unk38; // 38
};
// 38
struct Data100
{
UInt8 unk00; // 00
UInt8 pad01[7]; // 01
UnkArray unk08; // 08
UnkArray unk20; // 20
};
// 30
struct Data170
{
// 18
struct Data
{
UInt16 unk00; // 00 - init'd to FFFF
UInt16 unk02; // 02 - init'd to FFFF
UInt16 unk04; // 04 - init'd to FFFF
UInt8 unk06; // 06 - init'd to 0
UInt8 pad07; // 07
UInt32 unk08; // 08 - init'd to 0
UInt32 unk0C; // 0C - init'd to 0
float unk10; // 10 - init'd to 0.1
UInt32 unk14; // 14 - init'd to 0
};
UInt8 unk00; // 00
UInt8 pad01[7]; // 01
BSString unk08; // 08
Data unk18; // 18
};
UInt8 pad48[0x10]; // 48
Data58 unk58; // 58
DataB0 unkB0; // B0
Data100 unk100; // 100
Data100 unk138; // 138
Data170 unk170; // 170
UInt8 unk1A0[8]; // 1A0
UInt64 unk1A8; // 1A8
UInt64 unk1B0; // 1B0
};
STATIC_ASSERT(sizeof(BGSRagdoll) == 0x1B8);
// 38
class BGSReferenceEffect : public TESForm
{
public:
enum { kTypeID = kFormType_ReferenceEffect };
// C
struct Data
{
UInt64 unk00;
UInt64 unk08;
UInt32 unk10;
};
Data unk20; // 20
};
// 40
class BGSRelationship : public TESForm
{
public:
enum { kTypeID = kFormType_Relationship };
UInt64 unk20; // 20
UInt64 unk28; // 28
UInt64 unk30; // 30
UInt32 unk38; // 38 - init'd to 3
};
// 38
class BGSReverbParameters : public TESForm
{
public:
enum { kTypeID = kFormType_ReverbParam };
BSIReverbType reverbType; // 20
UInt16 unk28; // 28 - init'd to 1250
UInt16 unk2A; // 2A - init'd to 800
UInt8 unk2C; // 2C - init'd to 100
UInt8 unk2D; // 2D - init'd to 100
UInt8 unk2E; // 2E - init'd to 0
UInt8 unk2F; // 2F - init'd to 0
UInt8 unk30; // 30 - init'd to 100
UInt8 unk31; // 31 - init'd to 0
UInt8 unk32; // 32 - init'd to 0
UInt8 unk33; // 33 - init'd to 100
UInt32 unk34; // 34 - ???
};
// C8
class BGSScene : public TESForm
{
public:
enum { kTypeID = kFormType_Scene };
UnkArray unk20; // 20
UnkArray unk38; // 38
UnkArray unk50; // 50
UnkArray unk68; // 68
UnkArray unk80; // 80
TESForm * quest; // 98
UInt32 unkA0; // A0
void * unkA8; // A8 - linked list
UInt8 unkB0; // B0
UInt8 unkB1; // B1
UInt8 unkB2; // B2
UInt8 unkB3; // B3
UInt8 unkB4; // B4
UInt8 unkB5; // B5
UInt8 unkB6; // B6
UInt8 unkB7; // B7
UInt8 unkB8; // B8
UInt8 padB9[3]; // B9
UInt32 unkBC; // BC - init'd to FFFFFFFF
float unkC0; // C0 - init'd to 7F7FFFFF, max float
};
// 48
class BGSShaderParticleGeometryData : public TESForm
{
public:
enum { kTypeID = kFormType_SPGD };
UnkArray unk20; // 20
TESTexture texture; // 38
};
// 58
class BGSSoundCategory : public TESForm
{
public:
enum { kTypeID = kFormType_SoundCategory };
// parents
TESFullName fullName; // 20
BSISoundCategory soundCategory; // 30
// members
UInt32 unk38; // 38 - init'd to 0
UInt64 unk40; // 40 - init'd to 0
UInt16 unk48; // 48 - init'd to 0
UInt16 unk4A; // 4A - init'd to 0
UInt16 unk4C; // 4C - init'd to FFFF
UInt16 unk4E; // 4E - init'd to FFFF
float unk50; // 50 - init'd to 1
float unk54; // 54 - init'd to 1
};
// 30
class BGSSoundDescriptorForm : public TESForm
{
public:
enum { kTypeID = kFormType_SoundDescriptor };
virtual void Unk_39(void); // calls something on unk18
// parents
BGSSoundDescriptor soundDescriptor; // 20
// members
BGSStandardSoundDef * standardSoundDef; // 28
};
// 40
class BGSSoundOutput : public TESForm
{
public:
enum { kTypeID = kFormType_SoundOutput };
// parents
BSISoundOutputModel soundOutputModel; // 20
// members
UInt32 unk28; // 28
UInt32 unk2C; // 2C
UInt64 unk30; // 30
void * unk38; // 38
};
// 28
class BGSStoryManagerTreeForm : public TESForm
{
public:
virtual UInt32 Unk_39(void);
virtual UInt32 Unk_3A(UInt32 arg);
virtual void * Unk_3B(void); // pure
virtual void Unk_3C(void); // pure
UInt32 unk20; // 20
};
class BGSStoryManagerBranchNode;
// 48
class BGSStoryManagerNodeBase : public BGSStoryManagerTreeForm
{
public:
BGSStoryManagerBranchNode * unk28; // 28
BGSStoryManagerNodeBase * unk30; // 30
UInt32 unk38; // 38
UInt32 unk3C; // 3C
void * unk40; // 40 - linked list
};
// 60
class BGSStoryManagerBranchNode : public BGSStoryManagerNodeBase
{
public:
enum { kTypeID = kFormType_StoryBranchNode };
UnkArray unk48; // 48
};
// 68
class BGSStoryManagerEventNode : public BGSStoryManagerBranchNode
{
public:
enum { kTypeID = kFormType_StoryEventNode };
UInt64 unk60; // 60
};
// E0
class BGSStoryManagerQuestNode : public BGSStoryManagerNodeBase
{
public:
enum { kTypeID = kFormType_StoryQuestNode };
UnkArray unk48; // 48
UInt8 unk60[0x60]; // 60
UInt32 unkC0; // C0
UnkArray unkC8; // C8
};
STATIC_ASSERT(sizeof(BGSStoryManagerQuestNode) == 0xE0);
// 28
class BGSBaseAlias // Not actually a form, but its used like one in Papyrus
{
public:
virtual ~BGSBaseAlias();
virtual void Unk01(void);
virtual void Unk02(void);
virtual const char * Unk03(void);
enum { kTypeID = kFormType_Alias };
BSFixedString name; // 08
TESQuest * owner; // 10
UInt32 aliasId; // 18 - init'd to FFFFFFFF
UInt32 flags; // 1C - init'd to 0
UInt16 unk20; // 20 - init'd to 0
};
// 48
class BGSRefAlias : public BGSBaseAlias
{
public:
enum { kTypeID = kFormType_ReferenceAlias };
// One of these is the filltype/filltype filter
UInt64 unk28[3]; // 28
void *unk40; // 40
};
// 60
class BGSLocAlias : public BGSBaseAlias
{
public:
enum { kTypeID = kFormType_LocationAlias };
UInt64 unk28; // 28
UInt32 unk30; // 30
UInt64 unk38; // 38
UInt32 unk40; // 40
UInt32 unk44; // 44
UInt64 unk48; // 48
UInt32 unk50; // 50
void* unk58; // 58
};
// 268
class TESQuest : public BGSStoryManagerTreeForm
{
public:
enum { kTypeID = kFormType_Quest };
// parents
TESFullName fullName; // 028
// members
// 30
struct Data070
{
UInt8 data[0x30]; // ### todo
};
// 30
struct Data0A0
{
UInt8 data[0x30]; // ### todo
};
// 8
struct Data0D8
{
UInt32 unk0;
UInt16 flags; // - init'd to 0x100
UInt8 priority;
UInt8 type;
};
struct Objective
{
StringCache::Ref displayText; // 0
TESQuest * owner; // 8
void* unk10; // 10
UInt32 unk18; //18
UInt16 index; // 1C
UInt16 unk1E; // 1E
UInt64 unk20; // 20
};
// 10
struct Data0E8
{
UInt64 unk0;
UInt64 unk4;
};
// 30
struct Data118
{
UInt8 data[0x30]; // ### todo
};
UnkArray unk038; // 038
UInt32 unk050; // 050
tArray<BGSBaseAlias*> aliases; // 058
Data070 unk070; // 070
Data0A0 unk0A0; // 0A0
UInt64 unk0D0; // 0D0
Data0D8 unk0D8; // 0D8
UInt32 unk0E0; // 0E0 - init'd to FFFFFFFF
UInt32 pad0E4; // 0E4
Data0E8 unk0E8; // 0E8
tList<Objective> objectives; // 0F8
void * unk108; // 108 - linked list
void * unk110; // 110 - linked list
Data118 unk118[2]; // 118
UnkArray unk178[6]; // 178
UnkArray unk208; // 208
void * unk220; // 220 - linked list
UInt16 unk228; // 228
UInt8 unk22A; // 22A
UInt8 pad22B[5]; // 22B
BSString questID; // 230
UInt64 unk144; // 240
UInt64 unk148; // 248
UnkArray unk250; // 250
MEMBER_FN_PREFIX(TESQuest);
DEFINE_MEMBER_FN(ForceRefTo, UInt32, 0x0038C240, UInt32 aliasId, TESObjectREFR * reference);
DEFINE_MEMBER_FN(NewGame_Internal, UInt8, 0x00387F50, UInt8 * unk1, UInt8 unk2);
UInt8 NewGame_Hook(UInt8 * unk1, UInt8 unk2);
};
STATIC_ASSERT(sizeof(TESQuest) == 0x268);
// 38
class BGSVoiceType : public TESForm
{
public:
enum { kTypeID = kFormType_VoiceType };
UInt8 unk14; // 20
UInt8 pad15[7]; // 21
BSString editorId; // 28
};
// 198
class EffectSetting : public TESForm
{
public:
enum { kTypeID = kFormType_EffectSetting };
// parents
TESFullName fullName; // 20
BGSMenuDisplayObject menuDisplayObject; // 30
BGSKeywordForm keywordForm; // 40
// members
// F0
struct Properties
{
enum {
kEffectType_Hostile = 0x00000001,
kEffectType_Recover = 0x00000002,
kEffectType_Detrimental = 0x00000004,
kEffectType_NoHitEvent = 0x00000010,
kEffectType_DispelKeywords = 0x00000100,
kEffectType_NoDuration = 0x00000200,
kEffectType_NoMagnitude = 0x00000400,
kEffectType_NoArea = 0x00000800,
kEffectType_FXPersist = 0x00001000,
kEffectType_GloryVisuals = 0x00004000,
kEffectType_HideInUI = 0x00008000,
kEffectType_NoRecast = 0x00020000,
kEffectType_Magnitude = 0x00200000,
kEffectType_Duration = 0x00400000,
kEffectType_Painless = 0x04000000,
kEffectType_NoHitEffect = 0x08000000,
kEffectType_NoDeathDispel = 0x10000000
};
enum {
kArchetype_ValueMod = 0,
kArchetype_Script,
kArchetype_Dispel,
kArchetype_CureDisease,
kArchetype_Absorb,
kArchetype_DualValueMod,
kArchetype_Calm,
kArchetype_Demoralize,
kArchetype_Frenzy,
kArchetype_Disarm,
kArchetype_CommandSummoned,
kArchetype_Invisibility,
kArchetype_Light,
kArchetype_Lock = 15,
kArchetype_Open,
kArchetype_BoundWeapon,
kArchetype_SummonCreature,
kArchetype_DetectLife,
kArchetype_Telekinesis,
kArchetype_Paralysis,
kArchetype_Reanimate,
kArchetype_SoulTrap,
kArchetype_TurnUndead,
kArchetype_Guide,
kArchetype_WerewolfFeed,
kArchetype_CureParalysis,
kArchetype_CureAddiction,
kArchetype_CurePoison,
kArchetype_Concussion,
kArchetype_ValueAndParts,
kArchetype_AccumulateMagnitude,
kArchetype_Stagger,
kArchetype_PeakValueMod,
kArchetype_Cloak,
kArchetype_Werewolf,
kArchetype_SlowTime,
kArchetype_Rally,
kArchetype_EnhanceWeapon,
kArchetype_SpawnHazard,
kArchetype_Etherealize,
kArchetype_Banish,
kArchetype_Disguise = 44,
kArchetype_GrabActor,
kArchetype_VampireLord
};
enum {
kCastingType_ConstantEffect = 0,
kCastingType_FireAndForget,
kCastingType_Concentration
};
enum {
kDeliveryType_Self = 0,
kDeliveryType_Contact,
kDeliveryType_Aimed,
kDeliveryType_TargetActor,
kDeliveryType_TargetLocation
};
enum {
kVolume_Loud = 0,
kVolume_Normal,
kVolume_Silent,
kVolume_VeryLoud
};
UInt32 flags; // 00 - init'd to 0
float baseCost; // 04 - init'd to 0
TESForm* primaryObject; // 08 - init'd to 0
UInt32 school; // 10 - init'd to FFFFFFFF
UInt32 resistance; // 14 - init'd to FFFFFFFF
UInt16 unk18; // 18 - init'd to 0
UInt8 pad1A[6]; // 1A
TESObjectLIGH* light; // 20 - init'd to 0
float taperWeight; // 28 - init'd to 0
TESEffectShader* hitShader; // 30 - init'd to 0
TESEffectShader* enchantShader; // 38 - init'd to 0
UInt32 level; // 40 - init'd to 0
UInt32 area; // 44 - init'd to 0
float castingTime; // 48 - init'd to 0
float taperCurve; // 4C - init'd to 0
float taperDuration; // 50 - init'd to 0
float secondAVWeight; // 54 - init'd to 0 float - Always 0
UInt32 archetype; // 58 - init'd to 0
UInt32 primaryValue; // 5C - init'd to FFFFFFFF
BGSProjectile* projectile; // 60 - init'd to 0
BGSExplosion* explosion; // 68 - init'd to 0
UInt32 castType; // 70 - init'd to 3 cast type?
UInt32 deliveryType; // 74 - init'd to 5 cast type?
UInt32 secondaryValue; // 78 - init'd to FFFFFFFF
BGSArtObject* castingArt; // 80 - init'd to 0
BGSArtObject* hitEffectArt; // 88 - init'd to 0
BGSImpactDataSet* impactDataSet; // 90 - init'd to 0
float skillUsageMult; // 98 - init'd to 0
BGSDualCastData* dualCastData; // A0 - init'd to 0
float dualCastingScale; // A8 - init'd to 1
BGSArtObject* enchantArt; // B0 - init'd to 0
UInt64 unkB8; // B8 - init'd to 0
UInt64 unkC0; // C0 - init'd to 0
SpellItem* equipAbility; // C8 - init'd to 0
TESImageSpaceModifier* imageSpaceMod; // D0 - init'd to 0
BGSPerk* perk; // D8 - init'd to 0
UInt32 soundVolume; // E0 - init'd to 1
float aiScore; // E4 - init'd to 0
float delayTime; // E8 - init'd to 0
};
struct SoundInfo
{
enum
{
kSound_DrawSheathe = 0,
kSound_Charge,
kSound_Ready,
kSound_Release,
kSound_CastLoop,
kSound_OnHit,
kNumSounds
};
UInt32 index;
TESSound* sound;
};
UInt64 unk058; // 58
UInt64 unk060; // 60
Properties properties; // 68
tList<EffectSetting> counterEffects; // 158
tArray<SoundInfo> sounds; // 168
StringCache::Ref description; // 180
UInt32 unk188; // 188
UInt32 unk18C; // 18C
void * unk190; // 190 - linked list
UInt32 school() { return properties.school; }
UInt32 level() { return properties.level; }
};
#if 0
// SE CONVERSION NOT DONE YET
// B4
class NavMesh : public TESForm
{
public:
enum { kTypeID = kFormType_NAVM };
// parents
TESChildCell childCell; // 14
BSNavmesh navmesh; // 18
};
//STATIC_ASSERT(sizeof(NavMesh) == 0xB4);
// SE CONVERSION NOT DONE YET
// 98
class NavMeshInfoMap : public TESForm
{
public:
enum { kTypeID = kFormType_NAVI };
// parents
BSNavmeshInfoMap infoMap; // 14
PrecomputedNavmeshInfoPathMap pathMap; // 1C
// members
// 20
struct Data4C
{
UInt32 unk00; // 00
UInt32 unk04; // 04
UInt32 unk08; // 08 - 0
UInt32 unk0C; // 0C - 0
void * unk10; // 10 - ptr to 0xDEADBEEF
UInt32 unk14; // 14 - 0
UInt32 unk18; // 18
UInt32 unk1C; // 1C - 0
};
// 20
struct Data6C
{
UInt32 unk00; // 00
UInt32 unk04; // 04
UInt32 unk08; // 08 - 0
UInt32 unk0C; // 0C - 0
UInt32 unk10; // 10 - 0
void * unk14; // 14 - ptr to 0xDEADBEEF
UInt32 unk18; // 18
UInt32 unk1C; // 1C
};
// 8
struct Data8C
{
UInt32 unk0;
UInt32 unk4;
};
UInt8 unk48; // 48
UInt8 pad49[3]; // 49
Data4C unk4C; // 4C
Data6C unk6C; // 6C
Data8C unk8C; // 8C
UInt8 unk94; // 94
UInt8 pad95[3]; // 95
};
//STATIC_ASSERT(sizeof(NavMeshInfoMap) == 0x98);
#endif
// 80
class Script : public TESForm
{
public:
enum { kTypeID = kFormType_Script };
// 14
struct Data
{
UInt32 unk00; // 00
UInt32 unk04; // 04 - numRefs?
UInt32 unk08; // 08 - dataLength?
UInt32 unk0C; // 0C - varCount?
UInt32 unk10; // 10 - type?
};
// 10
struct RefListEntry
{
void * data;
RefListEntry * next;
};
// 10
struct VarInfoEntry
{
void * data;
VarInfoEntry * next;
};
Data unk20; // 20
UInt32 pad34; // 34
void * unk38; // 38
void * unk40; // 40
UInt32 unk30; // 48
float questDelayTimer; // 4C
float secondsPassed; // 50
TESForm * parentQuest; // 58
RefListEntry refList; // 60
VarInfoEntry varList; // 70
};
// 78
class TESClass : public TESForm
{
public:
enum { kTypeID = kFormType_Class };
// parents
TESFullName fullName; // 14-20
TESDescription description; // 1C-30
TESTexture texture; // 28-40
// members
// 24
struct Data50
{
UInt8 unk00[0x4]; // 00
UInt8 trainSkill; // 04 (AV-6)
UInt8 maxTrainingLevel; // 05
UInt8 oneHanded; // 06
UInt8 twoHanded; // 07
UInt8 archery;
UInt8 block;
UInt8 smithing;
UInt8 heavyArmor;
UInt8 lightArmor;
UInt8 pickPocket;
UInt8 lockpicking;
UInt8 sneak;
UInt8 alchemy;
UInt8 speech;
UInt8 alteration;
UInt8 conjuration;
UInt8 destruction;
UInt8 illusion;
UInt8 restoration;
UInt8 enchanting;
float bleedout; // 18
UInt32 voicePoints; // 1C
UInt8 health; // 20
UInt8 magicka; // 21
UInt8 stamina; // 22
UInt8 unk23; // 23
};
Data50 unk50; // 50
UInt32 pad74; // 74
};
STATIC_ASSERT(sizeof(TESClass) == 0x78);
// 80
class TESClimate : public TESForm
{
public:
enum { kTypeID = kFormType_Climate };
// 10
struct Data48
{
UInt64 unk0;
UInt64 unk4;
};
TESModel model; // 20
Data48 unk48; // 48
TESTexture textures[2]; // 58
UInt8 unk78[6]; // 78
UInt8 pad7E[2]; // 7E
};
// A0
class TESCombatStyle : public TESForm
{
public:
enum { kTypeID = kFormType_CombatStyle };
// 28
struct General // CSGD
{
float offensiveMult; // 00 - init'd to 0.5
float defensiveMult; // 04 - init'd to 0.5
float groupOffensiveMult; // 08 - init'd to 1
float meleeMult; // 0C - init'd to 1
float magicMult; // 10 - init'd to 1
float rangedMult; // 14 - init'd to 1
float shoutMult; // 18 - init'd to 1
float unarmedMult; // 1C - init'd to 1
float staffMult; // 20 - init'd to 1
float avoidThreatChance; // 24 - init'd to 0.2
};
// 20
struct Melee // CSME
{
float attackStaggeredMult; // 00 - init'd to 1
float powerAttackStaggeredMult; // 04 - init'd to 1
float powerAttackBlockingMult; // 08 - init'd to 1
float bashMult; // 0C - init'd to 1
float bashRecoiledMult; // 10 - init'd to 1
float bashAttackMult; // 14 - init'd to 1
float bashPowerAttackMult; // 18 - init'd to 1
float specialAttackMult; // 1C - init'd to 0.1
};
// 10
struct CloseRange // CSCR
{
float duelingCircleMult; // 00 - init'd to 0.2
float duelingFallbackMult; // 04 - init'd to 0.2
float flankingFlankDistance; // 08 - init'd to 0.2
float flankingStalkTime; // 0C - init'd to 0.2
};
// 4
struct LongRange // CSLR
{
float strafeMult; // 00 - init'd to 0.2
};
// 20
struct Flight // CSFL
{
float hoverChance; // 00 - init'd to 0.5
float diveBombChance; // 04 - init'd to 1
float groundAttackChance; // 08 - init'd to 0.5
float hoverTime; // 0C - init'd to 0.5
float unk10; // 10 - init'd to 0.5
float perchAttackChance; // 14 - init'd to 0.5
float unk18; // 18 - init'd to 0.5
float flyingAttackChance; // 1C - init'd to 0.75
};
enum {
kFlag_Dueling = 1,
kFlag_Flanking = 2,
kFlag_AllowDualWielding = 4
};
General general; // 20 - CSGD
Melee melee; // 48 - CSME
CloseRange closeRange; // 68 - CSCR
LongRange longRange; // 78 - CSLR
Flight flight; // 7C - CSFL
UInt8 flags; // 9C - DATA
UInt8 pad9D[3]; // 9D
};
// 220
class TESEffectShader : public TESForm
{
public:
enum { kTypeID = kFormType_EffectShader };
// 1A0
struct Data
{
UInt8 pad[0x1A0]; // ###
};
Data unk020; // 020
TESTexture unk1C0; // 1C0
TESTexture unk1D0; // 1D0
TESTexture unk1E0; // 1E0
TESTexture unk1F0; // 1F0
TESTexture unk200; // 200
UInt64 unk210; // 210 BSIntrusiveRefCounted *
UInt64 unk218; // 218 BSIntrusiveRefCounted *
};
// 48
class TESEyes : public TESForm
{
public:
enum { kTypeID = kFormType_Eyes };
// parents
TESFullName fullName; // 20
TESTexture texture; // 30
// members
UInt8 unk40; // 40
UInt8 pad41[7]; // 41
};
// 100
class TESFaction : public TESForm
{
public:
enum { kTypeID = kFormType_Faction };
// parents
TESFullName fullName; // 20
TESReactionForm reaction; // 30
// members
// 48
struct CrimeValues
{
UInt64 unk00; // 00
UInt64 unk08; // 08
UInt64 unk10; // 10
UInt64 unk18; // 18
UInt64 unk20; // 20
UInt64 unk28; // 28
bool arrest; // 30
bool attackOnSight; // 31
UInt16 murder; // 32
UInt16 assault; // 34
UInt16 trespass; // 36
UInt16 pickpocket; // 38
float stealMult; // 3C
UInt16 escape; // 40
UInt16 werewolf; // 42
UInt32 pad44; // 44
};
// 38
struct VendorData
{
UInt16 startHour; // 00
UInt16 endHour; // 02
UInt32 radius; // 04
UInt8 onlyBuysStolenItems; // 08
UInt8 notSellBuy; // 09
UInt8 pad0A[6]; // 0A
void * packageLocation; // 10
UInt32 unk18; // 18
BGSListForm * buySellList; // 20
TESObjectREFR * merchantContainer; // 28
UInt32 unk30; // 30 - init'd to FFFFFFFF
UInt32 pad34; // 34
};
// 10
struct DataE0
{
UInt64 unk0; // 0
UInt64 unk8; // 8
};
UInt64 unk50; // 50
enum
{
kFactionFlag_HiddenFromNPC = (1 << 0),
kFactionFlag_SpecialCombat = (1 << 1),
kFactionFlag_TrackCrime = (1 << 4),
kFactionFlag_IgnoreMurder = (1 << 5),
kFactionFlag_IgnoreAssult = (1 << 6),
kFactionFlag_IngoreStealing = (1 << 7),
kFactionFlag_IgnoreTrespass = (1 << 8),
kFactionFlag_NoReportCrime = (1 << 9),
kFactionFlag_CrimeGoldDefaults = (1 << 10),
kFactionFlag_IgnorePickpocket = (1 << 11),
kFactionFlag_Vendor = (1 << 12),
kFactionFlag_CanBeOwner = (1 << 13),
kFactionFlag_IgnoreWerewolf = (1 << 14)
};
UInt32 factionFlags; // 58
UInt32 pad5C; // 5C
CrimeValues crimeValues; // 60
VendorData vendorData; // A8
DataE0 unkE0; // E0
UInt32 unkF0; // F0
UInt32 unkF4; // F4
float unkF8; // F8
UInt32 unkFC; // FC
};
STATIC_ASSERT(sizeof(TESFaction) == 0x100);
STATIC_ASSERT(offsetof(TESFaction, vendorData) == 0xA8);
// 38
class TESGlobal : public TESForm
{
public:
enum { kTypeID = kFormType_Global };
BSString unk20; // 20
UInt8 unk1C; // 30 - type? - init'd to 115
UInt8 pad[3]; // 31
UInt32 unk34; // 34
};
// This was removed at some point in Skyrim32, it doesn't exist in SE either, commenting this
/*
// 50
class TESHair : public TESForm
{
public:
// parents
TESFullName fullName; // 14
TESModel model; // 1C
TESTexture texture; // 30
// members
UInt8 unk38; // 38
UInt8 pad39[3]; // 39
TESModel unk40; // 3C
};*/
// 68
class TESIdleForm : public TESForm
{
public:
enum { kTypeID = kFormType_Idle };
void * unk20; // 20 - linked list
UInt8 loopMin; // 28
UInt8 loopMax; // 29
UInt8 flags; // 2A
UInt8 group; // 2B
UInt16 unk1C; // 2C
UInt8 pad1E[2]; // 2E
UInt64 unk30; // 30 - NiFormArray
TESIdleForm * relatedIdle1; // 38
TESIdleForm * relatedIdle2; // 40
StringCache::Ref fileName; // 48
StringCache::Ref animationEvent; // 50
BSString editorId; // 58
};
// 70
class TESImageSpace : public TESForm
{
public:
enum { kTypeID = kFormType_ImageSpace };
// 50
struct Data20
{
float unk00; // 00 - init'd to 3
float unk04; // 04 - init'd to 7
float unk08; // 08 - init'd to .6
float unk0C; // 0C - init'd to .5
float unk10; // 10 - init'd to .15
float unk14; // 14 - init'd to .15
float unk18; // 18 - init'd to 1.8
float unk1C; // 1C - init'd to 1.5
float unk20; // 20 - init'd to 3.5, 3
float unk24; // 24 - init'd to 1.8, .8
float unk28; // 28 - init'd to 1.5
float unk2C; // 2C - init'd to 1.1
float unk30; // 30 - init'd to 0
float unk34; // 34 - init'd to 0
float unk38; // 38 - init'd to 0
float unk3C; // 3C - init'd to 0
float unk40; // 40 - init'd to 0
UInt32 unk44; // 44 - init'd to 0
UInt32 unk48; // 48 - init'd to 0
float unk4C; // 4C - init'd to 2
};
Data20 unk20; // 20
};
// TODO: replace with NiFloatInterpolator when definition available
// 2E0
class TESImageSpaceModifier : public TESForm
{
public:
enum { kTypeID = kFormType_ImageSpaceMod };
// F4
struct Data020
{
// 8
struct Data0CC
{
float unk0;
float unk4;
};
UInt8 unk000; // 000
UInt8 pad001[3]; // 001
float unk004; // 004
// 008
UInt8 todo008[0xC8 - 0x08]; // 008
UInt8 unk0C8; // 0C8
UInt8 unk0C9[3]; // 0C9
Data0CC unk0CC; // 0CC
// 0D4
UInt8 todo0D4[0xE0 - 0xD4]; // 0D4
UInt8 unk0E0; // 0E0
UInt8 unk0E1; // 0E1
UInt8 pad0E2[2]; // 0E2
// 0E4
UInt8 todo0E4[0xF4 - 0xE4]; // 0E4
};
Data020 unk020; // 020
UInt32 pad114; // 114
void* unk118[0x15 * 2]; // 118
UInt64 unk268[14]; // 268
UInt16 unk2D8; // 2D8
UInt16 unk2DA; // 2DA
UInt32 pad2DC; // 2DC
};
STATIC_ASSERT(sizeof(TESImageSpaceModifier::Data020) == 0xF4);
STATIC_ASSERT(offsetof(TESImageSpaceModifier, pad114) == 0x114);
STATIC_ASSERT(sizeof(TESImageSpaceModifier) == 0x2E0);
// 50
class TESLandTexture : public TESForm
{
public:
enum { kTypeID = kFormType_LandTexture };
// 10
struct Data40
{
UInt64 unk0; // 0
UInt64 unk4; // 8
};
UInt64 unk20; // 20
UInt8 unk28; // 28 - init'd to 30
UInt8 unk29; // 29 - init'd to 30
UInt8 pad2A[6]; // 2A
UInt64 unk30; // 30
UInt8 unk38; // 38 - init'd to 30
UInt8 pad39[3]; // 39
UInt32 unk3C; // 3C
Data40 unk40; // 40
};
// 38
class TESLoadScreen : public TESForm
{
public:
enum { kTypeID = kFormType_LoadScreen };
void * unk20; // 20 - linked list
TESObjectSTAT * object; // 28
BSFixedString unk30; // 30
};
// 68
class TESObjectANIO : public TESForm
{
public:
enum { kTypeID = kFormType_ANIO };
TESModelTextureSwap textureSwap; // 20
BSFixedString unk58; // 58
BSFixedString unk60; // 60
};
// 140
class TESObjectCELL : public TESForm
{
public:
enum { kTypeID = kFormType_Cell };
// parents
TESFullName fullName; // 020
// members
// 8
struct Data
{
UInt32 unk0;
UInt32 unk4;
};
// 18
struct Data048
{
BSExtraData * extraData;; // 00
void* unk00; // 08
UInt32 unk10; // 10
UInt32 unk14; // 14
};
struct TVDT
{
struct TVDT1
{
UInt32 * unk00; // array?
UInt32 * unk08; // array?
UInt32 unk10; // size?
};
struct TVDT0
{
TVDT1 * unk00;
UInt64 unk08;
UInt32 unk10; // skip TVDT1 if > 1
};
UInt32 unk00;
UInt32 unk04;
UInt32 unk08;
TVDT0 * unk10;
// ...
};
// 28
struct ReferenceData
{
// 10
struct Reference
{
TESObjectREFR *ref; // 0 - only valid if unk08 is NOT NULL, ignore value otherwise
void *unk08; // 8
};
UInt32 unk00; // 0
UInt32 maxSize; // 4
UInt32 freeEntries; // 8 - maxSize - freeEntries = num valid entries (where Reference.unk08 is not NULL)
UInt32 unk0C; // 0C
void *unk10; // 10 - Reference.unk08 is usually inititalized to this, but it is not always this
void *unk18; // 18
Reference* refArray; // 20
};
Data unk030; // 030
Data unk038; // 038
UInt16 unk040; // 040 1 - no 060
UInt16 unk042; // 042
UInt8 unk044; // 044
UInt8 unk045; // 045
UInt8 unk046; // 046
UInt8 pad047; // 047
// ExtraEditorID
// ExtraCellImageSpace
// ExtraCellMusicType
// ExtraLocation
// ExtraEncounterZone
// ExtraCellAcousticSpace
// ExtraSeenData
// ExtraHavok
Data048 unk048; // 048
TVDT * * unk060; // 060
void * unk068; // 068
float waterLevel; // 070 - init'd to 7F7FFFFFh, max float
void * unk078; // 078
void * unk080; // 080
ReferenceData refData; // 088 - New in SE
TESForm * unk0B0; // 0B0 - REFR owner of cell?
tArray<TESObjectREFR*> objectList; // 0B8 - SE: not always valid
UnkArray unk0D0; // 0D0
UnkArray unk0F8; // 0F8
UnkArray unk100; // 100
Data unk118; // 118
TESWorldSpace * worldSpace; // 120
UInt64 unk128; // 128
BGSLightingTemplate * lightingTemplate; // 130
UInt64 unk138; // 138
MEMBER_FN_PREFIX(TESObjectCELL);
DEFINE_MEMBER_FN(GetNorthRotation, float, 0x00280DB0);
};
STATIC_ASSERT(offsetof(TESObjectCELL, refData) == 0x88);
STATIC_ASSERT(offsetof(TESObjectCELL, objectList) == 0xB8);
STATIC_ASSERT(sizeof(TESObjectCELL) == 0x140);
// 48
class TESObjectLAND : public TESForm
{
public:
enum { kTypeID = kFormType_Land };
// parents
TESChildCell childCell; // 20
// members
UInt32 unk28; // 28
UInt64 unk30; // 30
UInt64 unk38; // 38
UInt64 unk40; // 40
};
// E0
class TESPackage : public TESForm
{
public:
enum { kTypeID = kFormType_Package };
virtual bool Unk_39(UInt32 arg0, UInt32 arg1, UInt32 arg2, UInt32 arg3);
virtual bool Unk_3A(UInt32 arg0, UInt32 arg1, UInt32 arg2, UInt32 arg3, UInt32 arg4);
virtual bool Unk_3B(UInt32 arg0, UInt32 arg1);
virtual bool Unk_3C(UInt32 arg0, UInt32 arg1);
virtual bool Unk_3D(UInt32 arg0);
enum
{
kPackageType_Find = 0,
kPackageType_Follow,
kPackageType_Escort,
kPackageType_Eat,
kPackageType_Sleep,
kPackageType_Wander,
kPackageType_Travel,
kPackageType_Accompany,
kPackageType_UseItemAt,
kPackageType_Ambush,
kPackageType_FleeNotCombat,
kPackageType_CastMagic,
kPackageType_Sandbox,
kPackageType_Patrol,
kPackageType_Guard,
kPackageType_Dialogue,
kPackageType_UseWeapon,
kPackageType_Find2,
kPackageType_Package,
kPackageType_PackageTemplate,
kPackageType_Activate,
kPackageType_Alarm,
kPackageType_Flee,
kPackageType_Trespass,
kPackageType_Spectator,
kPackageType_ReactToDead,
kPackageType_GetUpFromChair,
kPackageType_DoNothing,
kPackageType_InGameDialogue,
kPackageType_Surface,
kPackageType_SearchForAttacker,
kPackageType_AvoidPlayer,
kPackageType_ReactToDestroyedObject,
kPackageType_ReactToGrenadeOrMine,
kPackageType_StealWarning,
kPackageType_PickPocketWarning,
kPackageType_MovementBlocked,
kPackageType_Unk37,
kPackageType_Unk38
};
// C
struct Data50
{
UInt8 unk00; // 0 - init'd to FF
UInt8 unk01; // 1 - init'd to FF
UInt8 unk02; // 2 - init'd to FF
UInt8 unk03; // 3 - init'd to FF
UInt8 unk04; // 4 - init'd to FF
UInt8 pad05[3]; // 5
UInt32 unk08; // 8 - init'd to 0
};
// 20
struct Data
{
UInt64 unk00; // 00
UInt32 unk08; // 08
UInt32 pad0C; // 0C
UInt32 unk10; // 10
UInt64 unk18; // 18
};
UInt32 packageFlags; // 20
UInt8 type; // 24 - see kPackageType_ enum
UInt8 unk25; // 25
UInt8 unk26; // 26
UInt8 pad27; // 27
UInt16 unk28; // 28
UInt16 unk2A; // 2A
UInt64 unk30; // 30
UInt64 unk38; // 38
UInt64 unk40; // 40
UInt64 unk48; // 48
Data50 unk50; // 50
UInt32 pad5C; // 5C
void * unk60; // 60 - linked list
UInt64 unk68; // 68
UInt64 unk70; // 70
Data unk78; // 78
Data unk98; // 98
Data unkB8; // B8
UInt32 unkD8; // D8
UInt32 unkDC; // DC - incremented in dtor
bool IsExtraType();
};
// F8
class AlarmPackage : public TESPackage
{
public:
UInt64 unkE0; // E0
UInt64 unkE8; // E8
UInt8 unkF0; // F0
UInt8 padF1[7]; // F1
};
// 100
class DialoguePackage : public TESPackage
{
public:
UInt32 unkE0; // E0
UInt32 unkE4; // E4
UInt32 unkE8; // E8
UInt32 unkEC; // EC
UInt8 unkF0; // F0
UInt8 unkF1; // F1
UInt8 padF2[2]; // F2
UInt32 unkF4; // F4
UInt32 unkF8; // F8
UInt8 unkFC; // FC
UInt8 padFD[3]; // FD
};
// 118
class FleePackage : public TESPackage
{
public:
struct DataF8
{
UInt32 unk0; // 0
UInt32 unk4; // 4
UInt32 unk8; // 8
};
UnkArray unk0E0; // 0E0
DataF8 unk0F8; // 0F8
float unk104; // 104 - init'd to -1
UInt32 unk108; // 108
UInt32 unk10C; // 10C
UInt8 unk110; // 110
UInt8 unk111; // 111 - init'd to 1
UInt8 unk112; // 112
UInt8 unk113; // 113
UInt8 unk114; // 114
UInt8 pad115[3]; // 115
};
// 120
class SpectatorPackage : public TESPackage
{
public:
struct Data0F4
{
UInt32 unk0; // 0
UInt32 unk4; // 4
UInt32 unk8; // 8
};
UInt32 unk0E0; // 0E0
UInt32 pad0E4; // 0E4 - not init'd
UInt32 unk0E8; // 0E8
UInt32 unk0EC; // 0EC
UInt8 unk0F0; // 0F0
UInt8 pad0F1[3]; // 0F1
Data0F4 unk94; // 0F4
UnkArray unk100; // 100
UInt64 pad118; // 118 - not init'd
};
// 100
class TrespassPackage : public TESPackage
{
public:
// Warning: either unkE0 or unkE8 is a UInt64, but not both, but it hasn't been confirmed yet which one.
UInt32 unkE0; // E0
UInt32 unkE4; // E4
UInt64 unkE8; // E8
UInt32 unkF0; // F0 - init'd to -1
UInt32 unkF4; // F4 - init'd to 3
UInt32 unkF8; // F8
};
// 4B8
class TESRace : public TESForm
{
public:
enum { kTypeID = kFormType_Race };
enum {
kRace_Playable = 0x00000001,
kRace_FaceGenHead = 0x00000002,
kRace_Child = 0x00000004,
kRace_TiltFrontBack = 0x00000008,
kRace_TiltLeftRight = 0x00000010,
kRace_NoShadow = 0x00000020,
kRace_Swims = 0x00000040,
kRace_Flies = 0x00000080,
kRace_Walks = 0x00000100,
kRace_Immobile = 0x00000200,
kRace_NotPushable = 0x00000400,
kRace_NoCombatInWater = 0x00000800,
kRace_NoRotatingToHeadTrack = 0x00001000,
kRace_UseHeadTrackAnim = 0x00008000,
kRace_SpellsAlignWithMagicNode = 0x00010000,
kRace_UseWorldRaycasts = 0x00020000,
kRace_AllowRagdollCollision = 0x00040000,
kRace_CantOpenDoors = 0x00100000,
kRace_AllowPCDialogue = 0x00200000,
kRace_NoKnockdowns = 0x00400000,
kRace_AllowPickpocket = 0x00800000,
kRace_AlwaysUseProxyController = 0x01000000,
kRace_OverlayHeadParts = 0x04000000,
kRace_OverrideHeadParts = 0x08000000,
kRace_AllowMultipleMembraneShaders = 0x20000000,
kRace_CanDualWield = 0x40000000,
kRace_AvoidsRoads = 0x80000000,
};
// parents
TESFullName fullName; // 020
TESDescription description; // 030
TESSpellList spellList; // 040
BGSSkinForm skin; // 050
BGSBipedObjectForm biped; // 060
BGSKeywordForm keyword; // 070
BGSAttackDataForm attackData; // 088
// members
enum {
kRace_NumSkillBonuses = 7
};
// AC
struct Data
{
struct SkillBonus
{
UInt8 skill;
UInt8 bonus;
};
SkillBonus skillBonus[kRace_NumSkillBonuses];
UInt8 pad0E[2]; // 0E
float height[2]; // 10
float weight[2]; // 18
UInt32 raceFlags; // 20 - not init'd
float health; // 24
float magicka; // 28
float stamina; // 2C
float carryweight; // 30
float mass; // 34
float accelRate; // 38
float deaccelRate; // 3C
UInt32 unk40; // 40 - init'd to 1 - Flags?
UInt32 unk44; // 44 - init'd to FFFFFFFF
UInt32 unk48; // 48 - init'd to FFFFFFFF - Flags?
UInt32 unk4C; // 4C - not init'd
float injuredHealthPct; // 50 - init'd to FFFFFFFF
float healthRegen; // 54
float manaRegen; // 58
float staminaRegen; // 5C
float unarmedDamage; // 60
float handReach; // 64
UInt32 unk68; // 68 - init'd to FFFFFFFF - Flags?
float aimAngleTolerance; // 6C
UInt32 unk70; // 70 - init'd to 0
float angleAcceleration; // 74
float angleTolerance; // 78
UInt32 unk7C; // 7C
UInt32 unk80; // 80
UInt32 unk84; // 84
float unk88; // 88
float unk8C; // 8C
float unk90; // 90
float unk94; // 94
float unk98; // 98
float unk9C; // 9C
float unkA0; // A0
float unkA4; // A4
float unkA8; // A8
};
TESModel models[2]; // 098
Data data; // 0E8
BGSTextureModel textureModel[2]; // 198
BGSBehaviorGraphModel behaviorGraph[2]; // 1E8
StringCache::Ref behaviorPath[2]; // 238
StringCache::Ref behaviorName[2]; // 248
BGSVoiceType * voiceTypes[2]; // 258
BGSBodyPartData * bodyPartData; // 268
TESForm * decapitateArmor[2]; // 270
UnkArray unk280[2]; // 280
void * unk2B0[4]; // 2B0
void * unk2D0[2]; // 2D0 AttackAnimationArrayMap
StringCache::Ref editorId; // 2E0
BGSMaterialType * impactMaterial; // 2E8
BGSImpactDataSet * meleeImpact; // 2F0
BGSArtObject * decapitateBloodArt; // 2F8
BGSSoundDescriptorForm * openCorpseSound; // 300
BGSSoundDescriptorForm * closeCorpseSound; // 308
StringCache::Ref bipedObjectNames[0x20]; // 310
tArray<BGSEquipSlot*> slotRestrictions; // 410
UInt32 unk428; // 428
BGSEquipSlot * unarmedEquipSlot; // 430
TESRace * morphRace; // 438
TESRace * armorRace; // 440
UnkArray unk448; // 448
UnkArray unk460; // 460
UInt8 unk478[0x30]; // 478
// C8
struct CharGenData
{
struct TintOption
{
UInt32 unk00; // 00
TESTexture texture; // 08
BGSColorForm * defaultColor; // 18
tArray<BGSColorForm*> colors; // 20
tArray<float> alpha; // 38
tArray<UInt32> unk50; // 50
};
UInt32 presetFlags[4][8]; // 00
UInt32 totalPresets[4]; // 80
tArray<TintOption*> * tintData; // 90
tArray<BGSTextureSet*> * textureSet; // 98
BGSTextureSet * defaultTexture; // A0
tArray<TESNPC*> * presets; // A8
tArray<BGSColorForm*> * colors; // B0
BGSColorForm * defaultColor; // B8
tArray<BGSHeadPart*> * headParts; // C0
};
CharGenData * chargenData[2]; // 4A8
};
// 50
class TESRegion : public TESForm
{
public:
enum { kTypeID = kFormType_Region };
virtual bool Unk_39(void);
// 18
struct Data20
{
UInt64 unk00; // 0
UInt64 unk08; // 8
UInt8 unk10; // 10
UInt8 pad11[7]; // 11
};
// 10
struct Data28
{
UInt64 unk0;
UInt64 unk8;
};
// C
struct Data40
{
UInt32 unk0;
UInt32 unk4;
UInt32 unk8;
};
Data20 * unk20; // 20
Data28 * unk28; // 28
TESWorldSpace * worldSpace; // 30
UInt64 unk38; // 38
Data40 unk40; // 40
};
// A8
class TESShout : public TESForm
{
public:
enum { kTypeID = kFormType_Shout };
// parents
TESFullName fullName; // 20
BGSMenuDisplayObject menuDispObject; // 30
BGSEquipType equipType; // 40
TESDescription description; // 50
// members
// 18
struct Words
{
enum {
kNumWords = 3
};
TESWordOfPower * word; // 0
SpellItem * spell; // 8
float recoverytime; // 10
UInt32 pad14; // 14
};
Words words[Words::kNumWords]; // 60
};
// 60
class TESTopic : public TESForm
{
public:
enum { kTypeID = kFormType_Topic };
// parents
TESFullName fullName; // 20
// members
UInt8 unk1C[4]; // 30
UInt32 unk20; // 34 - init'd to 0x32000000
void *unk38; // 38
UInt64 unk40; // 40
void ** unk2C; // 48 - buf[unk50]
UInt32 unk50; // 50 - len
BSFixedString editorId; // 58
};
// 48
class TESTopicInfo : public TESForm
{
public:
enum { kTypeID = kFormType_TopicInfo };
enum
{
kDialogFlag_Goodbye = 1 << 0,
kDialogFlag_Random = 1 << 1,
kDialogFlag_SayOnce = 1 << 2,
kDialogFlag_RandomEnd = 1 << 5,
kDialogFlag_InvisibleContinue = 1 << 6,
kDialogFlag_ForceSubtitle = 1 << 8,
kDialogFlag_CanMoveWhileGreeting = 1 << 10,
kDialogFlag_HasNoLipFile = 1 << 11,
kDialogFlag_RequiresPostProcessing = 1 << 12,
kDialogFlag_SpendsFavorPoints = 1 << 14,
};
UInt64 unk14; // 20
UInt64 unk18; // 28 - show response data from info?
Condition * conditions; // 30 - linked list
UInt16 unk20; // 38 - init'd to FFFF
UInt8 unk22; // 3A
UInt8 favorLevel; // 3B
UInt16 dialogFlags; // 3C
UInt16 hoursUntilReset; // 3E
UInt32 unk40; // 40
UInt32 pad44; // 44
};
STATIC_ASSERT(sizeof(TESTopicInfo) == 0x48);
// 260
class TESWaterForm : public TESForm
{
public:
enum { kTypeID = kFormType_Water };
// parents
TESFullName fullName; // 20
TESAttackDamageForm attackDamage; // 30
// members
// E4-E8
struct Data0D0
{
float unk00; // 00 - init'd to .1
float unk04; // 04 - init'd to 90
float unk08; // 08 - init'd to .5
float unk0C; // 0C - init'd to 1
float unk10; // 10 - init'd to 50
float unk14; // 14 - init'd to .5
float unk18; // 18 - init'd to .025
UInt32 unk1C; // 1C - init'd to 0
UInt32 unk20; // 20 - init'd to 0
UInt32 unk24; // 24 - init'd to 0
UInt32 unk28; // 28 - init'd to 00808000
UInt32 unk2C; // 2C - init'd to 00190000
UInt32 unk30; // 30 - init'd to 00FFFFFF
UInt8 unk34; // 34 - init'd to 0
UInt8 pad35[3]; // 35
float unk38; // 38 - init'd to 0.1
float unk3C; // 3C - init'd to 0.6
float unk40; // 40 - init'd to 0.985
float unk44; // 44 - init'd to 2
float unk48; // 48 - init'd to .01
float unk4C; // 4C - init'd to .4
float unk50; // 50 - init'd to .6
float unk54; // 54 - init'd to .985
float unk58; // 58 - init'd to 10
float unk5C; // 5C - init'd to .05
float unk60; // 60 - init'd to 300
UInt32 unk64; // 64 - init'd to 0
UInt32 unk68; // 68 - init'd to 0
UInt32 unk6C; // 6C - init'd to 0
UInt32 unk70; // 70 - init'd to 0
UInt32 unk74; // 74 - init'd to 0
UInt32 unk78; // 78 - init'd to 0
float unk7C; // 7C - init'd to 300
float unk80; // 80 - init'd to 300
float unk84; // 84 - init'd to 1
UInt32 unk88; // 88 - not init'd
float unk8C; // 8C - init'd to 1
UInt32 unk90; // 90 - init'd to 0
float unk94; // 94 - init'd to 1000
float unk98; // 98 - init'd to 250
float unk9C; // 9C - init'd to 100
float unkA0; // A0 - init'd to 1
float unkA4; // A4 - init'd to 10000
float unkA8; // A8 - init'd to 1
float unkAC; // AC - init'd to 100
float unkB0; // B0 - init'd to 100
float unkB4; // B4 - init'd to 100
UInt32 unkB8; // B8 - init'd to 0
UInt32 unkBC; // BC - init'd to 0
UInt32 unkC0; // C0 - init'd to 0
float unkC4; // C4 - init'd to 1
float unkC8; // C8 - init'd to 1
float unkCC; // CC - init'd to 1
float unkD0; // D0 - init'd to 1
float unkD4; // D4 - init'd to 1
float unkD8; // D8 - init'd to 1
float unkDC; // DC - init'd to 1
float unkE0; // E0 - init'd to 1
float unkE4; // E4 - init'd to 1 - New in SE
};
UInt8 unk040; // 040 - init'd to 1
UInt8 pad041[3]; // 041
UInt32 unk044; // 044
// SE: I had to remove the Data2C structures and extract the variables out because there was no way for the alignment to work
UInt32 unk048; // 048
UInt32 unk04C; // 04C
UInt32 unk050; // 050
UInt32 unk054; // 054
UInt32 unk058; // 058
UInt32 unk05C; // 05C
UInt32 unk060; // 060
UInt32 unk064; // 064
UInt32 unk068; // 068
UInt32 unk06C; // 06C
UInt32 unk070; // 070
UInt32 pad074; // 074
TESTexture unk078; // 078
TESTexture unk088; // 088
TESTexture unk098; // 098
TESTexture unk0A8; // 0A8 - New in SE?
UInt8 unk0B8; // 0B8 - init'd to 75
UInt8 unk0B9; // 0B9
UInt8 pad0BA[6]; // 0BA
UInt64 unk0C0; // 0C0
UInt64 unk0C8; // 0C8
Data0D0 unk0D0; // 0D0
UInt64 unk1B8[3]; // 1B8
UInt32 unk1D0; // 1D0
UInt32 unk1D4; // 1D4
UInt32 unk1D8; // 1D8 - init'd to 9
UInt32 unk1DC; // 1DC - init'd to 9
UInt32 unk1E0; // 1E0 - init'd to 4
float unk1E4; // 1E4 - init'd to 0.5
float unk1E8; // 1E8 - init'd to 2.0
float unk1EC; // 1EC - init'd to 0.5
float unk1F0; // 1F0 - init'd to 0.5
UInt32 pad1F4; // 1F4
UInt64 unk1F8; // 1F8
UInt64 unk200; // 200
UInt64 unk208; // 201
UInt64 unk210; // 210
UInt64 unk218; // 218
UInt64 unk220; // 220
UInt64 unk228; // 228 - it may be new in SE
void * unk230; // 230 - refcounted ptr
UInt32 unk238; // 238
UInt8 unk23C; // 23C
UInt8 pad23D[3]; // 23D
UInt32 unk240; // 240
// SE: extracting data out from old Data1C8 structure, or alignment won't work
UInt32 unk244; // 244
UInt32 unk248; // 248
UInt32 unk24C; // 24C
UInt32 unk250; // 250
UInt32 unk254; // 254
UInt32 unk258; // 258
UInt32 unk25C; // 25C
};
STATIC_ASSERT(sizeof(TESWaterForm) == 0x260);
// 8D8
class TESWeather : public TESForm
{
public:
enum { kTypeID = kFormType_Weather };
enum { kNumColorTypes = 17 };
enum { kNumTimeOfDay = 4 };
enum ColorTypes {
kColorType_SkyUpper = 0,
kColorType_FogNear = 1,
kColorType_Unk = 2,
kColorType_Ambient = 3,
kColorType_Sunlight = 4,
kColorType_Sun = 5,
kColorType_Stars = 6,
kColorType_SkyLower = 7,
kColorType_Horizon = 8,
kColorType_EffectLighting = 9,
kColorType_CloudLODDiffuse = 10,
kColorType_CloudLODAmbient = 11,
kColorType_FogFar = 12,
kColorType_SkyStatics = 13,
kColorType_WaterMultiplier = 14,
kColorType_SunGlare = 15,
kColorType_MoonGlare = 16
};
enum TimeOfDay {
kTime_Sunrise = 0,
kTime_Day = 1,
kTime_Sunset = 2,
kTime_Night = 3
};
// 10
struct ColorType
{
UInt32 time[kNumTimeOfDay];
};
// 14
struct General
{
//UInt8 unk00[0x13]; // 00
UInt8 windSpeed;
UInt8 unk01[2];
UInt8 transDelta; // Div 1000
UInt8 sunGlare; // Div 256
UInt8 sunDamage; // Div 256
UInt16 unk06; // precipitation fadein/out
UInt32 unk08; // thunder ligting fadein/out/frequency/flags
UInt32 lightingColor;
UInt8 unk10;
UInt8 windDirection; // Div (256/360)
UInt8 windDirRange; // Div (256/180)
UInt8 pad13;
};
// 20
struct FogDistance
{
float nearDay;
float farDay; // 10
float nearNight; // 14
float farNight; // 18
float powerDay; // 1C
float powerNight;
float maxDay;
float maxNight;
};
// 10
struct CloudAlpha
{
float time[kNumTimeOfDay];
};
TESTexture1024 texture[0x20]; // 020
UInt8 unk220[0x20]; // 220 - cleared to 0x7F
UInt8 unk240[0x20]; // 240 - cleared to 0x7F
UInt8 unk260[0x200]; // 260
CloudAlpha cloudAlpha[0x20]; // 460
UInt32 unk660; // 660
General general; // 664
FogDistance fogDistance; // 678
ColorType colorTypes[kNumColorTypes]; // 698
TESAIForm::Data unk7A8; // 7A8
UnkArray unk7B8; // 7B8
UInt32 unk7D0; // 7D0 - not init'd - LNAM unknown
TESImageSpace * imageSpaces[kNumTimeOfDay]; // 7D8
BGSLightingTemplate::Data::Color directionalAmbient[kNumTimeOfDay]; // 7F8
TESModel unk878; // 878
TESForm *lensFlare; // 8A0 - TODO: replace with actual form pointer when a definition is available
TESForm *volumetricLightings[kNumTimeOfDay]; // 8A8 - TODO: replace with actual form pointer when a definition is available
BGSShaderParticleGeometryData * particleShader; // 8C8
BGSReferenceEffect * referenceEffect; // 8D0
};
STATIC_ASSERT(sizeof(TESWeather) == 0x8D8);
// 38
class TESWordOfPower : public TESForm
{
public:
enum { kTypeID = kFormType_WordOfPower };
// parents
TESFullName fullName; // 20
// members
BSFixedString word; // 30
};
// 358
class TESWorldSpace : public TESForm
{
public:
enum { kTypeID = kFormType_WorldSpace };
// parents
TESFullName fullName; // 14-20
// members
// F0
struct Data250
{
// this struct keeps showing up everywhere
// 30
struct Entry
{
UInt64 unk00; // 00 - not init'd
UInt32 unk08; // 08 - not init'd
UInt32 unk0C; // 0C
UInt32 unk10; // 10
UInt32 unk14; // 14
void* unk18; // 18
UInt64 unk20; // 20 - not init'd
UInt64 unk28;
};
Entry unk00;
Entry unk30;
Entry unk60;
Entry unk90;
Entry unkC0;
};
struct LandData // DNAM
{
float defaultLandHeight; // 0
float defaultWaterHeight; // 4
};
STATIC_ASSERT(sizeof(LandData) == 0x8);
TESModel unk030; // 030
// TODO: this block may all be part of same thing
UInt8 unk058[0x18]; // 058
void* unk070; // 070
UInt8 unk078[0x10]; // 078
TESObjectCELL* unk088; // 088
void* unk090; // 090
UInt64 unk098; // 098
UInt8 unk0A0; // 0A0
UInt8 pad0A1; // 0A1
UInt16 unk0A2; // 0A2
UInt16 unkA04; // 0A4
UInt16 unk0A6; // 0A6
UInt64 unk0A8; // 0A8
UInt32 unk0B0; // 0B0
UInt32 unk0B4; // 0B4
UInt32 unk0B8; // 0B8
UInt32 unk0BC; // 0BC
void* unk0C0; // 0C0
UInt64 unk0C8; // 0C8
void* unk0D0; // 0D0
tArray<TESObjectREFR *> unk0D8; // 0D8
void* unk0F0; // 0F0
TESObjectCELL* unk0F8; // 0F8
UInt64 unk100; // 100
UInt32 unk108; // 108
UInt32 unk10C; // 10C
UInt32 unk110; // 110
UInt32 unk114; // 114
void* unk118; // 118
UInt64 unk120; // 120
UInt64 unk128; // 128
UInt64 unk130; // 130
UInt64 unk138; // 138
UInt64 unk140; // 140
UInt64 unk148; // 148
UInt64 unk150; // 150
void* unk158; // 158
BGSLightingTemplate* interiorLighting; // 160
TESWaterForm* water; // 168
TESWaterForm* lodWater; // 170
UInt8 unk178[0x20]; // 178
float unk198; // init'd to 50000
float unk19C; // init'd to 80000
float unk1A0; // init'd to 50
float unk1A4; // world map scale?
float unk1A8; // cell X offset?
float unk1AC; // cell Y offset?
float unk1B0; // cell Z offset?
UInt32 unk1B4;
BGSMusicType* musicType; // 1B8
float unk1C0; // 1C0
float unk1C4; // 1C4
float unk1C8; // 1C8
float unk1CC; // 1CC
UInt64 unk1D0; // 1D0
UInt32 unk1D8; // 1D8
UInt32 unk1DC; // 1DC
UInt32 unk1E0; // 1E0
UInt32 unk1E4; // 1E4
void* unk1E8; // 1E8
UInt64 unk1F0; // 1F0
void* unk1F8; // 1F8
BSString editorId; // 200
LandData landData; // 210
float unk218; // 218
UInt32 pad21C; // 21C
BGSEncounterZone* encounterZone; // 220
BGSLocation* location; // 228
TESTexture unk230; // 230
TESTexture unk240; // 240
Data250 unk250; // 250
UInt64 unk340; // 340
UInt64 unk348; // 348
void* unk350; // 350
};
STATIC_ASSERT(sizeof(TESWorldSpace) == 0x358);
// 8
class IFormFactory
{
public:
IFormFactory();
virtual ~IFormFactory();
virtual TESForm * Create(void) = 0;
virtual const char * GetName(void) = 0;
virtual UInt32 GetTypeID(void) = 0;
virtual const char * Unk_04(void); // return NULL
virtual UInt32 Unk_05(void); // return 0x67
virtual UInt32 Unk_06(void); // return 9
// void ** _vtbl; // 00
static IFormFactory * GetFactoryForType(UInt32 type)
{
if(type > kFormType_Max)
return NULL;
// 5386ADDB542755AB5BD598497543E780AD5BDC54+35
static RelocPtr<IFormFactory *> kFactoryList(0x01F5F620);
return kFactoryList[type];
}
};
// 10
class ConcreteFormFactory : public IFormFactory
{
public:
const char * name; // 08
};