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.
 
 
 

1514 lines
30 KiB

#pragma once
// everything deriving from BaseFormComponent but not TESForm goes here
#include "skse64/GameTypes.h"
class TESObjectSTAT;
class BGSSoundDescriptorForm;
class BGSSoundOutput;
class BGSSoundCategory;
class BGSKeyword;
class TESForm;
class SpellItem;
class TESShout;
class IngredientItem;
class TESRace;
class EnchantmentItem;
class TESFaction;
class BGSVoiceType;
class BGSEquipSlot;
class Actor;
class TESObjectARMO;
class TESObjectARMA;
class TESIdleForm;
class BGSPerk;
class ActorValueInfo;
class TESGlobal;
class TESRegion;
class BGSMusicType;
class TESWeather;
class TESPackage;
class BGSMusicTrackFormWrapper;
class BGSImpactDataSet;
class BGSMaterialType;
class NiNode;
class NiAVObject;
//// root
// 04
class BaseFormComponent
{
public:
BaseFormComponent();
virtual ~BaseFormComponent();
virtual void Init(void);
virtual void ReleaseRefs(void);
virtual void CopyFromBase(BaseFormComponent * rhs);
// void ** _vtbl; // 00
};
//// members of other components
// 10
class TESTexture : public BaseFormComponent
{
public:
virtual UInt32 Unk_04(void);
virtual void GetNormalMapName(BSString * out); // might have const char * retn type
virtual const char * GetSearchDir(void);
BSFixedString str; // 08
};
// 10
class TESIcon : public TESTexture
{
};
// 10
class TESTexture1024 : public TESTexture
{
};
//// leaf nodes
// 10
class BGSAttackDataForm : public BaseFormComponent
{
public:
BSTSmartPointer <void> unk08; // 08
};
// 10
class BGSBipedObjectForm : public BaseFormComponent
{
public:
// applicable to DefaultRace
enum
{
kPart_Head = 1 << 0,
kPart_Hair = 1 << 1,
kPart_Body = 1 << 2,
kPart_Hands = 1 << 3,
kPart_Forearms = 1 << 4,
kPart_Amulet = 1 << 5,
kPart_Ring = 1 << 6,
kPart_Feet = 1 << 7,
kPart_Calves = 1 << 8,
kPart_Shield = 1 << 9,
kPart_Unnamed10 = 1 << 10,
kPart_LongHair = 1 << 11,
kPart_Circlet = 1 << 12,
kPart_Ears = 1 << 13,
kPart_Unnamed14 = 1 << 14,
kPart_Unnamed15 = 1 << 15,
kPart_Unnamed16 = 1 << 16,
kPart_Unnamed17 = 1 << 17,
kPart_Unnamed18 = 1 << 18,
kPart_Unnamed19 = 1 << 19,
kPart_Unnamed20 = 1 << 20,
kPart_Unnamed21 = 1 << 21,
kPart_Unnamed22 = 1 << 22,
kPart_Unnamed23 = 1 << 23,
kPart_Unnamed24 = 1 << 24,
kPart_Unnamed25 = 1 << 25,
kPart_Unnamed26 = 1 << 26,
kPart_Unnamed27 = 1 << 27,
kPart_Unnamed28 = 1 << 28,
kPart_Unnamed29 = 1 << 29,
kPart_Unnamed30 = 1 << 30,
kPart_FX01 = 1 << 31,
};
enum
{
kWeight_Light = 0,
kWeight_Heavy,
kWeight_None,
};
struct Data
{
UInt32 parts; // 00 - init'd to 0
UInt32 weightClass; // 04 - init'd to 2 (none)
};
Data data; // 08
UInt32 GetSlotMask() const { return data.parts; }
void SetSlotMask(UInt32 mask) { data.parts = mask; }
UInt32 AddSlotToMask(UInt32 mask);
UInt32 RemoveSlotFromMask(UInt32 mask);
};
// 18
class BGSBlockBashData : public BaseFormComponent
{
public:
BGSImpactDataSet * impact; // 08
BGSMaterialType * material; // 10
};
// 10
class BGSDestructibleObjectForm : public BaseFormComponent
{
public:
// 10 or 10+
struct Data
{
UInt32 health; // 00
UInt8 destCount; // 04
UInt8 vatsTargetable; // 05
UInt8 pad06[2]; // 06
void *unk08; // 08
// ...?
};
Data * data; // 08
};
// 10
class BGSEquipType : public BaseFormComponent
{
public:
virtual BGSEquipSlot * GetEquipSlot(void);
virtual void SetEquipSlot(BGSEquipSlot * type);
BGSEquipSlot * equipSlot; // 08
};
// 20
class BGSIdleCollection : public BaseFormComponent
{
public:
UInt8 unk08; // 08
UInt8 unk09; // 09 - unk10 length
UInt8 unk0A[6]; // 0A
void ** unk10; // 10 - copyable struct
UInt32 unk18; // 18
UInt32 pad1C; // 1C
};
// 18
class BGSKeywordForm : public BaseFormComponent
{
public:
virtual bool HasKeyword(BGSKeyword* keyword);
virtual UInt32 GetDefaultKeyword(void);
BGSKeyword ** keywords; // 08
UInt32 numKeywords; // 10
UInt32 pad14;
};
// 10
class BGSMenuDisplayObject : public BaseFormComponent
{
public:
virtual UInt32 GetMenuDisplayObject(void);
TESObjectSTAT * worldStatic; // 08 - copyable
};
// 18
class BGSMessageIcon : public BaseFormComponent
{
public:
TESIcon icon; // 08
};
// 28
class BGSOverridePackCollection : public BaseFormComponent
{
public:
UInt64 unk08; // 08
UInt64 unk10; // 10
UInt64 unk18; // 18
UInt64 unk20; // 20
};
// 18
class BGSPerkRankArray : public BaseFormComponent
{
public:
// 10
struct Data
{
BGSPerk * perk; // 00
UInt8 rank; // 08
UInt8 pad05[7]; // 09
};
Data * perkRanks; // 08
UInt32 numPerkRanks; // 10
UInt32 pad14; // 14
};
class BGSPerkRanks : public tArray<BGSPerkRankArray::Data*>
{
public:
MEMBER_FN_PREFIX(BGSPerkRanks);
DEFINE_MEMBER_FN(VisitPerks, void, 0x00000000, void * perkRankVisitor); // BGSPerk::PerkRankVisitor
};
// 18
class BGSPickupPutdownSounds : public BaseFormComponent
{
public:
BGSSoundDescriptorForm* pickUp; // 08
BGSSoundDescriptorForm* putDown; // 10
};
// 08
class BGSPreloadable : public BaseFormComponent
{
public:
virtual void Unk_04(void); // pure virtual
};
// 10
class BGSSkinForm : public BaseFormComponent
{
public:
TESObjectARMO * skin; // 04
};
// 28
class TESAIForm : public BaseFormComponent
{
public:
// 10 - might be ExtraDataList
struct Data
{
void *unk0; // 0
Data * next; // 8
};
UInt32 flags; // 08
UInt32 unk0C; // 0C
UInt16 unk10; // 10
UInt8 pad12[6]; // 12
Data unk18; // 18
};
// 58
class TESActorBaseData : public BaseFormComponent
{
public:
virtual void Unk_04(UInt32 arg);
virtual bool GetFlag20000000(void);
virtual bool GetFlag80000000(void);
virtual bool Unk_07(void);
virtual UInt32 GetUnk20(void);
enum {
kFlag_PCLevelMult = 0x80
};
UInt32 flags; // 08 - init'd to 0
UInt16 unk0C; // 0C - init'd to 0
UInt16 unk0E; // 0E - init'd to 0
UInt16 level; // 10 - init'd to 1 (CK Multiplier * 1000 if PCLevelMult is true)
UInt16 minLevel; // 12 - init'd to 0
UInt16 maxLevel; // 14 - init'd to 0
UInt16 unk16; // 16 - init'd to 0x64 (100)
UInt16 unk18; // 18 - init'd to iBaseDisposition (35)
UInt16 unk1A; // 1A - init'd to 0
UInt16 unk1C; // 1C - init'd to 0
UInt16 unk1E; // 1E - init'd to 0
UInt64 unk20; // 20
BGSVoiceType* voiceType; // 28
UInt64 unk30; // 30
UInt32 unk38; // 38 - init'd to 0
UInt32 pad3C; // 3C
struct FactionInfo
{
TESFaction * faction; // 00
SInt8 rank; // 08
UInt8 pad[7]; // 09
};
tArray<FactionInfo> factions; // 40
};
STATIC_ASSERT(sizeof(TESActorBaseData) == 0x58);
// 10
class TESAttackDamageForm : public BaseFormComponent
{
public:
virtual UInt16 GetAttackDamage(void);
UInt16 attackDamage; // 08
UInt8 pad06[2]; // 0A
UInt32 pad0C; // 0C
};
class BGSTextureSet;
// 28
class TESModel : public BaseFormComponent
{
public:
virtual const char * GetModelName(void);
virtual void SetModelName(const char * name);
virtual UInt32 Unk_06(void);
BSFixedString name; // 08
UInt64 unk10; // 10
UInt64 unk18; // 18
UInt32 unk20; // 20
};
// 38
class TESModelTextureSwap : public TESModel
{
public:
// 18
struct SwapInfo
{
BGSTextureSet * textureSet; // 00
UInt32 unk04; // 08 - index
BSFixedString name; // 10
};
SwapInfo * swaps; // 28
UInt32 count; // 30
};
// 28
class TESModelRDT : public TESModel
{
public:
};
// F0
class TESBipedModelForm : public BaseFormComponent
{
public:
TESModelTextureSwap textureSwap[2]; // 08
TESIcon icon[2]; // 78
BGSMessageIcon messageIcon[2]; // 98
TESModelRDT modelRDT; // C8
};
// 18
class TESContainer : public BaseFormComponent
{
public:
struct Entry
{
struct Data
{
TESForm* owner; // 00
TESGlobal* global; // 08
float condition; // 10
};
UInt32 count; // 00
UInt32 unk04; // 04 - likely just pad
TESForm* form; // 08
Data * data; // 10 - extra data
};
Entry ** entries; // 8
UInt32 numEntries; // 10
template <class Op>
UInt32 CountIf(Op& op) const
{
UInt32 count = 0;
for (UInt32 n = 0; n < numEntries; n++) {
Entry* pEntry = entries[n];
if (pEntry && op.Accept(pEntry))
count++;
}
return count;
}
template <class Op>
Entry* Find(Op& op) const
{
bool bFound = false;
UInt32 n = 0;
Entry* pEntry = NULL;
for (UInt32 n = 0; n < numEntries && !bFound; n++) {
pEntry = entries[n];
if (pEntry) {
bFound = op.Accept(pEntry);
}
}
return (bFound && pEntry) ? pEntry : NULL;
}
template <class Op>
void Visit(Op& op) const {
bool bContinue = true;
for (UInt32 n = 0; n < numEntries && bContinue; n++) {
Entry* pEntry = entries[n];
if (pEntry) {
bContinue = op.Accept(pEntry);
}
}
}
UInt32 CountItem(TESForm* item) const;
};
// 18
class TESDescription : public BaseFormComponent
{
public:
UInt32 unk08; // 08
UInt32 unk0C; // 0C - init'd to FFFFFFFF
MEMBER_FN_PREFIX(TESDescription);
DEFINE_MEMBER_FN(Get, void, 0x0019AB70, BSString * out, TESForm * parent, UInt32 fieldType);
};
// 18
class TESEnchantableForm : public BaseFormComponent
{
public:
virtual UInt16 Unk_04(void); // return unk10
EnchantmentItem* enchantment; // 08 - init'd to 0
UInt16 unk10; // 10 - init'd to 3
UInt16 maxCharge; // 12
};
// 10
class TESFullName : public BaseFormComponent
{
public:
virtual UInt32 Unk_04(void);
virtual const char * GetName(void);
BSFixedString name; // 08
};
// 10
class TESImageSpaceModifiableForm : public BaseFormComponent
{
public:
UInt64 unk08; // 08
};
// 28
class TESLeveledList : public BaseFormComponent
{
public:
struct Entry
{
TESForm * form; // 00 - init'd to 0
UInt16 count; // 08 - init'd to 1
UInt16 level; // 0A - init'd to 1
UInt32 pad0C; // 0C
UInt64 unk10; // 10 - init'd to 0
};
enum
{
kFlagCalculateFromAllLevelsLTPCLevel = 1 << 0,
kFlagCalculateForEachItemInCount = 1 << 1,
kFlagUseAll = 1 << 2,
kFlagSpecialLoot = 1 << 3
};
virtual bool Unk_04(void);
virtual bool GetFlag02(void);
virtual UInt32 Unk_06(void);
virtual void Unk_07(void); // pure
Entry * entries; // 08
UInt8 chanceValue; // 10
UInt8 flags; // 11
UInt8 length; // 12
UInt8 unk0B; // 13
UInt32 pad14; // 14
void * unk18; // 18
TESGlobal * chanceGlobal; // 20
};
// 28
class BGSBehaviorGraphModel : public TESModel
{
public:
};
// 28
class BGSTextureModel : public TESModel
{
public:
};
// 28
class TESModelPSA : public TESModel
{
public:
};
// 28
class TESModelTri : public TESModel
{
public:
};
// 20
class TESProduceForm : public BaseFormComponent
{
public:
BGSSoundDescriptorForm * harvestSound; // 08
TESForm * produce; // 10
UInt32 un18; // 18
UInt32 pad1C; // 1C
};
// 10
class TESQualityForm : public BaseFormComponent
{
public:
UInt32 quality; // 08
UInt32 pad0C; // 0C
};
// 10
class TESRaceForm : public BaseFormComponent
{
public:
TESRace * race; // 08
};
class TESFaction;
// 20
class TESReactionForm : public BaseFormComponent
{
public:
// 10
struct Data
{
TESFaction *faction; // 00
UInt32 modifier; // 08
UInt32 reaction; // 0C
};
// 10
struct Entry
{
Data * data; // 00
Entry * unk4; // 08
};
Entry entry; // 08
UInt8 unk18; // 18 - init'd to B
UInt8 pad19[7]; // 19
};
// 10
class TESSpellList : public BaseFormComponent
{
public:
UInt32 GetSpellCount() const;
SpellItem * GetNthSpell(UInt32 n) const;
UInt32 GetShoutCount() const;
TESShout * GetNthShout(UInt32 n) const;
struct Data
{
SpellItem** spells; // 00 - SpellItem** (null terminated array of spells)
void * unk4; // 08
TESShout** shouts; // 10
UInt32 numSpells; // 18
UInt32 numUnk4; // 1C
UInt32 numShouts; // 20
};
Data * data; // 08
};
// 10
class TESValueForm : public BaseFormComponent
{
public:
UInt32 value; // 08
UInt32 pad0C; // 0C
};
// 10
class TESWeightForm : public BaseFormComponent
{
public:
float weight; // 08
};
//// the following are not form components
//// they live here until there's a better header file
// 58
class BSMaterialObject
{
public:
// 34
struct Data
{
// 0C
struct Data10
{
UInt32 unk0; // 0 - init'd to 0
UInt32 unk4; // 4 - init'd to 0
float unk8; // 8 - init'd to -1
};
float unk00; // 00 - init'd to 0.4
float unk04; // 04 - init'd to 0.4
float unk08; // 08 - init'd to 512
float unk0C; // 0C - init'd to 512
Data10 unk10; // 10
float unk1C; // 1C - init'd to 1
UInt32 unk20; // 20
UInt32 unk24; // 24
UInt32 unk28; // 28
UInt32 unk2C; // 2C
UInt32 unk30; // 30
};
BSMaterialObject();
virtual ~BSMaterialObject();
virtual void Unk_01(void);
// void ** _vtbl; // 00
Data unk08; // 08
UnkArray unk40; // 40
};
STATIC_ASSERT(sizeof(BSMaterialObject) == 0x58);
// 08
class TESChildCell
{
public:
virtual ~TESChildCell();
virtual UInt32 Unk_01(void);
// void ** _vtbl;
};
// 08
class ActorValueOwner
{
public:
virtual ~ActorValueOwner();
// Argument is the ActorValue ID
virtual float GetCurrent(UInt32 a_akValue);
virtual float GetMaximum(UInt32 a_akValue);
virtual float GetBase(UInt32 a_akValue);
virtual void SetBase(UInt32 a_akValue, float a_value);
virtual void ModBase(UInt32 a_akValue, float a_value);
virtual void ModCurrent(UInt32 a_arg1, UInt32 a_akValue, float a_value);
virtual void SetCurrent(UInt32 a_akValue, float a_value);
virtual bool UsePCAVMult() const;
// void ** _vtbl; // 00
};
STATIC_ASSERT(sizeof(ActorValueOwner) == 0x8);
// 10
class BSIMusicTrack
{
public:
BSIMusicTrack();
virtual ~BSIMusicTrack();
virtual void Unk_01(void);
virtual void Unk_02(void);
virtual void Unk_03(void);
virtual void Unk_04(void);
virtual void Unk_05(void);
virtual void Unk_06(void);
virtual bool Unk_07(void);
virtual UInt32 Unk_08(void); // return unk04
virtual void Unk_09(UInt32 arg);
virtual void Unk_0A(void);
// void ** _vtbl; // 00
UInt32 unk08; // 08
};
// 50
class BSIMusicType
{
public:
virtual void Unk_00(void);
virtual void Unk_01(void);
virtual void Unk_02(void);
virtual void Unk_03(void);
virtual void Unk_04(void);
virtual void Unk_05(void);
virtual void Unk_06(void);
virtual void Unk_07(void);
enum
{
kFlagUnk1 = (1 << 0),
kFlagUnk2 = (1 << 1),
kFlagCycleTracks = (1 << 2),
kFlagDuclsCurrentTrack = (1 << 5)
};
// void ** _vtbl; // 00
UInt32 flags; // 08
UInt8 priority; // 0C - init'd to 0x32
UInt8 unk09; // 0D
UInt16 ducking; // 0E (db = ducking/100.0)
float fadeDuration; // 10
UInt32 unk14; // 14
UnkArray unk18; // 18
tArray<BGSMusicTrackFormWrapper*> tracks; // 30
UInt32 unk48; // 48
};
// 08
class BSIReverbType
{
public:
virtual void Unk_00(void);
virtual void Unk_01(void);
virtual void Unk_02(void);
virtual void Unk_03(void);
virtual void Unk_04(void);
virtual void Unk_05(void);
virtual void Unk_06(void);
virtual void Unk_07(void);
virtual void Unk_08(void);
virtual void Unk_09(void);
virtual void Unk_0A(void);
// void ** _vtbl; // 00
};
// 08
class BSISoundCategory
{
public:
virtual ~BSISoundCategory();
virtual void Unk_01(void);
virtual void Unk_02(void);
virtual void Unk_03(void);
virtual void Unk_04(void);
virtual void Unk_05(void);
virtual void Unk_06(void);
virtual void Unk_07(void);
virtual void Unk_08(void);
virtual void Unk_09(void);
virtual void Unk_0A(void);
virtual void Unk_0B(void);
// void ** _vtbl; // 00
};
// 08
class BSISoundDescriptor
{
public:
virtual ~BSISoundDescriptor();
virtual void Unk_01(void) = 0;
virtual void Unk_02(void) = 0;
// void ** _vtbl; // 00
};
// 08
class BGSSoundDescriptor : public BSISoundDescriptor
{
public:
virtual void Unk_01(void);
virtual void Unk_02(void);
// void ** _vtbl; // 00
};
// 08
class BSISoundOutputModel
{
public:
virtual ~BSISoundOutputModel();
virtual void Unk_01(void);
virtual void Unk_02(void);
virtual void Unk_03(void);
virtual void Unk_04(void);
virtual void Unk_05(void);
virtual void Unk_06(void);
virtual void Unk_07(void);
virtual void Unk_08(void);
virtual void Unk_09(void);
// void ** _vtbl; // 00
};
class BSIPlaybackCharacteristics
{
public:
virtual ~BSIPlaybackCharacteristics();
virtual UInt8 GetFrequencyShift(void) = 0;
virtual UInt8 GetFrequencyVariance(void) = 0;
virtual UInt8 GetPriority(void) = 0;
virtual UInt16 GetDBAttenuation(void) = 0;
virtual UInt8 GetDBVariance(void) = 0;
};
// 28
class SoundPlaybackCharacteristics : public BSIPlaybackCharacteristics
{
public:
virtual UInt8 GetFrequencyShift(void);
virtual UInt8 GetFrequencyVariance(void);
virtual UInt8 GetPriority(void);
virtual UInt16 GetDBAttenuation(void);
virtual UInt8 GetDBVariance(void);
UInt8 frequencyShift; // 08
UInt8 frequencyVariance; // 09
UInt8 priority; // 0A
UInt8 dbVariance; // 0B
UInt16 dbAttenuation; // 0C - CK Value * 100
UInt16 pad0E; // 0E
UInt64 unk10; // 10
BGSSoundOutput * soundOutput; // 18
UInt32 unk20; // 20
UInt32 unk24; // 24
};
// 58
class BGSStandardSoundDef : public BGSSoundDescriptor
{
public:
virtual ~BGSStandardSoundDef();
BGSSoundCategory * soundCategory; // 08
UInt64 unk10; // 10
void* unk18; // 18
UInt32 unk20; // 20
UInt32 unk24; // 24
UInt32 unk28; // 28
UInt32 unk2C; // 2C - probably pad
SoundPlaybackCharacteristics soundCharacteristics; // 30
};
STATIC_ASSERT(sizeof(BGSStandardSoundDef) == 0x58);
//STATIC_ASSERT(sizeof(BSTEventSource<void*>) == 0x30);
// 08
class BGSOpenCloseForm
{
public:
virtual ~BGSOpenCloseForm();
// void ** _vtbl; // 00
};
class ActiveEffect;
class Character;
// 18
class MagicTarget
{
public:
virtual ~MagicTarget();
virtual UInt8 Unk_01(int);
virtual Character * Unk_02(void);
virtual UInt8 Unk_03(void);
virtual bool Unk_04(void);
virtual int Unk_05(int);
virtual bool Unk_06(void); // pure 030
virtual tList<ActiveEffect> * GetActiveEffects(void); // pure 038
virtual int Unk_08(int);
virtual void Unk_09(int);
virtual double Unk_0A(int, int, int);
virtual UInt8 Unk_0B(int, int, int);
// void ** _vtbl; // 00
UInt64 unk04; // 08
UInt64 unk08; // 10
};
STATIC_ASSERT(sizeof(MagicTarget) == 0x18);
// 38
class Condition
{
public:
enum ComparisonFlags {
kComparisonFlag_And = 0x00,
kComparisonFlag_Or = 0x01,
kComparisonFlag_Equal = 0x00,
kComparisonFlag_UseAliases = 0x02,
kComparisonFlag_Global = 0x04,
kComparisonFlag_UsePackData = 0x08,
kComparisonFlag_SwapTarget = 0x10,
kComparisonFlag_NotEqual = 0x20,
kComparisonFlag_Greater = 0x40,
kComparisonFlag_GreaterEqual = 0x60,
kComparisonFlag_Less = 0x80,
kComparisonFlag_LessEqual = 0xA0
};
enum ReferenceTypes {
kReferenceType_None = 0,
kReferenceType_Target,
kReferenceType_Reference,
kReferenceType_CombatTarget,
kReferenceType_LinkedRef,
kReferenceType_Alias,
kReferenceType_PackageData,
kReferenceType_EventData
};
Condition * next; // 00
UInt32 compareValue; // 04-08
UInt32 unk0C; // 08-0C
UInt32 unk10; // 10 - New in SE?
UInt32 unk14; // 0C-14 - FFFFFFFF
UInt16 functionId; // 10-18
UInt8 unk1A; // 12-1A
UInt8 unk1B; // 13-1B
UInt32 pad1C; // 1C
UInt64 param1; // 14-20
UInt64 param2; // 18-28
UInt8 comparisonType; // 1C-30
UInt8 referenceType; // 1D-31
UInt8 pad32[6]; // 32
};
STATIC_ASSERT(sizeof(Condition) == 0x38);
class TintMask
{
public:
TintMask()
{
alpha = 0.0;
tintType = 0;
texture = NULL;
};
~TintMask() { };
#ifdef PAPYRUS_CUSTOM_CLASS
enum { kTypeID = 300 };
#endif
enum {
kMaskType_Frekles = 0,
kMaskType_Lips,
kMaskType_Cheeks,
kMaskType_Eyeliner,
kMaskType_UpperEyeSocket,
kMaskType_LowerEyeSocket,
kMaskType_SkinTone,
kMaskType_WarPaint,
kMaskType_FrownLines,
kMaskType_LowerCheeks,
kMaskType_Nose,
kMaskType_Chin,
kMaskType_Neck,
kMaskType_Forehead,
kMaskType_Dirt
};
TESTexture * texture;
union {
struct Color {
UInt8 red, green, blue, alpha; // The alpha isn't actually used here so its usually zero
} color;
UInt32 abgr;
};
float alpha;
UInt32 tintType;
UInt32 ToARGB();
};
// 2778
class Biped : public BSIntrusiveRefCounted
{
public:
NiNode * root; // 08
struct Data
{
TESForm* armor; // 00 - Can be ARMO or ARMA
TESForm* addon; // 08 - Usually always ARMA
TESModelTextureSwap* model; // 10
BGSTextureSet* textureSet; // 18
NiAVObject* object; // 20
UInt64 unk28[(0x78 - 0x28) >> 3];
};
Data unk10[42]; // 10
Data unk13C0[42]; // 13C0
UInt32 handle; // 2770
UInt32 unk2774; // 2774
DEFINE_MEMBER_FN_0(UpdateWeightData, void, 0x001D1360);
DEFINE_MEMBER_FN_0(DeleteThis, void, 0x001D1260);
};
STATIC_ASSERT(offsetof(Biped, unk10) == 0x10);
STATIC_ASSERT(offsetof(Biped, unk13C0) == 0x13C0);
STATIC_ASSERT(sizeof(Biped) == 0x2778);
// ??
class BipedModel
{
public:
enum {
kWeightModel_Small = 0,
kWeightModel_Large = 1
};
Biped * bipedData;
};
class BSFixedStringCI;
template<class A>
class DoNothingUnhandledPolicy
{
public:
virtual ~DoNothingUnhandledPolicy();
};
// 2C
#if 0
// Not done for SE, currently nothing references it
template<class A, class B, class C, class D>
class BSResponse : public BSIntrusiveRefCounted, public DoNothingUnhandledPolicy<C>
{
public:
UInt32 unk08; // 08
UInt32 unk0C; // 0C
UInt32 unk10; // 10 - NiNode?
UInt32 unk14; // 14 - NiNode?
UInt32 unk18; // 18 - NiNode?
UInt32 unk1C; // 1C
UInt32 unk20; // 20 - NiNode?
UInt32 unk24; // 24
UInt32 unk28; // 28
};
//STATIC_ASSERT(sizeof(BSResponse<BSFixedStringCI, Actor, BSFixedStringCI, DoNothingUnhandledPolicy<BSFixedStringCI>>) == 0x2C);
#endif
// 338
// Ctor 0x673900 (SE 1.4), 0x72E600 (Skyrim32)
class MiddleProcess
{
public:
// 10
struct EffectListNode
{
ActiveEffect * effect; // 0
EffectListNode * next; // 8
};
// 30
// This is used also in ActorProcessManager
struct Data58
{
UInt64 unk00; // 00 - New in SE?
TESPackage * package; // 08
UInt64 unk10; // 10
UInt32 unk18; // 18
UInt32 unk1C; // 1C - init'd to FFFFFFFF
float unk20; // 20 - init'd to -1
UInt32 unk24; // 24
UInt16 unk28; // 28
UInt8 unk2A; // 2A
UInt8 unk2B; // 2B
UInt32 pad2C; // 2C
};
UnkArray unk000; // 000
UnkArray unk018; // 018
UnkArray unk030; // 030
UInt64 unk048; // 048
UInt8 unk050; // 050
UInt8 unk051[7]; // 051
Data58 unk058; // 058
UnkArray unk088; // 088
UInt64 unk0A0; // 0A0
UInt64 unk0A8; // 0A8
float unk0B0; // 0B0
float unk0B4; // 0B4
float unk0B8; // 0B8
float unk0BC; // 0BC
float unk0C0; // 0C0
float unk0C4; // 0C4
float unk0C8; // 0C8
float unk0CC; // 0CC
float unk0D0; // 0D0
float unk0D4; // 0D4
float unk0D8; // 0D8
float unk0DC; // 0DC
float unk0E0; // 0E0
float unk0E4; // 0E4
float unk0E8; // 0E8
UInt32 unk0EC; // 0EC
UInt32 unk0F0; // 0F0
UInt32 pad0F4; // 0F4
UInt64 unk0F8; // 0F8
UnkArray unk100; // 100
UInt64 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 - NiNode?
void * unk160; // 160 - NiNode?
UInt64 unk168; // 168
void * unk170; // 170 - BSFaceGenNiNode?
void * unk178; // 178
UInt64 unk180; // 180
UInt64 unk188; // 188
UInt64 unk190; // 190
UInt64 unk198; // 198
EffectListNode * effectList; // 1A0
void * unk1A8; // 1A8
void * unk1B0; // 1B0
UnkArray unk1B8; // 1B8
UnkArray unk1D0; // 1D0
UInt64 unk1E8; // 1E8
UInt32 unk1F0; // 1F0
UInt32 unk1F4; // 1F4
UInt16 unk1F8; // 1F8 - init'd to FFFF
UInt16 unk1FA; // 1FA - init'd to FFFF
UInt32 unk1FC; // 1FC
UInt32 unk200; // 200
UInt32 unk204; // 204 - init'd to FF7FFFFF
UInt32 furnitureHandle; // 208
UInt32 pad20C; // 20C
UInt64 unk210; // 210
UInt32 unk218; // 218
UInt32 pad21C; // 21C
UInt64 unk220; // 220
TESIdleForm * currentIdle; // 228
UInt64 unk230; // 230
UInt64 unk238; // 238
UInt64 unk240; // 240
UInt64 unk248; // 248
void * unk250; // 250 - hkCharacterProxy?
void * unk258; // 258
UInt64 unk164; // 260
UInt64 unk268; // 268
UInt64 unk270; // 270
UInt64 unk278; // 278
UInt64 unk280; // 280
void * unk288; // 288
UInt32 unk290; // 290
UInt32 unk294; // 294
float unk298; // 298 - init'd to -1
UInt32 unk29C; // 29C
UInt32 unk2A0; // 2A0
UInt32 unk2A4; // 2A4
UInt32 unk2A8; // 2A8
UInt32 unk2AC; // 2AC
UInt32 unk2B0; // 2B0
UInt32 unk2B4; // 2B4
UInt32 unk2B8; // 2B8
float unk2BC; // 2BC - init'd to -1
UInt32 unk2C0; // 2C0
UInt32 unk2C4; // 2C4
float actorAlpha; // 2C8 - init'd to 1
UInt8 todo2CC[0x338 - 0x2CC]; // TODO
};
STATIC_ASSERT(offsetof(MiddleProcess, effectList) == 0x1A0);
STATIC_ASSERT(offsetof(MiddleProcess, currentIdle) == 0x228);
STATIC_ASSERT(offsetof(MiddleProcess, furnitureHandle) == 0x208);
STATIC_ASSERT(offsetof(MiddleProcess, actorAlpha) == 0x2C8);
STATIC_ASSERT(sizeof(MiddleProcess) == 0x338);
// 140
class ActorProcessManager
{
public:
enum {
kEquippedHand_Left = 0,
kEquippedHand_Right = 1
};
enum {
kFlags_None = 0,
kFlags_Unk01 = 1,
kFlags_Unk02 = 2,
kFlags_Unk03 = 4,
kFlags_DrawHead = 8,
kFlags_Mobile = 16,
kFlags_Reset = 32
};
UInt64 unk00; // 00
MiddleProcess * middleProcess; // 08
void * unk10; // 10
MiddleProcess::Data58 unk18; // 18
float unk48; // 48 - init'd to -1
UInt32 unk4C; // 4C
UInt64 unk50; // 50
UInt32 unk58; // 58
UInt32 pad5C; // 5C
UInt64 unk60; // 60
UInt64 unk68; // 68
UInt64 unk70; // 70
UInt64 unk78; // 78
UInt64 unk80; // 80
UInt64 unk88; // 88
UInt32 unk90; // 90
float timeOfDeath; // 94 - GetTimeDead = (GameDaysPassed*24) - timeOfDeath
float unk98; // 98 - related with above
UInt32 pad9C; // 9C
UnkFormArray forms; // A0 seen containing [left hand, equip slot, right hand, equip slot, right hand, equip slot)
UInt64 unkB8[7]; // B8 2nd slot points back to this adress
TESForm * equippedObject[2]; // F0
UInt8 unk100[0x136 - 0x100]; // 100
UInt8 unk136; // 136
SInt8 unk137; // 137 - init'd to 3
UInt8 unk138; // 138
UInt8 unk139; // 139
UInt8 unk13A; // 13A
UInt8 unk13B; // 13B
UInt32 pad13C; // 13C
MEMBER_FN_PREFIX(ActorProcessManager);
DEFINE_MEMBER_FN(SetEquipFlag, void, 0x006A6720, UInt8 flags);
DEFINE_MEMBER_FN(UpdateEquipment, void, 0x006787D0, Actor * actor);
// CDC12817DF3AB5B832348763F433A216BB8A85CA+89
DEFINE_MEMBER_FN(SetDataFlag, void, 0x00684430, float flag); // Sets a number on the 0x10 object
void UpdateEquipment_Hooked(Actor * actor);
};
STATIC_ASSERT(offsetof(ActorProcessManager, equippedObject) == 0xF0);
STATIC_ASSERT(sizeof(ActorProcessManager) == 0x140);
// 68
class BGSSkillPerkTreeNode
{
public:
virtual ~BGSSkillPerkTreeNode();
UInt32 index; // 08 - init'd to ctor argument
UInt32 pad0C; // 0C
tArray<BGSSkillPerkTreeNode*> connections; // 10
tArray<BGSSkillPerkTreeNode*> connectees; // 28
BGSPerk * perk; // 40
UInt32 unk48; // 48
UInt32 gridX; // 4C
UInt32 gridY; // 50
UInt32 pad54; // 54
ActorValueInfo * skill; // 58
float horizontalPos; // 60
float verticalPos; // 64
class PerkVisitor
{
public:
virtual bool Accept(BGSPerk * node) = 0;
};
bool VisitPerks(PerkVisitor & visitor)
{
if(visitor.Accept(perk))
return true;
for(UInt32 i = 0; i < connections.count; i++)
{
BGSSkillPerkTreeNode* connector = NULL;
connections.GetNthItem(i, connector);
if(connector->VisitPerks(visitor))
return true;
}
return false;
}
};
class PlayerSkills
{
public:
enum {
kAdvanceableSkillOffset = 6,
kNumAdvanceableSkills = 18
};
struct StatData {
struct LevelData {
float level; // 00
float points; // 04
float pointsMax; // 08
};
float levelPoints; // 00
float levelPointsMax; // 04
LevelData levelData[kNumAdvanceableSkills]; // 08
UInt32 legendaryLevel[kNumAdvanceableSkills]; // E0
};
StatData * data;
static SInt32 ResolveAdvanceableSkillId(SInt32 actorValue);
float GetSkillPoints(BSFixedString actorValue);
void SetSkillPoints(BSFixedString actorValue, float points);
SInt32 GetSkillLegendaryLevel(BSFixedString actorValue);
void SetSkillLegendaryLevel(BSFixedString actorValue, UInt32 level);
MEMBER_FN_PREFIX(PlayerSkills);
DEFINE_MEMBER_FN(GetSkillData, UInt32, 0x0070F910, UInt32 actorValue, float * level, float * points, float * pointsMax, UInt32 * unk6);
DEFINE_MEMBER_FN(IncrementLegendary, UInt32, 0x0070FF00, UInt32 actorValue);
DEFINE_MEMBER_FN(SetLevel, void, 0x0070FEA0, UInt32 level);
};
// 10
class TESRegionData
{
public:
virtual ~TESRegionData();
virtual void Unk_01(void);
virtual void Unk_02(void);
virtual SInt32 GetType(void); // pure
virtual void Unk_04(void); // pure - Init?
virtual void Unk_05(void); // pure
virtual void Unk_06(void); // pure
virtual void Unk_07(void); // pure
UInt8 unk08; // 08
UInt8 unk09; // 09
UInt8 unk0A; // 0A
UInt8 pad0B[5]; // 0B
};
class TESRegionObjectBase
{
public:
virtual ~TESRegionObjectBase();
virtual void Unk_01(void); // pure
virtual void Unk_02(void); // pure
};
// 10
class TESRegionGrassObject : public TESRegionObjectBase
{
public:
virtual ~TESRegionGrassObject();
virtual void Unk_03(void);
virtual void Unk_04(void);
virtual void Unk_05(void);
virtual void Unk_06(void);
UInt32 unk08; // 08
UInt32 unk0C; // 0C
};
// 20
class TESRegionGrassObjectList : public tList<TESRegionGrassObject*>
{
public:
virtual ~TESRegionGrassObjectList();
UInt32 unk18; // 18
UInt32 unk1C; // 1C
};
// 20
class TESRegionList : public tList<TESRegion*>
{
public:
virtual ~TESRegionList();
UInt32 unk18; // 18 - maybe a single byte and rest pad
UInt32 pad1C; // 1C
};
// 18
class TESRegionDataGrass : public TESRegionData
{
public:
virtual ~TESRegionDataGrass();
TESRegionGrassObjectList * grassObjectList; // 10
};
// 30
class TESRegionDataSound : public TESRegionData
{
public:
virtual ~TESRegionDataSound();
BGSMusicType * musicType; // 10
struct SoundData
{
BGSSoundDescriptorForm * soundDescriptor; // 00
UInt32 flags; // 08
float chance; // 0C
};
tArray<SoundData*> soundData; // 18
};
// 18
class TESRegionDataLandscape : public TESRegionData
{
public:
virtual ~TESRegionDataLandscape();
UInt64 unk10; // 10
};
// 18
class TESRegionDataMap : public TESRegionData
{
public:
virtual ~TESRegionDataMap();
UInt64 unk10; // 10
};
// 20
class TESRegionDataWeather : public TESRegionData
{
public:
virtual ~TESRegionDataWeather();
struct WeatherData
{
TESWeather * weather; // 00
UInt32 chance; // 08
TESGlobal * globalChance; // 10
};
tList<WeatherData*> weatherData; // 10
};